45 lines
1.5 KiB
TypeScript
45 lines
1.5 KiB
TypeScript
/// <reference lib="webworker" />
|
|
|
|
import { cleanupOutdatedCaches, precacheAndRoute } from 'workbox-precaching'
|
|
import { NetworkFirst } from 'workbox-strategies'
|
|
import { ExpirationPlugin } from 'workbox-expiration'
|
|
import { registerRoute } from 'workbox-routing'
|
|
import { clientsClaim } from 'workbox-core'
|
|
|
|
declare let self: ServiceWorkerGlobalScope
|
|
|
|
// NOTE: Clean up outdated caches
|
|
// With each new production build, all precached assets
|
|
// that were modified are added to the cache. The old versions
|
|
// need to be removed manually.
|
|
cleanupOutdatedCaches()
|
|
|
|
// Let new service worker claim control of already open web pages
|
|
// https://developer.chrome.com/docs/workbox/modules/workbox-core/#clients-claim
|
|
clientsClaim()
|
|
|
|
// Support for an update prompt handled by VitePWA:
|
|
// https://vite-plugin-pwa.netlify.app/guide/prompt-for-update.html
|
|
self.addEventListener('message', (event) => {
|
|
if (event.data?.type === 'SKIP_WAITING') {
|
|
return self.skipWaiting()
|
|
}
|
|
})
|
|
|
|
// NOTE: Network-First cache for API calls
|
|
// We're using cache only when the user goes offline
|
|
registerRoute(({ url }) => {
|
|
if (url.pathname.startsWith('/api/v1/listen')) return false
|
|
return url.pathname.startsWith('/api/v1')
|
|
}, new NetworkFirst({
|
|
cacheName: 'API Routes',
|
|
plugins: [
|
|
// Expire after a week
|
|
new ExpirationPlugin({ maxAgeSeconds: 7 * 24 * 3600 })
|
|
]
|
|
}))
|
|
|
|
// Precache all assets and add routes for them
|
|
// https://developer.chrome.com/docs/workbox/reference/workbox-precaching/#method-precacheAndRoute
|
|
precacheAndRoute(self.__WB_MANIFEST)
|