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
@@ -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,97 @@
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;
26
73
  /**
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
74
+ * Czas po którym stalled wiadomość jest przejmowana (ms)
75
+ * @default 30000
30
76
  */
31
- autoOptimize: boolean;
77
+ claimTimeout: number;
32
78
  /**
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)
79
+ * Maksymalna liczba wiadomości przechowywanych w strumieniu (XTRIM ~)
80
+ * @default 10000
36
81
  */
37
- compressionThreshold: number;
82
+ maxRetained: number;
38
83
  constructor(params?: Partial<CommandBusConfig>);
39
84
  /**
40
- * Waliduje konfigurację specyficzną dla CommandBus
85
+ * Zwraca opcje połączenia Redis na podstawie URL
86
+ * Zawiera retryStrategy z konfiguracją reconnect
87
+ */
88
+ getRedisOptions(): RedisOptions;
89
+ /**
90
+ * Waliduje całą konfigurację
91
+ */
92
+ private validate;
93
+ /**
94
+ * Parsuje string na liczbę z wartością domyślną
41
95
  */
42
- private validateCommandBusConfig;
96
+ private static parseIntWithDefault;
43
97
  }
@@ -1,81 +1,122 @@
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;
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.validate();
40
+ }
41
+ /**
42
+ * Zwraca opcje połączenia Redis na podstawie URL
43
+ * Zawiera retryStrategy z konfiguracją reconnect
44
+ */
45
+ getRedisOptions() {
46
+ try {
47
+ const url = new URL(this.redisUrl);
48
+ const retryDelay = this.redisRetryDelay;
49
+ const maxRetries = this.redisMaxRetries;
50
+ const options = {
51
+ host: url.hostname,
52
+ port: parseInt(url.port, 10) || 6379,
53
+ retryStrategy: (times) => {
54
+ if (maxRetries > 0 && times > maxRetries) {
55
+ return null;
56
+ }
57
+ return retryDelay;
58
+ },
59
+ };
60
+ if (url.username) {
61
+ options.username = url.username;
62
+ }
63
+ if (url.password) {
64
+ options.password = url.password;
65
+ }
66
+ if (url.pathname && url.pathname.length > 1) {
67
+ const db = parseInt(url.pathname.substring(1), 10);
68
+ if (!isNaN(db)) {
69
+ options.db = db;
34
70
  }
35
- });
71
+ }
72
+ return options;
36
73
  }
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;
74
+ catch (_a) {
75
+ throw new Error('Invalid Redis URL');
49
76
  }
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
77
  }
60
78
  /**
61
- * Waliduje konfigurację specyficzną dla CommandBus
79
+ * Waliduje całą konfigurację
62
80
  */
63
- validateCommandBusConfig() {
81
+ validate() {
82
+ // Redis URL
83
+ try {
84
+ new URL(this.redisUrl);
85
+ }
86
+ catch (_a) {
87
+ throw new Error('Invalid Redis URL');
88
+ }
89
+ // CommandBus
64
90
  if (this.concurrency < 1) {
65
91
  throw new Error('concurrency must be at least 1');
66
92
  }
67
93
  if (this.maxAttempts < 1) {
68
94
  throw new Error('maxAttempts must be at least 1');
69
95
  }
70
- if (this.backoffDelay < 100) {
71
- throw new Error('backoffDelay must be at least 100ms');
96
+ if (this.poolSize < 1) {
97
+ throw new Error('poolSize must be at least 1');
72
98
  }
73
- if (this.queueMode !== 'fifo' && this.queueMode !== 'lifo') {
74
- throw new Error("queueMode must be either 'fifo' or 'lifo'");
99
+ if (this.maxConcurrentRpc < 1) {
100
+ throw new Error('maxConcurrentRpc must be at least 1');
75
101
  }
76
- if (this.compressionThreshold < 0) {
77
- throw new Error('compressionThreshold must be >= 0');
102
+ if (this.batchSize < 1) {
103
+ throw new Error('batchSize must be at least 1');
78
104
  }
105
+ if (this.claimTimeout < 1000) {
106
+ throw new Error('claimTimeout must be at least 1000ms');
107
+ }
108
+ if (this.maxRetained < 100) {
109
+ throw new Error('maxRetained must be at least 100');
110
+ }
111
+ }
112
+ /**
113
+ * Parsuje string na liczbę z wartością domyślną
114
+ */
115
+ static parseIntWithDefault(value, defaultValue) {
116
+ if (!value)
117
+ return defaultValue;
118
+ const parsed = parseInt(value, 10);
119
+ return isNaN(parsed) ? defaultValue : parsed;
79
120
  }
80
121
  }
81
122
  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":"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"}