From 38db2e1310a7595ac59d3241735ded621ad3d86e Mon Sep 17 00:00:00 2001 From: CrescentLeaf Date: Wed, 24 Sep 2025 22:03:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=A4=9A=E5=80=8B=E5=90=8C=20DeviceId?= =?UTF-8?q?=20=E4=B8=8D=E5=90=8C=20Session=20=E7=9A=84=E5=AE=A2=E6=88=B6?= =?UTF-8?q?=E7=AB=AF=E7=84=A1=E6=B3=95=E5=90=8C=E6=99=82=E6=94=B6=E5=88=B0?= =?UTF-8?q?=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/api/Client.ts | 4 +++- server/api/ApiManager.ts | 7 ++++++- server/api/ChatApi.ts | 5 ++--- server/api/UserApi.ts | 6 +++--- server/typedef/EventCallbackFunction.ts | 1 + 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/client/api/Client.ts b/client/api/Client.ts index 76260f1..27004ab 100644 --- a/client/api/Client.ts +++ b/client/api/Client.ts @@ -9,6 +9,7 @@ import randomUUID from "../randomUUID.ts" type UnknownObject = { [key: string]: unknown } class Client { + static sessionId = randomUUID() static myUserProfile?: User static socket?: Socket static events: { [key: string]: (data: UnknownObject) => UnknownObject | void } = {} @@ -21,7 +22,8 @@ class Client { this.socket = io({ transports: ['websocket'], auth: { - device_id: data.device_id + device_id: data.device_id, + session_id: this.sessionId, }, }) this.socket!.on("connect", async () => { diff --git a/server/api/ApiManager.ts b/server/api/ApiManager.ts index c289dea..ec6f1aa 100644 --- a/server/api/ApiManager.ts +++ b/server/api/ApiManager.ts @@ -48,6 +48,9 @@ export default class ApiManager { static checkUserIsOnline(userId: string) { return this.getUserClientSockets(userId) != null } + /** + * 獲取用戶所有的客戶端表 (格式遵循 設備ID_當前Session) + */ static getUserClientSockets(userId: string) { return this.clients[userId] } @@ -60,10 +63,12 @@ export default class ApiManager { const ip = socket.conn.remoteAddress const deviceId = socket.handshake.auth.device_id as string + const sessionId = socket.handshake.auth.session_id as string const clientInfo = { userId: '', deviceId, + sessionId, ip, socket, } @@ -73,7 +78,7 @@ export default class ApiManager { console.log(chalk.yellow('[斷]') + ` ${ip} disconnected`) else { console.log(chalk.green('[斷]') + ` ${ip} disconnected`) - delete this.clients[clientInfo.userId][deviceId] + delete this.clients[clientInfo.userId][deviceId + '_' + sessionId] } }) console.log(chalk.yellow('[連]') + ` ${ip} connected`) diff --git a/server/api/ChatApi.ts b/server/api/ChatApi.ts index 7d00c55..83aa1a9 100644 --- a/server/api/ChatApi.ts +++ b/server/api/ChatApi.ts @@ -1,6 +1,5 @@ -import { Buffer } from "node:buffer"; -import Chat from "../data/Chat.ts"; -import ChatPrivate from "../data/ChatPrivate.ts" +import { Buffer } from "node:buffer" +import Chat from "../data/Chat.ts" import FileManager from "../data/FileManager.ts" import MessagesManager from "../data/MessagesManager.ts" import User from "../data/User.ts" diff --git a/server/api/UserApi.ts b/server/api/UserApi.ts index b8f3c0b..b3b344e 100644 --- a/server/api/UserApi.ts +++ b/server/api/UserApi.ts @@ -18,7 +18,7 @@ export default class UserApi extends BaseApi { msg: "參數缺失", code: 400, } - const { deviceId, ip, socket } = clientInfo + const { deviceId, ip, socket, sessionId } = clientInfo try { const access_token = TokenManager.decode(args.access_token as string) @@ -38,9 +38,9 @@ export default class UserApi extends BaseApi { clientInfo.userId = access_token.author console.log(chalk.green('[驗]') + ` ${access_token.author} authed on Client ${deviceId} (ip = ${ip})`) if (ApiManager.clients[clientInfo.userId] == null) ApiManager.clients[clientInfo.userId] = { - [deviceId]: socket + [deviceId + '_' + sessionId]: socket } - else ApiManager.clients[clientInfo.userId][deviceId] = socket + else ApiManager.clients[clientInfo.userId][deviceId + '_' + sessionId] = socket return { msg: "成功", diff --git a/server/typedef/EventCallbackFunction.ts b/server/typedef/EventCallbackFunction.ts index f651594..e85bd49 100644 --- a/server/typedef/EventCallbackFunction.ts +++ b/server/typedef/EventCallbackFunction.ts @@ -4,6 +4,7 @@ import * as SocketIo from "socket.io" type EventCallbackFunction = (args: { [key: string]: unknown }, clientInfo: { userId: string deviceId: string + sessionId: string ip: string socket: SocketIo.Socket }) => ApiCallbackMessage | Promise