diff --git a/src/services/ws/handler.ts b/src/services/ws/handler.ts index fadca4f..3240129 100644 --- a/src/services/ws/handler.ts +++ b/src/services/ws/handler.ts @@ -1,43 +1,62 @@ import { AuthenticatedSocket } from '../../types/ws'; import wsTools from '../../utils/ws/wsTools'; -import * as ws from 'ws'; +import { WebSocket } from 'ws'; +import logger from '../../utils/core/logger'; -type WebSocket = ws.WebSocket; +type MessageHandler = (socket: WebSocket, msg: any) => Promise; class WSMessageHandler { + private handlers: Map; + + constructor() { + this.handlers = new Map([ + ['test', this.handleTest], + ['ping', this.handlePing], + ]); + } + async handle(socket: AuthenticatedSocket, clientId: string, msg: any) { try { - switch (msg.type) { - case 'test': - await this.handleTest(socket); - break; - case 'ping': - await wsTools.send(socket, { type: 'pong' }); - break; - default: - await this.handleUnknown(socket); + const handler = this.handlers.get(msg.type); + + if (handler) { + await handler(socket, msg); + } else { + await this.handleUnknown(socket, msg); } } catch (err) { + logger.error(`ws消息处理时出错: ${err}`); await wsTools.send(socket, { type: 'error', - message: 'Processing failed', + message: 'error message', }); } } - private async handleTest(socket: WebSocket) { + private async handleTest(socket: WebSocket, msg: any) { + //logger.info(`消息测试[test]`); await wsTools.send(socket, { type: 'test', data: { status: 'ok' }, }); } - private async handleUnknown(socket: WebSocket) { + private async handlePing(socket: WebSocket, msg: any) { + //logger.info(`ping`); + await wsTools.send(socket, { type: 'pong' }); + } + + private async handleUnknown(socket: WebSocket, msg: any) { + logger.warn(`收到未知消息类型: ${msg.type}`); await wsTools.send(socket, { type: 'error', - message: 'Unknown message type', + message: `未知消息类型: ${msg.type}`, }); } + + public registerHandler(type: string, handler: MessageHandler): void { + this.handlers.set(type, handler); + } } const wsHandler = new WSMessageHandler(); diff --git a/src/services/ws/wsServer.ts b/src/services/ws/wsServer.ts index 14c7d03..09dc131 100644 --- a/src/services/ws/wsServer.ts +++ b/src/services/ws/wsServer.ts @@ -70,11 +70,7 @@ class WSServer { } private isAuthMessage(msg: WSMessage): msg is AuthMessage { - return ( - msg.type === 'auth' && - typeof (msg as AuthMessage).secret === 'string' && - typeof (msg as AuthMessage).clientId === 'string' - ); + return msg.type === 'auth'; } private async handleAuth(socket: AuthenticatedSocket, msg: AuthMessage, ip: string) {