34 lines
857 B
TypeScript
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;
|
|
}
|