Browse Source

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

tags/0.15.1
NFish 9 months ago
parent
commit
b7a4e3903e
No account linked to committer's email address
1 changed files with 11 additions and 3 deletions
  1. 11
    3
      web/service/refresh-token.ts

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

}) })
} }


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')


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)
} }
} }
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)])
} }

Loading…
Cancel
Save