(netDiskType: NetDiskType, invalid?: boolean)
| 117 | } |
| 118 | |
| 119 | export async function AuthVerify(netDiskType: NetDiskType, invalid?: boolean) { |
| 120 | let token: Token | undefined = undefined; |
| 121 | const localStorageDAO = new LocalStorageDAO(); |
| 122 | const key = `netdisk:token:${netDiskType}`; |
| 123 | try { |
| 124 | token = await localStorageDAO.getValue<Token>(key); |
| 125 | } catch (_) { |
| 126 | // ignore |
| 127 | } |
| 128 | // token不存在,或者没有accessToken,重新获取 |
| 129 | if (!token || !token.accessToken) { |
| 130 | if (!authTokenPromises[netDiskType]) { |
| 131 | const authPromise = (async () => { |
| 132 | // 强制重新获取token |
| 133 | await NetDisk(netDiskType); |
| 134 | const resp = await GetNetDiskToken(netDiskType); |
| 135 | if (resp.code !== 0) { |
| 136 | throw new WarpTokenError(new Error(resp.msg)); |
| 137 | } |
| 138 | const newToken = { |
| 139 | accessToken: resp.data.token.access_token, |
| 140 | refreshToken: resp.data.token.refresh_token, |
| 141 | createtime: Date.now(), |
| 142 | }; |
| 143 | await localStorageDAO.saveValue(key, newToken); |
| 144 | return newToken; |
| 145 | })().finally(() => { |
| 146 | if (authTokenPromises[netDiskType] === authPromise) { |
| 147 | delete authTokenPromises[netDiskType]; |
| 148 | } |
| 149 | }); |
| 150 | authTokenPromises[netDiskType] = authPromise; |
| 151 | } |
| 152 | token = await authTokenPromises[netDiskType]; |
| 153 | invalid = false; |
| 154 | } |
| 155 | // token未过期(一小时内)及有效则保留,不用刷新token |
| 156 | const unexpired = Date.now() < token.createtime + 3600000; |
| 157 | if (unexpired && !invalid) return token.accessToken; |
| 158 | try { |
| 159 | return await refreshAccessToken(netDiskType, token, invalid, key, localStorageDAO); |
| 160 | } catch (e) { |
| 161 | // 已过期或已被服务端判定失效的 token 不能继续回退使用 |
| 162 | console.warn(e); |
| 163 | throw e; |
| 164 | } |
| 165 | } |
| 166 | |
| 167 | export const netDiskTypeMap: Partial<Record<FileSystemType, NetDiskType>> = { |
| 168 | "baidu-netdsik": "baidu", |
no test coverage detected