refactor(sw): streamline access token request handling with improved message listener
This commit is contained in:
29
src/sw.ts
29
src/sw.ts
@@ -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' });
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user