UNPKG

dengun_ai-admin-client

Version:

Cliente simples para integração com o AI Admin Dashboard - Plug and Play

171 lines (170 loc) 5.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TelemetryReporter = void 0; const events_1 = require("events"); /** * Objetivo 3: Reportar dados sobre o consumo do bot pelo usuário */ class TelemetryReporter extends events_1.EventEmitter { constructor(config) { super(); this.connectionManager = null; this.usageQueue = []; this.reportInterval = null; this.isActive = false; this.stats = { totalUsage: 0, totalTokens: 0, sessionCount: 0, lastReport: 0 }; this.config = config; } /** * Iniciar serviço de telemetria */ async start(connectionManager) { if (connectionManager) { this.connectionManager = connectionManager; } this.isActive = true; this.startReportInterval(); this.emit('started'); } /** * Definir o gerenciador de conexão */ setConnectionManager(connectionManager) { this.connectionManager = connectionManager; } /** * Parar serviço de telemetria */ async stop() { this.isActive = false; this.stopReportInterval(); // Enviar dados restantes na fila if (this.usageQueue.length > 0) { await this.flushQueue(); } this.emit('stopped'); } /** * Reportar uso do bot */ async reportUsage(usage) { if (!this.isActive) return; // Adicionar à fila this.usageQueue.push(usage); // Atualizar estatísticas locais this.updateStats(usage); // Se a fila estiver cheia, enviar imediatamente if (this.usageQueue.length >= 10) { await this.flushQueue(); } this.emit('usageAdded', usage); } /** * Obter estatísticas de uso */ async getStats(timeRange) { var _a; const localStats = { ...this.stats }; // Se conectado, buscar stats do servidor também if ((_a = this.connectionManager) === null || _a === void 0 ? void 0 : _a.isConnectionActive()) { try { const serverStats = await this.connectionManager.sendData('/api/bots/usage-stats', { botId: this.config.botId, timeRange }); if (serverStats.success) { return { local: localStats, server: serverStats.data, combined: this.combineStats(localStats, serverStats.data) }; } } catch (error) { this.emit('error', error); } } return { local: localStats }; } /** * Obter fila de uso pendente */ getPendingUsage() { return [...this.usageQueue]; } /** * Forçar envio dos dados na fila */ async forceFlush() { await this.flushQueue(); } // Métodos privados startReportInterval() { var _a; this.stopReportInterval(); const interval = ((_a = this.config.options) === null || _a === void 0 ? void 0 : _a.reportInterval) || 30000; this.reportInterval = setInterval(async () => { await this.flushQueue(); }, interval); } stopReportInterval() { if (this.reportInterval) { clearInterval(this.reportInterval); this.reportInterval = null; } } async flushQueue() { var _a; if (this.usageQueue.length === 0) return; if (!((_a = this.connectionManager) === null || _a === void 0 ? void 0 : _a.isConnectionActive())) { this.emit('warning', 'Não conectado ao dashboard - dados mantidos na fila'); return; } const dataToSend = [...this.usageQueue]; this.usageQueue = []; try { const response = await this.connectionManager.sendData('/api/bots/usage', { botId: this.config.botId, usage: dataToSend }); if (response.success) { this.stats.lastReport = Date.now(); this.emit('usageReported', dataToSend); } else { // Recolocar na fila se falhou this.usageQueue.unshift(...dataToSend); this.emit('error', new Error(response.error || 'Falha ao reportar uso')); } } catch (error) { // Recolocar na fila se deu erro this.usageQueue.unshift(...dataToSend); this.emit('error', error); } } updateStats(usage) { this.stats.totalUsage++; this.stats.totalTokens += usage.tokensUsed; // Contar sessões únicas const uniqueSessions = new Set(); this.usageQueue.forEach(u => uniqueSessions.add(u.sessionId)); this.stats.sessionCount = uniqueSessions.size; } combineStats(local, server) { return { totalUsage: (local.totalUsage || 0) + (server.totalUsage || 0), totalTokens: (local.totalTokens || 0) + (server.totalTokens || 0), sessionCount: Math.max(local.sessionCount || 0, server.sessionCount || 0), lastReport: Math.max(local.lastReport || 0, server.lastReport || 0) }; } } exports.TelemetryReporter = TelemetryReporter;