diff --git a/package.json b/package.json index 4e9b0f9..3e4d2d5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "scan-wave", "private": true, - "version": "0.0.1", + "version": "0.0.2", "type": "module", "scripts": { "dev": "vite dev", diff --git a/src/service-worker.ts b/src/service-worker.ts index c4c77d2..42eaaa8 100644 --- a/src/service-worker.ts +++ b/src/service-worker.ts @@ -1,4 +1,105 @@ -/// +/// +import { build, files, version } from '$service-worker'; + +// Create a unique cache name for this deployment +const CACHE = `cache-${version}`; + +const ASSETS = [ + ...build, // the app itself + ...files // everything in `static` +]; + +self.addEventListener('install', (event) => { + console.log('[Service Worker] Install'); + // Create a new cache and add all files to it + async function addFilesToCache() { + const cache = await caches.open(CACHE); + await cache.addAll(ASSETS); + } + + event.waitUntil(addFilesToCache()); + + // Tell the new service worker to activate immediately + self.skipWaiting(); +}); + +self.addEventListener('activate', (event) => { + console.log('[Service Worker] Activate'); + // Remove previous cached data from disk + async function deleteOldCaches() { + for (const key of await caches.keys()) { + if (key !== CACHE) await caches.delete(key); + } + } + + event.waitUntil(deleteOldCaches()); + + // Tell the active service worker to take control of the page immediately + self.clients.claim(); +}); + +self.addEventListener('fetch', (event) => { + if (event.request.method !== 'GET') return; + + // --- START: MODIFICATION TO PREVENT CACHING PRIVATE ROUTES --- + const url = new URL(event.request.url); + + // If the request is for a private route, always fetch from the network. + // This ensures that server-side authentication checks are not bypassed by the cache. + if (url.pathname.startsWith('/private')) { + event.respondWith(fetch(event.request)); + return; + } + // --- END: MODIFICATION --- + + async function respond() { + const url = new URL(event.request.url); + const cache = await self.caches.open(CACHE); + + // `build`/`prerendered` pages are cached on install. + // If the page exists in the cache, serve it directly. + if (ASSETS.includes(url.pathname)) { + const cachedResponse = await cache.match(url.pathname); + if (cachedResponse) { + return cachedResponse; + } + } + + // For everything else, try to get it from the network. + try { + const response = await fetch(event.request); + + // If the request is for a file from the build directory, cache it. + if (response.status === 200 && build.length > 0 && url.pathname.startsWith(`/${build[0]}/`)) { + cache.put(event.request, response.clone()); + } + + return response; + } catch { + // If the network is unavailable, fall back to the cache. + const cachedResponse = await cache.match(event.request); + if (cachedResponse) { + return cachedResponse; + } + } + + return new Response('Not found', { status: 404 }); + } + + event.respondWith(respond()); +}); +, (event) => { + // Create a new cache and add all files to it + async function addFilesToCache() { + const cache = await self.caches.open(CACHE); + await cache.addAll(ASSETS); + } + + event.waitUntil(addFilesToCache()); + + // Tell the new service worker to activate immediately + self.skipWaiting(); +});="@sveltejs/kit" /> import { build, files, version } from '$service-worker'; // Create a unique cache name for this deployment