还是优化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 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 {
private handlers: Map<string, MessageHandler>;
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();

View File

@ -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) {