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
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const msgpack_1 = require("@msgpack/msgpack");
4
+ /**
5
+ * Extension type ID dla Date w MessagePack
6
+ * Pozwala na natywną serializację/deserializację Date bez konieczności
7
+ * rekurencyjnego przechodzenia po drzewie obiektów (eliminuje reconstructDates)
8
+ */
9
+ const DATE_EXTENSION_TYPE = 1;
10
+ /**
11
+ * Tworzy ExtensionCodec z rejestracją Date jako extension type
12
+ * Date jest przechowywane jako int64 timestamp (millisekundy od epoch)
13
+ */
14
+ function createCodec() {
15
+ const codec = new msgpack_1.ExtensionCodec();
16
+ codec.register({
17
+ type: DATE_EXTENSION_TYPE,
18
+ encode: (object) => {
19
+ if (object instanceof Date) {
20
+ const ms = object.getTime();
21
+ const buffer = new ArrayBuffer(8);
22
+ const view = new DataView(buffer);
23
+ view.setFloat64(0, ms);
24
+ return new Uint8Array(buffer);
25
+ }
26
+ return null;
27
+ },
28
+ decode: (data) => {
29
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
30
+ const ms = view.getFloat64(0);
31
+ return new Date(ms);
32
+ },
33
+ });
34
+ return codec;
35
+ }
36
+ /**
37
+ * Serializer oparty na MessagePack z natywną obsługą Date
38
+ *
39
+ * MessagePack jest ~20-30% mniejszy niż JSON i obsługuje dane binarne natywnie.
40
+ * Date extension type eliminuje potrzebę ręcznej rekonstrukcji dat po deserializacji.
41
+ */
42
+ class MsgpackSerializer {
43
+ constructor() {
44
+ this.codec = createCodec();
45
+ }
46
+ /**
47
+ * Serializuje dane do formatu MessagePack
48
+ * @param data - Dane do serializacji (obsługuje Date, Buffer, zagnieżdżone obiekty)
49
+ * @returns Buffer z danymi w formacie MessagePack
50
+ */
51
+ serialize(data) {
52
+ return Buffer.from((0, msgpack_1.encode)(data, { extensionCodec: this.codec }));
53
+ }
54
+ /**
55
+ * Deserializuje dane z formatu MessagePack
56
+ * Date obiekty są automatycznie odtwarzane dzięki extension type
57
+ *
58
+ * @param buffer - Buffer z danymi MessagePack
59
+ * @returns Zdeserializowane dane z prawidłowymi typami (w tym Date)
60
+ * @throws Error gdy buffer jest nieprawidłowy lub pusty
61
+ */
62
+ deserialize(buffer) {
63
+ if (buffer.length === 0) {
64
+ throw new Error('Nie można deserializować pustego bufora');
65
+ }
66
+ return (0, msgpack_1.decode)(buffer, { extensionCodec: this.codec });
67
+ }
68
+ }
69
+ exports.default = MsgpackSerializer;
70
+ //# sourceMappingURL=msgpack-serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"msgpack-serializer.js","sourceRoot":"","sources":["../../../src/command-bus/serialization/msgpack-serializer.ts"],"names":[],"mappings":";;AAAA,8CAAkE;AAGlE;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B;;;GAGG;AACH,SAAS,WAAW;IAClB,MAAM,KAAK,GAAG,IAAI,wBAAc,EAAE,CAAC;IAEnC,KAAK,CAAC,QAAQ,CAAC;QACb,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,CAAC,MAAe,EAAqB,EAAE;YAC7C,IAAI,MAAM,YAAY,IAAI,EAAE,CAAC;gBAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;gBAClC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAClC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvB,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,EAAE,CAAC,IAAgB,EAAQ,EAAE;YACjC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACzE,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC9B,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAqB,iBAAiB;IAGpC;QACE,IAAI,CAAC,KAAK,GAAG,WAAW,EAAE,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACI,SAAS,CAAC,IAAa;QAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,IAAA,gBAAM,EAAC,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IAED;;;;;;;OAOG;IACI,WAAW,CAAI,MAAc;QAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,IAAA,gBAAM,EAAC,MAAM,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,KAAK,EAAE,CAAM,CAAC;IAC7D,CAAC;CACF;AA9BD,oCA8BC"}
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const msgpack_serializer_1 = __importDefault(require("./msgpack-serializer"));
7
+ describe('MsgpackSerializer', () => {
8
+ let serializer;
9
+ beforeEach(() => {
10
+ serializer = new msgpack_serializer_1.default();
11
+ });
12
+ describe('serialize/deserialize — typy prymitywne', () => {
13
+ it('powinien serializować i deserializować string', () => {
14
+ const data = 'Jan Kowalski';
15
+ const buffer = serializer.serialize(data);
16
+ expect(buffer).toBeInstanceOf(Buffer);
17
+ expect(serializer.deserialize(buffer)).toBe(data);
18
+ });
19
+ it('powinien serializować i deserializować liczbę całkowitą', () => {
20
+ const data = 42;
21
+ const buffer = serializer.serialize(data);
22
+ expect(serializer.deserialize(buffer)).toBe(data);
23
+ });
24
+ it('powinien serializować i deserializować liczbę zmiennoprzecinkową', () => {
25
+ const data = 3.14;
26
+ const buffer = serializer.serialize(data);
27
+ expect(serializer.deserialize(buffer)).toBeCloseTo(data);
28
+ });
29
+ it('powinien serializować i deserializować boolean', () => {
30
+ expect(serializer.deserialize(serializer.serialize(true))).toBe(true);
31
+ expect(serializer.deserialize(serializer.serialize(false))).toBe(false);
32
+ });
33
+ it('powinien serializować i deserializować null', () => {
34
+ const buffer = serializer.serialize(null);
35
+ expect(serializer.deserialize(buffer)).toBeNull();
36
+ });
37
+ });
38
+ describe('serialize/deserialize — Date extension', () => {
39
+ it('powinien serializować i deserializować obiekt Date', () => {
40
+ const date = new Date('2025-10-20T10:30:00.000Z');
41
+ const buffer = serializer.serialize(date);
42
+ const result = serializer.deserialize(buffer);
43
+ expect(result).toBeInstanceOf(Date);
44
+ expect(result.getTime()).toBe(date.getTime());
45
+ });
46
+ it('powinien serializować Date wewnątrz obiektu', () => {
47
+ const data = {
48
+ name: 'Jan Kowalski',
49
+ createdAt: new Date('2025-01-15T08:00:00.000Z'),
50
+ updatedAt: new Date('2025-06-20T14:30:00.000Z'),
51
+ };
52
+ const buffer = serializer.serialize(data);
53
+ const result = serializer.deserialize(buffer);
54
+ expect(result.createdAt).toBeInstanceOf(Date);
55
+ expect(result.updatedAt).toBeInstanceOf(Date);
56
+ expect(result.createdAt.getTime()).toBe(data.createdAt.getTime());
57
+ expect(result.updatedAt.getTime()).toBe(data.updatedAt.getTime());
58
+ expect(result.name).toBe('Jan Kowalski');
59
+ });
60
+ it('powinien serializować Date wewnątrz zagnieżdżonego obiektu', () => {
61
+ const data = {
62
+ user: {
63
+ profile: {
64
+ birthDate: new Date('1990-05-15T00:00:00.000Z'),
65
+ },
66
+ },
67
+ };
68
+ const buffer = serializer.serialize(data);
69
+ const result = serializer.deserialize(buffer);
70
+ expect(result.user.profile.birthDate).toBeInstanceOf(Date);
71
+ expect(result.user.profile.birthDate.getTime()).toBe(data.user.profile.birthDate.getTime());
72
+ });
73
+ it('powinien serializować Date wewnątrz tablicy', () => {
74
+ const dates = [
75
+ new Date('2025-01-01T00:00:00.000Z'),
76
+ new Date('2025-06-15T12:00:00.000Z'),
77
+ new Date('2025-12-31T23:59:59.000Z'),
78
+ ];
79
+ const buffer = serializer.serialize(dates);
80
+ const result = serializer.deserialize(buffer);
81
+ expect(result).toHaveLength(3);
82
+ result.forEach((d, i) => {
83
+ expect(d).toBeInstanceOf(Date);
84
+ expect(d.getTime()).toBe(dates[i].getTime());
85
+ });
86
+ });
87
+ it('powinien obsłużyć Date.now() timestamp', () => {
88
+ const now = new Date();
89
+ const buffer = serializer.serialize(now);
90
+ const result = serializer.deserialize(buffer);
91
+ expect(result).toBeInstanceOf(Date);
92
+ expect(result.getTime()).toBe(now.getTime());
93
+ });
94
+ });
95
+ describe('serialize/deserialize — obiekty złożone', () => {
96
+ it('powinien serializować zagnieżdżony obiekt', () => {
97
+ const data = {
98
+ __name: 'CreateUserCommand',
99
+ __id: '550e8400-e29b-41d4-a716-446655440000',
100
+ __time: Date.now(),
101
+ __payload: {
102
+ name: 'Jan Kowalski',
103
+ email: 'jan@kowalski.pl',
104
+ address: {
105
+ street: 'ul. Długa 15',
106
+ city: 'Warszawa',
107
+ postalCode: '00-001',
108
+ },
109
+ },
110
+ };
111
+ const buffer = serializer.serialize(data);
112
+ const result = serializer.deserialize(buffer);
113
+ expect(result).toEqual(data);
114
+ });
115
+ it('powinien serializować tablicę obiektów', () => {
116
+ const data = [
117
+ { id: 1, name: 'Anna Nowak' },
118
+ { id: 2, name: 'Piotr Wiśniewski' },
119
+ ];
120
+ const buffer = serializer.serialize(data);
121
+ const result = serializer.deserialize(buffer);
122
+ expect(result).toEqual(data);
123
+ });
124
+ it('powinien serializować pusty obiekt', () => {
125
+ const data = {};
126
+ const buffer = serializer.serialize(data);
127
+ expect(serializer.deserialize(buffer)).toEqual(data);
128
+ });
129
+ it('powinien serializować pustą tablicę', () => {
130
+ const data = [];
131
+ const buffer = serializer.serialize(data);
132
+ expect(serializer.deserialize(buffer)).toEqual(data);
133
+ });
134
+ });
135
+ describe('serialize/deserialize — Buffer (dane binarne)', () => {
136
+ it('powinien serializować i deserializować Buffer', () => {
137
+ const data = Buffer.from('dane binarne do przesłania', 'utf-8');
138
+ const buffer = serializer.serialize(data);
139
+ const result = serializer.deserialize(buffer);
140
+ // MessagePack deserializuje Buffer jako Uint8Array — porównujemy zawartość
141
+ expect(Buffer.from(result).toString('utf-8')).toBe('dane binarne do przesłania');
142
+ });
143
+ });
144
+ describe('serialize/deserialize — edge cases', () => {
145
+ it('powinien serializować undefined jako null', () => {
146
+ const data = { a: undefined };
147
+ const buffer = serializer.serialize(data);
148
+ const result = serializer.deserialize(buffer);
149
+ // MessagePack zamienia undefined na null
150
+ expect(result.a).toBeNull();
151
+ });
152
+ it('powinien serializować duży payload (>10KB)', () => {
153
+ const largeArray = Array.from({ length: 1000 }, (_, i) => ({
154
+ id: i,
155
+ name: `Użytkownik ${i}`,
156
+ email: `user${i}@example.pl`,
157
+ address: {
158
+ street: `ul. Testowa ${i}`,
159
+ city: 'Warszawa',
160
+ },
161
+ }));
162
+ const buffer = serializer.serialize(largeArray);
163
+ const result = serializer.deserialize(buffer);
164
+ expect(result).toHaveLength(1000);
165
+ expect(result[0].name).toBe('Użytkownik 0');
166
+ expect(result[999].name).toBe('Użytkownik 999');
167
+ });
168
+ it('powinien serializować obiekt z mieszanymi typami', () => {
169
+ const data = {
170
+ string: 'tekst',
171
+ number: 42,
172
+ float: 3.14,
173
+ boolean: true,
174
+ null: null,
175
+ date: new Date('2025-01-01T00:00:00.000Z'),
176
+ array: [1, 'dwa', true],
177
+ nested: { deep: { value: 'głęboko' } },
178
+ };
179
+ const buffer = serializer.serialize(data);
180
+ const result = serializer.deserialize(buffer);
181
+ expect(result.string).toBe('tekst');
182
+ expect(result.number).toBe(42);
183
+ expect(result.float).toBeCloseTo(3.14);
184
+ expect(result.boolean).toBe(true);
185
+ expect(result.null).toBeNull();
186
+ expect(result.date).toBeInstanceOf(Date);
187
+ expect(result.date.getTime()).toBe(data.date.getTime());
188
+ expect(result.array).toEqual([1, 'dwa', true]);
189
+ expect(result.nested.deep.value).toBe('głęboko');
190
+ });
191
+ });
192
+ describe('serialize — rozmiar wyjściowy', () => {
193
+ it('powinien produkować mniejszy output niż JSON.stringify', () => {
194
+ const data = {
195
+ __name: 'TestCommand',
196
+ __id: '550e8400-e29b-41d4-a716-446655440000',
197
+ __time: 1700000000000,
198
+ __payload: {
199
+ users: Array.from({ length: 100 }, (_, i) => ({
200
+ id: i,
201
+ name: `Użytkownik ${i}`,
202
+ active: true,
203
+ })),
204
+ },
205
+ };
206
+ const msgpackSize = serializer.serialize(data).byteLength;
207
+ const jsonSize = Buffer.from(JSON.stringify(data)).byteLength;
208
+ // MessagePack powinien być mniejszy niż JSON
209
+ expect(msgpackSize).toBeLessThan(jsonSize);
210
+ });
211
+ });
212
+ describe('deserialize — odporność na błędy', () => {
213
+ it('powinien rzucić błąd przy nieprawidłowym buforze', () => {
214
+ const invalidBuffer = Buffer.from([0xff, 0xfe, 0xfd, 0xfc]);
215
+ expect(() => serializer.deserialize(invalidBuffer)).toThrow();
216
+ });
217
+ it('powinien rzucić błąd przy pustym buforze', () => {
218
+ const emptyBuffer = Buffer.alloc(0);
219
+ expect(() => serializer.deserialize(emptyBuffer)).toThrow();
220
+ });
221
+ });
222
+ });
223
+ //# sourceMappingURL=msgpack-serializer.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"msgpack-serializer.spec.js","sourceRoot":"","sources":["../../../src/command-bus/serialization/msgpack-serializer.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Interfejs serializera dla CommandBus
3
+ * Odpowiada za konwersję danych do/z formatu binarnego (Buffer)
4
+ *
5
+ * Implementacje powinny obsługiwać natywne typy JS (Date, Buffer, nested objects)
6
+ * bez konieczności dodatkowej rekonstrukcji typów po deserializacji
7
+ */
8
+ export interface ISerializer {
9
+ /**
10
+ * Serializuje dane do formatu binarnego
11
+ * @param data - Dane do serializacji
12
+ * @returns Buffer z serializowanymi danymi
13
+ */
14
+ serialize(data: unknown): Buffer;
15
+ /**
16
+ * Deserializuje dane z formatu binarnego
17
+ * @param buffer - Buffer z serializowanymi danymi
18
+ * @returns Zdeserializowane dane
19
+ */
20
+ deserialize<T>(buffer: Buffer): T;
21
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=serializer.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializer.interface.js","sourceRoot":"","sources":["../../../src/command-bus/serialization/serializer.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,45 @@
1
+ import type { Redis } from 'ioredis';
2
+ import type { ILogger } from '../../shared/types';
3
+ /**
4
+ * Callback wywoływany dla każdej wiadomości odczytanej ze strumienia
5
+ */
6
+ export type MessageCallback = (messageId: string, fields: string[]) => Promise<void>;
7
+ /**
8
+ * Konfiguracja ConsumerLoop
9
+ */
10
+ export interface ConsumerLoopOptions {
11
+ consumerId: string;
12
+ batchSize: number;
13
+ concurrency: number;
14
+ logger: ILogger;
15
+ }
16
+ /**
17
+ * Consumer loop — czyta wiadomości z Redis Streams i przekazuje do callbacka
18
+ *
19
+ * Odpowiedzialności:
20
+ * - while(running) loop z XREADGROUP BLOCK
21
+ * - Concurrency limiter (Promise.race + active Set)
22
+ * - Exponential backoff z jitter przy błędach
23
+ * - Czekanie na aktywne zadania przy shutdown
24
+ *
25
+ * NIE odpowiada za przetwarzanie wiadomości — to odpowiedzialność koordynatora/procesora
26
+ */
27
+ export declare class ConsumerLoop {
28
+ private readonly consumerId;
29
+ private readonly batchSize;
30
+ private readonly concurrency;
31
+ private readonly logger;
32
+ /** Flaga zatrzymania consumer loop */
33
+ running: boolean;
34
+ constructor(options: ConsumerLoopOptions);
35
+ /**
36
+ * Uruchamia consumer loop — czyta wiadomości z strumienia i przetwarza
37
+ * Concurrency limiter: przetwarza N wiadomości równolegle, czyta gdy wolne sloty
38
+ *
39
+ * @param conn - Dedykowane połączenie Redis (XREADGROUP BLOCK blokuje socket)
40
+ * @param streamName - Nazwa strumienia Redis
41
+ * @param groupName - Nazwa grupy konsumentów
42
+ * @param onMessage - Callback wywoływany dla każdej wiadomości
43
+ */
44
+ run(conn: Redis, streamName: string, groupName: string, onMessage: MessageCallback): Promise<void>;
45
+ }
@@ -0,0 +1,90 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ConsumerLoop = void 0;
13
+ const error_utils_1 = require("../../shared/utils/error-utils");
14
+ /**
15
+ * Consumer loop — czyta wiadomości z Redis Streams i przekazuje do callbacka
16
+ *
17
+ * Odpowiedzialności:
18
+ * - while(running) loop z XREADGROUP BLOCK
19
+ * - Concurrency limiter (Promise.race + active Set)
20
+ * - Exponential backoff z jitter przy błędach
21
+ * - Czekanie na aktywne zadania przy shutdown
22
+ *
23
+ * NIE odpowiada za przetwarzanie wiadomości — to odpowiedzialność koordynatora/procesora
24
+ */
25
+ class ConsumerLoop {
26
+ constructor(options) {
27
+ /** Flaga zatrzymania consumer loop */
28
+ this.running = true;
29
+ this.consumerId = options.consumerId;
30
+ this.batchSize = options.batchSize;
31
+ this.concurrency = options.concurrency;
32
+ this.logger = options.logger;
33
+ }
34
+ /**
35
+ * Uruchamia consumer loop — czyta wiadomości z strumienia i przetwarza
36
+ * Concurrency limiter: przetwarza N wiadomości równolegle, czyta gdy wolne sloty
37
+ *
38
+ * @param conn - Dedykowane połączenie Redis (XREADGROUP BLOCK blokuje socket)
39
+ * @param streamName - Nazwa strumienia Redis
40
+ * @param groupName - Nazwa grupy konsumentów
41
+ * @param onMessage - Callback wywoływany dla każdej wiadomości
42
+ */
43
+ run(conn, streamName, groupName, onMessage) {
44
+ return __awaiter(this, void 0, void 0, function* () {
45
+ const active = new Set();
46
+ let consecutiveErrors = 0;
47
+ while (this.running) {
48
+ try {
49
+ while (active.size >= this.concurrency && this.running) {
50
+ yield Promise.race(active);
51
+ }
52
+ if (!this.running)
53
+ break;
54
+ const availableSlots = this.concurrency - active.size;
55
+ const count = Math.min(this.batchSize, availableSlots);
56
+ const result = yield conn.xreadgroup('GROUP', groupName, this.consumerId, 'COUNT', count, 'BLOCK', 5000, 'STREAMS', streamName, '>');
57
+ consecutiveErrors = 0;
58
+ if (!result)
59
+ continue;
60
+ const messages = result;
61
+ for (const [, streamMessages] of messages) {
62
+ for (const [messageId, fields] of streamMessages) {
63
+ const processing = onMessage(messageId, fields);
64
+ active.add(processing);
65
+ void processing.finally(() => active.delete(processing));
66
+ }
67
+ }
68
+ }
69
+ catch (error) {
70
+ if (!this.running)
71
+ break;
72
+ consecutiveErrors++;
73
+ this.logger.error('Błąd w consumer loop', {
74
+ streamName,
75
+ error: (0, error_utils_1.getErrorMessage)(error),
76
+ consecutiveErrors,
77
+ timestamp: new Date().toISOString(),
78
+ });
79
+ const backoff = Math.min(1000 * Math.pow(2, consecutiveErrors - 1), 30000) + Math.random() * 1000;
80
+ yield new Promise((r) => setTimeout(r, backoff));
81
+ }
82
+ }
83
+ if (active.size > 0) {
84
+ yield Promise.allSettled(active);
85
+ }
86
+ });
87
+ }
88
+ }
89
+ exports.ConsumerLoop = ConsumerLoop;
90
+ //# sourceMappingURL=consumer-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumer-loop.js","sourceRoot":"","sources":["../../../src/command-bus/transport/consumer-loop.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,gEAAiE;AAiBjE;;;;;;;;;;GAUG;AACH,MAAa,YAAY;IASvB,YAAY,OAA4B;QAHxC,sCAAsC;QACtC,YAAO,GAAG,IAAI,CAAC;QAGb,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED;;;;;;;;OAQG;IACG,GAAG,CACP,IAAW,EACX,UAAkB,EAClB,SAAiB,EACjB,SAA0B;;YAE1B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;YACxC,IAAI,iBAAiB,GAAG,CAAC,CAAC;YAE1B,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;gBACpB,IAAI,CAAC;oBACH,OAAO,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;wBACvD,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC7B,CAAC;oBAED,IAAI,CAAC,IAAI,CAAC,OAAO;wBAAE,MAAM;oBAEzB,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;oBACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;oBAEvD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAClC,OAAO,EACP,SAAS,EACT,IAAI,CAAC,UAAU,EACf,OAAO,EACP,KAAK,EACL,OAAO,EACP,IAAI,EACJ,SAAS,EACT,UAAU,EACV,GAAG,CACJ,CAAC;oBAEF,iBAAiB,GAAG,CAAC,CAAC;oBAEtB,IAAI,CAAC,MAAM;wBAAE,SAAS;oBAEtB,MAAM,QAAQ,GAAG,MAAoD,CAAC;oBACtE,KAAK,MAAM,CAAC,EAAE,cAAc,CAAC,IAAI,QAAQ,EAAE,CAAC;wBAC1C,KAAK,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;4BACjD,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;4BAChD,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;4BACvB,KAAK,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;wBAC3D,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,IAAI,CAAC,OAAO;wBAAE,MAAM;oBACzB,iBAAiB,EAAE,CAAC;oBACpB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;wBACxC,UAAU;wBACV,KAAK,EAAE,IAAA,6BAAe,EAAC,KAAK,CAAC;wBAC7B,iBAAiB;wBACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBACpC,CAAC,CAAC;oBACH,MAAM,OAAO,GACX,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;oBACpF,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;KAAA;CACF;AAzFD,oCAyFC"}