| | |
| | | formatToken, |
| | | }: { |
| | | client: RequestClient; |
| | | doReAuthenticate: () => Promise<void>; |
| | | doReAuthenticate: (error?: any) => Promise<void>; |
| | | doRefreshToken: () => Promise<string>; |
| | | enableRefreshToken: boolean; |
| | | formatToken: (token: string) => null | string; |
| | |
| | | // 判断是否启用了 refreshToken 功能 |
| | | // 如果没有启用或者已经是重试请求了,直接跳转到重新登录 |
| | | if (!enableRefreshToken || config.__isRetryRequest) { |
| | | await doReAuthenticate(); |
| | | await doReAuthenticate(error); |
| | | throw error; |
| | | } |
| | | // 如果正在刷新 token,则将请求加入队列,等待刷新完成 |
| | | if (client.isRefreshing) { |
| | | return new Promise((resolve) => { |
| | | client.refreshTokenQueue.push((newToken: string) => { |
| | | return new Promise((resolve, reject) => { |
| | | client.refreshTokenQueue.push((newToken: string, refreshError?: unknown) => { |
| | | if (refreshError) { reject(refreshError); return; } |
| | | config.headers.Authorization = formatToken(newToken); |
| | | resolve(client.request(config.url, { ...config })); |
| | | }); |
| | |
| | | return client.request(error.config.url, { ...error.config }); |
| | | } catch (refreshError) { |
| | | // 如果刷新 token 失败,处理错误(如强制登出或跳转登录页面) |
| | | client.refreshTokenQueue.forEach((callback) => callback('')); |
| | | client.refreshTokenQueue.forEach((callback) => callback('', refreshError)); |
| | | client.refreshTokenQueue = []; |
| | | console.error('Refresh token failed, please login again.'); |
| | | await doReAuthenticate(); |
| | | await doReAuthenticate(error); |
| | | |
| | | throw refreshError; |
| | | } finally { |