@bgaldino/nestjs-rabbitmq 2.0.0-beta.5 → 2.0.0-beta.7
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 +41 -17
- package/dist/amqp-connection-manager.js +2 -2
- package/dist/amqp-connection-manager.js.map +1 -1
- package/dist/class-discovery.js +8 -8
- package/dist/class-discovery.js.map +1 -1
- package/dist/helper.d.ts +12 -0
- package/dist/helper.js +22 -0
- package/dist/helper.js.map +1 -1
- package/dist/rabbitmq-consumer.d.ts +6 -4
- package/dist/rabbitmq-consumer.js +35 -38
- package/dist/rabbitmq-consumer.js.map +1 -1
- package/dist/rabbitmq-retry-handler.d.ts +1 -2
- package/dist/rabbitmq-retry-handler.js +19 -10
- package/dist/rabbitmq-retry-handler.js.map +1 -1
- package/dist/rabbitmq-service.js +14 -16
- package/dist/rabbitmq-service.js.map +1 -1
- package/dist/rabbitmq.interfaces.d.ts +6 -2
- package/dist/rabbitmq.types.d.ts +13 -13
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -76,7 +76,6 @@ import { RabbitMQModule } from '@bgaldino/nestjs-rabbitmq';
|
|
|
76
76
|
imports: [
|
|
77
77
|
RabbitMQModule.forRoot({
|
|
78
78
|
connectionString: 'amqp://user:password@localhost:5672/vhost',
|
|
79
|
-
delayExchangeName: 'my_app',
|
|
80
79
|
assertExchanges: [
|
|
81
80
|
{ name: 'orders', type: 'topic' },
|
|
82
81
|
{ name: 'notifications', type: 'fanout' },
|
|
@@ -102,7 +101,6 @@ class RabbitConfig implements RabbitMQOptionsFactory {
|
|
|
102
101
|
createRabbitOptions(): ModuleOptions {
|
|
103
102
|
return {
|
|
104
103
|
connectionString: this.configService.get('RABBIT_URL'),
|
|
105
|
-
delayExchangeName: 'my_app',
|
|
106
104
|
assertExchanges: [
|
|
107
105
|
{ name: 'orders', type: 'topic' },
|
|
108
106
|
],
|
|
@@ -127,7 +125,6 @@ You can also use `useFactory` directly:
|
|
|
127
125
|
RabbitMQModule.forRootAsync({
|
|
128
126
|
useFactory: (configService: ConfigService) => ({
|
|
129
127
|
connectionString: configService.get('RABBIT_URL'),
|
|
130
|
-
delayExchangeName: 'my_app',
|
|
131
128
|
assertExchanges: [],
|
|
132
129
|
}),
|
|
133
130
|
inject: [ConfigService],
|
|
@@ -259,7 +256,6 @@ import { defineRabbitConsumer } from '@bgaldino/nestjs-rabbitmq';
|
|
|
259
256
|
|
|
260
257
|
RabbitMQModule.forRoot({
|
|
261
258
|
connectionString: 'amqp://localhost',
|
|
262
|
-
delayExchangeName: 'my_app',
|
|
263
259
|
assertExchanges: [{ name: 'orders', type: 'topic' }],
|
|
264
260
|
consumerChannels: [
|
|
265
261
|
defineRabbitConsumer({
|
|
@@ -312,6 +308,8 @@ type MessageParams = {
|
|
|
312
308
|
channel: ConfirmChannel;
|
|
313
309
|
queue: string;
|
|
314
310
|
originalRoutingKey?: string;
|
|
311
|
+
correlationId?: string | null; // AMQP correlationId (or x-correlation-id header)
|
|
312
|
+
retryCount?: number; // retry attempts already performed for this message
|
|
315
313
|
};
|
|
316
314
|
```
|
|
317
315
|
|
|
@@ -380,7 +378,7 @@ additional headers or properties.
|
|
|
380
378
|
If your application needs to consume from or publish to multiple RabbitMQ
|
|
381
379
|
vhosts (or entirely different brokers), you can use named connections.
|
|
382
380
|
Each connection is a self-contained unit with its own `connectionString`,
|
|
383
|
-
`
|
|
381
|
+
`assertExchanges`, and `consumerChannels`.
|
|
384
382
|
|
|
385
383
|
### Named connections
|
|
386
384
|
|
|
@@ -395,13 +393,11 @@ RabbitMQModule.forRoot({
|
|
|
395
393
|
{
|
|
396
394
|
name: 'default',
|
|
397
395
|
connectionString: 'amqp://localhost/main',
|
|
398
|
-
delayExchangeName: 'my_app',
|
|
399
396
|
assertExchanges: [{ name: 'orders', type: 'topic' }],
|
|
400
397
|
},
|
|
401
398
|
{
|
|
402
399
|
name: 'shared-bus',
|
|
403
400
|
connectionString: 'amqp://localhost/shared',
|
|
404
|
-
delayExchangeName: 'shared_app',
|
|
405
401
|
assertExchanges: [{ name: 'events', type: 'topic' }],
|
|
406
402
|
},
|
|
407
403
|
],
|
|
@@ -437,7 +433,6 @@ connections: [
|
|
|
437
433
|
{
|
|
438
434
|
name: 'default',
|
|
439
435
|
connectionString: 'amqp://localhost/main',
|
|
440
|
-
delayExchangeName: 'my_app',
|
|
441
436
|
assertExchanges: [{ name: 'orders', type: 'topic' }],
|
|
442
437
|
consumerChannels: [
|
|
443
438
|
defineRabbitConsumer({
|
|
@@ -478,13 +473,13 @@ back to the original queue for another attempt.
|
|
|
478
473
|
retryStrategy: {
|
|
479
474
|
enabled: true,
|
|
480
475
|
maxAttempts: 5,
|
|
481
|
-
|
|
476
|
+
retryFn: (content, attempt, error) => attempt * 5000,
|
|
482
477
|
},
|
|
483
478
|
})
|
|
484
479
|
async processOrder(content: OrderPayload) { ... }
|
|
485
480
|
```
|
|
486
481
|
|
|
487
|
-
The `
|
|
482
|
+
The `retryFn` callback receives the message content, the current attempt number,
|
|
488
483
|
and the error that was thrown. It should return the delay in milliseconds
|
|
489
484
|
before the next retry. The return value controls the behavior:
|
|
490
485
|
|
|
@@ -497,8 +492,24 @@ before the next retry. The return value controls the behavior:
|
|
|
497
492
|
**Defaults** (when `retryStrategy` is not specified):
|
|
498
493
|
|
|
499
494
|
- `enabled`: true
|
|
500
|
-
- `maxAttempts`: 5
|
|
501
|
-
- `
|
|
495
|
+
- `maxAttempts`: 5 (or `extraOptions.defaultMaxRetry` when set)
|
|
496
|
+
- `retryFn`: () => 5000
|
|
497
|
+
|
|
498
|
+
You can set a global default for the maximum retry attempts with
|
|
499
|
+
`extraOptions.defaultMaxRetry`. It applies to every consumer that does not
|
|
500
|
+
declare its own `retryStrategy.maxAttempts`:
|
|
501
|
+
|
|
502
|
+
```typescript
|
|
503
|
+
RabbitMQModule.forRoot({
|
|
504
|
+
connectionString: 'amqp://...',
|
|
505
|
+
extraOptions: {
|
|
506
|
+
defaultMaxRetry: 10,
|
|
507
|
+
},
|
|
508
|
+
});
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
Precedence (highest to lowest): `consumer.retryStrategy.maxAttempts` →
|
|
512
|
+
`extraOptions.defaultMaxRetry` → `5`.
|
|
502
513
|
|
|
503
514
|
You can also give a "string" value referring a method of the same class,
|
|
504
515
|
following the interface:
|
|
@@ -512,7 +523,7 @@ to the dead letter queue.
|
|
|
512
523
|
|
|
513
524
|
## Dead Letter Strategy
|
|
514
525
|
|
|
515
|
-
Each consumer can define a `
|
|
526
|
+
Each consumer can define a `dlqStrategy` to control what happens when
|
|
516
527
|
a message exhausts all retry attempts:
|
|
517
528
|
|
|
518
529
|
```typescript
|
|
@@ -520,9 +531,9 @@ a message exhausts all retry attempts:
|
|
|
520
531
|
queue: 'order.process',
|
|
521
532
|
exchangeName: 'orders',
|
|
522
533
|
routingKey: 'order.process',
|
|
523
|
-
|
|
534
|
+
dlqStrategy: {
|
|
524
535
|
suffix: '.dlq',
|
|
525
|
-
|
|
536
|
+
dlqFn: async (content) => {
|
|
526
537
|
await alertService.notify('Order processing failed', content);
|
|
527
538
|
return true;
|
|
528
539
|
},
|
|
@@ -534,7 +545,7 @@ async processOrder(content: OrderPayload) { ... }
|
|
|
534
545
|
The `suffix` controls the name of the dead letter queue. Defaults to `.dlq`,
|
|
535
546
|
resulting in a queue named `{queue}.dlq`.
|
|
536
547
|
|
|
537
|
-
The `
|
|
548
|
+
The `dlqFn` is executed before sending the message to the DLQ. It receives
|
|
538
549
|
the raw message content and should return a boolean:
|
|
539
550
|
|
|
540
551
|
- `true`: the message is forwarded to the DLQ after the callback executes
|
|
@@ -543,7 +554,7 @@ the raw message content and should return a boolean:
|
|
|
543
554
|
If the callback throws an error, the message is forwarded to the DLQ regardless.
|
|
544
555
|
|
|
545
556
|
Like the `retryStrategy`, you can pass a "string" of the method name you want
|
|
546
|
-
to call if it is in the same class. The method should implement the interface:
|
|
557
|
+
to call if it is in the same class. The method should implement the `IDLQFn` interface:
|
|
547
558
|
|
|
548
559
|
```typescript
|
|
549
560
|
function (content: T): Promise<boolean> | boolean;
|
|
@@ -555,6 +566,7 @@ Every published message includes the following custom headers automatically:
|
|
|
555
566
|
|
|
556
567
|
```json
|
|
557
568
|
{
|
|
569
|
+
"x-correlation-id": "uuid (mirrors the AMQP correlationId property)",
|
|
558
570
|
"x-original-exchange": "exchange_name",
|
|
559
571
|
"x-original-routing-key": "routing.key",
|
|
560
572
|
"x-published-at": "2026-01-01T00:00:00.000Z"
|
|
@@ -565,6 +577,12 @@ These headers preserve the original exchange and routing key references, which
|
|
|
565
577
|
would otherwise be lost when a message is routed through retry queues or the
|
|
566
578
|
DLQ.
|
|
567
579
|
|
|
580
|
+
A `correlationId` is generated automatically (or taken from
|
|
581
|
+
`options.correlationId` if you pass one) and survives retry hops: when a
|
|
582
|
+
message fails and is republished to the retry queue, all original AMQP
|
|
583
|
+
properties (`correlationId`, `contentType`, `messageId`, ...) are preserved and
|
|
584
|
+
an `x-last-retry-at` timestamp is stamped alongside `x-retries-count`.
|
|
585
|
+
|
|
568
586
|
The `originalRoutingKey` field in `MessageParams` is derived from these headers
|
|
569
587
|
when available, falling back to the message's current routing key.
|
|
570
588
|
|
|
@@ -584,6 +602,12 @@ The environment variable takes precedence over the config value.
|
|
|
584
602
|
|
|
585
603
|
Consumer errors are always logged regardless of this setting.
|
|
586
604
|
|
|
605
|
+
Each log entry is a structured object containing the binding, duration,
|
|
606
|
+
`correlationId`, retry metadata (`retryCount`, `publishedAt`) and — when the
|
|
607
|
+
message carries W3C trace context headers (`traceparent`/`tracestate`, e.g.
|
|
608
|
+
injected by OpenTelemetry auto-instrumentation) — a `traceContext` field, so
|
|
609
|
+
log entries can be correlated with distributed traces.
|
|
610
|
+
|
|
587
611
|
### Health check
|
|
588
612
|
|
|
589
613
|
You can check the connection status of both the consumer and publisher
|
|
@@ -28,6 +28,7 @@ let AMQPConnectionManager = AMQPConnectionManager_1 = class AMQPConnectionManage
|
|
|
28
28
|
logType: "none",
|
|
29
29
|
heartbeatIntervalInSeconds: 0,
|
|
30
30
|
reconnectTimeInSeconds: 5,
|
|
31
|
+
defaultMaxRetry: 5
|
|
31
32
|
},
|
|
32
33
|
};
|
|
33
34
|
this.connections = new Map();
|
|
@@ -112,14 +113,13 @@ let AMQPConnectionManager = AMQPConnectionManager_1 = class AMQPConnectionManage
|
|
|
112
113
|
return [{
|
|
113
114
|
name: "default",
|
|
114
115
|
connectionString: this.opts.connectionString,
|
|
115
|
-
delayExchangeName: this.opts.delayExchangeName,
|
|
116
116
|
assertExchanges: this.opts.assertExchanges,
|
|
117
117
|
consumerChannels: this.opts.consumerChannels,
|
|
118
118
|
}];
|
|
119
119
|
}
|
|
120
120
|
buildConsumer(connectionName = "default") {
|
|
121
121
|
const holder = this.getConnectionHolder(connectionName);
|
|
122
|
-
return new rabbitmq_consumer_1.RabbitMQConsumer(holder.consumerConn,
|
|
122
|
+
return new rabbitmq_consumer_1.RabbitMQConsumer(holder.consumerConn, this.opts.extraOptions.logType, holder.publisherWrapper, this.opts.extraOptions.defaultMaxRetry);
|
|
123
123
|
}
|
|
124
124
|
};
|
|
125
125
|
exports.AMQPConnectionManager = AMQPConnectionManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amqp-connection-manager.js","sourceRoot":"","sources":["../src/amqp-connection-manager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAMwB;AACxB,qCAAiC;AACjC,2DAAuD;AAOvD,6DAAsD;AACtD,6DAA2E;AAGpE,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;
|
|
1
|
+
{"version":3,"file":"amqp-connection-manager.js","sourceRoot":"","sources":["../src/amqp-connection-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/class-discovery.js
CHANGED
|
@@ -90,19 +90,19 @@ let ClassDiscovery = class ClassDiscovery {
|
|
|
90
90
|
resolveStrategyMethods(meta, instance) {
|
|
91
91
|
var _a, _b;
|
|
92
92
|
const className = instance.constructor.name;
|
|
93
|
-
if (typeof ((_a = meta.retryStrategy) === null || _a === void 0 ? void 0 : _a.
|
|
94
|
-
const fn = instance[meta.retryStrategy.
|
|
93
|
+
if (typeof ((_a = meta.retryStrategy) === null || _a === void 0 ? void 0 : _a.retryFn) === "string") {
|
|
94
|
+
const fn = instance[meta.retryStrategy.retryFn];
|
|
95
95
|
if (typeof fn !== "function") {
|
|
96
|
-
throw new Error(`RabbitMQModule: Method "${meta.retryStrategy.
|
|
96
|
+
throw new Error(`RabbitMQModule: Method "${meta.retryStrategy.retryFn}" not found on ${className}`);
|
|
97
97
|
}
|
|
98
|
-
meta.retryStrategy.
|
|
98
|
+
meta.retryStrategy.retryFn = fn.bind(instance);
|
|
99
99
|
}
|
|
100
|
-
if (typeof ((_b = meta.
|
|
101
|
-
const fn = instance[meta.
|
|
100
|
+
if (typeof ((_b = meta.dlqStrategy) === null || _b === void 0 ? void 0 : _b.dlqFn) === "string") {
|
|
101
|
+
const fn = instance[meta.dlqStrategy.dlqFn];
|
|
102
102
|
if (typeof fn !== "function") {
|
|
103
|
-
throw new Error(`RabbitMQModule: Method "${meta.
|
|
103
|
+
throw new Error(`RabbitMQModule: Method "${meta.dlqStrategy.dlqFn}" not found on ${className}`);
|
|
104
104
|
}
|
|
105
|
-
meta.
|
|
105
|
+
meta.dlqStrategy.dlqFn = fn.bind(instance);
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"class-discovery.js","sourceRoot":"","sources":["../src/class-discovery.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"class-discovery.js","sourceRoot":"","sources":["../src/class-discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/helper.d.ts
CHANGED
|
@@ -1,2 +1,14 @@
|
|
|
1
1
|
export declare function tryParseJson(content: string): any;
|
|
2
2
|
export declare function merge<T = Record<string, any>>(source: Record<string, any>, target: Record<string, any>): T;
|
|
3
|
+
export declare function generateRandomChars(length?: number): string;
|
|
4
|
+
/** Extracts tracing-related metadata from AMQP message headers.
|
|
5
|
+
* traceparent/tracestate are injected by OTel auto-instrumentation when present. */
|
|
6
|
+
export declare function extractTraceContext(headers?: Record<string, any>): {
|
|
7
|
+
traceContext?: {
|
|
8
|
+
traceparent?: string;
|
|
9
|
+
tracestate?: string;
|
|
10
|
+
};
|
|
11
|
+
retryCount?: number;
|
|
12
|
+
publishedAt?: string;
|
|
13
|
+
correlationId?: string;
|
|
14
|
+
};
|
package/dist/helper.js
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.tryParseJson = tryParseJson;
|
|
4
4
|
exports.merge = merge;
|
|
5
|
+
exports.generateRandomChars = generateRandomChars;
|
|
6
|
+
exports.extractTraceContext = extractTraceContext;
|
|
7
|
+
const crypto_1 = require("crypto");
|
|
5
8
|
function tryParseJson(content) {
|
|
6
9
|
try {
|
|
7
10
|
return !!content && JSON.parse(content);
|
|
@@ -25,4 +28,23 @@ function merge(source, target) {
|
|
|
25
28
|
}
|
|
26
29
|
return merged;
|
|
27
30
|
}
|
|
31
|
+
function generateRandomChars(length = 4) {
|
|
32
|
+
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
33
|
+
return Array.from({ length }, () => chars[(0, crypto_1.randomInt)(0, chars.length)]).join('');
|
|
34
|
+
}
|
|
35
|
+
/** Extracts tracing-related metadata from AMQP message headers.
|
|
36
|
+
* traceparent/tracestate are injected by OTel auto-instrumentation when present. */
|
|
37
|
+
function extractTraceContext(headers = {}) {
|
|
38
|
+
const result = {};
|
|
39
|
+
if (headers.traceparent || headers.tracestate) {
|
|
40
|
+
result.traceContext = Object.assign(Object.assign({}, (headers.traceparent && { traceparent: headers.traceparent })), (headers.tracestate && { tracestate: headers.tracestate }));
|
|
41
|
+
}
|
|
42
|
+
if (headers["x-retries-count"] != null)
|
|
43
|
+
result.retryCount = headers["x-retries-count"];
|
|
44
|
+
if (headers["x-published-at"] != null)
|
|
45
|
+
result.publishedAt = headers["x-published-at"];
|
|
46
|
+
if (headers["x-correlation-id"] != null)
|
|
47
|
+
result.correlationId = headers["x-correlation-id"];
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
28
50
|
//# sourceMappingURL=helper.js.map
|
package/dist/helper.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":";;AAEA,oCAMC;AAED,sBAcC;AAED,kDAGC;AAID,kDAoBC;AArDD,mCAAmC;AAEnC,SAAgB,YAAY,CAAC,OAAe;IAC1C,IAAI,CAAC;QACH,OAAO,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAgB,KAAK,CAA0B,MAA2B,EAAE,MAA2B;;IACrG,MAAM,MAAM,qBAAQ,MAAM,CAAE,CAAC;IAE7B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI;YAAE,SAAS;QAElC,IAAI,GAAG,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACpF,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,MAAA,MAAM,CAAC,GAAG,CAAC,mCAAI,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,MAAW,CAAC;AACrB,CAAC;AAED,SAAgB,mBAAmB,CAAC,MAAM,GAAG,CAAC;IAC5C,MAAM,KAAK,GAAG,gEAAgE,CAAC;IAC/E,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAA,kBAAS,EAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAClF,CAAC;AAED;oFACoF;AACpF,SAAgB,mBAAmB,CAAC,UAA+B,EAAE;IAMnE,MAAM,MAAM,GAA2C,EAAE,CAAC;IAE1D,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QAC9C,MAAM,CAAC,YAAY,mCACd,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,GAC7D,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAC9D,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,iBAAiB,CAAC,IAAI,IAAI;QAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACvF,IAAI,OAAO,CAAC,gBAAgB,CAAC,IAAI,IAAI;QAAE,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtF,IAAI,OAAO,CAAC,kBAAkB,CAAC,IAAI,IAAI;QAAE,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAE5F,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { AmqpConnectionManager, ChannelWrapper } from "amqp-connection-manager";
|
|
2
2
|
import { IRabbitMQHandler } from "./rabbitmq.interfaces";
|
|
3
|
-
import { LogType, ConsumerOptions } from "./rabbitmq.types";
|
|
3
|
+
import { LogType, ConsumerOptions, ResolvedConsumerOptions } from "./rabbitmq.types";
|
|
4
|
+
export declare function resolveConsumerOptions(consumer: ConsumerOptions, defaults: {
|
|
5
|
+
defaultMaxRetry: number;
|
|
6
|
+
}): ResolvedConsumerOptions;
|
|
4
7
|
export declare class RabbitMQConsumer {
|
|
5
8
|
private logger;
|
|
6
9
|
private readonly connection;
|
|
7
|
-
private readonly delayExchange;
|
|
8
10
|
private readonly logType;
|
|
9
|
-
private
|
|
11
|
+
private readonly defaultMaxRetry;
|
|
10
12
|
private readonly retryHandler;
|
|
11
|
-
constructor(connection: AmqpConnectionManager,
|
|
13
|
+
constructor(connection: AmqpConnectionManager, logType: LogType, publishChannelWrapper: ChannelWrapper, defaultMaxRetry?: number);
|
|
12
14
|
createConsumer(consumer: ConsumerOptions, handler: IRabbitMQHandler): Promise<ChannelWrapper>;
|
|
13
15
|
private setupChannel;
|
|
14
16
|
private bindRoutingKeys;
|
|
@@ -1,33 +1,35 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RabbitMQConsumer = void 0;
|
|
4
|
+
exports.resolveConsumerOptions = resolveConsumerOptions;
|
|
4
5
|
const common_1 = require("@nestjs/common");
|
|
5
6
|
const helper_1 = require("./helper");
|
|
6
7
|
const rabbitmq_retry_handler_1 = require("./rabbitmq-retry-handler");
|
|
8
|
+
const node_os_1 = require("node:os");
|
|
9
|
+
function resolveConsumerOptions(consumer, defaults) {
|
|
10
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
11
|
+
return Object.assign(Object.assign({}, consumer), { durable: (_a = consumer.durable) !== null && _a !== void 0 ? _a : true, prefetch: (_b = consumer.prefetch) !== null && _b !== void 0 ? _b : 10, autoDelete: (_c = consumer.autoDelete) !== null && _c !== void 0 ? _c : false, retryStrategy: {
|
|
12
|
+
enabled: (_e = (_d = consumer.retryStrategy) === null || _d === void 0 ? void 0 : _d.enabled) !== null && _e !== void 0 ? _e : true,
|
|
13
|
+
maxAttempts: (_g = (_f = consumer.retryStrategy) === null || _f === void 0 ? void 0 : _f.maxAttempts) !== null && _g !== void 0 ? _g : defaults.defaultMaxRetry,
|
|
14
|
+
// retryFn/dlqFn given as strings are resolved to bound methods at discovery time
|
|
15
|
+
retryFn: (_j = (_h = consumer.retryStrategy) === null || _h === void 0 ? void 0 : _h.retryFn) !== null && _j !== void 0 ? _j : (() => 5000),
|
|
16
|
+
}, dlqStrategy: {
|
|
17
|
+
dlqFn: (_l = (_k = consumer.dlqStrategy) === null || _k === void 0 ? void 0 : _k.dlqFn) !== null && _l !== void 0 ? _l : (async () => true),
|
|
18
|
+
suffix: (_o = (_m = consumer.dlqStrategy) === null || _m === void 0 ? void 0 : _m.suffix) !== null && _o !== void 0 ? _o : ".dlq",
|
|
19
|
+
} });
|
|
20
|
+
}
|
|
7
21
|
class RabbitMQConsumer {
|
|
8
|
-
constructor(connection,
|
|
22
|
+
constructor(connection, logType, publishChannelWrapper, defaultMaxRetry = 5) {
|
|
9
23
|
this.logger = new common_1.Logger(RabbitMQConsumer.name);
|
|
10
|
-
this.defaultConsumerOptions = {
|
|
11
|
-
durable: true,
|
|
12
|
-
prefetch: 10,
|
|
13
|
-
autoDelete: false,
|
|
14
|
-
retryStrategy: {
|
|
15
|
-
enabled: true,
|
|
16
|
-
maxAttempts: 5,
|
|
17
|
-
delay: () => 5000,
|
|
18
|
-
},
|
|
19
|
-
deadLetterStrategy: {
|
|
20
|
-
callback: async () => true,
|
|
21
|
-
suffix: ".dlq",
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
24
|
this.connection = connection;
|
|
25
|
-
this.delayExchange = `${delayExchangeName}.delay`;
|
|
26
25
|
this.logType = logType;
|
|
27
|
-
this.
|
|
26
|
+
this.defaultMaxRetry = defaultMaxRetry;
|
|
27
|
+
this.retryHandler = new rabbitmq_retry_handler_1.RetryHandler(publishChannelWrapper);
|
|
28
28
|
}
|
|
29
29
|
async createConsumer(consumer, handler) {
|
|
30
|
-
const resolved = (
|
|
30
|
+
const resolved = resolveConsumerOptions(consumer, {
|
|
31
|
+
defaultMaxRetry: this.defaultMaxRetry,
|
|
32
|
+
});
|
|
31
33
|
const consumerChannel = this.connection.createChannel({
|
|
32
34
|
confirm: true,
|
|
33
35
|
name: resolved.queue,
|
|
@@ -43,12 +45,14 @@ class RabbitMQConsumer {
|
|
|
43
45
|
},
|
|
44
46
|
durable: consumer.durable,
|
|
45
47
|
autoDelete: consumer.autoDelete,
|
|
46
|
-
deadLetterRoutingKey: `${consumer.queue}${consumer.
|
|
48
|
+
deadLetterRoutingKey: `${consumer.queue}${consumer.dlqStrategy.suffix}`,
|
|
47
49
|
deadLetterExchange: "",
|
|
48
50
|
});
|
|
49
51
|
await this.bindRoutingKeys(channel, consumer);
|
|
50
52
|
await this.attachRetryAndDLQ(channel, consumer);
|
|
51
|
-
channel.consume(consumer.queue, async (message) => await this.consume(message, channel, consumer, handler)
|
|
53
|
+
channel.consume(consumer.queue, async (message) => await this.consume(message, channel, consumer, handler), {
|
|
54
|
+
consumerTag: `${(0, node_os_1.hostname)()}:${(0, helper_1.generateRandomChars)(8)}`
|
|
55
|
+
});
|
|
52
56
|
}
|
|
53
57
|
async bindRoutingKeys(channel, consumer) {
|
|
54
58
|
const keys = Array.isArray(consumer.routingKey) ? consumer.routingKey : [consumer.routingKey];
|
|
@@ -58,7 +62,7 @@ class RabbitMQConsumer {
|
|
|
58
62
|
}
|
|
59
63
|
async attachRetryAndDLQ(channel, consumer) {
|
|
60
64
|
const waitQueue = `${consumer.queue}.retry`;
|
|
61
|
-
const deadletterQueue = `${consumer.queue}${consumer.
|
|
65
|
+
const deadletterQueue = `${consumer.queue}${consumer.dlqStrategy.suffix}`;
|
|
62
66
|
await channel.assertQueue(deadletterQueue, {
|
|
63
67
|
durable: true,
|
|
64
68
|
arguments: {
|
|
@@ -68,7 +72,6 @@ class RabbitMQConsumer {
|
|
|
68
72
|
if (!consumer.retryStrategy.enabled) {
|
|
69
73
|
return;
|
|
70
74
|
}
|
|
71
|
-
await channel.assertExchange(this.delayExchange, "topic", { durable: true });
|
|
72
75
|
await channel.assertQueue(waitQueue, {
|
|
73
76
|
durable: true,
|
|
74
77
|
arguments: {
|
|
@@ -77,10 +80,9 @@ class RabbitMQConsumer {
|
|
|
77
80
|
"x-dead-letter-routing-key": consumer.queue,
|
|
78
81
|
},
|
|
79
82
|
});
|
|
80
|
-
await channel.bindQueue(waitQueue, this.delayExchange, consumer.queue);
|
|
81
83
|
}
|
|
82
84
|
async consume(message, channel, consumer, callback) {
|
|
83
|
-
var _a, _b;
|
|
85
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
84
86
|
let hasErrors = null;
|
|
85
87
|
let hasRetried = false;
|
|
86
88
|
const start = process.hrtime.bigint();
|
|
@@ -88,7 +90,9 @@ class RabbitMQConsumer {
|
|
|
88
90
|
await callback((0, helper_1.tryParseJson)(message.content.toString("utf8")), {
|
|
89
91
|
message,
|
|
90
92
|
queue: consumer.queue,
|
|
91
|
-
originalRoutingKey: (_b = (_a = message.properties.headers["x-original-routing-key"]) !== null && _a !== void 0 ? _a : message.fields.routingKey) !== null && _b !== void 0 ? _b : null
|
|
93
|
+
originalRoutingKey: (_b = (_a = message.properties.headers["x-original-routing-key"]) !== null && _a !== void 0 ? _a : message.fields.routingKey) !== null && _b !== void 0 ? _b : null,
|
|
94
|
+
correlationId: (_e = (_c = message.properties.correlationId) !== null && _c !== void 0 ? _c : (_d = message.properties.headers) === null || _d === void 0 ? void 0 : _d["x-correlation-id"]) !== null && _e !== void 0 ? _e : null,
|
|
95
|
+
retryCount: (_g = (_f = message.properties.headers) === null || _f === void 0 ? void 0 : _f["x-retries-count"]) !== null && _g !== void 0 ? _g : 0,
|
|
92
96
|
});
|
|
93
97
|
}
|
|
94
98
|
catch (e) {
|
|
@@ -100,7 +104,7 @@ class RabbitMQConsumer {
|
|
|
100
104
|
this.inspectConsumer({
|
|
101
105
|
binding: {
|
|
102
106
|
queue: consumer.queue,
|
|
103
|
-
routingKey: message.fields.routingKey,
|
|
107
|
+
routingKey: (_h = message.properties.headers["x-original-routing-key"]) !== null && _h !== void 0 ? _h : message.fields.routingKey,
|
|
104
108
|
exchange: consumer.exchangeName,
|
|
105
109
|
},
|
|
106
110
|
consumeMessage: message,
|
|
@@ -124,7 +128,7 @@ class RabbitMQConsumer {
|
|
|
124
128
|
let shouldNack = true;
|
|
125
129
|
try {
|
|
126
130
|
shouldNack =
|
|
127
|
-
(_a = (await consumer.
|
|
131
|
+
(_a = (await consumer.dlqStrategy.dlqFn(message.content.toString("utf8")))) !== null && _a !== void 0 ? _a : true;
|
|
128
132
|
}
|
|
129
133
|
catch (e) {
|
|
130
134
|
this.logger.error({
|
|
@@ -147,25 +151,18 @@ class RabbitMQConsumer {
|
|
|
147
151
|
}
|
|
148
152
|
}
|
|
149
153
|
inspectConsumer(args) {
|
|
154
|
+
var _a;
|
|
150
155
|
const { binding, consumeMessage, data, error } = args;
|
|
151
156
|
const { exchange, routingKey, queue } = binding;
|
|
152
157
|
const { content, fields, properties } = consumeMessage;
|
|
153
158
|
const message = `[AMQP] [CONSUMER] [${exchange}] [${routingKey}] [${queue}]`;
|
|
154
159
|
const logLevel = error ? "error" : "log";
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
type: "consumer",
|
|
158
|
-
duration: args.elapsedTime.toString(),
|
|
159
|
-
correlationId: args.consumeMessage.properties.correlationId,
|
|
160
|
-
binding,
|
|
161
|
-
title: message,
|
|
162
|
-
isDead: args.isDead,
|
|
163
|
-
consumedMessage: {
|
|
160
|
+
const headerContext = (0, helper_1.extractTraceContext)(properties === null || properties === void 0 ? void 0 : properties.headers);
|
|
161
|
+
const logData = Object.assign(Object.assign(Object.assign(Object.assign({ logLevel, type: "consumer", duration: args.elapsedTime.toString(), correlationId: (_a = consumeMessage.properties.correlationId) !== null && _a !== void 0 ? _a : headerContext.correlationId }, (headerContext.traceContext && { traceContext: headerContext.traceContext })), (headerContext.retryCount != null && { retryCount: headerContext.retryCount })), (headerContext.publishedAt && { publishedAt: headerContext.publishedAt })), { binding, title: message, isDead: args.isDead, consumedMessage: {
|
|
164
162
|
fields,
|
|
165
163
|
properties,
|
|
166
164
|
content: data !== null && data !== void 0 ? data : (0, helper_1.tryParseJson)(content.toString("utf8")),
|
|
167
|
-
}
|
|
168
|
-
};
|
|
165
|
+
} });
|
|
169
166
|
if (error) {
|
|
170
167
|
logData["error"] = {
|
|
171
168
|
stack: error === null || error === void 0 ? void 0 : error.stack,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-consumer.js","sourceRoot":"","sources":["../src/rabbitmq-consumer.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"rabbitmq-consumer.js","sourceRoot":"","sources":["../src/rabbitmq-consumer.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,7 @@ import { ConsumeMessage } from "amqplib";
|
|
|
3
3
|
import { ResolvedConsumerOptions } from "./rabbitmq.types";
|
|
4
4
|
export declare class RetryHandler {
|
|
5
5
|
private readonly publishChannel;
|
|
6
|
-
private readonly delayExchange;
|
|
7
6
|
private logger;
|
|
8
|
-
constructor(publishChannel: ChannelWrapper
|
|
7
|
+
constructor(publishChannel: ChannelWrapper);
|
|
9
8
|
execute(consumer: ResolvedConsumerOptions, message: ConsumeMessage, error: Error): Promise<boolean>;
|
|
10
9
|
}
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
2
13
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
14
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
15
|
};
|
|
@@ -8,13 +19,12 @@ const common_1 = require("@nestjs/common");
|
|
|
8
19
|
const helper_1 = require("./helper");
|
|
9
20
|
const faster_stable_stringify_1 = __importDefault(require("faster-stable-stringify"));
|
|
10
21
|
class RetryHandler {
|
|
11
|
-
constructor(publishChannel
|
|
22
|
+
constructor(publishChannel) {
|
|
12
23
|
this.publishChannel = publishChannel;
|
|
13
|
-
this.delayExchange = delayExchange;
|
|
14
24
|
this.logger = new common_1.Logger(RetryHandler.name);
|
|
15
25
|
}
|
|
16
26
|
async execute(consumer, message, error) {
|
|
17
|
-
var _a, _b, _c, _d;
|
|
27
|
+
var _a, _b, _c, _d, _e;
|
|
18
28
|
if (!consumer.retryStrategy.enabled) {
|
|
19
29
|
return false;
|
|
20
30
|
}
|
|
@@ -24,17 +34,16 @@ class RetryHandler {
|
|
|
24
34
|
if (retryCount > maxRetry) {
|
|
25
35
|
return false;
|
|
26
36
|
}
|
|
27
|
-
const retryDelay = await consumer.retryStrategy.
|
|
37
|
+
const retryDelay = await consumer.retryStrategy.retryFn((0, helper_1.tryParseJson)(message.content.toString("utf8")), retryCount, error);
|
|
28
38
|
if (retryDelay < 0) {
|
|
29
39
|
return false;
|
|
30
40
|
}
|
|
41
|
+
const retryQueue = `${consumer.queue}.retry`;
|
|
42
|
+
// Preserve original AMQP properties (correlationId, contentType, messageId, ...)
|
|
43
|
+
// so the trace chain survives retry hops.
|
|
44
|
+
const _f = (_e = message.properties) !== null && _e !== void 0 ? _e : {}, { headers: _headers, expiration: _expiration } = _f, originalProperties = __rest(_f, ["headers", "expiration"]);
|
|
31
45
|
try {
|
|
32
|
-
return await this.publishChannel.publish(
|
|
33
|
-
headers: Object.assign(Object.assign({}, message.properties.headers), { "x-retries-count": retryCount + 1, "x-original-routing-key": originalRoutingKey }),
|
|
34
|
-
expiration: retryDelay,
|
|
35
|
-
deliveryMode: 2,
|
|
36
|
-
persistent: true,
|
|
37
|
-
});
|
|
46
|
+
return await this.publishChannel.publish("", retryQueue, (0, faster_stable_stringify_1.default)((0, helper_1.tryParseJson)(message.content.toString("utf8"))), Object.assign(Object.assign({}, originalProperties), { headers: Object.assign(Object.assign({}, message.properties.headers), { "x-retries-count": retryCount + 1, "x-original-routing-key": originalRoutingKey, "x-last-retry-at": new Date().toISOString() }), expiration: retryDelay, deliveryMode: 2, persistent: true }));
|
|
38
47
|
}
|
|
39
48
|
catch (e) {
|
|
40
49
|
this.logger.error({ message: "could_not_retry", error: e });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-retry-handler.js","sourceRoot":"","sources":["../src/rabbitmq-retry-handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rabbitmq-retry-handler.js","sourceRoot":"","sources":["../src/rabbitmq-retry-handler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,2CAAwC;AAIxC,qCAAwC;AACxC,sFAAgD;AAEhD,MAAa,YAAY;IAGvB,YACmB,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;QAHzC,WAAM,GAAG,IAAI,eAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;IAI1C,CAAC;IAEL,KAAK,CAAC,OAAO,CACX,QAAiC,EACjC,OAAuB,EACvB,KAAY;;QAEZ,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,MAAA,MAAA,OAAO,CAAC,UAAU,CAAC,OAAO,0CAAG,iBAAiB,CAAC,mCAAI,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC;QACpD,MAAM,kBAAkB,GACtB,MAAA,MAAA,OAAO,CAAC,UAAU,CAAC,OAAO,0CAAG,wBAAwB,CAAC,mCACtD,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;QAE5B,IAAI,UAAU,GAAG,QAAQ,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CACrD,IAAA,qBAAY,EAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAC9C,UAAU,EACV,KAAK,CACN,CAAC;QAEF,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,QAAQ,CAAC,KAAK,QAAQ,CAAC;QAC7C,iFAAiF;QACjF,0CAA0C;QAC1C,MAAM,KAIF,MAAA,OAAO,CAAC,UAAU,mCAAI,EAAE,EAJtB,EACJ,OAAO,EAAE,QAAQ,EACjB,UAAU,EAAE,WAAW,OAEG,EADvB,kBAAkB,cAHjB,yBAIL,CAA2B,CAAC;QAE7B,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CACtC,EAAE,EACF,UAAU,EACV,IAAA,iCAAS,EAAC,IAAA,qBAAY,EAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,kCAEpD,kBAAkB,KACrB,OAAO,kCACF,OAAO,CAAC,UAAU,CAAC,OAAO,KAC7B,iBAAiB,EAAE,UAAU,GAAG,CAAC,EACjC,wBAAwB,EAAE,kBAAkB,EAC5C,iBAAiB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAE7C,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,CAAC,EACf,UAAU,EAAE,IAAI,IAEnB,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AApED,oCAoEC"}
|