36 lines
1.1 KiB
TypeScript
36 lines
1.1 KiB
TypeScript
import { installMessageListener } from './messaging.ts';
|
|
import { handleFetch as handleAssetFetch } from './request.ts';
|
|
|
|
const ASSET_REQUEST_REGEX = /^\/api\/assets\/[a-f0-9-]+\/(original|thumbnail)/;
|
|
|
|
const sw = globalThis as unknown as ServiceWorkerGlobalScope;
|
|
|
|
const handleActivate = (event: ExtendableEvent) => {
|
|
event.waitUntil(sw.clients.claim());
|
|
};
|
|
|
|
const handleInstall = (event: ExtendableEvent) => {
|
|
event.waitUntil(sw.skipWaiting());
|
|
};
|
|
|
|
const isImageTagRequest = (event: FetchEvent) =>
|
|
event.request.method === 'GET' && event.request.destination === 'image';
|
|
|
|
const handleFetch = (event: FetchEvent): void => {
|
|
if (!isImageTagRequest(event)) {
|
|
return;
|
|
}
|
|
|
|
// Cache requests for thumbnails
|
|
const url = new URL(event.request.url);
|
|
if (url.origin === globalThis.location.origin && ASSET_REQUEST_REGEX.test(url.pathname)) {
|
|
event.respondWith(handleAssetFetch(event.request));
|
|
return;
|
|
}
|
|
};
|
|
|
|
sw.addEventListener('install', handleInstall, { passive: true });
|
|
sw.addEventListener('activate', handleActivate, { passive: true });
|
|
sw.addEventListener('fetch', handleFetch, { passive: true });
|
|
installMessageListener();
|