( netDiskType: NetDiskType, token: Token, invalid: boolean | undefined, key: string, localStorageDAO: LocalStorageDAO )
| 77 | const authTokenPromises: Partial<Record<NetDiskType, Promise<Token>>> = {}; |
| 78 | |
| 79 | function refreshAccessToken( |
| 80 | netDiskType: NetDiskType, |
| 81 | token: Token, |
| 82 | invalid: boolean | undefined, |
| 83 | key: string, |
| 84 | localStorageDAO: LocalStorageDAO |
| 85 | ) { |
| 86 | if (refreshTokenPromises[netDiskType]) { |
| 87 | return refreshTokenPromises[netDiskType]; |
| 88 | } |
| 89 | |
| 90 | const refreshPromiseFn = async () => { |
| 91 | const resp = await RefreshToken(netDiskType, token.refreshToken); |
| 92 | if (resp.code !== 0) { |
| 93 | await localStorageDAO.delete(key); |
| 94 | // 刷新失败,并且标记失效,尝试重新获取token |
| 95 | if (invalid) { |
| 96 | return await AuthVerify(netDiskType); |
| 97 | } |
| 98 | throw new WarpTokenError(new Error(resp.msg)); |
| 99 | } |
| 100 | const newToken = { |
| 101 | accessToken: resp.data.token.access_token, |
| 102 | refreshToken: resp.data.token.refresh_token, |
| 103 | createtime: Date.now(), |
| 104 | }; |
| 105 | // 更新token |
| 106 | await localStorageDAO.saveValue(key, newToken); |
| 107 | return newToken.accessToken; |
| 108 | }; |
| 109 | const refreshPromise: Promise<string> = refreshPromiseFn().finally(() => { |
| 110 | if (refreshTokenPromises[netDiskType] === refreshPromise) { |
| 111 | delete refreshTokenPromises[netDiskType]; |
| 112 | } |
| 113 | }); |
| 114 | |
| 115 | refreshTokenPromises[netDiskType] = refreshPromise; |
| 116 | return refreshPromise; |
| 117 | } |
| 118 | |
| 119 | export async function AuthVerify(netDiskType: NetDiskType, invalid?: boolean) { |
| 120 | let token: Token | undefined = undefined; |
no test coverage detected