Files
placebo.mk/pwa/src/sw.ts
T
2026-02-22 02:23:41 +01:00

61 lines
1.6 KiB
TypeScript

/// <reference lib="webworker" />
declare const self: ServiceWorkerGlobalScope
import { precacheAndRoute, cleanupOutdatedCaches } from 'workbox-precaching'
import { registerRoute } from 'workbox-routing'
import { StaleWhileRevalidate } from 'workbox-strategies'
import { ExpirationPlugin } from 'workbox-expiration'
import { CacheableResponsePlugin } from 'workbox-cacheable-response'
precacheAndRoute(self.__WB_MANIFEST)
cleanupOutdatedCaches()
registerRoute(
({ url }) => url.pathname.includes('/api/'),
new StaleWhileRevalidate({
cacheName: 'api-cache',
plugins: [
new CacheableResponsePlugin({
statuses: [0, 200],
}),
new ExpirationPlugin({
maxEntries: 100,
maxAgeSeconds: 60 * 60 * 24,
}),
],
}),
)
self.addEventListener('push', (event: PushEvent) => {
const data = event.data?.json() ?? {}
const title = data.title ?? 'Placebo.mk'
const options = {
body: data.body ?? 'New update available',
icon: data.icon ?? '/icons/icon-192.svg',
badge: data.badge ?? '/icons/badge-72.svg',
data: data.url ?? '/',
tag: data.tag,
}
event.waitUntil(self.registration.showNotification(title, options))
})
self.addEventListener('notificationclick', (event: NotificationEvent) => {
event.notification.close()
event.waitUntil(
self.clients.matchAll({ type: 'window' }).then((clientList) => {
const url = event.notification.data
for (const client of clientList) {
if (client.url === url && 'focus' in client) {
return client.focus()
}
}
return self.clients.openWindow(url)
}),
)
})
export {}