还是优化ws

This commit is contained in:
Jerry 2025-04-14 13:32:32 +08:00
parent 55627d586c
commit a996bed065
2 changed files with 35 additions and 20 deletions

View File

@ -1,43 +1,62 @@
import { AuthenticatedSocket } from '../../types/ws'; import { AuthenticatedSocket } from '../../types/ws';
import wsTools from '../../utils/ws/wsTools'; 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<void>;
class WSMessageHandler { class WSMessageHandler {
private handlers: Map<string, MessageHandler>;
constructor() {
this.handlers = new Map([
['test', this.handleTest],
['ping', this.handlePing],
]);
}
async handle(socket: AuthenticatedSocket, clientId: string, msg: any) { async handle(socket: AuthenticatedSocket, clientId: string, msg: any) {
try { try {
switch (msg.type) { const handler = this.handlers.get(msg.type);
case 'test':
await this.handleTest(socket); if (handler) {
break; await handler(socket, msg);
case 'ping': } else {
await wsTools.send(socket, { type: 'pong' }); await this.handleUnknown(socket, msg);
break;
default:
await this.handleUnknown(socket);
} }
} catch (err) { } catch (err) {
logger.error(`ws消息处理时出错 ${err}`);
await wsTools.send(socket, { await wsTools.send(socket, {
type: 'error', 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, { await wsTools.send(socket, {
type: 'test', type: 'test',
data: { status: 'ok' }, 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, { await wsTools.send(socket, {
type: 'error', 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(); const wsHandler = new WSMessageHandler();

View File

@ -70,11 +70,7 @@ class WSServer {
} }
private isAuthMessage(msg: WSMessage): msg is AuthMessage { private isAuthMessage(msg: WSMessage): msg is AuthMessage {
return ( return msg.type === 'auth';
msg.type === 'auth' &&
typeof (msg as AuthMessage).secret === 'string' &&
typeof (msg as AuthMessage).clientId === 'string'
);
} }
private async handleAuth(socket: AuthenticatedSocket, msg: AuthMessage, ip: string) { private async handleAuth(socket: AuthenticatedSocket, msg: AuthMessage, ip: string) {