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,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
const fs = __importStar(require("fs/promises"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const command_logger_1 = __importDefault(require("./command-logger"));
|
|
51
|
+
const command_1 = __importDefault(require("../command"));
|
|
52
|
+
// Mock fs.promises
|
|
53
|
+
jest.mock('fs/promises');
|
|
54
|
+
// Przykładowa komenda testowa
|
|
55
|
+
class TestCommand extends command_1.default {
|
|
56
|
+
constructor(data) {
|
|
57
|
+
super();
|
|
58
|
+
this.data = data;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
describe('CommandLogger', () => {
|
|
62
|
+
let commandLogger;
|
|
63
|
+
let mockLogger;
|
|
64
|
+
const testLogDirectory = '/test/logs';
|
|
65
|
+
beforeEach(() => {
|
|
66
|
+
jest.clearAllMocks();
|
|
67
|
+
mockLogger = {
|
|
68
|
+
log: jest.fn(),
|
|
69
|
+
error: jest.fn(),
|
|
70
|
+
warn: jest.fn(),
|
|
71
|
+
debug: jest.fn(),
|
|
72
|
+
};
|
|
73
|
+
commandLogger = new command_logger_1.default(testLogDirectory, mockLogger);
|
|
74
|
+
});
|
|
75
|
+
describe('logCommand', () => {
|
|
76
|
+
it('powinno zapisać komendę do pliku JSONL z datą w nazwie', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
77
|
+
// Given
|
|
78
|
+
const mockDate = new Date('2025-10-01T12:00:00.000Z');
|
|
79
|
+
const originalDate = global.Date;
|
|
80
|
+
const DateMock = jest.fn(() => mockDate);
|
|
81
|
+
DateMock.now = jest.fn(() => mockDate.getTime());
|
|
82
|
+
Object.setPrototypeOf(DateMock, originalDate);
|
|
83
|
+
global.Date = DateMock;
|
|
84
|
+
const command = new TestCommand('test data');
|
|
85
|
+
const expectedFileName = path.join(testLogDirectory, 'commandbus_2025-10-01.jsonl');
|
|
86
|
+
const expectedContent = JSON.stringify(command) + '\n';
|
|
87
|
+
// When
|
|
88
|
+
yield commandLogger.logCommand(command);
|
|
89
|
+
// Then
|
|
90
|
+
expect(fs.appendFile).toHaveBeenCalledWith(expectedFileName, expectedContent);
|
|
91
|
+
// Cleanup
|
|
92
|
+
global.Date = originalDate;
|
|
93
|
+
}));
|
|
94
|
+
it('powinno zapisać wiele komend do tego samego pliku w tym samym dniu', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
95
|
+
// Given
|
|
96
|
+
const mockDate = new Date('2025-10-01T12:00:00.000Z');
|
|
97
|
+
const originalDate = global.Date;
|
|
98
|
+
const DateMock = jest.fn(() => mockDate);
|
|
99
|
+
DateMock.now = jest.fn(() => mockDate.getTime());
|
|
100
|
+
Object.setPrototypeOf(DateMock, originalDate);
|
|
101
|
+
global.Date = DateMock;
|
|
102
|
+
const command1 = new TestCommand('first');
|
|
103
|
+
const command2 = new TestCommand('second');
|
|
104
|
+
const expectedFileName = path.join(testLogDirectory, 'commandbus_2025-10-01.jsonl');
|
|
105
|
+
// When
|
|
106
|
+
yield commandLogger.logCommand(command1);
|
|
107
|
+
yield commandLogger.logCommand(command2);
|
|
108
|
+
// Then
|
|
109
|
+
expect(fs.appendFile).toHaveBeenCalledTimes(2);
|
|
110
|
+
expect(fs.appendFile).toHaveBeenNthCalledWith(1, expectedFileName, JSON.stringify(command1) + '\n');
|
|
111
|
+
expect(fs.appendFile).toHaveBeenNthCalledWith(2, expectedFileName, JSON.stringify(command2) + '\n');
|
|
112
|
+
// Cleanup
|
|
113
|
+
global.Date = originalDate;
|
|
114
|
+
}));
|
|
115
|
+
it('powinno utworzyć nowy plik dla nowego dnia', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
116
|
+
// Given
|
|
117
|
+
const originalDate = global.Date;
|
|
118
|
+
const date1 = new Date('2025-10-01T12:00:00.000Z');
|
|
119
|
+
const date2 = new Date('2025-10-02T12:00:00.000Z');
|
|
120
|
+
// Dzień 1 - setup
|
|
121
|
+
const DateMock1 = jest.fn(() => date1);
|
|
122
|
+
DateMock1.now = jest.fn(() => date1.getTime());
|
|
123
|
+
Object.setPrototypeOf(DateMock1, originalDate);
|
|
124
|
+
global.Date = DateMock1;
|
|
125
|
+
const command1 = new TestCommand('day1');
|
|
126
|
+
// When - dzień 1
|
|
127
|
+
yield commandLogger.logCommand(command1);
|
|
128
|
+
// Dzień 2 - setup
|
|
129
|
+
const DateMock2 = jest.fn(() => date2);
|
|
130
|
+
DateMock2.now = jest.fn(() => date2.getTime());
|
|
131
|
+
Object.setPrototypeOf(DateMock2, originalDate);
|
|
132
|
+
global.Date = DateMock2;
|
|
133
|
+
const command2 = new TestCommand('day2');
|
|
134
|
+
// When - dzień 2
|
|
135
|
+
yield commandLogger.logCommand(command2);
|
|
136
|
+
// Then
|
|
137
|
+
const file1 = path.join(testLogDirectory, 'commandbus_2025-10-01.jsonl');
|
|
138
|
+
const file2 = path.join(testLogDirectory, 'commandbus_2025-10-02.jsonl');
|
|
139
|
+
expect(fs.appendFile).toHaveBeenCalledWith(file1, JSON.stringify(command1) + '\n');
|
|
140
|
+
expect(fs.appendFile).toHaveBeenCalledWith(file2, JSON.stringify(command2) + '\n');
|
|
141
|
+
// Cleanup
|
|
142
|
+
global.Date = originalDate;
|
|
143
|
+
}));
|
|
144
|
+
it('powinno zalogować błąd gdy zapis do pliku się nie powiedzie', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
145
|
+
// Given
|
|
146
|
+
const error = new Error('Disk full');
|
|
147
|
+
fs.appendFile.mockRejectedValueOnce(error);
|
|
148
|
+
const mockDate = new Date('2025-10-01T12:00:00.000Z');
|
|
149
|
+
const originalDate = global.Date;
|
|
150
|
+
const DateMock = jest.fn(() => mockDate);
|
|
151
|
+
DateMock.now = jest.fn(() => mockDate.getTime());
|
|
152
|
+
Object.setPrototypeOf(DateMock, originalDate);
|
|
153
|
+
global.Date = DateMock;
|
|
154
|
+
const command = new TestCommand('test');
|
|
155
|
+
// When
|
|
156
|
+
yield commandLogger.logCommand(command);
|
|
157
|
+
// Then
|
|
158
|
+
expect(mockLogger.error).toHaveBeenCalledWith('Nie udało się zapisać komendy do logu:', error);
|
|
159
|
+
// Cleanup
|
|
160
|
+
global.Date = originalDate;
|
|
161
|
+
}));
|
|
162
|
+
it('powinno kontynuować działanie pomimo błędu zapisu', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
163
|
+
// Given
|
|
164
|
+
const mockDate = new Date('2025-10-01T12:00:00.000Z');
|
|
165
|
+
const originalDate = global.Date;
|
|
166
|
+
const DateMock = jest.fn(() => mockDate);
|
|
167
|
+
DateMock.now = jest.fn(() => mockDate.getTime());
|
|
168
|
+
Object.setPrototypeOf(DateMock, originalDate);
|
|
169
|
+
global.Date = DateMock;
|
|
170
|
+
const command1 = new TestCommand('first');
|
|
171
|
+
const command2 = new TestCommand('second');
|
|
172
|
+
fs.appendFile
|
|
173
|
+
.mockRejectedValueOnce(new Error('Failed'))
|
|
174
|
+
.mockResolvedValueOnce(undefined);
|
|
175
|
+
// When
|
|
176
|
+
yield commandLogger.logCommand(command1); // Should fail but not throw
|
|
177
|
+
yield commandLogger.logCommand(command2); // Should succeed
|
|
178
|
+
// Then
|
|
179
|
+
expect(fs.appendFile).toHaveBeenCalledTimes(2);
|
|
180
|
+
expect(mockLogger.error).toHaveBeenCalledTimes(1);
|
|
181
|
+
// Cleanup
|
|
182
|
+
global.Date = originalDate;
|
|
183
|
+
}));
|
|
184
|
+
it('powinno serializować komendę jako pojedynczą linię JSON', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
185
|
+
// Given
|
|
186
|
+
const mockDate = new Date('2025-10-01T12:00:00.000Z');
|
|
187
|
+
const originalDate = global.Date;
|
|
188
|
+
const DateMock = jest.fn(() => mockDate);
|
|
189
|
+
DateMock.now = jest.fn(() => mockDate.getTime());
|
|
190
|
+
Object.setPrototypeOf(DateMock, originalDate);
|
|
191
|
+
global.Date = DateMock;
|
|
192
|
+
const command = new TestCommand('complex\ndata\nwith\nnewlines');
|
|
193
|
+
// When
|
|
194
|
+
yield commandLogger.logCommand(command);
|
|
195
|
+
// Then
|
|
196
|
+
const calls = fs.appendFile.mock.calls;
|
|
197
|
+
const writtenContent = calls[0][1];
|
|
198
|
+
// Sprawdź że to pojedyncza linia zakończona \n
|
|
199
|
+
const lines = writtenContent.split('\n');
|
|
200
|
+
expect(lines.length).toBe(2); // Jedna linia + trailing newline = 2 elementy
|
|
201
|
+
expect(lines[0]).toContain('TestCommand');
|
|
202
|
+
expect(lines[1]).toBe(''); // Pusty string po trailing newline
|
|
203
|
+
// Cleanup
|
|
204
|
+
global.Date = originalDate;
|
|
205
|
+
}));
|
|
206
|
+
it('powinno zachować wszystkie właściwości komendy podczas serializacji', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
207
|
+
// Given
|
|
208
|
+
const mockDate = new Date('2025-10-01T12:00:00.000Z');
|
|
209
|
+
const originalDate = global.Date;
|
|
210
|
+
const DateMock = jest.fn(() => mockDate);
|
|
211
|
+
DateMock.now = jest.fn(() => mockDate.getTime());
|
|
212
|
+
Object.setPrototypeOf(DateMock, originalDate);
|
|
213
|
+
global.Date = DateMock;
|
|
214
|
+
const command = new TestCommand('test data');
|
|
215
|
+
const commandId = command.__id;
|
|
216
|
+
const commandName = command.__name;
|
|
217
|
+
// When
|
|
218
|
+
yield commandLogger.logCommand(command);
|
|
219
|
+
// Then
|
|
220
|
+
const calls = fs.appendFile.mock.calls;
|
|
221
|
+
const writtenContent = calls[0][1];
|
|
222
|
+
const parsed = JSON.parse(writtenContent.trim());
|
|
223
|
+
expect(parsed.__id).toBe(commandId);
|
|
224
|
+
expect(parsed.__name).toBe(commandName);
|
|
225
|
+
expect(parsed.data).toBe('test data');
|
|
226
|
+
// Cleanup
|
|
227
|
+
global.Date = originalDate;
|
|
228
|
+
}));
|
|
229
|
+
});
|
|
230
|
+
describe('constructor', () => {
|
|
231
|
+
it('powinno utworzyć logger z poprawnym katalogiem', () => {
|
|
232
|
+
// When
|
|
233
|
+
const logger = new command_logger_1.default('/custom/path', mockLogger);
|
|
234
|
+
// Then
|
|
235
|
+
expect(logger).toBeDefined();
|
|
236
|
+
});
|
|
237
|
+
it('powinno zaakceptować pusty string jako katalog', () => {
|
|
238
|
+
// When
|
|
239
|
+
const logger = new command_logger_1.default('', mockLogger);
|
|
240
|
+
// Then
|
|
241
|
+
expect(logger).toBeDefined();
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
//# sourceMappingURL=command-logger.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-logger.spec.js","sourceRoot":"","sources":["../../../src/command-bus/logging/command-logger.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
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.CommandLogger = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Moduł logowania komend
|
|
9
|
+
* Eksportuje CommandLogger do opcjonalnego logowania komend do plików
|
|
10
|
+
*/
|
|
11
|
+
var command_logger_1 = require("./command-logger");
|
|
12
|
+
Object.defineProperty(exports, "CommandLogger", { enumerable: true, get: function () { return __importDefault(command_logger_1).default; } });
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/command-bus/logging/index.ts"],"names":[],"mappings":";;;;;;AAAA;;;GAGG;AACH,mDAA4D;AAAnD,gIAAA,OAAO,OAAiB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
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.QueueManager = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Moduł zarządzania kolejkami BullMQ
|
|
9
|
+
* Eksportuje QueueManager odpowiedzialny za lifecycle kolejek
|
|
10
|
+
*/
|
|
11
|
+
var queue_manager_1 = require("./queue-manager");
|
|
12
|
+
Object.defineProperty(exports, "QueueManager", { enumerable: true, get: function () { return __importDefault(queue_manager_1).default; } });
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/command-bus/queue/index.ts"],"names":[],"mappings":";;;;;;AAAA;;;GAGG;AACH,iDAA0D;AAAjD,8HAAA,OAAO,OAAgB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Queue } from 'bullmq';
|
|
2
|
+
import type { Redis } from 'ioredis';
|
|
3
|
+
import type { ILogger } from '../../shared/types';
|
|
4
|
+
/**
|
|
5
|
+
* Zarządza cyklem życia kolejek BullMQ i cache'em reply queues
|
|
6
|
+
*/
|
|
7
|
+
export default class QueueManager {
|
|
8
|
+
private readonly redisConnection;
|
|
9
|
+
private readonly logger;
|
|
10
|
+
constructor(redisConnection: Redis, logger: ILogger);
|
|
11
|
+
/**
|
|
12
|
+
* Tworzy kolejkę dla danego typu komendy
|
|
13
|
+
* Reużywa własne Redis connection dla optymalizacji pamięci
|
|
14
|
+
* @param commandName - Nazwa komendy
|
|
15
|
+
* @param connection - Połączenie Redis (opcjonalne)
|
|
16
|
+
*/
|
|
17
|
+
createQueue(commandName: string, connection?: Redis): Queue;
|
|
18
|
+
/**
|
|
19
|
+
* Sprawdza czy kolejka BullMQ istnieje w Redis
|
|
20
|
+
* @param queueName - Nazwa kolejki do sprawdzenia
|
|
21
|
+
* @returns true jeśli kolejka istnieje, false w przeciwnym razie
|
|
22
|
+
*/
|
|
23
|
+
queueExists(queueName: string): Promise<boolean>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const bullmq_1 = require("bullmq");
|
|
13
|
+
/**
|
|
14
|
+
* Zarządza cyklem życia kolejek BullMQ i cache'em reply queues
|
|
15
|
+
*/
|
|
16
|
+
class QueueManager {
|
|
17
|
+
constructor(redisConnection, logger) {
|
|
18
|
+
this.redisConnection = redisConnection;
|
|
19
|
+
this.logger = logger;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Tworzy kolejkę dla danego typu komendy
|
|
23
|
+
* Reużywa własne Redis connection dla optymalizacji pamięci
|
|
24
|
+
* @param commandName - Nazwa komendy
|
|
25
|
+
* @param connection - Połączenie Redis (opcjonalne)
|
|
26
|
+
*/
|
|
27
|
+
createQueue(commandName, connection) {
|
|
28
|
+
this.logger.debug('Tworzenie kolejki', {
|
|
29
|
+
commandName,
|
|
30
|
+
timestamp: new Date().toISOString(),
|
|
31
|
+
});
|
|
32
|
+
return new bullmq_1.Queue(`{${commandName}}`, {
|
|
33
|
+
connection: connection !== null && connection !== void 0 ? connection : this.redisConnection,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Sprawdza czy kolejka BullMQ istnieje w Redis
|
|
38
|
+
* @param queueName - Nazwa kolejki do sprawdzenia
|
|
39
|
+
* @returns true jeśli kolejka istnieje, false w przeciwnym razie
|
|
40
|
+
*/
|
|
41
|
+
queueExists(queueName) {
|
|
42
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
+
try {
|
|
44
|
+
const metaKey = `bull:{${queueName}}:meta`;
|
|
45
|
+
const exists = yield this.redisConnection.exists(metaKey);
|
|
46
|
+
return exists === 1;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
this.logger.warn('Błąd podczas sprawdzania istnienia kolejki', {
|
|
50
|
+
queueName,
|
|
51
|
+
error: error instanceof Error ? error.message : String(error),
|
|
52
|
+
timestamp: new Date().toISOString(),
|
|
53
|
+
});
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.default = QueueManager;
|
|
60
|
+
//# sourceMappingURL=queue-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-manager.js","sourceRoot":"","sources":["../../../src/command-bus/queue/queue-manager.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,mCAA+B;AAI/B;;GAEG;AACH,MAAqB,YAAY;IAC/B,YACmB,eAAsB,EACtB,MAAe;QADf,oBAAe,GAAf,eAAe,CAAO;QACtB,WAAM,GAAN,MAAM,CAAS;IAC/B,CAAC;IAEJ;;;;;OAKG;IACI,WAAW,CAAC,WAAmB,EAAE,UAAkB;QACxD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE;YACrC,WAAW;YACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,OAAO,IAAI,cAAK,CAAC,IAAI,WAAW,GAAG,EAAE;YACnC,UAAU,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,CAAC,eAAe;SAC/C,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACU,WAAW,CAAC,SAAiB;;YACxC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,SAAS,SAAS,QAAQ,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC1D,OAAO,MAAM,KAAK,CAAC,CAAC;YACtB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE;oBAC7D,SAAS;oBACT,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;gBACH,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;KAAA;CACF;AA1CD,+BA0CC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,219 @@
|
|
|
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 queue_manager_1 = __importDefault(require("./queue-manager"));
|
|
16
|
+
const bullmq_1 = require("bullmq");
|
|
17
|
+
// Mock BullMQ Queue
|
|
18
|
+
jest.mock('bullmq');
|
|
19
|
+
describe('QueueManager', () => {
|
|
20
|
+
let queueManager;
|
|
21
|
+
let mockRedisConnection;
|
|
22
|
+
let mockLogger;
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
jest.clearAllMocks();
|
|
25
|
+
// Mock Redis connection
|
|
26
|
+
mockRedisConnection = {};
|
|
27
|
+
// Mock logger
|
|
28
|
+
mockLogger = {
|
|
29
|
+
log: jest.fn(),
|
|
30
|
+
error: jest.fn(),
|
|
31
|
+
warn: jest.fn(),
|
|
32
|
+
debug: jest.fn(),
|
|
33
|
+
};
|
|
34
|
+
queueManager = new queue_manager_1.default(mockRedisConnection, mockLogger);
|
|
35
|
+
});
|
|
36
|
+
describe('konstruktor', () => {
|
|
37
|
+
it('powinno utworzyć instancję z poprawnymi parametrami', () => {
|
|
38
|
+
// When
|
|
39
|
+
const manager = new queue_manager_1.default(mockRedisConnection, mockLogger);
|
|
40
|
+
// Then
|
|
41
|
+
expect(manager).toBeDefined();
|
|
42
|
+
expect(manager).toBeInstanceOf(queue_manager_1.default);
|
|
43
|
+
});
|
|
44
|
+
it('powinno zachować przekazane zależności', () => {
|
|
45
|
+
// Given
|
|
46
|
+
const customRedis = {};
|
|
47
|
+
const customLogger = {
|
|
48
|
+
log: jest.fn(),
|
|
49
|
+
error: jest.fn(),
|
|
50
|
+
warn: jest.fn(),
|
|
51
|
+
debug: jest.fn(),
|
|
52
|
+
};
|
|
53
|
+
// When
|
|
54
|
+
const manager = new queue_manager_1.default(customRedis, customLogger);
|
|
55
|
+
// Then
|
|
56
|
+
expect(manager).toBeDefined();
|
|
57
|
+
// Tworzymy kolejkę aby sprawdzić czy używa przekazanych parametrów
|
|
58
|
+
manager.createQueue('test-command');
|
|
59
|
+
expect(bullmq_1.Queue).toHaveBeenCalledWith('{test-command}', {
|
|
60
|
+
connection: customRedis,
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
describe('createQueue', () => {
|
|
65
|
+
it('powinno utworzyć kolejkę BullMQ z poprawną nazwą', () => {
|
|
66
|
+
// Given
|
|
67
|
+
const commandName = 'TestCommand';
|
|
68
|
+
// When
|
|
69
|
+
queueManager.createQueue(commandName);
|
|
70
|
+
// Then
|
|
71
|
+
expect(bullmq_1.Queue).toHaveBeenCalledWith(`{${commandName}}`, expect.any(Object));
|
|
72
|
+
});
|
|
73
|
+
it('powinno użyć przekazanego Redis connection', () => {
|
|
74
|
+
// Given
|
|
75
|
+
const commandName = 'TestCommand';
|
|
76
|
+
// When
|
|
77
|
+
queueManager.createQueue(commandName);
|
|
78
|
+
// Then
|
|
79
|
+
expect(bullmq_1.Queue).toHaveBeenCalledWith(`{${commandName}}`, {
|
|
80
|
+
connection: mockRedisConnection,
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
it('powinno zalogować informację o tworzeniu kolejki', () => {
|
|
84
|
+
// Given
|
|
85
|
+
const commandName = 'TestCommand';
|
|
86
|
+
const mockDate = new Date('2025-01-27T10:00:00.000Z');
|
|
87
|
+
const originalDate = global.Date;
|
|
88
|
+
const DateMock = jest.fn(() => mockDate);
|
|
89
|
+
DateMock.now = jest.fn(() => mockDate.getTime());
|
|
90
|
+
Object.setPrototypeOf(DateMock, originalDate);
|
|
91
|
+
global.Date = DateMock;
|
|
92
|
+
// When
|
|
93
|
+
queueManager.createQueue(commandName);
|
|
94
|
+
// Then
|
|
95
|
+
expect(mockLogger.debug).toHaveBeenCalledWith('Tworzenie kolejki', {
|
|
96
|
+
commandName,
|
|
97
|
+
timestamp: mockDate.toISOString(),
|
|
98
|
+
});
|
|
99
|
+
// Cleanup
|
|
100
|
+
global.Date = originalDate;
|
|
101
|
+
});
|
|
102
|
+
it('powinno zwrócić instancję Queue', () => {
|
|
103
|
+
// Given
|
|
104
|
+
const commandName = 'TestCommand';
|
|
105
|
+
const mockQueueInstance = { name: commandName };
|
|
106
|
+
bullmq_1.Queue.mockReturnValue(mockQueueInstance);
|
|
107
|
+
// When
|
|
108
|
+
const result = queueManager.createQueue(commandName);
|
|
109
|
+
// Then
|
|
110
|
+
expect(result).toBe(mockQueueInstance);
|
|
111
|
+
});
|
|
112
|
+
it('powinno tworzyć różne kolejki dla różnych nazw komend', () => {
|
|
113
|
+
// Given
|
|
114
|
+
const commandName1 = 'FirstCommand';
|
|
115
|
+
const commandName2 = 'SecondCommand';
|
|
116
|
+
// When
|
|
117
|
+
queueManager.createQueue(commandName1);
|
|
118
|
+
queueManager.createQueue(commandName2);
|
|
119
|
+
// Then
|
|
120
|
+
expect(bullmq_1.Queue).toHaveBeenCalledTimes(2);
|
|
121
|
+
expect(bullmq_1.Queue).toHaveBeenNthCalledWith(1, `{${commandName1}}`, expect.any(Object));
|
|
122
|
+
expect(bullmq_1.Queue).toHaveBeenNthCalledWith(2, `{${commandName2}}`, expect.any(Object));
|
|
123
|
+
});
|
|
124
|
+
it('powinno reużywać to samo Redis connection dla wielu kolejek', () => {
|
|
125
|
+
// Given
|
|
126
|
+
const commandName1 = 'FirstCommand';
|
|
127
|
+
const commandName2 = 'SecondCommand';
|
|
128
|
+
const commandName3 = 'ThirdCommand';
|
|
129
|
+
// When
|
|
130
|
+
queueManager.createQueue(commandName1);
|
|
131
|
+
queueManager.createQueue(commandName2);
|
|
132
|
+
queueManager.createQueue(commandName3);
|
|
133
|
+
// Then
|
|
134
|
+
expect(bullmq_1.Queue).toHaveBeenCalledTimes(3);
|
|
135
|
+
// Wszystkie powinny używać tego samego Redis connection
|
|
136
|
+
expect(bullmq_1.Queue).toHaveBeenNthCalledWith(1, `{${commandName1}}`, {
|
|
137
|
+
connection: mockRedisConnection,
|
|
138
|
+
});
|
|
139
|
+
expect(bullmq_1.Queue).toHaveBeenNthCalledWith(2, `{${commandName2}}`, {
|
|
140
|
+
connection: mockRedisConnection,
|
|
141
|
+
});
|
|
142
|
+
expect(bullmq_1.Queue).toHaveBeenNthCalledWith(3, `{${commandName3}}`, {
|
|
143
|
+
connection: mockRedisConnection,
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
it('powinno zawierać metadata w logach (commandName, timestamp)', () => {
|
|
147
|
+
// Given
|
|
148
|
+
const commandName = 'MetadataTestCommand';
|
|
149
|
+
const mockDate = new Date('2025-01-27T15:30:45.123Z');
|
|
150
|
+
const originalDate = global.Date;
|
|
151
|
+
const DateMock = jest.fn(() => mockDate);
|
|
152
|
+
DateMock.now = jest.fn(() => mockDate.getTime());
|
|
153
|
+
Object.setPrototypeOf(DateMock, originalDate);
|
|
154
|
+
global.Date = DateMock;
|
|
155
|
+
// When
|
|
156
|
+
queueManager.createQueue(commandName);
|
|
157
|
+
// Then
|
|
158
|
+
expect(mockLogger.debug).toHaveBeenCalledWith('Tworzenie kolejki', {
|
|
159
|
+
commandName: commandName,
|
|
160
|
+
timestamp: mockDate.toISOString(),
|
|
161
|
+
});
|
|
162
|
+
// Weryfikacja że wszystkie wymagane pola są obecne
|
|
163
|
+
const logCall = mockLogger.debug.mock.calls[0];
|
|
164
|
+
const metadata = logCall[1];
|
|
165
|
+
expect(metadata).toHaveProperty('commandName');
|
|
166
|
+
expect(metadata).toHaveProperty('timestamp');
|
|
167
|
+
expect(metadata.commandName).toBe(`${commandName}`);
|
|
168
|
+
expect(metadata.timestamp).toBe('2025-01-27T15:30:45.123Z');
|
|
169
|
+
// Cleanup
|
|
170
|
+
global.Date = originalDate;
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
describe('queueExists', () => {
|
|
174
|
+
it('powinno zwrócić true gdy kolejka istnieje w Redis', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
175
|
+
// Given
|
|
176
|
+
const queueName = 'ExistingQueue';
|
|
177
|
+
mockRedisConnection.exists = jest.fn().mockResolvedValue(1);
|
|
178
|
+
// When
|
|
179
|
+
const result = yield queueManager.queueExists(queueName);
|
|
180
|
+
// Then
|
|
181
|
+
expect(result).toBe(true);
|
|
182
|
+
expect(mockRedisConnection.exists).toHaveBeenCalledWith(`bull:{${queueName}}:meta`);
|
|
183
|
+
}));
|
|
184
|
+
it('powinno zwrócić false gdy kolejka nie istnieje w Redis', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
185
|
+
// Given
|
|
186
|
+
const queueName = 'NonExistingQueue';
|
|
187
|
+
mockRedisConnection.exists = jest.fn().mockResolvedValue(0);
|
|
188
|
+
// When
|
|
189
|
+
const result = yield queueManager.queueExists(queueName);
|
|
190
|
+
// Then
|
|
191
|
+
expect(result).toBe(false);
|
|
192
|
+
expect(mockRedisConnection.exists).toHaveBeenCalledWith(`bull:{${queueName}}:meta`);
|
|
193
|
+
}));
|
|
194
|
+
it('powinno sprawdzać klucz meta kolejki BullMQ', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
195
|
+
// Given
|
|
196
|
+
const queueName = 'TestQueue';
|
|
197
|
+
mockRedisConnection.exists = jest.fn().mockResolvedValue(1);
|
|
198
|
+
// When
|
|
199
|
+
yield queueManager.queueExists(queueName);
|
|
200
|
+
// Then
|
|
201
|
+
// Sprawdzamy dokładny format klucza BullMQ
|
|
202
|
+
expect(mockRedisConnection.exists).toHaveBeenCalledWith('bull:{TestQueue}:meta');
|
|
203
|
+
}));
|
|
204
|
+
it('powinno zwrócić false gdy Redis zwróci błąd', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
205
|
+
// Given
|
|
206
|
+
const queueName = 'ErrorQueue';
|
|
207
|
+
mockRedisConnection.exists = jest.fn().mockRejectedValue(new Error('Redis error'));
|
|
208
|
+
// When
|
|
209
|
+
const result = yield queueManager.queueExists(queueName);
|
|
210
|
+
// Then
|
|
211
|
+
expect(result).toBe(false);
|
|
212
|
+
expect(mockLogger.warn).toHaveBeenCalledWith('Błąd podczas sprawdzania istnienia kolejki', expect.objectContaining({
|
|
213
|
+
queueName,
|
|
214
|
+
error: 'Redis error',
|
|
215
|
+
}));
|
|
216
|
+
}));
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
//# sourceMappingURL=queue-manager.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-manager.spec.js","sourceRoot":"","sources":["../../../src/command-bus/queue/queue-manager.spec.ts"],"names":[],"mappings":"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"}
|