pp-command-bus 1.5.0 → 2.0.0

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 (193) hide show
  1. package/README.md +400 -1219
  2. package/dist/command-bus/command-bus.spec.js +138 -359
  3. package/dist/command-bus/command-bus.spec.js.map +1 -1
  4. package/dist/command-bus/command.d.ts +3 -4
  5. package/dist/command-bus/command.js +3 -32
  6. package/dist/command-bus/command.js.map +1 -1
  7. package/dist/command-bus/config/command-bus-config.d.ts +75 -21
  8. package/dist/command-bus/config/command-bus-config.js +99 -58
  9. package/dist/command-bus/config/command-bus-config.js.map +1 -1
  10. package/dist/command-bus/config/command-bus-config.spec.js +174 -100
  11. package/dist/command-bus/config/command-bus-config.spec.js.map +1 -1
  12. package/dist/command-bus/index.d.ts +39 -52
  13. package/dist/command-bus/index.js +133 -126
  14. package/dist/command-bus/index.js.map +1 -1
  15. package/dist/command-bus/logging/command-logger.d.ts +2 -0
  16. package/dist/command-bus/logging/command-logger.js +7 -0
  17. package/dist/command-bus/logging/command-logger.js.map +1 -1
  18. package/dist/command-bus/logging/command-logger.spec.js +36 -0
  19. package/dist/command-bus/logging/command-logger.spec.js.map +1 -1
  20. package/dist/command-bus/serialization/index.d.ts +6 -0
  21. package/dist/command-bus/serialization/index.js +9 -0
  22. package/dist/command-bus/serialization/index.js.map +1 -0
  23. package/dist/command-bus/serialization/msgpack-serializer.d.ts +26 -0
  24. package/dist/command-bus/serialization/msgpack-serializer.js +70 -0
  25. package/dist/command-bus/serialization/msgpack-serializer.js.map +1 -0
  26. package/dist/command-bus/serialization/msgpack-serializer.spec.js +223 -0
  27. package/dist/command-bus/serialization/msgpack-serializer.spec.js.map +1 -0
  28. package/dist/command-bus/serialization/serializer.interface.d.ts +21 -0
  29. package/dist/command-bus/serialization/serializer.interface.js +3 -0
  30. package/dist/command-bus/serialization/serializer.interface.js.map +1 -0
  31. package/dist/command-bus/transport/consumer-loop.d.ts +45 -0
  32. package/dist/command-bus/transport/consumer-loop.js +90 -0
  33. package/dist/command-bus/transport/consumer-loop.js.map +1 -0
  34. package/dist/command-bus/transport/consumer-loop.spec.js +216 -0
  35. package/dist/command-bus/transport/consumer-loop.spec.js.map +1 -0
  36. package/dist/command-bus/transport/index.d.ts +21 -0
  37. package/dist/command-bus/transport/index.js +23 -0
  38. package/dist/command-bus/transport/index.js.map +1 -0
  39. package/dist/command-bus/transport/message-processor.d.ts +59 -0
  40. package/dist/command-bus/transport/message-processor.js +111 -0
  41. package/dist/command-bus/transport/message-processor.js.map +1 -0
  42. package/dist/command-bus/transport/message-processor.spec.js +185 -0
  43. package/dist/command-bus/transport/message-processor.spec.js.map +1 -0
  44. package/dist/command-bus/transport/pending-recovery.d.ts +54 -0
  45. package/dist/command-bus/transport/pending-recovery.js +139 -0
  46. package/dist/command-bus/transport/pending-recovery.js.map +1 -0
  47. package/dist/command-bus/transport/pending-recovery.spec.js +176 -0
  48. package/dist/command-bus/transport/pending-recovery.spec.js.map +1 -0
  49. package/dist/command-bus/transport/redis-codec.d.ts +24 -0
  50. package/dist/command-bus/transport/redis-codec.js +33 -0
  51. package/dist/command-bus/transport/redis-codec.js.map +1 -0
  52. package/dist/command-bus/transport/redis-codec.spec.js +53 -0
  53. package/dist/command-bus/transport/redis-codec.spec.js.map +1 -0
  54. package/dist/command-bus/transport/redis-streams-transport.d.ts +91 -0
  55. package/dist/command-bus/transport/redis-streams-transport.js +134 -0
  56. package/dist/command-bus/transport/redis-streams-transport.js.map +1 -0
  57. package/dist/command-bus/transport/redis-streams-transport.spec.js +420 -0
  58. package/dist/command-bus/transport/redis-streams-transport.spec.js.map +1 -0
  59. package/dist/command-bus/transport/rpc-handler.d.ts +39 -0
  60. package/dist/command-bus/transport/rpc-handler.js +87 -0
  61. package/dist/command-bus/transport/rpc-handler.js.map +1 -0
  62. package/dist/command-bus/transport/rpc-handler.spec.js +157 -0
  63. package/dist/command-bus/transport/rpc-handler.spec.js.map +1 -0
  64. package/dist/command-bus/transport/stream-consumer.d.ts +89 -0
  65. package/dist/command-bus/transport/stream-consumer.js +181 -0
  66. package/dist/command-bus/transport/stream-consumer.js.map +1 -0
  67. package/dist/command-bus/transport/stream-consumer.spec.js +284 -0
  68. package/dist/command-bus/transport/stream-consumer.spec.js.map +1 -0
  69. package/dist/command-bus/transport/stream-producer.d.ts +23 -0
  70. package/dist/command-bus/transport/stream-producer.js +70 -0
  71. package/dist/command-bus/transport/stream-producer.js.map +1 -0
  72. package/dist/command-bus/transport/stream-producer.spec.js +125 -0
  73. package/dist/command-bus/transport/stream-producer.spec.js.map +1 -0
  74. package/dist/command-bus/transport/transport.interface.d.ts +87 -0
  75. package/dist/command-bus/transport/transport.interface.js +3 -0
  76. package/dist/command-bus/transport/transport.interface.js.map +1 -0
  77. package/dist/command-bus/types/index.d.ts +0 -84
  78. package/dist/examples/rpc.demo.js +1 -1
  79. package/dist/examples/rpc.demo.js.map +1 -1
  80. package/dist/index.d.ts +8 -5
  81. package/dist/index.js +6 -4
  82. package/dist/index.js.map +1 -1
  83. package/dist/pp-command-bus-2.0.0.tgz +0 -0
  84. package/dist/shared/redis/connection-pool.d.ts +54 -0
  85. package/dist/shared/redis/connection-pool.js +117 -0
  86. package/dist/shared/redis/connection-pool.js.map +1 -0
  87. package/dist/shared/redis/connection-pool.spec.js +114 -0
  88. package/dist/shared/redis/connection-pool.spec.js.map +1 -0
  89. package/dist/shared/redis/index.d.ts +5 -3
  90. package/dist/shared/redis/index.js +6 -4
  91. package/dist/shared/redis/index.js.map +1 -1
  92. package/dist/shared/redis/rpc-connection-pool.d.ts +61 -0
  93. package/dist/shared/redis/rpc-connection-pool.js +154 -0
  94. package/dist/shared/redis/rpc-connection-pool.js.map +1 -0
  95. package/dist/shared/redis/rpc-connection-pool.spec.d.ts +1 -0
  96. package/dist/shared/redis/rpc-connection-pool.spec.js +173 -0
  97. package/dist/shared/redis/rpc-connection-pool.spec.js.map +1 -0
  98. package/dist/shared/types.d.ts +0 -4
  99. package/dist/shared/utils/error-utils.d.ts +8 -0
  100. package/dist/shared/utils/error-utils.js +14 -0
  101. package/dist/shared/utils/error-utils.js.map +1 -0
  102. package/package.json +12 -12
  103. package/dist/command-bus/config/auto-config-optimizer.d.ts +0 -35
  104. package/dist/command-bus/config/auto-config-optimizer.js +0 -52
  105. package/dist/command-bus/config/auto-config-optimizer.js.map +0 -1
  106. package/dist/command-bus/config/auto-config-optimizer.spec.js +0 -42
  107. package/dist/command-bus/config/auto-config-optimizer.spec.js.map +0 -1
  108. package/dist/command-bus/job/index.d.ts +0 -6
  109. package/dist/command-bus/job/index.js +0 -15
  110. package/dist/command-bus/job/index.js.map +0 -1
  111. package/dist/command-bus/job/job-options-builder.d.ts +0 -21
  112. package/dist/command-bus/job/job-options-builder.js +0 -58
  113. package/dist/command-bus/job/job-options-builder.js.map +0 -1
  114. package/dist/command-bus/job/job-options-builder.spec.js +0 -156
  115. package/dist/command-bus/job/job-options-builder.spec.js.map +0 -1
  116. package/dist/command-bus/job/job-processor.d.ts +0 -39
  117. package/dist/command-bus/job/job-processor.js +0 -203
  118. package/dist/command-bus/job/job-processor.js.map +0 -1
  119. package/dist/command-bus/job/job-processor.spec.js +0 -436
  120. package/dist/command-bus/job/job-processor.spec.js.map +0 -1
  121. package/dist/command-bus/queue/index.d.ts +0 -5
  122. package/dist/command-bus/queue/index.js +0 -13
  123. package/dist/command-bus/queue/index.js.map +0 -1
  124. package/dist/command-bus/queue/queue-manager.d.ts +0 -56
  125. package/dist/command-bus/queue/queue-manager.js +0 -163
  126. package/dist/command-bus/queue/queue-manager.js.map +0 -1
  127. package/dist/command-bus/queue/queue-manager.spec.js +0 -371
  128. package/dist/command-bus/queue/queue-manager.spec.js.map +0 -1
  129. package/dist/command-bus/rpc/index.d.ts +0 -11
  130. package/dist/command-bus/rpc/index.js +0 -19
  131. package/dist/command-bus/rpc/index.js.map +0 -1
  132. package/dist/command-bus/rpc/payload-compression.service.d.ts +0 -50
  133. package/dist/command-bus/rpc/payload-compression.service.js +0 -215
  134. package/dist/command-bus/rpc/payload-compression.service.js.map +0 -1
  135. package/dist/command-bus/rpc/payload-compression.service.spec.js +0 -376
  136. package/dist/command-bus/rpc/payload-compression.service.spec.js.map +0 -1
  137. package/dist/command-bus/rpc/rpc-coordinator.d.ts +0 -96
  138. package/dist/command-bus/rpc/rpc-coordinator.js +0 -500
  139. package/dist/command-bus/rpc/rpc-coordinator.js.map +0 -1
  140. package/dist/command-bus/rpc/rpc-coordinator.spec.js +0 -621
  141. package/dist/command-bus/rpc/rpc-coordinator.spec.js.map +0 -1
  142. package/dist/command-bus/rpc/rpc-job-cancellation.service.d.ts +0 -82
  143. package/dist/command-bus/rpc/rpc-job-cancellation.service.js +0 -180
  144. package/dist/command-bus/rpc/rpc-job-cancellation.service.js.map +0 -1
  145. package/dist/command-bus/rpc/rpc-job-cancellation.service.spec.js +0 -286
  146. package/dist/command-bus/rpc/rpc-job-cancellation.service.spec.js.map +0 -1
  147. package/dist/command-bus/worker/index.d.ts +0 -10
  148. package/dist/command-bus/worker/index.js +0 -19
  149. package/dist/command-bus/worker/index.js.map +0 -1
  150. package/dist/command-bus/worker/worker-benchmark.d.ts +0 -71
  151. package/dist/command-bus/worker/worker-benchmark.js +0 -202
  152. package/dist/command-bus/worker/worker-benchmark.js.map +0 -1
  153. package/dist/command-bus/worker/worker-benchmark.spec.js +0 -310
  154. package/dist/command-bus/worker/worker-benchmark.spec.js.map +0 -1
  155. package/dist/command-bus/worker/worker-metrics-collector.d.ts +0 -98
  156. package/dist/command-bus/worker/worker-metrics-collector.js +0 -242
  157. package/dist/command-bus/worker/worker-metrics-collector.js.map +0 -1
  158. package/dist/command-bus/worker/worker-orchestrator.d.ts +0 -70
  159. package/dist/command-bus/worker/worker-orchestrator.js +0 -339
  160. package/dist/command-bus/worker/worker-orchestrator.js.map +0 -1
  161. package/dist/command-bus/worker/worker-orchestrator.spec.js +0 -712
  162. package/dist/command-bus/worker/worker-orchestrator.spec.js.map +0 -1
  163. package/dist/examples/auto-config.demo.d.ts +0 -9
  164. package/dist/examples/auto-config.demo.js +0 -106
  165. package/dist/examples/auto-config.demo.js.map +0 -1
  166. package/dist/examples/rpc-compression.demo.d.ts +0 -5
  167. package/dist/examples/rpc-compression.demo.js +0 -358
  168. package/dist/examples/rpc-compression.demo.js.map +0 -1
  169. package/dist/examples/rpc-resilience.demo.d.ts +0 -15
  170. package/dist/examples/rpc-resilience.demo.js +0 -233
  171. package/dist/examples/rpc-resilience.demo.js.map +0 -1
  172. package/dist/pp-command-bus-1.5.0.tgz +0 -0
  173. package/dist/shared/config/base-config.d.ts +0 -54
  174. package/dist/shared/config/base-config.js +0 -114
  175. package/dist/shared/config/base-config.js.map +0 -1
  176. package/dist/shared/config/base-config.spec.js +0 -204
  177. package/dist/shared/config/base-config.spec.js.map +0 -1
  178. package/dist/shared/config/index.d.ts +0 -1
  179. package/dist/shared/config/index.js +0 -9
  180. package/dist/shared/config/index.js.map +0 -1
  181. package/dist/shared/redis/redis-connection-factory.d.ts +0 -66
  182. package/dist/shared/redis/redis-connection-factory.js +0 -113
  183. package/dist/shared/redis/redis-connection-factory.js.map +0 -1
  184. /package/dist/command-bus/{config/auto-config-optimizer.spec.d.ts → serialization/msgpack-serializer.spec.d.ts} +0 -0
  185. /package/dist/command-bus/{job/job-options-builder.spec.d.ts → transport/consumer-loop.spec.d.ts} +0 -0
  186. /package/dist/command-bus/{job/job-processor.spec.d.ts → transport/message-processor.spec.d.ts} +0 -0
  187. /package/dist/command-bus/{queue/queue-manager.spec.d.ts → transport/pending-recovery.spec.d.ts} +0 -0
  188. /package/dist/command-bus/{rpc/payload-compression.service.spec.d.ts → transport/redis-codec.spec.d.ts} +0 -0
  189. /package/dist/command-bus/{rpc/rpc-coordinator.spec.d.ts → transport/redis-streams-transport.spec.d.ts} +0 -0
  190. /package/dist/command-bus/{rpc/rpc-job-cancellation.service.spec.d.ts → transport/rpc-handler.spec.d.ts} +0 -0
  191. /package/dist/command-bus/{worker/worker-benchmark.spec.d.ts → transport/stream-consumer.spec.d.ts} +0 -0
  192. /package/dist/command-bus/{worker/worker-orchestrator.spec.d.ts → transport/stream-producer.spec.d.ts} +0 -0
  193. /package/dist/shared/{config/base-config.spec.d.ts → redis/connection-pool.spec.d.ts} +0 -0
@@ -1,339 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const bullmq_1 = require("bullmq");
16
- const worker_metrics_collector_1 = __importDefault(require("./worker-metrics-collector"));
17
- const worker_benchmark_1 = __importDefault(require("./worker-benchmark"));
18
- const redis_1 = require("../../shared/redis");
19
- /**
20
- * Zarządza workerami BullMQ dla obsługi komend
21
- */
22
- class WorkerOrchestrator {
23
- constructor(redisConnection, jobProcessor, defaultConcurrency, maxAttempts, logger) {
24
- this.redisConnection = redisConnection;
25
- this.jobProcessor = jobProcessor;
26
- this.defaultConcurrency = defaultConcurrency;
27
- this.maxAttempts = maxAttempts;
28
- this.logger = logger;
29
- /**
30
- * Workery BullMQ dla obsługi komend
31
- */
32
- this.workers = {};
33
- /**
34
- * Collectory metryk dla każdego workera
35
- */
36
- this.metricsCollectors = {};
37
- /**
38
- * Timestamp ostatniej zmiany concurrency per-worker (dla cooldown 30s)
39
- */
40
- this.lastConcurrencyChange = {};
41
- /**
42
- * Cooldown między zmianami concurrency (30s)
43
- */
44
- this.concurrencyCooldownMs = 30000;
45
- /**
46
- * Współczynnik zwiększenia concurrency (+20%)
47
- */
48
- this.CONCURRENCY_INCREASE_FACTOR = 1.2;
49
- /**
50
- * Współczynnik zmniejszenia concurrency (-20%)
51
- */
52
- this.CONCURRENCY_DECREASE_FACTOR = 0.8;
53
- }
54
- /**
55
- * Rejestruje handler dla komendy i tworzy workera
56
- * @param commandName - Nazwa komendy
57
- */
58
- registerWorker(commandName) {
59
- if (this.workers[commandName]) {
60
- throw new Error(`Worker dla komendy ${commandName} już istnieje`);
61
- }
62
- // Utwórz workera z optymalnym concurrency
63
- this.workers[commandName] = new bullmq_1.Worker(`{${commandName}}`, (job) => __awaiter(this, void 0, void 0, function* () {
64
- try {
65
- return yield this.jobProcessor.process(job, commandName);
66
- }
67
- catch (error) {
68
- // Top-level error boundary - zapobiega crashom workera
69
- this.logger.error('Worker handler critical error', {
70
- commandName,
71
- jobId: job.id,
72
- error: error instanceof Error ? error.message : String(error),
73
- timestamp: new Date().toISOString(),
74
- });
75
- throw error; // BullMQ retry mechanism
76
- }
77
- }), {
78
- connection: this.redisConnection,
79
- concurrency: this.defaultConcurrency,
80
- });
81
- this.logger.log(`Worker zarejestrowany dla komendy ${commandName}`, {
82
- concurrency: this.defaultConcurrency,
83
- timestamp: new Date().toISOString(),
84
- });
85
- // Uruchom benchmark aby ustalić optymalne concurrency
86
- const benchmark = new worker_benchmark_1.default(commandName, this.redisConnection, this.jobProcessor, this.logger);
87
- benchmark
88
- .run()
89
- .then((benchmarkResult) => {
90
- const optimalConcurrency = benchmarkResult.recommendedConcurrency;
91
- // Zapisz per-worker concurrency
92
- if (this.workers[commandName]) {
93
- this.workers[commandName].concurrency = optimalConcurrency;
94
- this.logger.log('Benchmark zakończony - tworzę workera', {
95
- commandName,
96
- oldConcurrency: this.defaultConcurrency,
97
- newConcurrency: optimalConcurrency,
98
- benchmarkResult,
99
- timestamp: new Date().toISOString(),
100
- });
101
- }
102
- })
103
- .catch((error) => {
104
- this.logger.warn('Wystąpił błąd podczas benchmarku', {
105
- commandName,
106
- error,
107
- timestamp: new Date().toISOString(),
108
- });
109
- });
110
- // WAŻNE: Utwórz metrics collector PRZED setupWorkerEventHandlers
111
- // Aby był dostępny w event handlerach workera
112
- const metricsCollector = new worker_metrics_collector_1.default(commandName, this.logger,
113
- // Callback wywoływany gdy MetricsCollector rekomenduje zmianę concurrency
114
- (recommendation) => {
115
- if (recommendation.direction !== 'none') {
116
- this.adjustConcurrency(commandName, recommendation.direction, recommendation.reason);
117
- }
118
- });
119
- this.metricsCollectors[commandName] = metricsCollector;
120
- // Skonfiguruj event handlery (wymaga istniejącego metricsCollector)
121
- this.setupWorkerEventHandlers(commandName);
122
- }
123
- /**
124
- * Konfiguruje event handlery dla workera
125
- */
126
- setupWorkerEventHandlers(commandName) {
127
- const worker = this.workers[commandName];
128
- const logger = this.logger;
129
- const maxAttempts = this.maxAttempts;
130
- const metricsCollector = this.metricsCollectors[commandName];
131
- // Tracking czasu przetwarzania dla metryk
132
- const jobStartTimes = new Map();
133
- worker.on('failed', (job, err) => {
134
- var _a, _b, _c, _d, _e;
135
- const command = job === null || job === void 0 ? void 0 : job.data;
136
- // Wyczyść tracking czasu dla failed jobs (zapobiega memory leak)
137
- if (job === null || job === void 0 ? void 0 : job.id) {
138
- jobStartTimes.delete(job.id);
139
- }
140
- logger.error('Job zakończony niepowodzeniem', {
141
- commandName,
142
- commandId: command === null || command === void 0 ? void 0 : command.__id,
143
- jobId: job === null || job === void 0 ? void 0 : job.id,
144
- error: err.message,
145
- attempt: job === null || job === void 0 ? void 0 : job.attemptsMade,
146
- maxAttempts: (_b = (_a = job === null || job === void 0 ? void 0 : job.opts) === null || _a === void 0 ? void 0 : _a.attempts) !== null && _b !== void 0 ? _b : maxAttempts,
147
- isRetryable: ((_c = job === null || job === void 0 ? void 0 : job.attemptsMade) !== null && _c !== void 0 ? _c : 0) < ((_e = (_d = job === null || job === void 0 ? void 0 : job.opts) === null || _d === void 0 ? void 0 : _d.attempts) !== null && _e !== void 0 ? _e : maxAttempts),
148
- timestamp: new Date().toISOString(),
149
- });
150
- // Event-driven metrics - job nieudany
151
- if ((job === null || job === void 0 ? void 0 : job.id) && metricsCollector) {
152
- metricsCollector.onJobFailed(job.id);
153
- }
154
- });
155
- worker.on('completed', (job) => {
156
- const command = job === null || job === void 0 ? void 0 : job.data;
157
- // Oblicz czas przetwarzania i przekaż do metrics collector
158
- try {
159
- if ((job === null || job === void 0 ? void 0 : job.id) && jobStartTimes.has(job.id)) {
160
- const startTime = jobStartTimes.get(job.id);
161
- const processingTime = Date.now() - startTime;
162
- // Event-driven metrics - przekaż czas przetwarzania
163
- if (metricsCollector) {
164
- metricsCollector.onJobCompleted(job.id, processingTime);
165
- }
166
- jobStartTimes.delete(job.id);
167
- }
168
- else if (job === null || job === void 0 ? void 0 : job.id) {
169
- logger.warn('Brak czasu startu dla joba - pomijam metryki czasu', {
170
- commandName,
171
- jobId: job.id,
172
- timestamp: new Date().toISOString(),
173
- });
174
- // Wywołaj z czasem 0 aby nie tracić licznika completed
175
- if (metricsCollector && (job === null || job === void 0 ? void 0 : job.id)) {
176
- metricsCollector.onJobCompleted(job.id, 0);
177
- }
178
- }
179
- }
180
- catch (error) {
181
- logger.error('Błąd podczas przetwarzania metryk joba', {
182
- commandName,
183
- jobId: job === null || job === void 0 ? void 0 : job.id,
184
- error: error instanceof Error ? error.message : String(error),
185
- timestamp: new Date().toISOString(),
186
- });
187
- }
188
- logger.log('Job zakończony pomyślnie', {
189
- commandName,
190
- commandId: command === null || command === void 0 ? void 0 : command.__id,
191
- jobId: job.id,
192
- hasReturnValue: job.returnvalue !== undefined,
193
- timestamp: new Date().toISOString(),
194
- });
195
- });
196
- worker.on('active', (job) => {
197
- const command = job === null || job === void 0 ? void 0 : job.data;
198
- // Zapisz czas rozpoczęcia dla tracking przetwarzania
199
- if (job === null || job === void 0 ? void 0 : job.id) {
200
- jobStartTimes.set(job.id, Date.now());
201
- // Event-driven metrics - job aktywowany
202
- if (metricsCollector) {
203
- metricsCollector.onJobActive(job.id);
204
- }
205
- }
206
- logger.debug('Job rozpoczęty', {
207
- commandName,
208
- commandId: command === null || command === void 0 ? void 0 : command.__id,
209
- jobId: job.id,
210
- timestamp: new Date().toISOString(),
211
- });
212
- });
213
- worker.on('stalled', (jobId) => {
214
- // Wyczyść tracking czasu dla stalled jobs (zapobiega memory leak)
215
- jobStartTimes.delete(jobId);
216
- logger.warn('Job zatrzymany (stalled)', {
217
- commandName,
218
- jobId,
219
- reason: 'Prawdopodobnie worker przestał odpowiadać',
220
- timestamp: new Date().toISOString(),
221
- });
222
- });
223
- worker.on('progress', (job, progress) => {
224
- const command = job === null || job === void 0 ? void 0 : job.data;
225
- logger.debug('Job - postęp przetwarzania', {
226
- commandName,
227
- commandId: command === null || command === void 0 ? void 0 : command.__id,
228
- jobId: job.id,
229
- progress,
230
- timestamp: new Date().toISOString(),
231
- });
232
- });
233
- worker.on('error', (err) => {
234
- logger.error('Błąd workera', {
235
- commandName,
236
- error: (0, redis_1.formatRedisError)(err),
237
- errorCode: (0, redis_1.getErrorCode)(err),
238
- timestamp: new Date().toISOString(),
239
- });
240
- });
241
- }
242
- /**
243
- * Pobiera workera dla danego typu komendy
244
- * @param commandName - Nazwa komendy
245
- */
246
- getWorker(commandName) {
247
- return this.workers[commandName];
248
- }
249
- /**
250
- * Zamyka wszystkie workery i czyści collectory metryk
251
- */
252
- closeAll() {
253
- return __awaiter(this, void 0, void 0, function* () {
254
- const workers = Object.values(this.workers);
255
- // Event-driven collectors nie wymagają stop() - nie mają setInterval
256
- // Usuń wszystkie event listeners PRZED zamknięciem workerów
257
- // Zapobiega memory leakom z closures i referencjami do handlery
258
- workers.forEach((worker) => worker.removeAllListeners());
259
- // Zamknij workery
260
- yield Promise.all(workers.map((worker) => worker.close()));
261
- this.workers = {};
262
- this.metricsCollectors = {};
263
- });
264
- }
265
- /**
266
- * Dynamicznie dostosowuje concurrency workera na podstawie metryk
267
- * Zmiana: +/-20% za każdym razem, z cooldown 30s
268
- * Limity: min 10, max 2000
269
- */
270
- adjustConcurrency(commandName, direction, reason) {
271
- var _a, _b;
272
- const worker = this.workers[commandName];
273
- if (!worker) {
274
- this.logger.warn('Nie można dostosować concurrency - worker nie istnieje', {
275
- commandName,
276
- timestamp: new Date().toISOString(),
277
- });
278
- return;
279
- }
280
- // Sprawdź cooldown
281
- const now = Date.now();
282
- const lastChange = (_a = this.lastConcurrencyChange[commandName]) !== null && _a !== void 0 ? _a : 0;
283
- const timeSinceLastChange = now - lastChange;
284
- if (timeSinceLastChange < this.concurrencyCooldownMs) {
285
- this.logger.debug('Cooldown aktywny - pomijam zmianę concurrency', {
286
- commandName,
287
- timeSinceLastChangeMs: timeSinceLastChange,
288
- cooldownMs: this.concurrencyCooldownMs,
289
- timestamp: new Date().toISOString(),
290
- });
291
- return;
292
- }
293
- const currentConcurrency = (_b = worker.concurrency) !== null && _b !== void 0 ? _b : this.defaultConcurrency;
294
- let newConcurrency;
295
- // Oblicz nową wartość (+/-20%)
296
- if (direction === 'increase') {
297
- newConcurrency = Math.round(currentConcurrency * this.CONCURRENCY_INCREASE_FACTOR);
298
- }
299
- else {
300
- newConcurrency = Math.round(currentConcurrency * this.CONCURRENCY_DECREASE_FACTOR);
301
- }
302
- // Zastosuj limity: min 10, max 2000
303
- newConcurrency = Math.max(10, Math.min(2000, newConcurrency));
304
- // Jeśli wartość się nie zmieniła (np. już na limicie), pomiń
305
- if (newConcurrency === currentConcurrency) {
306
- this.logger.debug('Concurrency bez zmian - osiągnięto limit', {
307
- commandName,
308
- currentConcurrency,
309
- attemptedDirection: direction,
310
- timestamp: new Date().toISOString(),
311
- });
312
- return;
313
- }
314
- // Zastosuj nową wartość
315
- worker.concurrency = newConcurrency;
316
- this.lastConcurrencyChange[commandName] = now;
317
- const changePercent = ((newConcurrency - currentConcurrency) / currentConcurrency) * 100;
318
- this.logger.log('Dynamiczna zmiana concurrency', {
319
- commandName,
320
- oldConcurrency: currentConcurrency,
321
- newConcurrency,
322
- change: `${changePercent > 0 ? '+' : ''}${changePercent.toFixed(0)}%`,
323
- direction,
324
- reason,
325
- timestamp: new Date().toISOString(),
326
- });
327
- }
328
- /**
329
- * Zwraca statystyki workerów (dla diagnostyki)
330
- */
331
- getWorkerStats() {
332
- return {
333
- activeWorkersCount: Object.keys(this.workers).length,
334
- workerNames: Object.keys(this.workers),
335
- };
336
- }
337
- }
338
- exports.default = WorkerOrchestrator;
339
- //# sourceMappingURL=worker-orchestrator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worker-orchestrator.js","sourceRoot":"","sources":["../../../src/command-bus/worker/worker-orchestrator.ts"],"names":[],"mappings":"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"}