pp-command-bus 1.5.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +80 -21
- package/dist/command-bus/config/command-bus-config.js +104 -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 +41 -50
- package/dist/command-bus/index.js +143 -127
- package/dist/command-bus/index.js.map +1 -1
- package/dist/command-bus/interceptors/index.d.ts +5 -0
- package/dist/command-bus/interceptors/index.js +22 -0
- package/dist/command-bus/interceptors/index.js.map +1 -0
- package/dist/command-bus/interceptors/interceptor.interface.d.ts +35 -0
- package/dist/command-bus/interceptors/interceptor.interface.js +3 -0
- package/dist/command-bus/interceptors/interceptor.interface.js.map +1 -0
- package/dist/command-bus/interceptors/performance-interceptor.d.ts +24 -0
- package/dist/command-bus/interceptors/performance-interceptor.js +86 -0
- package/dist/command-bus/interceptors/performance-interceptor.js.map +1 -0
- package/dist/command-bus/interceptors/performance-interceptor.spec.js +124 -0
- package/dist/command-bus/interceptors/performance-interceptor.spec.js.map +1 -0
- 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 +70 -0
- package/dist/command-bus/transport/message-processor.js +158 -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 +94 -0
- package/dist/command-bus/transport/redis-streams-transport.js +143 -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 +91 -0
- package/dist/command-bus/transport/stream-consumer.js +182 -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.1.tgz +0 -0
- package/dist/shared/redis/connection-pool.d.ts +54 -0
- package/dist/shared/redis/connection-pool.js +123 -0
- package/dist/shared/redis/connection-pool.js.map +1 -0
- package/dist/shared/redis/connection-pool.spec.d.ts +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 → interceptors/performance-interceptor.spec.d.ts} +0 -0
- /package/dist/command-bus/{job/job-options-builder.spec.d.ts → serialization/msgpack-serializer.spec.d.ts} +0 -0
- /package/dist/command-bus/{job/job-processor.spec.d.ts → transport/consumer-loop.spec.d.ts} +0 -0
- /package/dist/command-bus/{queue/queue-manager.spec.d.ts → transport/message-processor.spec.d.ts} +0 -0
- /package/dist/command-bus/{rpc/payload-compression.service.spec.d.ts → transport/pending-recovery.spec.d.ts} +0 -0
- /package/dist/command-bus/{rpc/rpc-coordinator.spec.d.ts → transport/redis-codec.spec.d.ts} +0 -0
- /package/dist/command-bus/{rpc/rpc-job-cancellation.service.spec.d.ts → transport/redis-streams-transport.spec.d.ts} +0 -0
- /package/dist/command-bus/{worker/worker-benchmark.spec.d.ts → transport/rpc-handler.spec.d.ts} +0 -0
- /package/dist/command-bus/{worker/worker-orchestrator.spec.d.ts → transport/stream-consumer.spec.d.ts} +0 -0
- /package/dist/{shared/config/base-config.spec.d.ts → command-bus/transport/stream-producer.spec.d.ts} +0 -0
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
* Bazowa klasa dla komend z generycznym payloadem
|
|
3
3
|
* Komendy są przetwarzane przez dokładnie jeden handler (1:1)
|
|
4
4
|
*
|
|
5
|
+
* Obiekty Date są natywnie obsługiwane przez MsgpackSerializer
|
|
6
|
+
* (extension type) — nie ma potrzeby ręcznej rekonstrukcji po deserializacji.
|
|
7
|
+
*
|
|
5
8
|
* @template T - Typ danych biznesowych komendy (payload)
|
|
6
9
|
*
|
|
7
10
|
* @example
|
|
@@ -35,8 +38,4 @@ export default abstract class Command<T = unknown> {
|
|
|
35
38
|
*/
|
|
36
39
|
readonly __payload: T;
|
|
37
40
|
constructor(payload: T);
|
|
38
|
-
/**
|
|
39
|
-
* Przywraca obiekty Date z serializowanych danych
|
|
40
|
-
*/
|
|
41
|
-
static reconstructDates(obj: unknown): unknown;
|
|
42
41
|
}
|
|
@@ -5,6 +5,9 @@ const crypto_1 = require("crypto");
|
|
|
5
5
|
* Bazowa klasa dla komend z generycznym payloadem
|
|
6
6
|
* Komendy są przetwarzane przez dokładnie jeden handler (1:1)
|
|
7
7
|
*
|
|
8
|
+
* Obiekty Date są natywnie obsługiwane przez MsgpackSerializer
|
|
9
|
+
* (extension type) — nie ma potrzeby ręcznej rekonstrukcji po deserializacji.
|
|
10
|
+
*
|
|
8
11
|
* @template T - Typ danych biznesowych komendy (payload)
|
|
9
12
|
*
|
|
10
13
|
* @example
|
|
@@ -29,38 +32,6 @@ class Command {
|
|
|
29
32
|
this.__id = (0, crypto_1.randomUUID)();
|
|
30
33
|
this.__payload = payload;
|
|
31
34
|
}
|
|
32
|
-
/**
|
|
33
|
-
* Przywraca obiekty Date z serializowanych danych
|
|
34
|
-
*/
|
|
35
|
-
static reconstructDates(obj) {
|
|
36
|
-
if (obj === null || obj === undefined) {
|
|
37
|
-
return obj;
|
|
38
|
-
}
|
|
39
|
-
if (typeof obj === 'string') {
|
|
40
|
-
// Sprawdź czy string to data ISO
|
|
41
|
-
const isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?$/;
|
|
42
|
-
if (isoDateRegex.test(obj)) {
|
|
43
|
-
const date = new Date(obj);
|
|
44
|
-
if (!isNaN(date.getTime())) {
|
|
45
|
-
return date;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return obj;
|
|
49
|
-
}
|
|
50
|
-
if (Array.isArray(obj)) {
|
|
51
|
-
return obj.map((item) => Command.reconstructDates(item));
|
|
52
|
-
}
|
|
53
|
-
if (typeof obj === 'object') {
|
|
54
|
-
const result = {};
|
|
55
|
-
for (const key in obj) {
|
|
56
|
-
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
57
|
-
result[key] = Command.reconstructDates(obj[key]);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return result;
|
|
61
|
-
}
|
|
62
|
-
return obj;
|
|
63
|
-
}
|
|
64
35
|
}
|
|
65
36
|
exports.default = Command;
|
|
66
37
|
//# sourceMappingURL=command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/command-bus/command.ts"],"names":[],"mappings":";;AAAA,mCAAoC;AAEpC
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/command-bus/command.ts"],"names":[],"mappings":";;AAAA,mCAAoC;AAEpC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAA8B,OAAO;IAsBnC,YAAmB,OAAU;QAX7B;;WAEG;QACa,WAAM,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;QAS1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAA,mBAAU,GAAE,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;IAC3B,CAAC;CACF;AA3BD,0BA2BC"}
|
|
@@ -1,43 +1,102 @@
|
|
|
1
|
-
import
|
|
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 (
|
|
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
|
|
10
|
+
export default class CommandBusConfig {
|
|
6
11
|
/**
|
|
7
|
-
*
|
|
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
|
|
45
|
+
* Maksymalna liczba prób przetworzenia wiadomości
|
|
46
|
+
* @default 3
|
|
12
47
|
*/
|
|
13
48
|
maxAttempts: number;
|
|
14
49
|
/**
|
|
15
|
-
*
|
|
50
|
+
* Ścieżka do katalogu logów komend (puste = wyłączone)
|
|
16
51
|
*/
|
|
17
|
-
|
|
52
|
+
commandLog: string;
|
|
18
53
|
/**
|
|
19
|
-
*
|
|
54
|
+
* Rozmiar puli połączeń Redis (round-robin, non-blocking ops)
|
|
55
|
+
* @default 2 * availableParallelism()
|
|
20
56
|
*/
|
|
21
|
-
|
|
57
|
+
poolSize: number;
|
|
22
58
|
/**
|
|
23
|
-
*
|
|
59
|
+
* Maksymalna liczba równoległych wywołań RPC (bounded BRPOP connections)
|
|
60
|
+
* @default 50
|
|
24
61
|
*/
|
|
25
|
-
|
|
62
|
+
maxConcurrentRpc: number;
|
|
63
|
+
/**
|
|
64
|
+
* Liczba wiadomości pobieranych w jednym XREADGROUP
|
|
65
|
+
*
|
|
66
|
+
* Większy batch = mniej roundtripów do Redis, wyższy throughput.
|
|
67
|
+
* Przy concurrency=960 i batchSize=10 potrzeba 96 roundtripów żeby zapełnić sloty.
|
|
68
|
+
* Przy batchSize=100 potrzeba tylko 10 roundtripów — 10× mniej overhead sieciowego.
|
|
69
|
+
*
|
|
70
|
+
* @default 100
|
|
71
|
+
*/
|
|
72
|
+
batchSize: number;
|
|
73
|
+
/**
|
|
74
|
+
* Czas po którym stalled wiadomość jest przejmowana (ms)
|
|
75
|
+
* @default 30000
|
|
76
|
+
*/
|
|
77
|
+
claimTimeout: number;
|
|
26
78
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* @default true
|
|
79
|
+
* Maksymalna liczba wiadomości przechowywanych w strumieniu (XTRIM ~)
|
|
80
|
+
* @default 10000
|
|
30
81
|
*/
|
|
31
|
-
|
|
82
|
+
maxRetained: number;
|
|
32
83
|
/**
|
|
33
|
-
* Próg
|
|
34
|
-
*
|
|
35
|
-
* @default 1024 (1KB)
|
|
84
|
+
* Próg wolnego handlera (ms) - handlary przekraczające ten czas są logowane jako wolne
|
|
85
|
+
* @default 1000
|
|
36
86
|
*/
|
|
37
|
-
|
|
87
|
+
slowHandlerThreshold: number;
|
|
38
88
|
constructor(params?: Partial<CommandBusConfig>);
|
|
39
89
|
/**
|
|
40
|
-
*
|
|
90
|
+
* Zwraca opcje połączenia Redis na podstawie URL
|
|
91
|
+
* Zawiera retryStrategy z konfiguracją reconnect
|
|
92
|
+
*/
|
|
93
|
+
getRedisOptions(): RedisOptions;
|
|
94
|
+
/**
|
|
95
|
+
* Waliduje całą konfigurację
|
|
96
|
+
*/
|
|
97
|
+
private validate;
|
|
98
|
+
/**
|
|
99
|
+
* Parsuje string na liczbę z wartością domyślną
|
|
41
100
|
*/
|
|
42
|
-
private
|
|
101
|
+
private static parseIntWithDefault;
|
|
43
102
|
}
|
|
@@ -1,81 +1,127 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const
|
|
7
|
-
const
|
|
3
|
+
const os_1 = require("os");
|
|
4
|
+
const logger_1 = require("../../shared/logging/logger");
|
|
8
5
|
/**
|
|
9
|
-
* Konfiguracja dla CommandBus (
|
|
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
|
|
11
|
+
class CommandBusConfig {
|
|
12
12
|
constructor(params) {
|
|
13
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
this.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
this.
|
|
22
|
-
this.
|
|
23
|
-
|
|
24
|
-
this.
|
|
25
|
-
|
|
26
|
-
this.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
13
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
|
|
14
|
+
// Redis
|
|
15
|
+
this.redisUrl = (_b = (_a = params === null || params === void 0 ? void 0 : params.redisUrl) !== null && _a !== void 0 ? _a : process.env.REDIS_URL) !== null && _b !== void 0 ? _b : 'redis://localhost:6379';
|
|
16
|
+
this.redisRetryDelay =
|
|
17
|
+
(_c = params === null || params === void 0 ? void 0 : params.redisRetryDelay) !== null && _c !== void 0 ? _c : CommandBusConfig.parseIntWithDefault(process.env.REDIS_RETRY_DELAY, 5000);
|
|
18
|
+
this.redisMaxRetries =
|
|
19
|
+
(_d = params === null || params === void 0 ? void 0 : params.redisMaxRetries) !== null && _d !== void 0 ? _d : CommandBusConfig.parseIntWithDefault(process.env.REDIS_MAX_RETRIES, 0);
|
|
20
|
+
// Logger
|
|
21
|
+
this.logLevel = (_f = (_e = params === null || params === void 0 ? void 0 : params.logLevel) !== null && _e !== void 0 ? _e : process.env.LOG_LEVEL) !== null && _f !== void 0 ? _f : 'log';
|
|
22
|
+
this.logger = (_g = params === null || params === void 0 ? void 0 : params.logger) !== null && _g !== void 0 ? _g : new logger_1.Logger(console, this.logLevel);
|
|
23
|
+
// CommandBus — params nadpisują env, env nadpisuje defaults
|
|
24
|
+
this.concurrency =
|
|
25
|
+
(_h = params === null || params === void 0 ? void 0 : params.concurrency) !== null && _h !== void 0 ? _h : CommandBusConfig.parseIntWithDefault(process.env.COMMAND_BUS_CONCURRENCY, 60 * (0, os_1.availableParallelism)());
|
|
26
|
+
this.maxAttempts =
|
|
27
|
+
(_j = params === null || params === void 0 ? void 0 : params.maxAttempts) !== null && _j !== void 0 ? _j : CommandBusConfig.parseIntWithDefault(process.env.COMMAND_BUS_MAX_ATTEMPTS, 3);
|
|
28
|
+
this.commandLog = (_l = (_k = params === null || params === void 0 ? void 0 : params.commandLog) !== null && _k !== void 0 ? _k : process.env.COMMAND_BUS_LOG) !== null && _l !== void 0 ? _l : '';
|
|
29
|
+
this.poolSize =
|
|
30
|
+
(_m = params === null || params === void 0 ? void 0 : params.poolSize) !== null && _m !== void 0 ? _m : CommandBusConfig.parseIntWithDefault(process.env.COMMAND_BUS_POOL_SIZE, 2 * (0, os_1.availableParallelism)());
|
|
31
|
+
this.maxConcurrentRpc =
|
|
32
|
+
(_o = params === null || params === void 0 ? void 0 : params.maxConcurrentRpc) !== null && _o !== void 0 ? _o : CommandBusConfig.parseIntWithDefault(process.env.COMMAND_BUS_MAX_CONCURRENT_RPC, 50);
|
|
33
|
+
this.batchSize =
|
|
34
|
+
(_p = params === null || params === void 0 ? void 0 : params.batchSize) !== null && _p !== void 0 ? _p : CommandBusConfig.parseIntWithDefault(process.env.COMMAND_BUS_BATCH_SIZE, 100);
|
|
35
|
+
this.claimTimeout =
|
|
36
|
+
(_q = params === null || params === void 0 ? void 0 : params.claimTimeout) !== null && _q !== void 0 ? _q : CommandBusConfig.parseIntWithDefault(process.env.COMMAND_BUS_CLAIM_TIMEOUT, 30000);
|
|
37
|
+
this.maxRetained =
|
|
38
|
+
(_r = params === null || params === void 0 ? void 0 : params.maxRetained) !== null && _r !== void 0 ? _r : CommandBusConfig.parseIntWithDefault(process.env.COMMAND_BUS_MAX_RETAINED, 10000);
|
|
39
|
+
this.slowHandlerThreshold =
|
|
40
|
+
(_s = params === null || params === void 0 ? void 0 : params.slowHandlerThreshold) !== null && _s !== void 0 ? _s : CommandBusConfig.parseIntWithDefault(process.env.COMMAND_BUS_SLOW_HANDLER_THRESHOLD, 1000);
|
|
41
|
+
this.validate();
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Zwraca opcje połączenia Redis na podstawie URL
|
|
45
|
+
* Zawiera retryStrategy z konfiguracją reconnect
|
|
46
|
+
*/
|
|
47
|
+
getRedisOptions() {
|
|
48
|
+
try {
|
|
49
|
+
const url = new URL(this.redisUrl);
|
|
50
|
+
const retryDelay = this.redisRetryDelay;
|
|
51
|
+
const maxRetries = this.redisMaxRetries;
|
|
52
|
+
const options = {
|
|
53
|
+
host: url.hostname,
|
|
54
|
+
port: parseInt(url.port, 10) || 6379,
|
|
55
|
+
retryStrategy: (times) => {
|
|
56
|
+
if (maxRetries > 0 && times > maxRetries) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
return retryDelay;
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
if (url.username) {
|
|
63
|
+
options.username = url.username;
|
|
64
|
+
}
|
|
65
|
+
if (url.password) {
|
|
66
|
+
options.password = url.password;
|
|
67
|
+
}
|
|
68
|
+
if (url.pathname && url.pathname.length > 1) {
|
|
69
|
+
const db = parseInt(url.pathname.substring(1), 10);
|
|
70
|
+
if (!isNaN(db)) {
|
|
71
|
+
options.db = db;
|
|
34
72
|
}
|
|
35
|
-
}
|
|
73
|
+
}
|
|
74
|
+
return options;
|
|
36
75
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
if (this.autoOptimize && !manualConcurrency) {
|
|
40
|
-
const optimizedConcurrency = auto_config_optimizer_1.default.calculateOptimalConcurrency();
|
|
41
|
-
const systemInfo = auto_config_optimizer_1.default.getSystemInfo();
|
|
42
|
-
this.logger.log('Auto-optymalizacja concurrency', {
|
|
43
|
-
oldConcurrency: this.concurrency,
|
|
44
|
-
newConcurrency: optimizedConcurrency,
|
|
45
|
-
systemInfo,
|
|
46
|
-
timestamp: new Date().toISOString(),
|
|
47
|
-
});
|
|
48
|
-
this.concurrency = optimizedConcurrency;
|
|
76
|
+
catch (_a) {
|
|
77
|
+
throw new Error('Invalid Redis URL');
|
|
49
78
|
}
|
|
50
|
-
else if (manualConcurrency) {
|
|
51
|
-
this.logger.log('Użyto ręcznie ustawionego concurrency', {
|
|
52
|
-
concurrency: this.concurrency,
|
|
53
|
-
source: manualConcurrencyFromParams ? 'params' : 'env',
|
|
54
|
-
timestamp: new Date().toISOString(),
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
// Dodatkowa walidacja specyficzna dla CommandBus
|
|
58
|
-
this.validateCommandBusConfig();
|
|
59
79
|
}
|
|
60
80
|
/**
|
|
61
|
-
* Waliduje konfigurację
|
|
81
|
+
* Waliduje całą konfigurację
|
|
62
82
|
*/
|
|
63
|
-
|
|
83
|
+
validate() {
|
|
84
|
+
// Redis URL
|
|
85
|
+
try {
|
|
86
|
+
new URL(this.redisUrl);
|
|
87
|
+
}
|
|
88
|
+
catch (_a) {
|
|
89
|
+
throw new Error('Invalid Redis URL');
|
|
90
|
+
}
|
|
91
|
+
// CommandBus
|
|
64
92
|
if (this.concurrency < 1) {
|
|
65
93
|
throw new Error('concurrency must be at least 1');
|
|
66
94
|
}
|
|
67
95
|
if (this.maxAttempts < 1) {
|
|
68
96
|
throw new Error('maxAttempts must be at least 1');
|
|
69
97
|
}
|
|
70
|
-
if (this.
|
|
71
|
-
throw new Error('
|
|
98
|
+
if (this.poolSize < 1) {
|
|
99
|
+
throw new Error('poolSize must be at least 1');
|
|
72
100
|
}
|
|
73
|
-
if (this.
|
|
74
|
-
throw new Error(
|
|
101
|
+
if (this.maxConcurrentRpc < 1) {
|
|
102
|
+
throw new Error('maxConcurrentRpc must be at least 1');
|
|
75
103
|
}
|
|
76
|
-
if (this.
|
|
77
|
-
throw new Error('
|
|
104
|
+
if (this.batchSize < 1) {
|
|
105
|
+
throw new Error('batchSize must be at least 1');
|
|
78
106
|
}
|
|
107
|
+
if (this.claimTimeout < 1000) {
|
|
108
|
+
throw new Error('claimTimeout must be at least 1000ms');
|
|
109
|
+
}
|
|
110
|
+
if (this.maxRetained < 100) {
|
|
111
|
+
throw new Error('maxRetained must be at least 100');
|
|
112
|
+
}
|
|
113
|
+
if (this.slowHandlerThreshold < 100) {
|
|
114
|
+
throw new Error('slowHandlerThreshold must be at least 100ms');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Parsuje string na liczbę z wartością domyślną
|
|
119
|
+
*/
|
|
120
|
+
static parseIntWithDefault(value, defaultValue) {
|
|
121
|
+
if (!value)
|
|
122
|
+
return defaultValue;
|
|
123
|
+
const parsed = parseInt(value, 10);
|
|
124
|
+
return isNaN(parsed) ? defaultValue : parsed;
|
|
79
125
|
}
|
|
80
126
|
}
|
|
81
127
|
exports.default = CommandBusConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-bus-config.js","sourceRoot":"","sources":["../../../src/command-bus/config/command-bus-config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"command-bus-config.js","sourceRoot":"","sources":["../../../src/command-bus/config/command-bus-config.ts"],"names":[],"mappings":"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"}
|