From 63a1ba3f928c44dc417244447fed166665eee4a3 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 5 Oct 2020 20:36:10 +0200 Subject: [PATCH 1/2] Only do 1 token update a time --- src/external_app/external_auth.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/external_app/external_auth.ts b/src/external_app/external_auth.ts index c3c6f0fe4214..be6d25d145a0 100644 --- a/src/external_app/external_auth.ts +++ b/src/external_app/external_auth.ts @@ -64,7 +64,13 @@ export class ExternalAuth extends Auth { }); } + private _tokenCallbackPromise?: Promise; + public async refreshAccessToken(force?: boolean) { + if (this._tokenCallbackPromise) { + await this._tokenCallbackPromise; + return; + } const payload: GetExternalAuthPayload = { callback: CALLBACK_SET_TOKEN, }; @@ -72,7 +78,7 @@ export class ExternalAuth extends Auth { payload.force = true; } - const callbackPromise = new Promise( + this._tokenCallbackPromise = new Promise( (resolve, reject) => { window[CALLBACK_SET_TOKEN] = (success, data) => success ? resolve(data) : reject(data); @@ -87,10 +93,11 @@ export class ExternalAuth extends Auth { window.webkit!.messageHandlers.getExternalAuth.postMessage(payload); } - const tokens = await callbackPromise; + const tokens = await this._tokenCallbackPromise; this.data.access_token = tokens.access_token; this.data.expires = tokens.expires_in * 1000 + Date.now(); + this._tokenCallbackPromise = undefined; } public async revoke() { From bfb9cff5eafdbe58b598d301e767b586071b0f5e Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 6 Oct 2020 09:45:22 +0200 Subject: [PATCH 2/2] Update external_auth.ts --- src/external_app/external_auth.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/external_app/external_auth.ts b/src/external_app/external_auth.ts index be6d25d145a0..f1624e77d661 100644 --- a/src/external_app/external_auth.ts +++ b/src/external_app/external_auth.ts @@ -67,7 +67,7 @@ export class ExternalAuth extends Auth { private _tokenCallbackPromise?: Promise; public async refreshAccessToken(force?: boolean) { - if (this._tokenCallbackPromise) { + if (this._tokenCallbackPromise && !force) { await this._tokenCallbackPromise; return; } @@ -85,7 +85,8 @@ export class ExternalAuth extends Auth { } ); - await 0; + // we sleep 1 microtask to get the promise to actually set it on the window object. + await Promise.resolve(); if (window.externalApp) { window.externalApp.getExternalAuth(JSON.stringify(payload)); @@ -108,7 +109,8 @@ export class ExternalAuth extends Auth { 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) { window.externalApp.revokeExternalAuth(JSON.stringify(payload));