mirror of
https://github.com/crystelf/crystelf-core.git
synced 2025-07-04 14:49:19 +00:00
还是优化ws
This commit is contained in:
parent
55627d586c
commit
a996bed065
@ -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();
|
||||||
|
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user