service-worker.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { timestamp, files, shell, routes } from '@sapper/service-worker';
  2. const ASSETS = `cache${timestamp}`;
  3. // `shell` is an array of all the files generated by the bundler,
  4. // `files` is an array of everything in the `static` directory
  5. const to_cache = shell.concat(files);
  6. const cached = new Set(to_cache);
  7. self.addEventListener('install', event => {
  8. event.waitUntil(
  9. caches
  10. .open(ASSETS)
  11. .then(cache => cache.addAll(to_cache))
  12. .then(() => {
  13. self.skipWaiting();
  14. })
  15. );
  16. });
  17. self.addEventListener('activate', event => {
  18. event.waitUntil(
  19. caches.keys().then(async keys => {
  20. // delete old caches
  21. for (const key of keys) {
  22. if (key !== ASSETS) await caches.delete(key);
  23. }
  24. self.clients.claim();
  25. })
  26. );
  27. });
  28. self.addEventListener('fetch', event => {
  29. if (event.request.method !== 'GET' || event.request.headers.has('range')) return;
  30. const url = new URL(event.request.url);
  31. // don't try to handle e.g. data: URIs
  32. if (!url.protocol.startsWith('http')) return;
  33. // ignore dev server requests
  34. if (url.hostname === self.location.hostname && url.port !== self.location.port) return;
  35. // always serve static files and bundler-generated assets from cache
  36. if (url.host === self.location.host && cached.has(url.pathname)) {
  37. event.respondWith(caches.match(event.request));
  38. return;
  39. }
  40. // for pages, you might want to serve a shell `service-worker-index.html` file,
  41. // which Sapper has generated for you. It's not right for every
  42. // app, but if it's right for yours then uncomment this section
  43. /*
  44. if (url.origin === self.origin && routes.find(route => route.pattern.test(url.pathname))) {
  45. event.respondWith(caches.match('/service-worker-index.html'));
  46. return;
  47. }
  48. */
  49. if (event.request.cache === 'only-if-cached') return;
  50. // for everything else, try the network first, falling back to
  51. // cache if the user is offline. (If the pages never change, you
  52. // might prefer a cache-first approach to a network-first one.)
  53. event.respondWith(
  54. caches
  55. .open(`offline${timestamp}`)
  56. .then(async cache => {
  57. try {
  58. const response = await fetch(event.request);
  59. cache.put(event.request, response.clone());
  60. return response;
  61. } catch(err) {
  62. const response = await cache.match(event.request);
  63. if (response) return response;
  64. throw err;
  65. }
  66. })
  67. );
  68. });