dynamic-interaction
Version:
Dynamic interaction 动态交互mcp,用于cursor、windsurf、trae 等 AI 智能编辑器 Agent 运行时交互使用
104 lines (103 loc) • 3.32 kB
JavaScript
;
/**
* WebSocket 传输层
* 提供WebSocket消息的发送和接收工具
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.transport = exports.WebSocketTransport = void 0;
const ws_1 = require("ws");
const logger_1 = require("../../logger");
const errors_1 = require("../utils/errors");
class WebSocketTransport {
static send(ws, message) {
if (ws.readyState !== ws_1.WebSocket.OPEN) {
logger_1.logger.warn('尝试向已关闭的WebSocket连接发送消息');
return false;
}
try {
const messageString = typeof message === 'string'
? message
: JSON.stringify(message);
ws.send(messageString);
return true;
}
catch (error) {
logger_1.logger.error('发送WebSocket消息失败:', error);
throw new errors_1.WebSocketError('消息发送失败', errors_1.ErrorCodes.CONNECTION_ERROR);
}
}
static sendError(ws, message, code, sessionId) {
const errorMessage = {
type: 'error',
data: {
message,
code,
sessionId,
timestamp: Date.now()
}
};
return this.send(ws, errorMessage);
}
static sendNotification(ws, notificationId, summary, projectDirectory) {
const notification = {
type: 'notification',
data: {
notificationId,
summary,
projectDirectory,
mode: 'NOTIFICATION',
createdAt: Date.now()
}
};
return this.send(ws, notification);
}
static sendSessionRequest(ws, sessionId, summary, projectDirectory, startTime, timeout) {
const sessionRequest = {
type: 'session_request',
data: {
sessionId,
summary,
projectDirectory,
mode: 'INTERACTIVE',
startTime,
timeoutSeconds: timeout
}
};
return this.send(ws, sessionRequest);
}
static sendSystemInfo(ws, sessionId, workspaceDirectory, sessionStartTime, leaseTimeoutSeconds, mode) {
const systemInfo = {
type: 'system_info',
data: {
sessionId: sessionId || '无',
workspaceDirectory: workspaceDirectory || '未知',
sessionStartTime,
leaseTimeoutSeconds: leaseTimeoutSeconds || 0,
mode,
serverVersion: process.env.npm_package_version || '1.0.0',
timestamp: Date.now()
}
};
return this.send(ws, systemInfo);
}
static sendPong(ws) {
const pong = {
type: 'pong',
data: {
timestamp: Date.now()
}
};
return this.send(ws, pong);
}
static broadcast(connections, message) {
let successCount = 0;
for (const ws of connections) {
if (this.send(ws, message)) {
successCount++;
}
}
return successCount;
}
}
exports.WebSocketTransport = WebSocketTransport;
exports.transport = WebSocketTransport;