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
@@ -1,96 +0,0 @@
1
- import type { Redis } from 'ioredis';
2
- import type { ILogger } from '../../shared/types';
3
- import type { RpcMetadata, CompressibleCommand } from '../types';
4
- import type Command from '../command';
5
- import type PayloadCompressionService from './payload-compression.service';
6
- import type RpcJobCancellationService from './rpc-job-cancellation.service';
7
- import type { RemoveJobCallback } from './rpc-job-cancellation.service';
8
- /**
9
- * Zarządza lifecycle wywołań RPC przez Redis Pub/Sub
10
- * Używa shared subscriber z pattern matching dla multiplexingu odpowiedzi
11
- */
12
- export default class RpcCoordinator {
13
- private readonly logger;
14
- private readonly redisConnection;
15
- private readonly compressionService;
16
- private readonly cancellationService?;
17
- private readonly removeJobCallback?;
18
- /**
19
- * UUID procesu Node.js (współdzielony przez wszystkie instancje w procesie)
20
- */
21
- private readonly processInstanceId;
22
- /**
23
- * Shared subscriber dla wszystkich RPC calls w tym procesie
24
- */
25
- private sharedSubscriber;
26
- /**
27
- * Mapa pending RPC calls - routing odpowiedzi do promises
28
- */
29
- private pendingCalls;
30
- /**
31
- * Promise dla oczekiwania na gotowość subscribera
32
- */
33
- private subscriberReadyPromise;
34
- constructor(logger: ILogger, redisConnection: Redis, compressionService: PayloadCompressionService, cancellationService?: RpcJobCancellationService | undefined, removeJobCallback?: RemoveJobCallback | undefined);
35
- /**
36
- * Konfiguruje shared subscriber dla wszystkich RPC calls
37
- */
38
- private setupSharedSubscriber;
39
- /**
40
- * Oczekuje na gotowość subscribera z timeoutem
41
- * @param timeout - Timeout w milisekundach
42
- * @throws Error gdy subscriber nie jest gotowy w czasie
43
- */
44
- private waitForSubscriberReady;
45
- /**
46
- * Przygotowuje komendę RPC z odpowiednimi metadanymi
47
- * ResponseChannel jest konstruowany automatycznie z processInstanceId dla izolacji między procesami
48
- * Akceptuje zarówno Command jak i CompressibleCommand
49
- * @param command - Komenda do wysłania (może być skompresowana)
50
- * @returns Komenda z metadanymi RPC
51
- */
52
- prepareRpcCommand<T extends Command | CompressibleCommand>(command: T): T & {
53
- __rpcMetadata: RpcMetadata;
54
- };
55
- /**
56
- * Rejestruje nowe wywołanie RPC z timeoutem
57
- * @param correlationId - Unikalny ID wywołania
58
- * @param commandName - Nazwa komendy
59
- * @param timeout - Timeout w milisekundach
60
- * @returns Promise odpowiedzi RPC
61
- */
62
- registerCall<T>(correlationId: string, commandName: string, timeout: number): Promise<Promise<T>>;
63
- /**
64
- * Obsługuje wiadomość RPC z Redis Pub/Sub
65
- * @param channel - Kanał: rpc:response:{processId}:{correlationId}
66
- * @param message - Odpowiedź RPC (JSON)
67
- */
68
- private handleRpcMessage;
69
- /**
70
- * Ustawia jobId i queueName dla istniejącego pending call
71
- * Wywoływane przez CommandBus po dodaniu joba do kolejki
72
- *
73
- * Umożliwia usunięcie joba przy timeout (jeśli jeszcze nie został podjęty)
74
- *
75
- * @param correlationId - ID korelacji RPC (command.__id)
76
- * @param jobId - ID joba w BullMQ
77
- * @param queueName - Nazwa kolejki (commandName)
78
- */
79
- setJobId(correlationId: string, jobId: string, queueName: string): void;
80
- /**
81
- * Obsługuje timeout RPC - próbuje usunąć job z kolejki
82
- *
83
- * Wywoływana asynchronicznie przy timeout - NIE blokuje reject promise.
84
- * Jest to optymalizacja zasobów, nie kluczowa operacja.
85
- *
86
- * @param correlationId - ID korelacji RPC
87
- * @param pendingCall - Dane pending call (już usunięte z mapy)
88
- * @param commandName - Nazwa komendy (do logowania)
89
- */
90
- private handleTimeout;
91
- /**
92
- * Zamyka RpcCoordinator i czyści zasoby
93
- * Reject wszystkie pending calls i zamknij shared subscriber
94
- */
95
- close(): Promise<void>;
96
- }
@@ -1,500 +0,0 @@
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
- const crypto_1 = require("crypto");
13
- const redis_1 = require("../../shared/redis");
14
- /**
15
- * UUID per proces Node.js - współdzielony przez wszystkie instancje CommandBus
16
- * Zapewnia izolację odpowiedzi RPC między różnymi procesami
17
- */
18
- const PROCESS_INSTANCE_ID = (0, crypto_1.randomUUID)();
19
- /**
20
- * Zarządza lifecycle wywołań RPC przez Redis Pub/Sub
21
- * Używa shared subscriber z pattern matching dla multiplexingu odpowiedzi
22
- */
23
- class RpcCoordinator {
24
- constructor(logger, redisConnection, compressionService, cancellationService, removeJobCallback) {
25
- this.logger = logger;
26
- this.redisConnection = redisConnection;
27
- this.compressionService = compressionService;
28
- this.cancellationService = cancellationService;
29
- this.removeJobCallback = removeJobCallback;
30
- /**
31
- * UUID procesu Node.js (współdzielony przez wszystkie instancje w procesie)
32
- */
33
- this.processInstanceId = PROCESS_INSTANCE_ID;
34
- /**
35
- * Mapa pending RPC calls - routing odpowiedzi do promises
36
- */
37
- this.pendingCalls = new Map();
38
- this.logger.debug('Inicjalizacja RpcCoordinator', {
39
- processInstanceId: this.processInstanceId,
40
- timestamp: new Date().toISOString(),
41
- });
42
- // Setup shared subscriber z pattern matching
43
- this.setupSharedSubscriber();
44
- }
45
- /**
46
- * Konfiguruje shared subscriber dla wszystkich RPC calls
47
- */
48
- setupSharedSubscriber() {
49
- this.sharedSubscriber = this.redisConnection.duplicate();
50
- // Pattern subscribe z processInstanceId - tylko dla tego procesu!
51
- const pattern = `rpc:response:${this.processInstanceId}:*`;
52
- // Flaga do śledzenia czy to reconnect (dla logowania na poziomie INFO)
53
- let isReconnecting = false;
54
- this.logger.debug('Tworzenie shared subscriber dla RPC', {
55
- processInstanceId: this.processInstanceId,
56
- pattern,
57
- timestamp: new Date().toISOString(),
58
- });
59
- // Promise dla oczekiwania na psubscribe
60
- // Łączy się z ready event zamiast psubscribe (bardziej niezawodne)
61
- this.subscriberReadyPromise = new Promise((resolve) => {
62
- // Czekaj na 'ready' event gdy połączenie jest gotowe
63
- this.sharedSubscriber.once('ready', () => {
64
- this.logger.debug('Shared subscriber połączony z Redis', {
65
- processInstanceId: this.processInstanceId,
66
- timestamp: new Date().toISOString(),
67
- });
68
- // Teraz subskrybuj pattern
69
- void this.sharedSubscriber.psubscribe(pattern, (err) => {
70
- if (err) {
71
- this.logger.error('Błąd psubscribe', {
72
- processInstanceId: this.processInstanceId,
73
- pattern,
74
- error: err.message,
75
- timestamp: new Date().toISOString(),
76
- });
77
- return;
78
- }
79
- this.logger.debug('Shared subscriber gotowy', {
80
- processInstanceId: this.processInstanceId,
81
- pattern,
82
- timestamp: new Date().toISOString(),
83
- });
84
- resolve();
85
- });
86
- });
87
- });
88
- // Handler dla odpowiedzi RPC - multiplexing do pending calls
89
- this.sharedSubscriber.on('pmessage', (_pattern, channel, message) => {
90
- this.handleRpcMessage(channel, message);
91
- });
92
- // Handler błędów Redis subscriber
93
- this.sharedSubscriber.on('error', (error) => {
94
- this.logger.error('Błąd shared subscriber RPC', {
95
- processInstanceId: this.processInstanceId,
96
- error: (0, redis_1.formatRedisError)(error),
97
- errorCode: (0, redis_1.getErrorCode)(error),
98
- timestamp: new Date().toISOString(),
99
- });
100
- });
101
- // Handler zamknięcia połączenia
102
- this.sharedSubscriber.on('close', () => {
103
- this.logger.warn('Shared subscriber RPC zamknięty', {
104
- processInstanceId: this.processInstanceId,
105
- timestamp: new Date().toISOString(),
106
- });
107
- });
108
- // Handler reconnect - ustawia flagę dla logu INFO przy ready
109
- this.sharedSubscriber.on('reconnecting', () => {
110
- isReconnecting = true;
111
- this.logger.log('Shared subscriber RPC - ponowne łączenie', {
112
- processInstanceId: this.processInstanceId,
113
- timestamp: new Date().toISOString(),
114
- });
115
- });
116
- // Handler ready po reconnect - loguje INFO tylko po reconnect
117
- this.sharedSubscriber.on('ready', () => {
118
- if (isReconnecting) {
119
- this.logger.log('Shared subscriber RPC - ponownie połączony', {
120
- processInstanceId: this.processInstanceId,
121
- reconnected: true,
122
- timestamp: new Date().toISOString(),
123
- });
124
- isReconnecting = false;
125
- }
126
- });
127
- this.logger.debug('Subskrybowanie pattern dla RPC - oczekiwanie na ready', {
128
- processInstanceId: this.processInstanceId,
129
- pattern,
130
- timestamp: new Date().toISOString(),
131
- });
132
- }
133
- /**
134
- * Oczekuje na gotowość subscribera z timeoutem
135
- * @param timeout - Timeout w milisekundach
136
- * @throws Error gdy subscriber nie jest gotowy w czasie
137
- */
138
- waitForSubscriberReady(timeout) {
139
- return __awaiter(this, void 0, void 0, function* () {
140
- let timeoutId;
141
- const timeoutPromise = new Promise((_, reject) => {
142
- timeoutId = setTimeout(() => {
143
- reject(new Error(`Subscriber timeout: nie udało się nawiązać połączenia w ciągu ${timeout}ms`));
144
- }, timeout);
145
- });
146
- try {
147
- yield Promise.race([this.subscriberReadyPromise, timeoutPromise]);
148
- }
149
- catch (error) {
150
- this.logger.error('Timeout oczekiwania na gotowość subscribera', {
151
- processInstanceId: this.processInstanceId,
152
- timeout: `${timeout}ms`,
153
- error: error instanceof Error ? error.message : String(error),
154
- timestamp: new Date().toISOString(),
155
- });
156
- throw error;
157
- }
158
- finally {
159
- // Zawsze wyczyść timeout aby uniknąć memory leak
160
- if (timeoutId !== undefined) {
161
- clearTimeout(timeoutId);
162
- }
163
- }
164
- });
165
- }
166
- /**
167
- * Przygotowuje komendę RPC z odpowiednimi metadanymi
168
- * ResponseChannel jest konstruowany automatycznie z processInstanceId dla izolacji między procesami
169
- * Akceptuje zarówno Command jak i CompressibleCommand
170
- * @param command - Komenda do wysłania (może być skompresowana)
171
- * @returns Komenda z metadanymi RPC
172
- */
173
- prepareRpcCommand(command) {
174
- const responseChannel = `rpc:response:${this.processInstanceId}:${command.__id}`;
175
- return Object.assign(Object.assign({}, command), { __rpcMetadata: {
176
- correlationId: command.__id,
177
- responseChannel,
178
- timestamp: Date.now(),
179
- compressed: true, // Zawsze próbujemy kompresji (zależy od threshold)
180
- } });
181
- }
182
- /**
183
- * Rejestruje nowe wywołanie RPC z timeoutem
184
- * @param correlationId - Unikalny ID wywołania
185
- * @param commandName - Nazwa komendy
186
- * @param timeout - Timeout w milisekundach
187
- * @returns Promise odpowiedzi RPC
188
- */
189
- registerCall(correlationId, commandName, timeout) {
190
- return __awaiter(this, void 0, void 0, function* () {
191
- // Poczekaj na gotowość subscribera z timeoutem 5s
192
- yield this.waitForSubscriberReady(5000);
193
- const responseChannel = `rpc:response:${this.processInstanceId}:${correlationId}`;
194
- this.logger.debug('Rejestrowanie wywołania RPC przez shared subscriber', {
195
- processInstanceId: this.processInstanceId,
196
- correlationId,
197
- responseChannel,
198
- commandName,
199
- timeout: `${timeout}ms`,
200
- timestamp: new Date().toISOString(),
201
- });
202
- // Utwórz promise odpowiedzi i dodaj do pending calls SYNCHRONICZNIE
203
- // Teraz subscriber jest gotowy, więc możemy bezpiecznie dodać pending call
204
- const responsePromise = new Promise((resolve, reject) => {
205
- const startTime = Date.now();
206
- // Timeout handler - wywołuje cancellation async (nie blokuje reject)
207
- const timeoutId = setTimeout(() => {
208
- const pendingCall = this.pendingCalls.get(correlationId);
209
- if (!pendingCall) {
210
- // Pending call już obsłużony (np. odpowiedź przyszła)
211
- return;
212
- }
213
- // Usuń z mapy PRZED reject (zapobiega podwójnemu przetwarzaniu)
214
- this.pendingCalls.delete(correlationId);
215
- this.logger.error('RPC timeout', {
216
- processInstanceId: this.processInstanceId,
217
- commandName,
218
- correlationId,
219
- responseChannel,
220
- timeout: `${timeout}ms`,
221
- pendingCallsCount: this.pendingCalls.size,
222
- jobId: pendingCall.jobId,
223
- queueName: pendingCall.queueName,
224
- timestamp: new Date().toISOString(),
225
- });
226
- // Obsłuż cancellation async - nie blokuje reject
227
- // Używa void aby nie czekać - to optymalizacja, nie kluczowa operacja
228
- void this.handleTimeout(correlationId, pendingCall, commandName);
229
- reject(new Error(`RPC timeout for command ${commandName}`));
230
- }, timeout);
231
- // Zapisz pending call w Map SYNCHRONICZNIE
232
- this.pendingCalls.set(correlationId, {
233
- resolve: resolve,
234
- reject,
235
- timeoutId,
236
- commandName,
237
- startTime,
238
- });
239
- this.logger.debug('Pending RPC call zarejestrowany', {
240
- processInstanceId: this.processInstanceId,
241
- correlationId,
242
- responseChannel,
243
- pendingCallsCount: this.pendingCalls.size,
244
- timestamp: new Date().toISOString(),
245
- });
246
- });
247
- // Zwróć responsePromise natychmiast - caller może kontynuować (dodać job do kolejki)
248
- return responsePromise;
249
- });
250
- }
251
- /**
252
- * Obsługuje wiadomość RPC z Redis Pub/Sub
253
- * @param channel - Kanał: rpc:response:{processId}:{correlationId}
254
- * @param message - Odpowiedź RPC (JSON)
255
- */
256
- handleRpcMessage(channel, message) {
257
- // Ekstraktuj correlationId z channel: rpc:response:{processId}:{correlationId}
258
- const parts = channel.split(':');
259
- if (parts.length !== 4 || parts[0] !== 'rpc' || parts[1] !== 'response') {
260
- this.logger.warn('Nieprawidłowy format kanału RPC', {
261
- processInstanceId: this.processInstanceId,
262
- channel,
263
- timestamp: new Date().toISOString(),
264
- });
265
- return;
266
- }
267
- const receivedProcessId = parts[2];
268
- const correlationId = parts[3];
269
- // Weryfikacja processInstanceId (dodatkowe bezpieczeństwo)
270
- if (receivedProcessId !== this.processInstanceId) {
271
- this.logger.warn('Otrzymano wiadomość dla innego procesu', {
272
- processInstanceId: this.processInstanceId,
273
- receivedProcessId,
274
- correlationId,
275
- channel,
276
- timestamp: new Date().toISOString(),
277
- });
278
- return;
279
- }
280
- // Znajdź pending call w Map
281
- const pendingCall = this.pendingCalls.get(correlationId);
282
- if (!pendingCall) {
283
- this.logger.warn('Otrzymano odpowiedź dla nieistniejącego RPC call', {
284
- processInstanceId: this.processInstanceId,
285
- correlationId,
286
- channel,
287
- pendingCallsCount: this.pendingCalls.size,
288
- timestamp: new Date().toISOString(),
289
- });
290
- return;
291
- }
292
- // Dekompresuj i parsuj odpowiedź (async)
293
- // Message zawiera wrapper: {data: string, compressed: boolean}
294
- let wrapper;
295
- try {
296
- wrapper = JSON.parse(message);
297
- }
298
- catch (parseError) {
299
- this.logger.error('Błąd parsowania wrapper odpowiedzi RPC', {
300
- processInstanceId: this.processInstanceId,
301
- correlationId,
302
- commandName: pendingCall.commandName,
303
- error: parseError instanceof Error ? parseError.message : String(parseError),
304
- timestamp: new Date().toISOString(),
305
- });
306
- clearTimeout(pendingCall.timeoutId);
307
- this.pendingCalls.delete(correlationId);
308
- pendingCall.reject(new Error('Failed to parse RPC response wrapper'));
309
- return;
310
- }
311
- this.compressionService
312
- .decompress(wrapper.data, wrapper.compressed)
313
- .then((decompressed) => {
314
- const { correlationId: responseCorrelationId, result, error, } = decompressed;
315
- const duration = Date.now() - pendingCall.startTime;
316
- this.logger.debug('Otrzymano odpowiedź RPC przez shared subscriber', {
317
- processInstanceId: this.processInstanceId,
318
- correlationId: responseCorrelationId,
319
- commandName: pendingCall.commandName,
320
- duration: `${duration}ms`,
321
- hasResult: result !== null && result !== undefined,
322
- hasError: error !== null,
323
- pendingCallsCount: this.pendingCalls.size - 1,
324
- timestamp: new Date().toISOString(),
325
- });
326
- // Resolve/reject promise
327
- if (error) {
328
- this.logger.error('Wywołanie RPC odrzucone', {
329
- processInstanceId: this.processInstanceId,
330
- correlationId: responseCorrelationId,
331
- commandName: pendingCall.commandName,
332
- error,
333
- timestamp: new Date().toISOString(),
334
- });
335
- pendingCall.reject(new Error(error));
336
- }
337
- else {
338
- this.logger.debug('Wywołanie RPC rozwiązane', {
339
- processInstanceId: this.processInstanceId,
340
- correlationId: responseCorrelationId,
341
- commandName: pendingCall.commandName,
342
- duration: `${duration}ms`,
343
- timestamp: new Date().toISOString(),
344
- });
345
- pendingCall.resolve(result);
346
- }
347
- })
348
- .catch((decompressError) => {
349
- this.logger.error('Błąd dekompresji/parsowania odpowiedzi RPC', {
350
- processInstanceId: this.processInstanceId,
351
- correlationId,
352
- commandName: pendingCall.commandName,
353
- error: decompressError instanceof Error ? decompressError.message : String(decompressError),
354
- timestamp: new Date().toISOString(),
355
- });
356
- pendingCall.reject(new Error('Failed to decompress/parse RPC response'));
357
- })
358
- .finally(() => {
359
- // Cleanup - zawsze wyczyść timeout i usuń z pending calls (zapobiega memory leak)
360
- clearTimeout(pendingCall.timeoutId);
361
- this.pendingCalls.delete(correlationId);
362
- });
363
- }
364
- /**
365
- * Ustawia jobId i queueName dla istniejącego pending call
366
- * Wywoływane przez CommandBus po dodaniu joba do kolejki
367
- *
368
- * Umożliwia usunięcie joba przy timeout (jeśli jeszcze nie został podjęty)
369
- *
370
- * @param correlationId - ID korelacji RPC (command.__id)
371
- * @param jobId - ID joba w BullMQ
372
- * @param queueName - Nazwa kolejki (commandName)
373
- */
374
- setJobId(correlationId, jobId, queueName) {
375
- const pendingCall = this.pendingCalls.get(correlationId);
376
- if (!pendingCall) {
377
- // Pending call już nie istnieje (timeout lub odpowiedź przyszła wcześniej)
378
- this.logger.debug('Próba ustawienia jobId dla nieistniejącego pending call', {
379
- processInstanceId: this.processInstanceId,
380
- correlationId,
381
- jobId,
382
- queueName,
383
- timestamp: new Date().toISOString(),
384
- });
385
- return;
386
- }
387
- // Ustaw jobId i queueName dla późniejszego usunięcia przy timeout
388
- pendingCall.jobId = jobId;
389
- pendingCall.queueName = queueName;
390
- this.logger.debug('Ustawiono jobId dla pending RPC call', {
391
- processInstanceId: this.processInstanceId,
392
- correlationId,
393
- jobId,
394
- queueName,
395
- timestamp: new Date().toISOString(),
396
- });
397
- }
398
- /**
399
- * Obsługuje timeout RPC - próbuje usunąć job z kolejki
400
- *
401
- * Wywoływana asynchronicznie przy timeout - NIE blokuje reject promise.
402
- * Jest to optymalizacja zasobów, nie kluczowa operacja.
403
- *
404
- * @param correlationId - ID korelacji RPC
405
- * @param pendingCall - Dane pending call (już usunięte z mapy)
406
- * @param commandName - Nazwa komendy (do logowania)
407
- */
408
- handleTimeout(correlationId, pendingCall, commandName) {
409
- return __awaiter(this, void 0, void 0, function* () {
410
- // Jeśli brak cancellation service - nic nie rób
411
- if (!this.cancellationService) {
412
- return;
413
- }
414
- try {
415
- // Oznacz jako cancelled (nie rzuca wyjątków)
416
- yield this.cancellationService.markAsCancelled(correlationId);
417
- // Spróbuj usunąć job jeśli mamy dane i callback
418
- if (pendingCall.jobId && pendingCall.queueName && this.removeJobCallback) {
419
- const removed = yield this.cancellationService.tryRemoveJob(pendingCall.jobId, pendingCall.queueName, this.removeJobCallback);
420
- if (removed) {
421
- // Jeśli usunięto, wyczyść flagę cancellation (nie jest już potrzebna)
422
- yield this.cancellationService.clearCancellation(correlationId);
423
- }
424
- }
425
- this.logger.debug('RPC timeout obsłużony - cancellation wykonane', {
426
- processInstanceId: this.processInstanceId,
427
- correlationId,
428
- commandName,
429
- jobId: pendingCall.jobId,
430
- queueName: pendingCall.queueName,
431
- timestamp: new Date().toISOString(),
432
- });
433
- }
434
- catch (error) {
435
- // Błędy cancellation są logowane, ale nie propagowane
436
- // Jest to optymalizacja, nie kluczowa operacja
437
- this.logger.warn('Błąd podczas obsługi timeout RPC - cancellation', {
438
- processInstanceId: this.processInstanceId,
439
- correlationId,
440
- commandName,
441
- error: error instanceof Error ? error.message : String(error),
442
- timestamp: new Date().toISOString(),
443
- });
444
- }
445
- });
446
- }
447
- /**
448
- * Zamyka RpcCoordinator i czyści zasoby
449
- * Reject wszystkie pending calls i zamknij shared subscriber
450
- */
451
- close() {
452
- return __awaiter(this, void 0, void 0, function* () {
453
- this.logger.debug('Zamykanie RpcCoordinator', {
454
- processInstanceId: this.processInstanceId,
455
- pendingCallsCount: this.pendingCalls.size,
456
- timestamp: new Date().toISOString(),
457
- });
458
- // Reject wszystkie pending calls
459
- for (const [correlationId, pendingCall] of this.pendingCalls.entries()) {
460
- clearTimeout(pendingCall.timeoutId);
461
- pendingCall.reject(new Error('RpcCoordinator is closing'));
462
- this.logger.debug('Odrzucono pending RPC call przy zamykaniu', {
463
- processInstanceId: this.processInstanceId,
464
- correlationId,
465
- commandName: pendingCall.commandName,
466
- timestamp: new Date().toISOString(),
467
- });
468
- }
469
- this.pendingCalls.clear();
470
- // Zamknij shared subscriber
471
- try {
472
- const pattern = `rpc:response:${this.processInstanceId}:*`;
473
- yield this.sharedSubscriber.punsubscribe(pattern);
474
- this.sharedSubscriber.removeAllListeners('pmessage');
475
- this.sharedSubscriber.removeAllListeners('psubscribe');
476
- this.sharedSubscriber.removeAllListeners('error');
477
- this.sharedSubscriber.removeAllListeners('close');
478
- this.sharedSubscriber.removeAllListeners('reconnecting');
479
- yield this.sharedSubscriber.quit();
480
- this.logger.debug('Shared subscriber zamknięty', {
481
- processInstanceId: this.processInstanceId,
482
- timestamp: new Date().toISOString(),
483
- });
484
- }
485
- catch (error) {
486
- this.logger.warn('Błąd podczas zamykania shared subscriber', {
487
- processInstanceId: this.processInstanceId,
488
- error: error instanceof Error ? error.message : String(error),
489
- timestamp: new Date().toISOString(),
490
- });
491
- }
492
- this.logger.debug('RpcCoordinator zamknięty', {
493
- processInstanceId: this.processInstanceId,
494
- timestamp: new Date().toISOString(),
495
- });
496
- });
497
- }
498
- }
499
- exports.default = RpcCoordinator;
500
- //# sourceMappingURL=rpc-coordinator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rpc-coordinator.js","sourceRoot":"","sources":["../../../src/command-bus/rpc/rpc-coordinator.ts"],"names":[],"mappings":"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"}