@scpxl/nodejs-framework 1.0.50 → 1.0.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -7
- package/dist/api-requester/api-requester.js +1 -1
- package/dist/api-requester/api-requester.js.map +2 -2
- package/dist/api-requester/index.d.ts +1 -1
- package/dist/api-requester/index.d.ts.map +1 -1
- package/dist/api-requester/index.js.map +2 -2
- package/dist/application/base-application.d.ts +6 -5
- package/dist/application/base-application.d.ts.map +1 -1
- package/dist/application/base-application.interface.d.ts +2 -4
- package/dist/application/base-application.interface.d.ts.map +1 -1
- package/dist/application/base-application.js +17 -14
- package/dist/application/base-application.js.map +2 -2
- package/dist/application/command-application.d.ts.map +1 -1
- package/dist/application/command-application.js +2 -2
- package/dist/application/command-application.js.map +2 -2
- package/dist/application/index.d.ts +3 -3
- package/dist/application/index.d.ts.map +1 -1
- package/dist/application/index.js +4 -4
- package/dist/application/index.js.map +2 -2
- package/dist/application/web-application.d.ts +5 -5
- package/dist/application/web-application.d.ts.map +1 -1
- package/dist/application/web-application.js +6 -7
- package/dist/application/web-application.js.map +2 -2
- package/dist/application/worker-application.d.ts +2 -2
- package/dist/application/worker-application.d.ts.map +1 -1
- package/dist/application/worker-application.js +2 -2
- package/dist/application/worker-application.js.map +2 -2
- package/dist/auth/jwt.d.ts.map +1 -1
- package/dist/auth/jwt.js +2 -2
- package/dist/auth/jwt.js.map +2 -2
- package/dist/cache/manager.d.ts.map +1 -1
- package/dist/cache/manager.js.map +2 -2
- package/dist/cli/index.js +192 -7029
- package/dist/cli/index.js.map +4 -4
- package/dist/cluster/cluster-manager.d.ts.map +1 -1
- package/dist/cluster/cluster-manager.js +1 -1
- package/dist/cluster/cluster-manager.js.map +2 -2
- package/dist/command/command.d.ts +1 -1
- package/dist/command/command.d.ts.map +1 -1
- package/dist/command/command.js.map +2 -2
- package/dist/config/env.d.ts +1 -1
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +1 -1
- package/dist/config/schema.js.map +2 -2
- package/dist/database/dynamic-entity.js +9 -9
- package/dist/database/dynamic-entity.js.map +2 -2
- package/dist/database/index.d.ts +3 -3
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +5 -5
- package/dist/database/index.js.map +2 -2
- package/dist/database/instance.d.ts +3 -3
- package/dist/database/instance.js +3 -3
- package/dist/database/instance.js.map +1 -1
- package/dist/database/manager.d.ts +1 -0
- package/dist/database/manager.d.ts.map +1 -1
- package/dist/database/manager.js +16 -3
- package/dist/database/manager.js.map +2 -2
- package/dist/error/error-reporter.js +1 -1
- package/dist/error/error-reporter.js.map +2 -2
- package/dist/error/index.d.ts +2 -3
- package/dist/error/index.d.ts.map +1 -1
- package/dist/error/index.js +8 -9
- package/dist/error/index.js.map +2 -2
- package/dist/event/controller/base.d.ts +2 -2
- package/dist/event/controller/base.d.ts.map +1 -1
- package/dist/event/controller/base.js +2 -2
- package/dist/event/controller/base.js.map +2 -2
- package/dist/event/index.d.ts +3 -3
- package/dist/event/index.d.ts.map +1 -1
- package/dist/event/index.js +5 -5
- package/dist/event/index.js.map +2 -2
- package/dist/event/manager.d.ts.map +1 -1
- package/dist/event/manager.interface.d.ts +2 -3
- package/dist/event/manager.interface.d.ts.map +1 -1
- package/dist/event/manager.js.map +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/lifecycle/index.d.ts +3 -3
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/index.js +1 -1
- package/dist/lifecycle/index.js.map +2 -2
- package/dist/logger/logger.d.ts +20 -1
- package/dist/logger/logger.d.ts.map +1 -1
- package/dist/logger/logger.js +68 -96
- package/dist/logger/logger.js.map +2 -2
- package/dist/performance/cache-performance.d.ts.map +1 -1
- package/dist/performance/cache-performance.js +1 -1
- package/dist/performance/cache-performance.js.map +2 -2
- package/dist/performance/database-performance.d.ts.map +1 -1
- package/dist/performance/database-performance.js +1 -1
- package/dist/performance/database-performance.js.map +2 -2
- package/dist/performance/index.d.ts +3 -3
- package/dist/performance/index.d.ts.map +1 -1
- package/dist/performance/index.js +3 -3
- package/dist/performance/index.js.map +1 -1
- package/dist/performance/performance-monitor.js +2 -2
- package/dist/performance/performance-monitor.js.map +2 -2
- package/dist/performance/performance-monitor.plugin.d.ts.map +1 -1
- package/dist/performance/performance-monitor.plugin.js +1 -1
- package/dist/performance/performance-monitor.plugin.js.map +2 -2
- package/dist/performance/queue-performance.d.ts.map +1 -1
- package/dist/performance/queue-performance.js +1 -1
- package/dist/performance/queue-performance.js.map +2 -2
- package/dist/performance/webserver-performance.d.ts.map +1 -1
- package/dist/performance/webserver-performance.js +1 -1
- package/dist/performance/webserver-performance.js.map +2 -2
- package/dist/performance/websocket-performance.d.ts.map +1 -1
- package/dist/performance/websocket-performance.js +1 -1
- package/dist/performance/websocket-performance.js.map +2 -2
- package/dist/queue/index.d.ts +2 -2
- package/dist/queue/index.d.ts.map +1 -1
- package/dist/queue/index.interface.d.ts +1 -1
- package/dist/queue/index.interface.d.ts.map +1 -1
- package/dist/queue/index.js.map +2 -2
- package/dist/queue/manager.d.ts +3 -2
- package/dist/queue/manager.d.ts.map +1 -1
- package/dist/queue/manager.js +5 -2
- package/dist/queue/manager.js.map +2 -2
- package/dist/queue/processor/base.d.ts +5 -5
- package/dist/queue/processor/base.d.ts.map +1 -1
- package/dist/queue/processor/base.js +2 -2
- package/dist/queue/processor/base.js.map +2 -2
- package/dist/queue/processor/processor.interface.d.ts +3 -3
- package/dist/queue/processor/processor.interface.d.ts.map +1 -1
- package/dist/queue/worker.d.ts.map +1 -1
- package/dist/queue/worker.interface.d.ts +1 -1
- package/dist/queue/worker.interface.d.ts.map +1 -1
- package/dist/queue/worker.js +1 -1
- package/dist/queue/worker.js.map +2 -2
- package/dist/redis/index.d.ts +1 -1
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/redis/index.js +4 -4
- package/dist/redis/index.js.map +2 -2
- package/dist/redis/manager.d.ts +2 -1
- package/dist/redis/manager.d.ts.map +1 -1
- package/dist/redis/manager.js +7 -4
- package/dist/redis/manager.js.map +2 -2
- package/dist/request-context/index.d.ts +1 -1
- package/dist/request-context/index.d.ts.map +1 -1
- package/dist/request-context/index.js +5 -5
- package/dist/request-context/index.js.map +1 -1
- package/dist/schemas/entity-builder.d.ts +3 -3
- package/dist/schemas/entity-builder.d.ts.map +1 -1
- package/dist/schemas/entity-builder.js.map +1 -1
- package/dist/services/aws/s3.d.ts.map +1 -1
- package/dist/services/aws/s3.js +7 -10
- package/dist/services/aws/s3.js.map +2 -2
- package/dist/util/file.d.ts +0 -6
- package/dist/util/file.d.ts.map +1 -1
- package/dist/util/file.js +6 -28
- package/dist/util/file.js.map +2 -2
- package/dist/util/helper.js +2 -2
- package/dist/util/helper.js.map +2 -2
- package/dist/util/index.d.ts +2 -2
- package/dist/util/index.d.ts.map +1 -1
- package/dist/util/index.js +18 -18
- package/dist/util/index.js.map +2 -2
- package/dist/util/loader.js +3 -3
- package/dist/util/loader.js.map +2 -2
- package/dist/util/os.js +2 -2
- package/dist/util/os.js.map +2 -2
- package/dist/webserver/controller/auth-middleware.d.ts +1 -1
- package/dist/webserver/controller/auth-middleware.d.ts.map +1 -1
- package/dist/webserver/controller/auth-middleware.js +1 -1
- package/dist/webserver/controller/auth-middleware.js.map +2 -2
- package/dist/webserver/controller/base.d.ts +6 -6
- package/dist/webserver/controller/base.d.ts.map +1 -1
- package/dist/webserver/controller/base.interface.d.ts +1 -1
- package/dist/webserver/controller/base.interface.d.ts.map +1 -1
- package/dist/webserver/controller/base.js +4 -4
- package/dist/webserver/controller/base.js.map +2 -2
- package/dist/webserver/controller/entity.d.ts +3 -3
- package/dist/webserver/controller/entity.d.ts.map +1 -1
- package/dist/webserver/controller/entity.js +19 -17
- package/dist/webserver/controller/entity.js.map +2 -2
- package/dist/webserver/controller/example-auth.d.ts.map +1 -1
- package/dist/webserver/controller/example-auth.js +1 -1
- package/dist/webserver/controller/example-auth.js.map +2 -2
- package/dist/webserver/controller/health.d.ts.map +1 -1
- package/dist/webserver/controller/health.js +1 -1
- package/dist/webserver/controller/health.js.map +2 -2
- package/dist/webserver/define-action.d.ts +1 -1
- package/dist/webserver/define-action.d.ts.map +1 -1
- package/dist/webserver/define-action.js.map +1 -1
- package/dist/webserver/define-route.d.ts +1 -1
- package/dist/webserver/define-route.d.ts.map +1 -1
- package/dist/webserver/define-route.js.map +2 -2
- package/dist/webserver/index.d.ts +9 -9
- package/dist/webserver/index.d.ts.map +1 -1
- package/dist/webserver/index.js +14 -14
- package/dist/webserver/index.js.map +2 -2
- package/dist/webserver/webserver.d.ts +3 -3
- package/dist/webserver/webserver.d.ts.map +1 -1
- package/dist/webserver/webserver.interface.d.ts +5 -5
- package/dist/webserver/webserver.interface.d.ts.map +1 -1
- package/dist/webserver/webserver.interface.js.map +1 -1
- package/dist/webserver/webserver.js +9 -9
- package/dist/webserver/webserver.js.map +2 -2
- package/dist/websocket/controller/server/base.d.ts +2 -2
- package/dist/websocket/controller/server/base.js.map +1 -1
- package/dist/websocket/controllers/server/system.d.ts.map +1 -1
- package/dist/websocket/controllers/server/system.js +1 -1
- package/dist/websocket/controllers/server/system.js.map +2 -2
- package/dist/websocket/index.d.ts +9 -11
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +22 -22
- package/dist/websocket/index.js.map +2 -2
- package/dist/websocket/subscriber-middleware.d.ts.map +1 -1
- package/dist/websocket/subscriber-middleware.js.map +2 -2
- package/dist/websocket/subscriber-utils.d.ts.map +1 -1
- package/dist/websocket/subscriber-utils.js.map +2 -2
- package/dist/websocket/utils.d.ts.map +1 -1
- package/dist/websocket/utils.js +4 -2
- package/dist/websocket/utils.js.map +2 -2
- package/dist/websocket/websocket-auth.d.ts.map +1 -1
- package/dist/websocket/websocket-auth.js +3 -3
- package/dist/websocket/websocket-auth.js.map +2 -2
- package/dist/websocket/websocket-base.d.ts +2 -2
- package/dist/websocket/websocket-base.d.ts.map +1 -1
- package/dist/websocket/websocket-base.js +1 -1
- package/dist/websocket/websocket-base.js.map +2 -2
- package/dist/websocket/websocket-client-manager.d.ts.map +1 -1
- package/dist/websocket/websocket-client-manager.js +3 -3
- package/dist/websocket/websocket-client-manager.js.map +2 -2
- package/dist/websocket/websocket-client.d.ts +5 -5
- package/dist/websocket/websocket-client.d.ts.map +1 -1
- package/dist/websocket/websocket-client.js +5 -5
- package/dist/websocket/websocket-client.js.map +2 -2
- package/dist/websocket/websocket-room-manager.js +1 -1
- package/dist/websocket/websocket-room-manager.js.map +1 -1
- package/dist/websocket/websocket-server.d.ts +7 -7
- package/dist/websocket/websocket-server.d.ts.map +1 -1
- package/dist/websocket/websocket-server.js +25 -20
- package/dist/websocket/websocket-server.js.map +2 -2
- package/dist/websocket/websocket-service.d.ts +2 -2
- package/dist/websocket/websocket-service.d.ts.map +1 -1
- package/dist/websocket/websocket-service.js +1 -1
- package/dist/websocket/websocket-service.js.map +2 -2
- package/dist/websocket/websocket.interface.d.ts +3 -5
- package/dist/websocket/websocket.interface.d.ts.map +1 -1
- package/dist/websocket/websocket.interface.js.map +2 -2
- package/package.json +68 -64
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
3
|
import { Logger } from "../logger/index.js";
|
|
4
|
-
import { PerformanceMonitor } from "./performance-monitor.js";
|
|
5
4
|
import { CachePerformanceWrapper, DatabasePerformanceWrapper, QueuePerformanceWrapper } from "./index.js";
|
|
5
|
+
import { PerformanceMonitor } from "./performance-monitor.js";
|
|
6
6
|
class PerformanceMonitorPlugin {
|
|
7
7
|
constructor(app) {
|
|
8
8
|
this.app = app;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/performance/performance-monitor.plugin.ts"],
|
|
4
|
-
"sourcesContent": ["import type BaseApplication from '../application/base-application.js';\nimport { Logger } from '../logger/index.js';\nimport {
|
|
5
|
-
"mappings": ";;AACA,SAAS,cAAc;AACvB,SAAS,
|
|
4
|
+
"sourcesContent": ["import type BaseApplication from '../application/base-application.js';\nimport { Logger } from '../logger/index.js';\nimport { CachePerformanceWrapper, DatabasePerformanceWrapper, QueuePerformanceWrapper } from './index.js';\nimport { PerformanceMonitor, type PerformanceMonitorOptions } from './performance-monitor.js';\n\n/**\n * PerformanceMonitorPlugin\n *\n * Converts the previous side-effect constructor initialization into an opt\u2011in plugin.\n * Responsibilities:\n * - Initialize PerformanceMonitor when enabled in config\n * - Register metric wrappers (DB / Queue / Cache) based on flags\n * - Schedule periodic reporting (tracked via lifecycle for auto cleanup)\n * - Dispose monitor on shutdown\n */\nexport class PerformanceMonitorPlugin {\n private started = false;\n private abortController = new AbortController();\n\n private constructor(private readonly app: BaseApplication) {}\n\n /** Register and immediately start (idempotent) */\n public static register(app: BaseApplication): PerformanceMonitorPlugin {\n const plugin = new PerformanceMonitorPlugin(app);\n plugin.start();\n // Ensure cleanup on shutdown\n app.lifecycle.onShutdown(async () => plugin.stop());\n return plugin;\n }\n\n /** Initialize monitor & ancillary behaviors */\n public start(): void {\n if (this.started) return;\n // biome-ignore lint/complexity/useLiteralKeys: bracket notation bypasses protected access on BaseApplication.config\n const cfg = this.app['config'].performanceMonitoring;\n if (!cfg?.enabled) {\n Logger.debug({ message: 'PerformanceMonitorPlugin: disabled via configuration' });\n return; // remain not started\n }\n\n const options: PerformanceMonitorOptions = {\n enabled: true,\n thresholds: cfg.thresholds,\n maxMetricsHistory: cfg.maxMetricsHistory,\n logSlowOperations: cfg.logSlowOperations,\n logAllOperations: cfg.logAllOperations,\n };\n\n this.app.performanceMonitor = PerformanceMonitor.initialize(options);\n\n // Register component wrappers according to config\n try {\n if (cfg.monitorDatabaseOperations !== false) {\n DatabasePerformanceWrapper.setPerformanceMonitor(this.app.performanceMonitor);\n }\n if (cfg.monitorQueueOperations !== false) {\n QueuePerformanceWrapper.setPerformanceMonitor(this.app.performanceMonitor);\n }\n if (cfg.monitorCacheOperations !== false) {\n CachePerformanceWrapper.setPerformanceMonitor(this.app.performanceMonitor);\n }\n } catch (error) {\n Logger.warn({ message: 'PerformanceMonitorPlugin: error configuring wrappers', error });\n }\n\n // Periodic reporting\n if (cfg.reportInterval && cfg.reportInterval > 0) {\n // Note: setInterval with signal option requires Node.js 15+\n // TypeScript types may not reflect this, so we use type assertion\n (setInterval as (fn: () => void, ms: number, options?: { signal: AbortSignal }) => NodeJS.Timeout)(\n () => {\n try {\n const reportFormat = cfg.reportFormat ?? 'detailed';\n const report = this.app.performanceMonitor?.generateFormattedReport(reportFormat);\n if (report) {\n Logger.info({ message: report });\n }\n } catch (error) {\n Logger.warn({ message: 'PerformanceMonitorPlugin: failed generating report', error });\n }\n },\n cfg.reportInterval,\n { signal: this.abortController.signal },\n );\n }\n\n this.started = true;\n Logger.debug({ message: 'PerformanceMonitorPlugin: started' });\n }\n\n /** Destroy monitor & clear references */\n public stop(): void {\n if (!this.started) return;\n\n // Abort all ongoing operations (intervals, etc.)\n this.abortController.abort();\n\n try {\n this.app.performanceMonitor?.destroy();\n } catch (error) {\n Logger.warn({ message: 'PerformanceMonitorPlugin: error during destroy', error });\n }\n this.app.performanceMonitor = undefined;\n\n // Create new AbortController for potential restart\n this.abortController = new AbortController();\n\n this.started = false;\n Logger.debug({ message: 'PerformanceMonitorPlugin: stopped' });\n }\n}\n"],
|
|
5
|
+
"mappings": ";;AACA,SAAS,cAAc;AACvB,SAAS,yBAAyB,4BAA4B,+BAA+B;AAC7F,SAAS,0BAA0D;AAY5D,MAAM,yBAAyB;AAAA,EAI5B,YAA6B,KAAsB;AAAtB;AAAA,EAAuB;AAAA,EAnB9D,OAesC;AAAA;AAAA;AAAA,EAC5B,UAAU;AAAA,EACV,kBAAkB,IAAI,gBAAgB;AAAA;AAAA,EAK9C,OAAc,SAAS,KAAgD;AACrE,UAAM,SAAS,IAAI,yBAAyB,GAAG;AAC/C,WAAO,MAAM;AAEb,QAAI,UAAU,WAAW,YAAY,OAAO,KAAK,CAAC;AAClD,WAAO;AAAA,EACT;AAAA;AAAA,EAGO,QAAc;AACnB,QAAI,KAAK,QAAS;AAElB,UAAM,MAAM,KAAK,IAAI,QAAQ,EAAE;AAC/B,QAAI,CAAC,KAAK,SAAS;AACjB,aAAO,MAAM,EAAE,SAAS,uDAAuD,CAAC;AAChF;AAAA,IACF;AAEA,UAAM,UAAqC;AAAA,MACzC,SAAS;AAAA,MACT,YAAY,IAAI;AAAA,MAChB,mBAAmB,IAAI;AAAA,MACvB,mBAAmB,IAAI;AAAA,MACvB,kBAAkB,IAAI;AAAA,IACxB;AAEA,SAAK,IAAI,qBAAqB,mBAAmB,WAAW,OAAO;AAGnE,QAAI;AACF,UAAI,IAAI,8BAA8B,OAAO;AAC3C,mCAA2B,sBAAsB,KAAK,IAAI,kBAAkB;AAAA,MAC9E;AACA,UAAI,IAAI,2BAA2B,OAAO;AACxC,gCAAwB,sBAAsB,KAAK,IAAI,kBAAkB;AAAA,MAC3E;AACA,UAAI,IAAI,2BAA2B,OAAO;AACxC,gCAAwB,sBAAsB,KAAK,IAAI,kBAAkB;AAAA,MAC3E;AAAA,IACF,SAAS,OAAO;AACd,aAAO,KAAK,EAAE,SAAS,wDAAwD,MAAM,CAAC;AAAA,IACxF;AAGA,QAAI,IAAI,kBAAkB,IAAI,iBAAiB,GAAG;AAGhD,MAAC;AAAA,QACC,MAAM;AACJ,cAAI;AACF,kBAAM,eAAe,IAAI,gBAAgB;AACzC,kBAAM,SAAS,KAAK,IAAI,oBAAoB,wBAAwB,YAAY;AAChF,gBAAI,QAAQ;AACV,qBAAO,KAAK,EAAE,SAAS,OAAO,CAAC;AAAA,YACjC;AAAA,UACF,SAAS,OAAO;AACd,mBAAO,KAAK,EAAE,SAAS,sDAAsD,MAAM,CAAC;AAAA,UACtF;AAAA,QACF;AAAA,QACA,IAAI;AAAA,QACJ,EAAE,QAAQ,KAAK,gBAAgB,OAAO;AAAA,MACxC;AAAA,IACF;AAEA,SAAK,UAAU;AACf,WAAO,MAAM,EAAE,SAAS,oCAAoC,CAAC;AAAA,EAC/D;AAAA;AAAA,EAGO,OAAa;AAClB,QAAI,CAAC,KAAK,QAAS;AAGnB,SAAK,gBAAgB,MAAM;AAE3B,QAAI;AACF,WAAK,IAAI,oBAAoB,QAAQ;AAAA,IACvC,SAAS,OAAO;AACd,aAAO,KAAK,EAAE,SAAS,kDAAkD,MAAM,CAAC;AAAA,IAClF;AACA,SAAK,IAAI,qBAAqB;AAG9B,SAAK,kBAAkB,IAAI,gBAAgB;AAE3C,SAAK,UAAU;AACf,WAAO,MAAM,EAAE,SAAS,oCAAoC,CAAC;AAAA,EAC/D;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-performance.d.ts","sourceRoot":"","sources":["../../src/performance/queue-performance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAqB;WAExC,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAItE,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAOpC;;OAEG;WACiB,oBAAoB,CAAC,CAAC,EACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAkBb;;OAEG;WACiB,kBAAkB,CAAC,CAAC,EACtC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAkBb;;OAEG;WACiB,qBAAqB,CAAC,CAAC,EACzC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,gBAAgB,CAAC,CAAC,EACpC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,aAAa,CAAC,CAAC,EACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAgBb;;OAEG;WACiB,eAAe,CAAC,CAAC,EACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;CAkBd;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"queue-performance.d.ts","sourceRoot":"","sources":["../../src/performance/queue-performance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAqB;WAExC,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAItE,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAOpC;;OAEG;WACiB,oBAAoB,CAAC,CAAC,EACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAkBb;;OAEG;WACiB,kBAAkB,CAAC,CAAC,EACtC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAkBb;;OAEG;WACiB,qBAAqB,CAAC,CAAC,EACzC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,gBAAgB,CAAC,CAAC,EACpC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,aAAa,CAAC,CAAC,EACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IAgBb;;OAEG;WACiB,eAAe,CAAC,CAAC,EACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;CAkBd;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,CAAC,EAAE,MAAM,IAClD,QAAQ,GAAG,EAAE,aAAa,MAAM,EAAE,YAAY,kBAAkB,wBAezE"}
|
|
@@ -122,7 +122,7 @@ class QueuePerformanceWrapper {
|
|
|
122
122
|
}
|
|
123
123
|
}
|
|
124
124
|
function MonitorQueueProcessor(processorName) {
|
|
125
|
-
return
|
|
125
|
+
return (target, propertyKey, descriptor) => {
|
|
126
126
|
const originalMethod = descriptor.value;
|
|
127
127
|
const className = target.constructor.name;
|
|
128
128
|
const operation = processorName ?? propertyKey;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/performance/queue-performance.ts"],
|
|
4
|
-
"sourcesContent": ["import { PerformanceMonitor } from './performance-monitor.js';\n\nexport interface QueueOperationMetadata {\n operation: string;\n queueName?: string;\n jobName?: string;\n jobId?: string;\n priority?: number;\n delay?: number;\n attempts?: number;\n error?: string;\n argumentCount?: number;\n}\n\nexport class QueuePerformanceWrapper {\n private static performanceMonitor: PerformanceMonitor;\n\n public static setPerformanceMonitor(monitor: PerformanceMonitor): void {\n QueuePerformanceWrapper.performanceMonitor = monitor;\n }\n\n private static getPerformanceMonitor(): PerformanceMonitor {\n if (!QueuePerformanceWrapper.performanceMonitor) {\n QueuePerformanceWrapper.performanceMonitor = PerformanceMonitor.getInstance();\n }\n return QueuePerformanceWrapper.performanceMonitor;\n }\n\n /**\n * Monitor job processing\n */\n public static async monitorJobProcessing<T>(\n queueName: string,\n jobName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'job_processing',\n queueName,\n jobName,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `${queueName}.${jobName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor job addition to queue\n */\n public static async monitorJobAddition<T>(\n queueName: string,\n jobName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'job_addition',\n queueName,\n jobName,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `add.${queueName}.${jobName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor queue operations\n */\n public static async monitorQueueOperation<T>(\n queueName: string,\n operationName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: operationName,\n queueName,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `queue.${queueName}.${operationName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor processor execution\n */\n public static async monitorProcessor<T>(\n processorName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'processor_execution',\n jobName: processorName,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `processor.${processorName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor queue worker operations\n */\n public static async monitorWorker<T>(\n workerName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'worker_execution',\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `worker.${workerName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor job retry operations\n */\n public static async monitorJobRetry<T>(\n queueName: string,\n jobName: string,\n attempt: number,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'job_retry',\n queueName,\n jobName,\n attempts: attempt,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `retry.${queueName}.${jobName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n}\n\n/**\n * Decorator for monitoring queue processor methods\n */\nexport function MonitorQueueProcessor(processorName?: string) {\n return
|
|
5
|
-
"mappings": ";;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,
|
|
4
|
+
"sourcesContent": ["import { PerformanceMonitor } from './performance-monitor.js';\n\nexport interface QueueOperationMetadata {\n operation: string;\n queueName?: string;\n jobName?: string;\n jobId?: string;\n priority?: number;\n delay?: number;\n attempts?: number;\n error?: string;\n argumentCount?: number;\n}\n\nexport class QueuePerformanceWrapper {\n private static performanceMonitor: PerformanceMonitor;\n\n public static setPerformanceMonitor(monitor: PerformanceMonitor): void {\n QueuePerformanceWrapper.performanceMonitor = monitor;\n }\n\n private static getPerformanceMonitor(): PerformanceMonitor {\n if (!QueuePerformanceWrapper.performanceMonitor) {\n QueuePerformanceWrapper.performanceMonitor = PerformanceMonitor.getInstance();\n }\n return QueuePerformanceWrapper.performanceMonitor;\n }\n\n /**\n * Monitor job processing\n */\n public static async monitorJobProcessing<T>(\n queueName: string,\n jobName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'job_processing',\n queueName,\n jobName,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `${queueName}.${jobName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor job addition to queue\n */\n public static async monitorJobAddition<T>(\n queueName: string,\n jobName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'job_addition',\n queueName,\n jobName,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `add.${queueName}.${jobName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor queue operations\n */\n public static async monitorQueueOperation<T>(\n queueName: string,\n operationName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: operationName,\n queueName,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `queue.${queueName}.${operationName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor processor execution\n */\n public static async monitorProcessor<T>(\n processorName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'processor_execution',\n jobName: processorName,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `processor.${processorName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor queue worker operations\n */\n public static async monitorWorker<T>(\n workerName: string,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'worker_execution',\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `worker.${workerName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor job retry operations\n */\n public static async monitorJobRetry<T>(\n queueName: string,\n jobName: string,\n attempt: number,\n operation: () => Promise<T>,\n metadata?: Partial<QueueOperationMetadata>,\n ): Promise<T> {\n const monitor = QueuePerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: QueueOperationMetadata = {\n operation: 'job_retry',\n queueName,\n jobName,\n attempts: attempt,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `retry.${queueName}.${jobName}`,\n type: 'queue',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n}\n\n/**\n * Decorator for monitoring queue processor methods\n */\nexport function MonitorQueueProcessor(processorName?: string) {\n return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n const originalMethod = descriptor.value;\n const className = target.constructor.name;\n const operation = processorName ?? propertyKey;\n\n descriptor.value = async function (...args: any[]) {\n return QueuePerformanceWrapper.monitorProcessor(\n `${className}.${operation}`,\n () => originalMethod.apply(this, args),\n { argumentCount: args.length },\n );\n };\n\n return descriptor;\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webserver-performance.d.ts","sourceRoot":"","sources":["../../src/performance/webserver-performance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,2BAA2B;IAC1C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,2BAA2B;IACtC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAqB;WAExC,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAItE,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAOpC;;OAEG;WACW,2BAA2B,CAAC,OAAO,GAAE,2BAAgC,IAanE,SAAS,cAAc,EAAE,QAAQ,YAAY;IA0B7D;;OAEG;WACW,sBAAsB,CAAC,QAAQ,GAAE,2BAAgC;0BAInD,cAAc,SAAS,YAAY,WAAW,GAAG;2BAgBhD,cAAc,SAAS,YAAY,SAAS,KAAK;;IAkB9E;;OAEG;WACiB,uBAAuB,CAAC,CAAC,EAAE,EAC7C,cAAc,EACd,UAAU,EACV,SAAS,EACT,QAAQ,GACT,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,CAAC,CAAC;IAed;;OAEG;WACiB,mBAAmB,CAAC,CAAC,EAAE,EACzC,KAAK,EACL,MAAM,EACN,SAAS,EACT,QAAQ,GACT,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,CAAC,CAAC;IAWd;;OAEG;WACiB,iBAAiB,CAAC,CAAC,EAAE,EACvC,cAAc,EACd,SAAS,EACT,QAAQ,GACT,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,CAAC,CAAC;CAaf;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"webserver-performance.d.ts","sourceRoot":"","sources":["../../src/performance/webserver-performance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,2BAA2B;IAC1C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,2BAA2B;IACtC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAqB;WAExC,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAItE,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAOpC;;OAEG;WACW,2BAA2B,CAAC,OAAO,GAAE,2BAAgC,IAanE,SAAS,cAAc,EAAE,QAAQ,YAAY;IA0B7D;;OAEG;WACW,sBAAsB,CAAC,QAAQ,GAAE,2BAAgC;0BAInD,cAAc,SAAS,YAAY,WAAW,GAAG;2BAgBhD,cAAc,SAAS,YAAY,SAAS,KAAK;;IAkB9E;;OAEG;WACiB,uBAAuB,CAAC,CAAC,EAAE,EAC7C,cAAc,EACd,UAAU,EACV,SAAS,EACT,QAAQ,GACT,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,CAAC,CAAC;IAed;;OAEG;WACiB,mBAAmB,CAAC,CAAC,EAAE,EACzC,KAAK,EACL,MAAM,EACN,SAAS,EACT,QAAQ,GACT,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,CAAC,CAAC;IAWd;;OAEG;WACiB,iBAAiB,CAAC,CAAC,EAAE,EACvC,cAAc,EACd,SAAS,EACT,QAAQ,GACT,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,CAAC,CAAC;CAaf;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,CAAC,EAAE,MAAM,IACjD,QAAQ,GAAG,EAAE,aAAa,MAAM,EAAE,YAAY,kBAAkB,wBAgBzE"}
|
|
@@ -141,7 +141,7 @@ class WebServerPerformanceWrapper {
|
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
143
|
function MonitorControllerMethod(methodName) {
|
|
144
|
-
return
|
|
144
|
+
return (target, propertyKey, descriptor) => {
|
|
145
145
|
const originalMethod = descriptor.value;
|
|
146
146
|
const controllerName = target.constructor.name;
|
|
147
147
|
const operation = methodName ?? propertyKey;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/performance/webserver-performance.ts"],
|
|
4
|
-
"sourcesContent": ["import type { FastifyReply, FastifyRequest } from 'fastify';\nimport { PerformanceMonitor } from './performance-monitor.js';\n\nexport interface WebServerPerformanceOptions {\n logSlowRequests?: boolean;\n slowRequestThreshold?: number;\n includeHeaders?: boolean;\n includeUserAgent?: boolean;\n skipRoutes?: string[];\n skipMethods?: string[];\n}\n\nexport interface HttpRequestMetadata {\n method: string;\n url: string;\n ip?: string;\n userAgent?: string;\n headers?: Record<string, string | string[] | undefined>;\n statusCode?: number;\n contentLength?: number;\n error?: string;\n errorName?: string;\n argumentCount?: number;\n}\n\nexport class WebServerPerformanceWrapper {\n private static performanceMonitor: PerformanceMonitor;\n\n public static setPerformanceMonitor(monitor: PerformanceMonitor): void {\n WebServerPerformanceWrapper.performanceMonitor = monitor;\n }\n\n private static getPerformanceMonitor(): PerformanceMonitor {\n if (!WebServerPerformanceWrapper.performanceMonitor) {\n WebServerPerformanceWrapper.performanceMonitor = PerformanceMonitor.getInstance();\n }\n return WebServerPerformanceWrapper.performanceMonitor;\n }\n\n /**\n * Create performance middleware for Fastify\n */\n public static createPerformanceMiddleware(options: WebServerPerformanceOptions = {}) {\n const defaultOptions: WebServerPerformanceOptions = {\n logSlowRequests: true,\n slowRequestThreshold: 1000, // 1 second\n includeHeaders: false,\n includeUserAgent: true,\n skipRoutes: ['/health/live', '/health/ready', '/metrics'],\n skipMethods: [],\n };\n\n const config = { ...defaultOptions, ...options };\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return async (request: FastifyRequest, _reply: FastifyReply) => {\n const { method, url, headers, ip } = request;\n const routeKey = `${method} ${url}`;\n\n // Skip monitoring for specified routes or methods\n if (config.skipRoutes?.includes(url) || config.skipMethods?.includes(method)) {\n return;\n }\n\n const startMark = monitor.startMeasure(routeKey, 'http');\n\n // Add request metadata\n const metadata: HttpRequestMetadata = {\n method,\n url,\n ip,\n userAgent: config.includeUserAgent ? (headers['user-agent'] as string) : undefined,\n headers: config.includeHeaders ? headers : undefined,\n };\n\n // Store metadata on request for later use\n (request as any).performanceMetadata = metadata;\n (request as any).performanceStartMark = startMark;\n };\n }\n\n /**\n * Create Fastify hooks for performance monitoring\n */\n public static createPerformanceHooks(_options: WebServerPerformanceOptions = {}) {\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return {\n onSend: async (request: FastifyRequest, reply: FastifyReply, payload: any) => {\n const startMark = (request as any).performanceStartMark;\n const metadata = (request as any).performanceMetadata;\n\n if (startMark && metadata) {\n const responseMetadata: HttpRequestMetadata = {\n ...metadata,\n statusCode: reply.statusCode,\n contentLength: payload ? String(payload).length : 0,\n };\n\n monitor.endMeasure(startMark, responseMetadata);\n }\n\n return payload;\n },\n onError: async (request: FastifyRequest, reply: FastifyReply, error: Error) => {\n const startMark = (request as any).performanceStartMark;\n const metadata = (request as any).performanceMetadata;\n\n if (startMark && metadata) {\n const errorMetadata: HttpRequestMetadata = {\n ...metadata,\n statusCode: reply.statusCode,\n error: error.message,\n errorName: error.name,\n };\n\n monitor.endMeasure(startMark, errorMetadata);\n }\n },\n };\n }\n\n /**\n * Monitor controller method execution\n */\n public static async monitorControllerMethod<T>({\n controllerName,\n methodName,\n operation,\n metadata,\n }: {\n controllerName: string;\n methodName: string;\n operation: () => Promise<T>;\n metadata?: Record<string, any>;\n }): Promise<T> {\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return monitor.measureAsync({\n name: `${controllerName}.${methodName}`,\n type: 'http',\n fn: operation,\n metadata: {\n controller: controllerName,\n method: methodName,\n ...metadata,\n },\n });\n }\n\n /**\n * Monitor route handler execution\n */\n public static async monitorRouteHandler<T>({\n route,\n method,\n operation,\n metadata,\n }: {\n route: string;\n method: string;\n operation: () => Promise<T>;\n metadata?: Record<string, any>;\n }): Promise<T> {\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return monitor.measureAsync({\n name: `${method} ${route}`,\n type: 'http',\n fn: operation,\n metadata: { route, method, ...metadata },\n });\n }\n\n /**\n * Monitor middleware execution\n */\n public static async monitorMiddleware<T>({\n middlewareName,\n operation,\n metadata,\n }: {\n middlewareName: string;\n operation: () => Promise<T>;\n metadata?: Record<string, any>;\n }): Promise<T> {\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return monitor.measureAsync({\n name: `middleware.${middlewareName}`,\n type: 'http',\n fn: operation,\n metadata: {\n middleware: middlewareName,\n ...metadata,\n },\n });\n }\n}\n\n/**\n * Decorator for monitoring controller methods\n */\nexport function MonitorControllerMethod(methodName?: string) {\n return
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import type { FastifyReply, FastifyRequest } from 'fastify';\nimport { PerformanceMonitor } from './performance-monitor.js';\n\nexport interface WebServerPerformanceOptions {\n logSlowRequests?: boolean;\n slowRequestThreshold?: number;\n includeHeaders?: boolean;\n includeUserAgent?: boolean;\n skipRoutes?: string[];\n skipMethods?: string[];\n}\n\nexport interface HttpRequestMetadata {\n method: string;\n url: string;\n ip?: string;\n userAgent?: string;\n headers?: Record<string, string | string[] | undefined>;\n statusCode?: number;\n contentLength?: number;\n error?: string;\n errorName?: string;\n argumentCount?: number;\n}\n\nexport class WebServerPerformanceWrapper {\n private static performanceMonitor: PerformanceMonitor;\n\n public static setPerformanceMonitor(monitor: PerformanceMonitor): void {\n WebServerPerformanceWrapper.performanceMonitor = monitor;\n }\n\n private static getPerformanceMonitor(): PerformanceMonitor {\n if (!WebServerPerformanceWrapper.performanceMonitor) {\n WebServerPerformanceWrapper.performanceMonitor = PerformanceMonitor.getInstance();\n }\n return WebServerPerformanceWrapper.performanceMonitor;\n }\n\n /**\n * Create performance middleware for Fastify\n */\n public static createPerformanceMiddleware(options: WebServerPerformanceOptions = {}) {\n const defaultOptions: WebServerPerformanceOptions = {\n logSlowRequests: true,\n slowRequestThreshold: 1000, // 1 second\n includeHeaders: false,\n includeUserAgent: true,\n skipRoutes: ['/health/live', '/health/ready', '/metrics'],\n skipMethods: [],\n };\n\n const config = { ...defaultOptions, ...options };\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return async (request: FastifyRequest, _reply: FastifyReply) => {\n const { method, url, headers, ip } = request;\n const routeKey = `${method} ${url}`;\n\n // Skip monitoring for specified routes or methods\n if (config.skipRoutes?.includes(url) || config.skipMethods?.includes(method)) {\n return;\n }\n\n const startMark = monitor.startMeasure(routeKey, 'http');\n\n // Add request metadata\n const metadata: HttpRequestMetadata = {\n method,\n url,\n ip,\n userAgent: config.includeUserAgent ? (headers['user-agent'] as string) : undefined,\n headers: config.includeHeaders ? headers : undefined,\n };\n\n // Store metadata on request for later use\n (request as any).performanceMetadata = metadata;\n (request as any).performanceStartMark = startMark;\n };\n }\n\n /**\n * Create Fastify hooks for performance monitoring\n */\n public static createPerformanceHooks(_options: WebServerPerformanceOptions = {}) {\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return {\n onSend: async (request: FastifyRequest, reply: FastifyReply, payload: any) => {\n const startMark = (request as any).performanceStartMark;\n const metadata = (request as any).performanceMetadata;\n\n if (startMark && metadata) {\n const responseMetadata: HttpRequestMetadata = {\n ...metadata,\n statusCode: reply.statusCode,\n contentLength: payload ? String(payload).length : 0,\n };\n\n monitor.endMeasure(startMark, responseMetadata);\n }\n\n return payload;\n },\n onError: async (request: FastifyRequest, reply: FastifyReply, error: Error) => {\n const startMark = (request as any).performanceStartMark;\n const metadata = (request as any).performanceMetadata;\n\n if (startMark && metadata) {\n const errorMetadata: HttpRequestMetadata = {\n ...metadata,\n statusCode: reply.statusCode,\n error: error.message,\n errorName: error.name,\n };\n\n monitor.endMeasure(startMark, errorMetadata);\n }\n },\n };\n }\n\n /**\n * Monitor controller method execution\n */\n public static async monitorControllerMethod<T>({\n controllerName,\n methodName,\n operation,\n metadata,\n }: {\n controllerName: string;\n methodName: string;\n operation: () => Promise<T>;\n metadata?: Record<string, any>;\n }): Promise<T> {\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return monitor.measureAsync({\n name: `${controllerName}.${methodName}`,\n type: 'http',\n fn: operation,\n metadata: {\n controller: controllerName,\n method: methodName,\n ...metadata,\n },\n });\n }\n\n /**\n * Monitor route handler execution\n */\n public static async monitorRouteHandler<T>({\n route,\n method,\n operation,\n metadata,\n }: {\n route: string;\n method: string;\n operation: () => Promise<T>;\n metadata?: Record<string, any>;\n }): Promise<T> {\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return monitor.measureAsync({\n name: `${method} ${route}`,\n type: 'http',\n fn: operation,\n metadata: { route, method, ...metadata },\n });\n }\n\n /**\n * Monitor middleware execution\n */\n public static async monitorMiddleware<T>({\n middlewareName,\n operation,\n metadata,\n }: {\n middlewareName: string;\n operation: () => Promise<T>;\n metadata?: Record<string, any>;\n }): Promise<T> {\n const monitor = WebServerPerformanceWrapper.getPerformanceMonitor();\n\n return monitor.measureAsync({\n name: `middleware.${middlewareName}`,\n type: 'http',\n fn: operation,\n metadata: {\n middleware: middlewareName,\n ...metadata,\n },\n });\n }\n}\n\n/**\n * Decorator for monitoring controller methods\n */\nexport function MonitorControllerMethod(methodName?: string) {\n return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n const originalMethod = descriptor.value;\n const controllerName = target.constructor.name;\n const operation = methodName ?? propertyKey;\n\n descriptor.value = async function (...args: any[]) {\n return WebServerPerformanceWrapper.monitorControllerMethod({\n controllerName,\n methodName: operation,\n operation: () => originalMethod.apply(this, args),\n metadata: { argumentCount: args.length },\n });\n };\n\n return descriptor;\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-performance.d.ts","sourceRoot":"","sources":["../../src/performance/websocket-performance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,2BAA2B;IACtC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAqB;WAExC,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAItE,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAOpC;;OAEG;WACiB,sBAAsB,CAAC,CAAC,EAC1C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,iBAAiB,CAAC,CAAC,EACrC,mBAAmB,EAAE,MAAM,EAC3B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAgBb;;OAEG;WACiB,oBAAoB,CAAC,CAAC,EACxC,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,gBAAgB,CAAC,CAAC,EACpC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,qBAAqB,CAAC,CAAC,EACzC,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAgBb;;OAEG;WACiB,uBAAuB,CAAC,CAAC,EAC3C,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;CAed;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,aAAa,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"websocket-performance.d.ts","sourceRoot":"","sources":["../../src/performance/websocket-performance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,2BAA2B;IACtC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAqB;WAExC,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAItE,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAOpC;;OAEG;WACiB,sBAAsB,CAAC,CAAC,EAC1C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,iBAAiB,CAAC,CAAC,EACrC,mBAAmB,EAAE,MAAM,EAC3B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAgBb;;OAEG;WACiB,oBAAoB,CAAC,CAAC,EACxC,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,gBAAgB,CAAC,CAAC,EACpC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAiBb;;OAEG;WACiB,qBAAqB,CAAC,CAAC,EACzC,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;IAgBb;;OAEG;WACiB,uBAAuB,CAAC,CAAC,EAC3C,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC;CAed;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,aAAa,CAAC,EAAE,MAAM,IACtD,QAAQ,GAAG,EAAE,aAAa,MAAM,EAAE,YAAY,kBAAkB,wBAgBzE"}
|
|
@@ -116,7 +116,7 @@ class WebSocketPerformanceWrapper {
|
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
118
|
function MonitorWebSocketOperation(operationName) {
|
|
119
|
-
return
|
|
119
|
+
return (target, propertyKey, descriptor) => {
|
|
120
120
|
const originalMethod = descriptor.value;
|
|
121
121
|
const controllerName = target.constructor.name;
|
|
122
122
|
const operation = operationName ?? propertyKey;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/performance/websocket-performance.ts"],
|
|
4
|
-
"sourcesContent": ["import { PerformanceMonitor } from './performance-monitor.js';\n\nexport interface WebSocketOperationMetadata {\n operation: string;\n messageType?: string;\n messageSize?: number;\n clientId?: string;\n room?: string;\n error?: string;\n argumentCount?: number;\n}\n\nexport class WebSocketPerformanceWrapper {\n private static performanceMonitor: PerformanceMonitor;\n\n public static setPerformanceMonitor(monitor: PerformanceMonitor): void {\n WebSocketPerformanceWrapper.performanceMonitor = monitor;\n }\n\n private static getPerformanceMonitor(): PerformanceMonitor {\n if (!WebSocketPerformanceWrapper.performanceMonitor) {\n WebSocketPerformanceWrapper.performanceMonitor = PerformanceMonitor.getInstance();\n }\n return WebSocketPerformanceWrapper.performanceMonitor;\n }\n\n /**\n * Monitor WebSocket message handling\n */\n public static async monitorMessageHandling<T>(\n messageType: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: 'message_handling',\n messageType,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `message.${messageType}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor WebSocket connection operations\n */\n public static async monitorConnection<T>(\n connectionOperation: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: connectionOperation,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `connection.${connectionOperation}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor WebSocket room operations\n */\n public static async monitorRoomOperation<T>(\n roomOperation: string,\n room: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: roomOperation,\n room,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `room.${roomOperation}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor WebSocket broadcast operations\n */\n public static async monitorBroadcast<T>(\n broadcastType: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: 'broadcast',\n messageType: broadcastType,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `broadcast.${broadcastType}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor WebSocket authentication\n */\n public static async monitorAuthentication<T>(\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: 'authentication',\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: 'authentication',\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor controller method execution\n */\n public static async monitorControllerMethod<T>(\n controllerName: string,\n methodName: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: 'controller_method',\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `${controllerName}.${methodName}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n}\n\n/**\n * Decorator for monitoring WebSocket controller methods\n */\nexport function MonitorWebSocketOperation(operationName?: string) {\n return
|
|
5
|
-
"mappings": ";;AAAA,SAAS,0BAA0B;AAY5B,MAAM,4BAA4B;AAAA,EAZzC,OAYyC;AAAA;AAAA;AAAA,EACvC,OAAe;AAAA,EAEf,OAAc,sBAAsB,SAAmC;AACrE,gCAA4B,qBAAqB;AAAA,EACnD;AAAA,EAEA,OAAe,wBAA4C;AACzD,QAAI,CAAC,4BAA4B,oBAAoB;AACnD,kCAA4B,qBAAqB,mBAAmB,YAAY;AAAA,IAClF;AACA,WAAO,4BAA4B;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAoB,uBAClB,aACA,WACA,UACY;AACZ,UAAM,UAAU,4BAA4B,sBAAsB;AAElE,UAAM,oBAAgD;AAAA,MACpD,WAAW;AAAA,MACX;AAAA,MACA,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM,WAAW,WAAW;AAAA,MAC5B,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAoB,kBAClB,qBACA,WACA,UACY;AACZ,UAAM,UAAU,4BAA4B,sBAAsB;AAElE,UAAM,oBAAgD;AAAA,MACpD,WAAW;AAAA,MACX,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM,cAAc,mBAAmB;AAAA,MACvC,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAoB,qBAClB,eACA,MACA,WACA,UACY;AACZ,UAAM,UAAU,4BAA4B,sBAAsB;AAElE,UAAM,oBAAgD;AAAA,MACpD,WAAW;AAAA,MACX;AAAA,MACA,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM,QAAQ,aAAa;AAAA,MAC3B,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAoB,iBAClB,eACA,WACA,UACY;AACZ,UAAM,UAAU,4BAA4B,sBAAsB;AAElE,UAAM,oBAAgD;AAAA,MACpD,WAAW;AAAA,MACX,aAAa;AAAA,MACb,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM,aAAa,aAAa;AAAA,MAChC,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAoB,sBAClB,WACA,UACY;AACZ,UAAM,UAAU,4BAA4B,sBAAsB;AAElE,UAAM,oBAAgD;AAAA,MACpD,WAAW;AAAA,MACX,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAoB,wBAClB,gBACA,YACA,WACA,UACY;AACZ,UAAM,UAAU,4BAA4B,sBAAsB;AAElE,UAAM,oBAAgD;AAAA,MACpD,WAAW;AAAA,MACX,GAAG;AAAA,IACL;AAEA,WAAO,QAAQ,aAAa;AAAA,MAC1B,MAAM,GAAG,cAAc,IAAI,UAAU;AAAA,MACrC,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;AAKO,SAAS,0BAA0B,eAAwB;AAChE,SAAO,
|
|
4
|
+
"sourcesContent": ["import { PerformanceMonitor } from './performance-monitor.js';\n\nexport interface WebSocketOperationMetadata {\n operation: string;\n messageType?: string;\n messageSize?: number;\n clientId?: string;\n room?: string;\n error?: string;\n argumentCount?: number;\n}\n\nexport class WebSocketPerformanceWrapper {\n private static performanceMonitor: PerformanceMonitor;\n\n public static setPerformanceMonitor(monitor: PerformanceMonitor): void {\n WebSocketPerformanceWrapper.performanceMonitor = monitor;\n }\n\n private static getPerformanceMonitor(): PerformanceMonitor {\n if (!WebSocketPerformanceWrapper.performanceMonitor) {\n WebSocketPerformanceWrapper.performanceMonitor = PerformanceMonitor.getInstance();\n }\n return WebSocketPerformanceWrapper.performanceMonitor;\n }\n\n /**\n * Monitor WebSocket message handling\n */\n public static async monitorMessageHandling<T>(\n messageType: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: 'message_handling',\n messageType,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `message.${messageType}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor WebSocket connection operations\n */\n public static async monitorConnection<T>(\n connectionOperation: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: connectionOperation,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `connection.${connectionOperation}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor WebSocket room operations\n */\n public static async monitorRoomOperation<T>(\n roomOperation: string,\n room: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: roomOperation,\n room,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `room.${roomOperation}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor WebSocket broadcast operations\n */\n public static async monitorBroadcast<T>(\n broadcastType: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: 'broadcast',\n messageType: broadcastType,\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `broadcast.${broadcastType}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor WebSocket authentication\n */\n public static async monitorAuthentication<T>(\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: 'authentication',\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: 'authentication',\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n\n /**\n * Monitor controller method execution\n */\n public static async monitorControllerMethod<T>(\n controllerName: string,\n methodName: string,\n operation: () => Promise<T>,\n metadata?: Partial<WebSocketOperationMetadata>,\n ): Promise<T> {\n const monitor = WebSocketPerformanceWrapper.getPerformanceMonitor();\n\n const operationMetadata: WebSocketOperationMetadata = {\n operation: 'controller_method',\n ...metadata,\n };\n\n return monitor.measureAsync({\n name: `${controllerName}.${methodName}`,\n type: 'websocket',\n fn: operation,\n metadata: operationMetadata,\n });\n }\n}\n\n/**\n * Decorator for monitoring WebSocket controller methods\n */\nexport function MonitorWebSocketOperation(operationName?: string) {\n return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n const originalMethod = descriptor.value;\n const controllerName = target.constructor.name;\n const operation = operationName ?? propertyKey;\n\n descriptor.value = async function (...args: any[]) {\n return WebSocketPerformanceWrapper.monitorControllerMethod(\n controllerName,\n operation,\n () => originalMethod.apply(this, args),\n { argumentCount: args.length },\n );\n };\n\n return descriptor;\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/queue/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { default as QueueManager } from './manager.js';
|
|
2
1
|
export type { QueueItem } from './index.interface.js';
|
|
3
2
|
export type { QueueJob, QueueJobData, QueueJobPayload } from './job.interface.js';
|
|
3
|
+
export { default as QueueManager } from './manager.js';
|
|
4
4
|
export { default as BaseProcessor } from './processor/base.js';
|
|
5
|
-
export type {
|
|
5
|
+
export type { ProcessorConstructor, ProcessorConstructorParams } from './processor/processor.interface.js';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/D,YAAY,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { QueueJob } from './job.interface.js';
|
|
2
1
|
import type { QueueOptions, WorkerOptions } from 'bullmq';
|
|
2
|
+
import type { QueueJob } from './job.interface.js';
|
|
3
3
|
/** Runtime settings applied to the BullMQ Worker for this queue */
|
|
4
4
|
export interface QueueRuntimeSettings {
|
|
5
5
|
/** Max number of concurrently processed jobs across all job types */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.interface.d.ts","sourceRoot":"","sources":["../../src/queue/index.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"index.interface.d.ts","sourceRoot":"","sources":["../../src/queue/index.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,mEAAmE;AACnE,MAAM,WAAW,oBAAoB;IACnC,qEAAqE;IACrE,WAAW,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC3C,kEAAkE;IAClE,YAAY,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAC7C,wCAAwC;IACxC,eAAe,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACnD,wDAAwD;IACxD,eAAe,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,SAAS;IACxB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IAEb,gCAAgC;IAChC,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,iBAAiB;IACjB,IAAI,EAAE,QAAQ,EAAE,CAAC;IAEjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAEhC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;CACvD"}
|
package/dist/queue/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/queue/index.ts"],
|
|
4
|
-
"sourcesContent": ["export {
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["export type { QueueItem } from './index.interface.js';\nexport type { QueueJob, QueueJobData, QueueJobPayload } from './job.interface.js';\nexport { default as QueueManager } from './manager.js';\nexport { default as BaseProcessor } from './processor/base.js';\nexport type { ProcessorConstructor, ProcessorConstructorParams } from './processor/processor.interface.js';\n"],
|
|
5
|
+
"mappings": "AAEA,SAAoB,WAAXA,gBAA+B;AACxC,SAAoB,WAAXA,gBAAgC;",
|
|
6
6
|
"names": ["default"]
|
|
7
7
|
}
|
package/dist/queue/manager.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type Job } from 'bullmq';
|
|
2
|
-
import type { QueueManagerConstructorParams } from './manager.interface.js';
|
|
3
|
-
import type { QueueJobData, QueueJobPayload } from './job.interface.js';
|
|
4
2
|
import type { QueueItem } from './index.interface.js';
|
|
3
|
+
import type { QueueJobData, QueueJobPayload } from './job.interface.js';
|
|
4
|
+
import type { QueueManagerConstructorParams } from './manager.interface.js';
|
|
5
5
|
export interface JobSummary {
|
|
6
6
|
id: string;
|
|
7
7
|
name: string;
|
|
@@ -46,5 +46,6 @@ export default class QueueManager {
|
|
|
46
46
|
* Log queue message
|
|
47
47
|
*/
|
|
48
48
|
log(message: string, meta?: Record<string, unknown>): void;
|
|
49
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
49
50
|
}
|
|
50
51
|
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/queue/manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/queue/manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,GAAG,EAAgD,MAAM,QAAQ,CAAC;AAOhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAY,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,KAAK,EAAE,6BAA6B,EAAuB,MAAM,wBAAwB,CAAC;AAKjG,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,CAAC,OAAO,OAAO,YAAY;IAC/B,OAAO,CAAC,MAAM,CAAyB;IAEvC,OAAO,CAAC,iBAAiB,CAAoB;IAE7C,OAAO,CAAC,OAAO,CAAsB;IAErC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,YAAY,CAAC,CAAe;IAEpC,OAAO,CAAC,MAAM,CAAiC;IAE/C,OAAO,CAAC,OAAO,CAAuC;IAEtD,OAAO,CAAC,aAAa,CAAyC;gBAElD,EACV,iBAAiB,EACjB,OAAO,EACP,MAAM,EAAE,OAAO,EACf,aAAa,EACb,gBAAgB,EAChB,YAAY,GACb,EAAE,6BAA6B;IAgBnB,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE;QAAE,MAAM,EAAE,SAAS,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC/E,OAAO,CAAC,aAAa;IAwErB,OAAO,CAAC,qBAAqB;IA0C7B,OAAO,CAAC,YAAY,CAElB;IAEF,OAAO,CAAC,cAAc,CAIpB;IAEF,OAAO,CAAC,eAAe,CAKrB;IAEF,OAAO,CAAC,cAAc,CAEpB;IAEK,aAAa,GAClB,QAAQ,SAAS,eAAe,GAAG,eAAe,EAClD,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnE,OAAO,GAAG,OAAO,EACjB,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,2BAIC;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;KACzC,KAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,CAyB7E;IAEF,OAAO,CAAC,eAAe,CA2ErB;IAEW,qBAAqB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IA6B3D;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCxC;;OAEG;IACI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI3D,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7C"}
|
package/dist/queue/manager.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
import path from "node:path";
|
|
3
4
|
import { Queue } from "bullmq";
|
|
4
|
-
import path from "path";
|
|
5
5
|
import { Logger } from "../logger/index.js";
|
|
6
|
-
import QueueWorker from "./worker.js";
|
|
7
6
|
import { File, Helper, Loader, Time } from "../util/index.js";
|
|
7
|
+
import QueueWorker from "./worker.js";
|
|
8
8
|
class QueueManager {
|
|
9
9
|
static {
|
|
10
10
|
__name(this, "QueueManager");
|
|
@@ -308,6 +308,9 @@ class QueueManager {
|
|
|
308
308
|
log(message, meta) {
|
|
309
309
|
this.logger.custom({ level: "queue", message, meta });
|
|
310
310
|
}
|
|
311
|
+
async [Symbol.asyncDispose]() {
|
|
312
|
+
await this.disconnect();
|
|
313
|
+
}
|
|
311
314
|
}
|
|
312
315
|
export {
|
|
313
316
|
QueueManager as default
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/queue/manager.ts"],
|
|
4
|
-
"sourcesContent": ["import { type Job, Queue, type QueueOptions, type WorkerOptions } from 'bullmq';\nimport path from 'path';\nimport type { QueueManagerConstructorParams, QueueManagerOptions } from './manager.interface.js';\nimport type { RedisInstance } from '../redis/index.js';\nimport type { DatabaseInstance } from '../database/index.js';\nimport { Logger } from '../logger/index.js';\nimport QueueWorker from './worker.js';\nimport type BaseProcessor from './processor/base.js';\nimport { File, Helper, Loader, Time } from '../util/index.js';\nimport type { QueueJob, QueueJobData, QueueJobPayload } from './job.interface.js';\nimport type { ProcessorConstructor } from './processor/processor.interface.js';\nimport type { QueueItem } from './index.interface.js';\nimport type { ApplicationConfig } from '../application/base-application.interface.js';\nimport type EventManager from '../event/manager.js';\n\nexport interface JobSummary {\n id: string;\n name: string;\n queueName: string;\n state: 'active' | 'waiting' | 'completed' | 'failed' | 'delayed' | 'paused';\n attemptsMade: number;\n failedReason?: string;\n}\n\nexport default class QueueManager {\n private logger: typeof Logger = Logger;\n\n private applicationConfig: ApplicationConfig;\n\n private options: QueueManagerOptions;\n\n private redisInstance: RedisInstance;\n private databaseInstance: DatabaseInstance | null;\n private eventManager?: EventManager;\n\n private queues: Map<string, Queue> = new Map();\n\n private workers: Map<string, QueueWorker> = new Map();\n\n private jobProcessors: Map<string, BaseProcessor> = new Map();\n\n constructor({\n applicationConfig,\n options,\n queues: _queues,\n redisInstance,\n databaseInstance,\n eventManager,\n }: QueueManagerConstructorParams) {\n // Merge options with defaults if provided\n if (options) {\n this.options = options;\n } else {\n // This shouldn't happen, but handle the edge case\n this.options = { processorsDirectory: '' };\n }\n\n this.applicationConfig = applicationConfig;\n\n this.redisInstance = redisInstance;\n this.databaseInstance = databaseInstance;\n this.eventManager = eventManager;\n }\n\n public async registerQueues({ queues }: { queues: QueueItem[] }): Promise<void> {\n if (!queues) {\n return;\n }\n\n // Check if processors directory exists\n const processorsDirectoryExists = await File.pathExists(this.options.processorsDirectory);\n\n if (!processorsDirectoryExists) {\n return;\n }\n\n try {\n const jobProcessorClasses = await Loader.loadModulesInDirectory<ProcessorConstructor>({\n directory: this.options.processorsDirectory,\n extensions: ['.ts', '.js'],\n });\n\n for (const queue of queues) {\n this.registerQueue({ queue, jobProcessorClasses });\n }\n\n if (this.applicationConfig.queue.log?.queuesRegistered) {\n this.log('Registered queue', {\n 'Queue Count': queues.length,\n 'Job Count': this.jobProcessors.size,\n });\n }\n } catch (error) {\n Logger.error({ error });\n }\n }\n\n private registerQueue({\n queue,\n jobProcessorClasses,\n }: {\n queue: QueueItem;\n jobProcessorClasses: Record<string, ProcessorConstructor>;\n }): void {\n if (!queue.jobs) {\n Logger.warn({\n message: 'No jobs found for queue, skip register',\n meta: {\n Name: queue.name,\n },\n });\n\n return;\n }\n\n // Merge framework defaults with queue-specific default job options\n const queueOptions: QueueOptions = {\n connection: this.redisInstance.client,\n defaultJobOptions: {\n removeOnComplete: true,\n removeOnFail: true,\n ...(queue.defaultJobOptions ?? {}),\n },\n };\n\n const queueInstance = new Queue(queue.name, queueOptions);\n\n queueInstance.on('error', this.onQueueError);\n queueInstance.on('waiting', this.onQueueWaiting);\n queueInstance.on('progress', this.onQueueProgress);\n queueInstance.on('removed', this.onQueueRemoved);\n\n if (!queue.isExternal) {\n // Build worker options, applying per-queue runtime settings\n const workerOptions: WorkerOptions = {\n connection: this.redisInstance.client,\n autorun: true,\n ...(queue.settings ?? {}),\n };\n\n const worker = new QueueWorker({\n applicationConfig: this.applicationConfig,\n queueManager: this,\n name: queue.name,\n processor: this.workerProcessor,\n options: workerOptions,\n redisInstance: this.redisInstance,\n });\n\n this.workers.set(queue.name, worker);\n }\n\n this.queues.set(queue.name, queueInstance);\n\n if (this.applicationConfig.queue.log?.queueRegistered) {\n this.log('Registered queue', {\n Name: queue.name,\n Settings: queue.settings ? JSON.stringify(queue.settings) : 'default',\n });\n }\n\n // Register job processors\n this.registerJobProcessors({\n queue,\n jobs: queue.jobs,\n jobProcessorClasses,\n });\n }\n\n private registerJobProcessors({\n queue,\n jobs,\n jobProcessorClasses,\n }: {\n queue: QueueItem;\n jobs: QueueJob[];\n jobProcessorClasses: Record<string, ProcessorConstructor>;\n }): void {\n if (!jobs) {\n return;\n }\n\n const scriptFileExtension = Helper.getScriptFileExtension();\n\n for (const job of jobs) {\n if (!queue.isExternal) {\n const ProcessorClass = jobProcessorClasses[job.id];\n\n if (!ProcessorClass) {\n const jobPath = path.join(this.options.processorsDirectory, `${job.id}.${scriptFileExtension}`);\n\n throw new Error(`Processor class not found (Job ID: ${job.id} | Path: ${jobPath})`);\n }\n\n const processorInstance = new ProcessorClass(\n this,\n this.applicationConfig,\n this.redisInstance,\n this.databaseInstance,\n this.eventManager,\n );\n\n this.jobProcessors.set(job.id, processorInstance);\n }\n\n if (this.applicationConfig.queue.log?.jobRegistered) {\n this.log('Job registered', { ID: job.id });\n }\n }\n }\n\n private onQueueError = (error: Error): void => {\n Logger.error({ error });\n };\n\n private onQueueWaiting = (job: Job): void => {\n if (this.applicationConfig.queue.log?.queueWaiting) {\n this.log('Waiting...', { Queue: job.queueName, Job: job.id });\n }\n };\n\n private onQueueProgress = (jobId: string, progress: unknown): void => {\n this.log('Progress update', {\n 'Job ID': jobId,\n Progress: progress,\n });\n };\n\n private onQueueRemoved = (jobId: string): void => {\n this.log('Removed queue', { Job: jobId });\n };\n\n public addJobToQueue = async <\n TPayload extends QueueJobPayload = QueueJobPayload,\n TMetadata extends Record<string, unknown> = Record<string, unknown>,\n TResult = unknown,\n TName extends string = string,\n >({\n queueId,\n jobId,\n data,\n }: {\n queueId: string;\n jobId: TName;\n data: QueueJobData<TPayload, TMetadata>;\n }): Promise<Job<QueueJobData<TPayload, TMetadata>, TResult, TName> | undefined> => {\n const queue = this.queues.get(queueId);\n\n if (!queue) {\n this.log('Queue not found', { 'Queue ID': queueId });\n\n return;\n }\n\n const job = (await queue.add(jobId, data)) as Job<QueueJobData<TPayload, TMetadata>, TResult, TName>;\n\n if (this.applicationConfig.queue.log?.jobAdded) {\n const dataStr = JSON.stringify(data);\n const maxLogDataStrLength = 50;\n const truncatedLogDataStr =\n dataStr.length > maxLogDataStrLength ? `${dataStr.substring(0, maxLogDataStrLength)}...` : dataStr;\n\n this.log('Job added', {\n Queue: queueId,\n 'Job ID': jobId,\n Data: truncatedLogDataStr,\n });\n }\n\n return job;\n };\n\n private workerProcessor = async (job: Job): Promise<unknown> => {\n if (!job) {\n return;\n }\n\n const startTime = Time.now();\n\n // Add start time to job data\n if (typeof job.updateData === 'function') {\n try {\n await job.updateData({ ...job.data, startTime });\n } catch (error) {\n Logger.warn({\n message: 'Failed to persist job metadata before processing',\n meta: {\n Queue: job.queueName,\n 'Job Name': job.name,\n 'Job ID': job.id,\n Error: error instanceof Error ? error.message : String(error),\n },\n });\n }\n }\n\n this.log('Worker processing...', {\n Queue: job.queueName,\n 'Job Name': job.name,\n 'Job ID': job.id,\n });\n\n const processor = this.jobProcessors.get(job.name);\n\n if (!processor) {\n throw new Error(`No processor registered for job (Name: ${job.name})`);\n }\n\n let result: unknown;\n let error: Error | undefined;\n\n try {\n // Call beforeProcess hook\n await processor.beforeProcess({ job });\n\n // Execute main processing\n result = await processor.process({ job });\n\n return result;\n } catch (err) {\n error = err as Error;\n\n Logger.warn({\n message: 'Queue worker processing error',\n meta: {\n Queue: job.queueName,\n 'Job Name': job.name,\n 'Job ID': job.id,\n Error: error.message,\n },\n });\n\n Logger.error({ error });\n\n throw error; // Re-throw to mark job as failed\n } finally {\n // ALWAYS call afterProcess for cleanup (even on error)\n try {\n await processor.afterProcess({ job, result, error });\n } catch (cleanupError) {\n // Log but don't throw - cleanup errors shouldn't fail the job\n Logger.error({\n error: cleanupError,\n message: 'Error in processor afterProcess cleanup',\n });\n }\n }\n };\n\n public async listAllJobsWithStatus(): Promise<JobSummary[]> {\n const jobsSummary: JobSummary[] = [];\n\n for (const [queueName, queue] of this.queues) {\n const jobStates = ['active', 'waiting', 'completed', 'failed', 'delayed', 'paused'] as const;\n\n const jobsDetailsPromises = jobStates.map(async state => {\n const jobs = await queue.getJobs([state]);\n return jobs.map(\n (job): JobSummary => ({\n id: job.id ?? 'unknown',\n name: job.name ?? 'unknown',\n queueName,\n state,\n attemptsMade: job.attemptsMade,\n failedReason: job.failedReason,\n }),\n );\n });\n\n const results = await Promise.all(jobsDetailsPromises);\n const flattenedResults = results.flat();\n\n jobsSummary.push(...flattenedResults);\n }\n\n return jobsSummary;\n }\n\n /**\n * Disconnect all queues and workers, cleanup resources.\n * Should be called during application shutdown.\n */\n public async disconnect(): Promise<void> {\n // First, close all workers (they process jobs)\n for (const [name, worker] of this.workers) {\n try {\n await worker.cleanup();\n this.log('Worker closed', { Name: name });\n } catch (error) {\n Logger.error({\n error,\n message: `Failed to close worker: ${name}`,\n });\n }\n }\n\n // Then, close all queues (they manage job state)\n for (const [name, queue] of this.queues) {\n try {\n queue.removeAllListeners();\n await queue.close();\n this.log('Queue closed', { Name: name });\n } catch (error) {\n Logger.error({\n error,\n message: `Failed to close queue: ${name}`,\n });\n }\n }\n\n // Clear all maps\n this.workers.clear();\n this.queues.clear();\n this.jobProcessors.clear();\n\n this.log('Queue manager disconnected');\n }\n\n /**\n * Log queue message\n */\n public log(message: string, meta?: Record<string, unknown>): void {\n this.logger.custom({ level: 'queue', message, meta });\n }\n}\n"],
|
|
5
|
-
"mappings": ";;AAAA,
|
|
4
|
+
"sourcesContent": ["import path from 'node:path';\nimport { type Job, Queue, type QueueOptions, type WorkerOptions } from 'bullmq';\nimport type { ApplicationConfig } from '../application/base-application.interface.js';\nimport type { DatabaseInstance } from '../database/index.js';\nimport type EventManager from '../event/manager.js';\nimport { Logger } from '../logger/index.js';\nimport type { RedisInstance } from '../redis/index.js';\nimport { File, Helper, Loader, Time } from '../util/index.js';\nimport type { QueueItem } from './index.interface.js';\nimport type { QueueJob, QueueJobData, QueueJobPayload } from './job.interface.js';\nimport type { QueueManagerConstructorParams, QueueManagerOptions } from './manager.interface.js';\nimport type BaseProcessor from './processor/base.js';\nimport type { ProcessorConstructor } from './processor/processor.interface.js';\nimport QueueWorker from './worker.js';\n\nexport interface JobSummary {\n id: string;\n name: string;\n queueName: string;\n state: 'active' | 'waiting' | 'completed' | 'failed' | 'delayed' | 'paused';\n attemptsMade: number;\n failedReason?: string;\n}\n\nexport default class QueueManager {\n private logger: typeof Logger = Logger;\n\n private applicationConfig: ApplicationConfig;\n\n private options: QueueManagerOptions;\n\n private redisInstance: RedisInstance;\n private databaseInstance: DatabaseInstance | null;\n private eventManager?: EventManager;\n\n private queues: Map<string, Queue> = new Map();\n\n private workers: Map<string, QueueWorker> = new Map();\n\n private jobProcessors: Map<string, BaseProcessor> = new Map();\n\n constructor({\n applicationConfig,\n options,\n queues: _queues,\n redisInstance,\n databaseInstance,\n eventManager,\n }: QueueManagerConstructorParams) {\n // Merge options with defaults if provided\n if (options) {\n this.options = options;\n } else {\n // This shouldn't happen, but handle the edge case\n this.options = { processorsDirectory: '' };\n }\n\n this.applicationConfig = applicationConfig;\n\n this.redisInstance = redisInstance;\n this.databaseInstance = databaseInstance;\n this.eventManager = eventManager;\n }\n\n public async registerQueues({ queues }: { queues: QueueItem[] }): Promise<void> {\n if (!queues) {\n return;\n }\n\n // Check if processors directory exists\n const processorsDirectoryExists = await File.pathExists(this.options.processorsDirectory);\n\n if (!processorsDirectoryExists) {\n return;\n }\n\n try {\n const jobProcessorClasses = await Loader.loadModulesInDirectory<ProcessorConstructor>({\n directory: this.options.processorsDirectory,\n extensions: ['.ts', '.js'],\n });\n\n for (const queue of queues) {\n this.registerQueue({ queue, jobProcessorClasses });\n }\n\n if (this.applicationConfig.queue.log?.queuesRegistered) {\n this.log('Registered queue', {\n 'Queue Count': queues.length,\n 'Job Count': this.jobProcessors.size,\n });\n }\n } catch (error) {\n Logger.error({ error });\n }\n }\n\n private registerQueue({\n queue,\n jobProcessorClasses,\n }: {\n queue: QueueItem;\n jobProcessorClasses: Record<string, ProcessorConstructor>;\n }): void {\n if (!queue.jobs) {\n Logger.warn({\n message: 'No jobs found for queue, skip register',\n meta: {\n Name: queue.name,\n },\n });\n\n return;\n }\n\n // Merge framework defaults with queue-specific default job options\n const queueOptions: QueueOptions = {\n connection: this.redisInstance.client as any,\n defaultJobOptions: {\n removeOnComplete: true,\n removeOnFail: true,\n ...(queue.defaultJobOptions ?? {}),\n },\n };\n\n const queueInstance = new Queue(queue.name, queueOptions);\n\n queueInstance.on('error', this.onQueueError);\n queueInstance.on('waiting', this.onQueueWaiting);\n queueInstance.on('progress', this.onQueueProgress);\n queueInstance.on('removed', this.onQueueRemoved);\n\n if (!queue.isExternal) {\n // Build worker options, applying per-queue runtime settings\n const workerOptions: WorkerOptions = {\n connection: this.redisInstance.client as any,\n autorun: true,\n ...(queue.settings ?? {}),\n };\n\n const worker = new QueueWorker({\n applicationConfig: this.applicationConfig,\n queueManager: this,\n name: queue.name,\n processor: this.workerProcessor,\n options: workerOptions,\n redisInstance: this.redisInstance,\n });\n\n this.workers.set(queue.name, worker);\n }\n\n this.queues.set(queue.name, queueInstance);\n\n if (this.applicationConfig.queue.log?.queueRegistered) {\n this.log('Registered queue', {\n Name: queue.name,\n Settings: queue.settings ? JSON.stringify(queue.settings) : 'default',\n });\n }\n\n // Register job processors\n this.registerJobProcessors({\n queue,\n jobs: queue.jobs,\n jobProcessorClasses,\n });\n }\n\n private registerJobProcessors({\n queue,\n jobs,\n jobProcessorClasses,\n }: {\n queue: QueueItem;\n jobs: QueueJob[];\n jobProcessorClasses: Record<string, ProcessorConstructor>;\n }): void {\n if (!jobs) {\n return;\n }\n\n const scriptFileExtension = Helper.getScriptFileExtension();\n\n for (const job of jobs) {\n if (!queue.isExternal) {\n const ProcessorClass = jobProcessorClasses[job.id];\n\n if (!ProcessorClass) {\n const jobPath = path.join(this.options.processorsDirectory, `${job.id}.${scriptFileExtension}`);\n\n throw new Error(`Processor class not found (Job ID: ${job.id} | Path: ${jobPath})`);\n }\n\n const processorInstance = new ProcessorClass(\n this,\n this.applicationConfig,\n this.redisInstance,\n this.databaseInstance,\n this.eventManager,\n );\n\n this.jobProcessors.set(job.id, processorInstance);\n }\n\n if (this.applicationConfig.queue.log?.jobRegistered) {\n this.log('Job registered', { ID: job.id });\n }\n }\n }\n\n private onQueueError = (error: Error): void => {\n Logger.error({ error });\n };\n\n private onQueueWaiting = (job: Job): void => {\n if (this.applicationConfig.queue.log?.queueWaiting) {\n this.log('Waiting...', { Queue: job.queueName, Job: job.id });\n }\n };\n\n private onQueueProgress = (jobId: string, progress: unknown): void => {\n this.log('Progress update', {\n 'Job ID': jobId,\n Progress: progress,\n });\n };\n\n private onQueueRemoved = (jobId: string): void => {\n this.log('Removed queue', { Job: jobId });\n };\n\n public addJobToQueue = async <\n TPayload extends QueueJobPayload = QueueJobPayload,\n TMetadata extends Record<string, unknown> = Record<string, unknown>,\n TResult = unknown,\n TName extends string = string,\n >({\n queueId,\n jobId,\n data,\n }: {\n queueId: string;\n jobId: TName;\n data: QueueJobData<TPayload, TMetadata>;\n }): Promise<Job<QueueJobData<TPayload, TMetadata>, TResult, TName> | undefined> => {\n const queue = this.queues.get(queueId);\n\n if (!queue) {\n this.log('Queue not found', { 'Queue ID': queueId });\n\n return;\n }\n\n const job = (await queue.add(jobId, data)) as Job<QueueJobData<TPayload, TMetadata>, TResult, TName>;\n\n if (this.applicationConfig.queue.log?.jobAdded) {\n const dataStr = JSON.stringify(data);\n const maxLogDataStrLength = 50;\n const truncatedLogDataStr =\n dataStr.length > maxLogDataStrLength ? `${dataStr.substring(0, maxLogDataStrLength)}...` : dataStr;\n\n this.log('Job added', {\n Queue: queueId,\n 'Job ID': jobId,\n Data: truncatedLogDataStr,\n });\n }\n\n return job;\n };\n\n private workerProcessor = async (job: Job): Promise<unknown> => {\n if (!job) {\n return;\n }\n\n const startTime = Time.now();\n\n // Add start time to job data\n if (typeof job.updateData === 'function') {\n try {\n await job.updateData({ ...job.data, startTime });\n } catch (error) {\n Logger.warn({\n message: 'Failed to persist job metadata before processing',\n meta: {\n Queue: job.queueName,\n 'Job Name': job.name,\n 'Job ID': job.id,\n Error: error instanceof Error ? error.message : String(error),\n },\n });\n }\n }\n\n this.log('Worker processing...', {\n Queue: job.queueName,\n 'Job Name': job.name,\n 'Job ID': job.id,\n });\n\n const processor = this.jobProcessors.get(job.name);\n\n if (!processor) {\n throw new Error(`No processor registered for job (Name: ${job.name})`);\n }\n\n let result: unknown;\n let error: Error | undefined;\n\n try {\n // Call beforeProcess hook\n await processor.beforeProcess({ job });\n\n // Execute main processing\n result = await processor.process({ job });\n\n return result;\n } catch (err) {\n error = err as Error;\n\n Logger.warn({\n message: 'Queue worker processing error',\n meta: {\n Queue: job.queueName,\n 'Job Name': job.name,\n 'Job ID': job.id,\n Error: error.message,\n },\n });\n\n Logger.error({ error });\n\n throw error; // Re-throw to mark job as failed\n } finally {\n // ALWAYS call afterProcess for cleanup (even on error)\n try {\n await processor.afterProcess({ job, result, error });\n } catch (cleanupError) {\n // Log but don't throw - cleanup errors shouldn't fail the job\n Logger.error({\n error: cleanupError,\n message: 'Error in processor afterProcess cleanup',\n });\n }\n }\n };\n\n public async listAllJobsWithStatus(): Promise<JobSummary[]> {\n const jobsSummary: JobSummary[] = [];\n\n for (const [queueName, queue] of this.queues) {\n const jobStates = ['active', 'waiting', 'completed', 'failed', 'delayed', 'paused'] as const;\n\n const jobsDetailsPromises = jobStates.map(async state => {\n const jobs = await queue.getJobs([state]);\n return jobs.map(\n (job): JobSummary => ({\n id: job.id ?? 'unknown',\n name: job.name ?? 'unknown',\n queueName,\n state,\n attemptsMade: job.attemptsMade,\n failedReason: job.failedReason,\n }),\n );\n });\n\n const results = await Promise.all(jobsDetailsPromises);\n const flattenedResults = results.flat();\n\n jobsSummary.push(...flattenedResults);\n }\n\n return jobsSummary;\n }\n\n /**\n * Disconnect all queues and workers, cleanup resources.\n * Should be called during application shutdown.\n */\n public async disconnect(): Promise<void> {\n // First, close all workers (they process jobs)\n for (const [name, worker] of this.workers) {\n try {\n await worker.cleanup();\n this.log('Worker closed', { Name: name });\n } catch (error) {\n Logger.error({\n error,\n message: `Failed to close worker: ${name}`,\n });\n }\n }\n\n // Then, close all queues (they manage job state)\n for (const [name, queue] of this.queues) {\n try {\n queue.removeAllListeners();\n await queue.close();\n this.log('Queue closed', { Name: name });\n } catch (error) {\n Logger.error({\n error,\n message: `Failed to close queue: ${name}`,\n });\n }\n }\n\n // Clear all maps\n this.workers.clear();\n this.queues.clear();\n this.jobProcessors.clear();\n\n this.log('Queue manager disconnected');\n }\n\n /**\n * Log queue message\n */\n public log(message: string, meta?: Record<string, unknown>): void {\n this.logger.custom({ level: 'queue', message, meta });\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.disconnect();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["error"]
|
|
7
7
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { Job } from 'bullmq';
|
|
2
1
|
import type { EntityManager } from '@mikro-orm/core';
|
|
3
|
-
import type {
|
|
4
|
-
import type { DatabaseInstance } from '../../database/index.js';
|
|
2
|
+
import type { Job } from 'bullmq';
|
|
5
3
|
import type { ApplicationConfig } from '../../application/base-application.interface.js';
|
|
6
|
-
import type {
|
|
4
|
+
import type { DatabaseInstance } from '../../database/index.js';
|
|
7
5
|
import type EventManager from '../../event/manager.js';
|
|
6
|
+
import type { QueueManager } from '../../queue/index.js';
|
|
7
|
+
import type { RedisInstance } from '../../redis/index.js';
|
|
8
8
|
import type { QueueJobData } from '../job.interface.js';
|
|
9
9
|
export default abstract class BaseProcessor<TQueueManager extends QueueManager = QueueManager, TJobData extends QueueJobData = QueueJobData, TResult = unknown> {
|
|
10
10
|
protected queueManager: TQueueManager;
|
|
@@ -55,7 +55,7 @@ export default abstract class BaseProcessor<TQueueManager extends QueueManager =
|
|
|
55
55
|
* class MyProcessor extends BaseProcessor {
|
|
56
56
|
* async process({ job }) {
|
|
57
57
|
* return this.withEntityManager(async (em) => {
|
|
58
|
-
* const user = await em.findOne(
|
|
58
|
+
* const user = await em.findOne(User, { id: job.data.userId });
|
|
59
59
|
* return user;
|
|
60
60
|
* });
|
|
61
61
|
* }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/queue/processor/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/queue/processor/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iDAAiD,CAAC;AACzF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,YAAY,MAAM,wBAAwB,CAAC;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,aAAa,CACzC,aAAa,SAAS,YAAY,GAAG,YAAY,EACjD,QAAQ,SAAS,YAAY,GAAG,YAAY,EAC5C,OAAO,GAAG,OAAO;IAKf,SAAS,CAAC,YAAY,EAAE,aAAa;IACrC,SAAS,CAAC,iBAAiB,EAAE,iBAAiB;IAC9C,SAAS,CAAC,aAAa,EAAE,aAAa;IACtC,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI;IACnD,SAAS,CAAC,YAAY,CAAC,EAAE,YAAY;IAPvC,OAAO,CAAC,MAAM,CAAyB;gBAG3B,YAAY,EAAE,aAAa,EAC3B,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,EACzC,YAAY,CAAC,EAAE,YAAY,YAAA;aAGvB,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE;QAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAEnF;;;;;;;;OAQG;IACU,aAAa,CAAC,EAAE,GAAG,EAAE,EAAE;QAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAInF;;;;;;;;;;;;OAYG;IACU,YAAY,CAAC,EACxB,GAAG,EACH,MAAM,EACN,KAAK,GACN,EAAE;QACD,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,KAAK,CAAC;KACf,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjB;;;;;;;;;;;;;OAaG;cACa,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAO7F;;OAEG;IACI,GAAG;uBACO,KAAK,GAAG,OAAO,YAAY,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,IAAI;wBAavE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,IAAI;wBAI7C,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,IAAI;yBAI5C,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,IAAI;MAG9D;CACH"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
-
import { Logger } from "../../logger/index.js";
|
|
4
3
|
import { safeSerializeError } from "../../error/error-reporter.js";
|
|
4
|
+
import { Logger } from "../../logger/index.js";
|
|
5
5
|
class BaseProcessor {
|
|
6
6
|
constructor(queueManager, applicationConfig, redisInstance, databaseInstance, eventManager) {
|
|
7
7
|
this.queueManager = queueManager;
|
|
@@ -52,7 +52,7 @@ class BaseProcessor {
|
|
|
52
52
|
* class MyProcessor extends BaseProcessor {
|
|
53
53
|
* async process({ job }) {
|
|
54
54
|
* return this.withEntityManager(async (em) => {
|
|
55
|
-
* const user = await em.findOne(
|
|
55
|
+
* const user = await em.findOne(User, { id: job.data.userId });
|
|
56
56
|
* return user;
|
|
57
57
|
* });
|
|
58
58
|
* }
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/queue/processor/base.ts"],
|
|
4
|
-
"sourcesContent": ["import type {
|
|
5
|
-
"mappings": ";;
|
|
4
|
+
"sourcesContent": ["import type { EntityManager } from '@mikro-orm/core';\nimport type { Job } from 'bullmq';\nimport type { ApplicationConfig } from '../../application/base-application.interface.js';\nimport type { DatabaseInstance } from '../../database/index.js';\nimport { safeSerializeError } from '../../error/error-reporter.js';\nimport type EventManager from '../../event/manager.js';\nimport { Logger } from '../../logger/index.js';\nimport type { QueueManager } from '../../queue/index.js';\nimport type { RedisInstance } from '../../redis/index.js';\nimport type { QueueJobData } from '../job.interface.js';\n\nexport default abstract class BaseProcessor<\n TQueueManager extends QueueManager = QueueManager,\n TJobData extends QueueJobData = QueueJobData,\n TResult = unknown,\n> {\n private logger: typeof Logger = Logger;\n\n constructor(\n protected queueManager: TQueueManager,\n protected applicationConfig: ApplicationConfig,\n protected redisInstance: RedisInstance,\n protected databaseInstance: DatabaseInstance | null,\n protected eventManager?: EventManager,\n ) {}\n\n public abstract process({ job }: { job: Job<TJobData, TResult> }): Promise<TResult>;\n\n /**\n * Called before process() - override for setup logic\n * Perfect place to fork EntityManager, open connections, etc.\n *\n * @example\n * async beforeProcess({ job }) {\n * this.jobEntityManager = this.databaseInstance.getEntityManager();\n * }\n */\n public async beforeProcess({ job }: { job: Job<TJobData, TResult> }): Promise<void> {\n // Default: no-op\n }\n\n /**\n * Called after process() completes - override for cleanup\n * Perfect place to clear EntityManager, close connections, etc.\n * ALWAYS called even if process() throws an error\n *\n * @example\n * async afterProcess({ job }) {\n * if (this.jobEntityManager) {\n * this.jobEntityManager.clear();\n * delete this.jobEntityManager;\n * }\n * }\n */\n public async afterProcess({\n job,\n result,\n error,\n }: {\n job: Job<TJobData, TResult>;\n result?: TResult;\n error?: Error;\n }): Promise<void> {\n // Default: no-op\n }\n\n /**\n * Convenience method: Execute callback with automatic EntityManager lifecycle\n * Creates fork before, cleans up after (even on error)\n *\n * @example\n * class MyProcessor extends BaseProcessor {\n * async process({ job }) {\n * return this.withEntityManager(async (em) => {\n * const user = await em.findOne(User, { id: job.data.userId });\n * return user;\n * });\n * }\n * }\n */\n protected async withEntityManager<T>(callback: (em: EntityManager) => Promise<T>): Promise<T> {\n if (!this.databaseInstance) {\n throw new Error('Database not available');\n }\n return this.databaseInstance.withEntityManager(callback);\n }\n\n /**\n * Enhanced logger with structured methods\n */\n public log = {\n error: (error: Error | unknown, message?: string, meta?: Record<string, unknown>): void => {\n if (message) {\n const errorMeta = {\n ...(meta ?? {}),\n error: error instanceof Error ? error.message : safeSerializeError(error),\n stack: error instanceof Error ? error.stack : undefined,\n };\n this.logger.custom({ level: 'queueJob', message, meta: errorMeta });\n } else {\n this.logger.custom({ level: 'queueJob', message: error });\n }\n },\n\n info: (message: string, meta?: Record<string, unknown>): void => {\n this.logger.custom({ level: 'queueJob', message, meta });\n },\n\n warn: (message: string, meta?: Record<string, unknown>): void => {\n this.logger.custom({ level: 'queueJob', message, meta });\n },\n\n debug: (message: string, meta?: Record<string, unknown>): void => {\n this.logger.custom({ level: 'queueJob', message, meta });\n },\n };\n}\n"],
|
|
5
|
+
"mappings": ";;AAIA,SAAS,0BAA0B;AAEnC,SAAS,cAAc;AAKvB,MAAO,cAIL;AAAA,EAGA,YACY,cACA,mBACA,eACA,kBACA,cACV;AALU;AACA;AACA;AACA;AACA;AAAA,EACT;AAAA,EAxBL,OAeE;AAAA;AAAA;AAAA,EACQ,SAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBhC,MAAa,cAAc,EAAE,IAAI,GAAmD;AAAA,EAEpF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAa,aAAa;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIkB;AAAA,EAElB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAgB,kBAAqB,UAAyD;AAC5F,QAAI,CAAC,KAAK,kBAAkB;AAC1B,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AACA,WAAO,KAAK,iBAAiB,kBAAkB,QAAQ;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKO,MAAM;AAAA,IACX,OAAO,wBAAC,OAAwB,SAAkB,SAAyC;AACzF,UAAI,SAAS;AACX,cAAM,YAAY;AAAA,UAChB,GAAI,QAAQ,CAAC;AAAA,UACb,OAAO,iBAAiB,QAAQ,MAAM,UAAU,mBAAmB,KAAK;AAAA,UACxE,OAAO,iBAAiB,QAAQ,MAAM,QAAQ;AAAA,QAChD;AACA,aAAK,OAAO,OAAO,EAAE,OAAO,YAAY,SAAS,MAAM,UAAU,CAAC;AAAA,MACpE,OAAO;AACL,aAAK,OAAO,OAAO,EAAE,OAAO,YAAY,SAAS,MAAM,CAAC;AAAA,MAC1D;AAAA,IACF,GAXO;AAAA,IAaP,MAAM,wBAAC,SAAiB,SAAyC;AAC/D,WAAK,OAAO,OAAO,EAAE,OAAO,YAAY,SAAS,KAAK,CAAC;AAAA,IACzD,GAFM;AAAA,IAIN,MAAM,wBAAC,SAAiB,SAAyC;AAC/D,WAAK,OAAO,OAAO,EAAE,OAAO,YAAY,SAAS,KAAK,CAAC;AAAA,IACzD,GAFM;AAAA,IAIN,OAAO,wBAAC,SAAiB,SAAyC;AAChE,WAAK,OAAO,OAAO,EAAE,OAAO,YAAY,SAAS,KAAK,CAAC;AAAA,IACzD,GAFO;AAAA,EAGT;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type QueueManager from '../manager.js';
|
|
2
1
|
import type { ApplicationConfig } from '../../application/base-application.interface.js';
|
|
3
|
-
import type { RedisInstance } from '../../redis/index.js';
|
|
4
2
|
import type { DatabaseInstance } from '../../database/index.js';
|
|
5
3
|
import type EventManager from '../../event/manager.js';
|
|
6
|
-
import type
|
|
4
|
+
import type { RedisInstance } from '../../redis/index.js';
|
|
7
5
|
import type { QueueJobData } from '../job.interface.js';
|
|
6
|
+
import type QueueManager from '../manager.js';
|
|
7
|
+
import type BaseProcessor from './base.js';
|
|
8
8
|
export interface ProcessorConstructorParams<TQueueManager extends QueueManager = QueueManager, _TJobData extends QueueJobData = QueueJobData, _TResult = unknown> {
|
|
9
9
|
queueManager: TQueueManager;
|
|
10
10
|
applicationConfig: ApplicationConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processor.interface.d.ts","sourceRoot":"","sources":["../../../src/queue/processor/processor.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"processor.interface.d.ts","sourceRoot":"","sources":["../../../src/queue/processor/processor.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iDAAiD,CAAC;AACzF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,YAAY,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,YAAY,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,aAAa,MAAM,WAAW,CAAC;AAE3C,MAAM,WAAW,0BAA0B,CACzC,aAAa,SAAS,YAAY,GAAG,YAAY,EACjD,SAAS,SAAS,YAAY,GAAG,YAAY,EAC7C,QAAQ,GAAG,OAAO;IAElB,YAAY,EAAE,aAAa,CAAC;IAC5B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,aAAa,EAAE,aAAa,CAAC;IAC7B,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,MAAM,oBAAoB,CAC9B,aAAa,SAAS,YAAY,GAAG,YAAY,EACjD,QAAQ,SAAS,YAAY,GAAG,YAAY,EAC5C,OAAO,GAAG,OAAO,IACf,KACF,YAAY,EAAE,aAAa,EAC3B,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,EACzC,YAAY,CAAC,EAAE,YAAY,KACxB,aAAa,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/queue/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/queue/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,MAAM,EAAE,MAAM,QAAQ,CAAC;AAO1D,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAE1E,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,MAAM;IAC7C,OAAO,CAAC,iBAAiB,CAAoB;IAE7C,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAgB;gBAEzB,EACV,iBAAiB,EACjB,YAAY,EACZ,IAAI,EACJ,SAAS,EACT,OAAO,EACP,aAAa,GACd,EAAE,4BAA4B;IAe/B,OAAO,CAAC,cAAc,CAMpB;IAEF,OAAO,CAAC,aAAa,CAEnB;IAEF,OAAO,CAAC,cAAc,CAcpB;IAEF,OAAO,CAAC,eAAe,CAErB;IAEF,OAAO,CAAC,iBAAiB,CAwBvB;IAEF;;;OAGG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAItC"}
|