@@ -21,16 +21,23 @@ function waitUntilTokenRefreshed() {
21
21
} )
22
22
}
23
23
24
+ const isRefreshingSignAvailable = function ( delta : number ) {
25
+ const nowTime = new Date ( ) . getTime ( )
26
+ const lastTime = globalThis . localStorage . getItem ( 'last_refresh_time' ) || '0'
27
+ return nowTime - parseInt ( lastTime ) <= delta
28
+ }
29
+
24
30
// only one request can send
25
- async function getNewAccessToken ( ) : Promise < void > {
31
+ async function getNewAccessToken ( timeout : number ) : Promise < void > {
26
32
try {
27
33
const isRefreshingSign = globalThis . localStorage . getItem ( LOCAL_STORAGE_KEY )
28
- if ( ( isRefreshingSign && isRefreshingSign === '1' ) || isRefreshing ) {
34
+ if ( ( isRefreshingSign && isRefreshingSign === '1' && isRefreshingSignAvailable ( timeout ) ) || isRefreshing ) {
29
35
await waitUntilTokenRefreshed ( )
30
36
}
31
37
else {
32
38
isRefreshing = true
33
39
globalThis . localStorage . setItem ( LOCAL_STORAGE_KEY , '1' )
40
+ globalThis . localStorage . setItem ( 'last_refresh_time' , new Date ( ) . getTime ( ) . toString ( ) )
34
41
globalThis . addEventListener ( 'beforeunload' , releaseRefreshLock )
35
42
const refresh_token = globalThis . localStorage . getItem ( 'refresh_token' )
36
43
@@ -72,6 +79,7 @@ function releaseRefreshLock() {
72
79
if ( isRefreshing ) {
73
80
isRefreshing = false
74
81
globalThis . localStorage . removeItem ( LOCAL_STORAGE_KEY )
82
+ globalThis . localStorage . removeItem ( 'last_refresh_time' )
75
83
globalThis . removeEventListener ( 'beforeunload' , releaseRefreshLock )
76
84
}
77
85
}
@@ -80,5 +88,5 @@ export async function refreshAccessTokenOrRelogin(timeout: number) {
80
88
return Promise . race ( [ new Promise < void > ( ( resolve , reject ) => setTimeout ( ( ) => {
81
89
releaseRefreshLock ( )
82
90
reject ( new Error ( 'request timeout' ) )
83
- } , timeout ) ) , getNewAccessToken ( ) ] )
91
+ } , timeout ) ) , getNewAccessToken ( timeout ) ] )
84
92
}
0 commit comments