diff --git a/src/sw.ts b/src/sw.ts index 2179dfc..cb84e3a 100644 --- a/src/sw.ts +++ b/src/sw.ts @@ -3,15 +3,30 @@ export type {}; declare const self: ServiceWorkerGlobalScope; -async function askForAccessToken(client: Client): Promise { +/** + * Pending token requests keyed by responseKey + */ +const pendingTokenRequests = new Map void>(); + +/** + * Message handler must be registered at top level for service worker compliance + */ +self.addEventListener('message', (event: ExtendableMessageEvent) => { + const { responseKey, token } = event.data; + if (responseKey && pendingTokenRequests.has(responseKey)) { + const resolve = pendingTokenRequests.get(responseKey)!; + pendingTokenRequests.delete(responseKey); + resolve(token); + } +}); + +/** + * Request an access token from the client + */ +function askForAccessToken(client: Client): Promise { return new Promise((resolve) => { const responseKey = Math.random().toString(36); - const listener = (event: ExtendableMessageEvent) => { - if (event.data.responseKey !== responseKey) return; - resolve(event.data.token); - self.removeEventListener('message', listener); - }; - self.addEventListener('message', listener); + pendingTokenRequests.set(responseKey, resolve); client.postMessage({ responseKey, type: 'token' }); }); }