UNPKG

@454creative/easy-events

Version:

A minimal event engine for Node.js and NestJS, wrapping Emmett for lightweight in-process event handling

159 lines 5.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DefaultObservabilityEngine = void 0; const uuid_1 = require("uuid"); class DefaultObservabilityEngine { constructor(config = {}) { this.metrics = { totalEvents: 0, eventsByType: {}, averageProcessingTime: 0, errorCount: 0, activeHandlers: 0, }; this.auditLogs = []; this.processingTimes = []; this.config = { enableMetrics: true, enableAuditing: true, enableTracing: true, enablePerformanceMonitoring: true, auditRetentionDays: 30, metricsRetentionDays: 7, logLevel: "info", ...config, }; } recordEvent(event, payload, tracing) { if (!this.config.enableMetrics && !this.config.enableAuditing) return; const eventId = (0, uuid_1.v4)(); const timestamp = new Date(); // Update metrics if (this.config.enableMetrics) { this.metrics.totalEvents++; this.metrics.eventsByType[event] = (this.metrics.eventsByType[event] || 0) + 1; } // Record audit log if (this.config.enableAuditing) { const audit = { eventId, eventType: event, timestamp, payload, correlationId: tracing?.correlationId || undefined, userId: tracing?.userId || undefined, source: tracing?.metadata?.["source"], success: true, }; this.auditLogs.push(audit); // Call custom audit logger if provided if (this.config.customAuditLogger) { this.config.customAuditLogger(audit); } // Log to console based on log level this.logAudit(audit); } } recordHandlerExecution(event, _handler, duration, success, error) { if (!this.config.enableMetrics && !this.config.enableAuditing) return; // Update metrics if (this.config.enableMetrics) { this.processingTimes.push(duration); this.metrics.averageProcessingTime = this.calculateAverageProcessingTime(); if (!success) { this.metrics.errorCount++; } } // Update audit log if exists if (this.config.enableAuditing) { const auditLog = this.auditLogs.find((log) => log.eventType === event); if (auditLog) { auditLog.processingTime = duration; auditLog.success = success; auditLog.error = error; } } } recordError(event, error, tracing) { if (!this.config.enableMetrics && !this.config.enableAuditing) return; // Update metrics if (this.config.enableMetrics) { this.metrics.errorCount++; } // Record error audit if (this.config.enableAuditing) { const errorAudit = { eventId: (0, uuid_1.v4)(), eventType: event, timestamp: new Date(), payload: { error: error.message, stack: error.stack }, correlationId: tracing?.correlationId || undefined, userId: tracing?.userId || undefined, source: tracing?.metadata?.["source"], success: false, error: error.message, }; this.auditLogs.push(errorAudit); if (this.config.customAuditLogger) { this.config.customAuditLogger(errorAudit); } this.logAudit(errorAudit); } } getMetrics() { return { ...this.metrics }; } getAuditLogs(filters) { let logs = [...this.auditLogs]; if (filters) { logs = logs.filter((log) => { return Object.entries(filters).every(([key, value]) => { return log[key] === value; }); }); } return logs; } clearAuditLogs() { this.auditLogs = []; } clearMetrics() { this.metrics = { totalEvents: 0, eventsByType: {}, averageProcessingTime: 0, errorCount: 0, activeHandlers: 0, }; this.processingTimes = []; } calculateAverageProcessingTime() { if (this.processingTimes.length === 0) return 0; return (this.processingTimes.reduce((sum, time) => sum + time, 0) / this.processingTimes.length); } logAudit(audit) { const level = this.config.logLevel || "info"; const message = `[${audit.eventType}] ${audit.success ? "SUCCESS" : "ERROR"} - ${audit.eventId}`; if (level === "debug") { console.debug(message, audit); } else if (level === "info") { console.info(message); } else if (level === "warn") { console.warn(message); } else if (level === "error" && !audit.success) { console.error(message, audit.error); } } } exports.DefaultObservabilityEngine = DefaultObservabilityEngine; //# sourceMappingURL=observability-engine.js.map