const CACHE_NAME = 'jackbox-picker-v1'; const urlsToCache = [ '/', '/index.html', '/favicon.ico' ]; // Install service worker self.addEventListener('install', (event) => { event.waitUntil( caches.open(CACHE_NAME) .then((cache) => cache.addAll(urlsToCache)) ); self.skipWaiting(); }); // Activate service worker self.addEventListener('activate', (event) => { event.waitUntil( caches.keys().then((cacheNames) => { return Promise.all( cacheNames.map((cacheName) => { if (cacheName !== CACHE_NAME) { return caches.delete(cacheName); } }) ); }) ); self.clients.claim(); }); // Fetch strategy: Network first, fallback to cache self.addEventListener('fetch', (event) => { // Skip non-GET requests if (event.request.method !== 'GET') { return; } // Skip chrome-extension and other non-http(s) requests if (!event.request.url.startsWith('http')) { return; } event.respondWith( fetch(event.request) .then((response) => { // Don't cache API responses or non-successful responses if (event.request.url.includes('/api/') || !response || response.status !== 200) { return response; } // Clone the response const responseToCache = response.clone(); caches.open(CACHE_NAME) .then((cache) => { cache.put(event.request, responseToCache); }); return response; }) .catch(() => { // Network failed, try cache return caches.match(event.request); }) ); });