route-claudecode
Version:
Advanced routing and transformation system for Claude Code outputs to multiple AI providers
98 lines • 3.39 kB
JavaScript
;
/**
* 请求跟踪器 - 专门处理请求生命周期跟踪
* 整合原有的RequestBasedLogger功能
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.RequestTracker = void 0;
class RequestTracker {
logger;
activeSessions = new Map();
constructor(logger) {
this.logger = logger;
}
startRequest(requestId, port, provider, model, data) {
const session = {
requestId,
startTime: Date.now(),
stages: [],
provider,
model,
port
};
this.activeSessions.set(requestId, session);
this.logger.logRequest(requestId, 'START', 'Request started', {
provider,
model,
port,
...data
});
}
logStage(requestId, stage, data, duration) {
const session = this.activeSessions.get(requestId);
if (!session) {
this.logger.warn(`Request ${requestId} not found for stage logging`, { stage });
return;
}
const stageEntry = {
stage,
timestamp: Date.now(),
duration,
data
};
session.stages.push(stageEntry);
this.logger.logPipeline(stage, `Stage: ${stage}`, data, requestId);
}
logToolCall(requestId, toolName, data, error) {
const message = error ? `Tool call failed: ${toolName}` : `Tool call: ${toolName}`;
this.logger.logToolCall(message, { toolName, error, ...data }, requestId, 'tool_call');
}
logStreaming(requestId, chunkIndex, data) {
// 只在debug级别记录chunk信息,避免INFO级别刷屏
this.logger.debug(`Chunk ${chunkIndex}`, data, requestId, 'streaming');
}
completeRequest(requestId, status, data) {
const session = this.activeSessions.get(requestId);
if (!session) {
this.logger.warn(`Request ${requestId} not found for completion`);
return;
}
const endTime = Date.now();
const totalDuration = endTime - session.startTime;
session.endTime = endTime;
this.logger.logResponse(requestId, status || 200, {
totalDuration,
stagesCount: session.stages.length,
provider: session.provider,
model: session.model,
...data
}, totalDuration);
this.logger.logPerformance('request_complete', totalDuration, {
requestId,
stagesCount: session.stages.length,
provider: session.provider,
model: session.model
}, requestId);
this.activeSessions.delete(requestId);
}
getActiveRequests() {
return Array.from(this.activeSessions.keys());
}
getRequestSession(requestId) {
return this.activeSessions.get(requestId);
}
cleanupOldSessions(maxAgeMs = 300000) {
const now = Date.now();
let cleaned = 0;
for (const [requestId, session] of this.activeSessions) {
if (now - session.startTime > maxAgeMs) {
this.logger.warn(`Cleaning up old request session: ${requestId}`);
this.activeSessions.delete(requestId);
cleaned++;
}
}
return cleaned;
}
}
exports.RequestTracker = RequestTracker;
//# sourceMappingURL=request-tracker.js.map