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.
- package/README.md +522 -0
- package/dist/command-bus/command-bus.spec.d.ts +1 -0
- package/dist/command-bus/command-bus.spec.js +398 -0
- package/dist/command-bus/command-bus.spec.js.map +1 -0
- package/dist/command-bus/command.d.ts +24 -0
- package/dist/command-bus/command.js +53 -0
- package/dist/command-bus/command.js.map +1 -0
- package/dist/command-bus/config/command-bus-config.d.ts +40 -0
- package/dist/command-bus/config/command-bus-config.js +59 -0
- package/dist/command-bus/config/command-bus-config.js.map +1 -0
- package/dist/command-bus/config/command-bus-config.spec.d.ts +1 -0
- package/dist/command-bus/config/command-bus-config.spec.js +162 -0
- package/dist/command-bus/config/command-bus-config.spec.js.map +1 -0
- package/dist/command-bus/config/index.d.ts +1 -0
- package/dist/command-bus/config/index.js +9 -0
- package/dist/command-bus/config/index.js.map +1 -0
- package/dist/command-bus/index.d.ts +79 -0
- package/dist/command-bus/index.js +169 -0
- package/dist/command-bus/index.js.map +1 -0
- package/dist/command-bus/job/index.d.ts +6 -0
- package/dist/command-bus/job/index.js +15 -0
- package/dist/command-bus/job/index.js.map +1 -0
- package/dist/command-bus/job/job-options-builder.d.ts +24 -0
- package/dist/command-bus/job/job-options-builder.js +68 -0
- package/dist/command-bus/job/job-options-builder.js.map +1 -0
- package/dist/command-bus/job/job-options-builder.spec.d.ts +1 -0
- package/dist/command-bus/job/job-options-builder.spec.js +163 -0
- package/dist/command-bus/job/job-options-builder.spec.js.map +1 -0
- package/dist/command-bus/job/job-processor.d.ts +33 -0
- package/dist/command-bus/job/job-processor.js +195 -0
- package/dist/command-bus/job/job-processor.js.map +1 -0
- package/dist/command-bus/job/job-processor.spec.d.ts +1 -0
- package/dist/command-bus/job/job-processor.spec.js +352 -0
- package/dist/command-bus/job/job-processor.spec.js.map +1 -0
- package/dist/command-bus/logging/command-logger.d.ts +21 -0
- package/dist/command-bus/logging/command-logger.js +79 -0
- package/dist/command-bus/logging/command-logger.js.map +1 -0
- package/dist/command-bus/logging/command-logger.spec.d.ts +1 -0
- package/dist/command-bus/logging/command-logger.spec.js +245 -0
- package/dist/command-bus/logging/command-logger.spec.js.map +1 -0
- package/dist/command-bus/logging/index.d.ts +5 -0
- package/dist/command-bus/logging/index.js +13 -0
- package/dist/command-bus/logging/index.js.map +1 -0
- package/dist/command-bus/queue/index.d.ts +5 -0
- package/dist/command-bus/queue/index.js +13 -0
- package/dist/command-bus/queue/index.js.map +1 -0
- package/dist/command-bus/queue/queue-manager.d.ts +24 -0
- package/dist/command-bus/queue/queue-manager.js +60 -0
- package/dist/command-bus/queue/queue-manager.js.map +1 -0
- package/dist/command-bus/queue/queue-manager.spec.d.ts +1 -0
- package/dist/command-bus/queue/queue-manager.spec.js +219 -0
- package/dist/command-bus/queue/queue-manager.spec.js.map +1 -0
- package/dist/command-bus/rpc/index.d.ts +5 -0
- package/dist/command-bus/rpc/index.js +13 -0
- package/dist/command-bus/rpc/index.js.map +1 -0
- package/dist/command-bus/rpc/rpc-coordinator.d.ts +45 -0
- package/dist/command-bus/rpc/rpc-coordinator.js +189 -0
- package/dist/command-bus/rpc/rpc-coordinator.js.map +1 -0
- package/dist/command-bus/rpc/rpc-coordinator.spec.d.ts +1 -0
- package/dist/command-bus/rpc/rpc-coordinator.spec.js +286 -0
- package/dist/command-bus/rpc/rpc-coordinator.spec.js.map +1 -0
- package/dist/command-bus/types/index.d.ts +57 -0
- package/dist/command-bus/types/index.js +3 -0
- package/dist/command-bus/types/index.js.map +1 -0
- package/dist/command-bus/worker/index.d.ts +5 -0
- package/dist/command-bus/worker/index.js +13 -0
- package/dist/command-bus/worker/index.js.map +1 -0
- package/dist/command-bus/worker/worker-orchestrator.d.ts +46 -0
- package/dist/command-bus/worker/worker-orchestrator.js +160 -0
- package/dist/command-bus/worker/worker-orchestrator.js.map +1 -0
- package/dist/command-bus/worker/worker-orchestrator.spec.d.ts +1 -0
- package/dist/command-bus/worker/worker-orchestrator.spec.js +293 -0
- package/dist/command-bus/worker/worker-orchestrator.spec.js.map +1 -0
- package/dist/examples/rpc.demo.d.ts +2 -0
- package/dist/examples/rpc.demo.js +235 -0
- package/dist/examples/rpc.demo.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/pp-command-bus-1.0.0.tgz +0 -0
- package/dist/shared/config/base-config.d.ts +43 -0
- package/dist/shared/config/base-config.js +100 -0
- package/dist/shared/config/base-config.js.map +1 -0
- package/dist/shared/config/base-config.spec.d.ts +1 -0
- package/dist/shared/config/base-config.spec.js +118 -0
- package/dist/shared/config/base-config.spec.js.map +1 -0
- package/dist/shared/config/index.d.ts +1 -0
- package/dist/shared/config/index.js +9 -0
- package/dist/shared/config/index.js.map +1 -0
- package/dist/shared/logging/index.d.ts +2 -0
- package/dist/shared/logging/index.js +8 -0
- package/dist/shared/logging/index.js.map +1 -0
- package/dist/shared/logging/log-level.d.ts +36 -0
- package/dist/shared/logging/log-level.js +53 -0
- package/dist/shared/logging/log-level.js.map +1 -0
- package/dist/shared/logging/logger.d.ts +42 -0
- package/dist/shared/logging/logger.js +63 -0
- package/dist/shared/logging/logger.js.map +1 -0
- package/dist/shared/logging/logger.spec.d.ts +1 -0
- package/dist/shared/logging/logger.spec.js +89 -0
- package/dist/shared/logging/logger.spec.js.map +1 -0
- package/dist/shared/types.d.ts +26 -0
- package/dist/shared/types.js +6 -0
- package/dist/shared/types.js.map +1 -0
- package/package.json +93 -0
|
@@ -0,0 +1,162 @@
|
|
|
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 command_bus_config_1 = __importDefault(require("./command-bus-config"));
|
|
7
|
+
const logger_1 = require("../../shared/logging/logger");
|
|
8
|
+
describe('CommandBusConfig', () => {
|
|
9
|
+
const originalEnv = process.env;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
// Reset zmiennych środowiskowych
|
|
12
|
+
process.env = Object.assign({}, originalEnv);
|
|
13
|
+
});
|
|
14
|
+
afterEach(() => {
|
|
15
|
+
process.env = originalEnv;
|
|
16
|
+
});
|
|
17
|
+
describe('konstruktor', () => {
|
|
18
|
+
it('powinno używać domyślnych wartości', () => {
|
|
19
|
+
// When
|
|
20
|
+
const config = new command_bus_config_1.default();
|
|
21
|
+
// Then
|
|
22
|
+
expect(config.redisUrl).toBe('redis://localhost:6379');
|
|
23
|
+
expect(config.logger).toBeInstanceOf(logger_1.Logger);
|
|
24
|
+
expect(config.logLevel).toBe('log');
|
|
25
|
+
expect(config.concurrency).toBe(1);
|
|
26
|
+
expect(config.maxAttempts).toBe(3);
|
|
27
|
+
expect(config.backoffDelay).toBe(2000);
|
|
28
|
+
expect(config.queueMode).toBe('fifo');
|
|
29
|
+
expect(config.commandLog).toBe('');
|
|
30
|
+
});
|
|
31
|
+
it('powinno wczytać konfigurację ze zmiennych środowiskowych z nowym prefiksem', () => {
|
|
32
|
+
// Given
|
|
33
|
+
process.env.REDIS_URL = 'redis://dragonfly:6380';
|
|
34
|
+
process.env.COMMAND_BUS_CONCURRENCY = '10';
|
|
35
|
+
process.env.COMMAND_BUS_MAX_ATTEMPTS = '5';
|
|
36
|
+
process.env.COMMAND_BUS_BACKOFF_DELAY = '5000';
|
|
37
|
+
process.env.COMMAND_BUS_QUEUE_MODE = 'lifo';
|
|
38
|
+
process.env.COMMAND_BUS_LOG = '/var/log/commands';
|
|
39
|
+
// When
|
|
40
|
+
const config = new command_bus_config_1.default();
|
|
41
|
+
// Then
|
|
42
|
+
expect(config.redisUrl).toBe('redis://dragonfly:6380');
|
|
43
|
+
expect(config.concurrency).toBe(10);
|
|
44
|
+
expect(config.maxAttempts).toBe(5);
|
|
45
|
+
expect(config.backoffDelay).toBe(5000);
|
|
46
|
+
expect(config.queueMode).toBe('lifo');
|
|
47
|
+
expect(config.commandLog).toBe('/var/log/commands');
|
|
48
|
+
});
|
|
49
|
+
it('powinno zachować kompatybilność wsteczną ze starymi nazwami zmiennych', () => {
|
|
50
|
+
// Given
|
|
51
|
+
process.env.EVENT_BUS_CONCURRENCY = '8';
|
|
52
|
+
process.env.EVENT_BUS_MAX_ATTEMPTS = '4';
|
|
53
|
+
process.env.EVENT_BUS_BACKOFF_DELAY = '3000';
|
|
54
|
+
process.env.EVENT_BUS_QUEUE_MODE = 'lifo';
|
|
55
|
+
process.env.EVENT_BUS_LOG = '/old/log/path';
|
|
56
|
+
// When
|
|
57
|
+
const config = new command_bus_config_1.default();
|
|
58
|
+
// Then
|
|
59
|
+
expect(config.concurrency).toBe(8);
|
|
60
|
+
expect(config.maxAttempts).toBe(4);
|
|
61
|
+
expect(config.backoffDelay).toBe(3000);
|
|
62
|
+
expect(config.queueMode).toBe('lifo');
|
|
63
|
+
expect(config.commandLog).toBe('/old/log/path');
|
|
64
|
+
});
|
|
65
|
+
it('powinno preferować nowe nazwy zmiennych nad starymi', () => {
|
|
66
|
+
// Given
|
|
67
|
+
// Stare nazwy
|
|
68
|
+
process.env.EVENT_BUS_CONCURRENCY = '8';
|
|
69
|
+
process.env.EVENT_BUS_MAX_ATTEMPTS = '4';
|
|
70
|
+
// Nowe nazwy (powinny mieć priorytet)
|
|
71
|
+
process.env.COMMAND_BUS_CONCURRENCY = '15';
|
|
72
|
+
process.env.COMMAND_BUS_MAX_ATTEMPTS = '7';
|
|
73
|
+
// When
|
|
74
|
+
const config = new command_bus_config_1.default();
|
|
75
|
+
// Then
|
|
76
|
+
expect(config.concurrency).toBe(15);
|
|
77
|
+
expect(config.maxAttempts).toBe(7);
|
|
78
|
+
});
|
|
79
|
+
it('powinno nadpisać wartości przez parametry konstruktora', () => {
|
|
80
|
+
// Given
|
|
81
|
+
const customLogger = {
|
|
82
|
+
log: jest.fn(),
|
|
83
|
+
error: jest.fn(),
|
|
84
|
+
warn: jest.fn(),
|
|
85
|
+
debug: jest.fn(),
|
|
86
|
+
};
|
|
87
|
+
// When
|
|
88
|
+
const config = new command_bus_config_1.default({
|
|
89
|
+
redisUrl: 'redis://custom:6379',
|
|
90
|
+
logger: customLogger,
|
|
91
|
+
concurrency: 20,
|
|
92
|
+
maxAttempts: 10,
|
|
93
|
+
backoffDelay: 10000,
|
|
94
|
+
queueMode: 'lifo',
|
|
95
|
+
commandLog: '/custom/log/path',
|
|
96
|
+
});
|
|
97
|
+
// Then
|
|
98
|
+
expect(config.redisUrl).toBe('redis://custom:6379');
|
|
99
|
+
expect(config.logger).toBe(customLogger);
|
|
100
|
+
expect(config.concurrency).toBe(20);
|
|
101
|
+
expect(config.maxAttempts).toBe(10);
|
|
102
|
+
expect(config.backoffDelay).toBe(10000);
|
|
103
|
+
expect(config.queueMode).toBe('lifo');
|
|
104
|
+
expect(config.commandLog).toBe('/custom/log/path');
|
|
105
|
+
});
|
|
106
|
+
it('powinno prawidłowo parsować liczby', () => {
|
|
107
|
+
// Given
|
|
108
|
+
process.env.COMMAND_BUS_CONCURRENCY = 'invalid';
|
|
109
|
+
process.env.COMMAND_BUS_MAX_ATTEMPTS = 'not-a-number';
|
|
110
|
+
process.env.COMMAND_BUS_BACKOFF_DELAY = '';
|
|
111
|
+
// When
|
|
112
|
+
const config = new command_bus_config_1.default();
|
|
113
|
+
// Then - powinno użyć domyślnych wartości przy błędnym parsowaniu
|
|
114
|
+
expect(config.concurrency).toBe(1);
|
|
115
|
+
expect(config.maxAttempts).toBe(3);
|
|
116
|
+
expect(config.backoffDelay).toBe(2000);
|
|
117
|
+
});
|
|
118
|
+
it('powinno prawidłowo parsować queue mode', () => {
|
|
119
|
+
// Given
|
|
120
|
+
process.env.COMMAND_BUS_QUEUE_MODE = 'invalid-mode';
|
|
121
|
+
// When
|
|
122
|
+
const config = new command_bus_config_1.default();
|
|
123
|
+
// Then - powinno użyć domyślnej wartości przy nieprawidłowym trybie
|
|
124
|
+
expect(config.queueMode).toBe('fifo');
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe('walidacja', () => {
|
|
128
|
+
it('powinno zwalidować konfigurację przy tworzeniu', () => {
|
|
129
|
+
// Given
|
|
130
|
+
process.env.REDIS_URL = 'redis://valid:6379';
|
|
131
|
+
process.env.COMMAND_BUS_CONCURRENCY = '5';
|
|
132
|
+
// When & Then
|
|
133
|
+
expect(() => new command_bus_config_1.default()).not.toThrow();
|
|
134
|
+
});
|
|
135
|
+
it('powinno rzucić błąd przy nieprawidłowej liczbie workerów', () => {
|
|
136
|
+
// Given
|
|
137
|
+
process.env.COMMAND_BUS_CONCURRENCY = '0';
|
|
138
|
+
// When & Then
|
|
139
|
+
expect(() => new command_bus_config_1.default()).toThrow('concurrency must be at least 1');
|
|
140
|
+
});
|
|
141
|
+
it('powinno rzucić błąd przy nieprawidłowej liczbie prób', () => {
|
|
142
|
+
// Given
|
|
143
|
+
process.env.COMMAND_BUS_MAX_ATTEMPTS = '0';
|
|
144
|
+
// When & Then
|
|
145
|
+
expect(() => new command_bus_config_1.default()).toThrow('maxAttempts must be at least 1');
|
|
146
|
+
});
|
|
147
|
+
it('powinno rzucić błąd przy zbyt małym backoff delay', () => {
|
|
148
|
+
// Given
|
|
149
|
+
process.env.COMMAND_BUS_BACKOFF_DELAY = '99';
|
|
150
|
+
// When & Then
|
|
151
|
+
expect(() => new command_bus_config_1.default()).toThrow('backoffDelay must be at least 100ms');
|
|
152
|
+
});
|
|
153
|
+
it('powinno rzucić błąd przy nieprawidłowym queue mode', () => {
|
|
154
|
+
// Given
|
|
155
|
+
const config = new command_bus_config_1.default();
|
|
156
|
+
config.queueMode = 'invalid';
|
|
157
|
+
// When & Then
|
|
158
|
+
expect(() => config.validateCommandBusConfig()).toThrow("queueMode must be either 'fifo' or 'lifo'");
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
//# sourceMappingURL=command-bus-config.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-bus-config.spec.js","sourceRoot":"","sources":["../../../src/command-bus/config/command-bus-config.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as CommandBusConfig } from './command-bus-config';
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
exports.CommandBusConfig = void 0;
|
|
7
|
+
var command_bus_config_1 = require("./command-bus-config");
|
|
8
|
+
Object.defineProperty(exports, "CommandBusConfig", { enumerable: true, get: function () { return __importDefault(command_bus_config_1).default; } });
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/command-bus/config/index.ts"],"names":[],"mappings":";;;;;;AAAA,2DAAmE;AAA1D,uIAAA,OAAO,OAAoB"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type Command from './command';
|
|
2
|
+
import type CommandBusConfig from './config/command-bus-config';
|
|
3
|
+
/**
|
|
4
|
+
* Command Bus wykorzystujący BullMQ
|
|
5
|
+
* Obsługuje komendy w relacji 1:1 (jedna komenda = jeden handler)
|
|
6
|
+
*/
|
|
7
|
+
export default class CommandBus {
|
|
8
|
+
private config;
|
|
9
|
+
/**
|
|
10
|
+
* Handlery komend - tylko jeden per typ komendy
|
|
11
|
+
*/
|
|
12
|
+
private commandHandlers;
|
|
13
|
+
/**
|
|
14
|
+
* Logger
|
|
15
|
+
*/
|
|
16
|
+
private logger;
|
|
17
|
+
/**
|
|
18
|
+
* QueueManager - zarządza kolejkami i cache
|
|
19
|
+
*/
|
|
20
|
+
private queueManager;
|
|
21
|
+
/**
|
|
22
|
+
* WorkerOrchestrator - zarządza workerami
|
|
23
|
+
*/
|
|
24
|
+
private workerOrchestrator;
|
|
25
|
+
/**
|
|
26
|
+
* JobProcessor - przetwarza joby
|
|
27
|
+
*/
|
|
28
|
+
private jobProcessor;
|
|
29
|
+
/**
|
|
30
|
+
* RpcCoordinator - zarządza pending RPC calls
|
|
31
|
+
*/
|
|
32
|
+
private rpcCoordinator;
|
|
33
|
+
/**
|
|
34
|
+
* JobOptionsBuilder - buduje opcje dla jobów BullMQ
|
|
35
|
+
*/
|
|
36
|
+
private jobOptionsBuilder;
|
|
37
|
+
/**
|
|
38
|
+
* CommandLogger - opcjonalny logger komend do plików
|
|
39
|
+
*/
|
|
40
|
+
private commandLogger?;
|
|
41
|
+
/**
|
|
42
|
+
* Połączenie Redis dla QueueManager
|
|
43
|
+
*/
|
|
44
|
+
private queueRedisConnection;
|
|
45
|
+
/**
|
|
46
|
+
* Połączenie Redis dla WorkerOrchestrator
|
|
47
|
+
*/
|
|
48
|
+
private workerRedisConnection;
|
|
49
|
+
/**
|
|
50
|
+
* Połączenie Redis dla RpcCoordinator
|
|
51
|
+
*/
|
|
52
|
+
private rpcRedisConnection;
|
|
53
|
+
constructor(config: CommandBusConfig);
|
|
54
|
+
/**
|
|
55
|
+
* Wysyła komendę do kolejki
|
|
56
|
+
* @param command - Komenda do wysłania
|
|
57
|
+
*/
|
|
58
|
+
dispatch(command: Command): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Rejestruje handler dla komendy
|
|
61
|
+
* @param commandDefinition - Definicja komendy (klasa)
|
|
62
|
+
* @param handler - Handler do obsługi komendy
|
|
63
|
+
*/
|
|
64
|
+
handle<T extends Command>(commandDefinition: new (...args: any[]) => T, handler: (command: T) => unknown | Promise<unknown>): void;
|
|
65
|
+
/**
|
|
66
|
+
* Synchroniczne wywołanie komendy z oczekiwaniem na wynik (RPC)
|
|
67
|
+
* Każde wywołanie tworzy unikalną kolejkę odpowiedzi która jest automatycznie kasowana
|
|
68
|
+
* @param command - Komenda do wykonania
|
|
69
|
+
* @param timeout - Timeout w milisekundach (domyślnie 30s)
|
|
70
|
+
*/
|
|
71
|
+
call<T = unknown>(command: Command, timeout?: number): Promise<T>;
|
|
72
|
+
/**
|
|
73
|
+
* Zamyka wszystkie połączenia
|
|
74
|
+
*/
|
|
75
|
+
close(): Promise<void>;
|
|
76
|
+
}
|
|
77
|
+
export { default as CommandBus } from './index';
|
|
78
|
+
export { default as Command } from './command';
|
|
79
|
+
export { default as CommandBusConfig } from './config/command-bus-config';
|
|
@@ -0,0 +1,169 @@
|
|
|
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
|
+
exports.CommandBusConfig = exports.Command = exports.CommandBus = void 0;
|
|
16
|
+
const ioredis_1 = require("ioredis");
|
|
17
|
+
const queue_1 = require("./queue");
|
|
18
|
+
const worker_1 = require("./worker");
|
|
19
|
+
const job_1 = require("./job");
|
|
20
|
+
const rpc_1 = require("./rpc");
|
|
21
|
+
const logging_1 = require("./logging");
|
|
22
|
+
/**
|
|
23
|
+
* Command Bus wykorzystujący BullMQ
|
|
24
|
+
* Obsługuje komendy w relacji 1:1 (jedna komenda = jeden handler)
|
|
25
|
+
*/
|
|
26
|
+
class CommandBus {
|
|
27
|
+
constructor(config) {
|
|
28
|
+
this.config = config;
|
|
29
|
+
/**
|
|
30
|
+
* Handlery komend - tylko jeden per typ komendy
|
|
31
|
+
*/
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
33
|
+
this.commandHandlers = {};
|
|
34
|
+
// Używaj loggera z konfiguracji (już zawiera filtrowanie według logLevel)
|
|
35
|
+
this.logger = config.logger;
|
|
36
|
+
this.logger.debug('Konstruktor CommandBus', {
|
|
37
|
+
config: this.config,
|
|
38
|
+
timestamp: new Date().toISOString(),
|
|
39
|
+
});
|
|
40
|
+
// Utwórz Redis connections
|
|
41
|
+
// QueueManager - standardowe opcje Redis (bez maxRetriesPerRequest: null)
|
|
42
|
+
this.queueRedisConnection = new ioredis_1.Redis(this.config.getRedisOptions());
|
|
43
|
+
// WorkerOrchestrator - opcje z maxRetriesPerRequest: null dla Worker compatibility
|
|
44
|
+
this.workerRedisConnection = new ioredis_1.Redis(this.config.getRedisOptionsForWorker());
|
|
45
|
+
// RpcCoordinator - opcje z maxRetriesPerRequest: null dla Worker compatibility
|
|
46
|
+
this.rpcRedisConnection = new ioredis_1.Redis(this.config.getRedisOptionsForWorker());
|
|
47
|
+
// Utwórz QueueManager z własnym Redis connection
|
|
48
|
+
this.queueManager = new queue_1.QueueManager(this.queueRedisConnection, this.logger);
|
|
49
|
+
// Utwórz RpcCoordinator z własnym Redis connection
|
|
50
|
+
this.rpcCoordinator = new rpc_1.RpcCoordinator(this.logger, this.rpcRedisConnection, this.queueManager);
|
|
51
|
+
// Utwórz JobOptionsBuilder
|
|
52
|
+
this.jobOptionsBuilder = new job_1.JobOptionsBuilder(this.config);
|
|
53
|
+
// Utwórz CommandLogger jeśli commandLog jest skonfigurowane
|
|
54
|
+
if (this.config.commandLog) {
|
|
55
|
+
this.commandLogger = new logging_1.CommandLogger(this.config.commandLog, this.logger);
|
|
56
|
+
}
|
|
57
|
+
// Utwórz JobProcessor
|
|
58
|
+
this.jobProcessor = new job_1.JobProcessor(this.commandHandlers, this.queueManager, this.logger, this.jobOptionsBuilder, this.commandLogger);
|
|
59
|
+
// Utwórz WorkerOrchestrator z własnym Redis connection
|
|
60
|
+
this.workerOrchestrator = new worker_1.WorkerOrchestrator(this.workerRedisConnection, this.jobProcessor, this.config.concurrency, this.config.maxAttempts, this.logger);
|
|
61
|
+
this.logger.debug('CommandBus gotowy do użycia', {
|
|
62
|
+
timestamp: new Date().toISOString(),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Wysyła komendę do kolejki
|
|
67
|
+
* @param command - Komenda do wysłania
|
|
68
|
+
*/
|
|
69
|
+
dispatch(command) {
|
|
70
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
71
|
+
var _a;
|
|
72
|
+
const commandName = command.__name;
|
|
73
|
+
const commandId = command.__id;
|
|
74
|
+
const timestamp = new Date().toISOString();
|
|
75
|
+
this.logger.debug('Otrzymano komendę do wysłania', {
|
|
76
|
+
commandName,
|
|
77
|
+
commandId,
|
|
78
|
+
timestamp,
|
|
79
|
+
});
|
|
80
|
+
const queue = this.queueManager.createQueue(commandName);
|
|
81
|
+
const job = yield queue.add(commandName, command, this.jobOptionsBuilder.buildStandardOptions());
|
|
82
|
+
this.logger.debug('Komenda dodana do kolejki', {
|
|
83
|
+
commandName,
|
|
84
|
+
commandId,
|
|
85
|
+
jobId: job.id,
|
|
86
|
+
queuePosition: ((_a = job.opts) === null || _a === void 0 ? void 0 : _a.delay) ? 'delayed' : 'active',
|
|
87
|
+
timestamp,
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Rejestruje handler dla komendy
|
|
93
|
+
* @param commandDefinition - Definicja komendy (klasa)
|
|
94
|
+
* @param handler - Handler do obsługi komendy
|
|
95
|
+
*/
|
|
96
|
+
handle(
|
|
97
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
98
|
+
commandDefinition, handler) {
|
|
99
|
+
const commandName = commandDefinition.name;
|
|
100
|
+
if (this.commandHandlers[commandName]) {
|
|
101
|
+
throw new Error(`Handler dla komendy ${commandName} już istnieje`);
|
|
102
|
+
}
|
|
103
|
+
this.commandHandlers[commandName] = handler;
|
|
104
|
+
this.workerOrchestrator.registerWorker(commandName);
|
|
105
|
+
this.logger.debug(`Zarejestrowano handler dla komendy ${commandName}`);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Synchroniczne wywołanie komendy z oczekiwaniem na wynik (RPC)
|
|
109
|
+
* Każde wywołanie tworzy unikalną kolejkę odpowiedzi która jest automatycznie kasowana
|
|
110
|
+
* @param command - Komenda do wykonania
|
|
111
|
+
* @param timeout - Timeout w milisekundach (domyślnie 30s)
|
|
112
|
+
*/
|
|
113
|
+
call(command_2) {
|
|
114
|
+
return __awaiter(this, arguments, void 0, function* (command, timeout = 30000) {
|
|
115
|
+
var _a;
|
|
116
|
+
const commandName = command.__name;
|
|
117
|
+
const correlationId = command.__id;
|
|
118
|
+
const timestamp = new Date().toISOString();
|
|
119
|
+
const replyQueueName = `rpc-reply-${correlationId}`;
|
|
120
|
+
this.logger.debug('Rozpoczynam wywołanie RPC', {
|
|
121
|
+
commandName,
|
|
122
|
+
commandId: correlationId,
|
|
123
|
+
replyQueue: replyQueueName,
|
|
124
|
+
timeout: `${timeout}ms`,
|
|
125
|
+
timestamp,
|
|
126
|
+
});
|
|
127
|
+
// Zarejestruj pending call (tworzy unikalną kolejkę i worker)
|
|
128
|
+
const promise = this.rpcCoordinator.registerCall(correlationId, commandName, timeout);
|
|
129
|
+
// Wyślij komendę do kolejki z metadanymi RPC
|
|
130
|
+
const queue = this.queueManager.createQueue(commandName);
|
|
131
|
+
const commandWithMetadata = this.rpcCoordinator.prepareRpcCommand(command, replyQueueName);
|
|
132
|
+
const job = yield queue.add(commandName, commandWithMetadata, this.jobOptionsBuilder.buildStandardOptions());
|
|
133
|
+
this.logger.debug('Komenda RPC dodana do kolejki', {
|
|
134
|
+
commandName,
|
|
135
|
+
commandId: correlationId,
|
|
136
|
+
jobId: job.id,
|
|
137
|
+
replyQueue: replyQueueName,
|
|
138
|
+
queuePosition: ((_a = job.opts) === null || _a === void 0 ? void 0 : _a.delay) ? 'delayed' : 'active',
|
|
139
|
+
timestamp,
|
|
140
|
+
});
|
|
141
|
+
return promise;
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Zamyka wszystkie połączenia
|
|
146
|
+
*/
|
|
147
|
+
close() {
|
|
148
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
149
|
+
this.logger.debug('Zamykanie połączeń CommandBus', {
|
|
150
|
+
timestamp: new Date().toISOString(),
|
|
151
|
+
});
|
|
152
|
+
// Zamknij wszystkie workery
|
|
153
|
+
yield this.workerOrchestrator.closeAll();
|
|
154
|
+
// Zamknij pozostałe Redis connections
|
|
155
|
+
yield this.queueRedisConnection.quit();
|
|
156
|
+
yield this.workerRedisConnection.quit();
|
|
157
|
+
yield this.rpcRedisConnection.quit();
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
exports.default = CommandBus;
|
|
162
|
+
// Re-eksporty dla spójności z pattern config
|
|
163
|
+
var index_1 = require("./index");
|
|
164
|
+
Object.defineProperty(exports, "CommandBus", { enumerable: true, get: function () { return __importDefault(index_1).default; } });
|
|
165
|
+
var command_1 = require("./command");
|
|
166
|
+
Object.defineProperty(exports, "Command", { enumerable: true, get: function () { return __importDefault(command_1).default; } });
|
|
167
|
+
var command_bus_config_1 = require("./config/command-bus-config");
|
|
168
|
+
Object.defineProperty(exports, "CommandBusConfig", { enumerable: true, get: function () { return __importDefault(command_bus_config_1).default; } });
|
|
169
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/command-bus/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
exports.JobOptionsBuilder = exports.JobProcessor = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Moduł przetwarzania jobów BullMQ
|
|
9
|
+
* Eksportuje JobProcessor i JobOptionsBuilder
|
|
10
|
+
*/
|
|
11
|
+
var job_processor_1 = require("./job-processor");
|
|
12
|
+
Object.defineProperty(exports, "JobProcessor", { enumerable: true, get: function () { return __importDefault(job_processor_1).default; } });
|
|
13
|
+
var job_options_builder_1 = require("./job-options-builder");
|
|
14
|
+
Object.defineProperty(exports, "JobOptionsBuilder", { enumerable: true, get: function () { return __importDefault(job_options_builder_1).default; } });
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/command-bus/job/index.ts"],"names":[],"mappings":";;;;;;AAAA;;;GAGG;AACH,iDAA0D;AAAjD,8HAAA,OAAO,OAAgB;AAChC,6DAAqE;AAA5D,yIAAA,OAAO,OAAqB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type CommandBusConfig from '../config/command-bus-config';
|
|
2
|
+
import type { JobOptions } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* JobOptionsBuilder - buduje opcje dla jobów BullMQ
|
|
5
|
+
*
|
|
6
|
+
* Odpowiedzialność: Enkapsulacja konfiguracji job options
|
|
7
|
+
* Wydzielone z CommandBus zgodnie z SRP (Single Responsibility Principle)
|
|
8
|
+
*/
|
|
9
|
+
export default class JobOptionsBuilder {
|
|
10
|
+
private readonly config;
|
|
11
|
+
constructor(config: CommandBusConfig);
|
|
12
|
+
/**
|
|
13
|
+
* Buduje standardowe opcje dla jobów BullMQ
|
|
14
|
+
* Memory optimization: agresywniejsze usuwanie completed/failed jobs z Redis
|
|
15
|
+
* @returns Opcje dla standardowych jobów komend
|
|
16
|
+
*/
|
|
17
|
+
buildStandardOptions(): JobOptions;
|
|
18
|
+
/**
|
|
19
|
+
* Buduje opcje dla RPC reply jobs
|
|
20
|
+
* Memory optimization: bardzo agresywne usuwanie - reply jobs są natychmiast przetwarzane
|
|
21
|
+
* @returns Opcje dla jobów odpowiedzi RPC
|
|
22
|
+
*/
|
|
23
|
+
buildRpcReplyOptions(): JobOptions;
|
|
24
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* JobOptionsBuilder - buduje opcje dla jobów BullMQ
|
|
5
|
+
*
|
|
6
|
+
* Odpowiedzialność: Enkapsulacja konfiguracji job options
|
|
7
|
+
* Wydzielone z CommandBus zgodnie z SRP (Single Responsibility Principle)
|
|
8
|
+
*/
|
|
9
|
+
class JobOptionsBuilder {
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Buduje standardowe opcje dla jobów BullMQ
|
|
15
|
+
* Memory optimization: agresywniejsze usuwanie completed/failed jobs z Redis
|
|
16
|
+
* @returns Opcje dla standardowych jobów komend
|
|
17
|
+
*/
|
|
18
|
+
buildStandardOptions() {
|
|
19
|
+
return {
|
|
20
|
+
// Memory optimization: zachowaj tylko ostatnie 100 completed jobs
|
|
21
|
+
// usuń starsze niż 60s (było: true - usuwaj natychmiast)
|
|
22
|
+
removeOnComplete: {
|
|
23
|
+
count: 100,
|
|
24
|
+
age: 60, // sekundy
|
|
25
|
+
},
|
|
26
|
+
// Memory optimization: zachowaj więcej failed jobs (debugging)
|
|
27
|
+
// ale usuń starsze niż 1h (było: 24h)
|
|
28
|
+
removeOnFail: {
|
|
29
|
+
count: 500, // było 100
|
|
30
|
+
age: 3600, // 1h (było 24h)
|
|
31
|
+
},
|
|
32
|
+
attempts: this.config.maxAttempts,
|
|
33
|
+
backoff: {
|
|
34
|
+
type: 'exponential',
|
|
35
|
+
delay: this.config.backoffDelay,
|
|
36
|
+
},
|
|
37
|
+
lifo: this.config.queueMode === 'lifo',
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Buduje opcje dla RPC reply jobs
|
|
42
|
+
* Memory optimization: bardzo agresywne usuwanie - reply jobs są natychmiast przetwarzane
|
|
43
|
+
* @returns Opcje dla jobów odpowiedzi RPC
|
|
44
|
+
*/
|
|
45
|
+
buildRpcReplyOptions() {
|
|
46
|
+
return {
|
|
47
|
+
// Memory optimization: RPC replies są natychmiast przetwarzane
|
|
48
|
+
// Usuń completed reply jobs bardzo szybko (30s zamiast rpcReplyTtl)
|
|
49
|
+
removeOnComplete: {
|
|
50
|
+
age: 30, // sekundy (było: rpcReplyTtl / 1000 = 300s)
|
|
51
|
+
count: 10, // było 100 - tylko ostatnie 10 dla debugowania
|
|
52
|
+
},
|
|
53
|
+
// Memory optimization: failed reply jobs też usuń szybciej
|
|
54
|
+
removeOnFail: {
|
|
55
|
+
age: 300, // 5 minut (było 3600 = 1h)
|
|
56
|
+
count: 50, // było 100
|
|
57
|
+
},
|
|
58
|
+
attempts: this.config.maxAttempts,
|
|
59
|
+
backoff: {
|
|
60
|
+
type: 'exponential',
|
|
61
|
+
delay: this.config.backoffDelay,
|
|
62
|
+
},
|
|
63
|
+
lifo: false, // RPC reply zawsze używa FIFO
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.default = JobOptionsBuilder;
|
|
68
|
+
//# sourceMappingURL=job-options-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-options-builder.js","sourceRoot":"","sources":["../../../src/command-bus/job/job-options-builder.ts"],"names":[],"mappings":";;AAGA;;;;;GAKG;AACH,MAAqB,iBAAiB;IACpC,YAA6B,MAAwB;QAAxB,WAAM,GAAN,MAAM,CAAkB;IAAG,CAAC;IAEzD;;;;OAIG;IACI,oBAAoB;QACzB,OAAO;YACL,kEAAkE;YAClE,yDAAyD;YACzD,gBAAgB,EAAE;gBAChB,KAAK,EAAE,GAAG;gBACV,GAAG,EAAE,EAAE,EAAE,UAAU;aACpB;YACD,+DAA+D;YAC/D,sCAAsC;YACtC,YAAY,EAAE;gBACZ,KAAK,EAAE,GAAG,EAAE,WAAW;gBACvB,GAAG,EAAE,IAAI,EAAE,gBAAgB;aAC5B;YACD,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACjC,OAAO,EAAE;gBACP,IAAI,EAAE,aAAsB;gBAC5B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;aAChC;YACD,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,MAAM;SACvC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACI,oBAAoB;QACzB,OAAO;YACL,+DAA+D;YAC/D,oEAAoE;YACpE,gBAAgB,EAAE;gBAChB,GAAG,EAAE,EAAE,EAAE,4CAA4C;gBACrD,KAAK,EAAE,EAAE,EAAE,+CAA+C;aAC3D;YACD,2DAA2D;YAC3D,YAAY,EAAE;gBACZ,GAAG,EAAE,GAAG,EAAE,2BAA2B;gBACrC,KAAK,EAAE,EAAE,EAAE,WAAW;aACvB;YACD,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACjC,OAAO,EAAE;gBACP,IAAI,EAAE,aAAsB;gBAC5B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;aAChC;YACD,IAAI,EAAE,KAAK,EAAE,8BAA8B;SAC5C,CAAC;IACJ,CAAC;CACF;AAzDD,oCAyDC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|