pp-command-bus 1.4.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 (195) hide show
  1. package/README.md +402 -1113
  2. package/dist/command-bus/command-bus.spec.js +144 -370
  3. package/dist/command-bus/command-bus.spec.js.map +1 -1
  4. package/dist/command-bus/command.d.ts +23 -5
  5. package/dist/command-bus/command.js +20 -34
  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 +49 -14
  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 +9 -80
  78. package/dist/examples/rpc-throughput.demo.js +24 -22
  79. package/dist/examples/rpc-throughput.demo.js.map +1 -1
  80. package/dist/examples/rpc.demo.js +47 -53
  81. package/dist/examples/rpc.demo.js.map +1 -1
  82. package/dist/index.d.ts +8 -5
  83. package/dist/index.js +6 -4
  84. package/dist/index.js.map +1 -1
  85. package/dist/pp-command-bus-2.0.0.tgz +0 -0
  86. package/dist/shared/redis/connection-pool.d.ts +54 -0
  87. package/dist/shared/redis/connection-pool.js +117 -0
  88. package/dist/shared/redis/connection-pool.js.map +1 -0
  89. package/dist/shared/redis/connection-pool.spec.js +114 -0
  90. package/dist/shared/redis/connection-pool.spec.js.map +1 -0
  91. package/dist/shared/redis/index.d.ts +5 -3
  92. package/dist/shared/redis/index.js +6 -4
  93. package/dist/shared/redis/index.js.map +1 -1
  94. package/dist/shared/redis/rpc-connection-pool.d.ts +61 -0
  95. package/dist/shared/redis/rpc-connection-pool.js +154 -0
  96. package/dist/shared/redis/rpc-connection-pool.js.map +1 -0
  97. package/dist/shared/redis/rpc-connection-pool.spec.d.ts +1 -0
  98. package/dist/shared/redis/rpc-connection-pool.spec.js +173 -0
  99. package/dist/shared/redis/rpc-connection-pool.spec.js.map +1 -0
  100. package/dist/shared/types.d.ts +0 -4
  101. package/dist/shared/utils/error-utils.d.ts +8 -0
  102. package/dist/shared/utils/error-utils.js +14 -0
  103. package/dist/shared/utils/error-utils.js.map +1 -0
  104. package/package.json +12 -12
  105. package/dist/command-bus/config/auto-config-optimizer.d.ts +0 -35
  106. package/dist/command-bus/config/auto-config-optimizer.js +0 -52
  107. package/dist/command-bus/config/auto-config-optimizer.js.map +0 -1
  108. package/dist/command-bus/config/auto-config-optimizer.spec.js +0 -42
  109. package/dist/command-bus/config/auto-config-optimizer.spec.js.map +0 -1
  110. package/dist/command-bus/job/index.d.ts +0 -6
  111. package/dist/command-bus/job/index.js +0 -15
  112. package/dist/command-bus/job/index.js.map +0 -1
  113. package/dist/command-bus/job/job-options-builder.d.ts +0 -21
  114. package/dist/command-bus/job/job-options-builder.js +0 -58
  115. package/dist/command-bus/job/job-options-builder.js.map +0 -1
  116. package/dist/command-bus/job/job-options-builder.spec.js +0 -156
  117. package/dist/command-bus/job/job-options-builder.spec.js.map +0 -1
  118. package/dist/command-bus/job/job-processor.d.ts +0 -39
  119. package/dist/command-bus/job/job-processor.js +0 -203
  120. package/dist/command-bus/job/job-processor.js.map +0 -1
  121. package/dist/command-bus/job/job-processor.spec.js +0 -437
  122. package/dist/command-bus/job/job-processor.spec.js.map +0 -1
  123. package/dist/command-bus/queue/index.d.ts +0 -5
  124. package/dist/command-bus/queue/index.js +0 -13
  125. package/dist/command-bus/queue/index.js.map +0 -1
  126. package/dist/command-bus/queue/queue-manager.d.ts +0 -56
  127. package/dist/command-bus/queue/queue-manager.js +0 -163
  128. package/dist/command-bus/queue/queue-manager.js.map +0 -1
  129. package/dist/command-bus/queue/queue-manager.spec.js +0 -371
  130. package/dist/command-bus/queue/queue-manager.spec.js.map +0 -1
  131. package/dist/command-bus/rpc/index.d.ts +0 -11
  132. package/dist/command-bus/rpc/index.js +0 -19
  133. package/dist/command-bus/rpc/index.js.map +0 -1
  134. package/dist/command-bus/rpc/payload-compression.service.d.ts +0 -51
  135. package/dist/command-bus/rpc/payload-compression.service.js +0 -218
  136. package/dist/command-bus/rpc/payload-compression.service.js.map +0 -1
  137. package/dist/command-bus/rpc/payload-compression.service.spec.js +0 -379
  138. package/dist/command-bus/rpc/payload-compression.service.spec.js.map +0 -1
  139. package/dist/command-bus/rpc/rpc-coordinator.d.ts +0 -96
  140. package/dist/command-bus/rpc/rpc-coordinator.js +0 -500
  141. package/dist/command-bus/rpc/rpc-coordinator.js.map +0 -1
  142. package/dist/command-bus/rpc/rpc-coordinator.spec.js +0 -622
  143. package/dist/command-bus/rpc/rpc-coordinator.spec.js.map +0 -1
  144. package/dist/command-bus/rpc/rpc-job-cancellation.service.d.ts +0 -82
  145. package/dist/command-bus/rpc/rpc-job-cancellation.service.js +0 -180
  146. package/dist/command-bus/rpc/rpc-job-cancellation.service.js.map +0 -1
  147. package/dist/command-bus/rpc/rpc-job-cancellation.service.spec.js +0 -286
  148. package/dist/command-bus/rpc/rpc-job-cancellation.service.spec.js.map +0 -1
  149. package/dist/command-bus/worker/index.d.ts +0 -10
  150. package/dist/command-bus/worker/index.js +0 -19
  151. package/dist/command-bus/worker/index.js.map +0 -1
  152. package/dist/command-bus/worker/worker-benchmark.d.ts +0 -71
  153. package/dist/command-bus/worker/worker-benchmark.js +0 -203
  154. package/dist/command-bus/worker/worker-benchmark.js.map +0 -1
  155. package/dist/command-bus/worker/worker-benchmark.spec.js +0 -310
  156. package/dist/command-bus/worker/worker-benchmark.spec.js.map +0 -1
  157. package/dist/command-bus/worker/worker-metrics-collector.d.ts +0 -98
  158. package/dist/command-bus/worker/worker-metrics-collector.js +0 -242
  159. package/dist/command-bus/worker/worker-metrics-collector.js.map +0 -1
  160. package/dist/command-bus/worker/worker-orchestrator.d.ts +0 -70
  161. package/dist/command-bus/worker/worker-orchestrator.js +0 -339
  162. package/dist/command-bus/worker/worker-orchestrator.js.map +0 -1
  163. package/dist/command-bus/worker/worker-orchestrator.spec.js +0 -712
  164. package/dist/command-bus/worker/worker-orchestrator.spec.js.map +0 -1
  165. package/dist/examples/auto-config.demo.d.ts +0 -9
  166. package/dist/examples/auto-config.demo.js +0 -106
  167. package/dist/examples/auto-config.demo.js.map +0 -1
  168. package/dist/examples/rpc-compression.demo.d.ts +0 -5
  169. package/dist/examples/rpc-compression.demo.js +0 -363
  170. package/dist/examples/rpc-compression.demo.js.map +0 -1
  171. package/dist/examples/rpc-resilience.demo.d.ts +0 -11
  172. package/dist/examples/rpc-resilience.demo.js +0 -235
  173. package/dist/examples/rpc-resilience.demo.js.map +0 -1
  174. package/dist/pp-command-bus-1.4.0.tgz +0 -0
  175. package/dist/shared/config/base-config.d.ts +0 -54
  176. package/dist/shared/config/base-config.js +0 -114
  177. package/dist/shared/config/base-config.js.map +0 -1
  178. package/dist/shared/config/base-config.spec.js +0 -204
  179. package/dist/shared/config/base-config.spec.js.map +0 -1
  180. package/dist/shared/config/index.d.ts +0 -1
  181. package/dist/shared/config/index.js +0 -9
  182. package/dist/shared/config/index.js.map +0 -1
  183. package/dist/shared/redis/redis-connection-factory.d.ts +0 -66
  184. package/dist/shared/redis/redis-connection-factory.js +0 -113
  185. package/dist/shared/redis/redis-connection-factory.js.map +0 -1
  186. /package/dist/command-bus/{config/auto-config-optimizer.spec.d.ts → serialization/msgpack-serializer.spec.d.ts} +0 -0
  187. /package/dist/command-bus/{job/job-options-builder.spec.d.ts → transport/consumer-loop.spec.d.ts} +0 -0
  188. /package/dist/command-bus/{job/job-processor.spec.d.ts → transport/message-processor.spec.d.ts} +0 -0
  189. /package/dist/command-bus/{queue/queue-manager.spec.d.ts → transport/pending-recovery.spec.d.ts} +0 -0
  190. /package/dist/command-bus/{rpc/payload-compression.service.spec.d.ts → transport/redis-codec.spec.d.ts} +0 -0
  191. /package/dist/command-bus/{rpc/rpc-coordinator.spec.d.ts → transport/redis-streams-transport.spec.d.ts} +0 -0
  192. /package/dist/command-bus/{rpc/rpc-job-cancellation.service.spec.d.ts → transport/rpc-handler.spec.d.ts} +0 -0
  193. /package/dist/command-bus/{worker/worker-benchmark.spec.d.ts → transport/stream-consumer.spec.d.ts} +0 -0
  194. /package/dist/command-bus/{worker/worker-orchestrator.spec.d.ts → transport/stream-producer.spec.d.ts} +0 -0
  195. /package/dist/shared/{config/base-config.spec.d.ts → redis/connection-pool.spec.d.ts} +0 -0
@@ -1,156 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const job_options_builder_1 = __importDefault(require("./job-options-builder"));
7
- const command_bus_config_1 = __importDefault(require("../config/command-bus-config"));
8
- describe('JobOptionsBuilder', () => {
9
- describe('buildStandardOptions', () => {
10
- it('powinien zwrócić standardowe opcje z domyślną konfiguracją', () => {
11
- const config = new command_bus_config_1.default({
12
- redisUrl: 'redis://localhost:6379',
13
- maxAttempts: 1,
14
- backoffDelay: 2000,
15
- queueMode: 'fifo',
16
- });
17
- const builder = new job_options_builder_1.default(config);
18
- const options = builder.buildStandardOptions();
19
- expect(options).toEqual({
20
- removeOnComplete: {
21
- count: 100,
22
- age: 60, // Memory optimization: 60s
23
- },
24
- removeOnFail: {
25
- count: 500, // Memory optimization: więcej dla debugging
26
- age: 3600, // Memory optimization: 1h
27
- },
28
- attempts: 1,
29
- backoff: {
30
- type: 'exponential',
31
- delay: 2000,
32
- },
33
- lifo: false,
34
- });
35
- });
36
- it('powinien zwrócić opcje z LIFO gdy queueMode = "lifo"', () => {
37
- const config = new command_bus_config_1.default({
38
- redisUrl: 'redis://localhost:6379',
39
- maxAttempts: 5,
40
- backoffDelay: 1000,
41
- queueMode: 'lifo',
42
- });
43
- const builder = new job_options_builder_1.default(config);
44
- const options = builder.buildStandardOptions();
45
- expect(options.lifo).toBe(true);
46
- expect(options.attempts).toBe(5);
47
- expect(options.backoff.delay).toBe(1000);
48
- });
49
- it('powinien używać wartości z konfiguracji dla attempts i backoff', () => {
50
- const config = new command_bus_config_1.default({
51
- redisUrl: 'redis://localhost:6379',
52
- maxAttempts: 10,
53
- backoffDelay: 5000,
54
- queueMode: 'fifo',
55
- });
56
- const builder = new job_options_builder_1.default(config);
57
- const options = builder.buildStandardOptions();
58
- expect(options.attempts).toBe(10);
59
- expect(options.backoff).toEqual({
60
- type: 'exponential',
61
- delay: 5000,
62
- });
63
- });
64
- });
65
- describe('buildRpcReplyOptions', () => {
66
- it('powinien zwrócić opcje RPC reply z domyślnym TTL', () => {
67
- const config = new command_bus_config_1.default({
68
- redisUrl: 'redis://localhost:6379',
69
- maxAttempts: 1,
70
- backoffDelay: 2000,
71
- });
72
- const builder = new job_options_builder_1.default(config);
73
- const options = builder.buildRpcReplyOptions();
74
- expect(options).toEqual({
75
- removeOnComplete: {
76
- age: 30, // Memory optimization: agresywne usuwanie reply jobs
77
- count: 10, // Memory optimization: tylko ostatnie 10
78
- },
79
- removeOnFail: {
80
- age: 300, // Memory optimization: 5 minut
81
- count: 50, // Memory optimization: mniej failed jobs
82
- },
83
- attempts: 1,
84
- backoff: {
85
- type: 'exponential',
86
- delay: 2000,
87
- },
88
- lifo: false,
89
- });
90
- });
91
- it('powinien używać stałego czasu usuwania dla memory optimization', () => {
92
- const config = new command_bus_config_1.default({
93
- redisUrl: 'redis://localhost:6379',
94
- maxAttempts: 5,
95
- backoffDelay: 1000,
96
- });
97
- const builder = new job_options_builder_1.default(config);
98
- const options = builder.buildRpcReplyOptions();
99
- // Memory optimization: zawsze używamy 30s dla agresywnego cleanup
100
- expect(options.removeOnComplete).toEqual({
101
- age: 30, // Memory optimization: stałe 30s niezależnie od config
102
- count: 10, // Memory optimization: tylko ostatnie 10
103
- });
104
- });
105
- it('powinien zawsze zwracać lifo = false dla RPC reply', () => {
106
- const config = new command_bus_config_1.default({
107
- redisUrl: 'redis://localhost:6379',
108
- queueMode: 'lifo', // LIFO dla standardowych jobów
109
- });
110
- const builder = new job_options_builder_1.default(config);
111
- const options = builder.buildRpcReplyOptions();
112
- // RPC reply zawsze używa FIFO (lifo = false)
113
- expect(options.lifo).toBe(false);
114
- });
115
- it('powinien używać wartości z konfiguracji dla attempts i backoff', () => {
116
- const config = new command_bus_config_1.default({
117
- redisUrl: 'redis://localhost:6379',
118
- maxAttempts: 7,
119
- backoffDelay: 3000,
120
- });
121
- const builder = new job_options_builder_1.default(config);
122
- const options = builder.buildRpcReplyOptions();
123
- expect(options.attempts).toBe(7);
124
- expect(options.backoff).toEqual({
125
- type: 'exponential',
126
- delay: 3000,
127
- });
128
- });
129
- });
130
- describe('edge cases', () => {
131
- it('powinien działać z minimalną konfiguracją', () => {
132
- const config = new command_bus_config_1.default({
133
- redisUrl: 'redis://localhost:6379',
134
- });
135
- const builder = new job_options_builder_1.default(config);
136
- const standardOptions = builder.buildStandardOptions();
137
- const rpcOptions = builder.buildRpcReplyOptions();
138
- expect(standardOptions.attempts).toBeGreaterThanOrEqual(1);
139
- expect(standardOptions.backoff.delay).toBeGreaterThanOrEqual(100);
140
- expect(rpcOptions.attempts).toBeGreaterThanOrEqual(1);
141
- });
142
- it('powinien używać stałego TTL dla memory optimization', () => {
143
- const config = new command_bus_config_1.default({
144
- redisUrl: 'redis://localhost:6379',
145
- });
146
- const builder = new job_options_builder_1.default(config);
147
- const options = builder.buildRpcReplyOptions();
148
- // Memory optimization: zawsze używamy stałego 30s niezależnie od config
149
- expect(options.removeOnComplete).toEqual({
150
- age: 30, // Memory optimization: stałe 30s
151
- count: 10, // Memory optimization: tylko ostatnie 10
152
- });
153
- });
154
- });
155
- });
156
- //# sourceMappingURL=job-options-builder.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"job-options-builder.spec.js","sourceRoot":"","sources":["../../../src/command-bus/job/job-options-builder.spec.ts"],"names":[],"mappings":"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"}
@@ -1,39 +0,0 @@
1
- import type { Job } from 'bullmq';
2
- import type { Redis } from 'ioredis';
3
- import type { TDict, ILogger } from '../../shared/types';
4
- import type JobOptionsBuilder from './job-options-builder';
5
- import type CommandLogger from '../logging/command-logger';
6
- import type PayloadCompressionService from '../rpc/payload-compression.service';
7
- import type RpcJobCancellationService from '../rpc/rpc-job-cancellation.service';
8
- /**
9
- * Przetwarza joby z kolejek BullMQ
10
- * Odpowiada za wykonanie handlerów komend i obsługę odpowiedzi RPC przez Redis Pub/Sub
11
- */
12
- export default class JobProcessor {
13
- private readonly commandHandlers;
14
- private readonly redisConnection;
15
- private readonly logger;
16
- private readonly jobOptionsBuilder;
17
- private readonly compressionService;
18
- private readonly commandLogger?;
19
- private readonly cancellationService?;
20
- constructor(commandHandlers: TDict<(command: any) => unknown | Promise<unknown>>, redisConnection: Redis, logger: ILogger, jobOptionsBuilder: JobOptionsBuilder, compressionService: PayloadCompressionService, commandLogger?: CommandLogger | undefined, cancellationService?: RpcJobCancellationService | undefined);
21
- /**
22
- * Przetwarza job z kolejki
23
- * Automatycznie dekompresuje dane jeśli są skompresowane
24
- * @param job - Job do przetworzenia
25
- * @param commandName - Nazwa komendy
26
- */
27
- process(job: Job, commandName: string): Promise<unknown>;
28
- /**
29
- * Wysyła odpowiedź RPC do nadawcy przez Redis Pub/Sub z kompresją gzip
30
- * Publikuje na dedykowanym kanale dla tego wywołania RPC
31
- * Wrapper zawiera metadane kompresji dla klienta
32
- */
33
- private sendRpcResponse;
34
- /**
35
- * Wysyła błąd RPC do nadawcy przez Redis Pub/Sub
36
- * Publikuje na dedykowanym kanale dla tego wywołania RPC
37
- */
38
- private sendRpcError;
39
- }
@@ -1,203 +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
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const command_1 = __importDefault(require("../command"));
16
- /**
17
- * Przetwarza joby z kolejek BullMQ
18
- * Odpowiada za wykonanie handlerów komend i obsługę odpowiedzi RPC przez Redis Pub/Sub
19
- */
20
- class JobProcessor {
21
- constructor(
22
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
- commandHandlers, redisConnection, logger, jobOptionsBuilder, compressionService, commandLogger, cancellationService) {
24
- this.commandHandlers = commandHandlers;
25
- this.redisConnection = redisConnection;
26
- this.logger = logger;
27
- this.jobOptionsBuilder = jobOptionsBuilder;
28
- this.compressionService = compressionService;
29
- this.commandLogger = commandLogger;
30
- this.cancellationService = cancellationService;
31
- }
32
- /**
33
- * Przetwarza job z kolejki
34
- * Automatycznie dekompresuje dane jeśli są skompresowane
35
- * @param job - Job do przetworzenia
36
- * @param commandName - Nazwa komendy
37
- */
38
- process(job, commandName) {
39
- return __awaiter(this, void 0, void 0, function* () {
40
- var _a, _b;
41
- let command = job.data;
42
- const rpcMetadata = job.data.__rpcMetadata;
43
- const startTime = Date.now();
44
- // Sprawdź czy dane są skompresowane
45
- const isCompressed = !!job.data.__compressed;
46
- this.logger.debug('Rozpoczynam przetwarzanie komendy', {
47
- commandName,
48
- commandId: command.__id,
49
- jobId: job.id,
50
- attempt: job.attemptsMade + 1,
51
- maxAttempts: (_a = job.opts) === null || _a === void 0 ? void 0 : _a.attempts,
52
- isRpc: !!rpcMetadata,
53
- isCompressed,
54
- responseChannel: rpcMetadata === null || rpcMetadata === void 0 ? void 0 : rpcMetadata.responseChannel,
55
- timestamp: new Date().toISOString(),
56
- });
57
- try {
58
- // Dekompresuj dane jeśli są skompresowane
59
- if (isCompressed) {
60
- command = yield this.compressionService.decompressCommand(command);
61
- this.logger.debug('Komenda zdekompresowana przed przetwarzaniem', {
62
- commandName,
63
- commandId: command.__id,
64
- jobId: job.id,
65
- timestamp: new Date().toISOString(),
66
- });
67
- }
68
- // Sprawdź czy RPC zostało anulowane (tylko dla RPC jobs)
69
- if ((rpcMetadata === null || rpcMetadata === void 0 ? void 0 : rpcMetadata.correlationId) && this.cancellationService) {
70
- const isCancelled = yield this.cancellationService.isCancelled(rpcMetadata.correlationId);
71
- if (isCancelled) {
72
- this.logger.warn('Pomijam przetwarzanie - RPC zostało anulowane (timeout)', {
73
- commandName,
74
- correlationId: rpcMetadata.correlationId,
75
- jobId: job.id,
76
- timestamp: new Date().toISOString(),
77
- });
78
- // Wyczyść flagę cancellation (optymalizacja - nie jest konieczne, TTL i tak wygaśnie)
79
- yield this.cancellationService.clearCancellation(rpcMetadata.correlationId);
80
- return; // Nie wykonuj handlera, nie wysyłaj odpowiedzi
81
- }
82
- }
83
- // Przywróć obiekty Date z serializowanych danych
84
- command = command_1.default.reconstructDates(command);
85
- // Opcjonalne logowanie komendy
86
- if (this.commandLogger) {
87
- yield this.commandLogger.logCommand(command);
88
- }
89
- const handler = this.commandHandlers[commandName];
90
- if (!handler) {
91
- this.logger.error('Brak handlera dla komendy', {
92
- commandName,
93
- commandId: command.__id,
94
- jobId: job.id,
95
- });
96
- throw new Error(`Brak handlera dla komendy ${commandName}`);
97
- }
98
- this.logger.debug('Wywołuję handler komendy', {
99
- commandName,
100
- commandId: command.__id,
101
- jobId: job.id,
102
- timestamp: new Date().toISOString(),
103
- });
104
- // Zwróć wartość z handlera
105
- const result = yield handler(command);
106
- const duration = Date.now() - startTime;
107
- this.logger.log('Handler komendy wykonany pomyślnie', {
108
- commandName,
109
- commandId: command.__id,
110
- jobId: job.id,
111
- duration: `${duration}ms`,
112
- hasResult: result !== undefined,
113
- timestamp: new Date().toISOString(),
114
- });
115
- // Jeśli to RPC, odeślij odpowiedź przez Redis Pub/Sub
116
- if (rpcMetadata === null || rpcMetadata === void 0 ? void 0 : rpcMetadata.responseChannel) {
117
- yield this.sendRpcResponse(rpcMetadata, result, null, commandName);
118
- }
119
- return result;
120
- }
121
- catch (error) {
122
- const duration = Date.now() - startTime;
123
- this.logger.error('Błąd podczas wykonywania handlera komendy', {
124
- commandName,
125
- commandId: command.__id,
126
- jobId: job.id,
127
- error: error instanceof Error ? error.message : String(error),
128
- duration: `${duration}ms`,
129
- attempt: job.attemptsMade + 1,
130
- maxAttempts: (_b = job.opts) === null || _b === void 0 ? void 0 : _b.attempts,
131
- timestamp: new Date().toISOString(),
132
- });
133
- // Jeśli to RPC, odeślij błąd przez Redis Pub/Sub
134
- if (rpcMetadata === null || rpcMetadata === void 0 ? void 0 : rpcMetadata.responseChannel) {
135
- yield this.sendRpcError(rpcMetadata, error, commandName);
136
- }
137
- throw error;
138
- }
139
- });
140
- }
141
- /**
142
- * Wysyła odpowiedź RPC do nadawcy przez Redis Pub/Sub z kompresją gzip
143
- * Publikuje na dedykowanym kanale dla tego wywołania RPC
144
- * Wrapper zawiera metadane kompresji dla klienta
145
- */
146
- sendRpcResponse(rpcMetadata, result, error, commandName) {
147
- return __awaiter(this, void 0, void 0, function* () {
148
- try {
149
- // Przygotuj payload do kompresji
150
- const payload = {
151
- correlationId: rpcMetadata.correlationId,
152
- result,
153
- error,
154
- };
155
- this.logger.debug('Przygotowywanie odpowiedzi RPC - payload', {
156
- commandName,
157
- correlationId: rpcMetadata.correlationId,
158
- resultType: typeof result,
159
- resultValue: result,
160
- errorType: typeof error,
161
- errorValue: error,
162
- timestamp: new Date().toISOString(),
163
- });
164
- // Kompresuj payload jeśli przekracza threshold
165
- const { data, compressed } = yield this.compressionService.compress(payload);
166
- // Opakuj w wrapper z metadanymi kompresji
167
- const wrapper = JSON.stringify({
168
- data,
169
- compressed,
170
- });
171
- // Publikuj odpowiedź na kanale Redis Pub/Sub
172
- yield this.redisConnection.publish(rpcMetadata.responseChannel, wrapper);
173
- this.logger.debug('Odpowiedź RPC opublikowana przez Pub/Sub', {
174
- commandName,
175
- correlationId: rpcMetadata.correlationId,
176
- responseChannel: rpcMetadata.responseChannel,
177
- compressed,
178
- timestamp: new Date().toISOString(),
179
- });
180
- }
181
- catch (publishError) {
182
- this.logger.error('Nie udało się opublikować odpowiedzi RPC', {
183
- commandName,
184
- correlationId: rpcMetadata.correlationId,
185
- responseChannel: rpcMetadata.responseChannel,
186
- error: publishError instanceof Error ? publishError.message : String(publishError),
187
- timestamp: new Date().toISOString(),
188
- });
189
- }
190
- });
191
- }
192
- /**
193
- * Wysyła błąd RPC do nadawcy przez Redis Pub/Sub
194
- * Publikuje na dedykowanym kanale dla tego wywołania RPC
195
- */
196
- sendRpcError(rpcMetadata, error, commandName) {
197
- return __awaiter(this, void 0, void 0, function* () {
198
- yield this.sendRpcResponse(rpcMetadata, null, error instanceof Error ? error.message : String(error), commandName);
199
- });
200
- }
201
- }
202
- exports.default = JobProcessor;
203
- //# sourceMappingURL=job-processor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"job-processor.js","sourceRoot":"","sources":["../../../src/command-bus/job/job-processor.ts"],"names":[],"mappings":"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"}