summaryrefslogtreecommitdiffstats
path: root/src/worker/sw.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/worker/sw.ts')
-rw-r--r--src/worker/sw.ts51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/worker/sw.ts b/src/worker/sw.ts
new file mode 100644
index 0000000..e125879
--- /dev/null
+++ b/src/worker/sw.ts
@@ -0,0 +1,51 @@
+declare var self: ServiceWorkerGlobalScope;
+export {};
+
+
+const sw_cache = {
+ offline: "/offline",
+ default: [
+ "/index.js",
+ "/index.css",
+ "/app.webmanifest",
+ "/favicon.svg"
+ ],
+ store: "app",
+}
+
+async function install() {
+ const cache = await self.caches.open(sw_cache.store)
+ return cache.addAll([sw_cache.offline, ...sw_cache.default])
+}
+
+async function activate() {
+ const keys = await self.caches.keys()
+ return Promise.all(keys.map(key => {
+ return key !== sw_cache.store ? self.caches.delete(key) : undefined
+ }))
+}
+
+async function req(event: FetchEvent) {
+ const cache = await caches.open(sw_cache.store)
+ const cachedResponse = await cache.match(event.request)
+ var networkResponse
+ try {
+ networkResponse = await fetch(event.request)
+ if (networkResponse.ok) {
+ cache.put(event.request, networkResponse.clone())
+ }
+ } catch(error) {
+ console.error(error)
+ if (event.request.mode === "navigate") {
+ networkResponse = await caches.match("/offline")
+ }
+ }
+ return (cachedResponse || networkResponse) as Response
+
+}
+
+self.addEventListener("install", event => event.waitUntil(install()))
+
+self.addEventListener("activate", event => event.waitUntil(activate()))
+
+self.addEventListener("fetch", event => event.respondWith(req(event)))