11/**
2- * Copyright (c) 2020, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
2+ * Copyright (c) 2020-2026 , WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
33 *
44 * WSO2 Inc. licenses this file to you under the Apache License,
55 * Version 2.0 (the "License"); you may not use this file except
@@ -24,6 +24,7 @@ import {MainThreadClientConfig, WebWorkerClientConfig} from '../models/client-co
2424export class SPAHelper < T extends MainThreadClientConfig | WebWorkerClientConfig > {
2525 private _authenticationClient : AsgardeoAuthClient < T > ;
2626 private _storageManager : StorageManager < T > ;
27+ private _isTokenRefreshLoading : boolean = false ;
2728
2829 public constructor ( authClient : AsgardeoAuthClient < T > ) {
2930 this . _authenticationClient = authClient ;
@@ -42,13 +43,37 @@ export class SPAHelper<T extends MainThreadClientConfig | WebWorkerClientConfig>
4243
4344 const sessionData = await this . _storageManager . getSessionData ( ) ;
4445 if ( sessionData . refresh_token ) {
45- // Refresh 10 seconds before the expiry time
46- const expiryTime = parseInt ( sessionData . expires_in ) ;
47- const time = expiryTime <= 10 ? expiryTime : expiryTime - 10 ;
46+ if ( sessionData . created_at == null || sessionData . expires_in == null ) {
47+ return ;
48+ }
49+
50+ const TOKEN_REFRESH_BUFFER_MS = 10_000 ;
51+ const expiryTime = Number ( sessionData . expires_in ) * 1000 ;
52+ const absoluteExpiryTime : number = sessionData . created_at + expiryTime ;
53+ const timeUntilRefresh = absoluteExpiryTime - Date . now ( ) - TOKEN_REFRESH_BUFFER_MS ;
54+
55+ if ( timeUntilRefresh <= 0 ) {
56+ if ( this . _isTokenRefreshLoading ) return ;
57+
58+ this . _isTokenRefreshLoading = true ;
59+ try {
60+ await authenticationHelper . refreshAccessToken ( ) ;
61+ } finally {
62+ this . _isTokenRefreshLoading = false ;
63+ }
64+ return ;
65+ }
4866
4967 const timer = setTimeout ( async ( ) => {
50- await authenticationHelper . refreshAccessToken ( ) ;
51- } , time * 1000 ) ;
68+ if ( this . _isTokenRefreshLoading ) return ;
69+
70+ this . _isTokenRefreshLoading = true ;
71+ try {
72+ await authenticationHelper . refreshAccessToken ( ) ;
73+ } finally {
74+ this . _isTokenRefreshLoading = false ;
75+ }
76+ } , timeUntilRefresh ) ;
5277
5378 await this . _storageManager . setTemporaryDataParameter (
5479 TokenConstants . Storage . StorageKeys . REFRESH_TOKEN_TIMER ,
0 commit comments