feat: 刷新 Access Token(带并发锁)
This commit is contained in:
@@ -7,9 +7,6 @@ import { useAccountStore } from '@/stores'
|
||||
/** SSE 连接 URL */
|
||||
const SSE_URL = '/api/sse/subscribe'
|
||||
|
||||
/** 是否正在刷新 token(防并发) */
|
||||
let isRefreshing = false
|
||||
|
||||
// ==================== 模块级单例 ====================
|
||||
|
||||
const isConnected = ref(false)
|
||||
@@ -37,16 +34,19 @@ const client = new SseClient(SSE_URL, () => useAccountStore().accessToken, {
|
||||
|
||||
// ==================== Token 刷新 ====================
|
||||
|
||||
/**
|
||||
* SSE 收到 401 → 调用 store 的 refreshAccessToken() 刷新 token 后重连
|
||||
* <p>
|
||||
* 无需维护独立并发锁:accountStore.refreshAccessToken() 内部已有 Promise 级锁,
|
||||
* 若 HTTP 刷新拦截器已在刷新中,此调用会复用同一个 Promise,确保只发一次请求。
|
||||
*/
|
||||
async function refreshTokenAndReconnect(): Promise<void> {
|
||||
if (isRefreshing) return
|
||||
|
||||
const accountStore = useAccountStore()
|
||||
if (!accountStore.refreshToken) {
|
||||
sseBus.emit('error', { message: '登录已过期,请重新登录', retryCount: 0 })
|
||||
return
|
||||
}
|
||||
|
||||
isRefreshing = true
|
||||
try {
|
||||
const newToken = await accountStore.refreshAccessToken()
|
||||
if (newToken) {
|
||||
@@ -54,8 +54,6 @@ async function refreshTokenAndReconnect(): Promise<void> {
|
||||
}
|
||||
} catch {
|
||||
sseBus.emit('error', { message: '实时连接异常,请刷新页面', retryCount: 0 })
|
||||
} finally {
|
||||
isRefreshing = false
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user