const CACHE_NAME = 'base-tracker-cache-v1'; const APP_SHELL = ['/']; self.addEventListener('install', (event) => { event.waitUntil( caches .open(CACHE_NAME) .then((cache) => cache.addAll(APP_SHELL)) .then(() => 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) => { if (event.request.method !== 'GET') { return; } if (event.request.mode === 'navigate') { event.respondWith( fetch(event.request).catch(async () => { const offlineFallback = await caches.match('/'); return offlineFallback ?? Response.error(); }) ); return; } if (!event.request.url.startsWith(self.location.origin)) { return; } event.respondWith( caches.match(event.request).then((cachedResponse) => { const networkFetch = fetch(event.request) .then((networkResponse) => { if ( networkResponse && networkResponse.status === 200 && networkResponse.type === 'basic' && !networkResponse.headers.get('Cache-Control')?.includes('no-store') ) { const responseClone = networkResponse.clone(); caches.open(CACHE_NAME).then((cache) => cache.put(event.request, responseClone)); } return networkResponse; }) .catch(() => cachedResponse); return cachedResponse || networkFetch; }) ); }); self.addEventListener('message', (event) => { if (event.data === 'skipWaiting') { self.skipWaiting(); } });