sw.ts 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  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);
  9. const ch = () => caches.open(precacheVersion);
  10. sw.addEventListener('install', ev => {
  11. // Do not finish installing until every file in the app has been cached
  12. ev.waitUntil(
  13. ch().then(
  14. cache => cache.addAll(precacheFiles)
  15. )
  16. );
  17. });
  18. sw.addEventListener('activate', ev => {
  19. ev.waitUntil(
  20. caches.keys().then(keys => Promise.all(
  21. keys.filter(k => k !== precacheVersion).map(
  22. k => caches.delete(k)
  23. )
  24. )).then(() => sw.clients.claim())
  25. );
  26. });
  27. sw.addEventListener('fetch', ev => {
  28. ev.respondWith(
  29. caches.match(ev.request).then(resp => resp || ch().then(c =>
  30. fetch(ev.request).then(res => c.put(ev.request, res.clone()).then(
  31. () => res
  32. ))
  33. ))
  34. )
  35. });