// service-worker.js // Cache-Strategie: Cache First (offline works, then network) const CACHE_NAME = 'roll-calculator-v3'; // bumped to v2 for new clearance settings const ASSETS_TO_CACHE = [ './', './roll_calculator_v9.html', './article-data.json', './config.json', './service-worker.js' ]; // Install Event self.addEventListener('install', event => { console.log('[ServiceWorker] Installing...'); event.waitUntil( caches.open(CACHE_NAME).then(cache => { console.log('[ServiceWorker] Caching assets:', ASSETS_TO_CACHE); return cache.addAll(ASSETS_TO_CACHE); }).catch(err => { console.error('[ServiceWorker] Cache failed:', err); }) ); self.skipWaiting(); }); // Activate Event: Cleanup alte Caches self.addEventListener('activate', event => { console.log('[ServiceWorker] Activating...'); event.waitUntil( caches.keys().then(cacheNames => { return Promise.all( cacheNames.map(cacheName => { if (cacheName !== CACHE_NAME) { console.log('[ServiceWorker] Deleting old cache:', cacheName); return caches.delete(cacheName); } }) ); }) ); self.clients.claim(); }); // Fetch Event: Cache First Strategy self.addEventListener('fetch', event => { const url = event.request.url; if (event.request.method !== 'GET') return; event.respondWith( caches.match(event.request) .then(response => { if (response) { console.log('[ServiceWorker] Cache HIT:', url); return response; } console.log('[ServiceWorker] Cache MISS, fetching:', url); return fetch(event.request) .then(response => { if (!response || response.status !== 200 || response.type === 'error') { return response; } const responseClone = response.clone(); caches.open(CACHE_NAME).then(cache => { cache.put(event.request, responseClone); }); return response; }) .catch(() => { return caches.match(event.request).then(response => { if (response) return response; return new Response('Offline - resource not available', { status: 503, statusText: 'Service Unavailable' }); }); }); }) ); }); console.log('[ServiceWorker] Script loaded (v2)');