const CACHE = 'ns-v17'; const PRECACHE = ['/', 'index.html', 'styles.css', 'app.js', 'sw.js', 'manifest.json', 'icon.svg']; const SKIP_URLS = ['/rest/stream', '/rest/download', '/config.js']; self.addEventListener('install', e => { e.waitUntil(caches.open(CACHE).then(c => c.addAll(PRECACHE))); self.skipWaiting(); }); self.addEventListener('activate', e => { e.waitUntil( caches.keys().then(keys => Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k))) ) ); self.clients.claim(); }); self.addEventListener('fetch', e => { if (SKIP_URLS.some(u => e.request.url.includes(u))) return; e.respondWith( caches.match(e.request).then(cached => cached || fetch(e.request).then(res => { if (res.status === 200 && e.request.method === 'GET') { const clone = res.clone(); caches.open(CACHE).then(c => c.put(e.request, clone)); } return res; }).catch(() => cached) ) ); });