@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.
Files changed (258) hide show
  1. package/README.md +12 -7
  2. package/dist/api-requester/api-requester.js +1 -1
  3. package/dist/api-requester/api-requester.js.map +2 -2
  4. package/dist/api-requester/index.d.ts +1 -1
  5. package/dist/api-requester/index.d.ts.map +1 -1
  6. package/dist/api-requester/index.js.map +2 -2
  7. package/dist/application/base-application.d.ts +6 -5
  8. package/dist/application/base-application.d.ts.map +1 -1
  9. package/dist/application/base-application.interface.d.ts +2 -4
  10. package/dist/application/base-application.interface.d.ts.map +1 -1
  11. package/dist/application/base-application.js +23 -14
  12. package/dist/application/base-application.js.map +2 -2
  13. package/dist/application/command-application.d.ts.map +1 -1
  14. package/dist/application/command-application.js +2 -2
  15. package/dist/application/command-application.js.map +2 -2
  16. package/dist/application/index.d.ts +3 -3
  17. package/dist/application/index.d.ts.map +1 -1
  18. package/dist/application/index.js +4 -4
  19. package/dist/application/index.js.map +2 -2
  20. package/dist/application/web-application.d.ts +5 -5
  21. package/dist/application/web-application.d.ts.map +1 -1
  22. package/dist/application/web-application.js +6 -7
  23. package/dist/application/web-application.js.map +2 -2
  24. package/dist/application/worker-application.d.ts +2 -2
  25. package/dist/application/worker-application.d.ts.map +1 -1
  26. package/dist/application/worker-application.js +2 -2
  27. package/dist/application/worker-application.js.map +2 -2
  28. package/dist/auth/jwt.d.ts.map +1 -1
  29. package/dist/auth/jwt.js +2 -2
  30. package/dist/auth/jwt.js.map +2 -2
  31. package/dist/cache/manager.d.ts.map +1 -1
  32. package/dist/cache/manager.js.map +2 -2
  33. package/dist/cli/index.js +192 -7029
  34. package/dist/cli/index.js.map +4 -4
  35. package/dist/cluster/cluster-manager.d.ts.map +1 -1
  36. package/dist/cluster/cluster-manager.js +1 -1
  37. package/dist/cluster/cluster-manager.js.map +2 -2
  38. package/dist/command/command.d.ts +1 -1
  39. package/dist/command/command.d.ts.map +1 -1
  40. package/dist/command/command.js.map +2 -2
  41. package/dist/config/env.d.ts +1 -1
  42. package/dist/config/env.d.ts.map +1 -1
  43. package/dist/config/env.js.map +1 -1
  44. package/dist/config/index.d.ts +1 -1
  45. package/dist/config/index.d.ts.map +1 -1
  46. package/dist/config/index.js +1 -1
  47. package/dist/config/index.js.map +1 -1
  48. package/dist/config/schema.d.ts.map +1 -1
  49. package/dist/config/schema.js +1 -1
  50. package/dist/config/schema.js.map +2 -2
  51. package/dist/database/dynamic-entity.js +9 -9
  52. package/dist/database/dynamic-entity.js.map +2 -2
  53. package/dist/database/index.d.ts +3 -3
  54. package/dist/database/index.d.ts.map +1 -1
  55. package/dist/database/index.js +5 -5
  56. package/dist/database/index.js.map +2 -2
  57. package/dist/database/instance.d.ts +3 -3
  58. package/dist/database/instance.js +3 -3
  59. package/dist/database/instance.js.map +1 -1
  60. package/dist/database/manager.d.ts +1 -0
  61. package/dist/database/manager.d.ts.map +1 -1
  62. package/dist/database/manager.js +16 -3
  63. package/dist/database/manager.js.map +2 -2
  64. package/dist/error/error-reporter.js +1 -1
  65. package/dist/error/error-reporter.js.map +2 -2
  66. package/dist/error/index.d.ts +2 -3
  67. package/dist/error/index.d.ts.map +1 -1
  68. package/dist/error/index.js +8 -9
  69. package/dist/error/index.js.map +2 -2
  70. package/dist/event/controller/base.d.ts +2 -2
  71. package/dist/event/controller/base.d.ts.map +1 -1
  72. package/dist/event/controller/base.js +2 -2
  73. package/dist/event/controller/base.js.map +2 -2
  74. package/dist/event/index.d.ts +3 -3
  75. package/dist/event/index.d.ts.map +1 -1
  76. package/dist/event/index.js +5 -5
  77. package/dist/event/index.js.map +2 -2
  78. package/dist/event/manager.d.ts.map +1 -1
  79. package/dist/event/manager.interface.d.ts +2 -3
  80. package/dist/event/manager.interface.d.ts.map +1 -1
  81. package/dist/event/manager.js.map +2 -2
  82. package/dist/index.d.ts +1 -1
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +1 -1
  85. package/dist/index.js.map +2 -2
  86. package/dist/lifecycle/index.d.ts +3 -3
  87. package/dist/lifecycle/index.d.ts.map +1 -1
  88. package/dist/lifecycle/index.js +1 -1
  89. package/dist/lifecycle/index.js.map +2 -2
  90. package/dist/lifecycle/lifecycle-manager.d.ts +6 -0
  91. package/dist/lifecycle/lifecycle-manager.d.ts.map +1 -1
  92. package/dist/lifecycle/lifecycle-manager.js +28 -0
  93. package/dist/lifecycle/lifecycle-manager.js.map +2 -2
  94. package/dist/logger/logger.d.ts +20 -1
  95. package/dist/logger/logger.d.ts.map +1 -1
  96. package/dist/logger/logger.js +68 -96
  97. package/dist/logger/logger.js.map +2 -2
  98. package/dist/performance/cache-performance.d.ts.map +1 -1
  99. package/dist/performance/cache-performance.js +1 -1
  100. package/dist/performance/cache-performance.js.map +2 -2
  101. package/dist/performance/database-performance.d.ts.map +1 -1
  102. package/dist/performance/database-performance.js +1 -1
  103. package/dist/performance/database-performance.js.map +2 -2
  104. package/dist/performance/index.d.ts +3 -3
  105. package/dist/performance/index.d.ts.map +1 -1
  106. package/dist/performance/index.js +3 -3
  107. package/dist/performance/index.js.map +1 -1
  108. package/dist/performance/performance-monitor.js +2 -2
  109. package/dist/performance/performance-monitor.js.map +2 -2
  110. package/dist/performance/performance-monitor.plugin.d.ts.map +1 -1
  111. package/dist/performance/performance-monitor.plugin.js +1 -1
  112. package/dist/performance/performance-monitor.plugin.js.map +2 -2
  113. package/dist/performance/queue-performance.d.ts.map +1 -1
  114. package/dist/performance/queue-performance.js +1 -1
  115. package/dist/performance/queue-performance.js.map +2 -2
  116. package/dist/performance/webserver-performance.d.ts.map +1 -1
  117. package/dist/performance/webserver-performance.js +1 -1
  118. package/dist/performance/webserver-performance.js.map +2 -2
  119. package/dist/performance/websocket-performance.d.ts.map +1 -1
  120. package/dist/performance/websocket-performance.js +1 -1
  121. package/dist/performance/websocket-performance.js.map +2 -2
  122. package/dist/queue/index.d.ts +2 -2
  123. package/dist/queue/index.d.ts.map +1 -1
  124. package/dist/queue/index.interface.d.ts +1 -1
  125. package/dist/queue/index.interface.d.ts.map +1 -1
  126. package/dist/queue/index.js.map +2 -2
  127. package/dist/queue/manager.d.ts +9 -2
  128. package/dist/queue/manager.d.ts.map +1 -1
  129. package/dist/queue/manager.js +44 -6
  130. package/dist/queue/manager.js.map +2 -2
  131. package/dist/queue/processor/base.d.ts +5 -5
  132. package/dist/queue/processor/base.d.ts.map +1 -1
  133. package/dist/queue/processor/base.js +2 -2
  134. package/dist/queue/processor/base.js.map +2 -2
  135. package/dist/queue/processor/processor.interface.d.ts +3 -3
  136. package/dist/queue/processor/processor.interface.d.ts.map +1 -1
  137. package/dist/queue/worker.d.ts +5 -0
  138. package/dist/queue/worker.d.ts.map +1 -1
  139. package/dist/queue/worker.interface.d.ts +1 -1
  140. package/dist/queue/worker.interface.d.ts.map +1 -1
  141. package/dist/queue/worker.js +9 -1
  142. package/dist/queue/worker.js.map +2 -2
  143. package/dist/redis/index.d.ts +1 -1
  144. package/dist/redis/index.d.ts.map +1 -1
  145. package/dist/redis/index.js +5 -4
  146. package/dist/redis/index.js.map +2 -2
  147. package/dist/redis/instance.js +1 -1
  148. package/dist/redis/instance.js.map +2 -2
  149. package/dist/redis/manager.d.ts +7 -1
  150. package/dist/redis/manager.d.ts.map +1 -1
  151. package/dist/redis/manager.js +20 -4
  152. package/dist/redis/manager.js.map +2 -2
  153. package/dist/request-context/index.d.ts +1 -1
  154. package/dist/request-context/index.d.ts.map +1 -1
  155. package/dist/request-context/index.js +5 -5
  156. package/dist/request-context/index.js.map +1 -1
  157. package/dist/schemas/entity-builder.d.ts +3 -3
  158. package/dist/schemas/entity-builder.d.ts.map +1 -1
  159. package/dist/schemas/entity-builder.js.map +1 -1
  160. package/dist/services/aws/s3.d.ts.map +1 -1
  161. package/dist/services/aws/s3.js +7 -10
  162. package/dist/services/aws/s3.js.map +2 -2
  163. package/dist/util/file.d.ts +13 -8
  164. package/dist/util/file.d.ts.map +1 -1
  165. package/dist/util/file.js +6 -28
  166. package/dist/util/file.js.map +2 -2
  167. package/dist/util/helper.js +2 -2
  168. package/dist/util/helper.js.map +2 -2
  169. package/dist/util/index.d.ts +2 -2
  170. package/dist/util/index.d.ts.map +1 -1
  171. package/dist/util/index.js +18 -18
  172. package/dist/util/index.js.map +2 -2
  173. package/dist/util/loader.js +3 -3
  174. package/dist/util/loader.js.map +2 -2
  175. package/dist/util/os.js +2 -2
  176. package/dist/util/os.js.map +2 -2
  177. package/dist/webserver/controller/auth-middleware.d.ts +1 -1
  178. package/dist/webserver/controller/auth-middleware.d.ts.map +1 -1
  179. package/dist/webserver/controller/auth-middleware.js +1 -1
  180. package/dist/webserver/controller/auth-middleware.js.map +2 -2
  181. package/dist/webserver/controller/base.d.ts +6 -6
  182. package/dist/webserver/controller/base.d.ts.map +1 -1
  183. package/dist/webserver/controller/base.interface.d.ts +1 -1
  184. package/dist/webserver/controller/base.interface.d.ts.map +1 -1
  185. package/dist/webserver/controller/base.js +4 -4
  186. package/dist/webserver/controller/base.js.map +2 -2
  187. package/dist/webserver/controller/entity.d.ts +4 -3
  188. package/dist/webserver/controller/entity.d.ts.map +1 -1
  189. package/dist/webserver/controller/entity.js +26 -17
  190. package/dist/webserver/controller/entity.js.map +2 -2
  191. package/dist/webserver/controller/example-auth.d.ts.map +1 -1
  192. package/dist/webserver/controller/example-auth.js +1 -1
  193. package/dist/webserver/controller/example-auth.js.map +2 -2
  194. package/dist/webserver/controller/health.d.ts.map +1 -1
  195. package/dist/webserver/controller/health.js +1 -1
  196. package/dist/webserver/controller/health.js.map +2 -2
  197. package/dist/webserver/define-action.d.ts +1 -1
  198. package/dist/webserver/define-action.d.ts.map +1 -1
  199. package/dist/webserver/define-action.js.map +1 -1
  200. package/dist/webserver/define-route.d.ts +1 -1
  201. package/dist/webserver/define-route.d.ts.map +1 -1
  202. package/dist/webserver/define-route.js.map +2 -2
  203. package/dist/webserver/index.d.ts +9 -9
  204. package/dist/webserver/index.d.ts.map +1 -1
  205. package/dist/webserver/index.js +14 -14
  206. package/dist/webserver/index.js.map +2 -2
  207. package/dist/webserver/webserver.d.ts +3 -3
  208. package/dist/webserver/webserver.d.ts.map +1 -1
  209. package/dist/webserver/webserver.interface.d.ts +5 -5
  210. package/dist/webserver/webserver.interface.d.ts.map +1 -1
  211. package/dist/webserver/webserver.interface.js.map +1 -1
  212. package/dist/webserver/webserver.js +9 -9
  213. package/dist/webserver/webserver.js.map +2 -2
  214. package/dist/websocket/controller/server/base.d.ts +2 -2
  215. package/dist/websocket/controller/server/base.js.map +1 -1
  216. package/dist/websocket/controllers/server/system.d.ts.map +1 -1
  217. package/dist/websocket/controllers/server/system.js +1 -1
  218. package/dist/websocket/controllers/server/system.js.map +2 -2
  219. package/dist/websocket/index.d.ts +9 -11
  220. package/dist/websocket/index.d.ts.map +1 -1
  221. package/dist/websocket/index.js +22 -22
  222. package/dist/websocket/index.js.map +2 -2
  223. package/dist/websocket/subscriber-middleware.d.ts.map +1 -1
  224. package/dist/websocket/subscriber-middleware.js.map +2 -2
  225. package/dist/websocket/subscriber-utils.d.ts.map +1 -1
  226. package/dist/websocket/subscriber-utils.js.map +2 -2
  227. package/dist/websocket/utils.d.ts.map +1 -1
  228. package/dist/websocket/utils.js +4 -2
  229. package/dist/websocket/utils.js.map +2 -2
  230. package/dist/websocket/websocket-auth.d.ts.map +1 -1
  231. package/dist/websocket/websocket-auth.js +3 -3
  232. package/dist/websocket/websocket-auth.js.map +2 -2
  233. package/dist/websocket/websocket-base.d.ts +2 -2
  234. package/dist/websocket/websocket-base.d.ts.map +1 -1
  235. package/dist/websocket/websocket-base.js +1 -1
  236. package/dist/websocket/websocket-base.js.map +2 -2
  237. package/dist/websocket/websocket-client-manager.d.ts +2 -0
  238. package/dist/websocket/websocket-client-manager.d.ts.map +1 -1
  239. package/dist/websocket/websocket-client-manager.js +11 -4
  240. package/dist/websocket/websocket-client-manager.js.map +2 -2
  241. package/dist/websocket/websocket-client.d.ts +10 -5
  242. package/dist/websocket/websocket-client.d.ts.map +1 -1
  243. package/dist/websocket/websocket-client.js +27 -5
  244. package/dist/websocket/websocket-client.js.map +2 -2
  245. package/dist/websocket/websocket-room-manager.js +1 -1
  246. package/dist/websocket/websocket-room-manager.js.map +1 -1
  247. package/dist/websocket/websocket-server.d.ts +7 -7
  248. package/dist/websocket/websocket-server.d.ts.map +1 -1
  249. package/dist/websocket/websocket-server.js +25 -20
  250. package/dist/websocket/websocket-server.js.map +2 -2
  251. package/dist/websocket/websocket-service.d.ts +2 -2
  252. package/dist/websocket/websocket-service.d.ts.map +1 -1
  253. package/dist/websocket/websocket-service.js +1 -1
  254. package/dist/websocket/websocket-service.js.map +2 -2
  255. package/dist/websocket/websocket.interface.d.ts +3 -5
  256. package/dist/websocket/websocket.interface.d.ts.map +1 -1
  257. package/dist/websocket/websocket.interface.js.map +2 -2
  258. 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,cAAc;AACvB,SAAS,0BAA0B;AA2B5B,MAAM,mBAAmB;AAAA,EA7BhC,OA6BgC;AAAA;AAAA;AAAA,EAC9B,OAAe;AAAA,EACP;AAAA,EACA,UAAgC,CAAC;AAAA;AAAA;AAAA,EAGjC,aAAoC;AAAA,IAC1C,MAAM;AAAA;AAAA,IACN,UAAU;AAAA;AAAA,IACV,OAAO;AAAA;AAAA,IACP,OAAO;AAAA;AAAA,IACP,WAAW;AAAA;AAAA,IACX,QAAQ;AAAA;AAAA,EACV;AAAA,EACQ,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EAEnB,YAAY,UAAqC,CAAC,GAAG;AAC3D,SAAK,YAAY,QAAQ,WAAW;AACpC,SAAK,oBAAoB,QAAQ,qBAAqB;AACtD,SAAK,oBAAoB,QAAQ,qBAAqB;AACtD,SAAK,mBAAmB,QAAQ,oBAAoB;AAEpD,QAAI,QAAQ,YAAY;AACtB,WAAK,aAAa,EAAE,GAAG,KAAK,YAAY,GAAG,QAAQ,WAAW;AAAA,IAChE;AAEA,QAAI,KAAK,WAAW;AAClB,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAc,YAAY,SAAyD;AACjF,QAAI,CAAC,mBAAmB,UAAU;AAChC,yBAAmB,WAAW,IAAI,mBAAmB,OAAO;AAAA,IAC9D;AACA,WAAO,mBAAmB;AAAA,EAC5B;AAAA,EAEA,OAAc,WAAW,UAAqC,CAAC,GAAuB;AACpF,uBAAmB,WAAW,IAAI,mBAAmB,OAAO;AAC5D,WAAO,mBAAmB;AAAA,EAC5B;AAAA,EAEQ,qBAA2B;AACjC,SAAK,WAAW,IAAI,oBAAoB,WAAS;AAC/C,YAAM,WAAW,EAAE,QAAQ,WAAS;AAClC,YAAI,MAAM,KAAK,WAAW,kBAAkB,GAAG;AAC7C,eAAK,uBAAuB,KAAK;AAAA,QACnC;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,SAAK,SAAS,QAAQ,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;AAAA,EACnD;AAAA,EAEQ,uBAAuB,OAAkB;AAC/C,QAAI,CAAC,KAAK,UAAW;AAErB,UAAM,CAAC,EAAE,MAAM,IAAI,IAAI,MAAM,KAAK,MAAM,GAAG;AAC3C,UAAM,aAAa;AAEnB,UAAM,SAA6B;AAAA,MACjC;AAAA,MACA,UAAU,MAAM;AAAA,MAChB,WAAW,KAAK,IAAI;AAAA,MACpB,MAAM;AAAA,MACN,UAAU,MAAM;AAAA,IAClB;AAEA,SAAK,QAAQ,KAAK,MAAM;AAGxB,QAAI,KAAK,QAAQ,SAAS,KAAK,mBAAmB;AAChD,WAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,KAAK,iBAAiB;AAAA,IAC3D;AAGA,UAAM,eAA6C,CAAC,QAAQ,YAAY,SAAS,SAAS,aAAa,QAAQ;AAC/G,QAAI,CAAC,aAAa,SAAS,UAAU,GAAG;AACtC;AAAA,IACF;AAEA,QAAI;AACJ,YAAQ,YAAY;AAAA,MAClB,KAAK;AACH,oBAAY,KAAK,WAAW;AAC5B;AAAA,MACF,KAAK;AACH,oBAAY,KAAK,WAAW;AAC5B;AAAA,MACF,KAAK;AACH,oBAAY,KAAK,WAAW;AAC5B;AAAA,MACF,KAAK;AACH,oBAAY,KAAK,WAAW;AAC5B;AAAA,MACF,KAAK;AACH,oBAAY,KAAK,WAAW;AAC5B;AAAA,MACF,KAAK;AACH,oBAAY,KAAK,WAAW;AAC5B;AAAA,MACF;AACE,oBAAY;AAAA,IAChB;AACA,QAAI,KAAK,qBAAqB,MAAM,WAAW,WAAW;AACxD,aAAO,KAAK;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,WAAW,MAAM;AAAA,UACjB,UAAU,GAAG,MAAM,SAAS,QAAQ,CAAC,CAAC;AAAA,UACtC,WAAW,GAAG,SAAS;AAAA,UACvB,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,kBAAkB;AACzB,aAAO,MAAM;AAAA,QACX,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,WAAW,MAAM;AAAA,UACjB,UAAU,GAAG,MAAM,SAAS,QAAQ,CAAC,CAAC;AAAA,UACtC,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEO,aAAa,MAAc,OAAmC,UAAkB;AACrF,QAAI,CAAC,KAAK,UAAW,QAAO;AAE5B,UAAM,cAAc,mBAAmB,IAAI,IAAI,IAAI;AACnD,UAAM,YAAY,GAAG,WAAW;AAEhC,gBAAY,KAAK,SAAS;AAC1B,WAAO;AAAA,EACT;AAAA,EAEO,WAAW,WAAmB,WAAuC;AAC1E,QAAI,CAAC,KAAK,aAAa,CAAC,UAAW;AAEnC,UAAM,UAAU,GAAG,UAAU,QAAQ,UAAU,EAAE,CAAC;AAClD,UAAM,cAAc,UAAU,QAAQ,UAAU,EAAE;AAElD,gBAAY,KAAK,OAAO;AAExB,QAAI;AACF,kBAAY,QAAQ,aAAa,WAAW,OAAO;AAGnD,kBAAY,WAAW,SAAS;AAChC,kBAAY,WAAW,OAAO;AAAA,IAChC,SAAS,OAAO;AACd,aAAO,MAAM;AAAA,QACX,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,mBAAmB,KAAK,CAAC;AAAA,QAC3E,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAa,aAAgB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAKe;AACb,QAAI,CAAC,KAAK,WAAW;AACnB,aAAO,GAAG;AAAA,IACZ;AAEA,UAAM,YAAY,KAAK,aAAa,MAAM,IAAI;AAE9C,QAAI;AACF,YAAM,SAAS,MAAM,GAAG;AACxB,WAAK,WAAW,WAAW,QAAQ;AACnC,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,WAAW,WAAW;AAAA,QACzB,GAAG;AAAA,QACH,OAAO,iBAAiB,QAAQ,MAAM,UAAU,mBAAmB,KAAK;AAAA,MAC1E,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEO,YACL,MACA,MACA,IACA,UACG;AACH,QAAI,CAAC,KAAK,WAAW;AACnB,aAAO,GAAG;AAAA,IACZ;AAEA,UAAM,YAAY,KAAK,aAAa,MAAM,IAAI;AAE9C,QAAI;AACF,YAAM,SAAS,GAAG;AAClB,WAAK,WAAW,WAAW,QAAQ;AACnC,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,WAAW,WAAW;AAAA,QACzB,GAAG;AAAA,QACH,OAAO,iBAAiB,QAAQ,MAAM,UAAU,mBAAmB,KAAK;AAAA,MAC1E,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEO,WAAW,MAAmC,OAAsC;AACzF,QAAI,kBAAkB,KAAK;AAE3B,QAAI,MAAM;AACR,wBAAkB,gBAAgB,OAAO,OAAK,EAAE,SAAS,IAAI;AAAA,IAC/D;AAEA,QAAI,OAAO;AACT,wBAAkB,gBAAgB,MAAM,CAAC,KAAK;AAAA,IAChD;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,kBAAkB,MAA2D;AAClF,UAAM,UAAU,KAAK,WAAW,IAAI;AACpC,UAAM,SAAS,oBAAI,IAAsB;AACzC,eAAW,UAAU,SAAS;AAC5B,YAAM,MAAM,OAAO;AACnB,YAAM,MAAM,OAAO,IAAI,GAAG,KAAK,CAAC;AAChC,UAAI,KAAK,OAAO,QAAQ;AACxB,UAAI,CAAC,OAAO,IAAI,GAAG,EAAG,QAAO,IAAI,KAAK,GAAG;AAAA,IAC3C;AACA,UAAM,cAAc,oBAAI,IAAoB;AAC5C,eAAW,CAAC,KAAK,SAAS,KAAK,OAAO,QAAQ,GAAG;AAC/C,YAAM,QAAQ,UAAU,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG,CAAC;AACrD,kBAAY,IAAI,KAAK,QAAQ,UAAU,MAAM;AAAA,IAC/C;AAEA,WAAO,MAAM,KAAK,YAAY,QAAQ,CAAC,EAAE,OAA+B,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM;AACvF,UAAI,OAAO,MAAM,UAAU;AACzB,eAAO,eAAe,KAAK,GAAG,EAAE,OAAO,GAAG,YAAY,MAAM,cAAc,MAAM,UAAU,MAAM,CAAC;AAAA,MACnG;AACA,aAAO;AAAA,IACT,GAAG,uBAAO,OAAO,IAAI,CAAC;AAAA,EACxB;AAAA,EAEO,iBAAqC;AAC1C,WAAO,QAAQ,YAAY;AAAA,EAC7B;AAAA,EAEO,yBAAiD;AACtD,UAAM,QAAQ,QAAQ,YAAY;AAClC,WAAO;AAAA,MACL,KAAK,KAAK,MAAM,MAAM,MAAM,OAAO,IAAI;AAAA;AAAA,MACvC,WAAW,KAAK,MAAM,MAAM,YAAY,OAAO,IAAI;AAAA;AAAA,MACnD,UAAU,KAAK,MAAM,MAAM,WAAW,OAAO,IAAI;AAAA;AAAA,MACjD,UAAU,KAAK,MAAM,MAAM,WAAW,OAAO,IAAI;AAAA;AAAA,MACjD,cAAc,KAAK,MAAM,MAAM,eAAe,OAAO,IAAI;AAAA;AAAA,IAC3D;AAAA,EACF;AAAA,EAEO,cAA+B;AACpC,WAAO,QAAQ,SAAS;AAAA,EAC1B;AAAA,EAEO,cAAc,YAAkD;AACrE,SAAK,aAAa,EAAE,GAAG,KAAK,YAAY,GAAG,WAAW;AAAA,EACxD;AAAA,EAEO,WAAW,SAAwB;AACxC,SAAK,YAAY;AAEjB,QAAI,WAAW,CAAC,KAAK,UAAU;AAC7B,WAAK,mBAAmB;AAAA,IAC1B,WAAW,CAAC,WAAW,KAAK,UAAU;AACpC,WAAK,SAAS,WAAW;AACzB,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEO,eAAqB;AAC1B,SAAK,UAAU,CAAC;AAAA,EAClB;AAAA,EAEO,iBAUL;AACA,WAAO;AAAA,MACL,SAAS;AAAA,QACP,cAAc,KAAK,QAAQ;AAAA,QAC3B,UAAU,KAAK,kBAAkB;AAAA,QACjC,YAAY,KAAK;AAAA,QACjB,SAAS,KAAK;AAAA,MAChB;AAAA,MACA,SAAS,KAAK,WAAW,QAAW,GAAG;AAAA;AAAA,MACvC,QAAQ,KAAK,uBAAuB;AAAA,MACpC,KAAK,KAAK,YAAY;AAAA,IACxB;AAAA,EACF;AAAA,EAEO,wBAAwB,SAAgC,YAAoB;AACjF,UAAM,SAAS,KAAK,eAAe;AAEnC,QAAI,WAAW,UAAU;AACvB,YAAM,aAAa,OAAO,OAAO;AACjC,YAAM,aAAa,KAAK,OAAO,OAAO,IAAI,OAAO,OAAO,IAAI,UAAU,GAAO;AAC7E,YAAM,eAAe,OAAO,OAAO,OAAO,QAAQ,QAAQ;AAC1D,YAAM,YACJ,aAAa,SAAS,IAAI,KAAK,MAAM,aAAa,OAAO,CAAC,KAAK,QAAQ,MAAM,KAAK,CAAC,IAAI,aAAa,MAAM,IAAI;AAEhH,aAAO,gCAAgC,OAAO,QAAQ,YAAY,cAAc,SAAS,iBAAiB,OAAO,QAAQ,MAAM,cAAc,UAAU,aAAa,UAAU;AAAA,IAChL;AACA,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA,YAAY,OAAO,QAAQ,YAAY,iCAAiC,OAAO,QAAQ,OAAO;AAAA,MAC9F,YAAY,OAAO,QAAQ,MAAM;AAAA,MACjC,gBAAgB,OAAO,OAAO,GAAG,aAAa,OAAO,OAAO,QAAQ,IAAI,OAAO,OAAO,SAAS;AAAA,MAC/F,cAAc,KAAK,MAAM,OAAO,IAAI,OAAO,GAAI,CAAC,eAAe,KAAK,MAAM,OAAO,IAAI,SAAS,GAAI,CAAC;AAAA,IACrG;AAEA,QAAI,OAAO,KAAK,OAAO,QAAQ,QAAQ,EAAE,SAAS,GAAG;AACnD,YAAM;AAAA,QACJ,aAAa,OAAO,QAAQ,OAAO,QAAQ,QAAQ,EAChD,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,KAAK,KAAK,MAAM,GAAG,CAAC,IAAI,EACpD,KAAK,IAAI,CAAC;AAAA,MACf;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEO,UAAgB;AACrB,QAAI,KAAK,UAAU;AACjB,WAAK,SAAS,WAAW;AACzB,WAAK,WAAW;AAAA,IAClB;AACA,SAAK,UAAU,CAAC;AAAA,EAClB;AACF;",
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;IA0DpB,yCAAyC;IAClC,IAAI,IAAI,IAAI;CAmBpB"}
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 { PerformanceMonitor, type PerformanceMonitorOptions } from './performance-monitor.js';\nimport { CachePerformanceWrapper, DatabasePerformanceWrapper, QueuePerformanceWrapper } from './index.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 const cfg = this.app['config'].performanceMonitoring; // internal access\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,0BAA0D;AACnE,SAAS,yBAAyB,4BAA4B,+BAA+B;AAYtF,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;AAClB,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;",
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,IACzC,QAAQ,GAAG,EAAE,aAAa,MAAM,EAAE,YAAY,kBAAkB,wBAelF"}
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 function(target, propertyKey, descriptor) {
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 function (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": ";;AAAA,SAAS,0BAA0B;AAc5B,MAAM,wBAAwB;AAAA,EAdrC,OAcqC;AAAA;AAAA;AAAA,EACnC,OAAe;AAAA,EAEf,OAAc,sBAAsB,SAAmC;AACrE,4BAAwB,qBAAqB;AAAA,EAC/C;AAAA,EAEA,OAAe,wBAA4C;AACzD,QAAI,CAAC,wBAAwB,oBAAoB;AAC/C,8BAAwB,qBAAqB,mBAAmB,YAAY;AAAA,IAC9E;AACA,WAAO,wBAAwB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAoB,qBAClB,WACA,SACA,WACA,UACY;AACZ,UAAM,UAAU,wBAAwB,sBAAsB;AAE9D,UAAM,oBAA4C;AAAA,MAChD,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM,GAAG,SAAS,IAAI,OAAO;AAAA,MAC7B,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAoB,mBAClB,WACA,SACA,WACA,UACY;AACZ,UAAM,UAAU,wBAAwB,sBAAsB;AAE9D,UAAM,oBAA4C;AAAA,MAChD,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM,OAAO,SAAS,IAAI,OAAO;AAAA,MACjC,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAoB,sBAClB,WACA,eACA,WACA,UACY;AACZ,UAAM,UAAU,wBAAwB,sBAAsB;AAE9D,UAAM,oBAA4C;AAAA,MAChD,WAAW;AAAA,MACX;AAAA,MACA,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM,SAAS,SAAS,IAAI,aAAa;AAAA,MACzC,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,wBAAwB,sBAAsB;AAE9D,UAAM,oBAA4C;AAAA,MAChD,WAAW;AAAA,MACX,SAAS;AAAA,MACT,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,cAClB,YACA,WACA,UACY;AACZ,UAAM,UAAU,wBAAwB,sBAAsB;AAE9D,UAAM,oBAA4C;AAAA,MAChD,WAAW;AAAA,MACX,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM,UAAU,UAAU;AAAA,MAC1B,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAoB,gBAClB,WACA,SACA,SACA,WACA,UACY;AACZ,UAAM,UAAU,wBAAwB,sBAAsB;AAE9D,UAAM,oBAA4C;AAAA,MAChD,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM,SAAS,SAAS,IAAI,OAAO;AAAA,MACnC,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;AAKO,SAAS,sBAAsB,eAAwB;AAC5D,SAAO,SAAU,QAAa,aAAqB,YAAgC;AACjF,UAAM,iBAAiB,WAAW;AAClC,UAAM,YAAY,OAAO,YAAY;AACrC,UAAM,YAAY,iBAAiB;AAEnC,eAAW,QAAQ,kBAAmB,MAAa;AACjD,aAAO,wBAAwB;AAAA,QAC7B,GAAG,SAAS,IAAI,SAAS;AAAA,QACzB,MAAM,eAAe,MAAM,MAAM,IAAI;AAAA,QACrC,EAAE,eAAe,KAAK,OAAO;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAhBgB;",
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,IACxC,QAAQ,GAAG,EAAE,aAAa,MAAM,EAAE,YAAY,kBAAkB,wBAgBlF"}
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 function(target, propertyKey, descriptor) {
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 function (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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",
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,IAC7C,QAAQ,GAAG,EAAE,aAAa,MAAM,EAAE,YAAY,kBAAkB,wBAgBlF"}
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 function(target, propertyKey, descriptor) {
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 function (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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",
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
  }
@@ -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 { ProcessorConstructorParams, ProcessorConstructor } from './processor/processor.interface.js';
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,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AACvD,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/D,YAAY,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC"}
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,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAE1D,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"}
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"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/queue/index.ts"],
4
- "sourcesContent": ["export { default as QueueManager } from './manager.js';\nexport type { QueueItem } from './index.interface.js';\nexport type { QueueJob, QueueJobData, QueueJobPayload } from './job.interface.js';\nexport { default as BaseProcessor } from './processor/base.js';\nexport type { ProcessorConstructorParams, ProcessorConstructor } from './processor/processor.interface.js';\n"],
5
- "mappings": "AAAA,SAAoB,WAAXA,gBAA+B;AAGxC,SAAoB,WAAXA,gBAAgC;",
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
  }
@@ -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":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAgD,MAAM,QAAQ,CAAC;AAEhF,OAAO,KAAK,EAAE,6BAA6B,EAAuB,MAAM,wBAAwB,CAAC;AAOjG,OAAO,KAAK,EAAY,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAElF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAItD,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,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;IAsErB,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,CA0B7E;IAEF,OAAO,CAAC,eAAe,CA2ErB;IAEW,qBAAqB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IA6B3D;;OAEG;IACI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAGlE"}
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"}
@@ -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