Skip to content

Kody is live

Watch the launch video — what Kody is, and why it exists.

← Public packages

@kody/doomPublic

src/app/sw.ts

2 lines · 2.0 KB · TypeScript
/** Service worker source. */
export const serviceWorkerJs = '/* KODOOM service worker — cache app shell; engine/IWAD stay network. */\nconst CACHE = \'kodoom-shell-v7\';\nself.addEventListener(\'install\', (event) => {\n  event.waitUntil((async () => {\n    const base = new URL(self.registration.scope).pathname.replace(/\\/$/, \'\');\n    const shell = [base + \'/\', base + \'/app.js\', base + \'/app.css\', base + \'/manifest.webmanifest\', base + \'/icons/icon-192.png\', base + \'/icons/icon-512.png\', base + \'/icon.png\'];\n    const cache = await caches.open(CACHE);\n    await cache.addAll(shell.map((u) => new Request(u, { cache: \'reload\' }))).catch(() => undefined);\n    self.skipWaiting();\n  })());\n});\nself.addEventListener(\'activate\', (event) => {\n  event.waitUntil((async () => {\n    const keys = await caches.keys();\n    await Promise.all(keys.filter((k) => k !== CACHE).map((k) => caches.delete(k)));\n    await self.clients.claim();\n  })());\n});\nself.addEventListener(\'fetch\', (event) => {\n  const req = event.request;\n  if (req.method !== \'GET\') return;\n  const url = new URL(req.url);\n  // Do not intercept cross-origin engine/IWAD CDN fetches.\n  if (url.origin !== self.location.origin) return;\n  event.respondWith((async () => {\n    const cache = await caches.open(CACHE);\n    const cached = await cache.match(req);\n    try {\n      const fresh = await fetch(req);\n      if (fresh.ok) cache.put(req, fresh.clone());\n      return fresh;\n    } catch (e) {\n      if (cached) return cached;\n      if (req.mode === \'navigate\') {\n        return new Response(\'<!doctype html><meta charset=utf-8><title>KODOOM offline</title><body style="background:#070405;color:#ffb020;font-family:sans-serif;padding:2rem"><h1>KODOOM offline</h1><p>Shell not fully cached yet, or engine/IWAD need network. Reconnect and reload.</p></body>\', { headers: { \'Content-Type\': \'text/html; charset=utf-8\' } });\n      }\n      throw e;\n    }\n  })());\n});\n'