Files
smart-go/web/lib/api/refresh-flight.ts
T
2026-04-23 18:58:13 +08:00

34 lines
857 B
TypeScript

import { refreshAccessToken } from '@/lib/api/auth';
let inFlight: Promise<boolean> | null = null;
/**
* 并发 401 时共享同一次 refresh,避免重复 POST /oauth/token。
* refresh 失败会清空 token(由调用方传入的 setTokens 执行)。
*/
export function refreshTokensShared(
getRefreshToken: () => string | null,
setTokens: (access: string | null, refresh: string | null) => void
): Promise<boolean> {
if (inFlight) {
return inFlight;
}
inFlight = (async () => {
try {
const rt = getRefreshToken();
if (!rt) {
return false;
}
const pair = await refreshAccessToken(rt);
setTokens(pair.accessToken, pair.refreshToken);
return true;
} catch {
setTokens(null, null);
return false;
} finally {
inFlight = null;
}
})();
return inFlight;
}