import { precacheAndRoute, matchPrecache } from "workbox-precaching"; import { registerRoute, setDefaultHandler } from "workbox-routing"; import { NetworkFirst, NetworkOnly, StaleWhileRevalidate, } from "workbox-strategies"; import { CacheableResponsePlugin } from "workbox-cacheable-response"; import { ExpirationPlugin } from "workbox-expiration"; declare let self: ServiceWorkerGlobalScope; self.addEventListener("message", (event) => { if (event.data && (event.data as { type: string }).type === "SKIP_WAITING") { void self.skipWaiting(); } }); precacheAndRoute(self.__WB_MANIFEST); const networkOnly = new NetworkOnly(); registerRoute(new RegExp("/swagger/?.*"), new NetworkOnly()); registerRoute(new RegExp("/api/token/?.*"), new NetworkOnly()); registerRoute(new RegExp("/api/search/?.*"), new NetworkOnly()); registerRoute( new RegExp("/api/users/.+/avatar"), new StaleWhileRevalidate({ cacheName: "avatars", plugins: [ new CacheableResponsePlugin({ statuses: [200], }), new ExpirationPlugin({ maxAgeSeconds: 60 * 60 * 24 * 30 * 3, // 3 months }), ], }) ); registerRoute( new RegExp("/api/?.*"), new NetworkFirst({ plugins: [ new CacheableResponsePlugin({ statuses: [200], }), ], }) ); setDefaultHandler((options) => { const { request } = options; if (request instanceof Request && request.destination === "document") return matchPrecache("/index.html").then((r) => r == null ? Response.error() : r ); else return networkOnly.handle(options); });