Only do 1 token update a time (#7236)

This commit is contained in:
Bram Kragten 2020-10-06 10:55:12 +02:00 committed by GitHub
parent 722e01608c
commit ede9931903
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -64,7 +64,13 @@ export class ExternalAuth extends Auth {
}); });
} }
private _tokenCallbackPromise?: Promise<RefreshTokenResponse>;
public async refreshAccessToken(force?: boolean) { public async refreshAccessToken(force?: boolean) {
if (this._tokenCallbackPromise && !force) {
await this._tokenCallbackPromise;
return;
}
const payload: GetExternalAuthPayload = { const payload: GetExternalAuthPayload = {
callback: CALLBACK_SET_TOKEN, callback: CALLBACK_SET_TOKEN,
}; };
@ -72,14 +78,15 @@ export class ExternalAuth extends Auth {
payload.force = true; payload.force = true;
} }
const callbackPromise = new Promise<RefreshTokenResponse>( this._tokenCallbackPromise = new Promise<RefreshTokenResponse>(
(resolve, reject) => { (resolve, reject) => {
window[CALLBACK_SET_TOKEN] = (success, data) => window[CALLBACK_SET_TOKEN] = (success, data) =>
success ? resolve(data) : reject(data); success ? resolve(data) : reject(data);
} }
); );
await 0; // we sleep 1 microtask to get the promise to actually set it on the window object.
await Promise.resolve();
if (window.externalApp) { if (window.externalApp) {
window.externalApp.getExternalAuth(JSON.stringify(payload)); window.externalApp.getExternalAuth(JSON.stringify(payload));
@ -87,10 +94,11 @@ export class ExternalAuth extends Auth {
window.webkit!.messageHandlers.getExternalAuth.postMessage(payload); window.webkit!.messageHandlers.getExternalAuth.postMessage(payload);
} }
const tokens = await callbackPromise; const tokens = await this._tokenCallbackPromise;
this.data.access_token = tokens.access_token; this.data.access_token = tokens.access_token;
this.data.expires = tokens.expires_in * 1000 + Date.now(); this.data.expires = tokens.expires_in * 1000 + Date.now();
this._tokenCallbackPromise = undefined;
} }
public async revoke() { public async revoke() {
@ -101,7 +109,8 @@ export class ExternalAuth extends Auth {
success ? resolve(data) : reject(data); success ? resolve(data) : reject(data);
}); });
await 0; // we sleep 1 microtask to get the promise to actually set it on the window object.
await Promise.resolve();
if (window.externalApp) { if (window.externalApp) {
window.externalApp.revokeExternalAuth(JSON.stringify(payload)); window.externalApp.revokeExternalAuth(JSON.stringify(payload));