Skip to content

Commit

Permalink
Add ServiceWorker
Browse files Browse the repository at this point in the history
  • Loading branch information
DanielPXL committed Mar 3, 2024
1 parent b7b9f6c commit fef1270
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 0 deletions.
15 changes: 15 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"author": "",
"license": "GPL-3.0-or-later",
"devDependencies": {
"@parcel/service-worker": "^2.12.0",
"nitro-fs": "^1.1.0",
"parcel": "^2.12.0"
}
Expand Down
2 changes: 2 additions & 0 deletions src/App.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import * as ServiceWorkerComms from "./ServiceWorkerComms";
import * as AudioWorkerComms from "./AudioWorkerComms";
import * as ControlPanel from "./ControlPanel";
import * as AudioPlayer from "./AudioPlayer";
Expand Down Expand Up @@ -57,6 +58,7 @@ function stop() {
StateManager.discardStates(Infinity);
}

ServiceWorkerComms.init();
AudioWorkerComms.init();
Renderer.init();
ControlPanel.init(load, start, stop);
47 changes: 47 additions & 0 deletions src/ServiceWorker.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { version, manifest } from "@parcel/service-worker";

declare const self: ServiceWorkerGlobalScope;

async function install() {
const cache = await caches.open(version);
await cache.addAll(manifest);
await cache.add("/");
}

self.addEventListener("install", (e: ExtendableEvent) => {
e.waitUntil(install());
self.skipWaiting();
});

async function activate() {
const keys = await caches.keys();
await Promise.all(
keys.map(key => key !== version && caches.delete(key))
);
}

self.addEventListener("activate", (e: ExtendableEvent) => {
e.waitUntil(activate());
e.waitUntil(self.clients.claim());
});

self.addEventListener("fetch", (e: FetchEvent) => {
if (e.request.method !== "GET") return;

async function getResponse() {
const cache = await caches.open(version);

// Parcel adds stupid timestamps to the end of the URLs (at least for debug builds)
// and I can't figure out how to disable them,
// so I'm just going to strip them off here
const realUrl = e.request.url.replace(/\?.*$/, "");
const cachedResponse = await cache.match(realUrl);
if (cachedResponse) {
return cachedResponse;
}

return fetch(e.request);
}

e.respondWith(getResponse());
});
17 changes: 17 additions & 0 deletions src/ServiceWorkerComms.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
export async function init() {
if (!("serviceWorker" in navigator)) {
console.error("Service workers are not supported in this browser.");
}

try {
await navigator.serviceWorker.register(
new URL("ServiceWorker.ts", import.meta.url),
{
scope: "/",
type: "module"
}
);
} catch (e) {
console.error("Service worker registration failed:", e);
}
}
9 changes: 9 additions & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"compilerOptions": {
"lib": ["ES2015", "WebWorker"],
},
"include": [
"src/AudioWorker.ts",
"src/ServiceWorker.ts",
]
}

0 comments on commit fef1270

Please sign in to comment.