fix: 接口调用自动刷新访问令牌制造的的灵车

* 是什么我忘了, 但是这就是灵车😇
This commit is contained in:
CrescentLeaf
2025-10-07 13:07:11 +08:00
parent 6e73662860
commit b36fe7a67e
2 changed files with 24 additions and 11 deletions

View File

@@ -28,8 +28,9 @@ export type CallMethod =
export type ClientEvent = export type ClientEvent =
"Client.onMessage" "Client.onMessage"
export const CallableMethodBeforeAuth = [ export const CallableMethodBeforeAuth = [
"User.auth", "User.auth",
"User.register", "User.register",
"User.login", "User.login",
"User.refreshAccessToken",
] ]

View File

@@ -25,12 +25,10 @@ class Client {
}, },
}) })
this.socket!.on("connect", async () => { this.socket!.on("connect", async () => {
const re = await this.invoke("User.auth", {
access_token: data.access_token
}, 1000)
if (re.code != 200)
checkApiSuccessOrSncakbar(re, "重連失敗")
this.connected = true this.connected = true
const re = await this.auth(data.access_token)
if (re.code != 200)
checkApiSuccessOrSncakbar(re, "重连失败")
}) })
this.socket!.on("disconnect", () => { this.socket!.on("disconnect", () => {
this.connected = false this.connected = false
@@ -44,27 +42,41 @@ class Client {
} }
}) })
} }
static invoke(method: CallMethod, args: unknown = {}, timeout: number = 5000): Promise<ApiCallbackMessage> { static invoke(method: CallMethod, args: unknown = {}, timeout: number = 5000, refreshAndRetryLimit: number = 3, forceRefreshAndRetry: boolean = false): Promise<ApiCallbackMessage> {
// 在 未初始化 / 未建立连接且调用非可调用接口 的时候进行延迟
console.log(this.connected, method)
if (this.socket == null || (!this.connected && !CallableMethodBeforeAuth.includes(method))) { if (this.socket == null || (!this.connected && !CallableMethodBeforeAuth.includes(method))) {
return new Promise((reslove) => { return new Promise((reslove) => {
setTimeout(async () => reslove(await this.invoke(method, args, timeout)), 500) setTimeout(async () => reslove(await this.invoke(method, args, timeout)), 500)
}) })
} }
// 反之, 返回 Promise
return new Promise((resolve) => { return new Promise((resolve) => {
this.socket!.timeout(timeout).emit("The_White_Silk", method, args, async (err: Error, res: ApiCallbackMessage) => { this.socket!.timeout(timeout).emit("The_White_Silk", method, args, async (err: Error, res: ApiCallbackMessage) => {
// 错误处理
if (err) return resolve({ if (err) return resolve({
code: -1, code: -1,
msg: err.message.indexOf("timed out") != -1 ? "請求超時" : err.message, msg: err.message.indexOf("timed out") != -1 ? "請求超時" : err.message,
}) })
if (!["User.refreshAccessToken", ...CallableMethodBeforeAuth].includes(method) && res.code == 401) { // 在特殊的方法之中, 不予进行: 令牌刷新并重试
// 附带 retry 次数限制
if (
(
forceRefreshAndRetry ||
(
!CallableMethodBeforeAuth.includes(method)
&& res.code == 401
)
) && refreshAndRetryLimit > 0
) {
const token = await this.refreshAccessToken() const token = await this.refreshAccessToken()
if (token) { if (token) {
data.access_token = token data.access_token = token
data.apply() data.apply()
resolve(await this.invoke(method, { resolve(await this.invoke(method, {
...args, ...args,
token [method == "User.auth" ? "access_token" : "token"]: token,
}, timeout)) }, timeout, refreshAndRetryLimit - 1))
} else } else
resolve(res) resolve(res)
} else } else
@@ -81,7 +93,7 @@ class Client {
static async auth(token: string, timeout: number = 5000) { static async auth(token: string, timeout: number = 5000) {
const re = await this.invoke("User.auth", { const re = await this.invoke("User.auth", {
access_token: token access_token: token
}, timeout) }, timeout, 1, true)
if (re.code == 200) { if (re.code == 200) {
await this.updateCachedProfile() await this.updateCachedProfile()
document.cookie = 'token=' + token document.cookie = 'token=' + token