pp-command-bus 1.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 (105) hide show
  1. package/README.md +522 -0
  2. package/dist/command-bus/command-bus.spec.d.ts +1 -0
  3. package/dist/command-bus/command-bus.spec.js +398 -0
  4. package/dist/command-bus/command-bus.spec.js.map +1 -0
  5. package/dist/command-bus/command.d.ts +24 -0
  6. package/dist/command-bus/command.js +53 -0
  7. package/dist/command-bus/command.js.map +1 -0
  8. package/dist/command-bus/config/command-bus-config.d.ts +40 -0
  9. package/dist/command-bus/config/command-bus-config.js +59 -0
  10. package/dist/command-bus/config/command-bus-config.js.map +1 -0
  11. package/dist/command-bus/config/command-bus-config.spec.d.ts +1 -0
  12. package/dist/command-bus/config/command-bus-config.spec.js +162 -0
  13. package/dist/command-bus/config/command-bus-config.spec.js.map +1 -0
  14. package/dist/command-bus/config/index.d.ts +1 -0
  15. package/dist/command-bus/config/index.js +9 -0
  16. package/dist/command-bus/config/index.js.map +1 -0
  17. package/dist/command-bus/index.d.ts +79 -0
  18. package/dist/command-bus/index.js +169 -0
  19. package/dist/command-bus/index.js.map +1 -0
  20. package/dist/command-bus/job/index.d.ts +6 -0
  21. package/dist/command-bus/job/index.js +15 -0
  22. package/dist/command-bus/job/index.js.map +1 -0
  23. package/dist/command-bus/job/job-options-builder.d.ts +24 -0
  24. package/dist/command-bus/job/job-options-builder.js +68 -0
  25. package/dist/command-bus/job/job-options-builder.js.map +1 -0
  26. package/dist/command-bus/job/job-options-builder.spec.d.ts +1 -0
  27. package/dist/command-bus/job/job-options-builder.spec.js +163 -0
  28. package/dist/command-bus/job/job-options-builder.spec.js.map +1 -0
  29. package/dist/command-bus/job/job-processor.d.ts +33 -0
  30. package/dist/command-bus/job/job-processor.js +195 -0
  31. package/dist/command-bus/job/job-processor.js.map +1 -0
  32. package/dist/command-bus/job/job-processor.spec.d.ts +1 -0
  33. package/dist/command-bus/job/job-processor.spec.js +352 -0
  34. package/dist/command-bus/job/job-processor.spec.js.map +1 -0
  35. package/dist/command-bus/logging/command-logger.d.ts +21 -0
  36. package/dist/command-bus/logging/command-logger.js +79 -0
  37. package/dist/command-bus/logging/command-logger.js.map +1 -0
  38. package/dist/command-bus/logging/command-logger.spec.d.ts +1 -0
  39. package/dist/command-bus/logging/command-logger.spec.js +245 -0
  40. package/dist/command-bus/logging/command-logger.spec.js.map +1 -0
  41. package/dist/command-bus/logging/index.d.ts +5 -0
  42. package/dist/command-bus/logging/index.js +13 -0
  43. package/dist/command-bus/logging/index.js.map +1 -0
  44. package/dist/command-bus/queue/index.d.ts +5 -0
  45. package/dist/command-bus/queue/index.js +13 -0
  46. package/dist/command-bus/queue/index.js.map +1 -0
  47. package/dist/command-bus/queue/queue-manager.d.ts +24 -0
  48. package/dist/command-bus/queue/queue-manager.js +60 -0
  49. package/dist/command-bus/queue/queue-manager.js.map +1 -0
  50. package/dist/command-bus/queue/queue-manager.spec.d.ts +1 -0
  51. package/dist/command-bus/queue/queue-manager.spec.js +219 -0
  52. package/dist/command-bus/queue/queue-manager.spec.js.map +1 -0
  53. package/dist/command-bus/rpc/index.d.ts +5 -0
  54. package/dist/command-bus/rpc/index.js +13 -0
  55. package/dist/command-bus/rpc/index.js.map +1 -0
  56. package/dist/command-bus/rpc/rpc-coordinator.d.ts +45 -0
  57. package/dist/command-bus/rpc/rpc-coordinator.js +189 -0
  58. package/dist/command-bus/rpc/rpc-coordinator.js.map +1 -0
  59. package/dist/command-bus/rpc/rpc-coordinator.spec.d.ts +1 -0
  60. package/dist/command-bus/rpc/rpc-coordinator.spec.js +286 -0
  61. package/dist/command-bus/rpc/rpc-coordinator.spec.js.map +1 -0
  62. package/dist/command-bus/types/index.d.ts +57 -0
  63. package/dist/command-bus/types/index.js +3 -0
  64. package/dist/command-bus/types/index.js.map +1 -0
  65. package/dist/command-bus/worker/index.d.ts +5 -0
  66. package/dist/command-bus/worker/index.js +13 -0
  67. package/dist/command-bus/worker/index.js.map +1 -0
  68. package/dist/command-bus/worker/worker-orchestrator.d.ts +46 -0
  69. package/dist/command-bus/worker/worker-orchestrator.js +160 -0
  70. package/dist/command-bus/worker/worker-orchestrator.js.map +1 -0
  71. package/dist/command-bus/worker/worker-orchestrator.spec.d.ts +1 -0
  72. package/dist/command-bus/worker/worker-orchestrator.spec.js +293 -0
  73. package/dist/command-bus/worker/worker-orchestrator.spec.js.map +1 -0
  74. package/dist/examples/rpc.demo.d.ts +2 -0
  75. package/dist/examples/rpc.demo.js +235 -0
  76. package/dist/examples/rpc.demo.js.map +1 -0
  77. package/dist/index.d.ts +11 -0
  78. package/dist/index.js +20 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/pp-command-bus-1.0.0.tgz +0 -0
  81. package/dist/shared/config/base-config.d.ts +43 -0
  82. package/dist/shared/config/base-config.js +100 -0
  83. package/dist/shared/config/base-config.js.map +1 -0
  84. package/dist/shared/config/base-config.spec.d.ts +1 -0
  85. package/dist/shared/config/base-config.spec.js +118 -0
  86. package/dist/shared/config/base-config.spec.js.map +1 -0
  87. package/dist/shared/config/index.d.ts +1 -0
  88. package/dist/shared/config/index.js +9 -0
  89. package/dist/shared/config/index.js.map +1 -0
  90. package/dist/shared/logging/index.d.ts +2 -0
  91. package/dist/shared/logging/index.js +8 -0
  92. package/dist/shared/logging/index.js.map +1 -0
  93. package/dist/shared/logging/log-level.d.ts +36 -0
  94. package/dist/shared/logging/log-level.js +53 -0
  95. package/dist/shared/logging/log-level.js.map +1 -0
  96. package/dist/shared/logging/logger.d.ts +42 -0
  97. package/dist/shared/logging/logger.js +63 -0
  98. package/dist/shared/logging/logger.js.map +1 -0
  99. package/dist/shared/logging/logger.spec.d.ts +1 -0
  100. package/dist/shared/logging/logger.spec.js +89 -0
  101. package/dist/shared/logging/logger.spec.js.map +1 -0
  102. package/dist/shared/types.d.ts +26 -0
  103. package/dist/shared/types.js +6 -0
  104. package/dist/shared/types.js.map +1 -0
  105. package/package.json +93 -0
@@ -0,0 +1,163 @@
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: 3,
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: 3,
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: 3,
70
+ backoffDelay: 2000,
71
+ rpcReplyTtl: 60000, // 1 minuta
72
+ });
73
+ const builder = new job_options_builder_1.default(config);
74
+ const options = builder.buildRpcReplyOptions();
75
+ expect(options).toEqual({
76
+ removeOnComplete: {
77
+ age: 30, // Memory optimization: agresywne usuwanie reply jobs
78
+ count: 10, // Memory optimization: tylko ostatnie 10
79
+ },
80
+ removeOnFail: {
81
+ age: 300, // Memory optimization: 5 minut
82
+ count: 50, // Memory optimization: mniej failed jobs
83
+ },
84
+ attempts: 3,
85
+ backoff: {
86
+ type: 'exponential',
87
+ delay: 2000,
88
+ },
89
+ lifo: false,
90
+ });
91
+ });
92
+ it('powinien używać custom rpcReplyTtl z konfiguracji', () => {
93
+ const config = new command_bus_config_1.default({
94
+ redisUrl: 'redis://localhost:6379',
95
+ maxAttempts: 5,
96
+ backoffDelay: 1000,
97
+ rpcReplyTtl: 120000, // 2 minuty
98
+ });
99
+ const builder = new job_options_builder_1.default(config);
100
+ const options = builder.buildRpcReplyOptions();
101
+ // Memory optimization: rpcReplyTtl nie jest już używany
102
+ // Zawsze używamy 30s dla agresywnego cleanup
103
+ expect(options.removeOnComplete).toEqual({
104
+ age: 30, // Memory optimization: stałe 30s niezależnie od config
105
+ count: 10, // Memory optimization: tylko ostatnie 10
106
+ });
107
+ });
108
+ it('powinien zawsze zwracać lifo = false dla RPC reply', () => {
109
+ const config = new command_bus_config_1.default({
110
+ redisUrl: 'redis://localhost:6379',
111
+ queueMode: 'lifo', // LIFO dla standardowych jobów
112
+ rpcReplyTtl: 60000,
113
+ });
114
+ const builder = new job_options_builder_1.default(config);
115
+ const options = builder.buildRpcReplyOptions();
116
+ // RPC reply zawsze używa FIFO (lifo = false)
117
+ expect(options.lifo).toBe(false);
118
+ });
119
+ it('powinien używać wartości z konfiguracji dla attempts i backoff', () => {
120
+ const config = new command_bus_config_1.default({
121
+ redisUrl: 'redis://localhost:6379',
122
+ maxAttempts: 7,
123
+ backoffDelay: 3000,
124
+ rpcReplyTtl: 90000,
125
+ });
126
+ const builder = new job_options_builder_1.default(config);
127
+ const options = builder.buildRpcReplyOptions();
128
+ expect(options.attempts).toBe(7);
129
+ expect(options.backoff).toEqual({
130
+ type: 'exponential',
131
+ delay: 3000,
132
+ });
133
+ });
134
+ });
135
+ describe('edge cases', () => {
136
+ it('powinien działać z minimalną konfiguracją', () => {
137
+ const config = new command_bus_config_1.default({
138
+ redisUrl: 'redis://localhost:6379',
139
+ });
140
+ const builder = new job_options_builder_1.default(config);
141
+ const standardOptions = builder.buildStandardOptions();
142
+ const rpcOptions = builder.buildRpcReplyOptions();
143
+ expect(standardOptions.attempts).toBeGreaterThanOrEqual(1);
144
+ expect(standardOptions.backoff.delay).toBeGreaterThanOrEqual(100);
145
+ expect(rpcOptions.attempts).toBeGreaterThanOrEqual(1);
146
+ });
147
+ it('powinien konwertować rpcReplyTtl z ms na sekundy dla BullMQ', () => {
148
+ const config = new command_bus_config_1.default({
149
+ redisUrl: 'redis://localhost:6379',
150
+ rpcReplyTtl: 5000, // 5 sekund w ms
151
+ });
152
+ const builder = new job_options_builder_1.default(config);
153
+ const options = builder.buildRpcReplyOptions();
154
+ // Memory optimization: rpcReplyTtl już nie wpływa na removeOnComplete
155
+ // Zawsze używamy stałego 30s niezależnie od config
156
+ expect(options.removeOnComplete).toEqual({
157
+ age: 30, // Memory optimization: stałe 30s
158
+ count: 10, // Memory optimization: tylko ostatnie 10
159
+ });
160
+ });
161
+ });
162
+ });
163
+ //# sourceMappingURL=job-options-builder.spec.js.map
@@ -0,0 +1 @@
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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"}
@@ -0,0 +1,33 @@
1
+ import type { Job } from 'bullmq';
2
+ import type { TDict, ILogger } from '../../shared/types';
3
+ import type QueueManager from '../queue/queue-manager';
4
+ import type JobOptionsBuilder from './job-options-builder';
5
+ import type CommandLogger from '../logging/command-logger';
6
+ /**
7
+ * Przetwarza joby z kolejek BullMQ
8
+ * Odpowiada za wykonanie handlerów komend i obsługę odpowiedzi RPC
9
+ */
10
+ export default class JobProcessor {
11
+ private readonly commandHandlers;
12
+ private readonly queueManager;
13
+ private readonly logger;
14
+ private readonly jobOptionsBuilder;
15
+ private readonly commandLogger?;
16
+ constructor(commandHandlers: TDict<(command: any) => unknown | Promise<unknown>>, queueManager: QueueManager, logger: ILogger, jobOptionsBuilder: JobOptionsBuilder, commandLogger?: CommandLogger | undefined);
17
+ /**
18
+ * Przetwarza job z kolejki
19
+ * @param job - Job do przetworzenia
20
+ * @param commandName - Nazwa komendy
21
+ */
22
+ process(job: Job, commandName: string): Promise<unknown>;
23
+ /**
24
+ * Wysyła odpowiedź RPC do nadawcy
25
+ * Sprawdza czy kolejka odpowiedzi jeszcze istnieje (może być usunięta przez timeout)
26
+ */
27
+ private sendRpcResponse;
28
+ /**
29
+ * Wysyła błąd RPC do nadawcy
30
+ * Sprawdza czy kolejka odpowiedzi jeszcze istnieje (może być usunięta przez timeout)
31
+ */
32
+ private sendRpcError;
33
+ }
@@ -0,0 +1,195 @@
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
19
+ */
20
+ class JobProcessor {
21
+ constructor(
22
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
+ commandHandlers, queueManager, logger, jobOptionsBuilder, commandLogger) {
24
+ this.commandHandlers = commandHandlers;
25
+ this.queueManager = queueManager;
26
+ this.logger = logger;
27
+ this.jobOptionsBuilder = jobOptionsBuilder;
28
+ this.commandLogger = commandLogger;
29
+ }
30
+ /**
31
+ * Przetwarza job z kolejki
32
+ * @param job - Job do przetworzenia
33
+ * @param commandName - Nazwa komendy
34
+ */
35
+ process(job, commandName) {
36
+ return __awaiter(this, void 0, void 0, function* () {
37
+ var _a, _b;
38
+ let command = job.data;
39
+ const rpcMetadata = job.data.__rpcMetadata;
40
+ const startTime = Date.now();
41
+ this.logger.debug('Rozpoczynam przetwarzanie komendy', {
42
+ commandName,
43
+ commandId: command.__id,
44
+ jobId: job.id,
45
+ attempt: job.attemptsMade + 1,
46
+ maxAttempts: (_a = job.opts) === null || _a === void 0 ? void 0 : _a.attempts,
47
+ isRpc: !!rpcMetadata,
48
+ replyQueue: rpcMetadata === null || rpcMetadata === void 0 ? void 0 : rpcMetadata.replyQueue,
49
+ timestamp: new Date().toISOString(),
50
+ });
51
+ try {
52
+ // Przywróć obiekty Date z serializowanych danych
53
+ command = command_1.default.reconstructDates(command);
54
+ // Opcjonalne logowanie komendy
55
+ if (this.commandLogger) {
56
+ yield this.commandLogger.logCommand(command);
57
+ }
58
+ const handler = this.commandHandlers[commandName];
59
+ if (!handler) {
60
+ this.logger.error('Brak handlera dla komendy', {
61
+ commandName,
62
+ commandId: command.__id,
63
+ jobId: job.id,
64
+ });
65
+ throw new Error(`Brak handlera dla komendy ${commandName}`);
66
+ }
67
+ this.logger.debug('Wywołuję handler komendy', {
68
+ commandName,
69
+ commandId: command.__id,
70
+ jobId: job.id,
71
+ timestamp: new Date().toISOString(),
72
+ });
73
+ // Zwróć wartość z handlera
74
+ const result = yield handler(command);
75
+ const duration = Date.now() - startTime;
76
+ this.logger.debug('Handler komendy wykonany pomyślnie', {
77
+ commandName,
78
+ commandId: command.__id,
79
+ jobId: job.id,
80
+ duration: `${duration}ms`,
81
+ hasResult: result !== undefined,
82
+ timestamp: new Date().toISOString(),
83
+ });
84
+ // Jeśli to RPC, odeślij odpowiedź do reply queue nadawcy
85
+ if (rpcMetadata === null || rpcMetadata === void 0 ? void 0 : rpcMetadata.replyQueue) {
86
+ yield this.sendRpcResponse(rpcMetadata, result, null, commandName);
87
+ }
88
+ return result;
89
+ }
90
+ catch (error) {
91
+ const duration = Date.now() - startTime;
92
+ this.logger.error('Błąd podczas wykonywania handlera komendy', {
93
+ commandName,
94
+ commandId: command.__id,
95
+ jobId: job.id,
96
+ error: error instanceof Error ? error.message : String(error),
97
+ duration: `${duration}ms`,
98
+ attempt: job.attemptsMade + 1,
99
+ maxAttempts: (_b = job.opts) === null || _b === void 0 ? void 0 : _b.attempts,
100
+ timestamp: new Date().toISOString(),
101
+ });
102
+ // Jeśli to RPC, odeślij błąd do reply queue nadawcy
103
+ if (rpcMetadata === null || rpcMetadata === void 0 ? void 0 : rpcMetadata.replyQueue) {
104
+ yield this.sendRpcError(rpcMetadata, error, commandName);
105
+ }
106
+ throw error;
107
+ }
108
+ });
109
+ }
110
+ /**
111
+ * Wysyła odpowiedź RPC do nadawcy
112
+ * Sprawdza czy kolejka odpowiedzi jeszcze istnieje (może być usunięta przez timeout)
113
+ */
114
+ sendRpcResponse(rpcMetadata, result, error, commandName) {
115
+ return __awaiter(this, void 0, void 0, function* () {
116
+ try {
117
+ // Sprawdź czy kolejka odpowiedzi jeszcze istnieje (może być usunięta przez timeout)
118
+ const queueExists = yield this.queueManager.queueExists(rpcMetadata.replyQueue);
119
+ if (!queueExists) {
120
+ this.logger.warn('Kolejka odpowiedzi RPC już nie istnieje - pomijam wysyłkę', {
121
+ commandName,
122
+ correlationId: rpcMetadata.correlationId,
123
+ replyQueue: rpcMetadata.replyQueue,
124
+ timestamp: new Date().toISOString(),
125
+ });
126
+ return;
127
+ }
128
+ const replyQueue = this.queueManager.createQueue(rpcMetadata.replyQueue);
129
+ yield replyQueue.add('rpc-response', {
130
+ correlationId: rpcMetadata.correlationId,
131
+ result,
132
+ error,
133
+ }, this.jobOptionsBuilder.buildRpcReplyOptions());
134
+ this.logger.debug('Odpowiedź RPC wysłana', {
135
+ commandName,
136
+ correlationId: rpcMetadata.correlationId,
137
+ replyQueue: rpcMetadata.replyQueue,
138
+ timestamp: new Date().toISOString(),
139
+ });
140
+ }
141
+ catch (replyError) {
142
+ this.logger.error('Nie udało się wysłać odpowiedzi RPC', {
143
+ commandName,
144
+ correlationId: rpcMetadata.correlationId,
145
+ error: replyError instanceof Error ? replyError.message : String(replyError),
146
+ timestamp: new Date().toISOString(),
147
+ });
148
+ }
149
+ });
150
+ }
151
+ /**
152
+ * Wysyła błąd RPC do nadawcy
153
+ * Sprawdza czy kolejka odpowiedzi jeszcze istnieje (może być usunięta przez timeout)
154
+ */
155
+ sendRpcError(rpcMetadata, error, commandName) {
156
+ return __awaiter(this, void 0, void 0, function* () {
157
+ try {
158
+ // Sprawdź czy kolejka odpowiedzi jeszcze istnieje (może być usunięta przez timeout)
159
+ const queueExists = yield this.queueManager.queueExists(rpcMetadata.replyQueue);
160
+ if (!queueExists) {
161
+ this.logger.warn('Kolejka odpowiedzi RPC już nie istnieje - pomijam wysyłkę błędu', {
162
+ commandName,
163
+ correlationId: rpcMetadata.correlationId,
164
+ replyQueue: rpcMetadata.replyQueue,
165
+ timestamp: new Date().toISOString(),
166
+ });
167
+ return;
168
+ }
169
+ const replyQueue = this.queueManager.createQueue(rpcMetadata.replyQueue);
170
+ yield replyQueue.add('rpc-response', {
171
+ correlationId: rpcMetadata.correlationId,
172
+ result: null,
173
+ error: error instanceof Error ? error.message : String(error),
174
+ }, this.jobOptionsBuilder.buildRpcReplyOptions());
175
+ this.logger.error('Błąd RPC wysłany do nadawcy', {
176
+ commandName,
177
+ correlationId: rpcMetadata.correlationId,
178
+ error: error instanceof Error ? error.message : String(error),
179
+ timestamp: new Date().toISOString(),
180
+ });
181
+ }
182
+ catch (replyError) {
183
+ this.logger.error('Nie udało się wysłać błędu RPC do nadawcy', {
184
+ commandName,
185
+ correlationId: rpcMetadata.correlationId,
186
+ originalError: error instanceof Error ? error.message : String(error),
187
+ replyError: replyError instanceof Error ? replyError.message : String(replyError),
188
+ timestamp: new Date().toISOString(),
189
+ });
190
+ }
191
+ });
192
+ }
193
+ }
194
+ exports.default = JobProcessor;
195
+ //# sourceMappingURL=job-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-processor.js","sourceRoot":"","sources":["../../../src/command-bus/job/job-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};