Преглед на файлове

fix: add last_refresh_time to track the validity of is_other_tab_refreshing (#12517)

NFish преди 3 месеца
родител
ревизия
b7a4e3903e
променени са 1 файла, в които са добавени 11 реда и са изтрити 3 реда
  1. 11 3
      web/service/refresh-token.ts

+ 11 - 3
web/service/refresh-token.ts

@@ -21,16 +21,23 @@ function waitUntilTokenRefreshed() {
   })
   })
 }
 }
 
 
+const isRefreshingSignAvailable = function (delta: number) {
+  const nowTime = new Date().getTime()
+  const lastTime = globalThis.localStorage.getItem('last_refresh_time') || '0'
+  return nowTime - parseInt(lastTime) <= delta
+}
+
 // only one request can send
 // only one request can send
-async function getNewAccessToken(): Promise<void> {
+async function getNewAccessToken(timeout: number): Promise<void> {
   try {
   try {
     const isRefreshingSign = globalThis.localStorage.getItem(LOCAL_STORAGE_KEY)
     const isRefreshingSign = globalThis.localStorage.getItem(LOCAL_STORAGE_KEY)
-    if ((isRefreshingSign && isRefreshingSign === '1') || isRefreshing) {
+    if ((isRefreshingSign && isRefreshingSign === '1' && isRefreshingSignAvailable(timeout)) || isRefreshing) {
       await waitUntilTokenRefreshed()
       await waitUntilTokenRefreshed()
     }
     }
     else {
     else {
       isRefreshing = true
       isRefreshing = true
       globalThis.localStorage.setItem(LOCAL_STORAGE_KEY, '1')
       globalThis.localStorage.setItem(LOCAL_STORAGE_KEY, '1')
+      globalThis.localStorage.setItem('last_refresh_time', new Date().getTime().toString())
       globalThis.addEventListener('beforeunload', releaseRefreshLock)
       globalThis.addEventListener('beforeunload', releaseRefreshLock)
       const refresh_token = globalThis.localStorage.getItem('refresh_token')
       const refresh_token = globalThis.localStorage.getItem('refresh_token')
 
 
@@ -72,6 +79,7 @@ function releaseRefreshLock() {
   if (isRefreshing) {
   if (isRefreshing) {
     isRefreshing = false
     isRefreshing = false
     globalThis.localStorage.removeItem(LOCAL_STORAGE_KEY)
     globalThis.localStorage.removeItem(LOCAL_STORAGE_KEY)
+    globalThis.localStorage.removeItem('last_refresh_time')
     globalThis.removeEventListener('beforeunload', releaseRefreshLock)
     globalThis.removeEventListener('beforeunload', releaseRefreshLock)
   }
   }
 }
 }
@@ -80,5 +88,5 @@ export async function refreshAccessTokenOrRelogin(timeout: number) {
   return Promise.race([new Promise<void>((resolve, reject) => setTimeout(() => {
   return Promise.race([new Promise<void>((resolve, reject) => setTimeout(() => {
     releaseRefreshLock()
     releaseRefreshLock()
     reject(new Error('request timeout'))
     reject(new Error('request timeout'))
-  }, timeout)), getNewAccessToken()])
+  }, timeout)), getNewAccessToken(timeout)])
 }
 }