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
JavaScript
"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;