From b0c67da34096dd7e03830e5ccf1631be046b0dda Mon Sep 17 00:00:00 2001 From: CrescentLeaf Date: Sat, 6 Sep 2025 01:53:09 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=B2=E4=B8=80=E6=AD=A5=E5=AE=8C=E5=96=84?= =?UTF-8?q?=20Server=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/{types => api}/ApiCallbackMessage.ts | 1 + server/api/ApiDeclare.ts | 7 +++++++ server/api/ApiManager.ts | 23 +++++++++++++-------- server/api/BaseApi.ts | 8 ++++--- server/api/UserApi.ts | 4 ++-- server/types/EventCallbackFunction.ts | 2 +- 6 files changed, 30 insertions(+), 15 deletions(-) rename server/{types => api}/ApiCallbackMessage.ts (91%) create mode 100644 server/api/ApiDeclare.ts diff --git a/server/types/ApiCallbackMessage.ts b/server/api/ApiCallbackMessage.ts similarity index 91% rename from server/types/ApiCallbackMessage.ts rename to server/api/ApiCallbackMessage.ts index 185651b..e94b2df 100644 --- a/server/types/ApiCallbackMessage.ts +++ b/server/api/ApiCallbackMessage.ts @@ -10,5 +10,6 @@ type ApiCallbackMessage = { * 501: 伺服器端不支持請求的功能 */ code: 200 | 400 | 401 | 403 | 404 | 500 | 501, + data?: { [key: string]: unknown }, } export default ApiCallbackMessage diff --git a/server/api/ApiDeclare.ts b/server/api/ApiDeclare.ts new file mode 100644 index 0000000..fc84148 --- /dev/null +++ b/server/api/ApiDeclare.ts @@ -0,0 +1,7 @@ +export type CallMethod = + "User.auth" | + "User.register" | + "User.login" + +export type ClientEvent = + "Client.onMessage" diff --git a/server/api/ApiManager.ts b/server/api/ApiManager.ts index 82a31f0..c15d4c6 100644 --- a/server/api/ApiManager.ts +++ b/server/api/ApiManager.ts @@ -1,14 +1,15 @@ import HttpServerLike from '../types/HttpServerLike.ts' import UserApi from "./UserApi.ts" import * as SocketIo from "socket.io" -import ApiCallbackMessage from "../types/ApiCallbackMessage.ts" +import ApiCallbackMessage from "./ApiCallbackMessage.ts" import EventCallbackFunction from "../types/EventCallbackFunction.ts" +import BaseApi from "./BaseApi.ts" export default class ApiManager { static httpServer: HttpServerLike static socketIoServer: SocketIo.Server - static event_listeners: { [key: string] : EventCallbackFunction } = {} - static apis_instance: {} + static event_listeners: { [key: string]: EventCallbackFunction } = {} + static apis_instance: { [key: string]: BaseApi } = {} static initServer(httpServer: HttpServerLike, socketIoServer: SocketIo.Server) { this.httpServer = httpServer this.socketIoServer = socketIoServer @@ -30,13 +31,17 @@ export default class ApiManager { static initEvents() { const io = this.socketIoServer io.on('connection', (socket) => { - socket.on("The_White_Silk", (name: string, args: {}, callback: (ret: ApiCallbackMessage) => void) => { - if (name == null || args == null) return callback({ - msg: "Invalid request.", - code: 400 - }) + socket.on("The_White_Silk", (name: string, args: { [key: string]: unknown }, callback: (ret: ApiCallbackMessage) => void) => { + try { + if (name == null || args == null) return callback({ + msg: "Invalid request.", + code: 400 + }) - return callback(this.event_listeners[name]?.(args)) + return callback(this.event_listeners[name]?.(args)) + } catch (e) { + console.error(e) + } }) }) } diff --git a/server/api/BaseApi.ts b/server/api/BaseApi.ts index ea12464..51672fb 100644 --- a/server/api/BaseApi.ts +++ b/server/api/BaseApi.ts @@ -1,5 +1,6 @@ import EventCallbackFunction from "../types/EventCallbackFunction.ts" -import ApiManager from "./ApiManager.ts"; +import ApiManager from "./ApiManager.ts" +import { CallMethod } from './ApiDeclare.ts' export default abstract class BaseApi { abstract getName(): string @@ -7,7 +8,8 @@ export default abstract class BaseApi { this.onInit() } abstract onInit(): void - registerEvent(name: string, func: EventCallbackFunction) { - ApiManager.addEventListener(this.getName() + "." + name, func) + registerEvent(name: CallMethod, func: EventCallbackFunction) { + if (!name.startsWith(this.getName() + ".")) throw Error("注冊的事件應該與接口集合命名空間相匹配: " + name) + ApiManager.addEventListener(name, func) } } diff --git a/server/api/UserApi.ts b/server/api/UserApi.ts index 187e437..3cdd70b 100644 --- a/server/api/UserApi.ts +++ b/server/api/UserApi.ts @@ -1,11 +1,11 @@ -import BaseApi from "./BaseApi.ts"; +import BaseApi from "./BaseApi.ts" export default class UserApi extends BaseApi { override getName(): string { return "User" } override onInit(): void { - this.registerEvent("", () => { + this.registerEvent("User.auth", () => { return { msg: "", code: 200, diff --git a/server/types/EventCallbackFunction.ts b/server/types/EventCallbackFunction.ts index 237920b..59b857c 100644 --- a/server/types/EventCallbackFunction.ts +++ b/server/types/EventCallbackFunction.ts @@ -1,4 +1,4 @@ -import ApiCallbackMessage from "./ApiCallbackMessage.ts" +import ApiCallbackMessage from "../api/ApiCallbackMessage.ts" type EventCallbackFunction = (args: {}) => ApiCallbackMessage