dynamic-interaction
Version:
Dynamic interaction 动态交互mcp,用于cursor、windsurf、trae 等 AI 智能编辑器 Agent 运行时交互使用
76 lines (75 loc) • 3.04 kB
JavaScript
;
/**
* 消息路由器
* 改进的消息路由系统,支持中间件和更好的错误处理
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.messageRouter = exports.MessageRouter = void 0;
const logger_1 = require("../../logger");
const manager_1 = require("../session/manager");
const transport_1 = require("../websocket/transport");
const middleware_1 = require("../websocket/middleware");
const errors_1 = require("../utils/errors");
class MessageRouter {
static instance;
handlers = new Map();
constructor() { }
static getInstance() {
if (!MessageRouter.instance) {
MessageRouter.instance = new MessageRouter();
}
return MessageRouter.instance;
}
register(type, handler) {
if (this.handlers.has(type)) {
logger_1.logger.warn(`消息类型 "${type}" 的处理器已被覆盖`);
}
this.handlers.set(type, handler);
logger_1.logger.info(`已注册消息类型 "${type}" 的处理器`);
}
async route(ws, message) {
try {
// 执行中间件
await middleware_1.middlewareManager.execute(ws, message);
const handler = this.handlers.get(message.type);
if (!handler) {
logger_1.logger.warn(`未找到消息类型 "${message.type}" 的处理器`);
transport_1.transport.sendError(ws, `未处理的消息类型: ${message.type}`, errors_1.ErrorCodes.UNHANDLED_MESSAGE_TYPE);
return;
}
const session = manager_1.sessionManager.getSessionByWs(ws) || null;
// 对于某些消息类型,无会话也可以处理
if (!session && !this.isSessionlessMessage(message.type)) {
logger_1.logger.warn(`收到来自无会话连接的消息,类型: ${message.type}`);
transport_1.transport.sendError(ws, '未建立会话连接', errors_1.ErrorCodes.SESSION_NOT_FOUND);
return;
}
// 执行处理器
await Promise.resolve(handler(session, message.data, ws));
}
catch (error) {
logger_1.logger.error(`处理消息时出错,类型: ${message.type}:`, error);
if (error instanceof errors_1.ValidationError) {
transport_1.transport.sendError(ws, error.message, error.code);
}
else {
transport_1.transport.sendError(ws, '处理消息时发生内部错误', 'INTERNAL_ERROR');
}
}
}
isSessionlessMessage(type) {
const sessionlessTypes = ['ping', 'client_ready'];
return sessionlessTypes.includes(type);
}
unregister(type) {
return this.handlers.delete(type);
}
getRegisteredTypes() {
return Array.from(this.handlers.keys());
}
hasHandler(type) {
return this.handlers.has(type);
}
}
exports.MessageRouter = MessageRouter;
exports.messageRouter = MessageRouter.getInstance();