@@ -6,7 +6,7 @@ import { RabbitMqGateway, type Subscription, type SubscribeResult } from './Rabb
66import { type ConfigProvider , resolveProvider } from './utils/index.ts' ;
77
88export type RabbitMqEventBusConfig = Partial < Pick < Subscription ,
9- 'exchange' | 'queueName' | 'ignoreOwn' | 'concurrentLimit' | 'handlerProcessTimeout' | 'queueExpires' > > ;
9+ 'exchange' | 'queueName' | 'ignoreOwn' | 'concurrentLimit' | 'handlerProcessTimeout' | 'queueExpires' | 'deadLetterQueue' > > ;
1010
1111type ResolvedRabbitMqEventBusConfig = RabbitMqEventBusConfig
1212 & Required < Pick < RabbitMqEventBusConfig , 'exchange' | 'ignoreOwn' > > ;
@@ -19,7 +19,8 @@ async function resolveConfig(provider?: ConfigProvider<RabbitMqEventBusConfig>)
1919 concurrentLimit,
2020 handlerProcessTimeout,
2121 queueName,
22- queueExpires
22+ queueExpires,
23+ deadLetterQueue = false
2324 } = await resolveProvider ( provider ) ?? { } ;
2425
2526 assertString ( exchange , 'rabbitMqEventConfig.exchange' ) ;
@@ -32,8 +33,9 @@ async function resolveConfig(provider?: ConfigProvider<RabbitMqEventBusConfig>)
3233 assertString ( queueName , 'rabbitMqEventConfig.queueName' ) ;
3334 if ( queueExpires !== undefined )
3435 assertNonNegativeInteger ( queueExpires , 'rabbitMqEventConfig.queueExpires' ) ;
36+ assertBoolean ( deadLetterQueue , 'rabbitMqEventConfig.deadLetterQueue' ) ;
3537
36- return { exchange, ignoreOwn, concurrentLimit, handlerProcessTimeout, queueName, queueExpires } ;
38+ return { exchange, ignoreOwn, concurrentLimit, handlerProcessTimeout, queueName, queueExpires, deadLetterQueue } ;
3739}
3840
3941/**
@@ -43,6 +45,10 @@ async function resolveConfig(provider?: ConfigProvider<RabbitMqEventBusConfig>)
4345 * By default uses an exclusive (non-durable) queue per connection.
4446 * Set `queueName` in config for a durable queue that survives restarts.
4547 *
48+ * Dead letter queue is disabled by default (`deadLetterQueue: false`).
49+ * When a handler fails or times out, the message is discarded.
50+ * Set `deadLetterQueue: true` to route rejected messages to a `.failed` queue.
51+ *
4652 * Optionally ignores messages published by this instance (default: true).
4753 *
4854 * Supports named durable queues via {@link queue} for single-consumer delivery.
@@ -92,18 +98,12 @@ export class RabbitMqEventBus implements IEventBus, IObservableQueueProvider {
9298 * (non-durable) queue that is deleted on disconnect.
9399 */
94100 async on ( eventType : string , handler : IMessageHandler ) : Promise < SubscribeResult > {
95- const { exchange, queueName, ignoreOwn, concurrentLimit, handlerProcessTimeout, queueExpires } =
96- await this . #resolveConfig( ) ;
101+ const subscriptionParams = await this . #resolveConfig( ) ;
97102
98103 return this . #gateway. subscribe ( {
99- exchange,
100- queueName,
104+ ...subscriptionParams ,
101105 eventType,
102106 handler,
103- ignoreOwn,
104- concurrentLimit,
105- handlerProcessTimeout,
106- queueExpires,
107107 singleActiveConsumer : true
108108 } ) ;
109109 }
@@ -133,15 +133,16 @@ export class RabbitMqEventBus implements IEventBus, IObservableQueueProvider {
133133 queue = new RabbitMqCommandBus ( {
134134 rabbitMqGateway : this . #gateway,
135135 rabbitMqCommandBusConfig : async ( ) => {
136- const { exchange, concurrentLimit, handlerProcessTimeout, queueExpires } =
136+ const { exchange, concurrentLimit, handlerProcessTimeout, queueExpires, deadLetterQueue } =
137137 await this . #resolveConfig( ) ;
138138
139139 return {
140140 exchange,
141141 queueName,
142142 concurrentLimit,
143143 handlerProcessTimeout,
144- queueExpires
144+ queueExpires,
145+ deadLetterQueue
145146 } ;
146147 }
147148 } ) ;
0 commit comments