// Minimal service worker: caches the app shell so the cockpit launches fast and // survives brief network blips. Live data (the bridge WebSocket, /api, and map // tiles) is never cached — only same-origin GET app assets. const CACHE = 'g1000-shell-v1'; self.addEventListener('install', () => self.skipWaiting()); self.addEventListener('activate', (e) => { e.waitUntil( caches.keys().then((keys) => Promise.all(keys.filter((k) => k !== CACHE).map((k) => caches.delete(k)))) .then(() => self.clients.claim()) ); }); self.addEventListener('fetch', (e) => { const url = new URL(e.request.url); // Only same-origin GET app shell; skip the API and let the WS pass through. if (e.request.method !== 'GET' || url.origin !== location.origin) return; if (url.pathname.startsWith('/api') || url.pathname === '/ws') return; // Stale-while-revalidate: serve cache fast, refresh in the background. e.respondWith( caches.open(CACHE).then(async (cache) => { const cached = await cache.match(e.request); const network = fetch(e.request) .then((res) => { if (res && res.ok) cache.put(e.request, res.clone()); return res; }) .catch(() => cached); return cached || network; }) ); });