const CACHE_NAME = "pi-car-companion-v2"; const APP_SHELL = [ "/", "/manifest.webmanifest", "/icon.svg", "/pwa-192x192.png", "/pwa-512x512.png", "/pwa-maskable-512x512.png", "/apple-touch-icon.png" ]; self.addEventListener("install", (event) => { event.waitUntil(caches.open(CACHE_NAME).then((cache) => cache.addAll(APP_SHELL))); self.skipWaiting(); }); self.addEventListener("activate", (event) => { event.waitUntil( caches .keys() .then((keys) => Promise.all(keys.filter((key) => key !== CACHE_NAME).map((key) => caches.delete(key)))) .then(() => self.clients.claim()) ); }); self.addEventListener("fetch", (event) => { const request = event.request; if (request.method !== "GET") return; const url = new URL(request.url); if (url.origin !== self.location.origin || url.pathname.startsWith("/api/") || url.pathname === "/healthz") return; if (request.mode === "navigate") { event.respondWith( fetch(request) .then((response) => { if (response.ok) { const copy = response.clone(); event.waitUntil(caches.open(CACHE_NAME).then((cache) => cache.put("/", copy))); } return response; }) .catch(() => caches.match("/")) ); return; } if (url.pathname.startsWith("/assets/") || APP_SHELL.includes(url.pathname)) { event.respondWith( caches.match(request).then( (cached) => cached ?? fetch(request).then((response) => { if (response.ok) { const copy = response.clone(); event.waitUntil(caches.open(CACHE_NAME).then((cache) => cache.put(request, copy))); } return response; }) ) ); } });