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