rabbitmq-sdk 0.0.1-security → 1.2.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.
Potentially problematic release.
This version of rabbitmq-sdk might be problematic. Click here for more details.
- package/.eslintrc.js +23 -0
- package/.kiro/specs/sdk-rabbitmq/design.md +369 -0
- package/.kiro/specs/sdk-rabbitmq/requirements.md +97 -0
- package/.kiro/specs/sdk-rabbitmq/tasks.md +248 -0
- package/README.md +273 -5
- package/bun.lock +790 -0
- package/config.example.json +13 -0
- package/dist/components/ConfigurationManager.d.ts +35 -0
- package/dist/components/ConfigurationManager.d.ts.map +1 -0
- package/dist/components/ConfigurationManager.js +118 -0
- package/dist/components/ConfigurationManager.js.map +1 -0
- package/dist/components/ConnectionManager.d.ts +93 -0
- package/dist/components/ConnectionManager.d.ts.map +1 -0
- package/dist/components/ConnectionManager.js +349 -0
- package/dist/components/ConnectionManager.js.map +1 -0
- package/dist/components/DLQHandler.d.ts +81 -0
- package/dist/components/DLQHandler.d.ts.map +1 -0
- package/dist/components/DLQHandler.js +228 -0
- package/dist/components/DLQHandler.js.map +1 -0
- package/dist/components/Logger.d.ts +77 -0
- package/dist/components/Logger.d.ts.map +1 -0
- package/dist/components/Logger.js +193 -0
- package/dist/components/Logger.js.map +1 -0
- package/dist/components/MessagePublisher.d.ts +49 -0
- package/dist/components/MessagePublisher.d.ts.map +1 -0
- package/dist/components/MessagePublisher.js +158 -0
- package/dist/components/MessagePublisher.js.map +1 -0
- package/dist/components/MessageSubscriber.d.ts +108 -0
- package/dist/components/MessageSubscriber.d.ts.map +1 -0
- package/dist/components/MessageSubscriber.js +503 -0
- package/dist/components/MessageSubscriber.js.map +1 -0
- package/dist/components/ResourceCreator.d.ts +89 -0
- package/dist/components/ResourceCreator.d.ts.map +1 -0
- package/dist/components/ResourceCreator.js +352 -0
- package/dist/components/ResourceCreator.js.map +1 -0
- package/dist/components/SdkRabbitmq.d.ts +103 -0
- package/dist/components/SdkRabbitmq.d.ts.map +1 -0
- package/dist/components/SdkRabbitmq.js +364 -0
- package/dist/components/SdkRabbitmq.js.map +1 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +20 -0
- package/dist/components/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/IConfiguration.d.ts +35 -0
- package/dist/interfaces/IConfiguration.d.ts.map +1 -0
- package/dist/interfaces/IConfiguration.js +3 -0
- package/dist/interfaces/IConfiguration.js.map +1 -0
- package/dist/interfaces/IConnection.d.ts +21 -0
- package/dist/interfaces/IConnection.d.ts.map +1 -0
- package/dist/interfaces/IConnection.js +3 -0
- package/dist/interfaces/IConnection.js.map +1 -0
- package/dist/interfaces/IDLQ.d.ts +12 -0
- package/dist/interfaces/IDLQ.d.ts.map +1 -0
- package/dist/interfaces/IDLQ.js +3 -0
- package/dist/interfaces/IDLQ.js.map +1 -0
- package/dist/interfaces/IErrors.d.ts +33 -0
- package/dist/interfaces/IErrors.d.ts.map +1 -0
- package/dist/interfaces/IErrors.js +56 -0
- package/dist/interfaces/IErrors.js.map +1 -0
- package/dist/interfaces/ILogger.d.ts +14 -0
- package/dist/interfaces/ILogger.d.ts.map +1 -0
- package/dist/interfaces/ILogger.js +3 -0
- package/dist/interfaces/ILogger.js.map +1 -0
- package/dist/interfaces/IMessage.d.ts +52 -0
- package/dist/interfaces/IMessage.d.ts.map +1 -0
- package/dist/interfaces/IMessage.js +3 -0
- package/dist/interfaces/IMessage.js.map +1 -0
- package/dist/interfaces/IResource.d.ts +31 -0
- package/dist/interfaces/IResource.d.ts.map +1 -0
- package/dist/interfaces/IResource.js +3 -0
- package/dist/interfaces/IResource.js.map +1 -0
- package/dist/interfaces/ISdkRabbitmq.d.ts +17 -0
- package/dist/interfaces/ISdkRabbitmq.d.ts.map +1 -0
- package/dist/interfaces/ISdkRabbitmq.js +3 -0
- package/dist/interfaces/ISdkRabbitmq.js.map +1 -0
- package/dist/interfaces/index.d.ts +9 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +33 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/utils/configSchema.d.ts +8 -0
- package/dist/utils/configSchema.d.ts.map +1 -0
- package/dist/utils/configSchema.js +51 -0
- package/dist/utils/configSchema.js.map +1 -0
- package/docker-compose.yml +24 -0
- package/example.ts +65 -0
- package/examples/README-dynamic-routing.md +155 -0
- package/examples/bind-unbind-example.js +56 -0
- package/examples/test-chatbot-exchange.ts +83 -0
- package/examples/test-dynamic-routing-flow.js +299 -0
- package/examples/test-dynamic-routing-flow.ts +355 -0
- package/examples/test-no-disconnect.ts +0 -0
- package/examples/test-raw-rabbitmq.js +68 -0
- package/examples/test-same-channel.ts +81 -0
- package/examples/test-schedule-flow.ts +713 -0
- package/examples/test-simple-greeting.ts +66 -0
- package/examples/test-simple-schedule.ts +76 -0
- package/examples/test-wildcard.ts +364 -0
- package/jest.config.js +17 -0
- package/package.json +42 -4
- package/preinstall.js +1 -0
- package/prompts/test-dynamic-routing-flow.md +46 -0
- package/run.js +4 -0
- package/scripts/run-dynamic-routing-test.ts +31 -0
- package/src/.gitkeep +1 -0
- package/src/components/.gitkeep +1 -0
- package/src/components/ConfigurationManager.ts +104 -0
- package/src/components/ConnectionManager.ts +357 -0
- package/src/components/DLQHandler.ts +271 -0
- package/src/components/Logger.ts +224 -0
- package/src/components/MessagePublisher.ts +180 -0
- package/src/components/MessageSubscriber.ts +597 -0
- package/src/components/ResourceCreator.ts +411 -0
- package/src/components/SdkRabbitmq.ts +443 -0
- package/src/components/__tests__/ConfigurationManager.test.ts +357 -0
- package/src/components/__tests__/ConnectionManager.test.ts +387 -0
- package/src/components/__tests__/DLQHandler.test.ts +399 -0
- package/src/components/__tests__/Logger.test.ts +354 -0
- package/src/components/__tests__/MessagePublisher.test.ts +337 -0
- package/src/components/__tests__/MessageSubscriber.test.ts +542 -0
- package/src/components/__tests__/ResourceCreator.test.ts +465 -0
- package/src/components/__tests__/SdkRabbitmq.integration.test.ts +433 -0
- package/src/components/index.ts +8 -0
- package/src/index.ts +11 -0
- package/src/interfaces/.gitkeep +1 -0
- package/src/interfaces/IConfiguration.ts +38 -0
- package/src/interfaces/IConnection.ts +27 -0
- package/src/interfaces/IDLQ.ts +13 -0
- package/src/interfaces/IErrors.ts +53 -0
- package/src/interfaces/ILogger.ts +16 -0
- package/src/interfaces/IMessage.ts +65 -0
- package/src/interfaces/IResource.ts +35 -0
- package/src/interfaces/ISdkRabbitmq.ts +26 -0
- package/src/interfaces/index.ts +23 -0
- package/src/utils/.gitkeep +1 -0
- package/src/utils/configSchema.ts +58 -0
- package/tsconfig.json +34 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { IDLQHandler } from '../interfaces/IDLQ';
|
|
2
|
+
import { IConfiguration } from '../interfaces/IConfiguration';
|
|
3
|
+
import { ConnectionManager } from './ConnectionManager';
|
|
4
|
+
import { ResourceCreator } from './ResourceCreator';
|
|
5
|
+
/**
|
|
6
|
+
* DLQHandler manages Dead Letter Queue functionality
|
|
7
|
+
* Handles DLQ setup, configuration, and failed message routing
|
|
8
|
+
*/
|
|
9
|
+
export declare class DLQHandler implements IDLQHandler {
|
|
10
|
+
private config;
|
|
11
|
+
private connectionManager;
|
|
12
|
+
private resourceCreator;
|
|
13
|
+
private dlqSetupCache;
|
|
14
|
+
private logger;
|
|
15
|
+
constructor(config: IConfiguration, connectionManager: ConnectionManager, resourceCreator: ResourceCreator);
|
|
16
|
+
/**
|
|
17
|
+
* Check if DLQ is enabled in configuration
|
|
18
|
+
* @returns boolean indicating if DLQ is active
|
|
19
|
+
*/
|
|
20
|
+
isEnabled(): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Set up DLQ for a given original queue
|
|
23
|
+
* Creates DLQ exchange and queue following naming conventions
|
|
24
|
+
* @param originalQueue Original queue name
|
|
25
|
+
* @returns Promise<string> DLQ queue name
|
|
26
|
+
*/
|
|
27
|
+
setupDLQ(originalQueue: string): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Handle a failed message by routing to DLQ
|
|
30
|
+
* @param message Failed message object
|
|
31
|
+
* @param originalQueue Original queue name where message failed
|
|
32
|
+
*/
|
|
33
|
+
handleFailedMessage(message: any, originalQueue: string): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Get DLQ exchange name following naming convention
|
|
36
|
+
* @param originalQueue Original queue name
|
|
37
|
+
* @returns DLQ exchange name (original-queue.dlq)
|
|
38
|
+
*/
|
|
39
|
+
private getDLQExchangeName;
|
|
40
|
+
/**
|
|
41
|
+
* Get DLQ queue name following naming convention
|
|
42
|
+
* @param originalQueue Original queue name
|
|
43
|
+
* @returns DLQ queue name (original-queue.dlq)
|
|
44
|
+
*/
|
|
45
|
+
private getDLQQueueName;
|
|
46
|
+
/**
|
|
47
|
+
* Prepare message for DLQ with original metadata
|
|
48
|
+
* @param message Original message
|
|
49
|
+
* @param originalQueue Original queue name
|
|
50
|
+
* @returns Enhanced message with DLQ metadata
|
|
51
|
+
*/
|
|
52
|
+
private prepareDLQMessage;
|
|
53
|
+
/**
|
|
54
|
+
* Route message to DLQ exchange
|
|
55
|
+
* @param dlqExchange DLQ exchange name
|
|
56
|
+
* @param routingKey Routing key (original queue name)
|
|
57
|
+
* @param message Message to route
|
|
58
|
+
*/
|
|
59
|
+
private routeMessageToDLQ;
|
|
60
|
+
/**
|
|
61
|
+
* Get retry count from message properties
|
|
62
|
+
* @param properties Message properties
|
|
63
|
+
* @returns Current retry count
|
|
64
|
+
*/
|
|
65
|
+
private getRetryCount;
|
|
66
|
+
/**
|
|
67
|
+
* Clear DLQ setup cache (useful for testing)
|
|
68
|
+
*/
|
|
69
|
+
clearCache(): void;
|
|
70
|
+
/**
|
|
71
|
+
* Get cache statistics for monitoring
|
|
72
|
+
*/
|
|
73
|
+
getCacheStats(): {
|
|
74
|
+
setupCache: number;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Get DLQ configuration
|
|
78
|
+
*/
|
|
79
|
+
getDLQConfig(): IConfiguration['dlq'];
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=DLQHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DLQHandler.d.ts","sourceRoot":"","sources":["../../src/components/DLQHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD;;;GAGG;AACH,qBAAa,UAAW,YAAW,WAAW;IAC5C,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,MAAM,CAAS;gBAGrB,MAAM,EAAE,cAAc,EACtB,iBAAiB,EAAE,iBAAiB,EACpC,eAAe,EAAE,eAAe;IAQlC;;;OAGG;IACI,SAAS,IAAI,OAAO;IAI3B;;;;;OAKG;IACU,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4D7D;;;;OAIG;IACU,mBAAmB,CAAC,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCpF;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAIvB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAwBzB;;;;;OAKG;YACW,iBAAiB;IAmC/B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACI,UAAU,IAAI,IAAI;IAKzB;;OAEG;IACI,aAAa,IAAI;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE;IAM9C;;OAEG;IACI,YAAY,IAAI,cAAc,CAAC,KAAK,CAAC;CAG7C"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DLQHandler = void 0;
|
|
4
|
+
const Logger_1 = require("./Logger");
|
|
5
|
+
/**
|
|
6
|
+
* DLQHandler manages Dead Letter Queue functionality
|
|
7
|
+
* Handles DLQ setup, configuration, and failed message routing
|
|
8
|
+
*/
|
|
9
|
+
class DLQHandler {
|
|
10
|
+
constructor(config, connectionManager, resourceCreator) {
|
|
11
|
+
this.dlqSetupCache = new Set();
|
|
12
|
+
this.config = config;
|
|
13
|
+
this.connectionManager = connectionManager;
|
|
14
|
+
this.resourceCreator = resourceCreator;
|
|
15
|
+
this.logger = Logger_1.Logger.createComponentLogger('DLQHandler', config.logging);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Check if DLQ is enabled in configuration
|
|
19
|
+
* @returns boolean indicating if DLQ is active
|
|
20
|
+
*/
|
|
21
|
+
isEnabled() {
|
|
22
|
+
return this.config.dlq.active;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Set up DLQ for a given original queue
|
|
26
|
+
* Creates DLQ exchange and queue following naming conventions
|
|
27
|
+
* @param originalQueue Original queue name
|
|
28
|
+
* @returns Promise<string> DLQ queue name
|
|
29
|
+
*/
|
|
30
|
+
async setupDLQ(originalQueue) {
|
|
31
|
+
if (!originalQueue) {
|
|
32
|
+
throw new Error('Original queue name is required for DLQ setup');
|
|
33
|
+
}
|
|
34
|
+
if (!this.isEnabled()) {
|
|
35
|
+
throw new Error('DLQ is not enabled in configuration');
|
|
36
|
+
}
|
|
37
|
+
// Check cache to avoid duplicate setup
|
|
38
|
+
if (this.dlqSetupCache.has(originalQueue)) {
|
|
39
|
+
return this.getDLQQueueName(originalQueue);
|
|
40
|
+
}
|
|
41
|
+
const dlqExchangeName = this.getDLQExchangeName(originalQueue);
|
|
42
|
+
const dlqQueueName = this.getDLQQueueName(originalQueue);
|
|
43
|
+
try {
|
|
44
|
+
// Create DLQ exchange
|
|
45
|
+
await this.resourceCreator.ensureExchange(dlqExchangeName, 'direct', {
|
|
46
|
+
durable: true,
|
|
47
|
+
autoDelete: false
|
|
48
|
+
});
|
|
49
|
+
// Create DLQ queue with TTL if configured
|
|
50
|
+
const queueOptions = {
|
|
51
|
+
durable: true,
|
|
52
|
+
exclusive: false,
|
|
53
|
+
autoDelete: false
|
|
54
|
+
};
|
|
55
|
+
// Add TTL if configured
|
|
56
|
+
if (this.config.dlq.ttl && this.config.dlq.ttl > 0) {
|
|
57
|
+
queueOptions.arguments = {
|
|
58
|
+
'x-message-ttl': this.config.dlq.ttl
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
await this.resourceCreator.ensureQueue(dlqQueueName, queueOptions);
|
|
62
|
+
// Bind DLQ queue to DLQ exchange
|
|
63
|
+
await this.resourceCreator.bindQueue(dlqQueueName, dlqExchangeName, originalQueue);
|
|
64
|
+
// Cache successful setup
|
|
65
|
+
this.dlqSetupCache.add(originalQueue);
|
|
66
|
+
this.logger.logOperation('setupDLQ', `DLQ setup completed`, {
|
|
67
|
+
originalQueue,
|
|
68
|
+
dlqExchange: dlqExchangeName,
|
|
69
|
+
dlqQueue: dlqQueueName,
|
|
70
|
+
ttl: this.config.dlq.ttl
|
|
71
|
+
});
|
|
72
|
+
return dlqQueueName;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
this.logger.logError(`Failed to setup DLQ`, error, { originalQueue });
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Handle a failed message by routing to DLQ
|
|
81
|
+
* @param message Failed message object
|
|
82
|
+
* @param originalQueue Original queue name where message failed
|
|
83
|
+
*/
|
|
84
|
+
async handleFailedMessage(message, originalQueue) {
|
|
85
|
+
if (!originalQueue) {
|
|
86
|
+
throw new Error('Original queue name is required for failed message handling');
|
|
87
|
+
}
|
|
88
|
+
if (!message) {
|
|
89
|
+
throw new Error('Message is required for failed message handling');
|
|
90
|
+
}
|
|
91
|
+
if (!this.isEnabled()) {
|
|
92
|
+
this.logger.info(`DLQ is disabled. Acknowledging failed message without reprocessing`, {
|
|
93
|
+
originalQueue
|
|
94
|
+
});
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
// Ensure DLQ is set up for this queue
|
|
99
|
+
await this.setupDLQ(originalQueue);
|
|
100
|
+
const dlqExchangeName = this.getDLQExchangeName(originalQueue);
|
|
101
|
+
// Prepare message for DLQ with original metadata
|
|
102
|
+
const dlqMessage = this.prepareDLQMessage(message, originalQueue);
|
|
103
|
+
// Route message to DLQ
|
|
104
|
+
await this.routeMessageToDLQ(dlqExchangeName, originalQueue, dlqMessage);
|
|
105
|
+
this.logger.logOperation('routeToDLQ', `Failed message routed to DLQ`, {
|
|
106
|
+
originalQueue,
|
|
107
|
+
dlqExchange: dlqExchangeName
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
this.logger.logError(`Failed to handle failed message`, error, { originalQueue });
|
|
112
|
+
throw error;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get DLQ exchange name following naming convention
|
|
117
|
+
* @param originalQueue Original queue name
|
|
118
|
+
* @returns DLQ exchange name (original-queue.dlq)
|
|
119
|
+
*/
|
|
120
|
+
getDLQExchangeName(originalQueue) {
|
|
121
|
+
return `${originalQueue}.dlq`;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get DLQ queue name following naming convention
|
|
125
|
+
* @param originalQueue Original queue name
|
|
126
|
+
* @returns DLQ queue name (original-queue.dlq)
|
|
127
|
+
*/
|
|
128
|
+
getDLQQueueName(originalQueue) {
|
|
129
|
+
return `${originalQueue}.dlq`;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Prepare message for DLQ with original metadata
|
|
133
|
+
* @param message Original message
|
|
134
|
+
* @param originalQueue Original queue name
|
|
135
|
+
* @returns Enhanced message with DLQ metadata
|
|
136
|
+
*/
|
|
137
|
+
prepareDLQMessage(message, originalQueue) {
|
|
138
|
+
const now = new Date();
|
|
139
|
+
// Extract original message content and metadata
|
|
140
|
+
const originalContent = message.content ? message.content : message;
|
|
141
|
+
const originalProperties = message.properties || {};
|
|
142
|
+
const originalFields = message.fields || {};
|
|
143
|
+
return {
|
|
144
|
+
originalMessage: originalContent,
|
|
145
|
+
dlqMetadata: {
|
|
146
|
+
originalQueue: originalQueue,
|
|
147
|
+
originalExchange: originalFields.exchange || '',
|
|
148
|
+
originalRoutingKey: originalFields.routingKey || '',
|
|
149
|
+
failedAt: now.toISOString(),
|
|
150
|
+
retryCount: this.getRetryCount(originalProperties) + 1,
|
|
151
|
+
maxRetries: this.config.dlq.maxRetries || 3,
|
|
152
|
+
retryDelay: this.config.dlq.retryDelay || 5000
|
|
153
|
+
},
|
|
154
|
+
originalProperties: originalProperties,
|
|
155
|
+
originalFields: originalFields
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Route message to DLQ exchange
|
|
160
|
+
* @param dlqExchange DLQ exchange name
|
|
161
|
+
* @param routingKey Routing key (original queue name)
|
|
162
|
+
* @param message Message to route
|
|
163
|
+
*/
|
|
164
|
+
async routeMessageToDLQ(dlqExchange, routingKey, message) {
|
|
165
|
+
return this.connectionManager.executeOperation(async () => {
|
|
166
|
+
const connection = this.connectionManager.getConnection();
|
|
167
|
+
if (!connection) {
|
|
168
|
+
throw new Error('No active connection to RabbitMQ');
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
const channel = await connection.createChannel();
|
|
172
|
+
// Publish message to DLQ exchange
|
|
173
|
+
const messageBuffer = Buffer.from(JSON.stringify(message));
|
|
174
|
+
const publishOptions = {
|
|
175
|
+
persistent: true,
|
|
176
|
+
timestamp: Date.now(),
|
|
177
|
+
headers: {
|
|
178
|
+
'x-dlq-routed': true,
|
|
179
|
+
'x-original-queue': routingKey
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
const published = channel.publish(dlqExchange, routingKey, messageBuffer, publishOptions);
|
|
183
|
+
if (!published) {
|
|
184
|
+
throw new Error('Failed to publish message to DLQ - channel buffer full');
|
|
185
|
+
}
|
|
186
|
+
await channel.close();
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
const errorMessage = `Failed to route message to DLQ exchange '${dlqExchange}': ${error instanceof Error ? error.message : 'Unknown error'}`;
|
|
190
|
+
throw new Error(errorMessage);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get retry count from message properties
|
|
196
|
+
* @param properties Message properties
|
|
197
|
+
* @returns Current retry count
|
|
198
|
+
*/
|
|
199
|
+
getRetryCount(properties) {
|
|
200
|
+
if (!properties || !properties.headers) {
|
|
201
|
+
return 0;
|
|
202
|
+
}
|
|
203
|
+
return properties.headers['x-retry-count'] || 0;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Clear DLQ setup cache (useful for testing)
|
|
207
|
+
*/
|
|
208
|
+
clearCache() {
|
|
209
|
+
this.dlqSetupCache.clear();
|
|
210
|
+
this.logger.info('DLQHandler cache cleared');
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get cache statistics for monitoring
|
|
214
|
+
*/
|
|
215
|
+
getCacheStats() {
|
|
216
|
+
return {
|
|
217
|
+
setupCache: this.dlqSetupCache.size
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get DLQ configuration
|
|
222
|
+
*/
|
|
223
|
+
getDLQConfig() {
|
|
224
|
+
return this.config.dlq;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
exports.DLQHandler = DLQHandler;
|
|
228
|
+
//# sourceMappingURL=DLQHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DLQHandler.js","sourceRoot":"","sources":["../../src/components/DLQHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { ILogger } from '../interfaces/ILogger';
|
|
2
|
+
import { IConfiguration } from '../interfaces/IConfiguration';
|
|
3
|
+
/**
|
|
4
|
+
* Log levels with numeric values for comparison
|
|
5
|
+
*/
|
|
6
|
+
export declare enum LogLevel {
|
|
7
|
+
ERROR = 0,
|
|
8
|
+
WARN = 1,
|
|
9
|
+
INFO = 2,
|
|
10
|
+
DEBUG = 3
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Logger class that provides structured logging with configurable levels and formats
|
|
14
|
+
*/
|
|
15
|
+
export declare class Logger implements ILogger {
|
|
16
|
+
private static instance;
|
|
17
|
+
private logLevel;
|
|
18
|
+
private format;
|
|
19
|
+
private component?;
|
|
20
|
+
/**
|
|
21
|
+
* Private constructor to enforce singleton pattern
|
|
22
|
+
*/
|
|
23
|
+
private constructor();
|
|
24
|
+
/**
|
|
25
|
+
* Get singleton instance of Logger
|
|
26
|
+
*/
|
|
27
|
+
static getInstance(config?: IConfiguration['logging'], component?: string): Logger;
|
|
28
|
+
/**
|
|
29
|
+
* Create a new logger instance for a specific component
|
|
30
|
+
*/
|
|
31
|
+
static createComponentLogger(component: string, config?: IConfiguration['logging']): Logger;
|
|
32
|
+
/**
|
|
33
|
+
* Log error message with optional context
|
|
34
|
+
*/
|
|
35
|
+
error(message: string, context?: any): void;
|
|
36
|
+
/**
|
|
37
|
+
* Log warning message with optional context
|
|
38
|
+
*/
|
|
39
|
+
warn(message: string, context?: any): void;
|
|
40
|
+
/**
|
|
41
|
+
* Log info message with optional context
|
|
42
|
+
*/
|
|
43
|
+
info(message: string, context?: any): void;
|
|
44
|
+
/**
|
|
45
|
+
* Log debug message with optional context
|
|
46
|
+
*/
|
|
47
|
+
debug(message: string, context?: any): void;
|
|
48
|
+
/**
|
|
49
|
+
* Log operation with context (for operation tracking)
|
|
50
|
+
*/
|
|
51
|
+
logOperation(operation: string, message: string, context?: any): void;
|
|
52
|
+
/**
|
|
53
|
+
* Log error with stack trace
|
|
54
|
+
*/
|
|
55
|
+
logError(message: string, error: Error, context?: any): void;
|
|
56
|
+
/**
|
|
57
|
+
* Log connection state changes
|
|
58
|
+
*/
|
|
59
|
+
logConnectionState(state: string, context?: any): void;
|
|
60
|
+
/**
|
|
61
|
+
* Internal logging method
|
|
62
|
+
*/
|
|
63
|
+
private log;
|
|
64
|
+
/**
|
|
65
|
+
* Parse log level string to enum value
|
|
66
|
+
*/
|
|
67
|
+
private parseLogLevel;
|
|
68
|
+
/**
|
|
69
|
+
* Update logger configuration
|
|
70
|
+
*/
|
|
71
|
+
updateConfig(config: IConfiguration['logging']): void;
|
|
72
|
+
/**
|
|
73
|
+
* Reset singleton instance (for testing purposes)
|
|
74
|
+
*/
|
|
75
|
+
static resetInstance(): void;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=Logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../src/components/Logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D;;GAEG;AACH,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAcD;;GAEG;AACH,qBAAa,MAAO,YAAW,OAAO;IACpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAC,CAAS;IAE3B;;OAEG;IACH,OAAO;IAQP;;OAEG;WACW,WAAW,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAOzF;;OAEG;WACW,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,GAAG,MAAM;IAIlG;;OAEG;IACI,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAIlD;;OAEG;IACI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAIjD;;OAEG;IACI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAIjD;;OAEG;IACI,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAIlD;;OAEG;IACI,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAQ5E;;OAEG;IACI,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAYnE;;OAEG;IACI,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAQ7D;;OAEG;IACH,OAAO,CAAC,GAAG;IA6DX;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACI,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,CAAC,GAAG,IAAI;IAK5D;;OAEG;WACW,aAAa,IAAI,IAAI;CAGpC"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Logger = exports.LogLevel = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Log levels with numeric values for comparison
|
|
6
|
+
*/
|
|
7
|
+
var LogLevel;
|
|
8
|
+
(function (LogLevel) {
|
|
9
|
+
LogLevel[LogLevel["ERROR"] = 0] = "ERROR";
|
|
10
|
+
LogLevel[LogLevel["WARN"] = 1] = "WARN";
|
|
11
|
+
LogLevel[LogLevel["INFO"] = 2] = "INFO";
|
|
12
|
+
LogLevel[LogLevel["DEBUG"] = 3] = "DEBUG";
|
|
13
|
+
})(LogLevel || (exports.LogLevel = LogLevel = {}));
|
|
14
|
+
/**
|
|
15
|
+
* Logger class that provides structured logging with configurable levels and formats
|
|
16
|
+
*/
|
|
17
|
+
class Logger {
|
|
18
|
+
/**
|
|
19
|
+
* Private constructor to enforce singleton pattern
|
|
20
|
+
*/
|
|
21
|
+
constructor(config, component) {
|
|
22
|
+
this.logLevel = this.parseLogLevel(config?.level || 'info');
|
|
23
|
+
this.format = config?.format || 'text';
|
|
24
|
+
if (component) {
|
|
25
|
+
this.component = component;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get singleton instance of Logger
|
|
30
|
+
*/
|
|
31
|
+
static getInstance(config, component) {
|
|
32
|
+
if (!Logger.instance) {
|
|
33
|
+
Logger.instance = new Logger(config, component);
|
|
34
|
+
}
|
|
35
|
+
return Logger.instance;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a new logger instance for a specific component
|
|
39
|
+
*/
|
|
40
|
+
static createComponentLogger(component, config) {
|
|
41
|
+
return new Logger(config, component);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Log error message with optional context
|
|
45
|
+
*/
|
|
46
|
+
error(message, context) {
|
|
47
|
+
this.log(LogLevel.ERROR, 'ERROR', message, context);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Log warning message with optional context
|
|
51
|
+
*/
|
|
52
|
+
warn(message, context) {
|
|
53
|
+
this.log(LogLevel.WARN, 'WARN', message, context);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Log info message with optional context
|
|
57
|
+
*/
|
|
58
|
+
info(message, context) {
|
|
59
|
+
this.log(LogLevel.INFO, 'INFO', message, context);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Log debug message with optional context
|
|
63
|
+
*/
|
|
64
|
+
debug(message, context) {
|
|
65
|
+
this.log(LogLevel.DEBUG, 'DEBUG', message, context);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Log operation with context (for operation tracking)
|
|
69
|
+
*/
|
|
70
|
+
logOperation(operation, message, context) {
|
|
71
|
+
const operationContext = {
|
|
72
|
+
operation,
|
|
73
|
+
...context
|
|
74
|
+
};
|
|
75
|
+
this.info(message, operationContext);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Log error with stack trace
|
|
79
|
+
*/
|
|
80
|
+
logError(message, error, context) {
|
|
81
|
+
const errorContext = {
|
|
82
|
+
error: {
|
|
83
|
+
name: error.name,
|
|
84
|
+
message: error.message,
|
|
85
|
+
stack: error.stack
|
|
86
|
+
},
|
|
87
|
+
...context
|
|
88
|
+
};
|
|
89
|
+
this.error(message, errorContext);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Log connection state changes
|
|
93
|
+
*/
|
|
94
|
+
logConnectionState(state, context) {
|
|
95
|
+
const connectionContext = {
|
|
96
|
+
connectionState: state,
|
|
97
|
+
...context
|
|
98
|
+
};
|
|
99
|
+
this.info(`Connection state changed to: ${state}`, connectionContext);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Internal logging method
|
|
103
|
+
*/
|
|
104
|
+
log(level, levelName, message, context) {
|
|
105
|
+
// Check if this log level should be output
|
|
106
|
+
if (level > this.logLevel) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const timestamp = new Date().toISOString();
|
|
110
|
+
if (this.format === 'json') {
|
|
111
|
+
const logEntry = {
|
|
112
|
+
timestamp,
|
|
113
|
+
level: levelName,
|
|
114
|
+
message
|
|
115
|
+
};
|
|
116
|
+
if (context) {
|
|
117
|
+
try {
|
|
118
|
+
// Test if context can be serialized
|
|
119
|
+
JSON.stringify(context);
|
|
120
|
+
logEntry.context = context;
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
logEntry.context = '[Circular Reference]';
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (this.component) {
|
|
127
|
+
logEntry.component = this.component;
|
|
128
|
+
}
|
|
129
|
+
console.log(JSON.stringify(logEntry));
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// Text format
|
|
133
|
+
const componentPrefix = this.component ? `[${this.component}] ` : '';
|
|
134
|
+
let contextSuffix = '';
|
|
135
|
+
if (context) {
|
|
136
|
+
try {
|
|
137
|
+
contextSuffix = ` | Context: ${JSON.stringify(context)}`;
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
contextSuffix = ` | Context: [Circular Reference]`;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const logMessage = `${timestamp} [${levelName}] ${componentPrefix}${message}${contextSuffix}`;
|
|
144
|
+
// Use appropriate console method based on level
|
|
145
|
+
switch (level) {
|
|
146
|
+
case LogLevel.ERROR:
|
|
147
|
+
console.error(logMessage);
|
|
148
|
+
break;
|
|
149
|
+
case LogLevel.WARN:
|
|
150
|
+
console.warn(logMessage);
|
|
151
|
+
break;
|
|
152
|
+
case LogLevel.DEBUG:
|
|
153
|
+
console.debug(logMessage);
|
|
154
|
+
break;
|
|
155
|
+
default:
|
|
156
|
+
console.log(logMessage);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Parse log level string to enum value
|
|
162
|
+
*/
|
|
163
|
+
parseLogLevel(level) {
|
|
164
|
+
switch (level.toLowerCase()) {
|
|
165
|
+
case 'error':
|
|
166
|
+
return LogLevel.ERROR;
|
|
167
|
+
case 'warn':
|
|
168
|
+
return LogLevel.WARN;
|
|
169
|
+
case 'info':
|
|
170
|
+
return LogLevel.INFO;
|
|
171
|
+
case 'debug':
|
|
172
|
+
return LogLevel.DEBUG;
|
|
173
|
+
default:
|
|
174
|
+
return LogLevel.INFO;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Update logger configuration
|
|
179
|
+
*/
|
|
180
|
+
updateConfig(config) {
|
|
181
|
+
this.logLevel = this.parseLogLevel(config?.level || 'info');
|
|
182
|
+
this.format = config?.format || 'text';
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Reset singleton instance (for testing purposes)
|
|
186
|
+
*/
|
|
187
|
+
static resetInstance() {
|
|
188
|
+
Logger.instance = null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
exports.Logger = Logger;
|
|
192
|
+
Logger.instance = null;
|
|
193
|
+
//# sourceMappingURL=Logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../src/components/Logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { IMessagePublisher } from '../interfaces/IMessage';
|
|
2
|
+
import { ConnectionManager } from './ConnectionManager';
|
|
3
|
+
import { ResourceCreator } from './ResourceCreator';
|
|
4
|
+
import { IConfiguration } from '../interfaces/IConfiguration';
|
|
5
|
+
/**
|
|
6
|
+
* MessagePublisher handles message publishing to RabbitMQ exchanges
|
|
7
|
+
* Implements parameter validation, JSON serialization, and automatic exchange creation
|
|
8
|
+
*/
|
|
9
|
+
export declare class MessagePublisher implements IMessagePublisher {
|
|
10
|
+
private connectionManager;
|
|
11
|
+
private resourceCreator;
|
|
12
|
+
private logger;
|
|
13
|
+
constructor(connectionManager: ConnectionManager, resourceCreator: ResourceCreator, config?: IConfiguration['logging']);
|
|
14
|
+
/**
|
|
15
|
+
* Publish a message to an exchange
|
|
16
|
+
* @param exchange Exchange name (required)
|
|
17
|
+
* @param routingKey Routing key for message routing (required)
|
|
18
|
+
* @param payload Message payload to be JSON serialized (required)
|
|
19
|
+
* @returns Promise<boolean> - true for success, false for failure
|
|
20
|
+
*/
|
|
21
|
+
publish(exchange: string, routingKey: string, payload: any): Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* Validate publish method parameters
|
|
24
|
+
* @param exchange Exchange name
|
|
25
|
+
* @param routingKey Routing key
|
|
26
|
+
* @param payload Message payload
|
|
27
|
+
*/
|
|
28
|
+
private validatePublishParameters;
|
|
29
|
+
/**
|
|
30
|
+
* Serialize payload to JSON string
|
|
31
|
+
* @param payload Payload to serialize
|
|
32
|
+
* @returns JSON string representation
|
|
33
|
+
*/
|
|
34
|
+
private serializePayload;
|
|
35
|
+
/**
|
|
36
|
+
* Ensure exchange exists before publishing
|
|
37
|
+
* @param exchange Exchange name
|
|
38
|
+
*/
|
|
39
|
+
private ensureExchangeExists;
|
|
40
|
+
/**
|
|
41
|
+
* Log publish errors with detailed context
|
|
42
|
+
* @param error The error that occurred
|
|
43
|
+
* @param exchange Exchange name
|
|
44
|
+
* @param routingKey Routing key
|
|
45
|
+
* @param payload Original payload
|
|
46
|
+
*/
|
|
47
|
+
private logPublishError;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=MessagePublisher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessagePublisher.d.ts","sourceRoot":"","sources":["../../src/components/MessagePublisher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,MAAM,CAAS;gBAEX,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC;IAMtH;;;;;;OAMG;IACU,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IA6D1F;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IA0BjC;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;;OAGG;YACW,oBAAoB;IAalC;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;CAgBxB"}
|