@golevelup/nestjs-rabbitmq
Version:
Badass RabbitMQ addons for NestJS
248 lines • 9.16 kB
TypeScript
/// <reference types="node" />
/// <reference types="node" />
import { LoggerService } from '@nestjs/common';
import { AmqpConnectionManagerOptions } from 'amqp-connection-manager';
import { ConsumeMessage, Options } from 'amqplib';
import { AssertQueueErrorHandler, MessageErrorHandler, BatchMessageErrorHandler, MessageHandlerErrorBehavior } from './amqp/errorBehaviors';
export interface RabbitMQExchangeConfig {
name: string;
type?: string;
createExchangeIfNotExists?: boolean;
options?: Options.AssertExchange;
}
export interface RabbitMQQueueConfig {
name: string;
createQueueIfNotExists?: boolean;
options?: Options.AssertQueue;
exchange?: string;
routingKey?: string | string[];
bindQueueArguments?: any;
}
export interface RabbitMQExchangeBindingConfig {
destination: string;
source: string;
pattern: string;
args?: any;
}
export type ConsumeOptions = Options.Consume;
export interface MessageOptions {
exchange: string;
routingKey: string;
}
export interface RequestOptions {
exchange: string;
routingKey: string;
correlationId?: string;
timeout?: number;
payload?: any;
headers?: any;
expiration?: string | number;
publishOptions?: Omit<Options.Publish, 'replyTo' | 'correlationId' | 'headers' | 'expiration'>;
}
export interface QueueOptions {
durable?: boolean;
exclusive?: boolean;
autoDelete?: boolean;
arguments?: any;
messageTtl?: number;
expires?: number;
deadLetterExchange?: string;
deadLetterRoutingKey?: string;
maxLength?: number;
maxPriority?: number;
bindQueueArguments?: any;
/**
* Set this to the name of the channel you want to consume messages from to enable this feature.
*
* If channel does not exist or you haven't specified one, it will use the default channel.
*
* For channel to exist it needs to be created in module config.
*/
channel?: string;
consumerOptions?: ConsumeOptions;
}
export type MessageDeserializer = (message: Buffer, msg: ConsumeMessage) => any;
export type MessageSerializer = (value: any) => Buffer;
export interface MessageHandlerOptions {
/**
* You can use a handler config specified in module level.
* Just use the same key name defined there.
*/
name?: string;
connection?: string;
exchange?: string;
routingKey?: string | string[];
queue?: string;
queueOptions?: QueueOptions;
/**
* @deprecated()
* Legacy error handling behaviors. This will be overridden if the errorHandler property is set
*/
errorBehavior?: MessageHandlerErrorBehavior;
/**
* A function that will be called if an error is thrown during processing of an incoming message
*/
errorHandler?: MessageErrorHandler;
/**
* A function that will be called if an error is thrown during queue creation (i.e. during channel.assertQueue)
*/
assertQueueErrorHandler?: AssertQueueErrorHandler;
allowNonJsonMessages?: boolean;
createQueueIfNotExists?: boolean;
/**
* Indicates whether responses to requests with a 'replyTo' header should be persistent.
* @default false - By default, responses are not persistent unless this is set to true.
*/
usePersistentReplyTo?: boolean;
/**
* This function is used to deserialize the received message.
* If set, will override the module's default deserializer.
*/
deserializer?: MessageDeserializer;
/**
* Enables consumer-side batching.
*/
batchOptions?: BatchOptions;
}
export interface ConnectionInitOptions {
/**
* Determines whether the application should wait for a healthy connection to be established
* before proceeding with operations.
*
* - When set to `true` (default), the application will block until a connection to the RabbitMQ broker
* is successfully established or a timeout occurs. The `timeout` value specifies the maximum
* time (in milliseconds) the application will wait before giving up.
* - When set to `false`, the application will not wait for a connection and will proceed
* regardless of the connection state. Health checks will be skipped in this case.
*
* @default true - The application will wait for a healthy connection by default.
*/
wait?: boolean;
/**
* Specifies how long (in milliseconds) the application should wait for a healthy connection
* to be established when `wait` is set to `true`. If the connection is not established within
* this time frame, an error will be thrown or suppressed based on the `reject` option.
*
* @default 5000 - The application will wait for up to N milliseconds before timing out.
*/
timeout?: number;
/**
* Determines the behavior when a connection fails within the specified `timeout` period.
*
* - When set to `true` (default), the application will throw an error if a connection
* cannot be established within the timeout period.
* - When set to `false`, the application will suppress the error and continue running,
* treating the failed connection as a non-blocking issue.
*
* @default true - The application will throw an error on timeout by default.
*/
reject?: boolean;
/**
* When set to `true`, suppresses logging for connection failure events.
*
* Use this flag to prevent connection failure logs from being written,
* which can be useful in non-critical environments or during specific operations
* where connection issues are expected and do not require logging.
*
* @default false - Connection failure logs will be written by default.
*/
skipConnectionFailedLogging?: boolean;
/**
* When set to `true`, suppresses logging for disconnection failure events.
*
* @default false - Disconnection failure logs will be written by default.
*/
skipDisconnectFailedLogging?: boolean;
}
export type RabbitMQChannels = Record<string, RabbitMQChannelConfig>;
export type RabbitMQHandlers = Record<string, MessageHandlerOptions | MessageHandlerOptions[]>;
export type RabbitMQUriConfig = Options.Connect | string;
export interface RabbitMQConfig {
name?: string;
uri: RabbitMQUriConfig | RabbitMQUriConfig[];
/**
* Now specifies the default prefetch count for all channels.
*/
prefetchCount?: number;
exchanges?: RabbitMQExchangeConfig[];
exchangeBindings?: RabbitMQExchangeBindingConfig[];
queues?: RabbitMQQueueConfig[];
defaultRpcTimeout?: number;
defaultExchangeType?: string;
defaultRpcErrorHandler?: MessageErrorHandler;
defaultSubscribeErrorBehavior?: MessageHandlerErrorBehavior;
connectionInitOptions?: ConnectionInitOptions;
connectionManagerOptions?: AmqpConnectionManagerOptions;
registerHandlers?: boolean;
enableDirectReplyTo?: boolean;
enableControllerDiscovery?: boolean;
/**
* You can optionally create channels which you consume messages from.
*
* By setting `prefetchCount` for a channel, you can manage message speeds of your various handlers on the same connection.
*/
channels?: RabbitMQChannels;
/**
* You can pass a list with handler configs to use in the Subscription decorator
*/
handlers?: RabbitMQHandlers;
/**
* You can set this property to define the default handler configuration to use
* when using handlers.
*/
defaultHandler?: string;
/**
* You can pass your implementation of the Nestjs LoggerService.
*/
logger?: LoggerService;
/**
* This function is used to deserialize the received message.
*/
deserializer?: MessageDeserializer;
/**
* This function is used to serialize the message to be sent.
*/
serializer?: MessageSerializer;
}
export type RabbitHandlerType = 'rpc' | 'subscribe';
export interface RabbitHandlerConfig extends MessageHandlerOptions {
type: RabbitHandlerType;
}
export interface RabbitMQChannelConfig {
/**
* Specifies prefetch count for the channel. If not specified will use the default one.
*/
prefetchCount?: number;
/**
* Makes this channel the default for all handlers.
*
* If no channel has been marked as default, new channel will be created.
*/
default?: boolean;
}
interface BatchOptions {
/**
* The number of messages to accumulate before calling the message handler.
*
* This should be smaller than the channel prefetch.
*
* Defaults to 10 if provided value is less than 2.
*
* @default 10
*/
size: number;
/**
* The time to wait, in milliseconds, for additional messages before returning a partial batch.
*
* Defaults to 200 if not provided or provided value is less than 1.
*
* @default 200
*/
timeout?: number;
/**
* A function that will be called if an error is thrown during processing of an incoming message
*/
errorHandler?: BatchMessageErrorHandler;
}
export {};
//# sourceMappingURL=rabbitmq.interfaces.d.ts.map