UNPKG

dynamic-interaction

Version:

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

68 lines (67 loc) 2.33 kB
"use strict"; /** * WebSocket 中间件 * 提供WebSocket连接的验证和预处理功能 */ Object.defineProperty(exports, "__esModule", { value: true }); exports.middlewareManager = exports.rateLimiter = exports.logMessage = exports.validateMessage = void 0; const logger_1 = require("../../logger"); const errors_1 = require("../utils/errors"); const websocket_1 = require("../../types/websocket"); class MiddlewareManager { middlewares = []; use(middleware) { this.middlewares.push(middleware); } async execute(ws, message) { let index = 0; const next = (error) => { if (error) { throw error; } if (index >= this.middlewares.length) { return; } const middleware = this.middlewares[index++]; middleware(ws, message, next); }; next(); } } // 内置中间件 const validateMessage = (ws, message, next) => { if (!(0, websocket_1.isValidMessage)(message)) { logger_1.logger.warn('收到无效的WebSocket消息格式'); const error = new errors_1.ValidationError('无效的消息格式'); return next(error); } next(); }; exports.validateMessage = validateMessage; const logMessage = (ws, message, next) => { logger_1.logger.debug(`处理WebSocket消息: ${message.type}`); next(); }; exports.logMessage = logMessage; const rateLimiter = (maxPerMinute = 60) => { const connectionRequests = new Map(); return (ws, message, next) => { const now = Date.now(); const requests = connectionRequests.get(ws) || []; // 清理1分钟前的请求记录 const recent = requests.filter(time => now - time < 60000); if (recent.length >= maxPerMinute) { logger_1.logger.warn('WebSocket连接超过速率限制'); return next(new errors_1.ValidationError('请求频率过高')); } recent.push(now); connectionRequests.set(ws, recent); next(); }; }; exports.rateLimiter = rateLimiter; exports.middlewareManager = new MiddlewareManager(); // 注册默认中间件 exports.middlewareManager.use(exports.validateMessage); exports.middlewareManager.use(exports.logMessage); exports.middlewareManager.use((0, exports.rateLimiter)(60));