const CACHE = 'ns-v24'; const PRECACHE = ['/', 'index.html', 'styles.css', 'app.js', 'manifest.json', 'icon.svg']; const SKIP_PATHS = ['/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)))) .then(() => self.clients.claim()) .then(() => self.clients.matchAll({type: 'window', includeUncontrolled: true})) .then(clients => clients.forEach(c => c.navigate(c.url))) ); }); self.addEventListener('fetch', e => { if (!e.request.url.startsWith(self.location.origin)) return; if (SKIP_PATHS.some(p => e.request.url.includes(p))) return; e.respondWith( 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(() => caches.match(e.request).then(r => r || Response.error())) ); });