diff options
Diffstat (limited to 'demo/sw.ts')
-rw-r--r-- | demo/sw.ts | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/demo/sw.ts b/demo/sw.ts new file mode 100644 index 0000000..0cdbcde --- /dev/null +++ b/demo/sw.ts @@ -0,0 +1,43 @@ +/// <reference lib="webworker" /> + +const sw = self as unknown as ServiceWorkerGlobalScope & { + __precacheManifest: ({ url: string, revision: string })[]; +}; + +const precacheVersion = sw.__precacheManifest + .map(p => p.revision) + .join(''); +const precacheFiles = sw.__precacheManifest.map(p => p.url).filter( + u => /\.(ico)$/.test(u) +); + +const ch = () => caches.open(precacheVersion); + +sw.addEventListener('install', ev => { + // Do not finish installing until every file in the app has been cached + ev.waitUntil( + ch().then( + cache => cache.addAll(precacheFiles) + ) + ); +}); + +sw.addEventListener('activate', ev => { + ev.waitUntil( + caches.keys().then(keys => Promise.all( + keys.filter(k => k !== precacheVersion).map( + k => caches.delete(k) + ) + )).then(() => sw.clients.claim()) + ); +}); + +sw.addEventListener('fetch', ev => { + ev.respondWith( + caches.match(ev.request).then(resp => resp || ch().then(c => + fetch(ev.request).then(res => c.put(ev.request, res.clone()).then( + () => res + )) + )) + ) +});
\ No newline at end of file |