atomic-queues 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.md +686 -0
  2. package/dist/decorators/decorators.d.ts +67 -0
  3. package/dist/decorators/decorators.d.ts.map +1 -0
  4. package/dist/decorators/decorators.js +91 -0
  5. package/dist/decorators/decorators.js.map +1 -0
  6. package/dist/decorators/index.d.ts +2 -0
  7. package/dist/decorators/index.d.ts.map +1 -0
  8. package/dist/decorators/index.js +18 -0
  9. package/dist/decorators/index.js.map +1 -0
  10. package/dist/domain/index.d.ts +5 -0
  11. package/dist/domain/index.d.ts.map +1 -0
  12. package/dist/domain/index.js +21 -0
  13. package/dist/domain/index.js.map +1 -0
  14. package/dist/domain/interfaces.d.ts +614 -0
  15. package/dist/domain/interfaces.d.ts.map +1 -0
  16. package/dist/domain/interfaces.js +19 -0
  17. package/dist/domain/interfaces.js.map +1 -0
  18. package/dist/index.d.ts +40 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +61 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/module/atomic-queues.module.d.ts +97 -0
  23. package/dist/module/atomic-queues.module.d.ts.map +1 -0
  24. package/dist/module/atomic-queues.module.js +197 -0
  25. package/dist/module/atomic-queues.module.js.map +1 -0
  26. package/dist/module/index.d.ts +2 -0
  27. package/dist/module/index.d.ts.map +1 -0
  28. package/dist/module/index.js +18 -0
  29. package/dist/module/index.js.map +1 -0
  30. package/dist/services/constants.d.ts +10 -0
  31. package/dist/services/constants.d.ts.map +1 -0
  32. package/dist/services/constants.js +13 -0
  33. package/dist/services/constants.js.map +1 -0
  34. package/dist/services/cron-manager/cron-manager.service.d.ts +188 -0
  35. package/dist/services/cron-manager/cron-manager.service.d.ts.map +1 -0
  36. package/dist/services/cron-manager/cron-manager.service.js +534 -0
  37. package/dist/services/cron-manager/cron-manager.service.js.map +1 -0
  38. package/dist/services/cron-manager/index.d.ts +2 -0
  39. package/dist/services/cron-manager/index.d.ts.map +1 -0
  40. package/dist/services/cron-manager/index.js +18 -0
  41. package/dist/services/cron-manager/index.js.map +1 -0
  42. package/dist/services/index-manager/index-manager.service.d.ts +146 -0
  43. package/dist/services/index-manager/index-manager.service.d.ts.map +1 -0
  44. package/dist/services/index-manager/index-manager.service.js +337 -0
  45. package/dist/services/index-manager/index-manager.service.js.map +1 -0
  46. package/dist/services/index-manager/index.d.ts +2 -0
  47. package/dist/services/index-manager/index.d.ts.map +1 -0
  48. package/dist/services/index-manager/index.js +18 -0
  49. package/dist/services/index-manager/index.js.map +1 -0
  50. package/dist/services/index.d.ts +10 -0
  51. package/dist/services/index.d.ts.map +1 -0
  52. package/dist/services/index.js +26 -0
  53. package/dist/services/index.js.map +1 -0
  54. package/dist/services/job-processor/index.d.ts +2 -0
  55. package/dist/services/job-processor/index.d.ts.map +1 -0
  56. package/dist/services/job-processor/index.js +18 -0
  57. package/dist/services/job-processor/index.js.map +1 -0
  58. package/dist/services/job-processor/job-processor.service.d.ts +156 -0
  59. package/dist/services/job-processor/job-processor.service.d.ts.map +1 -0
  60. package/dist/services/job-processor/job-processor.service.js +331 -0
  61. package/dist/services/job-processor/job-processor.service.js.map +1 -0
  62. package/dist/services/queue-manager/index.d.ts +2 -0
  63. package/dist/services/queue-manager/index.d.ts.map +1 -0
  64. package/dist/services/queue-manager/index.js +18 -0
  65. package/dist/services/queue-manager/index.js.map +1 -0
  66. package/dist/services/queue-manager/queue-manager.service.d.ts +128 -0
  67. package/dist/services/queue-manager/queue-manager.service.d.ts.map +1 -0
  68. package/dist/services/queue-manager/queue-manager.service.js +308 -0
  69. package/dist/services/queue-manager/queue-manager.service.js.map +1 -0
  70. package/dist/services/resource-lock/index.d.ts +2 -0
  71. package/dist/services/resource-lock/index.d.ts.map +1 -0
  72. package/dist/services/resource-lock/index.js +18 -0
  73. package/dist/services/resource-lock/index.js.map +1 -0
  74. package/dist/services/resource-lock/resource-lock.service.d.ts +124 -0
  75. package/dist/services/resource-lock/resource-lock.service.d.ts.map +1 -0
  76. package/dist/services/resource-lock/resource-lock.service.js +379 -0
  77. package/dist/services/resource-lock/resource-lock.service.js.map +1 -0
  78. package/dist/services/service-queue/index.d.ts +2 -0
  79. package/dist/services/service-queue/index.d.ts.map +1 -0
  80. package/dist/services/service-queue/index.js +18 -0
  81. package/dist/services/service-queue/index.js.map +1 -0
  82. package/dist/services/service-queue/service-queue.service.d.ts +232 -0
  83. package/dist/services/service-queue/service-queue.service.d.ts.map +1 -0
  84. package/dist/services/service-queue/service-queue.service.js +647 -0
  85. package/dist/services/service-queue/service-queue.service.js.map +1 -0
  86. package/dist/services/shutdown-state/index.d.ts +2 -0
  87. package/dist/services/shutdown-state/index.d.ts.map +1 -0
  88. package/dist/services/shutdown-state/index.js +18 -0
  89. package/dist/services/shutdown-state/index.js.map +1 -0
  90. package/dist/services/shutdown-state/shutdown-state.service.d.ts +69 -0
  91. package/dist/services/shutdown-state/shutdown-state.service.d.ts.map +1 -0
  92. package/dist/services/shutdown-state/shutdown-state.service.js +127 -0
  93. package/dist/services/shutdown-state/shutdown-state.service.js.map +1 -0
  94. package/dist/services/worker-manager/index.d.ts +2 -0
  95. package/dist/services/worker-manager/index.d.ts.map +1 -0
  96. package/dist/services/worker-manager/index.js +18 -0
  97. package/dist/services/worker-manager/index.js.map +1 -0
  98. package/dist/services/worker-manager/worker-manager.service.d.ts +163 -0
  99. package/dist/services/worker-manager/worker-manager.service.d.ts.map +1 -0
  100. package/dist/services/worker-manager/worker-manager.service.js +460 -0
  101. package/dist/services/worker-manager/worker-manager.service.js.map +1 -0
  102. package/dist/utils/helpers.d.ts +124 -0
  103. package/dist/utils/helpers.d.ts.map +1 -0
  104. package/dist/utils/helpers.js +229 -0
  105. package/dist/utils/helpers.js.map +1 -0
  106. package/dist/utils/index.d.ts +2 -0
  107. package/dist/utils/index.d.ts.map +1 -0
  108. package/dist/utils/index.js +18 -0
  109. package/dist/utils/index.js.map +1 -0
  110. package/package.json +80 -0
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./shutdown-state.service"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/shutdown-state/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC"}
@@ -0,0 +1,69 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ /**
3
+ * ShutdownStateService
4
+ *
5
+ * Tracks whether the application is in the process of shutting down.
6
+ * This is used to prevent cleanup operations (like clearing player data)
7
+ * when sockets disconnect due to server shutdown vs intentional disconnect.
8
+ *
9
+ * IMPORTANT: We use direct process signal handlers (not onApplicationShutdown)
10
+ * because onApplicationShutdown is called AFTER sockets disconnect, which is too late.
11
+ * By registering our own handlers in onModuleInit, we catch the signal BEFORE
12
+ * any cleanup happens.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * @Injectable()
17
+ * export class MyService {
18
+ * constructor(private readonly shutdownState: ShutdownStateService) {}
19
+ *
20
+ * async handleDisconnect(client: Socket) {
21
+ * // Skip cleanup during graceful shutdown
22
+ * if (this.shutdownState.isShuttingDown) {
23
+ * this.logger.warn('Skipping cleanup - server is shutting down');
24
+ * return;
25
+ * }
26
+ *
27
+ * // Normal cleanup logic
28
+ * await this.cleanupUserSession(client);
29
+ * }
30
+ * }
31
+ * ```
32
+ */
33
+ export declare class ShutdownStateService implements OnModuleInit {
34
+ private readonly logger;
35
+ private shuttingDown;
36
+ private shutdownSignal;
37
+ private shutdownTimestamp;
38
+ private readonly shutdownCallbacks;
39
+ /**
40
+ * Register signal handlers early to catch shutdown before socket disconnects.
41
+ */
42
+ onModuleInit(): void;
43
+ /**
44
+ * Check if the application is currently shutting down.
45
+ */
46
+ get isShuttingDown(): boolean;
47
+ /**
48
+ * Get the signal that triggered shutdown (if any).
49
+ */
50
+ getShutdownSignal(): NodeJS.Signals | null;
51
+ /**
52
+ * Get the timestamp when shutdown was initiated.
53
+ */
54
+ getShutdownTimestamp(): Date | null;
55
+ /**
56
+ * Register a callback to be executed when shutdown is detected.
57
+ * These callbacks are executed synchronously in order of registration.
58
+ */
59
+ onShutdown(callback: () => void | Promise<void>): void;
60
+ /**
61
+ * Manually trigger shutdown state (useful for testing or programmatic shutdown).
62
+ */
63
+ triggerShutdown(signal?: NodeJS.Signals): void;
64
+ /**
65
+ * Execute all registered shutdown callbacks.
66
+ */
67
+ private executeShutdownCallbacks;
68
+ }
69
+ //# sourceMappingURL=shutdown-state.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown-state.service.d.ts","sourceRoot":"","sources":["../../../src/services/shutdown-state/shutdown-state.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAU,MAAM,gBAAgB,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBACa,oBAAqB,YAAW,YAAY;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAChE,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyC;IAE3E;;OAEG;IACH,YAAY,IAAI,IAAI;IA0BpB;;OAEG;IACH,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED;;OAEG;IACH,iBAAiB,IAAI,MAAM,CAAC,OAAO,GAAG,IAAI;IAI1C;;OAEG;IACH,oBAAoB,IAAI,IAAI,GAAG,IAAI;IAInC;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAItD;;OAEG;IACH,eAAe,CAAC,MAAM,GAAE,MAAM,CAAC,OAAmB,GAAG,IAAI;IAUzD;;OAEG;YACW,wBAAwB;CAWvC"}
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var ShutdownStateService_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.ShutdownStateService = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ /**
13
+ * ShutdownStateService
14
+ *
15
+ * Tracks whether the application is in the process of shutting down.
16
+ * This is used to prevent cleanup operations (like clearing player data)
17
+ * when sockets disconnect due to server shutdown vs intentional disconnect.
18
+ *
19
+ * IMPORTANT: We use direct process signal handlers (not onApplicationShutdown)
20
+ * because onApplicationShutdown is called AFTER sockets disconnect, which is too late.
21
+ * By registering our own handlers in onModuleInit, we catch the signal BEFORE
22
+ * any cleanup happens.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * @Injectable()
27
+ * export class MyService {
28
+ * constructor(private readonly shutdownState: ShutdownStateService) {}
29
+ *
30
+ * async handleDisconnect(client: Socket) {
31
+ * // Skip cleanup during graceful shutdown
32
+ * if (this.shutdownState.isShuttingDown) {
33
+ * this.logger.warn('Skipping cleanup - server is shutting down');
34
+ * return;
35
+ * }
36
+ *
37
+ * // Normal cleanup logic
38
+ * await this.cleanupUserSession(client);
39
+ * }
40
+ * }
41
+ * ```
42
+ */
43
+ let ShutdownStateService = ShutdownStateService_1 = class ShutdownStateService {
44
+ constructor() {
45
+ this.logger = new common_1.Logger(ShutdownStateService_1.name);
46
+ this.shuttingDown = false;
47
+ this.shutdownSignal = null;
48
+ this.shutdownTimestamp = null;
49
+ this.shutdownCallbacks = [];
50
+ }
51
+ /**
52
+ * Register signal handlers early to catch shutdown before socket disconnects.
53
+ */
54
+ onModuleInit() {
55
+ // Register handlers for common shutdown signals
56
+ // These run BEFORE NestJS starts its shutdown process
57
+ const signals = ['SIGINT', 'SIGTERM', 'SIGQUIT'];
58
+ for (const signal of signals) {
59
+ process.on(signal, () => {
60
+ if (!this.shuttingDown) {
61
+ this.logger.warn(`Shutdown signal received: ${signal} - Setting shuttingDown flag EARLY`);
62
+ this.shuttingDown = true;
63
+ this.shutdownSignal = signal;
64
+ this.shutdownTimestamp = new Date();
65
+ // Execute registered callbacks
66
+ this.executeShutdownCallbacks();
67
+ }
68
+ });
69
+ }
70
+ this.logger.log('ShutdownStateService initialized - signal handlers registered');
71
+ }
72
+ /**
73
+ * Check if the application is currently shutting down.
74
+ */
75
+ get isShuttingDown() {
76
+ return this.shuttingDown;
77
+ }
78
+ /**
79
+ * Get the signal that triggered shutdown (if any).
80
+ */
81
+ getShutdownSignal() {
82
+ return this.shutdownSignal;
83
+ }
84
+ /**
85
+ * Get the timestamp when shutdown was initiated.
86
+ */
87
+ getShutdownTimestamp() {
88
+ return this.shutdownTimestamp;
89
+ }
90
+ /**
91
+ * Register a callback to be executed when shutdown is detected.
92
+ * These callbacks are executed synchronously in order of registration.
93
+ */
94
+ onShutdown(callback) {
95
+ this.shutdownCallbacks.push(callback);
96
+ }
97
+ /**
98
+ * Manually trigger shutdown state (useful for testing or programmatic shutdown).
99
+ */
100
+ triggerShutdown(signal = 'SIGTERM') {
101
+ if (!this.shuttingDown) {
102
+ this.logger.warn(`Manual shutdown triggered with signal: ${signal}`);
103
+ this.shuttingDown = true;
104
+ this.shutdownSignal = signal;
105
+ this.shutdownTimestamp = new Date();
106
+ this.executeShutdownCallbacks();
107
+ }
108
+ }
109
+ /**
110
+ * Execute all registered shutdown callbacks.
111
+ */
112
+ async executeShutdownCallbacks() {
113
+ for (const callback of this.shutdownCallbacks) {
114
+ try {
115
+ await callback();
116
+ }
117
+ catch (error) {
118
+ this.logger.error(`Error executing shutdown callback: ${error.message}`);
119
+ }
120
+ }
121
+ }
122
+ };
123
+ exports.ShutdownStateService = ShutdownStateService;
124
+ exports.ShutdownStateService = ShutdownStateService = ShutdownStateService_1 = __decorate([
125
+ (0, common_1.Injectable)()
126
+ ], ShutdownStateService);
127
+ //# sourceMappingURL=shutdown-state.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown-state.service.js","sourceRoot":"","sources":["../../../src/services/shutdown-state/shutdown-state.service.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAkE;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEI,IAAM,oBAAoB,4BAA1B,MAAM,oBAAoB;IAA1B;QACY,WAAM,GAAG,IAAI,eAAM,CAAC,sBAAoB,CAAC,IAAI,CAAC,CAAC;QACxD,iBAAY,GAAG,KAAK,CAAC;QACrB,mBAAc,GAA0B,IAAI,CAAC;QAC7C,sBAAiB,GAAgB,IAAI,CAAC;QAC7B,sBAAiB,GAAsC,EAAE,CAAC;IAuF7E,CAAC;IArFC;;OAEG;IACH,YAAY;QACV,gDAAgD;QAChD,sDAAsD;QACtD,MAAM,OAAO,GAAqB,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAEnE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACtB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;oBACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,6BAA6B,MAAM,oCAAoC,CACxE,CAAC;oBACF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;oBACzB,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;oBAC7B,IAAI,CAAC,iBAAiB,GAAG,IAAI,IAAI,EAAE,CAAC;oBAEpC,+BAA+B;oBAC/B,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAClC,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,+DAA+D,CAChE,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,QAAoC;QAC7C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,SAAyB,SAAS;QAChD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,MAAM,EAAE,CAAC,CAAC;YACrE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;YAC7B,IAAI,CAAC,iBAAiB,GAAG,IAAI,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAClC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,wBAAwB;QACpC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC9C,IAAI,CAAC;gBACH,MAAM,QAAQ,EAAE,CAAC;YACnB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,sCAAuC,KAAe,CAAC,OAAO,EAAE,CACjE,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAA;AA5FY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;GACA,oBAAoB,CA4FhC"}
@@ -0,0 +1,2 @@
1
+ export * from './worker-manager.service';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/worker-manager/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./worker-manager.service"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/worker-manager/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC"}
@@ -0,0 +1,163 @@
1
+ import { OnModuleInit, OnApplicationShutdown } from '@nestjs/common';
2
+ import { Worker } from 'bullmq';
3
+ import Redis from 'ioredis';
4
+ import { IWorkerManager, IWorkerCreationOptions, IAtomicQueuesModuleConfig } from '../../domain';
5
+ /**
6
+ * WorkerManagerService
7
+ *
8
+ * Manages worker lifecycle with features from both Whatsapi and bl-blackjack-service:
9
+ *
10
+ * - Dynamic worker creation per entity (user message queue workers, table workers)
11
+ * - Heartbeat-based liveness tracking with TTL
12
+ * - Graceful shutdown via Redis pub/sub
13
+ * - Node-aware worker tracking (multi-instance support)
14
+ * - Automatic cleanup on application shutdown
15
+ *
16
+ * Architecture Notes:
17
+ * - Each worker registers itself with a heartbeat TTL
18
+ * - Workers subscribe to their own shutdown channel
19
+ * - A cron process monitors worker health and spawns/terminates as needed
20
+ * - On application shutdown, all node workers are signaled to close gracefully
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const worker = await workerManager.createWorker({
25
+ * workerName: `user-${userId}-worker`,
26
+ * queueName: `user-${userId}-queue`,
27
+ * processor: async (job) => {
28
+ * // Process job
29
+ * },
30
+ * });
31
+ * ```
32
+ */
33
+ export declare class WorkerManagerService implements IWorkerManager, OnModuleInit, OnApplicationShutdown {
34
+ private readonly redis;
35
+ private readonly config;
36
+ private readonly logger;
37
+ private readonly nodeId;
38
+ private readonly workers;
39
+ private readonly workerStates;
40
+ private readonly heartbeatIntervals;
41
+ private readonly shutdownSubscriptions;
42
+ private subscriberClient;
43
+ private readonly keyPrefix;
44
+ constructor(redis: Redis, config: IAtomicQueuesModuleConfig);
45
+ /**
46
+ * Initialize subscriber client for pub/sub communication.
47
+ */
48
+ onModuleInit(): void;
49
+ /**
50
+ * Create a new worker with automatic lifecycle management.
51
+ *
52
+ * This method:
53
+ * 1. Creates a BullMQ Worker
54
+ * 2. Sets up heartbeat TTL tracking
55
+ * 3. Subscribes to shutdown channel for graceful termination
56
+ * 4. Registers lifecycle event handlers
57
+ */
58
+ createWorker(options: IWorkerCreationOptions): Promise<Worker>;
59
+ /**
60
+ * Check if a worker exists and is alive (has valid heartbeat).
61
+ */
62
+ workerExists(workerName: string): Promise<boolean>;
63
+ /**
64
+ * Get all running workers for the current node.
65
+ */
66
+ getNodeWorkers(): Promise<string[]>;
67
+ /**
68
+ * Get all running workers across all nodes.
69
+ */
70
+ getAllWorkers(): Promise<string[]>;
71
+ /**
72
+ * Get all workers for a specific entity.
73
+ * Uses the worker heartbeat TTL keys as the single source of truth.
74
+ * Worker names follow the pattern: {entityId}-worker
75
+ */
76
+ getEntityWorkers(entityType: string, entityId: string): Promise<string[]>;
77
+ /**
78
+ * Signal a worker to close gracefully via pub/sub.
79
+ */
80
+ signalWorkerClose(workerName: string): Promise<void>;
81
+ /**
82
+ * Signal all workers on current node to close.
83
+ */
84
+ signalNodeWorkersClose(): Promise<void>;
85
+ /**
86
+ * Close all workers managed by this instance.
87
+ * This is the public API for external callers to gracefully shutdown workers.
88
+ */
89
+ closeAllWorkers(timeoutMs?: number): Promise<void>;
90
+ /**
91
+ * Wait for all node workers to close with timeout.
92
+ */
93
+ waitForWorkersToClose(timeoutMs?: number): Promise<void>;
94
+ /**
95
+ * Reset worker heartbeat TTL.
96
+ */
97
+ resetWorkerHeartbeat(workerName: string, ttlSeconds?: number): Promise<void>;
98
+ /**
99
+ * Remove worker heartbeat (mark as dead).
100
+ */
101
+ removeWorkerHeartbeat(workerName: string): Promise<void>;
102
+ /**
103
+ * Get the node ID for this instance.
104
+ */
105
+ getNodeId(): string;
106
+ /**
107
+ * Index a worker for an entity (for entity-based tracking).
108
+ */
109
+ indexEntityWorker(entityType: string, entityId: string, workerId: string, ttlSeconds?: number): Promise<void>;
110
+ /**
111
+ * Remove entity worker index.
112
+ */
113
+ removeEntityWorkerIndex(entityType: string, entityId: string, workerId: string): Promise<void>;
114
+ /**
115
+ * Get subscriber client for pub/sub operations.
116
+ */
117
+ getSubscriberClient(): Redis;
118
+ /**
119
+ * Graceful shutdown on application termination.
120
+ */
121
+ onApplicationShutdown(): Promise<void>;
122
+ /**
123
+ * Generate a unique node ID for this instance.
124
+ */
125
+ private generateNodeId;
126
+ /**
127
+ * Create a subscriber client for pub/sub.
128
+ */
129
+ private createSubscriberClient;
130
+ /**
131
+ * Get the Redis key for a worker's heartbeat.
132
+ */
133
+ private getWorkerKey;
134
+ /**
135
+ * Get the shutdown channel for a worker.
136
+ */
137
+ private getWorkerShutdownChannel;
138
+ /**
139
+ * Merge worker config with defaults.
140
+ */
141
+ private mergeWorkerConfig;
142
+ /**
143
+ * Set up heartbeat interval for a worker.
144
+ */
145
+ private setupHeartbeat;
146
+ /**
147
+ * Subscribe to shutdown channel for graceful termination.
148
+ */
149
+ private subscribeToShutdown;
150
+ /**
151
+ * Close a worker and clean up resources.
152
+ */
153
+ private closeWorker;
154
+ /**
155
+ * Register event handlers for a worker.
156
+ */
157
+ private registerWorkerEvents;
158
+ /**
159
+ * Sleep utility.
160
+ */
161
+ private sleep;
162
+ }
163
+ //# sourceMappingURL=worker-manager.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-manager.service.d.ts","sourceRoot":"","sources":["../../../src/services/worker-manager/worker-manager.service.ts"],"names":[],"mappings":"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"}