sw.ts 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. /// <reference lib="webworker" />
  2. const sw = self as unknown as ServiceWorkerGlobalScope & {
  3. __precacheManifest: ({ url: string, revision: string })[];
  4. };
  5. const precacheVersion = sw.__precacheManifest
  6. .map(p => p.revision)
  7. .join('');
  8. const precacheFiles = sw.__precacheManifest.map(p => p.url).filter(
  9. u => /\.(ico)$/.test(u)
  10. );
  11. const ch = () => caches.open(precacheVersion);
  12. sw.addEventListener('install', ev => {
  13. // Do not finish installing until every file in the app has been cached
  14. ev.waitUntil(
  15. ch().then(
  16. cache => cache.addAll(precacheFiles)
  17. )
  18. );
  19. });
  20. sw.addEventListener('activate', ev => {
  21. ev.waitUntil(
  22. caches.keys().then(keys => Promise.all(
  23. keys.filter(k => k !== precacheVersion).map(
  24. k => caches.delete(k)
  25. )
  26. )).then(() => sw.clients.claim())
  27. );
  28. });
  29. sw.addEventListener('fetch', ev => {
  30. ev.respondWith(
  31. caches.match(ev.request).then(resp => resp || ch().then(c =>
  32. fetch(ev.request).then(res => c.put(ev.request, res.clone()).then(
  33. () => res
  34. ))
  35. ))
  36. )
  37. });