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 {};
|
export type {};
|
||||||
declare const self: ServiceWorkerGlobalScope;
|
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) => {
|
return new Promise((resolve) => {
|
||||||
const responseKey = Math.random().toString(36);
|
const responseKey = Math.random().toString(36);
|
||||||
const listener = (event: ExtendableMessageEvent) => {
|
pendingTokenRequests.set(responseKey, resolve);
|
||||||
if (event.data.responseKey !== responseKey) return;
|
|
||||||
resolve(event.data.token);
|
|
||||||
self.removeEventListener('message', listener);
|
|
||||||
};
|
|
||||||
self.addEventListener('message', listener);
|
|
||||||
client.postMessage({ responseKey, type: 'token' });
|
client.postMessage({ responseKey, type: 'token' });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user