diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index fe8ae1d53..1d181beb2 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -149,8 +149,22 @@ jobs: - name: ๐ŸŽญ Install Playwright browsers run: pnpm e2e:install + # - name: ๐Ÿณ Start Thunder + # run: pnpm e2e:docker:up:thunder + - name: ๐Ÿณ Start Thunder - run: pnpm e2e:docker:up:thunder + run: | + set -euxo pipefail + pnpm e2e:docker:up:thunder || { + echo "Thunder compose failed. Dumping docker state + logs..." + docker ps -a || true + docker compose -f e2e/docker-compose.yml ps || true + docker compose -f e2e/docker-compose.yml logs --no-color --timestamps || true + # If thunder-setup is a container name, also dump it directly: + docker logs --timestamps asgardeo-e2e-thunder || true + docker inspect asgardeo-e2e-thunder || true + exit 1 + } - name: ๐Ÿงช Run E2E redirect tests against Thunder run: pnpm e2e -- --idp thunder --mode redirect diff --git a/packages/browser/src/__legacy__/helpers/authentication-helper.ts b/packages/browser/src/__legacy__/helpers/authentication-helper.ts index 867db398b..b5a120aa3 100644 --- a/packages/browser/src/__legacy__/helpers/authentication-helper.ts +++ b/packages/browser/src/__legacy__/helpers/authentication-helper.ts @@ -65,6 +65,7 @@ export class AuthenticationHelper; protected _instanceId: number; protected _isTokenRefreshing: boolean; + protected _refreshAccessTokenPromise?: Promise; public constructor(authClient: AsgardeoAuthClient, spaHelper: SPAHelper) { this._authenticationClient = authClient; @@ -72,6 +73,7 @@ export class AuthenticationHelper void, ): Promise { - try { - await this._authenticationClient.refreshAccessToken(); - const customGrantConfig = await this.getCustomGrantConfigData(); - if (customGrantConfig) { - await this.exchangeToken(customGrantConfig, enableRetrievingSignOutURLFromSession); - } - this._spaHelper.refreshAccessTokenAutomatically(this); + if (this._refreshAccessTokenPromise) { + return this._refreshAccessTokenPromise; + } - return this._authenticationClient.getUser(); - } catch (error) { - const refreshTokenError: Message = { - type: REFRESH_ACCESS_TOKEN_ERR0R, - }; + this._refreshAccessTokenPromise = (async (): Promise => { + try { + await this._authenticationClient.refreshAccessToken(); + const customGrantConfig = await this.getCustomGrantConfigData(); + if (customGrantConfig) { + await this.exchangeToken(customGrantConfig, enableRetrievingSignOutURLFromSession); + } + this._spaHelper.refreshAccessTokenAutomatically(this); - window.postMessage(refreshTokenError); - return Promise.reject(error); - } + return this._authenticationClient.getUser(); + } catch (error) { + const refreshTokenError: Message = { + type: REFRESH_ACCESS_TOKEN_ERR0R, + }; + + window.postMessage(refreshTokenError); + throw error; + } finally { + this._refreshAccessTokenPromise = undefined; + } + })(); + + return this._refreshAccessTokenPromise; } protected async retryFailedRequests(failedRequest: HttpRequestInterface): Promise { @@ -385,9 +397,9 @@ export class AuthenticationHelper { if (error?.response?.status === 401 || !error?.response) { - let refreshTokenResponse: TokenResponse | User; + let refreshTokenResponse: User; try { - refreshTokenResponse = await this._authenticationClient.refreshAccessToken(); + refreshTokenResponse = await this.refreshAccessToken(); } catch (refreshError: any) { if (isHttpHandlerEnabled) { if (typeof httpErrorCallback === 'function') {