UNPKG

dynamic-interaction

Version:

Dynamic interaction 动态交互mcp,用于cursor、windsurf、trae 等 AI 智能编辑器 Agent 运行时交互使用

76 lines (75 loc) 3.04 kB
"use strict"; /** * 消息路由器 * 改进的消息路由系统,支持中间件和更好的错误处理 */ 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();