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
@@ -12,444 +12,223 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- const bullmq_1 = require("bullmq");
16
15
  const index_1 = __importDefault(require("./index"));
17
- const command_bus_config_1 = __importDefault(require("./config/command-bus-config"));
18
16
  const command_1 = __importDefault(require("./command"));
19
- // Mock BullMQ
20
- jest.mock('bullmq');
21
- // Mock ioredis
17
+ const command_bus_config_1 = __importDefault(require("./config/command-bus-config"));
18
+ // Mock ioredis — disconnect() przerywa blocking XREADGROUP (jak prawdziwy Redis)
22
19
  jest.mock('ioredis', () => {
23
- const mockSubscriber = {
24
- subscribe: jest.fn().mockResolvedValue(undefined),
25
- unsubscribe: jest.fn().mockResolvedValue(undefined),
26
- psubscribe: jest
27
- .fn()
28
- .mockImplementation((_pattern, callback) => {
29
- // Wywołaj callback natychmiast jeśli został przekazany
30
- if (callback) {
31
- setImmediate(() => callback(null, 1));
32
- }
33
- return Promise.resolve(undefined);
34
- }),
35
- punsubscribe: jest.fn().mockResolvedValue(undefined),
36
- on: jest.fn().mockReturnThis(),
37
- once: jest.fn().mockImplementation((event, handler) => {
38
- // Automatycznie wywołaj handler 'ready' natychmiast
39
- if (event === 'ready') {
40
- setImmediate(() => handler());
41
- }
42
- return mockSubscriber;
43
- }),
44
- off: jest.fn().mockReturnThis(),
45
- removeAllListeners: jest.fn().mockReturnThis(),
46
- quit: jest.fn().mockResolvedValue(undefined),
47
- };
48
- return {
49
- Redis: jest.fn().mockImplementation(() => ({
50
- quit: jest.fn().mockResolvedValue(undefined),
51
- ping: jest.fn().mockResolvedValue('PONG'),
52
- set: jest.fn().mockResolvedValue('OK'),
53
- get: jest.fn().mockResolvedValue('test-value'),
20
+ const mockRedis = jest.fn().mockImplementation(() => {
21
+ /** Rejecty pending blocking operations — disconnect() je wywołuje */
22
+ const pendingRejects = [];
23
+ return {
24
+ xadd: jest.fn().mockResolvedValue('1700000000000-0'),
25
+ xreadgroup: jest.fn().mockImplementation(() => new Promise((_resolve, reject) => {
26
+ pendingRejects.push(reject);
27
+ })),
28
+ xack: jest.fn().mockResolvedValue(1),
29
+ xgroup: jest.fn().mockResolvedValue('OK'),
30
+ xpending: jest.fn().mockResolvedValue([]),
31
+ xclaim: jest.fn().mockResolvedValue([]),
32
+ xtrim: jest.fn().mockResolvedValue(0),
33
+ brpop: jest.fn().mockResolvedValue(null),
34
+ lpush: jest.fn().mockResolvedValue(1),
35
+ expire: jest.fn().mockResolvedValue(1),
54
36
  del: jest.fn().mockResolvedValue(1),
55
- duplicate: jest.fn().mockReturnValue(mockSubscriber),
56
- publish: jest.fn().mockResolvedValue(1),
57
- on: jest.fn().mockReturnThis(),
58
- once: jest.fn().mockReturnThis(),
59
- off: jest.fn().mockReturnThis(),
60
- removeAllListeners: jest.fn().mockReturnThis(),
61
- })),
62
- };
37
+ quit: jest.fn().mockResolvedValue('OK'),
38
+ on: jest.fn(),
39
+ disconnect: jest.fn().mockImplementation(() => {
40
+ // Przerwij wszystkie pending blocking operations — symuluje zamknięcie socketa
41
+ const disconnectError = new Error('Connection is closed.');
42
+ while (pendingRejects.length > 0) {
43
+ const reject = pendingRejects.shift();
44
+ if (reject)
45
+ reject(disconnectError);
46
+ }
47
+ }),
48
+ pipeline: jest.fn().mockReturnValue({
49
+ xadd: jest.fn().mockReturnThis(),
50
+ xack: jest.fn().mockReturnThis(),
51
+ xtrim: jest.fn().mockReturnThis(),
52
+ lpush: jest.fn().mockReturnThis(),
53
+ expire: jest.fn().mockReturnThis(),
54
+ exec: jest.fn().mockResolvedValue([
55
+ [null, '1700000000000-0'],
56
+ [null, '1700000000001-0'],
57
+ ]),
58
+ }),
59
+ };
60
+ });
61
+ return { Redis: mockRedis };
63
62
  });
64
- // Przykładowa komenda testowa
63
+ // Klasa testowa komendy
65
64
  class TestCommand extends command_1.default {
66
65
  constructor(payload) {
67
66
  super(payload);
68
67
  }
69
68
  }
70
- // Inna komenda do testowania
71
- class AnotherTestCommand extends command_1.default {
69
+ class AnotherCommand extends command_1.default {
72
70
  constructor(payload) {
73
71
  super(payload);
74
72
  }
75
73
  }
76
- // Komenda do testowania RPC
77
74
  class CalculateCommand extends command_1.default {
78
75
  constructor(payload) {
79
76
  super(payload);
80
77
  }
81
78
  }
82
- /**
83
- * Helper: czeka aż worker zostanie zarejestrowany asynchronicznie
84
- * Potrzebne bo registerWorker() uruchamia benchmark przed utworzeniem workera
85
- */
86
- const waitForWorkerRegistration = () => new Promise((resolve) => setTimeout(resolve, 150));
87
79
  describe('CommandBus', () => {
88
- let commandBus;
89
- let config;
90
- let mockQueue;
91
- let mockWorker;
80
+ let bus;
92
81
  beforeEach(() => {
93
- // Reset wszystkich mocków
94
82
  jest.clearAllMocks();
95
- // Konfiguracja testowa
96
- config = new command_bus_config_1.default({
97
- redisUrl: 'redis://localhost:6379',
98
- concurrency: 5,
83
+ const config = new command_bus_config_1.default({
84
+ concurrency: 1,
85
+ poolSize: 2,
86
+ maxConcurrentRpc: 5,
99
87
  });
100
- // Mock Queue
101
- mockQueue = {
102
- add: jest.fn().mockResolvedValue({ id: 'test-job-id' }),
103
- close: jest.fn().mockResolvedValue(undefined),
104
- obliterate: jest.fn().mockResolvedValue(undefined),
105
- };
106
- // Mock Worker
107
- mockWorker = {
108
- close: jest.fn().mockResolvedValue(undefined),
109
- on: jest.fn().mockReturnThis(),
110
- removeAllListeners: jest.fn().mockReturnThis(),
111
- };
112
- // Mock konstruktorów
113
- bullmq_1.Queue.mockImplementation(() => mockQueue);
114
- bullmq_1.Worker.mockImplementation(() => mockWorker);
115
- commandBus = new index_1.default(config);
88
+ bus = new index_1.default(config);
116
89
  });
117
90
  afterEach(() => __awaiter(void 0, void 0, void 0, function* () {
118
- // Wyczyść wszystkie pending timery PRZED zamknięciem
119
- jest.clearAllTimers();
120
- // Dodaj timeout aby uniknąć unhandled rejections podczas close()
121
- try {
122
- yield commandBus.close();
123
- // Zwiększyć grace period z 100ms do 200ms dla pełnego zamknięcia
124
- yield new Promise((resolve) => setTimeout(resolve, 200));
125
- }
126
- catch (error) {
127
- // Ignoruj błędy związane z zamykaniem podczas testów RPC
128
- if (!(error instanceof Error) || !error.message.includes('CommandBus is closing')) {
129
- throw error;
130
- }
131
- }
132
- // Ostateczne czyszczenie pending operations
133
- yield new Promise((resolve) => setImmediate(resolve));
91
+ yield bus.close();
134
92
  }));
135
- describe('dispatch', () => {
136
- it('powinno dodać komendę do kolejki', () => __awaiter(void 0, void 0, void 0, function* () {
137
- // Given
138
- const command = new TestCommand({ data: 'test data' });
139
- // When
140
- yield commandBus.dispatch(command);
141
- // Then - sprawdź że Queue został utworzony z Redis connection
142
- expect(bullmq_1.Queue).toHaveBeenCalledWith('{TestCommand}', expect.objectContaining({
143
- connection: expect.any(Object),
144
- }));
145
- expect(mockQueue.add).toHaveBeenCalledWith('TestCommand', expect.objectContaining({
146
- __name: 'TestCommand',
147
- __id: command.__id,
148
- __time: command.__time,
149
- __compressed: false, // Mała komenda nie powinna być skompresowana
150
- __payload: { data: 'test data' },
151
- }), expect.objectContaining({
152
- attempts: 1,
153
- backoff: expect.objectContaining({
154
- type: 'exponential',
155
- delay: 2000,
156
- }),
157
- }));
158
- }));
159
- it('powinno używać tej samej kolejki dla tego samego typu komendy', () => __awaiter(void 0, void 0, void 0, function* () {
160
- // Given
161
- const command1 = new TestCommand({ data: 'data 1' });
162
- const command2 = new TestCommand({ data: 'data 2' });
163
- // When
164
- yield commandBus.dispatch(command1);
165
- yield commandBus.dispatch(command2);
166
- // Then
167
- // Obie komendy powinny zostać dodane do tej samej kolejki
168
- expect(mockQueue.add).toHaveBeenCalledTimes(2);
169
- expect(mockQueue.add).toHaveBeenNthCalledWith(1, expect.any(String), expect.objectContaining({
170
- __name: 'TestCommand',
171
- __payload: { data: 'data 1' },
172
- }), expect.any(Object));
173
- expect(mockQueue.add).toHaveBeenNthCalledWith(2, expect.any(String), expect.objectContaining({
174
- __name: 'TestCommand',
175
- __payload: { data: 'data 2' },
176
- }), expect.any(Object));
177
- }));
178
- it('powinno tworzyć osobne kolejki dla różnych typów komend', () => __awaiter(void 0, void 0, void 0, function* () {
179
- // Given
180
- const testCommand = new TestCommand({ data: 'test' });
181
- const anotherCommand = new AnotherTestCommand({ value: 42 });
182
- // When
183
- yield commandBus.dispatch(testCommand);
184
- yield commandBus.dispatch(anotherCommand);
185
- // Then
186
- // Obie komendy powinny zostać dodane (każda do swojej kolejki)
187
- expect(mockQueue.add).toHaveBeenCalledTimes(2);
188
- expect(mockQueue.add).toHaveBeenNthCalledWith(1, expect.any(String), expect.objectContaining({
189
- __name: 'TestCommand',
190
- __payload: { data: 'test' },
191
- }), expect.any(Object));
192
- expect(mockQueue.add).toHaveBeenNthCalledWith(2, expect.any(String), expect.objectContaining({
193
- __name: 'AnotherTestCommand',
194
- __payload: { value: 42 },
195
- }), expect.any(Object));
196
- }));
197
- });
198
- describe('handle', () => {
199
- it('powinno utworzyć workera dla komendy', () => __awaiter(void 0, void 0, void 0, function* () {
200
- // Given
201
- const handler = jest.fn();
202
- // When
203
- commandBus.handle(TestCommand, handler);
204
- yield waitForWorkerRegistration();
205
- // Then
206
- expect(bullmq_1.Worker).toHaveBeenCalledWith('{TestCommand}', expect.any(Function), expect.objectContaining({
207
- connection: expect.any(Object),
208
- concurrency: expect.any(Number), // Wartość ustalana przez benchmark
209
- }));
210
- }));
211
- it('powinno przetworzyć komendę przez handler', () => __awaiter(void 0, void 0, void 0, function* () {
212
- // Given
213
- const handler = jest.fn().mockResolvedValue(undefined);
214
- const command = new TestCommand({ data: 'test data' });
215
- let workerProcessor;
216
- bullmq_1.Worker.mockImplementation((_name, processor) => {
217
- workerProcessor = processor;
218
- return mockWorker;
219
- });
220
- // When
221
- commandBus.handle(TestCommand, handler);
222
- yield waitForWorkerRegistration();
223
- // Symulacja przetworzenia zadania
224
- yield workerProcessor({
225
- data: command,
226
- id: 'job-id',
227
- name: 'TestCommand',
228
- });
229
- // Then
230
- expect(handler).toHaveBeenCalledWith(command);
231
- }));
232
- it('powinno zezwalać tylko na jeden handler per komenda', () => {
233
- // Given
234
- const handler1 = jest.fn();
235
- const handler2 = jest.fn();
236
- // When
237
- commandBus.handle(TestCommand, handler1);
238
- // Then - drugi handler powinien rzucić błąd
239
- expect(() => commandBus.handle(TestCommand, handler2)).toThrow('Handler dla komendy TestCommand już istnieje');
93
+ describe('konstruktor', () => {
94
+ it('powinien utworzyć CommandBus z konfiguracją', () => {
95
+ expect(bus).toBeDefined();
240
96
  });
241
- it('powinno obsłużyć błąd gdy brak handlera dla komendy', () => __awaiter(void 0, void 0, void 0, function* () {
242
- // Given
243
- const command = new TestCommand({ data: 'test' });
244
- const handler = jest.fn().mockResolvedValue(undefined);
245
- let workerProcessor;
246
- bullmq_1.Worker.mockImplementation((_name, processor) => {
247
- workerProcessor = processor;
248
- return mockWorker;
97
+ it('powinien używać Logger wrapper z CommandBusConfig', () => {
98
+ const testConfig = new command_bus_config_1.default({
99
+ logLevel: 'error',
100
+ concurrency: 1,
101
+ poolSize: 2,
102
+ maxConcurrentRpc: 5,
249
103
  });
250
- // Zarejestruj handler normalnie
251
- commandBus.handle(TestCommand, handler);
252
- yield waitForWorkerRegistration();
253
- // Następnie usuń handler z internal commandHandlers aby symulować brak handlera
254
- const commandHandlers = commandBus.commandHandlers;
255
- delete commandHandlers['TestCommand'];
256
- // When & Then
257
- yield expect(workerProcessor({
258
- data: command,
259
- id: 'job-id',
260
- name: 'TestCommand',
261
- })).rejects.toThrow('Brak handlera dla komendy TestCommand');
262
- }));
104
+ const testBus = new index_1.default(testConfig);
105
+ expect(testBus['logger']).toBe(testConfig.logger);
106
+ void testBus.close();
107
+ });
263
108
  });
264
- describe('close', () => {
265
- it('powinno zamknąć wszystkie kolejki i workery', () => __awaiter(void 0, void 0, void 0, function* () {
266
- // Given
267
- const command = new TestCommand({ data: 'test' });
268
- yield commandBus.dispatch(command);
269
- commandBus.handle(TestCommand, jest.fn());
270
- yield waitForWorkerRegistration();
271
- // When
272
- yield commandBus.close();
273
- // Then
274
- // CommandBus nie zarządza cyklem życia kolejek - tylko zamyka workery
275
- expect(mockWorker.close).toHaveBeenCalled();
109
+ describe('dispatch()', () => {
110
+ it('powinien wysłać komendę do strumienia (T3: z assertions)', () => __awaiter(void 0, void 0, void 0, function* () {
111
+ const cmd = new TestCommand({ name: 'Jan Kowalski' });
112
+ yield bus.dispatch(cmd);
113
+ // T3: Sprawdź że transport.enqueue() (XADD) został wywołany
114
+ const { Redis } = require('ioredis');
115
+ const allInstances = Redis.mock.results
116
+ .filter((r) => r.type === 'return')
117
+ .map((r) => r.value);
118
+ const xaddCalls = allInstances.flatMap((inst) => { var _a, _b, _c; return (_c = (_b = (_a = inst.xadd) === null || _a === void 0 ? void 0 : _a.mock) === null || _b === void 0 ? void 0 : _b.calls) !== null && _c !== void 0 ? _c : []; });
119
+ expect(xaddCalls.length).toBeGreaterThan(0);
120
+ expect(xaddCalls[0][0]).toBe('cmd:TestCommand');
276
121
  }));
277
- });
278
- describe('połączenie z Redis', () => {
279
- it('powinno obsłużyć błąd połączenia', () => __awaiter(void 0, void 0, void 0, function* () {
280
- // Given
281
- mockQueue.add.mockRejectedValueOnce(new Error('Connection failed'));
282
- const command = new TestCommand({ data: 'test' });
283
- // When & Then
284
- yield expect(commandBus.dispatch(command)).rejects.toThrow('Connection failed');
122
+ it('powinien obsłużyć wiele komend sekwencyjnie', () => __awaiter(void 0, void 0, void 0, function* () {
123
+ const cmd1 = new TestCommand({ name: 'Anna Nowak' });
124
+ const cmd2 = new TestCommand({ name: 'Piotr Wiśniewski' });
125
+ yield bus.dispatch(cmd1);
126
+ yield bus.dispatch(cmd2);
127
+ }));
128
+ it('powinien obsłużyć różne typy komend', () => __awaiter(void 0, void 0, void 0, function* () {
129
+ const testCmd = new TestCommand({ name: 'Test' });
130
+ const anotherCmd = new AnotherCommand({ value: 42 });
131
+ yield bus.dispatch(testCmd);
132
+ yield bus.dispatch(anotherCmd);
285
133
  }));
286
134
  });
287
- describe('obsługa błędów workera', () => {
288
- it('powinno logować błędy przetwarzania', () => __awaiter(void 0, void 0, void 0, function* () {
289
- // Given
290
- const consoleSpy = jest.spyOn(console, 'error').mockImplementation();
291
- const handler = jest.fn().mockRejectedValue(new Error('Processing failed'));
292
- let workerProcessor = null;
293
- bullmq_1.Worker.mockImplementation((_name, processor) => {
294
- workerProcessor = processor;
295
- return mockWorker;
296
- });
297
- // When
298
- commandBus.handle(TestCommand, handler);
299
- yield waitForWorkerRegistration();
300
- const command = new TestCommand({ data: 'test' });
301
- expect(workerProcessor).not.toBeNull();
302
- const processor = workerProcessor;
303
- yield expect(processor({
304
- data: command,
305
- id: 'job-id',
306
- name: 'TestCommand',
307
- })).rejects.toThrow('Processing failed');
308
- // Then
309
- expect(handler).toHaveBeenCalledWith(command);
310
- // Cleanup
311
- consoleSpy.mockRestore();
135
+ describe('dispatchBatch()', () => {
136
+ it('powinien wysłać wiele komend w jednym pipeline', () => __awaiter(void 0, void 0, void 0, function* () {
137
+ const commands = [
138
+ new TestCommand({ name: 'Jan' }),
139
+ new TestCommand({ name: 'Anna' }),
140
+ new TestCommand({ name: 'Piotr' }),
141
+ ];
142
+ yield bus.dispatchBatch(commands);
143
+ }));
144
+ it('powinien obsłużyć pustą tablicę', () => __awaiter(void 0, void 0, void 0, function* () {
145
+ yield bus.dispatchBatch([]);
312
146
  }));
313
147
  });
314
- describe('RPC - Unikalne kolejki per wywołanie', () => {
315
- it('RpcCoordinator nie powinien mieć globalnej reply queue', () => {
316
- // Given & When
317
- const commandBus1 = new index_1.default(config);
318
- // Then - RpcCoordinator nie ma już globalnej kolejki/workera
319
- const rpcCoordinator = commandBus1
320
- .rpcCoordinator;
321
- expect(rpcCoordinator.replyQueue).toBeUndefined();
322
- expect(rpcCoordinator.replyWorker).toBeUndefined();
323
- // CommandBus nie ma już replyQueueName
324
- expect(commandBus1.replyQueueName).toBeUndefined();
325
- // Cleanup
326
- commandBus1.close().catch(() => undefined);
148
+ describe('handle()', () => {
149
+ it('powinien zarejestrować handler dla komendy', () => {
150
+ const handler = jest.fn();
151
+ bus.handle(TestCommand, handler);
152
+ });
153
+ it('powinien rzucić błąd przy duplikacie handlera', () => {
154
+ bus.handle(TestCommand, jest.fn());
155
+ expect(() => bus.handle(TestCommand, jest.fn())).toThrow('Handler dla komendy TestCommand już istnieje');
156
+ });
157
+ it('powinien pozwolić na rejestrację różnych handlerów', () => {
158
+ bus.handle(TestCommand, jest.fn());
159
+ bus.handle(AnotherCommand, jest.fn());
327
160
  });
328
- it('RPC call() powinno dodać __rpcMetadata z unikalną replyQueue per wywołanie', () => __awaiter(void 0, void 0, void 0, function* () {
329
- // Given
330
- const handler = jest.fn().mockResolvedValue(42);
331
- const command = new CalculateCommand({ a: 5, b: 3, operation: 'add' });
332
- mockQueue.add.mockResolvedValue({
333
- id: 'test-job-id-123',
334
- opts: {},
335
- });
336
- commandBus.handle(CalculateCommand, handler);
337
- yield waitForWorkerRegistration();
338
- // When
339
- const callPromise = commandBus.call(command, 100);
340
- // Poczekaj na microtask żeby registerCall() zdążył się wykonać
341
- yield Promise.resolve();
342
- // Then - responseChannel zawiera processInstanceId i correlationId dla izolacji między procesami
343
- expect(mockQueue.add).toHaveBeenCalledWith('CalculateCommand', expect.objectContaining({
344
- __rpcMetadata: expect.objectContaining({
345
- correlationId: command.__id,
346
- // Format: rpc:response:{processInstanceId}:{correlationId}
347
- responseChannel: expect.stringMatching(new RegExp(`^rpc:response:[0-9a-f-]{36}:${command.__id}$`)),
348
- timestamp: expect.any(Number),
349
- }),
350
- }), expect.any(Object));
351
- // Cleanup - czekaj na timeout
352
- callPromise.catch(() => undefined);
353
- }));
354
161
  });
355
- describe('RPC - call()', () => {
356
- beforeEach(() => {
357
- // Mock job z ID dla RPC
358
- mockQueue.add.mockResolvedValue({
359
- id: 'test-job-id-123',
360
- opts: {},
361
- });
162
+ describe('call()', () => {
163
+ it('powinien mieć metodę call() zaimplementowaną', () => {
164
+ expect(typeof bus.call).toBe('function');
362
165
  });
363
- it('powinno obsłużyć timeout RPC', () => __awaiter(void 0, void 0, void 0, function* () {
364
- // Given
365
- const handler = jest.fn().mockResolvedValue(42);
366
- const command = new CalculateCommand({ a: 5, b: 3, operation: 'add' });
367
- commandBus.handle(CalculateCommand, handler);
368
- yield waitForWorkerRegistration();
369
- // When & Then
370
- yield expect(commandBus.call(command, 100)) // 100ms timeout
371
- .rejects.toThrow('RPC timeout for command CalculateCommand');
372
- }));
373
- it('powinno mieć metodę call() zaimplementowaną', () => {
374
- // Given
375
- const command = new CalculateCommand({ a: 1, b: 2, operation: 'add' });
376
- // When & Then - metoda call() powinna istnieć
377
- expect(typeof commandBus.call).toBe('function');
378
- // Test że metoda zwraca Promise (ale nie czekamy na wynik)
379
- const result = commandBus.call(command, 100);
166
+ it('powinien zwrócić Promise', () => {
167
+ const cmd = new CalculateCommand({ a: 1, b: 2, operation: 'add' });
168
+ const result = bus.call(cmd, 100);
380
169
  expect(result).toBeInstanceOf(Promise);
381
- // Anuluj Promise żeby nie zaburzyć afterEach
382
- result.catch(() => undefined); // Ignoruj timeout error
170
+ // Cleanup nie czekamy na timeout, ignorujemy error
171
+ result.catch(() => undefined);
383
172
  });
173
+ it('powinien rzucić RPC timeout gdy brak odpowiedzi', () => __awaiter(void 0, void 0, void 0, function* () {
174
+ const cmd = new CalculateCommand({ a: 5, b: 3, operation: 'add' });
175
+ yield expect(bus.call(cmd, 100)).rejects.toThrow('RPC timeout');
176
+ }));
177
+ });
178
+ describe('close()', () => {
179
+ it('powinien zamknąć wszystkie połączenia', () => __awaiter(void 0, void 0, void 0, function* () {
180
+ yield bus.close();
181
+ }));
182
+ it('powinien być idempotentny', () => __awaiter(void 0, void 0, void 0, function* () {
183
+ yield bus.close();
184
+ yield bus.close();
185
+ }));
384
186
  });
385
187
  describe('logLevel filtering', () => {
386
- it('powinno filtrować logi zgodnie z logLevel=error', () => __awaiter(void 0, void 0, void 0, function* () {
387
- // Given - spy na prawdziwy console
188
+ it('powinien filtrować logi zgodnie z logLevel=error', () => __awaiter(void 0, void 0, void 0, function* () {
388
189
  const logSpy = jest.spyOn(console, 'log');
389
190
  const warnSpy = jest.spyOn(console, 'warn');
390
191
  const debugSpy = jest.spyOn(console, 'debug');
391
- // Wyczyść poprzednie wywołania
392
192
  logSpy.mockClear();
393
193
  warnSpy.mockClear();
394
194
  debugSpy.mockClear();
395
195
  try {
396
- // When - utwórz konfigurację z logLevel='error'
397
196
  const errorLevelConfig = new command_bus_config_1.default({
398
- redisUrl: 'redis://localhost:6379',
399
197
  concurrency: 1,
400
198
  logLevel: 'error',
199
+ poolSize: 2,
200
+ maxConcurrentRpc: 5,
401
201
  });
402
202
  const busWithErrorLevel = new index_1.default(errorLevelConfig);
403
- // Then - log(), warn(), debug() NIE powinny być wywołane
404
203
  expect(logSpy).not.toHaveBeenCalled();
405
204
  expect(warnSpy).not.toHaveBeenCalled();
406
205
  expect(debugSpy).not.toHaveBeenCalled();
407
- // Cleanup
408
206
  yield busWithErrorLevel.close();
409
207
  }
410
208
  finally {
411
- // Przywróć spy
412
209
  logSpy.mockRestore();
413
210
  warnSpy.mockRestore();
414
211
  debugSpy.mockRestore();
415
212
  }
416
213
  }));
417
- it('powinno logować wszystkie poziomy przy logLevel=debug', () => __awaiter(void 0, void 0, void 0, function* () {
418
- // Given - spy na prawdziwy console.debug (konstruktor używa logger.debug)
214
+ it('powinien logować debug przy logLevel=debug', () => __awaiter(void 0, void 0, void 0, function* () {
419
215
  const debugSpy = jest.spyOn(console, 'debug');
420
- // Wyczyść poprzednie wywołania
421
216
  debugSpy.mockClear();
422
217
  try {
423
- // When - utwórz konfigurację z logLevel='debug'
424
218
  const debugLevelConfig = new command_bus_config_1.default({
425
- redisUrl: 'redis://localhost:6379',
426
219
  concurrency: 1,
427
220
  logLevel: 'debug',
221
+ poolSize: 2,
222
+ maxConcurrentRpc: 5,
428
223
  });
429
224
  const busWithDebugLevel = new index_1.default(debugLevelConfig);
430
- // Then - debug() powinno być wywołane (konstruktor loguje debug)
431
225
  expect(debugSpy).toHaveBeenCalled();
432
- // Cleanup
433
226
  yield busWithDebugLevel.close();
434
227
  }
435
228
  finally {
436
- // Przywróć spy
437
229
  debugSpy.mockRestore();
438
230
  }
439
231
  }));
440
- it('powinno używać Logger wrapper z BaseConfig', () => {
441
- // Given - konfiguracja domyślna
442
- const testConfig = new command_bus_config_1.default({
443
- redisUrl: 'redis://localhost:6379',
444
- logLevel: 'error',
445
- });
446
- // When - utwórz CommandBus
447
- const testBus = new index_1.default(testConfig);
448
- // Then - logger powinien pochodzić z konfiguracji (nie console)
449
- expect(testBus['logger']).toBe(testConfig.logger);
450
- // Cleanup - bez await żeby test był szybki
451
- testBus.close().catch(() => undefined);
452
- });
453
232
  });
454
233
  });
455
234
  //# sourceMappingURL=command-bus.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"command-bus.spec.js","sourceRoot":"","sources":["../../src/command-bus/command-bus.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command-bus.spec.js","sourceRoot":"","sources":["../../src/command-bus/command-bus.spec.ts"],"names":[],"mappings":"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"}