/* Minimal service worker: makes the app installable on desktop & tablet. */ const CACHE = "eth-hedge-shell-v1"; const PRECACHE = ["/", "/plan", "/manifest.webmanifest", "/icons/icon-192.png"]; self.addEventListener("install", (event) => { event.waitUntil( caches.open(CACHE).then((cache) => cache.addAll(PRECACHE)).then(() => self.skipWaiting()), ); }); self.addEventListener("activate", (event) => { event.waitUntil( caches.keys().then((keys) => Promise.all(keys.filter((k) => k !== CACHE).map((k) => caches.delete(k))), ).then(() => self.clients.claim()), ); }); self.addEventListener("fetch", (event) => { const req = event.request; if (req.method !== "GET") return; const url = new URL(req.url); if (url.origin !== self.location.origin) return; // Never cache API / health / websocket-ish paths if (url.pathname.startsWith("/api") || url.pathname === "/health") return; event.respondWith( fetch(req) .then((res) => { if (res.ok && (url.pathname.startsWith("/assets") || url.pathname === "/")) { const copy = res.clone(); caches.open(CACHE).then((cache) => cache.put(req, copy)); } return res; }) .catch(() => caches.match(req).then((hit) => hit || caches.match("/"))), ); });