devflow-ai
Version:
Enterprise-grade AI agent orchestration with swarm management UI dashboard
1,046 lines (896 loc) • 29.6 kB
text/typescript
/**
* Advanced Result Aggregation and Reporting System
*
* This module provides comprehensive result aggregation, analysis, and reporting
* capabilities for swarm operations. It collects outputs from multiple agents,
* performs quality analysis, generates insights, and creates detailed reports.
*/
import { EventEmitter } from 'node:events';
import { performance } from 'node:perf_hooks';
import { Logger } from '../core/logger.js';
import { generateId } from '../utils/helpers.js';
import { MemoryManager } from '../memory/manager.js';
import {
SwarmResults,
SwarmMetrics,
SwarmExecutionContext,
TaskResult,
SwarmTask,
SwarmAgent,
SwarmObjective,
TaskDefinition,
AgentState,
} from './types.js';
export interface AggregationConfig {
enableQualityAnalysis: boolean;
enableInsightGeneration: boolean;
enableRecommendations: boolean;
enableVisualization: boolean;
qualityThreshold: number;
confidenceThreshold: number;
maxReportSize: number;
reportFormats: string[];
enableRealTimeUpdates: boolean;
aggregationInterval: number;
}
export interface QualityMetrics {
accuracy: number;
completeness: number;
consistency: number;
relevance: number;
timeliness: number;
reliability: number;
usability: number;
overall: number;
}
export interface AggregatedResult {
id: string;
swarmId: string;
timestamp: Date;
// Raw data
taskResults: Map<string, TaskResult>;
agentOutputs: Map<string, any[]>;
intermediateResults: any[];
// Processed data
consolidatedOutput: any;
keyFindings: string[];
insights: Insight[];
recommendations: Recommendation[];
// Quality assessment
qualityMetrics: QualityMetrics;
confidenceScore: number;
reliabilityScore: number;
// Metadata
processingTime: number;
dataPoints: number;
sourcesCount: number;
validationStatus: 'pending' | 'validated' | 'rejected';
}
export interface Insight {
id: string;
type: 'pattern' | 'trend' | 'anomaly' | 'correlation' | 'prediction';
title: string;
description: string;
confidence: number;
impact: 'low' | 'medium' | 'high' | 'critical';
evidence: any[];
metadata: {
source: string[];
methodology: string;
timestamp: Date;
};
}
export interface Recommendation {
id: string;
category: 'improvement' | 'optimization' | 'risk-mitigation' | 'next-steps';
priority: 'low' | 'medium' | 'high' | 'critical';
title: string;
description: string;
rationale: string;
expectedImpact: string;
estimatedEffort: 'low' | 'medium' | 'high';
timeline: string;
dependencies: string[];
risks: string[];
}
export interface ResultReport {
id: string;
swarmId: string;
executionSummary: ExecutionSummary;
results: AggregatedResult;
qualityAnalysis: QualityAnalysis;
performance: PerformanceAnalysis;
insights: Insight[];
recommendations: Recommendation[];
appendices: ReportAppendix[];
metadata: {
generatedAt: Date;
version: string;
format: string;
size: number;
};
}
export interface ExecutionSummary {
objective: string;
strategy: string;
duration: number;
tasksTotal: number;
tasksCompleted: number;
tasksFailed: number;
agentsUsed: number;
resourcesConsumed: Record<string, number>;
successRate: number;
}
export interface QualityAnalysis {
overallScore: number;
dimensionScores: QualityMetrics;
strengthAreas: string[];
improvementAreas: string[];
qualityGates: {
name: string;
status: 'passed' | 'failed' | 'warning';
score: number;
threshold: number;
}[];
}
export interface PerformanceAnalysis {
efficiency: number;
throughput: number;
latency: number;
resourceUtilization: Record<string, number>;
bottlenecks: string[];
optimizationOpportunities: string[];
}
export interface ReportAppendix {
title: string;
type: 'data' | 'logs' | 'charts' | 'raw-output';
content: any;
size: number;
}
export class SwarmResultAggregator extends EventEmitter {
private logger: Logger;
private config: AggregationConfig;
private memoryManager: MemoryManager;
private activeAggregations: Map<string, AggregationSession> = new Map();
private resultCache: Map<string, AggregatedResult> = new Map();
private processingQueue: ProcessingQueue;
constructor(
config: Partial<AggregationConfig> = {},
memoryManager: MemoryManager
) {
super();
this.logger = new Logger('SwarmResultAggregator');
this.config = this.createDefaultConfig(config);
this.memoryManager = memoryManager;
this.processingQueue = new ProcessingQueue(this.config.aggregationInterval);
this.setupEventHandlers();
}
/**
* Initialize the result aggregator
*/
async initialize(): Promise<void> {
this.logger.info('Initializing swarm result aggregator...');
try {
await this.processingQueue.start();
this.logger.info('Swarm result aggregator initialized successfully');
this.emit('initialized');
} catch (error) {
this.logger.error('Failed to initialize result aggregator', error);
throw error;
}
}
/**
* Shutdown the aggregator gracefully
*/
async shutdown(): Promise<void> {
this.logger.info('Shutting down swarm result aggregator...');
try {
// Complete active aggregations
const completionPromises = Array.from(this.activeAggregations.values())
.map(session => session.finalize());
await Promise.allSettled(completionPromises);
await this.processingQueue.stop();
this.logger.info('Swarm result aggregator shut down successfully');
this.emit('shutdown');
} catch (error) {
this.logger.error('Error during result aggregator shutdown', error);
throw error;
}
}
/**
* Start aggregating results for a swarm execution
*/
async startAggregation(context: SwarmExecutionContext): Promise<string> {
const aggregationId = generateId('aggregation');
this.logger.info('Starting result aggregation', {
aggregationId,
swarmId: context.swarmId.id,
taskCount: context.tasks.size,
agentCount: context.agents.size,
});
const session = new AggregationSession(
aggregationId,
context,
this.config,
this.logger,
this.memoryManager
);
this.activeAggregations.set(aggregationId, session);
// Start real-time processing if enabled
if (this.config.enableRealTimeUpdates) {
session.startRealTimeProcessing();
}
this.emit('aggregation:started', {
aggregationId,
swarmId: context.swarmId.id,
});
return aggregationId;
}
/**
* Add task result to aggregation
*/
async addTaskResult(
aggregationId: string,
taskId: string,
result: TaskResult
): Promise<void> {
const session = this.activeAggregations.get(aggregationId);
if (!session) {
throw new Error(`Aggregation session not found: ${aggregationId}`);
}
await session.addTaskResult(taskId, result);
this.emit('result:added', {
aggregationId,
taskId,
success: result.validated,
});
}
/**
* Add agent output to aggregation
*/
async addAgentOutput(
aggregationId: string,
agentId: string,
output: any
): Promise<void> {
const session = this.activeAggregations.get(aggregationId);
if (!session) {
throw new Error(`Aggregation session not found: ${aggregationId}`);
}
await session.addAgentOutput(agentId, output);
this.emit('output:added', {
aggregationId,
agentId,
});
}
/**
* Finalize aggregation and generate comprehensive results
*/
async finalizeAggregation(
aggregationId: string
): Promise<AggregatedResult> {
const session = this.activeAggregations.get(aggregationId);
if (!session) {
throw new Error(`Aggregation session not found: ${aggregationId}`);
}
this.logger.info('Finalizing result aggregation', { aggregationId });
try {
const result = await session.finalize();
// Cache result
this.resultCache.set(aggregationId, result);
// Store in memory
await this.storeAggregatedResult(result);
this.logger.info('Result aggregation finalized', {
aggregationId,
qualityScore: result.qualityMetrics.overall,
confidenceScore: result.confidenceScore,
insightCount: result.insights.length,
recommendationCount: result.recommendations.length,
});
this.emit('aggregation:completed', {
aggregationId,
result,
});
return result;
} finally {
// Clean up session
this.activeAggregations.delete(aggregationId);
}
}
/**
* Generate comprehensive report from aggregated results
*/
async generateReport(
aggregationId: string,
format: 'json' | 'markdown' | 'html' | 'pdf' = 'json'
): Promise<ResultReport> {
const result = this.resultCache.get(aggregationId);
if (!result) {
throw new Error(`Aggregated result not found: ${aggregationId}`);
}
this.logger.info('Generating result report', {
aggregationId,
format,
});
const report = await this.createReport(result, format);
this.emit('report:generated', {
aggregationId,
reportId: report.id,
format,
size: report.metadata.size,
});
return report;
}
/**
* Get current aggregation status
*/
getAggregationStatus(aggregationId: string): {
status: 'active' | 'completed' | 'not-found';
progress?: number;
results?: Partial<AggregatedResult>;
} {
const session = this.activeAggregations.get(aggregationId);
if (session) {
return {
status: 'active',
progress: session.getProgress(),
results: session.getPartialResults(),
};
}
const cachedResult = this.resultCache.get(aggregationId);
if (cachedResult) {
return {
status: 'completed',
progress: 100,
results: cachedResult,
};
}
return { status: 'not-found' };
}
/**
* Get aggregator metrics
*/
getMetrics(): {
activeAggregations: number;
completedAggregations: number;
totalResults: number;
averageQualityScore: number;
averageConfidenceScore: number;
processingThroughput: number;
} {
const completedResults = Array.from(this.resultCache.values());
return {
activeAggregations: this.activeAggregations.size,
completedAggregations: this.resultCache.size,
totalResults: completedResults.length,
averageQualityScore: this.calculateAverageQuality(completedResults),
averageConfidenceScore: this.calculateAverageConfidence(completedResults),
processingThroughput: this.processingQueue.getThroughput(),
};
}
// Private methods
private async createReport(
result: AggregatedResult,
format: string
): Promise<ResultReport> {
const reportId = generateId('report');
const startTime = performance.now();
// Get context from memory
const contextData = await this.memoryManager.retrieve({
namespace: `swarm:${result.swarmId}`,
type: 'swarm-definition',
});
const context = contextData.length > 0
? JSON.parse(contextData[0].content)
: {};
// Generate report sections
const executionSummary = this.generateExecutionSummary(result, context);
const qualityAnalysis = this.generateQualityAnalysis(result);
const performanceAnalysis = this.generatePerformanceAnalysis(result);
const appendices = await this.generateAppendices(result);
const processingTime = performance.now() - startTime;
const report: ResultReport = {
id: reportId,
swarmId: result.swarmId,
executionSummary,
results: result,
qualityAnalysis,
performance: performanceAnalysis,
insights: result.insights,
recommendations: result.recommendations,
appendices,
metadata: {
generatedAt: new Date(),
version: '1.0.0',
format,
size: this.calculateReportSize(result, appendices),
},
};
// Store report
await this.storeReport(report);
return report;
}
private generateExecutionSummary(
result: AggregatedResult,
context: any
): ExecutionSummary {
return {
objective: context.description || 'Unknown objective',
strategy: context.strategy || 'auto',
duration: result.processingTime,
tasksTotal: result.taskResults.size,
tasksCompleted: Array.from(result.taskResults.values())
.filter(r => r.validated).length,
tasksFailed: Array.from(result.taskResults.values())
.filter(r => !r.validated).length,
agentsUsed: result.agentOutputs.size,
resourcesConsumed: {},
successRate: this.calculateSuccessRate(result),
};
}
private generateQualityAnalysis(result: AggregatedResult): QualityAnalysis {
const qualityGates = [
{
name: 'Accuracy',
status: result.qualityMetrics.accuracy >= this.config.qualityThreshold ? 'passed' : 'failed',
score: result.qualityMetrics.accuracy,
threshold: this.config.qualityThreshold,
},
{
name: 'Completeness',
status: result.qualityMetrics.completeness >= this.config.qualityThreshold ? 'passed' : 'failed',
score: result.qualityMetrics.completeness,
threshold: this.config.qualityThreshold,
},
{
name: 'Consistency',
status: result.qualityMetrics.consistency >= this.config.qualityThreshold ? 'passed' : 'failed',
score: result.qualityMetrics.consistency,
threshold: this.config.qualityThreshold,
},
] as any[];
return {
overallScore: result.qualityMetrics.overall,
dimensionScores: result.qualityMetrics,
strengthAreas: this.identifyStrengthAreas(result.qualityMetrics),
improvementAreas: this.identifyImprovementAreas(result.qualityMetrics),
qualityGates,
};
}
private generatePerformanceAnalysis(result: AggregatedResult): PerformanceAnalysis {
return {
efficiency: this.calculateEfficiency(result),
throughput: this.calculateThroughput(result),
latency: this.calculateLatency(result),
resourceUtilization: {},
bottlenecks: this.identifyBottlenecks(result),
optimizationOpportunities: this.identifyOptimizationOpportunities(result),
};
}
private async generateAppendices(result: AggregatedResult): Promise<ReportAppendix[]> {
const appendices: ReportAppendix[] = [];
// Raw data appendix
appendices.push({
title: 'Raw Task Results',
type: 'data',
content: Array.from(result.taskResults.entries()),
size: this.calculateContentSize(result.taskResults),
});
// Agent outputs appendix
appendices.push({
title: 'Agent Outputs',
type: 'data',
content: Array.from(result.agentOutputs.entries()),
size: this.calculateContentSize(result.agentOutputs),
});
return appendices;
}
private async storeAggregatedResult(result: AggregatedResult): Promise<void> {
await this.memoryManager.store({
id: `aggregated-result:${result.id}`,
agentId: 'result-aggregator',
type: 'aggregated-result',
content: JSON.stringify(result),
namespace: `swarm:${result.swarmId}`,
timestamp: result.timestamp,
metadata: {
type: 'aggregated-result',
qualityScore: result.qualityMetrics.overall,
confidenceScore: result.confidenceScore,
dataPoints: result.dataPoints,
},
});
}
private async storeReport(report: ResultReport): Promise<void> {
await this.memoryManager.store({
id: `report:${report.id}`,
agentId: 'result-aggregator',
type: 'result-report',
content: JSON.stringify(report),
namespace: `swarm:${report.swarmId}`,
timestamp: report.metadata.generatedAt,
metadata: {
type: 'result-report',
format: report.metadata.format,
size: report.metadata.size,
},
});
}
private calculateSuccessRate(result: AggregatedResult): number {
const total = result.taskResults.size;
const successful = Array.from(result.taskResults.values())
.filter(r => r.validated).length;
return total > 0 ? successful / total : 0;
}
private calculateEfficiency(result: AggregatedResult): number {
// Placeholder calculation
return 0.85;
}
private calculateThroughput(result: AggregatedResult): number {
// Placeholder calculation
return result.dataPoints / (result.processingTime / 1000);
}
private calculateLatency(result: AggregatedResult): number {
// Placeholder calculation
return result.processingTime / result.dataPoints;
}
private identifyStrengthAreas(metrics: QualityMetrics): string[] {
const strengths: string[] = [];
const threshold = 0.8;
if (metrics.accuracy >= threshold) strengths.push('High accuracy in results');
if (metrics.completeness >= threshold) strengths.push('Comprehensive coverage');
if (metrics.consistency >= threshold) strengths.push('Consistent output quality');
if (metrics.timeliness >= threshold) strengths.push('Timely execution');
if (metrics.reliability >= threshold) strengths.push('Reliable performance');
return strengths;
}
private identifyImprovementAreas(metrics: QualityMetrics): string[] {
const improvements: string[] = [];
const threshold = 0.7;
if (metrics.accuracy < threshold) improvements.push('Accuracy needs improvement');
if (metrics.completeness < threshold) improvements.push('Coverage gaps identified');
if (metrics.consistency < threshold) improvements.push('Output consistency issues');
if (metrics.timeliness < threshold) improvements.push('Execution time optimization needed');
if (metrics.reliability < threshold) improvements.push('Reliability concerns');
return improvements;
}
private identifyBottlenecks(result: AggregatedResult): string[] {
// Placeholder analysis
return [
'Agent coordination overhead',
'Task dependency chains',
'Resource contention',
];
}
private identifyOptimizationOpportunities(result: AggregatedResult): string[] {
// Placeholder analysis
return [
'Parallel task execution',
'Caching of intermediate results',
'Agent specialization',
'Load balancing improvements',
];
}
private calculateAverageQuality(results: AggregatedResult[]): number {
if (results.length === 0) return 0;
const total = results.reduce((sum, r) => sum + r.qualityMetrics.overall, 0);
return total / results.length;
}
private calculateAverageConfidence(results: AggregatedResult[]): number {
if (results.length === 0) return 0;
const total = results.reduce((sum, r) => sum + r.confidenceScore, 0);
return total / results.length;
}
private calculateContentSize(content: any): number {
return JSON.stringify(content).length;
}
private calculateReportSize(result: AggregatedResult, appendices: ReportAppendix[]): number {
let size = JSON.stringify(result).length;
size += appendices.reduce((sum, a) => sum + a.size, 0);
return size;
}
private createDefaultConfig(config: Partial<AggregationConfig>): AggregationConfig {
return {
enableQualityAnalysis: true,
enableInsightGeneration: true,
enableRecommendations: true,
enableVisualization: false,
qualityThreshold: 0.8,
confidenceThreshold: 0.7,
maxReportSize: 10 * 1024 * 1024, // 10MB
reportFormats: ['json', 'markdown'],
enableRealTimeUpdates: true,
aggregationInterval: 5000, // 5 seconds
...config,
};
}
private setupEventHandlers(): void {
this.on('aggregation:started', (data) => {
this.logger.info('Aggregation started', data);
});
this.on('aggregation:completed', (data) => {
this.logger.info('Aggregation completed', {
aggregationId: data.aggregationId,
qualityScore: data.result.qualityMetrics.overall,
});
});
this.on('report:generated', (data) => {
this.logger.info('Report generated', data);
});
}
}
// Supporting classes
class AggregationSession {
private id: string;
private context: SwarmExecutionContext;
private config: AggregationConfig;
private logger: Logger;
private memoryManager: MemoryManager;
private taskResults: Map<string, TaskResult> = new Map();
private agentOutputs: Map<string, any[]> = new Map();
private startTime: Date;
private isFinalized: boolean = false;
constructor(
id: string,
context: SwarmExecutionContext,
config: AggregationConfig,
logger: Logger,
memoryManager: MemoryManager
) {
this.id = id;
this.context = context;
this.config = config;
this.logger = logger;
this.memoryManager = memoryManager;
this.startTime = new Date();
}
async addTaskResult(taskId: string, result: TaskResult): Promise<void> {
this.taskResults.set(taskId, result);
this.logger.debug('Task result added to aggregation', {
aggregationId: this.id,
taskId,
validated: result.validated,
});
}
async addAgentOutput(agentId: string, output: any): Promise<void> {
if (!this.agentOutputs.has(agentId)) {
this.agentOutputs.set(agentId, []);
}
this.agentOutputs.get(agentId)!.push(output);
this.logger.debug('Agent output added to aggregation', {
aggregationId: this.id,
agentId,
});
}
startRealTimeProcessing(): void {
// Implementation for real-time processing
this.logger.debug('Started real-time processing', { aggregationId: this.id });
}
getProgress(): number {
const totalExpected = this.context.tasks.size;
const completed = this.taskResults.size;
return totalExpected > 0 ? (completed / totalExpected) * 100 : 0;
}
getPartialResults(): Partial<AggregatedResult> {
return {
id: this.id,
swarmId: this.context.swarmId.id,
timestamp: this.startTime,
taskResults: this.taskResults,
agentOutputs: this.agentOutputs,
dataPoints: this.taskResults.size + this.agentOutputs.size,
sourcesCount: this.agentOutputs.size,
};
}
async finalize(): Promise<AggregatedResult> {
if (this.isFinalized) {
throw new Error('Session already finalized');
}
this.logger.info('Finalizing aggregation session', {
aggregationId: this.id,
taskResults: this.taskResults.size,
agentOutputs: this.agentOutputs.size,
});
const processingStartTime = performance.now();
// Consolidate outputs
const consolidatedOutput = this.consolidateOutputs();
// Extract key findings
const keyFindings = this.extractKeyFindings();
// Generate insights
const insights = this.config.enableInsightGeneration
? await this.generateInsights()
: [];
// Generate recommendations
const recommendations = this.config.enableRecommendations
? await this.generateRecommendations()
: [];
// Calculate quality metrics
const qualityMetrics = this.config.enableQualityAnalysis
? this.calculateQualityMetrics()
: this.getDefaultQualityMetrics();
// Calculate confidence score
const confidenceScore = this.calculateConfidenceScore();
const processingTime = performance.now() - processingStartTime;
const result: AggregatedResult = {
id: this.id,
swarmId: this.context.swarmId.id,
timestamp: this.startTime,
taskResults: this.taskResults,
agentOutputs: this.agentOutputs,
intermediateResults: [],
consolidatedOutput,
keyFindings,
insights,
recommendations,
qualityMetrics,
confidenceScore,
reliabilityScore: this.calculateReliabilityScore(),
processingTime,
dataPoints: this.taskResults.size + this.agentOutputs.size,
sourcesCount: this.agentOutputs.size,
validationStatus: 'validated',
};
this.isFinalized = true;
return result;
}
private consolidateOutputs(): any {
// Placeholder implementation
const outputs: any[] = [];
// Add task results
for (const result of this.taskResults.values()) {
if (result.output) {
outputs.push(result.output);
}
}
// Add agent outputs
for (const agentOutputList of this.agentOutputs.values()) {
outputs.push(...agentOutputList);
}
return {
summary: 'Consolidated output from all agents and tasks',
data: outputs,
timestamp: new Date(),
};
}
private extractKeyFindings(): string[] {
// Placeholder implementation
return [
'All primary objectives were addressed',
'High quality outputs achieved across agents',
'Effective coordination and collaboration',
'No critical issues identified',
];
}
private async generateInsights(): Promise<Insight[]> {
// Placeholder implementation
return [
{
id: generateId('insight'),
type: 'pattern',
title: 'Consistent High Performance',
description: 'All agents maintained high performance throughout execution',
confidence: 0.9,
impact: 'medium',
evidence: [],
metadata: {
source: ['agent-metrics', 'task-results'],
methodology: 'Statistical analysis',
timestamp: new Date(),
},
},
{
id: generateId('insight'),
type: 'trend',
title: 'Improving Efficiency Over Time',
description: 'Task completion times decreased as agents learned',
confidence: 0.8,
impact: 'high',
evidence: [],
metadata: {
source: ['performance-metrics'],
methodology: 'Trend analysis',
timestamp: new Date(),
},
},
];
}
private async generateRecommendations(): Promise<Recommendation[]> {
// Placeholder implementation
return [
{
id: generateId('recommendation'),
category: 'optimization',
priority: 'medium',
title: 'Implement Agent Specialization',
description: 'Specialize agents for specific task types to improve efficiency',
rationale: 'Analysis shows certain agents perform better on specific task types',
expectedImpact: '15-20% improvement in task completion time',
estimatedEffort: 'medium',
timeline: '2-3 weeks',
dependencies: ['agent-profiling-system'],
risks: ['Reduced flexibility in task assignment'],
},
{
id: generateId('recommendation'),
category: 'improvement',
priority: 'high',
title: 'Add Result Validation Layer',
description: 'Implement automated validation of task results',
rationale: 'Some inconsistencies detected in output quality',
expectedImpact: 'Improved result reliability and user confidence',
estimatedEffort: 'high',
timeline: '4-6 weeks',
dependencies: ['validation-framework'],
risks: ['Increased processing overhead'],
},
];
}
private calculateQualityMetrics(): QualityMetrics {
// Placeholder implementation with realistic calculations
const successfulTasks = Array.from(this.taskResults.values())
.filter(r => r.validated).length;
const totalTasks = this.taskResults.size;
const baseAccuracy = totalTasks > 0 ? successfulTasks / totalTasks : 1;
return {
accuracy: baseAccuracy,
completeness: Math.min(baseAccuracy + 0.1, 1),
consistency: Math.min(baseAccuracy + 0.05, 1),
relevance: Math.min(baseAccuracy + 0.02, 1),
timeliness: 0.9, // Placeholder
reliability: baseAccuracy,
usability: 0.85, // Placeholder
overall: (baseAccuracy + 0.9 + 0.85) / 3,
};
}
private getDefaultQualityMetrics(): QualityMetrics {
return {
accuracy: 0.8,
completeness: 0.8,
consistency: 0.8,
relevance: 0.8,
timeliness: 0.8,
reliability: 0.8,
usability: 0.8,
overall: 0.8,
};
}
private calculateConfidenceScore(): number {
// Base confidence on data availability and quality
const dataAvailability = this.taskResults.size / Math.max(this.context.tasks.size, 1);
const resultQuality = Array.from(this.taskResults.values())
.reduce((sum, r) => sum + (r.validated ? 1 : 0), 0) / Math.max(this.taskResults.size, 1);
return Math.min((dataAvailability + resultQuality) / 2, 1);
}
private calculateReliabilityScore(): number {
// Placeholder implementation
return 0.9;
}
}
class ProcessingQueue {
private interval: number;
private isRunning: boolean = false;
private throughputCounter: number = 0;
private intervalHandle?: NodeJS.Timeout;
constructor(interval: number) {
this.interval = interval;
}
async start(): Promise<void> {
if (this.isRunning) return;
this.isRunning = true;
this.intervalHandle = setInterval(() => {
// Process queued items
this.throughputCounter++;
}, this.interval);
}
async stop(): Promise<void> {
if (!this.isRunning) return;
this.isRunning = false;
if (this.intervalHandle) {
clearInterval(this.intervalHandle);
}
}
getThroughput(): number {
return this.throughputCounter;
}
}
export default SwarmResultAggregator;