entry.worker.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /// <reference lib="WebWorker" />
  2. import { Storage } from '@remix-pwa/cache';
  3. import { cacheFirst, networkFirst } from '@remix-pwa/strategy';
  4. import type { DefaultFetchHandler } from '@remix-pwa/sw';
  5. import { RemixNavigationHandler, logger, matchRequest } from '@remix-pwa/sw';
  6. declare let self: ServiceWorkerGlobalScope;
  7. const PAGES = 'page-cache';
  8. const DATA = 'data-cache';
  9. const ASSETS = 'assets-cache';
  10. // Open the caches and wrap them in `RemixCache` instances.
  11. const dataCache = Storage.open(DATA, {
  12. ttl: 60 * 60 * 24 * 7 * 1_000, // 7 days
  13. });
  14. const documentCache = Storage.open(PAGES);
  15. const assetCache = Storage.open(ASSETS);
  16. self.addEventListener('install', (event: ExtendableEvent) => {
  17. logger.log('Service worker installed');
  18. event.waitUntil(self.skipWaiting());
  19. });
  20. self.addEventListener('activate', (event: ExtendableEvent) => {
  21. logger.log('Service worker activated');
  22. event.waitUntil(self.clients.claim());
  23. });
  24. const dataHandler = networkFirst({
  25. cache: dataCache,
  26. });
  27. const assetsHandler = cacheFirst({
  28. cache: assetCache,
  29. cacheQueryOptions: {
  30. ignoreSearch: true,
  31. ignoreVary: true,
  32. },
  33. });
  34. // The default fetch event handler will be invoke if the
  35. // route is not matched by any of the worker action/loader.
  36. export const defaultFetchHandler: DefaultFetchHandler = ({ context, request }) => {
  37. const type = matchRequest(request);
  38. if (type === 'asset') {
  39. return assetsHandler(context.event.request);
  40. }
  41. if (type === 'loader') {
  42. return dataHandler(context.event.request);
  43. }
  44. return context.fetchFromServer();
  45. };
  46. const handler = new RemixNavigationHandler({
  47. dataCache,
  48. documentCache,
  49. });
  50. self.addEventListener('message', event => {
  51. event.waitUntil(handler.handle(event));
  52. });