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
@@ -2,6 +2,9 @@
2
2
  * Bazowa klasa dla komend z generycznym payloadem
3
3
  * Komendy są przetwarzane przez dokładnie jeden handler (1:1)
4
4
  *
5
+ * Obiekty Date są natywnie obsługiwane przez MsgpackSerializer
6
+ * (extension type) — nie ma potrzeby ręcznej rekonstrukcji po deserializacji.
7
+ *
5
8
  * @template T - Typ danych biznesowych komendy (payload)
6
9
  *
7
10
  * @example
@@ -35,8 +38,4 @@ export default abstract class Command<T = unknown> {
35
38
  */
36
39
  readonly __payload: T;
37
40
  constructor(payload: T);
38
- /**
39
- * Przywraca obiekty Date z serializowanych danych
40
- */
41
- static reconstructDates(obj: unknown): unknown;
42
41
  }
@@ -5,6 +5,9 @@ const crypto_1 = require("crypto");
5
5
  * Bazowa klasa dla komend z generycznym payloadem
6
6
  * Komendy są przetwarzane przez dokładnie jeden handler (1:1)
7
7
  *
8
+ * Obiekty Date są natywnie obsługiwane przez MsgpackSerializer
9
+ * (extension type) — nie ma potrzeby ręcznej rekonstrukcji po deserializacji.
10
+ *
8
11
  * @template T - Typ danych biznesowych komendy (payload)
9
12
  *
10
13
  * @example
@@ -29,38 +32,6 @@ class Command {
29
32
  this.__id = (0, crypto_1.randomUUID)();
30
33
  this.__payload = payload;
31
34
  }
32
- /**
33
- * Przywraca obiekty Date z serializowanych danych
34
- */
35
- static reconstructDates(obj) {
36
- if (obj === null || obj === undefined) {
37
- return obj;
38
- }
39
- if (typeof obj === 'string') {
40
- // Sprawdź czy string to data ISO
41
- const isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?$/;
42
- if (isoDateRegex.test(obj)) {
43
- const date = new Date(obj);
44
- if (!isNaN(date.getTime())) {
45
- return date;
46
- }
47
- }
48
- return obj;
49
- }
50
- if (Array.isArray(obj)) {
51
- return obj.map((item) => Command.reconstructDates(item));
52
- }
53
- if (typeof obj === 'object') {
54
- const result = {};
55
- for (const key in obj) {
56
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
57
- result[key] = Command.reconstructDates(obj[key]);
58
- }
59
- }
60
- return result;
61
- }
62
- return obj;
63
- }
64
35
  }
65
36
  exports.default = Command;
66
37
  //# sourceMappingURL=command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/command-bus/command.ts"],"names":[],"mappings":";;AAAA,mCAAoC;AAEpC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAA8B,OAAO;IAsBnC,YAAmB,OAAU;QAX7B;;WAEG;QACa,WAAM,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;QAS1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAA,mBAAU,GAAE,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,gBAAgB,CAAC,GAAY;QACzC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC;QACb,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,iCAAiC;YACjC,MAAM,YAAY,GAAG,mDAAmD,CAAC;YACzE,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;oBAC3B,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,MAAM,GAA4B,EAAE,CAAC;YAC3C,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;gBACtB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;oBACnD,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAE,GAA+B,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChF,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAhED,0BAgEC"}
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/command-bus/command.ts"],"names":[],"mappings":";;AAAA,mCAAoC;AAEpC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAA8B,OAAO;IAsBnC,YAAmB,OAAU;QAX7B;;WAEG;QACa,WAAM,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;QAS1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAA,mBAAU,GAAE,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;IAC3B,CAAC;CACF;AA3BD,0BA2BC"}
@@ -1,43 +1,102 @@
1
- import BaseConfig from '../../shared/config/base-config';
1
+ import type { RedisOptions } from 'ioredis';
2
+ import type { ILogger } from '../../shared/types';
3
+ import type { LogLevelType } from '../../shared/logging/log-level';
2
4
  /**
3
- * Konfiguracja dla CommandBus (BullMQ)
5
+ * Konfiguracja dla CommandBus (Redis Streams + DragonflyDB)
6
+ *
7
+ * Standalone klasa — łączy konfigurację Redis, loggera i parametrów CommandBus.
8
+ * Type-safe przypisanie parametrów bez Object.keys() mutation.
4
9
  */
5
- export default class CommandBusConfig extends BaseConfig {
10
+ export default class CommandBusConfig {
6
11
  /**
7
- * Liczba równoległych workerów do przetwarzania komend
12
+ * URL połączenia do DragonflyDB/Redis
13
+ */
14
+ redisUrl: string;
15
+ /**
16
+ * Poziom logowania (debug, log, warn, error)
17
+ * Domyślnie 'log' - loguje log, warn, error (bez debug)
18
+ */
19
+ logLevel: LogLevelType;
20
+ /**
21
+ * Logger do użycia (domyślnie wbudowany Logger z console)
22
+ */
23
+ logger: ILogger;
24
+ /**
25
+ * Opóźnienie między próbami reconnect do Redis w milisekundach
26
+ * Domyślnie 5000ms (5 sekund)
27
+ */
28
+ redisRetryDelay: number;
29
+ /**
30
+ * Maksymalna liczba prób reconnect do Redis
31
+ * 0 = nieskończoność (domyślnie)
32
+ */
33
+ redisMaxRetries: number;
34
+ /**
35
+ * Maksymalna liczba wiadomości przetwarzanych równolegle per konsument
36
+ *
37
+ * Domyślnie 60 × availableParallelism() — adekwatne dla typowych I/O-bound handlerów
38
+ * (baza, API, Redis), gdzie handler czeka na I/O a nie zużywa CPU.
39
+ * Dla CPU-bound handlerów ustaw na availableParallelism() (liczba rdzeni).
40
+ *
41
+ * @default 60 * availableParallelism()
8
42
  */
9
43
  concurrency: number;
10
44
  /**
11
- * Maksymalna liczba prób przetworzenia zadania (domyślnie 1)
45
+ * Maksymalna liczba prób przetworzenia wiadomości
46
+ * @default 3
12
47
  */
13
48
  maxAttempts: number;
14
49
  /**
15
- * Opóźnienie między próbami (ms)
50
+ * Ścieżka do katalogu logów komend (puste = wyłączone)
16
51
  */
17
- backoffDelay: number;
52
+ commandLog: string;
18
53
  /**
19
- * Tryb przetwarzania zadań w kolejce (FIFO - First In First Out, LIFO - Last In First Out)
54
+ * Rozmiar puli połączeń Redis (round-robin, non-blocking ops)
55
+ * @default 2 * availableParallelism()
20
56
  */
21
- queueMode: 'fifo' | 'lifo';
57
+ poolSize: number;
22
58
  /**
23
- * Ścieżka do katalogu logów komend
59
+ * Maksymalna liczba równoległych wywołań RPC (bounded BRPOP connections)
60
+ * @default 50
24
61
  */
25
- commandLog: string;
62
+ maxConcurrentRpc: number;
63
+ /**
64
+ * Liczba wiadomości pobieranych w jednym XREADGROUP
65
+ *
66
+ * Większy batch = mniej roundtripów do Redis, wyższy throughput.
67
+ * Przy concurrency=960 i batchSize=10 potrzeba 96 roundtripów żeby zapełnić sloty.
68
+ * Przy batchSize=100 potrzeba tylko 10 roundtripów — 10× mniej overhead sieciowego.
69
+ *
70
+ * @default 100
71
+ */
72
+ batchSize: number;
73
+ /**
74
+ * Czas po którym stalled wiadomość jest przejmowana (ms)
75
+ * @default 30000
76
+ */
77
+ claimTimeout: number;
26
78
  /**
27
- * Włącz auto-optymalizację concurrency na podstawie zasobów systemowych (CPU, RAM)
28
- * Używa heurystyki zakładającej I/O-heavy workload (Redis/BullMQ)
29
- * @default true
79
+ * Maksymalna liczba wiadomości przechowywanych w strumieniu (XTRIM ~)
80
+ * @default 10000
30
81
  */
31
- autoOptimize: boolean;
82
+ maxRetained: number;
32
83
  /**
33
- * Próg kompresji gzip dla payloadów RPC w bajtach
34
- * Payloady większe niż threshold będą automatycznie kompresowane
35
- * @default 1024 (1KB)
84
+ * Próg wolnego handlera (ms) - handlary przekraczające ten czas są logowane jako wolne
85
+ * @default 1000
36
86
  */
37
- compressionThreshold: number;
87
+ slowHandlerThreshold: number;
38
88
  constructor(params?: Partial<CommandBusConfig>);
39
89
  /**
40
- * Waliduje konfigurację specyficzną dla CommandBus
90
+ * Zwraca opcje połączenia Redis na podstawie URL
91
+ * Zawiera retryStrategy z konfiguracją reconnect
92
+ */
93
+ getRedisOptions(): RedisOptions;
94
+ /**
95
+ * Waliduje całą konfigurację
96
+ */
97
+ private validate;
98
+ /**
99
+ * Parsuje string na liczbę z wartością domyślną
41
100
  */
42
- private validateCommandBusConfig;
101
+ private static parseIntWithDefault;
43
102
  }
@@ -1,81 +1,127 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const base_config_1 = __importDefault(require("../../shared/config/base-config"));
7
- const auto_config_optimizer_1 = __importDefault(require("./auto-config-optimizer"));
3
+ const os_1 = require("os");
4
+ const logger_1 = require("../../shared/logging/logger");
8
5
  /**
9
- * Konfiguracja dla CommandBus (BullMQ)
6
+ * Konfiguracja dla CommandBus (Redis Streams + DragonflyDB)
7
+ *
8
+ * Standalone klasa — łączy konfigurację Redis, loggera i parametrów CommandBus.
9
+ * Type-safe przypisanie parametrów bez Object.keys() mutation.
10
10
  */
11
- class CommandBusConfig extends base_config_1.default {
11
+ class CommandBusConfig {
12
12
  constructor(params) {
13
- var _a, _b, _c, _d, _e, _f, _g;
14
- super(params);
15
- // Wczytaj konfigurację auto-optymalizacji (domyślnie true, wyłączenie tylko gdy 'false')
16
- this.autoOptimize = process.env.COMMAND_BUS_AUTO_OPTIMIZE !== 'false';
17
- // Wykryj czy concurrency zostało podane jawnie przez zmienne środowiskowe
18
- const manualConcurrencyFromEnv = !!((_a = process.env.COMMAND_BUS_CONCURRENCY) !== null && _a !== void 0 ? _a : process.env.EVENT_BUS_CONCURRENCY);
19
- // Wczytaj konfigurację z nowym prefiksem COMMAND_BUS_ z fallbackiem do starych nazw
20
- this.concurrency = this.parseIntWithDefault((_b = process.env.COMMAND_BUS_CONCURRENCY) !== null && _b !== void 0 ? _b : process.env.EVENT_BUS_CONCURRENCY, 1);
21
- this.maxAttempts = this.parseIntWithDefault((_c = process.env.COMMAND_BUS_MAX_ATTEMPTS) !== null && _c !== void 0 ? _c : process.env.EVENT_BUS_MAX_ATTEMPTS, 1);
22
- this.backoffDelay = this.parseIntWithDefault((_d = process.env.COMMAND_BUS_BACKOFF_DELAY) !== null && _d !== void 0 ? _d : process.env.EVENT_BUS_BACKOFF_DELAY, 2000);
23
- const queueModeValue = (_e = process.env.COMMAND_BUS_QUEUE_MODE) !== null && _e !== void 0 ? _e : process.env.EVENT_BUS_QUEUE_MODE;
24
- this.queueMode = queueModeValue === 'lifo' ? 'lifo' : 'fifo';
25
- this.commandLog = (_g = (_f = process.env.COMMAND_BUS_LOG) !== null && _f !== void 0 ? _f : process.env.EVENT_BUS_LOG) !== null && _g !== void 0 ? _g : '';
26
- this.compressionThreshold = this.parseIntWithDefault(process.env.COMMAND_BUS_COMPRESSION_THRESHOLD, 1024);
27
- // Wykryj czy concurrency zostało podane jawnie przez params
28
- const manualConcurrencyFromParams = (params === null || params === void 0 ? void 0 : params.concurrency) !== undefined;
29
- // Nadpisz wartościami z parametrów konstruktora
30
- if (params) {
31
- Object.keys(params).forEach((key) => {
32
- if (key !== 'redisUrl' && key !== 'logger') {
33
- this[key] = params[key];
13
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
14
+ // Redis
15
+ this.redisUrl = (_b = (_a = params === null || params === void 0 ? void 0 : params.redisUrl) !== null && _a !== void 0 ? _a : process.env.REDIS_URL) !== null && _b !== void 0 ? _b : 'redis://localhost:6379';
16
+ this.redisRetryDelay =
17
+ (_c = params === null || params === void 0 ? void 0 : params.redisRetryDelay) !== null && _c !== void 0 ? _c : CommandBusConfig.parseIntWithDefault(process.env.REDIS_RETRY_DELAY, 5000);
18
+ this.redisMaxRetries =
19
+ (_d = params === null || params === void 0 ? void 0 : params.redisMaxRetries) !== null && _d !== void 0 ? _d : CommandBusConfig.parseIntWithDefault(process.env.REDIS_MAX_RETRIES, 0);
20
+ // Logger
21
+ this.logLevel = (_f = (_e = params === null || params === void 0 ? void 0 : params.logLevel) !== null && _e !== void 0 ? _e : process.env.LOG_LEVEL) !== null && _f !== void 0 ? _f : 'log';
22
+ this.logger = (_g = params === null || params === void 0 ? void 0 : params.logger) !== null && _g !== void 0 ? _g : new logger_1.Logger(console, this.logLevel);
23
+ // CommandBus params nadpisują env, env nadpisuje defaults
24
+ this.concurrency =
25
+ (_h = params === null || params === void 0 ? void 0 : params.concurrency) !== null && _h !== void 0 ? _h : CommandBusConfig.parseIntWithDefault(process.env.COMMAND_BUS_CONCURRENCY, 60 * (0, os_1.availableParallelism)());
26
+ this.maxAttempts =
27
+ (_j = params === null || params === void 0 ? void 0 : params.maxAttempts) !== null && _j !== void 0 ? _j : CommandBusConfig.parseIntWithDefault(process.env.COMMAND_BUS_MAX_ATTEMPTS, 3);
28
+ this.commandLog = (_l = (_k = params === null || params === void 0 ? void 0 : params.commandLog) !== null && _k !== void 0 ? _k : process.env.COMMAND_BUS_LOG) !== null && _l !== void 0 ? _l : '';
29
+ this.poolSize =
30
+ (_m = params === null || params === void 0 ? void 0 : params.poolSize) !== null && _m !== void 0 ? _m : CommandBusConfig.parseIntWithDefault(process.env.COMMAND_BUS_POOL_SIZE, 2 * (0, os_1.availableParallelism)());
31
+ this.maxConcurrentRpc =
32
+ (_o = params === null || params === void 0 ? void 0 : params.maxConcurrentRpc) !== null && _o !== void 0 ? _o : CommandBusConfig.parseIntWithDefault(process.env.COMMAND_BUS_MAX_CONCURRENT_RPC, 50);
33
+ this.batchSize =
34
+ (_p = params === null || params === void 0 ? void 0 : params.batchSize) !== null && _p !== void 0 ? _p : CommandBusConfig.parseIntWithDefault(process.env.COMMAND_BUS_BATCH_SIZE, 100);
35
+ this.claimTimeout =
36
+ (_q = params === null || params === void 0 ? void 0 : params.claimTimeout) !== null && _q !== void 0 ? _q : CommandBusConfig.parseIntWithDefault(process.env.COMMAND_BUS_CLAIM_TIMEOUT, 30000);
37
+ this.maxRetained =
38
+ (_r = params === null || params === void 0 ? void 0 : params.maxRetained) !== null && _r !== void 0 ? _r : CommandBusConfig.parseIntWithDefault(process.env.COMMAND_BUS_MAX_RETAINED, 10000);
39
+ this.slowHandlerThreshold =
40
+ (_s = params === null || params === void 0 ? void 0 : params.slowHandlerThreshold) !== null && _s !== void 0 ? _s : CommandBusConfig.parseIntWithDefault(process.env.COMMAND_BUS_SLOW_HANDLER_THRESHOLD, 1000);
41
+ this.validate();
42
+ }
43
+ /**
44
+ * Zwraca opcje połączenia Redis na podstawie URL
45
+ * Zawiera retryStrategy z konfiguracją reconnect
46
+ */
47
+ getRedisOptions() {
48
+ try {
49
+ const url = new URL(this.redisUrl);
50
+ const retryDelay = this.redisRetryDelay;
51
+ const maxRetries = this.redisMaxRetries;
52
+ const options = {
53
+ host: url.hostname,
54
+ port: parseInt(url.port, 10) || 6379,
55
+ retryStrategy: (times) => {
56
+ if (maxRetries > 0 && times > maxRetries) {
57
+ return null;
58
+ }
59
+ return retryDelay;
60
+ },
61
+ };
62
+ if (url.username) {
63
+ options.username = url.username;
64
+ }
65
+ if (url.password) {
66
+ options.password = url.password;
67
+ }
68
+ if (url.pathname && url.pathname.length > 1) {
69
+ const db = parseInt(url.pathname.substring(1), 10);
70
+ if (!isNaN(db)) {
71
+ options.db = db;
34
72
  }
35
- });
73
+ }
74
+ return options;
36
75
  }
37
- // Auto-optymalizacja concurrency tylko gdy nie zostało podane ręcznie
38
- const manualConcurrency = manualConcurrencyFromEnv || manualConcurrencyFromParams;
39
- if (this.autoOptimize && !manualConcurrency) {
40
- const optimizedConcurrency = auto_config_optimizer_1.default.calculateOptimalConcurrency();
41
- const systemInfo = auto_config_optimizer_1.default.getSystemInfo();
42
- this.logger.log('Auto-optymalizacja concurrency', {
43
- oldConcurrency: this.concurrency,
44
- newConcurrency: optimizedConcurrency,
45
- systemInfo,
46
- timestamp: new Date().toISOString(),
47
- });
48
- this.concurrency = optimizedConcurrency;
76
+ catch (_a) {
77
+ throw new Error('Invalid Redis URL');
49
78
  }
50
- else if (manualConcurrency) {
51
- this.logger.log('Użyto ręcznie ustawionego concurrency', {
52
- concurrency: this.concurrency,
53
- source: manualConcurrencyFromParams ? 'params' : 'env',
54
- timestamp: new Date().toISOString(),
55
- });
56
- }
57
- // Dodatkowa walidacja specyficzna dla CommandBus
58
- this.validateCommandBusConfig();
59
79
  }
60
80
  /**
61
- * Waliduje konfigurację specyficzną dla CommandBus
81
+ * Waliduje całą konfigurację
62
82
  */
63
- validateCommandBusConfig() {
83
+ validate() {
84
+ // Redis URL
85
+ try {
86
+ new URL(this.redisUrl);
87
+ }
88
+ catch (_a) {
89
+ throw new Error('Invalid Redis URL');
90
+ }
91
+ // CommandBus
64
92
  if (this.concurrency < 1) {
65
93
  throw new Error('concurrency must be at least 1');
66
94
  }
67
95
  if (this.maxAttempts < 1) {
68
96
  throw new Error('maxAttempts must be at least 1');
69
97
  }
70
- if (this.backoffDelay < 100) {
71
- throw new Error('backoffDelay must be at least 100ms');
98
+ if (this.poolSize < 1) {
99
+ throw new Error('poolSize must be at least 1');
72
100
  }
73
- if (this.queueMode !== 'fifo' && this.queueMode !== 'lifo') {
74
- throw new Error("queueMode must be either 'fifo' or 'lifo'");
101
+ if (this.maxConcurrentRpc < 1) {
102
+ throw new Error('maxConcurrentRpc must be at least 1');
75
103
  }
76
- if (this.compressionThreshold < 0) {
77
- throw new Error('compressionThreshold must be >= 0');
104
+ if (this.batchSize < 1) {
105
+ throw new Error('batchSize must be at least 1');
78
106
  }
107
+ if (this.claimTimeout < 1000) {
108
+ throw new Error('claimTimeout must be at least 1000ms');
109
+ }
110
+ if (this.maxRetained < 100) {
111
+ throw new Error('maxRetained must be at least 100');
112
+ }
113
+ if (this.slowHandlerThreshold < 100) {
114
+ throw new Error('slowHandlerThreshold must be at least 100ms');
115
+ }
116
+ }
117
+ /**
118
+ * Parsuje string na liczbę z wartością domyślną
119
+ */
120
+ static parseIntWithDefault(value, defaultValue) {
121
+ if (!value)
122
+ return defaultValue;
123
+ const parsed = parseInt(value, 10);
124
+ return isNaN(parsed) ? defaultValue : parsed;
79
125
  }
80
126
  }
81
127
  exports.default = CommandBusConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"command-bus-config.js","sourceRoot":"","sources":["../../../src/command-bus/config/command-bus-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command-bus-config.js","sourceRoot":"","sources":["../../../src/command-bus/config/command-bus-config.ts"],"names":[],"mappings":";;AAAA,2BAA0C;AAI1C,wDAAqD;AAErD;;;;;GAKG;AACH,MAAqB,gBAAgB;IA4FnC,YAAmB,MAAkC;;QACnD,QAAQ;QACR,IAAI,CAAC,QAAQ,GAAG,MAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,mCAAI,OAAO,CAAC,GAAG,CAAC,SAAS,mCAAI,wBAAwB,CAAC;QACtF,IAAI,CAAC,eAAe;YAClB,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,eAAe,mCACvB,gBAAgB,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC5E,IAAI,CAAC,eAAe;YAClB,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,eAAe,mCACvB,gBAAgB,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;QAEzE,SAAS;QACT,IAAI,CAAC,QAAQ,GAAG,MAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,mCAAK,OAAO,CAAC,GAAG,CAAC,SAA0B,mCAAI,KAAK,CAAC;QACrF,IAAI,CAAC,MAAM,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,mCAAI,IAAI,eAAM,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEnE,4DAA4D;QAC5D,IAAI,CAAC,WAAW;YACd,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,mCACnB,gBAAgB,CAAC,mBAAmB,CAClC,OAAO,CAAC,GAAG,CAAC,uBAAuB,EACnC,EAAE,GAAG,IAAA,yBAAoB,GAAE,CAC5B,CAAC;QACJ,IAAI,CAAC,WAAW;YACd,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,mCACnB,gBAAgB,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC,UAAU,GAAG,MAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,mCAAI,OAAO,CAAC,GAAG,CAAC,eAAe,mCAAI,EAAE,CAAC;QAC1E,IAAI,CAAC,QAAQ;YACX,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,mCAChB,gBAAgB,CAAC,mBAAmB,CAClC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EACjC,CAAC,GAAG,IAAA,yBAAoB,GAAE,CAC3B,CAAC;QACJ,IAAI,CAAC,gBAAgB;YACnB,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,mCACxB,gBAAgB,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;QACvF,IAAI,CAAC,SAAS;YACZ,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,SAAS,mCACjB,gBAAgB,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;QAChF,IAAI,CAAC,YAAY;YACf,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,YAAY,mCACpB,gBAAgB,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QACrF,IAAI,CAAC,WAAW;YACd,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,mCACnB,gBAAgB,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QACpF,IAAI,CAAC,oBAAoB;YACvB,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,oBAAoB,mCAC5B,gBAAgB,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,IAAI,CAAC,CAAC;QAE7F,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED;;;OAGG;IACI,eAAe;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEnC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC;YACxC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC;YAExC,MAAM,OAAO,GAAiB;gBAC5B,IAAI,EAAE,GAAG,CAAC,QAAQ;gBAClB,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI;gBACpC,aAAa,EAAE,CAAC,KAAa,EAAiB,EAAE;oBAC9C,IAAI,UAAU,GAAG,CAAC,IAAI,KAAK,GAAG,UAAU,EAAE,CAAC;wBACzC,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,OAAO,UAAU,CAAC;gBACpB,CAAC;aACF,CAAC;YAEF,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACjB,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;YAClC,CAAC;YAED,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACjB,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;YAClC,CAAC;YAED,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;oBACf,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,WAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,QAAQ;QACd,YAAY;QACZ,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QAAC,WAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,aAAa;QACb,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,IAAI,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,GAAG,GAAG,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,IAAI,CAAC,oBAAoB,GAAG,GAAG,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,mBAAmB,CAAC,KAAyB,EAAE,YAAoB;QAChF,IAAI,CAAC,KAAK;YAAE,OAAO,YAAY,CAAC;QAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/C,CAAC;CACF;AA9OD,mCA8OC"}