const CACHE_NAME = 'meshmap-pwa-v6'; const CORE_ASSETS = ['/', '/manifest.webmanifest']; self.addEventListener('install', (event) => { event.waitUntil( caches.open(CACHE_NAME).then((cache) => cache.addAll(CORE_ASSETS)) ); 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))) ) ); self.clients.claim(); }); async function cacheFirst(request) { const cached = await caches.match(request); if (cached) return cached; const response = await fetch(request); const cache = await caches.open(CACHE_NAME); cache.put(request, response.clone()); return response; } async function networkFirst(request) { try { const response = await fetch(new Request(request, { cache: 'no-store' })); const cache = await caches.open(CACHE_NAME); cache.put(request, response.clone()); return response; } catch (err) { const cached = await caches.match(request); if (cached) return cached; return caches.match('/'); } } self.addEventListener('fetch', (event) => { if (event.request.method !== 'GET') return; const url = new URL(event.request.url); if (url.origin !== self.location.origin) return; if (event.request.mode === 'navigate') { event.respondWith(networkFirst(event.request)); return; } if (url.pathname.startsWith('/static/') || url.pathname === '/manifest.webmanifest') { event.respondWith(cacheFirst(event.request)); } });