const CACHE_VERSION = 'mjolnir-shell-v11';
const SHELL = [
'/',
'/viewer.css',
'/viewer.js',
'/voice-worklet.js',
'/voice-worker.js',
'/manifest.webmanifest',
'/icon.svg',
];
self.addEventListener('install', event => {
event.waitUntil(
caches
.open(CACHE_VERSION)
.then(cache => cache.addAll(SHELL))
.then(() => self.skipWaiting()),
);
});
self.addEventListener('activate', event => {
event.waitUntil(
caches
.keys()
.then(names =>
Promise.all(names.filter(name => name !== CACHE_VERSION).map(name => caches.delete(name))),
)
.then(() => self.clients.claim()),
);
});
async function networkFirst(request) {
try {
const response = await fetch(request);
if (response.ok) {
const cache = await caches.open(CACHE_VERSION);
await cache.put(request, response.clone());
}
return response;
} catch (error) {
const cached = await caches.match(request);
if (cached) return cached;
throw error;
}
}
self.addEventListener('fetch', event => {
if (event.request.method !== 'GET') return;
const url = new URL(event.request.url);
if (url.origin !== self.location.origin) return;
if (url.pathname.startsWith('/api/') || url.pathname.startsWith('/auth/')) return;
event.respondWith(networkFirst(event.request));
});