/// import { precacheAndRoute, cleanupOutdatedCaches } from 'workbox-precaching'; export type {}; declare const self: ServiceWorkerGlobalScope; const DEFAULT_NOTIFICATION_ICON = '/icons/icon-192x192.png'; // Replace with your actual default icon path const DEFAULT_NOTIFICATION_BADGE = '/icons/badge-72x72.png'; // Replace with your actual default badge icon path (for notification UI) const pendingReplies = new Map(); let messageIdCounter = 0; function sendAndWaitForReply(client: WindowClient, type: string, payload: object) { messageIdCounter += 1; const id = messageIdCounter; const promise = new Promise((resolve) => { pendingReplies.set(id, resolve); }); client.postMessage({ type, id, payload }); return promise; } self.addEventListener('message', (event) => { const { replyTo } = event.data; if (replyTo) { const resolve = pendingReplies.get(replyTo); if (resolve) { pendingReplies.delete(replyTo); resolve(event.data.payload); } } }); function fetchConfig(token?: string): RequestInit | undefined { if (!token) return undefined; return { headers: { Authorization: `Bearer ${token}`, }, cache: 'default', }; } self.addEventListener('activate', (event: ExtendableEvent) => { event.waitUntil( (async () => { await self.clients.claim(); })() ); }); self.addEventListener('install', (event: ExtendableEvent) => { event.waitUntil(self.skipWaiting()); }); self.addEventListener('fetch', (event: FetchEvent) => { const { url, method } = event.request; if (method !== 'GET') return; if ( !url.includes('/_matrix/client/v1/media/download') && !url.includes('/_matrix/client/v1/media/thumbnail') ) { return; } event.respondWith( (async (): Promise => { const client = await self.clients.get(event.clientId); let token: string | undefined; if (client) token = await askForAccessToken(client); return fetch(url, fetchConfig(token)); })() ); });