UNPKG

dynamic-interaction

Version:

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

120 lines (119 loc) 4.35 kB
"use strict"; /** * 会话队列管理 * 重构并简化原有的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();