const CACHE_NAME = 'hwlab-shell-v1' // App shell assets to cache on install const SHELL_ASSETS = [ '/', '/index.html', ] self.addEventListener('install', (event) => { event.waitUntil( caches.open(CACHE_NAME).then((cache) => cache.addAll(SHELL_ASSETS)) ) self.skipWaiting() }) self.addEventListener('activate', (event) => { // Remove old caches event.waitUntil( caches.keys().then((keys) => Promise.all( keys.filter((k) => k !== CACHE_NAME).map((k) => caches.delete(k)) ) ) ) self.clients.claim() }) self.addEventListener('fetch', (event) => { const url = new URL(event.request.url) // API requests: network only — never cache if (url.pathname.startsWith('/api/')) { return } // Navigation requests: serve from cache, fall back to network (app shell) if (event.request.mode === 'navigate') { event.respondWith( caches.match('/').then((cached) => cached ?? fetch(event.request)) ) return } // Static assets: cache-first event.respondWith( caches.match(event.request).then( (cached) => cached ?? fetch(event.request).then((response) => { if (response.ok && event.request.method === 'GET') { const clone = response.clone() caches.open(CACHE_NAME).then((cache) => cache.put(event.request, clone)) } return response }) ) ) })