Merge pull request #6053 from wucm667/fix/issue-5899-token-refresh-lock-cpu

fix(frontend): prevent token refresh lock loop
This commit is contained in:
Wesley Liddick
2026-08-21 21:23:45 +08:00
committed by GitHub
2 changed files with 17 additions and 12 deletions
@@ -91,6 +91,23 @@ describe('refreshAuthTokens', () => {
})
})
it('does not mistake boundary timer jitter for a completed peer refresh', async () => {
vi.useFakeTimers()
seedSession({ token_expires_at: String(Date.now() + 120_001) })
mockedPost.mockResolvedValueOnce(refreshedResponse())
const request = vi.fn(async (_name: string, callback: () => Promise<unknown>) => callback())
Object.defineProperty(navigator, 'locks', {
configurable: true,
value: { request }
})
const { refreshAuthTokens } = await import('@/api/tokenRefresh')
await expect(refreshAuthTokens()).resolves.toMatchObject({ access_token: 'new-access' })
expect(request).toHaveBeenCalledTimes(1)
expect(mockedPost).toHaveBeenCalledTimes(1)
})
it('recovers when a peer publishes the rotated token just after this request fails', async () => {
seedSession()
mockedPost.mockRejectedValueOnce(new Error('refresh token already used'))
-12
View File
@@ -8,7 +8,6 @@ const REFRESH_TOKEN_KEY = 'refresh_token'
const TOKEN_EXPIRES_AT_KEY = 'token_expires_at'
const TOKEN_REFRESH_LOCK_NAME = 'sub2api-auth-token-refresh'
const TOKEN_REFRESH_TIMEOUT_MS = 30_000
const TOKEN_REFRESH_BUFFER_MS = 120_000
const PEER_REFRESH_WAIT_MS = 1_000
const PEER_REFRESH_GRACE_MS = 1_000
const PEER_REFRESH_POLL_MS = 25
@@ -106,17 +105,6 @@ function readPeerRefreshResult(
return storedPair
}
if (!failedAccessToken) {
const expiresAt = Number(localStorage.getItem(TOKEN_EXPIRES_AT_KEY))
if (
expiresAt === snapshot.expiresAt &&
storedPair.access_token === snapshot.accessToken &&
expiresAt > Date.now() + TOKEN_REFRESH_BUFFER_MS
) {
return storedPair
}
}
return null
}