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.
- package/README.md +400 -1219
- package/dist/command-bus/command-bus.spec.js +138 -359
- package/dist/command-bus/command-bus.spec.js.map +1 -1
- package/dist/command-bus/command.d.ts +3 -4
- package/dist/command-bus/command.js +3 -32
- package/dist/command-bus/command.js.map +1 -1
- package/dist/command-bus/config/command-bus-config.d.ts +75 -21
- package/dist/command-bus/config/command-bus-config.js +99 -58
- package/dist/command-bus/config/command-bus-config.js.map +1 -1
- package/dist/command-bus/config/command-bus-config.spec.js +174 -100
- package/dist/command-bus/config/command-bus-config.spec.js.map +1 -1
- package/dist/command-bus/index.d.ts +39 -52
- package/dist/command-bus/index.js +133 -126
- package/dist/command-bus/index.js.map +1 -1
- package/dist/command-bus/logging/command-logger.d.ts +2 -0
- package/dist/command-bus/logging/command-logger.js +7 -0
- package/dist/command-bus/logging/command-logger.js.map +1 -1
- package/dist/command-bus/logging/command-logger.spec.js +36 -0
- package/dist/command-bus/logging/command-logger.spec.js.map +1 -1
- package/dist/command-bus/serialization/index.d.ts +6 -0
- package/dist/command-bus/serialization/index.js +9 -0
- package/dist/command-bus/serialization/index.js.map +1 -0
- package/dist/command-bus/serialization/msgpack-serializer.d.ts +26 -0
- package/dist/command-bus/serialization/msgpack-serializer.js +70 -0
- package/dist/command-bus/serialization/msgpack-serializer.js.map +1 -0
- package/dist/command-bus/serialization/msgpack-serializer.spec.js +223 -0
- package/dist/command-bus/serialization/msgpack-serializer.spec.js.map +1 -0
- package/dist/command-bus/serialization/serializer.interface.d.ts +21 -0
- package/dist/command-bus/serialization/serializer.interface.js +3 -0
- package/dist/command-bus/serialization/serializer.interface.js.map +1 -0
- package/dist/command-bus/transport/consumer-loop.d.ts +45 -0
- package/dist/command-bus/transport/consumer-loop.js +90 -0
- package/dist/command-bus/transport/consumer-loop.js.map +1 -0
- package/dist/command-bus/transport/consumer-loop.spec.js +216 -0
- package/dist/command-bus/transport/consumer-loop.spec.js.map +1 -0
- package/dist/command-bus/transport/index.d.ts +21 -0
- package/dist/command-bus/transport/index.js +23 -0
- package/dist/command-bus/transport/index.js.map +1 -0
- package/dist/command-bus/transport/message-processor.d.ts +59 -0
- package/dist/command-bus/transport/message-processor.js +111 -0
- package/dist/command-bus/transport/message-processor.js.map +1 -0
- package/dist/command-bus/transport/message-processor.spec.js +185 -0
- package/dist/command-bus/transport/message-processor.spec.js.map +1 -0
- package/dist/command-bus/transport/pending-recovery.d.ts +54 -0
- package/dist/command-bus/transport/pending-recovery.js +139 -0
- package/dist/command-bus/transport/pending-recovery.js.map +1 -0
- package/dist/command-bus/transport/pending-recovery.spec.js +176 -0
- package/dist/command-bus/transport/pending-recovery.spec.js.map +1 -0
- package/dist/command-bus/transport/redis-codec.d.ts +24 -0
- package/dist/command-bus/transport/redis-codec.js +33 -0
- package/dist/command-bus/transport/redis-codec.js.map +1 -0
- package/dist/command-bus/transport/redis-codec.spec.js +53 -0
- package/dist/command-bus/transport/redis-codec.spec.js.map +1 -0
- package/dist/command-bus/transport/redis-streams-transport.d.ts +91 -0
- package/dist/command-bus/transport/redis-streams-transport.js +134 -0
- package/dist/command-bus/transport/redis-streams-transport.js.map +1 -0
- package/dist/command-bus/transport/redis-streams-transport.spec.js +420 -0
- package/dist/command-bus/transport/redis-streams-transport.spec.js.map +1 -0
- package/dist/command-bus/transport/rpc-handler.d.ts +39 -0
- package/dist/command-bus/transport/rpc-handler.js +87 -0
- package/dist/command-bus/transport/rpc-handler.js.map +1 -0
- package/dist/command-bus/transport/rpc-handler.spec.js +157 -0
- package/dist/command-bus/transport/rpc-handler.spec.js.map +1 -0
- package/dist/command-bus/transport/stream-consumer.d.ts +89 -0
- package/dist/command-bus/transport/stream-consumer.js +181 -0
- package/dist/command-bus/transport/stream-consumer.js.map +1 -0
- package/dist/command-bus/transport/stream-consumer.spec.js +284 -0
- package/dist/command-bus/transport/stream-consumer.spec.js.map +1 -0
- package/dist/command-bus/transport/stream-producer.d.ts +23 -0
- package/dist/command-bus/transport/stream-producer.js +70 -0
- package/dist/command-bus/transport/stream-producer.js.map +1 -0
- package/dist/command-bus/transport/stream-producer.spec.js +125 -0
- package/dist/command-bus/transport/stream-producer.spec.js.map +1 -0
- package/dist/command-bus/transport/transport.interface.d.ts +87 -0
- package/dist/command-bus/transport/transport.interface.js +3 -0
- package/dist/command-bus/transport/transport.interface.js.map +1 -0
- package/dist/command-bus/types/index.d.ts +0 -84
- package/dist/examples/rpc.demo.js +1 -1
- package/dist/examples/rpc.demo.js.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/pp-command-bus-2.0.0.tgz +0 -0
- package/dist/shared/redis/connection-pool.d.ts +54 -0
- package/dist/shared/redis/connection-pool.js +117 -0
- package/dist/shared/redis/connection-pool.js.map +1 -0
- package/dist/shared/redis/connection-pool.spec.js +114 -0
- package/dist/shared/redis/connection-pool.spec.js.map +1 -0
- package/dist/shared/redis/index.d.ts +5 -3
- package/dist/shared/redis/index.js +6 -4
- package/dist/shared/redis/index.js.map +1 -1
- package/dist/shared/redis/rpc-connection-pool.d.ts +61 -0
- package/dist/shared/redis/rpc-connection-pool.js +154 -0
- package/dist/shared/redis/rpc-connection-pool.js.map +1 -0
- package/dist/shared/redis/rpc-connection-pool.spec.d.ts +1 -0
- package/dist/shared/redis/rpc-connection-pool.spec.js +173 -0
- package/dist/shared/redis/rpc-connection-pool.spec.js.map +1 -0
- package/dist/shared/types.d.ts +0 -4
- package/dist/shared/utils/error-utils.d.ts +8 -0
- package/dist/shared/utils/error-utils.js +14 -0
- package/dist/shared/utils/error-utils.js.map +1 -0
- package/package.json +12 -12
- package/dist/command-bus/config/auto-config-optimizer.d.ts +0 -35
- package/dist/command-bus/config/auto-config-optimizer.js +0 -52
- package/dist/command-bus/config/auto-config-optimizer.js.map +0 -1
- package/dist/command-bus/config/auto-config-optimizer.spec.js +0 -42
- package/dist/command-bus/config/auto-config-optimizer.spec.js.map +0 -1
- package/dist/command-bus/job/index.d.ts +0 -6
- package/dist/command-bus/job/index.js +0 -15
- package/dist/command-bus/job/index.js.map +0 -1
- package/dist/command-bus/job/job-options-builder.d.ts +0 -21
- package/dist/command-bus/job/job-options-builder.js +0 -58
- package/dist/command-bus/job/job-options-builder.js.map +0 -1
- package/dist/command-bus/job/job-options-builder.spec.js +0 -156
- package/dist/command-bus/job/job-options-builder.spec.js.map +0 -1
- package/dist/command-bus/job/job-processor.d.ts +0 -39
- package/dist/command-bus/job/job-processor.js +0 -203
- package/dist/command-bus/job/job-processor.js.map +0 -1
- package/dist/command-bus/job/job-processor.spec.js +0 -436
- package/dist/command-bus/job/job-processor.spec.js.map +0 -1
- package/dist/command-bus/queue/index.d.ts +0 -5
- package/dist/command-bus/queue/index.js +0 -13
- package/dist/command-bus/queue/index.js.map +0 -1
- package/dist/command-bus/queue/queue-manager.d.ts +0 -56
- package/dist/command-bus/queue/queue-manager.js +0 -163
- package/dist/command-bus/queue/queue-manager.js.map +0 -1
- package/dist/command-bus/queue/queue-manager.spec.js +0 -371
- package/dist/command-bus/queue/queue-manager.spec.js.map +0 -1
- package/dist/command-bus/rpc/index.d.ts +0 -11
- package/dist/command-bus/rpc/index.js +0 -19
- package/dist/command-bus/rpc/index.js.map +0 -1
- package/dist/command-bus/rpc/payload-compression.service.d.ts +0 -50
- package/dist/command-bus/rpc/payload-compression.service.js +0 -215
- package/dist/command-bus/rpc/payload-compression.service.js.map +0 -1
- package/dist/command-bus/rpc/payload-compression.service.spec.js +0 -376
- package/dist/command-bus/rpc/payload-compression.service.spec.js.map +0 -1
- package/dist/command-bus/rpc/rpc-coordinator.d.ts +0 -96
- package/dist/command-bus/rpc/rpc-coordinator.js +0 -500
- package/dist/command-bus/rpc/rpc-coordinator.js.map +0 -1
- package/dist/command-bus/rpc/rpc-coordinator.spec.js +0 -621
- package/dist/command-bus/rpc/rpc-coordinator.spec.js.map +0 -1
- package/dist/command-bus/rpc/rpc-job-cancellation.service.d.ts +0 -82
- package/dist/command-bus/rpc/rpc-job-cancellation.service.js +0 -180
- package/dist/command-bus/rpc/rpc-job-cancellation.service.js.map +0 -1
- package/dist/command-bus/rpc/rpc-job-cancellation.service.spec.js +0 -286
- package/dist/command-bus/rpc/rpc-job-cancellation.service.spec.js.map +0 -1
- package/dist/command-bus/worker/index.d.ts +0 -10
- package/dist/command-bus/worker/index.js +0 -19
- package/dist/command-bus/worker/index.js.map +0 -1
- package/dist/command-bus/worker/worker-benchmark.d.ts +0 -71
- package/dist/command-bus/worker/worker-benchmark.js +0 -202
- package/dist/command-bus/worker/worker-benchmark.js.map +0 -1
- package/dist/command-bus/worker/worker-benchmark.spec.js +0 -310
- package/dist/command-bus/worker/worker-benchmark.spec.js.map +0 -1
- package/dist/command-bus/worker/worker-metrics-collector.d.ts +0 -98
- package/dist/command-bus/worker/worker-metrics-collector.js +0 -242
- package/dist/command-bus/worker/worker-metrics-collector.js.map +0 -1
- package/dist/command-bus/worker/worker-orchestrator.d.ts +0 -70
- package/dist/command-bus/worker/worker-orchestrator.js +0 -339
- package/dist/command-bus/worker/worker-orchestrator.js.map +0 -1
- package/dist/command-bus/worker/worker-orchestrator.spec.js +0 -712
- package/dist/command-bus/worker/worker-orchestrator.spec.js.map +0 -1
- package/dist/examples/auto-config.demo.d.ts +0 -9
- package/dist/examples/auto-config.demo.js +0 -106
- package/dist/examples/auto-config.demo.js.map +0 -1
- package/dist/examples/rpc-compression.demo.d.ts +0 -5
- package/dist/examples/rpc-compression.demo.js +0 -358
- package/dist/examples/rpc-compression.demo.js.map +0 -1
- package/dist/examples/rpc-resilience.demo.d.ts +0 -15
- package/dist/examples/rpc-resilience.demo.js +0 -233
- package/dist/examples/rpc-resilience.demo.js.map +0 -1
- package/dist/pp-command-bus-1.5.0.tgz +0 -0
- package/dist/shared/config/base-config.d.ts +0 -54
- package/dist/shared/config/base-config.js +0 -114
- package/dist/shared/config/base-config.js.map +0 -1
- package/dist/shared/config/base-config.spec.js +0 -204
- package/dist/shared/config/base-config.spec.js.map +0 -1
- package/dist/shared/config/index.d.ts +0 -1
- package/dist/shared/config/index.js +0 -9
- package/dist/shared/config/index.js.map +0 -1
- package/dist/shared/redis/redis-connection-factory.d.ts +0 -66
- package/dist/shared/redis/redis-connection-factory.js +0 -113
- package/dist/shared/redis/redis-connection-factory.js.map +0 -1
- /package/dist/command-bus/{config/auto-config-optimizer.spec.d.ts → serialization/msgpack-serializer.spec.d.ts} +0 -0
- /package/dist/command-bus/{job/job-options-builder.spec.d.ts → transport/consumer-loop.spec.d.ts} +0 -0
- /package/dist/command-bus/{job/job-processor.spec.d.ts → transport/message-processor.spec.d.ts} +0 -0
- /package/dist/command-bus/{queue/queue-manager.spec.d.ts → transport/pending-recovery.spec.d.ts} +0 -0
- /package/dist/command-bus/{rpc/payload-compression.service.spec.d.ts → transport/redis-codec.spec.d.ts} +0 -0
- /package/dist/command-bus/{rpc/rpc-coordinator.spec.d.ts → transport/redis-streams-transport.spec.d.ts} +0 -0
- /package/dist/command-bus/{rpc/rpc-job-cancellation.service.spec.d.ts → transport/rpc-handler.spec.d.ts} +0 -0
- /package/dist/command-bus/{worker/worker-benchmark.spec.d.ts → transport/stream-consumer.spec.d.ts} +0 -0
- /package/dist/command-bus/{worker/worker-orchestrator.spec.d.ts → transport/stream-producer.spec.d.ts} +0 -0
- /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 @@
|
|
|
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":"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"}
|