@scpxl/nodejs-framework 1.0.49 → 1.0.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -7
- package/dist/api-requester/api-requester.js +1 -1
- package/dist/api-requester/api-requester.js.map +2 -2
- package/dist/api-requester/index.d.ts +1 -1
- package/dist/api-requester/index.d.ts.map +1 -1
- package/dist/api-requester/index.js.map +2 -2
- package/dist/application/base-application.d.ts +6 -5
- package/dist/application/base-application.d.ts.map +1 -1
- package/dist/application/base-application.interface.d.ts +2 -4
- package/dist/application/base-application.interface.d.ts.map +1 -1
- package/dist/application/base-application.js +23 -14
- package/dist/application/base-application.js.map +2 -2
- package/dist/application/command-application.d.ts.map +1 -1
- package/dist/application/command-application.js +2 -2
- package/dist/application/command-application.js.map +2 -2
- package/dist/application/index.d.ts +3 -3
- package/dist/application/index.d.ts.map +1 -1
- package/dist/application/index.js +4 -4
- package/dist/application/index.js.map +2 -2
- package/dist/application/web-application.d.ts +5 -5
- package/dist/application/web-application.d.ts.map +1 -1
- package/dist/application/web-application.js +6 -7
- package/dist/application/web-application.js.map +2 -2
- package/dist/application/worker-application.d.ts +2 -2
- package/dist/application/worker-application.d.ts.map +1 -1
- package/dist/application/worker-application.js +2 -2
- package/dist/application/worker-application.js.map +2 -2
- package/dist/auth/jwt.d.ts.map +1 -1
- package/dist/auth/jwt.js +2 -2
- package/dist/auth/jwt.js.map +2 -2
- package/dist/cache/manager.d.ts.map +1 -1
- package/dist/cache/manager.js.map +2 -2
- package/dist/cli/index.js +192 -7029
- package/dist/cli/index.js.map +4 -4
- package/dist/cluster/cluster-manager.d.ts.map +1 -1
- package/dist/cluster/cluster-manager.js +1 -1
- package/dist/cluster/cluster-manager.js.map +2 -2
- package/dist/command/command.d.ts +1 -1
- package/dist/command/command.d.ts.map +1 -1
- package/dist/command/command.js.map +2 -2
- package/dist/config/env.d.ts +1 -1
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +1 -1
- package/dist/config/schema.js.map +2 -2
- package/dist/database/dynamic-entity.js +9 -9
- package/dist/database/dynamic-entity.js.map +2 -2
- package/dist/database/index.d.ts +3 -3
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +5 -5
- package/dist/database/index.js.map +2 -2
- package/dist/database/instance.d.ts +3 -3
- package/dist/database/instance.js +3 -3
- package/dist/database/instance.js.map +1 -1
- package/dist/database/manager.d.ts +1 -0
- package/dist/database/manager.d.ts.map +1 -1
- package/dist/database/manager.js +16 -3
- package/dist/database/manager.js.map +2 -2
- package/dist/error/error-reporter.js +1 -1
- package/dist/error/error-reporter.js.map +2 -2
- package/dist/error/index.d.ts +2 -3
- package/dist/error/index.d.ts.map +1 -1
- package/dist/error/index.js +8 -9
- package/dist/error/index.js.map +2 -2
- package/dist/event/controller/base.d.ts +2 -2
- package/dist/event/controller/base.d.ts.map +1 -1
- package/dist/event/controller/base.js +2 -2
- package/dist/event/controller/base.js.map +2 -2
- package/dist/event/index.d.ts +3 -3
- package/dist/event/index.d.ts.map +1 -1
- package/dist/event/index.js +5 -5
- package/dist/event/index.js.map +2 -2
- package/dist/event/manager.d.ts.map +1 -1
- package/dist/event/manager.interface.d.ts +2 -3
- package/dist/event/manager.interface.d.ts.map +1 -1
- package/dist/event/manager.js.map +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/lifecycle/index.d.ts +3 -3
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/index.js +1 -1
- package/dist/lifecycle/index.js.map +2 -2
- package/dist/lifecycle/lifecycle-manager.d.ts +6 -0
- package/dist/lifecycle/lifecycle-manager.d.ts.map +1 -1
- package/dist/lifecycle/lifecycle-manager.js +28 -0
- package/dist/lifecycle/lifecycle-manager.js.map +2 -2
- package/dist/logger/logger.d.ts +20 -1
- package/dist/logger/logger.d.ts.map +1 -1
- package/dist/logger/logger.js +68 -96
- package/dist/logger/logger.js.map +2 -2
- package/dist/performance/cache-performance.d.ts.map +1 -1
- package/dist/performance/cache-performance.js +1 -1
- package/dist/performance/cache-performance.js.map +2 -2
- package/dist/performance/database-performance.d.ts.map +1 -1
- package/dist/performance/database-performance.js +1 -1
- package/dist/performance/database-performance.js.map +2 -2
- package/dist/performance/index.d.ts +3 -3
- package/dist/performance/index.d.ts.map +1 -1
- package/dist/performance/index.js +3 -3
- package/dist/performance/index.js.map +1 -1
- package/dist/performance/performance-monitor.js +2 -2
- package/dist/performance/performance-monitor.js.map +2 -2
- package/dist/performance/performance-monitor.plugin.d.ts.map +1 -1
- package/dist/performance/performance-monitor.plugin.js +1 -1
- package/dist/performance/performance-monitor.plugin.js.map +2 -2
- package/dist/performance/queue-performance.d.ts.map +1 -1
- package/dist/performance/queue-performance.js +1 -1
- package/dist/performance/queue-performance.js.map +2 -2
- package/dist/performance/webserver-performance.d.ts.map +1 -1
- package/dist/performance/webserver-performance.js +1 -1
- package/dist/performance/webserver-performance.js.map +2 -2
- package/dist/performance/websocket-performance.d.ts.map +1 -1
- package/dist/performance/websocket-performance.js +1 -1
- package/dist/performance/websocket-performance.js.map +2 -2
- package/dist/queue/index.d.ts +2 -2
- package/dist/queue/index.d.ts.map +1 -1
- package/dist/queue/index.interface.d.ts +1 -1
- package/dist/queue/index.interface.d.ts.map +1 -1
- package/dist/queue/index.js.map +2 -2
- package/dist/queue/manager.d.ts +9 -2
- package/dist/queue/manager.d.ts.map +1 -1
- package/dist/queue/manager.js +44 -6
- package/dist/queue/manager.js.map +2 -2
- package/dist/queue/processor/base.d.ts +5 -5
- package/dist/queue/processor/base.d.ts.map +1 -1
- package/dist/queue/processor/base.js +2 -2
- package/dist/queue/processor/base.js.map +2 -2
- package/dist/queue/processor/processor.interface.d.ts +3 -3
- package/dist/queue/processor/processor.interface.d.ts.map +1 -1
- package/dist/queue/worker.d.ts +5 -0
- package/dist/queue/worker.d.ts.map +1 -1
- package/dist/queue/worker.interface.d.ts +1 -1
- package/dist/queue/worker.interface.d.ts.map +1 -1
- package/dist/queue/worker.js +9 -1
- package/dist/queue/worker.js.map +2 -2
- package/dist/redis/index.d.ts +1 -1
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/redis/index.js +5 -4
- package/dist/redis/index.js.map +2 -2
- package/dist/redis/instance.js +1 -1
- package/dist/redis/instance.js.map +2 -2
- package/dist/redis/manager.d.ts +7 -1
- package/dist/redis/manager.d.ts.map +1 -1
- package/dist/redis/manager.js +20 -4
- package/dist/redis/manager.js.map +2 -2
- package/dist/request-context/index.d.ts +1 -1
- package/dist/request-context/index.d.ts.map +1 -1
- package/dist/request-context/index.js +5 -5
- package/dist/request-context/index.js.map +1 -1
- package/dist/schemas/entity-builder.d.ts +3 -3
- package/dist/schemas/entity-builder.d.ts.map +1 -1
- package/dist/schemas/entity-builder.js.map +1 -1
- package/dist/services/aws/s3.d.ts.map +1 -1
- package/dist/services/aws/s3.js +7 -10
- package/dist/services/aws/s3.js.map +2 -2
- package/dist/util/file.d.ts +13 -8
- package/dist/util/file.d.ts.map +1 -1
- package/dist/util/file.js +6 -28
- package/dist/util/file.js.map +2 -2
- package/dist/util/helper.js +2 -2
- package/dist/util/helper.js.map +2 -2
- package/dist/util/index.d.ts +2 -2
- package/dist/util/index.d.ts.map +1 -1
- package/dist/util/index.js +18 -18
- package/dist/util/index.js.map +2 -2
- package/dist/util/loader.js +3 -3
- package/dist/util/loader.js.map +2 -2
- package/dist/util/os.js +2 -2
- package/dist/util/os.js.map +2 -2
- package/dist/webserver/controller/auth-middleware.d.ts +1 -1
- package/dist/webserver/controller/auth-middleware.d.ts.map +1 -1
- package/dist/webserver/controller/auth-middleware.js +1 -1
- package/dist/webserver/controller/auth-middleware.js.map +2 -2
- package/dist/webserver/controller/base.d.ts +6 -6
- package/dist/webserver/controller/base.d.ts.map +1 -1
- package/dist/webserver/controller/base.interface.d.ts +1 -1
- package/dist/webserver/controller/base.interface.d.ts.map +1 -1
- package/dist/webserver/controller/base.js +4 -4
- package/dist/webserver/controller/base.js.map +2 -2
- package/dist/webserver/controller/entity.d.ts +4 -3
- package/dist/webserver/controller/entity.d.ts.map +1 -1
- package/dist/webserver/controller/entity.js +26 -17
- package/dist/webserver/controller/entity.js.map +2 -2
- package/dist/webserver/controller/example-auth.d.ts.map +1 -1
- package/dist/webserver/controller/example-auth.js +1 -1
- package/dist/webserver/controller/example-auth.js.map +2 -2
- package/dist/webserver/controller/health.d.ts.map +1 -1
- package/dist/webserver/controller/health.js +1 -1
- package/dist/webserver/controller/health.js.map +2 -2
- package/dist/webserver/define-action.d.ts +1 -1
- package/dist/webserver/define-action.d.ts.map +1 -1
- package/dist/webserver/define-action.js.map +1 -1
- package/dist/webserver/define-route.d.ts +1 -1
- package/dist/webserver/define-route.d.ts.map +1 -1
- package/dist/webserver/define-route.js.map +2 -2
- package/dist/webserver/index.d.ts +9 -9
- package/dist/webserver/index.d.ts.map +1 -1
- package/dist/webserver/index.js +14 -14
- package/dist/webserver/index.js.map +2 -2
- package/dist/webserver/webserver.d.ts +3 -3
- package/dist/webserver/webserver.d.ts.map +1 -1
- package/dist/webserver/webserver.interface.d.ts +5 -5
- package/dist/webserver/webserver.interface.d.ts.map +1 -1
- package/dist/webserver/webserver.interface.js.map +1 -1
- package/dist/webserver/webserver.js +9 -9
- package/dist/webserver/webserver.js.map +2 -2
- package/dist/websocket/controller/server/base.d.ts +2 -2
- package/dist/websocket/controller/server/base.js.map +1 -1
- package/dist/websocket/controllers/server/system.d.ts.map +1 -1
- package/dist/websocket/controllers/server/system.js +1 -1
- package/dist/websocket/controllers/server/system.js.map +2 -2
- package/dist/websocket/index.d.ts +9 -11
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +22 -22
- package/dist/websocket/index.js.map +2 -2
- package/dist/websocket/subscriber-middleware.d.ts.map +1 -1
- package/dist/websocket/subscriber-middleware.js.map +2 -2
- package/dist/websocket/subscriber-utils.d.ts.map +1 -1
- package/dist/websocket/subscriber-utils.js.map +2 -2
- package/dist/websocket/utils.d.ts.map +1 -1
- package/dist/websocket/utils.js +4 -2
- package/dist/websocket/utils.js.map +2 -2
- package/dist/websocket/websocket-auth.d.ts.map +1 -1
- package/dist/websocket/websocket-auth.js +3 -3
- package/dist/websocket/websocket-auth.js.map +2 -2
- package/dist/websocket/websocket-base.d.ts +2 -2
- package/dist/websocket/websocket-base.d.ts.map +1 -1
- package/dist/websocket/websocket-base.js +1 -1
- package/dist/websocket/websocket-base.js.map +2 -2
- package/dist/websocket/websocket-client-manager.d.ts +2 -0
- package/dist/websocket/websocket-client-manager.d.ts.map +1 -1
- package/dist/websocket/websocket-client-manager.js +11 -4
- package/dist/websocket/websocket-client-manager.js.map +2 -2
- package/dist/websocket/websocket-client.d.ts +10 -5
- package/dist/websocket/websocket-client.d.ts.map +1 -1
- package/dist/websocket/websocket-client.js +27 -5
- package/dist/websocket/websocket-client.js.map +2 -2
- package/dist/websocket/websocket-room-manager.js +1 -1
- package/dist/websocket/websocket-room-manager.js.map +1 -1
- package/dist/websocket/websocket-server.d.ts +7 -7
- package/dist/websocket/websocket-server.d.ts.map +1 -1
- package/dist/websocket/websocket-server.js +25 -20
- package/dist/websocket/websocket-server.js.map +2 -2
- package/dist/websocket/websocket-service.d.ts +2 -2
- package/dist/websocket/websocket-service.d.ts.map +1 -1
- package/dist/websocket/websocket-service.js +1 -1
- package/dist/websocket/websocket-service.js.map +2 -2
- package/dist/websocket/websocket.interface.d.ts +3 -5
- package/dist/websocket/websocket.interface.d.ts.map +1 -1
- package/dist/websocket/websocket.interface.js.map +2 -2
- package/package.json +68 -64
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/performance/performance-monitor.ts"],
|
|
4
|
-
"sourcesContent": ["import { PerformanceObserver, performance } from 'perf_hooks';\nimport { Logger } from '../logger/index.js';\nimport { safeSerializeError } from '../error/error-reporter.js';\n\nexport interface PerformanceMetrics {\n name: string;\n duration: number;\n timestamp: number;\n type: 'http' | 'database' | 'cache' | 'queue' | 'websocket' | 'custom';\n metadata?: Record<string, any>;\n}\n\nexport interface PerformanceThresholds {\n http: number;\n database: number;\n cache: number;\n queue: number;\n websocket: number;\n custom: number;\n}\n\nexport interface PerformanceMonitorOptions {\n enabled?: boolean;\n maxMetricsHistory?: number;\n thresholds?: Partial<PerformanceThresholds>;\n logSlowOperations?: boolean;\n logAllOperations?: boolean;\n}\n\nexport class PerformanceMonitor {\n private static instance: PerformanceMonitor;\n private observer: PerformanceObserver | undefined;\n private metrics: PerformanceMetrics[] = [];\n // Use Map for aggregation to avoid object prototype risks\n // (No external exposure, but satisfies security linter by avoiding dynamic object keys)\n private thresholds: PerformanceThresholds = {\n http: 1000, // 1 second\n database: 500, // 500ms\n cache: 100, // 100ms\n queue: 2000, // 2 seconds\n websocket: 200, // 200ms\n custom: 1000, // 1 second\n };\n private maxMetricsHistory = 10000;\n private isEnabled = true;\n private logSlowOperations = true;\n private logAllOperations = false;\n\n private constructor(options: PerformanceMonitorOptions = {}) {\n this.isEnabled = options.enabled ?? true;\n this.maxMetricsHistory = options.maxMetricsHistory ?? 10000;\n this.logSlowOperations = options.logSlowOperations ?? true;\n this.logAllOperations = options.logAllOperations ?? false;\n\n if (options.thresholds) {\n this.thresholds = { ...this.thresholds, ...options.thresholds };\n }\n\n if (this.isEnabled) {\n this.initializeObserver();\n }\n }\n\n public static getInstance(options?: PerformanceMonitorOptions): PerformanceMonitor {\n if (!PerformanceMonitor.instance) {\n PerformanceMonitor.instance = new PerformanceMonitor(options);\n }\n return PerformanceMonitor.instance;\n }\n\n public static initialize(options: PerformanceMonitorOptions = {}): PerformanceMonitor {\n PerformanceMonitor.instance = new PerformanceMonitor(options);\n return PerformanceMonitor.instance;\n }\n\n private initializeObserver(): void {\n this.observer = new PerformanceObserver(items => {\n items.getEntries().forEach(entry => {\n if (entry.name.startsWith('pxl-performance:')) {\n this.handlePerformanceEntry(entry);\n }\n });\n });\n\n this.observer.observe({ entryTypes: ['measure'] });\n }\n\n private handlePerformanceEntry(entry: any): void {\n if (!this.isEnabled) return;\n\n const [, type, name] = entry.name.split(':');\n const metricType = type as PerformanceMetrics['type'];\n\n const metric: PerformanceMetrics = {\n name,\n duration: entry.duration,\n timestamp: Date.now(),\n type: metricType,\n metadata: entry.detail,\n };\n\n this.metrics.push(metric);\n\n // Keep only the most recent metrics\n if (this.metrics.length > this.maxMetricsHistory) {\n this.metrics = this.metrics.slice(-this.maxMetricsHistory);\n }\n\n // Check thresholds and log warnings\n const allowedTypes: PerformanceMetrics['type'][] = ['http', 'database', 'cache', 'queue', 'websocket', 'custom'];\n if (!allowedTypes.includes(metricType)) {\n return;\n }\n // Access threshold via explicit switch to avoid dynamic key access warnings\n let threshold: number;\n switch (metricType) {\n case 'http':\n threshold = this.thresholds.http;\n break;\n case 'database':\n threshold = this.thresholds.database;\n break;\n case 'cache':\n threshold = this.thresholds.cache;\n break;\n case 'queue':\n threshold = this.thresholds.queue;\n break;\n case 'websocket':\n threshold = this.thresholds.websocket;\n break;\n case 'custom':\n threshold = this.thresholds.custom;\n break;\n default:\n threshold = 0; // Should not happen due to earlier filtering\n }\n if (this.logSlowOperations && entry.duration > threshold) {\n Logger.warn({\n message: `Performance threshold exceeded`,\n meta: {\n operation: entry.name,\n duration: `${entry.duration.toFixed(2)}ms`,\n threshold: `${threshold}ms`,\n type: metricType,\n },\n });\n }\n\n // Log all operations if enabled\n if (this.logAllOperations) {\n Logger.debug({\n message: `Performance metric`,\n meta: {\n operation: entry.name,\n duration: `${entry.duration.toFixed(2)}ms`,\n type: metricType,\n },\n });\n }\n }\n\n public startMeasure(name: string, type: PerformanceMetrics['type'] = 'custom'): string {\n if (!this.isEnabled) return '';\n\n const measureName = `pxl-performance:${type}:${name}`;\n const startMark = `${measureName}-start`;\n\n performance.mark(startMark);\n return startMark;\n }\n\n public endMeasure(startMark: string, _metadata?: Record<string, any>): void {\n if (!this.isEnabled || !startMark) return;\n\n const endMark = `${startMark.replace('-start', '')}-end`;\n const measureName = startMark.replace('-start', '');\n\n performance.mark(endMark);\n\n try {\n performance.measure(measureName, startMark, endMark);\n\n // Clean up marks\n performance.clearMarks(startMark);\n performance.clearMarks(endMark);\n } catch (error) {\n Logger.error({\n error: error instanceof Error ? error : new Error(safeSerializeError(error)),\n message: 'Error measuring performance',\n });\n }\n }\n\n public async measureAsync<T>({\n name,\n type,\n fn,\n metadata,\n }: {\n name: string;\n type: PerformanceMetrics['type'];\n fn: () => Promise<T>;\n metadata?: Record<string, any>;\n }): Promise<T> {\n if (!this.isEnabled) {\n return fn();\n }\n\n const startMark = this.startMeasure(name, type);\n\n try {\n const result = await fn();\n this.endMeasure(startMark, metadata);\n return result;\n } catch (error) {\n this.endMeasure(startMark, {\n ...metadata,\n error: error instanceof Error ? error.message : safeSerializeError(error),\n });\n throw error;\n }\n }\n\n public measureSync<T>(\n name: string,\n type: PerformanceMetrics['type'],\n fn: () => T,\n metadata?: Record<string, any>,\n ): T {\n if (!this.isEnabled) {\n return fn();\n }\n\n const startMark = this.startMeasure(name, type);\n\n try {\n const result = fn();\n this.endMeasure(startMark, metadata);\n return result;\n } catch (error) {\n this.endMeasure(startMark, {\n ...metadata,\n error: error instanceof Error ? error.message : safeSerializeError(error),\n });\n throw error;\n }\n }\n\n public getMetrics(type?: PerformanceMetrics['type'], limit?: number): PerformanceMetrics[] {\n let filteredMetrics = this.metrics;\n\n if (type) {\n filteredMetrics = filteredMetrics.filter(m => m.type === type);\n }\n\n if (limit) {\n filteredMetrics = filteredMetrics.slice(-limit);\n }\n\n return filteredMetrics;\n }\n\n public getAverageMetrics(type?: PerformanceMetrics['type']): Record<string, number> {\n const metrics = this.getMetrics(type);\n const groups = new Map<string, number[]>();\n for (const metric of metrics) {\n const key = metric.name;\n const arr = groups.get(key) ?? [];\n arr.push(metric.duration);\n if (!groups.has(key)) groups.set(key, arr);\n }\n const averagesMap = new Map<string, number>();\n for (const [key, durations] of groups.entries()) {\n const total = durations.reduce((sum, d) => sum + d, 0);\n averagesMap.set(key, total / durations.length);\n }\n // Convert back to plain object for API compatibility\n return Array.from(averagesMap.entries()).reduce<Record<string, number>>((acc, [k, v]) => {\n if (typeof k === 'string') {\n Object.defineProperty(acc, k, { value: v, enumerable: true, configurable: true, writable: false });\n }\n return acc;\n }, Object.create(null));\n }\n\n public getMemoryUsage(): NodeJS.MemoryUsage {\n return process.memoryUsage();\n }\n\n public getDetailedMemoryUsage(): Record<string, number> {\n const usage = process.memoryUsage();\n return {\n rss: Math.round(usage.rss / 1024 / 1024), // MB\n heapTotal: Math.round(usage.heapTotal / 1024 / 1024), // MB\n heapUsed: Math.round(usage.heapUsed / 1024 / 1024), // MB\n external: Math.round(usage.external / 1024 / 1024), // MB\n arrayBuffers: Math.round(usage.arrayBuffers / 1024 / 1024), // MB\n };\n }\n\n public getCpuUsage(): NodeJS.CpuUsage {\n return process.cpuUsage();\n }\n\n public setThresholds(thresholds: Partial<PerformanceThresholds>): void {\n this.thresholds = { ...this.thresholds, ...thresholds };\n }\n\n public setEnabled(enabled: boolean): void {\n this.isEnabled = enabled;\n\n if (enabled && !this.observer) {\n this.initializeObserver();\n } else if (!enabled && this.observer) {\n this.observer.disconnect();\n this.observer = undefined;\n }\n }\n\n public clearMetrics(): void {\n this.metrics = [];\n }\n\n public generateReport(): {\n summary: {\n totalMetrics: number;\n averages: Record<string, number>;\n thresholds: PerformanceThresholds;\n enabled: boolean;\n };\n metrics: PerformanceMetrics[];\n memory: Record<string, number>;\n cpu: NodeJS.CpuUsage;\n } {\n return {\n summary: {\n totalMetrics: this.metrics.length,\n averages: this.getAverageMetrics(),\n thresholds: this.thresholds,\n enabled: this.isEnabled,\n },\n metrics: this.getMetrics(undefined, 100), // Last 100 metrics\n memory: this.getDetailedMemoryUsage(),\n cpu: this.getCpuUsage(),\n };\n }\n\n public generateFormattedReport(format: 'simple' | 'detailed' = 'detailed'): string {\n const report = this.generateReport();\n\n if (format === 'simple') {\n const memoryUsed = report.memory.heapUsed;\n const cpuPercent = Math.round((report.cpu.user + report.cpu.system) / 1000000); // Convert microseconds to rough percentage\n const avgDurations = Object.values(report.summary.averages);\n const avgMetric =\n avgDurations.length > 0 ? Math.round(avgDurations.reduce((sum, val) => sum + val, 0) / avgDurations.length) : 0;\n\n return `Performance Report (summary: ${report.summary.totalMetrics} ops, avg: ${avgMetric}ms | metrics: ${report.metrics.length} | memory: ${memoryUsed}mb | cpu: ${cpuPercent}%)`;\n }\n const lines = [\n 'Performance Report:',\n `Summary: ${report.summary.totalMetrics} operations tracked, enabled: ${report.summary.enabled}`,\n `Metrics: ${report.metrics.length} recent operations recorded`,\n `Memory: RSS: ${report.memory.rss}mb, Heap: ${report.memory.heapUsed}/${report.memory.heapTotal}mb`,\n `CPU: User: ${Math.round(report.cpu.user / 1000)}ms, System: ${Math.round(report.cpu.system / 1000)}ms`,\n ];\n\n if (Object.keys(report.summary.averages).length > 0) {\n lines.push(\n `Averages: ${Object.entries(report.summary.averages)\n .map(([name, avg]) => `${name}: ${Math.round(avg)}ms`)\n .join(', ')}`,\n );\n }\n\n return lines.join('\\n');\n }\n\n public destroy(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = undefined;\n }\n this.metrics = [];\n }\n}\n"],
|
|
5
|
-
"mappings": ";;AAAA,SAAS,qBAAqB,mBAAmB;AACjD,SAAS,
|
|
4
|
+
"sourcesContent": ["import { PerformanceObserver, performance } from 'node:perf_hooks';\nimport { safeSerializeError } from '../error/error-reporter.js';\nimport { Logger } from '../logger/index.js';\n\nexport interface PerformanceMetrics {\n name: string;\n duration: number;\n timestamp: number;\n type: 'http' | 'database' | 'cache' | 'queue' | 'websocket' | 'custom';\n metadata?: Record<string, any>;\n}\n\nexport interface PerformanceThresholds {\n http: number;\n database: number;\n cache: number;\n queue: number;\n websocket: number;\n custom: number;\n}\n\nexport interface PerformanceMonitorOptions {\n enabled?: boolean;\n maxMetricsHistory?: number;\n thresholds?: Partial<PerformanceThresholds>;\n logSlowOperations?: boolean;\n logAllOperations?: boolean;\n}\n\nexport class PerformanceMonitor {\n private static instance: PerformanceMonitor;\n private observer: PerformanceObserver | undefined;\n private metrics: PerformanceMetrics[] = [];\n // Use Map for aggregation to avoid object prototype risks\n // (No external exposure, but satisfies security linter by avoiding dynamic object keys)\n private thresholds: PerformanceThresholds = {\n http: 1000, // 1 second\n database: 500, // 500ms\n cache: 100, // 100ms\n queue: 2000, // 2 seconds\n websocket: 200, // 200ms\n custom: 1000, // 1 second\n };\n private maxMetricsHistory = 10000;\n private isEnabled = true;\n private logSlowOperations = true;\n private logAllOperations = false;\n\n private constructor(options: PerformanceMonitorOptions = {}) {\n this.isEnabled = options.enabled ?? true;\n this.maxMetricsHistory = options.maxMetricsHistory ?? 10000;\n this.logSlowOperations = options.logSlowOperations ?? true;\n this.logAllOperations = options.logAllOperations ?? false;\n\n if (options.thresholds) {\n this.thresholds = { ...this.thresholds, ...options.thresholds };\n }\n\n if (this.isEnabled) {\n this.initializeObserver();\n }\n }\n\n public static getInstance(options?: PerformanceMonitorOptions): PerformanceMonitor {\n if (!PerformanceMonitor.instance) {\n PerformanceMonitor.instance = new PerformanceMonitor(options);\n }\n return PerformanceMonitor.instance;\n }\n\n public static initialize(options: PerformanceMonitorOptions = {}): PerformanceMonitor {\n PerformanceMonitor.instance = new PerformanceMonitor(options);\n return PerformanceMonitor.instance;\n }\n\n private initializeObserver(): void {\n this.observer = new PerformanceObserver(items => {\n items.getEntries().forEach(entry => {\n if (entry.name.startsWith('pxl-performance:')) {\n this.handlePerformanceEntry(entry);\n }\n });\n });\n\n this.observer.observe({ entryTypes: ['measure'] });\n }\n\n private handlePerformanceEntry(entry: any): void {\n if (!this.isEnabled) return;\n\n const [, type, name] = entry.name.split(':');\n const metricType = type as PerformanceMetrics['type'];\n\n const metric: PerformanceMetrics = {\n name,\n duration: entry.duration,\n timestamp: Date.now(),\n type: metricType,\n metadata: entry.detail,\n };\n\n this.metrics.push(metric);\n\n // Keep only the most recent metrics\n if (this.metrics.length > this.maxMetricsHistory) {\n this.metrics = this.metrics.slice(-this.maxMetricsHistory);\n }\n\n // Check thresholds and log warnings\n const allowedTypes: PerformanceMetrics['type'][] = ['http', 'database', 'cache', 'queue', 'websocket', 'custom'];\n if (!allowedTypes.includes(metricType)) {\n return;\n }\n // Access threshold via explicit switch to avoid dynamic key access warnings\n let threshold: number;\n switch (metricType) {\n case 'http':\n threshold = this.thresholds.http;\n break;\n case 'database':\n threshold = this.thresholds.database;\n break;\n case 'cache':\n threshold = this.thresholds.cache;\n break;\n case 'queue':\n threshold = this.thresholds.queue;\n break;\n case 'websocket':\n threshold = this.thresholds.websocket;\n break;\n case 'custom':\n threshold = this.thresholds.custom;\n break;\n default:\n threshold = 0; // Should not happen due to earlier filtering\n }\n if (this.logSlowOperations && entry.duration > threshold) {\n Logger.warn({\n message: `Performance threshold exceeded`,\n meta: {\n operation: entry.name,\n duration: `${entry.duration.toFixed(2)}ms`,\n threshold: `${threshold}ms`,\n type: metricType,\n },\n });\n }\n\n // Log all operations if enabled\n if (this.logAllOperations) {\n Logger.debug({\n message: `Performance metric`,\n meta: {\n operation: entry.name,\n duration: `${entry.duration.toFixed(2)}ms`,\n type: metricType,\n },\n });\n }\n }\n\n public startMeasure(name: string, type: PerformanceMetrics['type'] = 'custom'): string {\n if (!this.isEnabled) return '';\n\n const measureName = `pxl-performance:${type}:${name}`;\n const startMark = `${measureName}-start`;\n\n performance.mark(startMark);\n return startMark;\n }\n\n public endMeasure(startMark: string, _metadata?: Record<string, any>): void {\n if (!this.isEnabled || !startMark) return;\n\n const endMark = `${startMark.replace('-start', '')}-end`;\n const measureName = startMark.replace('-start', '');\n\n performance.mark(endMark);\n\n try {\n performance.measure(measureName, startMark, endMark);\n\n // Clean up marks\n performance.clearMarks(startMark);\n performance.clearMarks(endMark);\n } catch (error) {\n Logger.error({\n error: error instanceof Error ? error : new Error(safeSerializeError(error)),\n message: 'Error measuring performance',\n });\n }\n }\n\n public async measureAsync<T>({\n name,\n type,\n fn,\n metadata,\n }: {\n name: string;\n type: PerformanceMetrics['type'];\n fn: () => Promise<T>;\n metadata?: Record<string, any>;\n }): Promise<T> {\n if (!this.isEnabled) {\n return fn();\n }\n\n const startMark = this.startMeasure(name, type);\n\n try {\n const result = await fn();\n this.endMeasure(startMark, metadata);\n return result;\n } catch (error) {\n this.endMeasure(startMark, {\n ...metadata,\n error: error instanceof Error ? error.message : safeSerializeError(error),\n });\n throw error;\n }\n }\n\n public measureSync<T>(\n name: string,\n type: PerformanceMetrics['type'],\n fn: () => T,\n metadata?: Record<string, any>,\n ): T {\n if (!this.isEnabled) {\n return fn();\n }\n\n const startMark = this.startMeasure(name, type);\n\n try {\n const result = fn();\n this.endMeasure(startMark, metadata);\n return result;\n } catch (error) {\n this.endMeasure(startMark, {\n ...metadata,\n error: error instanceof Error ? error.message : safeSerializeError(error),\n });\n throw error;\n }\n }\n\n public getMetrics(type?: PerformanceMetrics['type'], limit?: number): PerformanceMetrics[] {\n let filteredMetrics = this.metrics;\n\n if (type) {\n filteredMetrics = filteredMetrics.filter(m => m.type === type);\n }\n\n if (limit) {\n filteredMetrics = filteredMetrics.slice(-limit);\n }\n\n return filteredMetrics;\n }\n\n public getAverageMetrics(type?: PerformanceMetrics['type']): Record<string, number> {\n const metrics = this.getMetrics(type);\n const groups = new Map<string, number[]>();\n for (const metric of metrics) {\n const key = metric.name;\n const arr = groups.get(key) ?? [];\n arr.push(metric.duration);\n if (!groups.has(key)) groups.set(key, arr);\n }\n const averagesMap = new Map<string, number>();\n for (const [key, durations] of groups.entries()) {\n const total = durations.reduce((sum, d) => sum + d, 0);\n averagesMap.set(key, total / durations.length);\n }\n // Convert back to plain object for API compatibility\n return Array.from(averagesMap.entries()).reduce<Record<string, number>>((acc, [k, v]) => {\n if (typeof k === 'string') {\n Object.defineProperty(acc, k, { value: v, enumerable: true, configurable: true, writable: false });\n }\n return acc;\n }, Object.create(null));\n }\n\n public getMemoryUsage(): NodeJS.MemoryUsage {\n return process.memoryUsage();\n }\n\n public getDetailedMemoryUsage(): Record<string, number> {\n const usage = process.memoryUsage();\n return {\n rss: Math.round(usage.rss / 1024 / 1024), // MB\n heapTotal: Math.round(usage.heapTotal / 1024 / 1024), // MB\n heapUsed: Math.round(usage.heapUsed / 1024 / 1024), // MB\n external: Math.round(usage.external / 1024 / 1024), // MB\n arrayBuffers: Math.round(usage.arrayBuffers / 1024 / 1024), // MB\n };\n }\n\n public getCpuUsage(): NodeJS.CpuUsage {\n return process.cpuUsage();\n }\n\n public setThresholds(thresholds: Partial<PerformanceThresholds>): void {\n this.thresholds = { ...this.thresholds, ...thresholds };\n }\n\n public setEnabled(enabled: boolean): void {\n this.isEnabled = enabled;\n\n if (enabled && !this.observer) {\n this.initializeObserver();\n } else if (!enabled && this.observer) {\n this.observer.disconnect();\n this.observer = undefined;\n }\n }\n\n public clearMetrics(): void {\n this.metrics = [];\n }\n\n public generateReport(): {\n summary: {\n totalMetrics: number;\n averages: Record<string, number>;\n thresholds: PerformanceThresholds;\n enabled: boolean;\n };\n metrics: PerformanceMetrics[];\n memory: Record<string, number>;\n cpu: NodeJS.CpuUsage;\n } {\n return {\n summary: {\n totalMetrics: this.metrics.length,\n averages: this.getAverageMetrics(),\n thresholds: this.thresholds,\n enabled: this.isEnabled,\n },\n metrics: this.getMetrics(undefined, 100), // Last 100 metrics\n memory: this.getDetailedMemoryUsage(),\n cpu: this.getCpuUsage(),\n };\n }\n\n public generateFormattedReport(format: 'simple' | 'detailed' = 'detailed'): string {\n const report = this.generateReport();\n\n if (format === 'simple') {\n const memoryUsed = report.memory.heapUsed;\n const cpuPercent = Math.round((report.cpu.user + report.cpu.system) / 1000000); // Convert microseconds to rough percentage\n const avgDurations = Object.values(report.summary.averages);\n const avgMetric =\n avgDurations.length > 0 ? Math.round(avgDurations.reduce((sum, val) => sum + val, 0) / avgDurations.length) : 0;\n\n return `Performance Report (summary: ${report.summary.totalMetrics} ops, avg: ${avgMetric}ms | metrics: ${report.metrics.length} | memory: ${memoryUsed}mb | cpu: ${cpuPercent}%)`;\n }\n const lines = [\n 'Performance Report:',\n `Summary: ${report.summary.totalMetrics} operations tracked, enabled: ${report.summary.enabled}`,\n `Metrics: ${report.metrics.length} recent operations recorded`,\n `Memory: RSS: ${report.memory.rss}mb, Heap: ${report.memory.heapUsed}/${report.memory.heapTotal}mb`,\n `CPU: User: ${Math.round(report.cpu.user / 1000)}ms, System: ${Math.round(report.cpu.system / 1000)}ms`,\n ];\n\n if (Object.keys(report.summary.averages).length > 0) {\n lines.push(\n `Averages: ${Object.entries(report.summary.averages)\n .map(([name, avg]) => `${name}: ${Math.round(avg)}ms`)\n .join(', ')}`,\n );\n }\n\n return lines.join('\\n');\n }\n\n public destroy(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = undefined;\n }\n this.metrics = [];\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performance-monitor.plugin.d.ts","sourceRoot":"","sources":["../../src/performance/performance-monitor.plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,eAAe,MAAM,oCAAoC,CAAC;AAKtE;;;;;;;;;GASG;AACH,qBAAa,wBAAwB;IAIf,OAAO,CAAC,QAAQ,CAAC,GAAG;IAHxC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAyB;IAEhD,OAAO;IAEP,kDAAkD;WACpC,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,wBAAwB;IAQtE,+CAA+C;IACxC,KAAK,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"performance-monitor.plugin.d.ts","sourceRoot":"","sources":["../../src/performance/performance-monitor.plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,eAAe,MAAM,oCAAoC,CAAC;AAKtE;;;;;;;;;GASG;AACH,qBAAa,wBAAwB;IAIf,OAAO,CAAC,QAAQ,CAAC,GAAG;IAHxC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAyB;IAEhD,OAAO;IAEP,kDAAkD;WACpC,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,wBAAwB;IAQtE,+CAA+C;IACxC,KAAK,IAAI,IAAI;IA2DpB,yCAAyC;IAClC,IAAI,IAAI,IAAI;CAmBpB"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
3
|
import { Logger } from "../logger/index.js";
|
|
4
|
-
import { PerformanceMonitor } from "./performance-monitor.js";
|
|
5
4
|
import { CachePerformanceWrapper, DatabasePerformanceWrapper, QueuePerformanceWrapper } from "./index.js";
|
|
5
|
+
import { PerformanceMonitor } from "./performance-monitor.js";
|
|
6
6
|
class PerformanceMonitorPlugin {
|
|
7
7
|
constructor(app) {
|
|
8
8
|
this.app = app;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/performance/performance-monitor.plugin.ts"],
|
|
4
|
-
"sourcesContent": ["import type BaseApplication from '../application/base-application.js';\nimport { Logger } from '../logger/index.js';\nimport {
|
|
5
|
-
"mappings": ";;AACA,SAAS,cAAc;AACvB,SAAS,
|
|
4
|
+
"sourcesContent": ["import type BaseApplication from '../application/base-application.js';\nimport { Logger } from '../logger/index.js';\nimport { CachePerformanceWrapper, DatabasePerformanceWrapper, QueuePerformanceWrapper } from './index.js';\nimport { PerformanceMonitor, type PerformanceMonitorOptions } from './performance-monitor.js';\n\n/**\n * PerformanceMonitorPlugin\n *\n * Converts the previous side-effect constructor initialization into an opt\u2011in plugin.\n * Responsibilities:\n * - Initialize PerformanceMonitor when enabled in config\n * - Register metric wrappers (DB / Queue / Cache) based on flags\n * - Schedule periodic reporting (tracked via lifecycle for auto cleanup)\n * - Dispose monitor on shutdown\n */\nexport class PerformanceMonitorPlugin {\n private started = false;\n private abortController = new AbortController();\n\n private constructor(private readonly app: BaseApplication) {}\n\n /** Register and immediately start (idempotent) */\n public static register(app: BaseApplication): PerformanceMonitorPlugin {\n const plugin = new PerformanceMonitorPlugin(app);\n plugin.start();\n // Ensure cleanup on shutdown\n app.lifecycle.onShutdown(async () => plugin.stop());\n return plugin;\n }\n\n /** Initialize monitor & ancillary behaviors */\n public start(): void {\n if (this.started) return;\n // biome-ignore lint/complexity/useLiteralKeys: bracket notation bypasses protected access on BaseApplication.config\n const cfg = this.app['config'].performanceMonitoring;\n if (!cfg?.enabled) {\n Logger.debug({ message: 'PerformanceMonitorPlugin: disabled via configuration' });\n return; // remain not started\n }\n\n const options: PerformanceMonitorOptions = {\n enabled: true,\n thresholds: cfg.thresholds,\n maxMetricsHistory: cfg.maxMetricsHistory,\n logSlowOperations: cfg.logSlowOperations,\n logAllOperations: cfg.logAllOperations,\n };\n\n this.app.performanceMonitor = PerformanceMonitor.initialize(options);\n\n // Register component wrappers according to config\n try {\n if (cfg.monitorDatabaseOperations !== false) {\n DatabasePerformanceWrapper.setPerformanceMonitor(this.app.performanceMonitor);\n }\n if (cfg.monitorQueueOperations !== false) {\n QueuePerformanceWrapper.setPerformanceMonitor(this.app.performanceMonitor);\n }\n if (cfg.monitorCacheOperations !== false) {\n CachePerformanceWrapper.setPerformanceMonitor(this.app.performanceMonitor);\n }\n } catch (error) {\n Logger.warn({ message: 'PerformanceMonitorPlugin: error configuring wrappers', error });\n }\n\n // Periodic reporting\n if (cfg.reportInterval && cfg.reportInterval > 0) {\n // Note: setInterval with signal option requires Node.js 15+\n // TypeScript types may not reflect this, so we use type assertion\n (setInterval as (fn: () => void, ms: number, options?: { signal: AbortSignal }) => NodeJS.Timeout)(\n () => {\n try {\n const reportFormat = cfg.reportFormat ?? 'detailed';\n const report = this.app.performanceMonitor?.generateFormattedReport(reportFormat);\n if (report) {\n Logger.info({ message: report });\n }\n } catch (error) {\n Logger.warn({ message: 'PerformanceMonitorPlugin: failed generating report', error });\n }\n },\n cfg.reportInterval,\n { signal: this.abortController.signal },\n );\n }\n\n this.started = true;\n Logger.debug({ message: 'PerformanceMonitorPlugin: started' });\n }\n\n /** Destroy monitor & clear references */\n public stop(): void {\n if (!this.started) return;\n\n // Abort all ongoing operations (intervals, etc.)\n this.abortController.abort();\n\n try {\n this.app.performanceMonitor?.destroy();\n } catch (error) {\n Logger.warn({ message: 'PerformanceMonitorPlugin: error during destroy', error });\n }\n this.app.performanceMonitor = undefined;\n\n // Create new AbortController for potential restart\n this.abortController = new AbortController();\n\n this.started = false;\n Logger.debug({ message: 'PerformanceMonitorPlugin: stopped' });\n }\n}\n"],
|
|
5
|
+
"mappings": ";;AACA,SAAS,cAAc;AACvB,SAAS,yBAAyB,4BAA4B,+BAA+B;AAC7F,SAAS,0BAA0D;AAY5D,MAAM,yBAAyB;AAAA,EAI5B,YAA6B,KAAsB;AAAtB;AAAA,EAAuB;AAAA,EAnB9D,OAesC;AAAA;AAAA;AAAA,EAC5B,UAAU;AAAA,EACV,kBAAkB,IAAI,gBAAgB;AAAA;AAAA,EAK9C,OAAc,SAAS,KAAgD;AACrE,UAAM,SAAS,IAAI,yBAAyB,GAAG;AAC/C,WAAO,MAAM;AAEb,QAAI,UAAU,WAAW,YAAY,OAAO,KAAK,CAAC;AAClD,WAAO;AAAA,EACT;AAAA;AAAA,EAGO,QAAc;AACnB,QAAI,KAAK,QAAS;AAElB,UAAM,MAAM,KAAK,IAAI,QAAQ,EAAE;AAC/B,QAAI,CAAC,KAAK,SAAS;AACjB,aAAO,MAAM,EAAE,SAAS,uDAAuD,CAAC;AAChF;AAAA,IACF;AAEA,UAAM,UAAqC;AAAA,MACzC,SAAS;AAAA,MACT,YAAY,IAAI;AAAA,MAChB,mBAAmB,IAAI;AAAA,MACvB,mBAAmB,IAAI;AAAA,MACvB,kBAAkB,IAAI;AAAA,IACxB;AAEA,SAAK,IAAI,qBAAqB,mBAAmB,WAAW,OAAO;AAGnE,QAAI;AACF,UAAI,IAAI,8BAA8B,OAAO;AAC3C,mCAA2B,sBAAsB,KAAK,IAAI,kBAAkB;AAAA,MAC9E;AACA,UAAI,IAAI,2BAA2B,OAAO;AACxC,gCAAwB,sBAAsB,KAAK,IAAI,kBAAkB;AAAA,MAC3E;AACA,UAAI,IAAI,2BAA2B,OAAO;AACxC,gCAAwB,sBAAsB,KAAK,IAAI,kBAAkB;AAAA,MAC3E;AAAA,IACF,SAAS,OAAO;AACd,aAAO,KAAK,EAAE,SAAS,wDAAwD,MAAM,CAAC;AAAA,IACxF;AAGA,QAAI,IAAI,kBAAkB,IAAI,iBAAiB,GAAG;AAGhD,MAAC;AAAA,QACC,MAAM;AACJ,cAAI;AACF,kBAAM,eAAe,IAAI,gBAAgB;AACzC,kBAAM,SAAS,KAAK,IAAI,oBAAoB,wBAAwB,YAAY;AAChF,gBAAI,QAAQ;AACV,qBAAO,KAAK,EAAE,SAAS,OAAO,CAAC;AAAA,YACjC;AAAA,UACF,SAAS,OAAO;AACd,mBAAO,KAAK,EAAE,SAAS,sDAAsD,MAAM,CAAC;AAAA,UACtF;AAAA,QACF;AAAA,QACA,IAAI;AAAA,QACJ,EAAE,QAAQ,KAAK,gBAAgB,OAAO;AAAA,MACxC;AAAA,IACF;AAEA,SAAK,UAAU;AACf,WAAO,MAAM,EAAE,SAAS,oCAAoC,CAAC;AAAA,EAC/D;AAAA;AAAA,EAGO,OAAa;AAClB,QAAI,CAAC,KAAK,QAAS;AAGnB,SAAK,gBAAgB,MAAM;AAE3B,QAAI;AACF,WAAK,IAAI,oBAAoB,QAAQ;AAAA,IACvC,SAAS,OAAO;AACd,aAAO,KAAK,EAAE,SAAS,kDAAkD,MAAM,CAAC;AAAA,IAClF;AACA,SAAK,IAAI,qBAAqB;AAG9B,SAAK,kBAAkB,IAAI,gBAAgB;AAE3C,SAAK,UAAU;AACf,WAAO,MAAM,EAAE,SAAS,oCAAoC,CAAC;AAAA,EAC/D;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-performance.d.ts","sourceRoot":"","sources":["../../src/performance/queue-performance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAqB;WAExC,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAItE,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAOpC;;OAEG;WACiB,oBAAoB,CAAC,CAAC,EACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAkBb;;OAEG;WACiB,kBAAkB,CAAC,CAAC,EACtC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAkBb;;OAEG;WACiB,qBAAqB,CAAC,CAAC,EACzC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,gBAAgB,CAAC,CAAC,EACpC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,aAAa,CAAC,CAAC,EACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAgBb;;OAEG;WACiB,eAAe,CAAC,CAAC,EACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;CAkBd;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"queue-performance.d.ts","sourceRoot":"","sources":["../../src/performance/queue-performance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAqB;WAExC,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAItE,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAOpC;;OAEG;WACiB,oBAAoB,CAAC,CAAC,EACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAkBb;;OAEG;WACiB,kBAAkB,CAAC,CAAC,EACtC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAkBb;;OAEG;WACiB,qBAAqB,CAAC,CAAC,EACzC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,gBAAgB,CAAC,CAAC,EACpC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,aAAa,CAAC,CAAC,EACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAgBb;;OAEG;WACiB,eAAe,CAAC,CAAC,EACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;CAkBd;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,CAAC,EAAE,MAAM,IAClD,QAAQ,GAAG,EAAE,aAAa,MAAM,EAAE,YAAY,kBAAkB,wBAezE"}
|
|
@@ -122,7 +122,7 @@ class QueuePerformanceWrapper {
|
|
|
122
122
|
}
|
|
123
123
|
}
|
|
124
124
|
function MonitorQueueProcessor(processorName) {
|
|
125
|
-
return
|
|
125
|
+
return (target, propertyKey, descriptor) => {
|
|
126
126
|
const originalMethod = descriptor.value;
|
|
127
127
|
const className = target.constructor.name;
|
|
128
128
|
const operation = processorName ?? propertyKey;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/performance/queue-performance.ts"],
|
|
4
|
-
"sourcesContent": ["import { PerformanceMonitor } from './performance-monitor.js';\n\nexport interface QueueOperationMetadata {\n operation: string;\n queueName?: string;\n jobName?: string;\n jobId?: string;\n priority?: number;\n delay?: number;\n attempts?: number;\n error?: string;\n argumentCount?: number;\n}\n\nexport class QueuePerformanceWrapper {\n private static performanceMonitor: PerformanceMonitor;\n\n public static setPerformanceMonitor(monitor: PerformanceMonitor): void {\n QueuePerformanceWrapper.performanceMonitor = monitor;\n }\n\n private static getPerformanceMonitor(): PerformanceMonitor {\n if (!QueuePerformanceWrapper.performanceMonitor) {\n QueuePerformanceWrapper.performanceMonitor = PerformanceMonitor.getInstance();\n }\n return QueuePerformanceWrapper.performanceMonitor;\n }\n\n /**\n * Monitor job processing\n */\n public static async monitorJobProcessing<T>(\n queueName: string,\n jobName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'job_processing',\n queueName,\n jobName,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `${queueName}.${jobName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor job addition to queue\n */\n public static async monitorJobAddition<T>(\n queueName: string,\n jobName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'job_addition',\n queueName,\n jobName,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `add.${queueName}.${jobName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor queue operations\n */\n public static async monitorQueueOperation<T>(\n queueName: string,\n operationName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: operationName,\n queueName,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `queue.${queueName}.${operationName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor processor execution\n */\n public static async monitorProcessor<T>(\n processorName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'processor_execution',\n jobName: processorName,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `processor.${processorName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor queue worker operations\n */\n public static async monitorWorker<T>(\n workerName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'worker_execution',\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `worker.${workerName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor job retry operations\n */\n public static async monitorJobRetry<T>(\n queueName: string,\n jobName: string,\n attempt: number,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'job_retry',\n queueName,\n jobName,\n attempts: attempt,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `retry.${queueName}.${jobName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n}\n\n/**\n * Decorator for monitoring queue processor methods\n */\nexport function MonitorQueueProcessor(processorName?: string) {\n return
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import { PerformanceMonitor } from './performance-monitor.js';\n\nexport interface QueueOperationMetadata {\n operation: string;\n queueName?: string;\n jobName?: string;\n jobId?: string;\n priority?: number;\n delay?: number;\n attempts?: number;\n error?: string;\n argumentCount?: number;\n}\n\nexport class QueuePerformanceWrapper {\n private static performanceMonitor: PerformanceMonitor;\n\n public static setPerformanceMonitor(monitor: PerformanceMonitor): void {\n QueuePerformanceWrapper.performanceMonitor = monitor;\n }\n\n private static getPerformanceMonitor(): PerformanceMonitor {\n if (!QueuePerformanceWrapper.performanceMonitor) {\n QueuePerformanceWrapper.performanceMonitor = PerformanceMonitor.getInstance();\n }\n return QueuePerformanceWrapper.performanceMonitor;\n }\n\n /**\n * Monitor job processing\n */\n public static async monitorJobProcessing<T>(\n queueName: string,\n jobName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'job_processing',\n queueName,\n jobName,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `${queueName}.${jobName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor job addition to queue\n */\n public static async monitorJobAddition<T>(\n queueName: string,\n jobName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'job_addition',\n queueName,\n jobName,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `add.${queueName}.${jobName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor queue operations\n */\n public static async monitorQueueOperation<T>(\n queueName: string,\n operationName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: operationName,\n queueName,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `queue.${queueName}.${operationName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor processor execution\n */\n public static async monitorProcessor<T>(\n processorName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'processor_execution',\n jobName: processorName,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `processor.${processorName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor queue worker operations\n */\n public static async monitorWorker<T>(\n workerName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'worker_execution',\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `worker.${workerName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor job retry operations\n */\n public static async monitorJobRetry<T>(\n queueName: string,\n jobName: string,\n attempt: number,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'job_retry',\n queueName,\n jobName,\n attempts: attempt,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `retry.${queueName}.${jobName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n}\n\n/**\n * Decorator for monitoring queue processor methods\n */\nexport function MonitorQueueProcessor(processorName?: string) {\n return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n const originalMethod = descriptor.value;\n const className = target.constructor.name;\n const operation = processorName ?? propertyKey;\n\n descriptor.value = async function (...args: any[]) {\n return QueuePerformanceWrapper.monitorProcessor(\n `${className}.${operation}`,\n () => originalMethod.apply(this, args),\n { argumentCount: args.length },\n );\n };\n\n return descriptor;\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webserver-performance.d.ts","sourceRoot":"","sources":["../../src/performance/webserver-performance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,2BAA2B;IAC1C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,2BAA2B;IACtC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAqB;WAExC,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAItE,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAOpC;;OAEG;WACW,2BAA2B,CAAC,OAAO,GAAE,2BAAgC,IAanE,SAAS,cAAc,EAAE,QAAQ,YAAY;IA0B7D;;OAEG;WACW,sBAAsB,CAAC,QAAQ,GAAE,2BAAgC;0BAInD,cAAc,SAAS,YAAY,WAAW,GAAG;2BAgBhD,cAAc,SAAS,YAAY,SAAS,KAAK;;IAkB9E;;OAEG;WACiB,uBAAuB,CAAC,CAAC,EAAE,EAC7C,cAAc,EACd,UAAU,EACV,SAAS,EACT,QAAQ,GACT,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,CAAC,CAAC;IAed;;OAEG;WACiB,mBAAmB,CAAC,CAAC,EAAE,EACzC,KAAK,EACL,MAAM,EACN,SAAS,EACT,QAAQ,GACT,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,CAAC,CAAC;IAWd;;OAEG;WACiB,iBAAiB,CAAC,CAAC,EAAE,EACvC,cAAc,EACd,SAAS,EACT,QAAQ,GACT,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,CAAC,CAAC;CAaf;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"webserver-performance.d.ts","sourceRoot":"","sources":["../../src/performance/webserver-performance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,2BAA2B;IAC1C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,2BAA2B;IACtC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAqB;WAExC,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAItE,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAOpC;;OAEG;WACW,2BAA2B,CAAC,OAAO,GAAE,2BAAgC,IAanE,SAAS,cAAc,EAAE,QAAQ,YAAY;IA0B7D;;OAEG;WACW,sBAAsB,CAAC,QAAQ,GAAE,2BAAgC;0BAInD,cAAc,SAAS,YAAY,WAAW,GAAG;2BAgBhD,cAAc,SAAS,YAAY,SAAS,KAAK;;IAkB9E;;OAEG;WACiB,uBAAuB,CAAC,CAAC,EAAE,EAC7C,cAAc,EACd,UAAU,EACV,SAAS,EACT,QAAQ,GACT,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,CAAC,CAAC;IAed;;OAEG;WACiB,mBAAmB,CAAC,CAAC,EAAE,EACzC,KAAK,EACL,MAAM,EACN,SAAS,EACT,QAAQ,GACT,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,CAAC,CAAC;IAWd;;OAEG;WACiB,iBAAiB,CAAC,CAAC,EAAE,EACvC,cAAc,EACd,SAAS,EACT,QAAQ,GACT,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,CAAC,CAAC;CAaf;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,CAAC,EAAE,MAAM,IACjD,QAAQ,GAAG,EAAE,aAAa,MAAM,EAAE,YAAY,kBAAkB,wBAgBzE"}
|
|
@@ -141,7 +141,7 @@ class WebServerPerformanceWrapper {
|
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
143
|
function MonitorControllerMethod(methodName) {
|
|
144
|
-
return
|
|
144
|
+
return (target, propertyKey, descriptor) => {
|
|
145
145
|
const originalMethod = descriptor.value;
|
|
146
146
|
const controllerName = target.constructor.name;
|
|
147
147
|
const operation = methodName ?? propertyKey;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/performance/webserver-performance.ts"],
|
|
4
|
-
"sourcesContent": ["import type { FastifyReply, FastifyRequest } from 'fastify';\nimport { PerformanceMonitor } from './performance-monitor.js';\n\nexport interface WebServerPerformanceOptions {\n logSlowRequests?: boolean;\n slowRequestThreshold?: number;\n includeHeaders?: boolean;\n includeUserAgent?: boolean;\n skipRoutes?: string[];\n skipMethods?: string[];\n}\n\nexport interface HttpRequestMetadata {\n method: string;\n url: string;\n ip?: string;\n userAgent?: string;\n headers?: Record<string, string | string[] | undefined>;\n statusCode?: number;\n contentLength?: number;\n error?: string;\n errorName?: string;\n argumentCount?: number;\n}\n\nexport class WebServerPerformanceWrapper {\n private static performanceMonitor: PerformanceMonitor;\n\n public static setPerformanceMonitor(monitor: PerformanceMonitor): void {\n WebServerPerformanceWrapper.performanceMonitor = monitor;\n }\n\n private static getPerformanceMonitor(): PerformanceMonitor {\n if (!WebServerPerformanceWrapper.performanceMonitor) {\n WebServerPerformanceWrapper.performanceMonitor = PerformanceMonitor.getInstance();\n }\n return WebServerPerformanceWrapper.performanceMonitor;\n }\n\n /**\n * Create performance middleware for Fastify\n */\n public static createPerformanceMiddleware(options: WebServerPerformanceOptions = {}) {\n const defaultOptions: WebServerPerformanceOptions = {\n logSlowRequests: true,\n slowRequestThreshold: 1000, // 1 second\n includeHeaders: false,\n includeUserAgent: true,\n skipRoutes: ['/health/live', '/health/ready', '/metrics'],\n skipMethods: [],\n };\n\n const config = { ...defaultOptions, ...options };\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return async (request: FastifyRequest, _reply: FastifyReply) => {\n const { method, url, headers, ip } = request;\n const routeKey = `${method} ${url}`;\n\n // Skip monitoring for specified routes or methods\n if (config.skipRoutes?.includes(url) || config.skipMethods?.includes(method)) {\n return;\n }\n\n const startMark = monitor.startMeasure(routeKey, 'http');\n\n // Add request metadata\n const metadata: HttpRequestMetadata = {\n method,\n url,\n ip,\n userAgent: config.includeUserAgent ? (headers['user-agent'] as string) : undefined,\n headers: config.includeHeaders ? headers : undefined,\n };\n\n // Store metadata on request for later use\n (request as any).performanceMetadata = metadata;\n (request as any).performanceStartMark = startMark;\n };\n }\n\n /**\n * Create Fastify hooks for performance monitoring\n */\n public static createPerformanceHooks(_options: WebServerPerformanceOptions = {}) {\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return {\n onSend: async (request: FastifyRequest, reply: FastifyReply, payload: any) => {\n const startMark = (request as any).performanceStartMark;\n const metadata = (request as any).performanceMetadata;\n\n if (startMark && metadata) {\n const responseMetadata: HttpRequestMetadata = {\n ...metadata,\n statusCode: reply.statusCode,\n contentLength: payload ? String(payload).length : 0,\n };\n\n monitor.endMeasure(startMark, responseMetadata);\n }\n\n return payload;\n },\n onError: async (request: FastifyRequest, reply: FastifyReply, error: Error) => {\n const startMark = (request as any).performanceStartMark;\n const metadata = (request as any).performanceMetadata;\n\n if (startMark && metadata) {\n const errorMetadata: HttpRequestMetadata = {\n ...metadata,\n statusCode: reply.statusCode,\n error: error.message,\n errorName: error.name,\n };\n\n monitor.endMeasure(startMark, errorMetadata);\n }\n },\n };\n }\n\n /**\n * Monitor controller method execution\n */\n public static async monitorControllerMethod<T>({\n controllerName,\n methodName,\n operation,\n metadata,\n }: {\n controllerName: string;\n methodName: string;\n operation: () => Promise<T>;\n metadata?: Record<string, any>;\n }): Promise<T> {\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return monitor.measureAsync({\n name: `${controllerName}.${methodName}`,\n type: 'http',\n fn: operation,\n metadata: {\n controller: controllerName,\n method: methodName,\n ...metadata,\n },\n });\n }\n\n /**\n * Monitor route handler execution\n */\n public static async monitorRouteHandler<T>({\n route,\n method,\n operation,\n metadata,\n }: {\n route: string;\n method: string;\n operation: () => Promise<T>;\n metadata?: Record<string, any>;\n }): Promise<T> {\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return monitor.measureAsync({\n name: `${method} ${route}`,\n type: 'http',\n fn: operation,\n metadata: { route, method, ...metadata },\n });\n }\n\n /**\n * Monitor middleware execution\n */\n public static async monitorMiddleware<T>({\n middlewareName,\n operation,\n metadata,\n }: {\n middlewareName: string;\n operation: () => Promise<T>;\n metadata?: Record<string, any>;\n }): Promise<T> {\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return monitor.measureAsync({\n name: `middleware.${middlewareName}`,\n type: 'http',\n fn: operation,\n metadata: {\n middleware: middlewareName,\n ...metadata,\n },\n });\n }\n}\n\n/**\n * Decorator for monitoring controller methods\n */\nexport function MonitorControllerMethod(methodName?: string) {\n return
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import type { FastifyReply, FastifyRequest } from 'fastify';\nimport { PerformanceMonitor } from './performance-monitor.js';\n\nexport interface WebServerPerformanceOptions {\n logSlowRequests?: boolean;\n slowRequestThreshold?: number;\n includeHeaders?: boolean;\n includeUserAgent?: boolean;\n skipRoutes?: string[];\n skipMethods?: string[];\n}\n\nexport interface HttpRequestMetadata {\n method: string;\n url: string;\n ip?: string;\n userAgent?: string;\n headers?: Record<string, string | string[] | undefined>;\n statusCode?: number;\n contentLength?: number;\n error?: string;\n errorName?: string;\n argumentCount?: number;\n}\n\nexport class WebServerPerformanceWrapper {\n private static performanceMonitor: PerformanceMonitor;\n\n public static setPerformanceMonitor(monitor: PerformanceMonitor): void {\n WebServerPerformanceWrapper.performanceMonitor = monitor;\n }\n\n private static getPerformanceMonitor(): PerformanceMonitor {\n if (!WebServerPerformanceWrapper.performanceMonitor) {\n WebServerPerformanceWrapper.performanceMonitor = PerformanceMonitor.getInstance();\n }\n return WebServerPerformanceWrapper.performanceMonitor;\n }\n\n /**\n * Create performance middleware for Fastify\n */\n public static createPerformanceMiddleware(options: WebServerPerformanceOptions = {}) {\n const defaultOptions: WebServerPerformanceOptions = {\n logSlowRequests: true,\n slowRequestThreshold: 1000, // 1 second\n includeHeaders: false,\n includeUserAgent: true,\n skipRoutes: ['/health/live', '/health/ready', '/metrics'],\n skipMethods: [],\n };\n\n const config = { ...defaultOptions, ...options };\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return async (request: FastifyRequest, _reply: FastifyReply) => {\n const { method, url, headers, ip } = request;\n const routeKey = `${method} ${url}`;\n\n // Skip monitoring for specified routes or methods\n if (config.skipRoutes?.includes(url) || config.skipMethods?.includes(method)) {\n return;\n }\n\n const startMark = monitor.startMeasure(routeKey, 'http');\n\n // Add request metadata\n const metadata: HttpRequestMetadata = {\n method,\n url,\n ip,\n userAgent: config.includeUserAgent ? (headers['user-agent'] as string) : undefined,\n headers: config.includeHeaders ? headers : undefined,\n };\n\n // Store metadata on request for later use\n (request as any).performanceMetadata = metadata;\n (request as any).performanceStartMark = startMark;\n };\n }\n\n /**\n * Create Fastify hooks for performance monitoring\n */\n public static createPerformanceHooks(_options: WebServerPerformanceOptions = {}) {\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return {\n onSend: async (request: FastifyRequest, reply: FastifyReply, payload: any) => {\n const startMark = (request as any).performanceStartMark;\n const metadata = (request as any).performanceMetadata;\n\n if (startMark && metadata) {\n const responseMetadata: HttpRequestMetadata = {\n ...metadata,\n statusCode: reply.statusCode,\n contentLength: payload ? String(payload).length : 0,\n };\n\n monitor.endMeasure(startMark, responseMetadata);\n }\n\n return payload;\n },\n onError: async (request: FastifyRequest, reply: FastifyReply, error: Error) => {\n const startMark = (request as any).performanceStartMark;\n const metadata = (request as any).performanceMetadata;\n\n if (startMark && metadata) {\n const errorMetadata: HttpRequestMetadata = {\n ...metadata,\n statusCode: reply.statusCode,\n error: error.message,\n errorName: error.name,\n };\n\n monitor.endMeasure(startMark, errorMetadata);\n }\n },\n };\n }\n\n /**\n * Monitor controller method execution\n */\n public static async monitorControllerMethod<T>({\n controllerName,\n methodName,\n operation,\n metadata,\n }: {\n controllerName: string;\n methodName: string;\n operation: () => Promise<T>;\n metadata?: Record<string, any>;\n }): Promise<T> {\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return monitor.measureAsync({\n name: `${controllerName}.${methodName}`,\n type: 'http',\n fn: operation,\n metadata: {\n controller: controllerName,\n method: methodName,\n ...metadata,\n },\n });\n }\n\n /**\n * Monitor route handler execution\n */\n public static async monitorRouteHandler<T>({\n route,\n method,\n operation,\n metadata,\n }: {\n route: string;\n method: string;\n operation: () => Promise<T>;\n metadata?: Record<string, any>;\n }): Promise<T> {\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return monitor.measureAsync({\n name: `${method} ${route}`,\n type: 'http',\n fn: operation,\n metadata: { route, method, ...metadata },\n });\n }\n\n /**\n * Monitor middleware execution\n */\n public static async monitorMiddleware<T>({\n middlewareName,\n operation,\n metadata,\n }: {\n middlewareName: string;\n operation: () => Promise<T>;\n metadata?: Record<string, any>;\n }): Promise<T> {\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return monitor.measureAsync({\n name: `middleware.${middlewareName}`,\n type: 'http',\n fn: operation,\n metadata: {\n middleware: middlewareName,\n ...metadata,\n },\n });\n }\n}\n\n/**\n * Decorator for monitoring controller methods\n */\nexport function MonitorControllerMethod(methodName?: string) {\n return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n const originalMethod = descriptor.value;\n const controllerName = target.constructor.name;\n const operation = methodName ?? propertyKey;\n\n descriptor.value = async function (...args: any[]) {\n return WebServerPerformanceWrapper.monitorControllerMethod({\n controllerName,\n methodName: operation,\n operation: () => originalMethod.apply(this, args),\n metadata: { argumentCount: args.length },\n });\n };\n\n return descriptor;\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-performance.d.ts","sourceRoot":"","sources":["../../src/performance/websocket-performance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,2BAA2B;IACtC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAqB;WAExC,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAItE,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAOpC;;OAEG;WACiB,sBAAsB,CAAC,CAAC,EAC1C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,iBAAiB,CAAC,CAAC,EACrC,mBAAmB,EAAE,MAAM,EAC3B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAgBb;;OAEG;WACiB,oBAAoB,CAAC,CAAC,EACxC,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,gBAAgB,CAAC,CAAC,EACpC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,qBAAqB,CAAC,CAAC,EACzC,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAgBb;;OAEG;WACiB,uBAAuB,CAAC,CAAC,EAC3C,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;CAed;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,aAAa,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"websocket-performance.d.ts","sourceRoot":"","sources":["../../src/performance/websocket-performance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,2BAA2B;IACtC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAqB;WAExC,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAItE,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAOpC;;OAEG;WACiB,sBAAsB,CAAC,CAAC,EAC1C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,iBAAiB,CAAC,CAAC,EACrC,mBAAmB,EAAE,MAAM,EAC3B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAgBb;;OAEG;WACiB,oBAAoB,CAAC,CAAC,EACxC,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,gBAAgB,CAAC,CAAC,EACpC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,qBAAqB,CAAC,CAAC,EACzC,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAgBb;;OAEG;WACiB,uBAAuB,CAAC,CAAC,EAC3C,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;CAed;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,aAAa,CAAC,EAAE,MAAM,IACtD,QAAQ,GAAG,EAAE,aAAa,MAAM,EAAE,YAAY,kBAAkB,wBAgBzE"}
|
|
@@ -116,7 +116,7 @@ class WebSocketPerformanceWrapper {
|
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
118
|
function MonitorWebSocketOperation(operationName) {
|
|
119
|
-
return
|
|
119
|
+
return (target, propertyKey, descriptor) => {
|
|
120
120
|
const originalMethod = descriptor.value;
|
|
121
121
|
const controllerName = target.constructor.name;
|
|
122
122
|
const operation = operationName ?? propertyKey;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/performance/websocket-performance.ts"],
|
|
4
|
-
"sourcesContent": ["import { PerformanceMonitor } from './performance-monitor.js';\n\nexport interface WebSocketOperationMetadata {\n operation: string;\n messageType?: string;\n messageSize?: number;\n clientId?: string;\n room?: string;\n error?: string;\n argumentCount?: number;\n}\n\nexport class WebSocketPerformanceWrapper {\n private static performanceMonitor: PerformanceMonitor;\n\n public static setPerformanceMonitor(monitor: PerformanceMonitor): void {\n WebSocketPerformanceWrapper.performanceMonitor = monitor;\n }\n\n private static getPerformanceMonitor(): PerformanceMonitor {\n if (!WebSocketPerformanceWrapper.performanceMonitor) {\n WebSocketPerformanceWrapper.performanceMonitor = PerformanceMonitor.getInstance();\n }\n return WebSocketPerformanceWrapper.performanceMonitor;\n }\n\n /**\n * Monitor WebSocket message handling\n */\n public static async monitorMessageHandling<T>(\n messageType: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: 'message_handling',\n messageType,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `message.${messageType}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor WebSocket connection operations\n */\n public static async monitorConnection<T>(\n connectionOperation: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: connectionOperation,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `connection.${connectionOperation}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor WebSocket room operations\n */\n public static async monitorRoomOperation<T>(\n roomOperation: string,\n room: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: roomOperation,\n room,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `room.${roomOperation}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor WebSocket broadcast operations\n */\n public static async monitorBroadcast<T>(\n broadcastType: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: 'broadcast',\n messageType: broadcastType,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `broadcast.${broadcastType}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor WebSocket authentication\n */\n public static async monitorAuthentication<T>(\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: 'authentication',\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: 'authentication',\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor controller method execution\n */\n public static async monitorControllerMethod<T>(\n controllerName: string,\n methodName: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: 'controller_method',\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `${controllerName}.${methodName}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n}\n\n/**\n * Decorator for monitoring WebSocket controller methods\n */\nexport function MonitorWebSocketOperation(operationName?: string) {\n return
|
|
5
|
-
"mappings": ";;AAAA,SAAS,0BAA0B;AAY5B,MAAM,4BAA4B;AAAA,EAZzC,OAYyC;AAAA;AAAA;AAAA,EACvC,OAAe;AAAA,EAEf,OAAc,sBAAsB,SAAmC;AACrE,gCAA4B,qBAAqB;AAAA,EACnD;AAAA,EAEA,OAAe,wBAA4C;AACzD,QAAI,CAAC,4BAA4B,oBAAoB;AACnD,kCAA4B,qBAAqB,mBAAmB,YAAY;AAAA,IAClF;AACA,WAAO,4BAA4B;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAoB,uBAClB,aACA,WACA,UACY;AACZ,UAAM,UAAU,4BAA4B,sBAAsB;AAElE,UAAM,oBAAgD;AAAA,MACpD,WAAW;AAAA,MACX;AAAA,MACA,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM,WAAW,WAAW;AAAA,MAC5B,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAoB,kBAClB,qBACA,WACA,UACY;AACZ,UAAM,UAAU,4BAA4B,sBAAsB;AAElE,UAAM,oBAAgD;AAAA,MACpD,WAAW;AAAA,MACX,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM,cAAc,mBAAmB;AAAA,MACvC,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAoB,qBAClB,eACA,MACA,WACA,UACY;AACZ,UAAM,UAAU,4BAA4B,sBAAsB;AAElE,UAAM,oBAAgD;AAAA,MACpD,WAAW;AAAA,MACX;AAAA,MACA,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM,QAAQ,aAAa;AAAA,MAC3B,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAoB,iBAClB,eACA,WACA,UACY;AACZ,UAAM,UAAU,4BAA4B,sBAAsB;AAElE,UAAM,oBAAgD;AAAA,MACpD,WAAW;AAAA,MACX,aAAa;AAAA,MACb,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM,aAAa,aAAa;AAAA,MAChC,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAoB,sBAClB,WACA,UACY;AACZ,UAAM,UAAU,4BAA4B,sBAAsB;AAElE,UAAM,oBAAgD;AAAA,MACpD,WAAW;AAAA,MACX,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAoB,wBAClB,gBACA,YACA,WACA,UACY;AACZ,UAAM,UAAU,4BAA4B,sBAAsB;AAElE,UAAM,oBAAgD;AAAA,MACpD,WAAW;AAAA,MACX,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM,GAAG,cAAc,IAAI,UAAU;AAAA,MACrC,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;AAKO,SAAS,0BAA0B,eAAwB;AAChE,SAAO,
|
|
4
|
+
"sourcesContent": ["import { PerformanceMonitor } from './performance-monitor.js';\n\nexport interface WebSocketOperationMetadata {\n operation: string;\n messageType?: string;\n messageSize?: number;\n clientId?: string;\n room?: string;\n error?: string;\n argumentCount?: number;\n}\n\nexport class WebSocketPerformanceWrapper {\n private static performanceMonitor: PerformanceMonitor;\n\n public static setPerformanceMonitor(monitor: PerformanceMonitor): void {\n WebSocketPerformanceWrapper.performanceMonitor = monitor;\n }\n\n private static getPerformanceMonitor(): PerformanceMonitor {\n if (!WebSocketPerformanceWrapper.performanceMonitor) {\n WebSocketPerformanceWrapper.performanceMonitor = PerformanceMonitor.getInstance();\n }\n return WebSocketPerformanceWrapper.performanceMonitor;\n }\n\n /**\n * Monitor WebSocket message handling\n */\n public static async monitorMessageHandling<T>(\n messageType: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: 'message_handling',\n messageType,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `message.${messageType}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor WebSocket connection operations\n */\n public static async monitorConnection<T>(\n connectionOperation: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: connectionOperation,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `connection.${connectionOperation}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor WebSocket room operations\n */\n public static async monitorRoomOperation<T>(\n roomOperation: string,\n room: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: roomOperation,\n room,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `room.${roomOperation}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor WebSocket broadcast operations\n */\n public static async monitorBroadcast<T>(\n broadcastType: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: 'broadcast',\n messageType: broadcastType,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `broadcast.${broadcastType}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor WebSocket authentication\n */\n public static async monitorAuthentication<T>(\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: 'authentication',\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: 'authentication',\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor controller method execution\n */\n public static async monitorControllerMethod<T>(\n controllerName: string,\n methodName: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: 'controller_method',\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `${controllerName}.${methodName}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n}\n\n/**\n * Decorator for monitoring WebSocket controller methods\n */\nexport function MonitorWebSocketOperation(operationName?: string) {\n return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n const originalMethod = descriptor.value;\n const controllerName = target.constructor.name;\n const operation = operationName ?? propertyKey;\n\n descriptor.value = async function (...args: any[]) {\n return WebSocketPerformanceWrapper.monitorControllerMethod(\n controllerName,\n operation,\n () => originalMethod.apply(this, args),\n { argumentCount: args.length },\n );\n };\n\n return descriptor;\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/queue/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { default as QueueManager } from './manager.js';
|
|
2
1
|
export type { QueueItem } from './index.interface.js';
|
|
3
2
|
export type { QueueJob, QueueJobData, QueueJobPayload } from './job.interface.js';
|
|
3
|
+
export { default as QueueManager } from './manager.js';
|
|
4
4
|
export { default as BaseProcessor } from './processor/base.js';
|
|
5
|
-
export type {
|
|
5
|
+
export type { ProcessorConstructor, ProcessorConstructorParams } from './processor/processor.interface.js';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/D,YAAY,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { QueueJob } from './job.interface.js';
|
|
2
1
|
import type { QueueOptions, WorkerOptions } from 'bullmq';
|
|
2
|
+
import type { QueueJob } from './job.interface.js';
|
|
3
3
|
/** Runtime settings applied to the BullMQ Worker for this queue */
|
|
4
4
|
export interface QueueRuntimeSettings {
|
|
5
5
|
/** Max number of concurrently processed jobs across all job types */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.interface.d.ts","sourceRoot":"","sources":["../../src/queue/index.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"index.interface.d.ts","sourceRoot":"","sources":["../../src/queue/index.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,mEAAmE;AACnE,MAAM,WAAW,oBAAoB;IACnC,qEAAqE;IACrE,WAAW,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC3C,kEAAkE;IAClE,YAAY,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAC7C,wCAAwC;IACxC,eAAe,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACnD,wDAAwD;IACxD,eAAe,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,SAAS;IACxB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IAEb,gCAAgC;IAChC,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,iBAAiB;IACjB,IAAI,EAAE,QAAQ,EAAE,CAAC;IAEjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAEhC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;CACvD"}
|
package/dist/queue/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/queue/index.ts"],
|
|
4
|
-
"sourcesContent": ["export {
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["export type { QueueItem } from './index.interface.js';\nexport type { QueueJob, QueueJobData, QueueJobPayload } from './job.interface.js';\nexport { default as QueueManager } from './manager.js';\nexport { default as BaseProcessor } from './processor/base.js';\nexport type { ProcessorConstructor, ProcessorConstructorParams } from './processor/processor.interface.js';\n"],
|
|
5
|
+
"mappings": "AAEA,SAAoB,WAAXA,gBAA+B;AACxC,SAAoB,WAAXA,gBAAgC;",
|
|
6
6
|
"names": ["default"]
|
|
7
7
|
}
|
package/dist/queue/manager.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type Job } from 'bullmq';
|
|
2
|
-
import type { QueueManagerConstructorParams } from './manager.interface.js';
|
|
3
|
-
import type { QueueJobData, QueueJobPayload } from './job.interface.js';
|
|
4
2
|
import type { QueueItem } from './index.interface.js';
|
|
3
|
+
import type { QueueJobData, QueueJobPayload } from './job.interface.js';
|
|
4
|
+
import type { QueueManagerConstructorParams } from './manager.interface.js';
|
|
5
5
|
export interface JobSummary {
|
|
6
6
|
id: string;
|
|
7
7
|
name: string;
|
|
@@ -18,6 +18,7 @@ export default class QueueManager {
|
|
|
18
18
|
private databaseInstance;
|
|
19
19
|
private eventManager?;
|
|
20
20
|
private queues;
|
|
21
|
+
private workers;
|
|
21
22
|
private jobProcessors;
|
|
22
23
|
constructor({ applicationConfig, options, queues: _queues, redisInstance, databaseInstance, eventManager, }: QueueManagerConstructorParams);
|
|
23
24
|
registerQueues({ queues }: {
|
|
@@ -36,9 +37,15 @@ export default class QueueManager {
|
|
|
36
37
|
}) => Promise<Job<QueueJobData<TPayload, TMetadata>, TResult, TName> | undefined>;
|
|
37
38
|
private workerProcessor;
|
|
38
39
|
listAllJobsWithStatus(): Promise<JobSummary[]>;
|
|
40
|
+
/**
|
|
41
|
+
* Disconnect all queues and workers, cleanup resources.
|
|
42
|
+
* Should be called during application shutdown.
|
|
43
|
+
*/
|
|
44
|
+
disconnect(): Promise<void>;
|
|
39
45
|
/**
|
|
40
46
|
* Log queue message
|
|
41
47
|
*/
|
|
42
48
|
log(message: string, meta?: Record<string, unknown>): void;
|
|
49
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
43
50
|
}
|
|
44
51
|
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/queue/manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/queue/manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,GAAG,EAAgD,MAAM,QAAQ,CAAC;AAOhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAY,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,KAAK,EAAE,6BAA6B,EAAuB,MAAM,wBAAwB,CAAC;AAKjG,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,CAAC,OAAO,OAAO,YAAY;IAC/B,OAAO,CAAC,MAAM,CAAyB;IAEvC,OAAO,CAAC,iBAAiB,CAAoB;IAE7C,OAAO,CAAC,OAAO,CAAsB;IAErC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,YAAY,CAAC,CAAe;IAEpC,OAAO,CAAC,MAAM,CAAiC;IAE/C,OAAO,CAAC,OAAO,CAAuC;IAEtD,OAAO,CAAC,aAAa,CAAyC;gBAElD,EACV,iBAAiB,EACjB,OAAO,EACP,MAAM,EAAE,OAAO,EACf,aAAa,EACb,gBAAgB,EAChB,YAAY,GACb,EAAE,6BAA6B;IAgBnB,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE;QAAE,MAAM,EAAE,SAAS,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC/E,OAAO,CAAC,aAAa;IAwErB,OAAO,CAAC,qBAAqB;IA0C7B,OAAO,CAAC,YAAY,CAElB;IAEF,OAAO,CAAC,cAAc,CAIpB;IAEF,OAAO,CAAC,eAAe,CAKrB;IAEF,OAAO,CAAC,cAAc,CAEpB;IAEK,aAAa,GAClB,QAAQ,SAAS,eAAe,GAAG,eAAe,EAClD,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnE,OAAO,GAAG,OAAO,EACjB,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,2BAIC;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;KACzC,KAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,CAyB7E;IAEF,OAAO,CAAC,eAAe,CA2ErB;IAEW,qBAAqB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IA6B3D;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCxC;;OAEG;IACI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI3D,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7C"}
|
package/dist/queue/manager.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
import path from "node:path";
|
|
3
4
|
import { Queue } from "bullmq";
|
|
4
|
-
import path from "path";
|
|
5
5
|
import { Logger } from "../logger/index.js";
|
|
6
|
-
import QueueWorker from "./worker.js";
|
|
7
6
|
import { File, Helper, Loader, Time } from "../util/index.js";
|
|
7
|
+
import QueueWorker from "./worker.js";
|
|
8
8
|
class QueueManager {
|
|
9
9
|
static {
|
|
10
10
|
__name(this, "QueueManager");
|
|
@@ -16,6 +16,7 @@ class QueueManager {
|
|
|
16
16
|
databaseInstance;
|
|
17
17
|
eventManager;
|
|
18
18
|
queues = /* @__PURE__ */ new Map();
|
|
19
|
+
workers = /* @__PURE__ */ new Map();
|
|
19
20
|
jobProcessors = /* @__PURE__ */ new Map();
|
|
20
21
|
constructor({
|
|
21
22
|
applicationConfig,
|
|
@@ -93,7 +94,7 @@ class QueueManager {
|
|
|
93
94
|
autorun: true,
|
|
94
95
|
...queue.settings ?? {}
|
|
95
96
|
};
|
|
96
|
-
new QueueWorker({
|
|
97
|
+
const worker = new QueueWorker({
|
|
97
98
|
applicationConfig: this.applicationConfig,
|
|
98
99
|
queueManager: this,
|
|
99
100
|
name: queue.name,
|
|
@@ -101,6 +102,7 @@ class QueueManager {
|
|
|
101
102
|
options: workerOptions,
|
|
102
103
|
redisInstance: this.redisInstance
|
|
103
104
|
});
|
|
105
|
+
this.workers.set(queue.name, worker);
|
|
104
106
|
}
|
|
105
107
|
this.queues.set(queue.name, queueInstance);
|
|
106
108
|
if (this.applicationConfig.queue.log?.queueRegistered) {
|
|
@@ -173,10 +175,10 @@ class QueueManager {
|
|
|
173
175
|
return;
|
|
174
176
|
}
|
|
175
177
|
const job = await queue.add(jobId, data);
|
|
176
|
-
const dataStr = JSON.stringify(data);
|
|
177
|
-
const maxLogDataStrLength = 50;
|
|
178
|
-
const truncatedLogDataStr = dataStr.length > maxLogDataStrLength ? `${dataStr.substring(0, maxLogDataStrLength)}...` : dataStr;
|
|
179
178
|
if (this.applicationConfig.queue.log?.jobAdded) {
|
|
179
|
+
const dataStr = JSON.stringify(data);
|
|
180
|
+
const maxLogDataStrLength = 50;
|
|
181
|
+
const truncatedLogDataStr = dataStr.length > maxLogDataStrLength ? `${dataStr.substring(0, maxLogDataStrLength)}...` : dataStr;
|
|
180
182
|
this.log("Job added", {
|
|
181
183
|
Queue: queueId,
|
|
182
184
|
"Job ID": jobId,
|
|
@@ -267,12 +269,48 @@ class QueueManager {
|
|
|
267
269
|
}
|
|
268
270
|
return jobsSummary;
|
|
269
271
|
}
|
|
272
|
+
/**
|
|
273
|
+
* Disconnect all queues and workers, cleanup resources.
|
|
274
|
+
* Should be called during application shutdown.
|
|
275
|
+
*/
|
|
276
|
+
async disconnect() {
|
|
277
|
+
for (const [name, worker] of this.workers) {
|
|
278
|
+
try {
|
|
279
|
+
await worker.cleanup();
|
|
280
|
+
this.log("Worker closed", { Name: name });
|
|
281
|
+
} catch (error) {
|
|
282
|
+
Logger.error({
|
|
283
|
+
error,
|
|
284
|
+
message: `Failed to close worker: ${name}`
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
for (const [name, queue] of this.queues) {
|
|
289
|
+
try {
|
|
290
|
+
queue.removeAllListeners();
|
|
291
|
+
await queue.close();
|
|
292
|
+
this.log("Queue closed", { Name: name });
|
|
293
|
+
} catch (error) {
|
|
294
|
+
Logger.error({
|
|
295
|
+
error,
|
|
296
|
+
message: `Failed to close queue: ${name}`
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
this.workers.clear();
|
|
301
|
+
this.queues.clear();
|
|
302
|
+
this.jobProcessors.clear();
|
|
303
|
+
this.log("Queue manager disconnected");
|
|
304
|
+
}
|
|
270
305
|
/**
|
|
271
306
|
* Log queue message
|
|
272
307
|
*/
|
|
273
308
|
log(message, meta) {
|
|
274
309
|
this.logger.custom({ level: "queue", message, meta });
|
|
275
310
|
}
|
|
311
|
+
async [Symbol.asyncDispose]() {
|
|
312
|
+
await this.disconnect();
|
|
313
|
+
}
|
|
276
314
|
}
|
|
277
315
|
export {
|
|
278
316
|
QueueManager as default
|