/// /// /// /// import { build, files, prerendered, version } from '$service-worker'; const worker = self as unknown as ServiceWorkerGlobalScope; const cacheName = `inkfinite-${version}`; const precache = [...new Set([...build, ...files, ...prerendered])]; worker.addEventListener('install', (event) => { event.waitUntil(caches.open(cacheName).then((cache) => cache.addAll(precache))); }); worker.addEventListener('activate', (event) => { event.waitUntil( (async () => { const oldCaches = (await caches.keys()).filter( (name) => name.startsWith('inkfinite-') && name !== cacheName ); await Promise.all(oldCaches.map((name) => caches.delete(name))); await worker.clients.claim(); })() ); }); worker.addEventListener('message', (event) => { if (event.data?.type === 'SKIP_WAITING') void worker.skipWaiting(); }); worker.addEventListener('fetch', (event) => { if (event.request.method !== 'GET') return; const url = new URL(event.request.url); if (url.origin !== worker.location.origin) return; event.respondWith( (async () => { const cache = await caches.open(cacheName); if (precache.includes(url.pathname)) { const cached = await cache.match(url.pathname); if (cached) return cached; } try { const response = await fetch(event.request); if (response.ok) await cache.put(event.request, response.clone()); return response; } catch (error) { const cached = await cache.match(event.request); if (cached) return cached; if (event.request.mode === 'navigate') { const appShell = await cache.match('/app'); if (appShell) return appShell; } throw error; } })() ); });