pp-command-bus 1.5.0 → 2.0.1

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 (205) 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 +80 -21
  8. package/dist/command-bus/config/command-bus-config.js +104 -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 +41 -50
  13. package/dist/command-bus/index.js +143 -127
  14. package/dist/command-bus/index.js.map +1 -1
  15. package/dist/command-bus/interceptors/index.d.ts +5 -0
  16. package/dist/command-bus/interceptors/index.js +22 -0
  17. package/dist/command-bus/interceptors/index.js.map +1 -0
  18. package/dist/command-bus/interceptors/interceptor.interface.d.ts +35 -0
  19. package/dist/command-bus/interceptors/interceptor.interface.js +3 -0
  20. package/dist/command-bus/interceptors/interceptor.interface.js.map +1 -0
  21. package/dist/command-bus/interceptors/performance-interceptor.d.ts +24 -0
  22. package/dist/command-bus/interceptors/performance-interceptor.js +86 -0
  23. package/dist/command-bus/interceptors/performance-interceptor.js.map +1 -0
  24. package/dist/command-bus/interceptors/performance-interceptor.spec.js +124 -0
  25. package/dist/command-bus/interceptors/performance-interceptor.spec.js.map +1 -0
  26. package/dist/command-bus/logging/command-logger.d.ts +2 -0
  27. package/dist/command-bus/logging/command-logger.js +7 -0
  28. package/dist/command-bus/logging/command-logger.js.map +1 -1
  29. package/dist/command-bus/logging/command-logger.spec.js +36 -0
  30. package/dist/command-bus/logging/command-logger.spec.js.map +1 -1
  31. package/dist/command-bus/serialization/index.d.ts +6 -0
  32. package/dist/command-bus/serialization/index.js +9 -0
  33. package/dist/command-bus/serialization/index.js.map +1 -0
  34. package/dist/command-bus/serialization/msgpack-serializer.d.ts +26 -0
  35. package/dist/command-bus/serialization/msgpack-serializer.js +70 -0
  36. package/dist/command-bus/serialization/msgpack-serializer.js.map +1 -0
  37. package/dist/command-bus/serialization/msgpack-serializer.spec.js +223 -0
  38. package/dist/command-bus/serialization/msgpack-serializer.spec.js.map +1 -0
  39. package/dist/command-bus/serialization/serializer.interface.d.ts +21 -0
  40. package/dist/command-bus/serialization/serializer.interface.js +3 -0
  41. package/dist/command-bus/serialization/serializer.interface.js.map +1 -0
  42. package/dist/command-bus/transport/consumer-loop.d.ts +45 -0
  43. package/dist/command-bus/transport/consumer-loop.js +90 -0
  44. package/dist/command-bus/transport/consumer-loop.js.map +1 -0
  45. package/dist/command-bus/transport/consumer-loop.spec.js +216 -0
  46. package/dist/command-bus/transport/consumer-loop.spec.js.map +1 -0
  47. package/dist/command-bus/transport/index.d.ts +21 -0
  48. package/dist/command-bus/transport/index.js +23 -0
  49. package/dist/command-bus/transport/index.js.map +1 -0
  50. package/dist/command-bus/transport/message-processor.d.ts +70 -0
  51. package/dist/command-bus/transport/message-processor.js +158 -0
  52. package/dist/command-bus/transport/message-processor.js.map +1 -0
  53. package/dist/command-bus/transport/message-processor.spec.js +185 -0
  54. package/dist/command-bus/transport/message-processor.spec.js.map +1 -0
  55. package/dist/command-bus/transport/pending-recovery.d.ts +54 -0
  56. package/dist/command-bus/transport/pending-recovery.js +139 -0
  57. package/dist/command-bus/transport/pending-recovery.js.map +1 -0
  58. package/dist/command-bus/transport/pending-recovery.spec.js +176 -0
  59. package/dist/command-bus/transport/pending-recovery.spec.js.map +1 -0
  60. package/dist/command-bus/transport/redis-codec.d.ts +24 -0
  61. package/dist/command-bus/transport/redis-codec.js +33 -0
  62. package/dist/command-bus/transport/redis-codec.js.map +1 -0
  63. package/dist/command-bus/transport/redis-codec.spec.js +53 -0
  64. package/dist/command-bus/transport/redis-codec.spec.js.map +1 -0
  65. package/dist/command-bus/transport/redis-streams-transport.d.ts +94 -0
  66. package/dist/command-bus/transport/redis-streams-transport.js +143 -0
  67. package/dist/command-bus/transport/redis-streams-transport.js.map +1 -0
  68. package/dist/command-bus/transport/redis-streams-transport.spec.js +420 -0
  69. package/dist/command-bus/transport/redis-streams-transport.spec.js.map +1 -0
  70. package/dist/command-bus/transport/rpc-handler.d.ts +39 -0
  71. package/dist/command-bus/transport/rpc-handler.js +87 -0
  72. package/dist/command-bus/transport/rpc-handler.js.map +1 -0
  73. package/dist/command-bus/transport/rpc-handler.spec.js +157 -0
  74. package/dist/command-bus/transport/rpc-handler.spec.js.map +1 -0
  75. package/dist/command-bus/transport/stream-consumer.d.ts +91 -0
  76. package/dist/command-bus/transport/stream-consumer.js +182 -0
  77. package/dist/command-bus/transport/stream-consumer.js.map +1 -0
  78. package/dist/command-bus/transport/stream-consumer.spec.js +284 -0
  79. package/dist/command-bus/transport/stream-consumer.spec.js.map +1 -0
  80. package/dist/command-bus/transport/stream-producer.d.ts +23 -0
  81. package/dist/command-bus/transport/stream-producer.js +70 -0
  82. package/dist/command-bus/transport/stream-producer.js.map +1 -0
  83. package/dist/command-bus/transport/stream-producer.spec.js +125 -0
  84. package/dist/command-bus/transport/stream-producer.spec.js.map +1 -0
  85. package/dist/command-bus/transport/transport.interface.d.ts +87 -0
  86. package/dist/command-bus/transport/transport.interface.js +3 -0
  87. package/dist/command-bus/transport/transport.interface.js.map +1 -0
  88. package/dist/command-bus/types/index.d.ts +0 -84
  89. package/dist/examples/rpc.demo.js +1 -1
  90. package/dist/examples/rpc.demo.js.map +1 -1
  91. package/dist/index.d.ts +8 -5
  92. package/dist/index.js +6 -4
  93. package/dist/index.js.map +1 -1
  94. package/dist/pp-command-bus-2.0.1.tgz +0 -0
  95. package/dist/shared/redis/connection-pool.d.ts +54 -0
  96. package/dist/shared/redis/connection-pool.js +123 -0
  97. package/dist/shared/redis/connection-pool.js.map +1 -0
  98. package/dist/shared/redis/connection-pool.spec.d.ts +1 -0
  99. package/dist/shared/redis/connection-pool.spec.js +114 -0
  100. package/dist/shared/redis/connection-pool.spec.js.map +1 -0
  101. package/dist/shared/redis/index.d.ts +5 -3
  102. package/dist/shared/redis/index.js +6 -4
  103. package/dist/shared/redis/index.js.map +1 -1
  104. package/dist/shared/redis/rpc-connection-pool.d.ts +61 -0
  105. package/dist/shared/redis/rpc-connection-pool.js +154 -0
  106. package/dist/shared/redis/rpc-connection-pool.js.map +1 -0
  107. package/dist/shared/redis/rpc-connection-pool.spec.d.ts +1 -0
  108. package/dist/shared/redis/rpc-connection-pool.spec.js +173 -0
  109. package/dist/shared/redis/rpc-connection-pool.spec.js.map +1 -0
  110. package/dist/shared/types.d.ts +0 -4
  111. package/dist/shared/utils/error-utils.d.ts +8 -0
  112. package/dist/shared/utils/error-utils.js +14 -0
  113. package/dist/shared/utils/error-utils.js.map +1 -0
  114. package/package.json +12 -12
  115. package/dist/command-bus/config/auto-config-optimizer.d.ts +0 -35
  116. package/dist/command-bus/config/auto-config-optimizer.js +0 -52
  117. package/dist/command-bus/config/auto-config-optimizer.js.map +0 -1
  118. package/dist/command-bus/config/auto-config-optimizer.spec.js +0 -42
  119. package/dist/command-bus/config/auto-config-optimizer.spec.js.map +0 -1
  120. package/dist/command-bus/job/index.d.ts +0 -6
  121. package/dist/command-bus/job/index.js +0 -15
  122. package/dist/command-bus/job/index.js.map +0 -1
  123. package/dist/command-bus/job/job-options-builder.d.ts +0 -21
  124. package/dist/command-bus/job/job-options-builder.js +0 -58
  125. package/dist/command-bus/job/job-options-builder.js.map +0 -1
  126. package/dist/command-bus/job/job-options-builder.spec.js +0 -156
  127. package/dist/command-bus/job/job-options-builder.spec.js.map +0 -1
  128. package/dist/command-bus/job/job-processor.d.ts +0 -39
  129. package/dist/command-bus/job/job-processor.js +0 -203
  130. package/dist/command-bus/job/job-processor.js.map +0 -1
  131. package/dist/command-bus/job/job-processor.spec.js +0 -436
  132. package/dist/command-bus/job/job-processor.spec.js.map +0 -1
  133. package/dist/command-bus/queue/index.d.ts +0 -5
  134. package/dist/command-bus/queue/index.js +0 -13
  135. package/dist/command-bus/queue/index.js.map +0 -1
  136. package/dist/command-bus/queue/queue-manager.d.ts +0 -56
  137. package/dist/command-bus/queue/queue-manager.js +0 -163
  138. package/dist/command-bus/queue/queue-manager.js.map +0 -1
  139. package/dist/command-bus/queue/queue-manager.spec.js +0 -371
  140. package/dist/command-bus/queue/queue-manager.spec.js.map +0 -1
  141. package/dist/command-bus/rpc/index.d.ts +0 -11
  142. package/dist/command-bus/rpc/index.js +0 -19
  143. package/dist/command-bus/rpc/index.js.map +0 -1
  144. package/dist/command-bus/rpc/payload-compression.service.d.ts +0 -50
  145. package/dist/command-bus/rpc/payload-compression.service.js +0 -215
  146. package/dist/command-bus/rpc/payload-compression.service.js.map +0 -1
  147. package/dist/command-bus/rpc/payload-compression.service.spec.js +0 -376
  148. package/dist/command-bus/rpc/payload-compression.service.spec.js.map +0 -1
  149. package/dist/command-bus/rpc/rpc-coordinator.d.ts +0 -96
  150. package/dist/command-bus/rpc/rpc-coordinator.js +0 -500
  151. package/dist/command-bus/rpc/rpc-coordinator.js.map +0 -1
  152. package/dist/command-bus/rpc/rpc-coordinator.spec.js +0 -621
  153. package/dist/command-bus/rpc/rpc-coordinator.spec.js.map +0 -1
  154. package/dist/command-bus/rpc/rpc-job-cancellation.service.d.ts +0 -82
  155. package/dist/command-bus/rpc/rpc-job-cancellation.service.js +0 -180
  156. package/dist/command-bus/rpc/rpc-job-cancellation.service.js.map +0 -1
  157. package/dist/command-bus/rpc/rpc-job-cancellation.service.spec.js +0 -286
  158. package/dist/command-bus/rpc/rpc-job-cancellation.service.spec.js.map +0 -1
  159. package/dist/command-bus/worker/index.d.ts +0 -10
  160. package/dist/command-bus/worker/index.js +0 -19
  161. package/dist/command-bus/worker/index.js.map +0 -1
  162. package/dist/command-bus/worker/worker-benchmark.d.ts +0 -71
  163. package/dist/command-bus/worker/worker-benchmark.js +0 -202
  164. package/dist/command-bus/worker/worker-benchmark.js.map +0 -1
  165. package/dist/command-bus/worker/worker-benchmark.spec.js +0 -310
  166. package/dist/command-bus/worker/worker-benchmark.spec.js.map +0 -1
  167. package/dist/command-bus/worker/worker-metrics-collector.d.ts +0 -98
  168. package/dist/command-bus/worker/worker-metrics-collector.js +0 -242
  169. package/dist/command-bus/worker/worker-metrics-collector.js.map +0 -1
  170. package/dist/command-bus/worker/worker-orchestrator.d.ts +0 -70
  171. package/dist/command-bus/worker/worker-orchestrator.js +0 -339
  172. package/dist/command-bus/worker/worker-orchestrator.js.map +0 -1
  173. package/dist/command-bus/worker/worker-orchestrator.spec.js +0 -712
  174. package/dist/command-bus/worker/worker-orchestrator.spec.js.map +0 -1
  175. package/dist/examples/auto-config.demo.d.ts +0 -9
  176. package/dist/examples/auto-config.demo.js +0 -106
  177. package/dist/examples/auto-config.demo.js.map +0 -1
  178. package/dist/examples/rpc-compression.demo.d.ts +0 -5
  179. package/dist/examples/rpc-compression.demo.js +0 -358
  180. package/dist/examples/rpc-compression.demo.js.map +0 -1
  181. package/dist/examples/rpc-resilience.demo.d.ts +0 -15
  182. package/dist/examples/rpc-resilience.demo.js +0 -233
  183. package/dist/examples/rpc-resilience.demo.js.map +0 -1
  184. package/dist/pp-command-bus-1.5.0.tgz +0 -0
  185. package/dist/shared/config/base-config.d.ts +0 -54
  186. package/dist/shared/config/base-config.js +0 -114
  187. package/dist/shared/config/base-config.js.map +0 -1
  188. package/dist/shared/config/base-config.spec.js +0 -204
  189. package/dist/shared/config/base-config.spec.js.map +0 -1
  190. package/dist/shared/config/index.d.ts +0 -1
  191. package/dist/shared/config/index.js +0 -9
  192. package/dist/shared/config/index.js.map +0 -1
  193. package/dist/shared/redis/redis-connection-factory.d.ts +0 -66
  194. package/dist/shared/redis/redis-connection-factory.js +0 -113
  195. package/dist/shared/redis/redis-connection-factory.js.map +0 -1
  196. /package/dist/command-bus/{config/auto-config-optimizer.spec.d.ts → interceptors/performance-interceptor.spec.d.ts} +0 -0
  197. /package/dist/command-bus/{job/job-options-builder.spec.d.ts → serialization/msgpack-serializer.spec.d.ts} +0 -0
  198. /package/dist/command-bus/{job/job-processor.spec.d.ts → transport/consumer-loop.spec.d.ts} +0 -0
  199. /package/dist/command-bus/{queue/queue-manager.spec.d.ts → transport/message-processor.spec.d.ts} +0 -0
  200. /package/dist/command-bus/{rpc/payload-compression.service.spec.d.ts → transport/pending-recovery.spec.d.ts} +0 -0
  201. /package/dist/command-bus/{rpc/rpc-coordinator.spec.d.ts → transport/redis-codec.spec.d.ts} +0 -0
  202. /package/dist/command-bus/{rpc/rpc-job-cancellation.service.spec.d.ts → transport/redis-streams-transport.spec.d.ts} +0 -0
  203. /package/dist/command-bus/{worker/worker-benchmark.spec.d.ts → transport/rpc-handler.spec.d.ts} +0 -0
  204. /package/dist/command-bus/{worker/worker-orchestrator.spec.d.ts → transport/stream-consumer.spec.d.ts} +0 -0
  205. /package/dist/{shared/config/base-config.spec.d.ts → command-bus/transport/stream-producer.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":";;;;;;;;;;;;;;AAAA,mCAAgC;AAKhC,0FAAgE;AAChE,0EAAiD;AACjD,8CAAoE;AAEpE;;GAEG;AACH,MAAqB,kBAAkB;IA+BrC,YACmB,eAAsB,EACtB,YAA0B,EAC1B,kBAA0B,EAC1B,WAAmB,EACnB,MAAe;QAJf,oBAAe,GAAf,eAAe,CAAO;QACtB,iBAAY,GAAZ,YAAY,CAAc;QAC1B,uBAAkB,GAAlB,kBAAkB,CAAQ;QAC1B,gBAAW,GAAX,WAAW,CAAQ;QACnB,WAAM,GAAN,MAAM,CAAS;QAnClC;;WAEG;QACK,YAAO,GAAkB,EAAE,CAAC;QAEpC;;WAEG;QACK,sBAAiB,GAAkC,EAAE,CAAC;QAE9D;;WAEG;QACK,0BAAqB,GAAkB,EAAE,CAAC;QAElD;;WAEG;QACc,0BAAqB,GAAG,KAAK,CAAC;QAE/C;;WAEG;QACc,gCAA2B,GAAG,GAAG,CAAC;QAEnD;;WAEG;QACc,gCAA2B,GAAG,GAAG,CAAC;IAQhD,CAAC;IAEJ;;;OAGG;IACI,cAAc,CAAC,WAAmB;QACvC,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,sBAAsB,WAAW,eAAe,CAAC,CAAC;QACpE,CAAC;QAED,0CAA0C;QAC1C,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,eAAM,CACpC,IAAI,WAAW,GAAG,EAClB,CAAO,GAAQ,EAAE,EAAE;YACjB,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,uDAAuD;gBACvD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE;oBACjD,WAAW;oBACX,KAAK,EAAE,GAAG,CAAC,EAAE;oBACb,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;gBACH,MAAM,KAAK,CAAC,CAAC,yBAAyB;YACxC,CAAC;QACH,CAAC,CAAA,EACD;YACE,UAAU,EAAE,IAAI,CAAC,eAAe;YAChC,WAAW,EAAE,IAAI,CAAC,kBAAkB;SACrC,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qCAAqC,WAAW,EAAE,EAAE;YAClE,WAAW,EAAE,IAAI,CAAC,kBAAkB;YACpC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,sDAAsD;QACtD,MAAM,SAAS,GAAG,IAAI,0BAAe,CACnC,WAAW,EACX,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,MAAM,CACZ,CAAC;QAEF,SAAS;aACN,GAAG,EAAE;aACL,IAAI,CAAC,CAAC,eAAe,EAAE,EAAE;YACxB,MAAM,kBAAkB,GAAG,eAAe,CAAC,sBAAsB,CAAC;YAElE,gCAAgC;YAChC,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,WAAW,GAAG,kBAAkB,CAAC;gBAE3D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,uCAAuC,EAAE;oBACvD,WAAW;oBACX,cAAc,EAAE,IAAI,CAAC,kBAAkB;oBACvC,cAAc,EAAE,kBAAkB;oBAClC,eAAe;oBACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE;gBACnD,WAAW;gBACX,KAAK;gBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEL,iEAAiE;QACjE,8CAA8C;QAC9C,MAAM,gBAAgB,GAAG,IAAI,kCAAsB,CACjD,WAAW,EACX,IAAI,CAAC,MAAM;QACX,0EAA0E;QAC1E,CAAC,cAAc,EAAE,EAAE;YACjB,IAAI,cAAc,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;gBACxC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,cAAc,CAAC,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;YACvF,CAAC;QACH,CAAC,CACF,CAAC;QACF,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,GAAG,gBAAgB,CAAC;QAEvD,oEAAoE;QACpE,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACK,wBAAwB,CAAC,WAAmB;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAE7D,0CAA0C;QAC1C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;QAEhD,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;;YAC/B,MAAM,OAAO,GAAG,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,CAAC;YAE1B,iEAAiE;YACjE,IAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,EAAE,EAAE,CAAC;gBACZ,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/B,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE;gBAC5C,WAAW;gBACX,SAAS,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI;gBACxB,KAAK,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,EAAE;gBACd,KAAK,EAAE,GAAG,CAAC,OAAO;gBAClB,OAAO,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,YAAY;gBAC1B,WAAW,EAAE,MAAA,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,0CAAE,QAAQ,mCAAI,WAAW;gBAC/C,WAAW,EAAE,CAAC,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,YAAY,mCAAI,CAAC,CAAC,GAAG,CAAC,MAAA,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,0CAAE,QAAQ,mCAAI,WAAW,CAAC;gBAC5E,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YAEH,sCAAsC;YACtC,IAAI,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,EAAE,KAAI,gBAAgB,EAAE,CAAC;gBAChC,gBAAgB,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE;YAC7B,MAAM,OAAO,GAAG,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,CAAC;YAE1B,2DAA2D;YAC3D,IAAI,CAAC;gBACH,IAAI,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,EAAE,KAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBACzC,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;oBAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;oBAE9C,oDAAoD;oBACpD,IAAI,gBAAgB,EAAE,CAAC;wBACrB,gBAAgB,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;oBAC1D,CAAC;oBAED,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC/B,CAAC;qBAAM,IAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,EAAE,EAAE,CAAC;oBACnB,MAAM,CAAC,IAAI,CAAC,oDAAoD,EAAE;wBAChE,WAAW;wBACX,KAAK,EAAE,GAAG,CAAC,EAAE;wBACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBACpC,CAAC,CAAC;oBAEH,uDAAuD;oBACvD,IAAI,gBAAgB,KAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,EAAE,CAAA,EAAE,CAAC;wBAChC,gBAAgB,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE;oBACrD,WAAW;oBACX,KAAK,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,EAAE;oBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE;gBACrC,WAAW;gBACX,SAAS,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI;gBACxB,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,cAAc,EAAE,GAAG,CAAC,WAAW,KAAK,SAAS;gBAC7C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;YAC1B,MAAM,OAAO,GAAG,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,CAAC;YAE1B,qDAAqD;YACrD,IAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,EAAE,EAAE,CAAC;gBACZ,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBAEtC,wCAAwC;gBACxC,IAAI,gBAAgB,EAAE,CAAC;oBACrB,gBAAgB,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE;gBAC7B,WAAW;gBACX,SAAS,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI;gBACxB,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YAC7B,kEAAkE;YAClE,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAE5B,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;gBACtC,WAAW;gBACX,KAAK;gBACL,MAAM,EAAE,2CAA2C;gBACnD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;YACtC,MAAM,OAAO,GAAG,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE;gBACzC,WAAW;gBACX,SAAS,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI;gBACxB,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,QAAQ;gBACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE;gBAC3B,WAAW;gBACX,KAAK,EAAE,IAAA,wBAAgB,EAAC,GAAG,CAAC;gBAC5B,SAAS,EAAE,IAAA,oBAAY,EAAC,GAAG,CAAC;gBAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,SAAS,CAAC,WAAmB;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACU,QAAQ;;YACnB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE5C,qEAAqE;YACrE,4DAA4D;YAC5D,gEAAgE;YAChE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC;YAEzD,kBAAkB;YAClB,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAE3D,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC9B,CAAC;KAAA;IAED;;;;OAIG;IACI,iBAAiB,CACtB,WAAmB,EACnB,SAAkC,EAClC,MAAc;;QAEd,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wDAAwD,EAAE;gBACzE,WAAW;gBACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,mBAAmB;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,MAAA,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,mCAAI,CAAC,CAAC;QAChE,MAAM,mBAAmB,GAAG,GAAG,GAAG,UAAU,CAAC;QAE7C,IAAI,mBAAmB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE;gBACjE,WAAW;gBACX,qBAAqB,EAAE,mBAAmB;gBAC1C,UAAU,EAAE,IAAI,CAAC,qBAAqB;gBACtC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,kBAAkB,GAAG,MAAA,MAAM,CAAC,WAAW,mCAAI,IAAI,CAAC,kBAAkB,CAAC;QACzE,IAAI,cAAsB,CAAC;QAE3B,+BAA+B;QAC/B,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACrF,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACrF,CAAC;QAED,oCAAoC;QACpC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;QAE9D,6DAA6D;QAC7D,IAAI,cAAc,KAAK,kBAAkB,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE;gBAC5D,WAAW;gBACX,kBAAkB;gBAClB,kBAAkB,EAAE,SAAS;gBAC7B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,MAAM,CAAC,WAAW,GAAG,cAAc,CAAC;QACpC,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC;QAE9C,MAAM,aAAa,GAAG,CAAC,CAAC,cAAc,GAAG,kBAAkB,CAAC,GAAG,kBAAkB,CAAC,GAAG,GAAG,CAAC;QAEzF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,+BAA+B,EAAE;YAC/C,WAAW;YACX,cAAc,EAAE,kBAAkB;YAClC,cAAc;YACd,MAAM,EAAE,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;YACrE,SAAS;YACT,MAAM;YACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,cAAc;QACnB,OAAO;YACL,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM;YACpD,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;SACvC,CAAC;IACJ,CAAC;CACF;AAtXD,qCAsXC"}