self.addEventListener('activate', (e) => { e.waitUntil(clients.claim()); }); self.addEventListener('message', (e) => { e.waitUntil((async () => { const url = new URL(e.data.url); const request = new Request(url, {mode: e.data.mode}); const cache = await caches.open('v1'); let response; switch(e.data.source) { case "service-worker": response = new Response('foo'); break; case "network": try { response = await fetch(request); } catch(error) { e.source.postMessage('not-stored'); return; } break; } await cache.put(request, response); e.source.postMessage('stored'); })()); })