// service-worker.js // Cache-Strategie: Cache First (offline works, then network) const CACHE_NAME = 'roll-calculator-v1'; const ASSETS_TO_CACHE = [ './', './roll_calculator_v8.html', './article-data.json', './service-worker.js' ]; // Install Event: Cache alle kritischen Assets 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); }) ); // Aktiviere sofort (optional) 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 // 1. Prüfe Cache // 2. Wenn nicht da, frag Network // 3. Cache die Response für nächstes Mal self.addEventListener('fetch', event => { const url = event.request.url; // Skip nicht-GET Requests if (event.request.method !== 'GET') { return; } event.respondWith( caches.match(event.request) .then(response => { // Cache HIT if (response) { console.log('[ServiceWorker] Cache HIT:', url); return response; } // Cache MISS - versuche Network console.log('[ServiceWorker] Cache MISS, fetching:', url); return fetch(event.request) .then(response => { // Nur 200er Responses cachen if (!response || response.status !== 200 || response.type === 'error') { return response; } // Clone die Response (weil sie nur einmal consumable ist) const responseClone = response.clone(); caches.open(CACHE_NAME).then(cache => { console.log('[ServiceWorker] Caching response:', url); cache.put(event.request, responseClone); }); return response; }) .catch(err => { // Network fail - versuche aus Cache console.log('[ServiceWorker] Network failed, trying cache fallback:', url); return caches.match(event.request).then(response => { if (response) return response; // Fallback für offline console.warn('[ServiceWorker] No cache fallback for:', url); return new Response('Offline - resource not available', { status: 503, statusText: 'Service Unavailable' }); }); }); }) ); }); console.log('[ServiceWorker] Script loaded');