hook-engine
Version:
Production-grade webhook engine with comprehensive adapter support, security, reliability, structured logging, and CLI tools.
85 lines (84 loc) ⢠4.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.benchmarkCommand = benchmarkCommand;
async function benchmarkCommand(options) {
console.log('ā” Starting Hook Engine performance benchmark...\n');
const totalRequests = parseInt(options.requests, 10);
const concurrency = parseInt(options.concurrency, 10);
const url = options.url || 'http://localhost:3000/webhook';
console.log(`šÆ Target URL: ${url}`);
console.log(`š Total requests: ${totalRequests}`);
console.log(`š Concurrency: ${concurrency}\n`);
console.log('š Starting benchmark...');
const startTime = Date.now();
const results = [];
// Simulate concurrent requests
const batches = Math.ceil(totalRequests / concurrency);
for (let batch = 0; batch < batches; batch++) {
const batchSize = Math.min(concurrency, totalRequests - batch * concurrency);
const batchPromises = [];
for (let i = 0; i < batchSize; i++) {
batchPromises.push(simulateRequest());
}
const batchResults = await Promise.all(batchPromises);
results.push(...batchResults);
const completed = (batch + 1) * concurrency;
const progress = Math.min(completed, totalRequests);
const percentage = ((progress / totalRequests) * 100).toFixed(1);
process.stdout.write(`\rš Progress: ${progress}/${totalRequests} (${percentage}%)`);
}
const totalTime = Date.now() - startTime;
console.log('\n\nš Benchmark Results:');
console.log('ā'.repeat(50));
// Calculate statistics
const successful = results.filter(r => r.success).length;
const failed = results.length - successful;
const responseTimes = results.map(r => r.responseTime);
const avgResponseTime = responseTimes.reduce((a, b) => a + b, 0) / responseTimes.length;
const minResponseTime = Math.min(...responseTimes);
const maxResponseTime = Math.max(...responseTimes);
const requestsPerSecond = (totalRequests / totalTime) * 1000;
// Calculate percentiles
const sortedTimes = responseTimes.sort((a, b) => a - b);
const p50 = sortedTimes[Math.floor(sortedTimes.length * 0.5)];
const p95 = sortedTimes[Math.floor(sortedTimes.length * 0.95)];
const p99 = sortedTimes[Math.floor(sortedTimes.length * 0.99)];
console.log(`ā±ļø Total time: ${totalTime}ms`);
console.log(`š Requests/sec: ${requestsPerSecond.toFixed(2)}`);
console.log(`ā
Successful: ${successful}/${totalRequests} (${((successful / totalRequests) * 100).toFixed(1)}%)`);
console.log(`ā Failed: ${failed}/${totalRequests} (${((failed / totalRequests) * 100).toFixed(1)}%)`);
console.log();
console.log('š Response Time Statistics:');
console.log(` Average: ${avgResponseTime.toFixed(2)}ms`);
console.log(` Min: ${minResponseTime}ms`);
console.log(` Max: ${maxResponseTime}ms`);
console.log(` 50th percentile: ${p50}ms`);
console.log(` 95th percentile: ${p95}ms`);
console.log(` 99th percentile: ${p99}ms`);
if (failed > 0) {
console.log('\nā Error Summary:');
const errorCounts = {};
results.filter(r => !r.success).forEach(r => {
errorCounts[r.error] = (errorCounts[r.error] || 0) + 1;
});
Object.entries(errorCounts).forEach(([error, count]) => {
console.log(` ${error}: ${count} occurrences`);
});
}
console.log('\nš Benchmark completed!');
}
async function simulateRequest() {
const startTime = Date.now();
// Simulate network latency and processing time
const baseLatency = 50 + Math.random() * 200; // 50-250ms
const processingTime = 10 + Math.random() * 40; // 10-50ms
const totalTime = baseLatency + processingTime;
await new Promise(resolve => setTimeout(resolve, totalTime));
const responseTime = Date.now() - startTime;
const success = Math.random() > 0.05; // 95% success rate
return {
success,
responseTime,
error: success ? null : 'Connection timeout'
};
}