dynamic-interaction
Version:
Dynamic interaction 动态交互mcp,用于cursor、windsurf、trae 等 AI 智能编辑器 Agent 运行时交互使用
120 lines (119 loc) • 4.35 kB
JavaScript
;
/**
* 会话队列管理
* 重构并简化原有的sessionQueue.ts
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.sessionQueue = exports.SessionQueue = void 0;
const logger_1 = require("../../logger");
const errors_1 = require("../utils/errors");
class SessionQueue {
static instance;
pendingRequests = new Map();
waitingQueue = [];
constructor() { }
static getInstance() {
if (!SessionQueue.instance) {
SessionQueue.instance = new SessionQueue();
}
return SessionQueue.instance;
}
enqueue(request) {
this.pendingRequests.set(request.id, request);
this.waitingQueue.push(request);
logger_1.logger.info(`会话请求已入队,ID: ${request.id},模式: ${request.mode},队列长度: ${this.waitingQueue.length}`);
}
dequeue() {
const request = this.waitingQueue.shift();
if (request) {
logger_1.logger.info(`会话请求已出队,ID: ${request.id}`);
}
return request || null;
}
leaseNext() {
const request = this.dequeue();
if (request) {
logger_1.logger.info(`租用会话请求,ID: ${request.id}`);
}
return request;
}
acknowledge(requestId) {
const request = this.pendingRequests.get(requestId);
if (!request) {
logger_1.logger.warn(`尝试确认不存在的会话请求,ID: ${requestId}`);
return false;
}
this.pendingRequests.delete(requestId);
logger_1.logger.info(`会话请求已确认完成,ID: ${requestId}`);
return true;
}
requeue(requestId, error) {
const request = this.pendingRequests.get(requestId);
if (!request) {
logger_1.logger.warn(`尝试重新入队不存在的会话请求,ID: ${requestId}`);
return;
}
// 增加重试计数
request.retryCount = (request.retryCount || 0) + 1;
// 如果重试次数过多,拒绝请求
if (request.retryCount > 3) {
logger_1.logger.error(`会话请求重试次数过多,放弃处理,ID: ${requestId}`);
request.reject(new errors_1.SessionError('会话请求处理失败,重试次数过多', errors_1.ErrorCodes.SESSION_CREATION_ERROR));
this.pendingRequests.delete(requestId);
return;
}
// 重新入队
this.waitingQueue.unshift(request);
logger_1.logger.info(`会话请求已重新入队,ID: ${requestId},重试次数: ${request.retryCount}`);
}
remove(requestId) {
const request = this.pendingRequests.get(requestId);
if (!request) {
return false;
}
// 从等待队列中移除
const index = this.waitingQueue.findIndex(req => req.id === requestId);
if (index !== -1) {
this.waitingQueue.splice(index, 1);
}
// 从pending映射中移除
this.pendingRequests.delete(requestId);
logger_1.logger.info(`会话请求已从队列中移除,ID: ${requestId}`);
return true;
}
getRequest(requestId) {
return this.pendingRequests.get(requestId);
}
getQueueSize() {
return this.waitingQueue.length;
}
getPendingCount() {
return this.pendingRequests.size;
}
isWaitingQueueEmpty() {
return this.waitingQueue.length === 0;
}
getQueueStats() {
const modeStats = new Map();
for (const request of this.waitingQueue) {
const count = modeStats.get(request.mode) || 0;
modeStats.set(request.mode, count + 1);
}
return {
total: this.waitingQueue.length,
pending: this.pendingRequests.size,
byMode: Object.fromEntries(modeStats)
};
}
clear() {
// 拒绝所有待处理的请求
for (const request of this.pendingRequests.values()) {
request.reject(new errors_1.SessionError('服务器正在关闭', errors_1.ErrorCodes.SERVER_STOP_ERROR));
}
this.pendingRequests.clear();
this.waitingQueue.length = 0;
logger_1.logger.info('会话队列已清空');
}
}
exports.SessionQueue = SessionQueue;
exports.sessionQueue = SessionQueue.getInstance();