refactor(sw): streamline access token request handling with improved message listener

This commit is contained in:
2026-02-20 18:40:58 +11:00
parent c55e311241
commit 0bb1b411f4

View File

@@ -3,15 +3,30 @@
export type {};
declare const self: ServiceWorkerGlobalScope;
async function askForAccessToken(client: Client): Promise<string | undefined> {
/**
* Pending token requests keyed by responseKey
*/
const pendingTokenRequests = new Map<string, (token: string | undefined) => 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<string | undefined> {
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' });
});
}