dynamic-interaction
Version:
Dynamic interaction 动态交互mcp,用于cursor、windsurf、trae 等 AI 智能编辑器 Agent 运行时交互使用
68 lines (67 loc) • 2.33 kB
JavaScript
;
/**
* 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));