@golevelup/nestjs-rabbitmq
Advanced tools
Comparing version 4.1.0 to 5.0.0
@@ -6,2 +6,27 @@ # Change Log | ||
# [5.0.0](https://github.com/golevelup/nestjs/compare/@golevelup/nestjs-rabbitmq@4.1.0...@golevelup/nestjs-rabbitmq@5.0.0) (2024-02-09) | ||
### Bug Fixes | ||
- **rabbitmq:** fix library asserting queues with empty names ([#676](https://github.com/golevelup/nestjs/issues/676)) ([24757f3](https://github.com/golevelup/nestjs/commit/24757f3c226f00c8a708d9a75a098520abd19c0e)) | ||
- **rabbitmq:** fix unawaited promises ([#674](https://github.com/golevelup/nestjs/issues/674)) ([4b54afb](https://github.com/golevelup/nestjs/commit/4b54afbb3ca6bfaf5b060e6f0ec49edf20c66238)) | ||
### Build System | ||
- **rabbitmq:** update amqp libs ([#677](https://github.com/golevelup/nestjs/issues/677)) ([83530d3](https://github.com/golevelup/nestjs/commit/83530d3444f179fdf32c07acec46d0a2871ee4dd)), closes [#542](https://github.com/golevelup/nestjs/issues/542) | ||
### Features | ||
- **rabbit:** support multiple configs on the same handler ([#682](https://github.com/golevelup/nestjs/issues/682)) ([93ec23f](https://github.com/golevelup/nestjs/commit/93ec23fce4e78fac41fa09255f0141a42abd294b)), closes [#624](https://github.com/golevelup/nestjs/issues/624) | ||
- **rabbitmq:** add exchange-to-exchange bindings config ([#681](https://github.com/golevelup/nestjs/issues/681)) ([20cbdf9](https://github.com/golevelup/nestjs/commit/20cbdf96ff1698d68531c96f9f5ad3c5a521b490)), closes [#625](https://github.com/golevelup/nestjs/issues/625) | ||
- **rabbitmq:** add persistent reply to ([#684](https://github.com/golevelup/nestjs/issues/684)) ([6dfdc1b](https://github.com/golevelup/nestjs/commit/6dfdc1b0f01f10392cb5d6bf6aefaba6a768900e)) | ||
- **rabbitmq:** publish using ChannelWrapper ([#678](https://github.com/golevelup/nestjs/issues/678)) ([8962eed](https://github.com/golevelup/nestjs/commit/8962eed4ce527dba11fe7799de58cdf33d066e52)), closes [#673](https://github.com/golevelup/nestjs/issues/673) | ||
### BREAKING CHANGES | ||
- **rabbitmq:** This changes the behavior of throwing connection related errors | ||
- **rabbitmq:** We will no longer emit a disconnect event on an initial connection failure - | ||
instead we now emit connectFailed on each connection failure, and only emit disconnect when we | ||
transition from connected to disconnected. | ||
# [4.1.0](https://github.com/golevelup/nestjs/compare/@golevelup/nestjs-rabbitmq@4.0.0...@golevelup/nestjs-rabbitmq@4.1.0) (2023-11-21) | ||
@@ -8,0 +33,0 @@ |
import { ChannelWrapper, AmqpConnectionManager } from 'amqp-connection-manager'; | ||
import { ConsumeMessage, Channel, Connection, ConfirmChannel, Options } from 'amqplib'; | ||
import { Replies } from 'amqplib/properties'; | ||
import { MessageHandlerOptions, RabbitMQConfig, RequestOptions, ConsumeOptions } from '../rabbitmq.interfaces'; | ||
@@ -65,3 +64,3 @@ import { RpcResponse, SubscribeResponse } from './handlerResponses'; | ||
setupRpcChannel<T, U>(handler: (msg: T | undefined, rawMessage?: ConsumeMessage, headers?: any) => Promise<RpcResponse<U>>, rpcOptions: MessageHandlerOptions, channel: ConfirmChannel): Promise<ConsumerTag>; | ||
publish<T = any>(exchange: string, routingKey: string, message: T, options?: Options.Publish): Promise<Replies.Empty>; | ||
publish<T = any>(exchange: string, routingKey: string, message: T, options?: Options.Publish): Promise<boolean>; | ||
private handleMessage; | ||
@@ -68,0 +67,0 @@ private setupQueue; |
"use strict"; | ||
var __rest = (this && this.__rest) || function (s, e) { | ||
var t = {}; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) | ||
t[p] = s[p]; | ||
if (s != null && typeof Object.getOwnPropertySymbols === "function") | ||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { | ||
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) | ||
t[p[i]] = s[p[i]]; | ||
} | ||
return t; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -21,2 +32,3 @@ exports.AmqpConnection = void 0; | ||
exchanges: [], | ||
exchangeBindings: [], | ||
queues: [], | ||
@@ -95,2 +107,5 @@ defaultRpcTimeout: 10000, | ||
}); | ||
this._managedConnection.on('connectFailed', ({ err }) => { | ||
this.logger.error(`Failed to connect to RabbitMQ broker (${this.config.name})`, err === null || err === void 0 ? void 0 : err.stack); | ||
}); | ||
const defaultChannel = { | ||
@@ -104,3 +119,3 @@ name: AmqpConnection.name, | ||
await Promise.all([ | ||
Object.keys(this.config.channels).map(async (channelName) => { | ||
Promise.all(Object.keys(this.config.channels).map(async (channelName) => { | ||
const config = this.config.channels[channelName]; | ||
@@ -115,3 +130,3 @@ // Only takes the first channel specified as default so other ones get created. | ||
return this.setupManagedChannel(channelName, Object.assign(Object.assign({}, config), { default: false })); | ||
}), | ||
})), | ||
this.setupManagedChannel(defaultChannel.name, defaultChannel.config), | ||
@@ -126,3 +141,3 @@ ]); | ||
// Always assert exchanges & rpc queue in default channel. | ||
this.config.exchanges.forEach((x) => { | ||
await Promise.all(this.config.exchanges.map((x) => { | ||
const { createExchangeIfNotExists = true } = x; | ||
@@ -133,4 +148,5 @@ if (createExchangeIfNotExists) { | ||
return channel.checkExchange(x.name); | ||
}); | ||
this.setupQueuesWithBindings(channel, this.config.queues); | ||
})); | ||
await Promise.all(this.config.exchangeBindings.map((exchangeBinding) => channel.bindExchange(exchangeBinding.destination, exchangeBinding.source, exchangeBinding.pattern, exchangeBinding.args))); | ||
await this.setupQueuesWithBindings(channel, this.config.queues); | ||
if (this.config.enableDirectReplyTo) { | ||
@@ -143,25 +159,7 @@ await this.initDirectReplyQueue(channel); | ||
async setupQueuesWithBindings(channel, queues) { | ||
for (const configuredQueue of queues) { | ||
const { createQueueIfNotExists = true } = configuredQueue; | ||
if (createQueueIfNotExists) { | ||
this.setupQueue(configuredQueue, channel); | ||
} | ||
await channel.assertQueue(configuredQueue.name, configuredQueue.options); | ||
let routingKeys = []; | ||
if (Array.isArray(configuredQueue.routingKey)) { | ||
routingKeys = configuredQueue.routingKey; | ||
} | ||
else { | ||
if (configuredQueue.routingKey != null) { | ||
routingKeys = [configuredQueue.routingKey]; | ||
} | ||
} | ||
if (routingKeys.length > 0) { | ||
await Promise.all(routingKeys.map((routingKey) => { | ||
if (configuredQueue.exchange != undefined) { | ||
channel.bindQueue(configuredQueue.name, configuredQueue.exchange, routingKey, configuredQueue.bindQueueArguments); | ||
} | ||
})); | ||
} | ||
} | ||
await Promise.all(queues.map(async (configuredQueue) => { | ||
const { name, options, bindQueueArguments } = configuredQueue, rest = __rest(configuredQueue, ["name", "options", "bindQueueArguments"]); | ||
const queueOptions = Object.assign(Object.assign({}, options), (bindQueueArguments !== undefined && { bindQueueArguments })); | ||
await this.setupQueue(Object.assign(Object.assign(Object.assign({}, rest), (name !== undefined && { queue: name })), { queueOptions }), channel); | ||
})); | ||
} | ||
@@ -274,4 +272,6 @@ async initDirectReplyQueue(channel) { | ||
async setupRpcChannel(handler, rpcOptions, channel) { | ||
var _a; | ||
const queue = await this.setupQueue(rpcOptions, channel); | ||
const { consumerTag } = await channel.consume(queue, async (msg) => { | ||
var _a; | ||
try { | ||
@@ -296,2 +296,3 @@ if (msg == null) { | ||
headers, | ||
persistent: (_a = rpcOptions.usePersistentReplyTo) !== null && _a !== void 0 ? _a : false, | ||
}); | ||
@@ -313,3 +314,3 @@ } | ||
} | ||
}); | ||
}, (_a = rpcOptions === null || rpcOptions === void 0 ? void 0 : rpcOptions.queueOptions) === null || _a === void 0 ? void 0 : _a.consumerOptions); | ||
this.registerConsumerForQueue({ | ||
@@ -325,6 +326,2 @@ type: 'rpc', | ||
publish(exchange, routingKey, message, options) { | ||
// source amqplib channel is used directly to keep the behavior of throwing connection related errors | ||
if (!this.managedConnection.isConnected() || !this._channel) { | ||
throw new Error('AMQP connection is not available'); | ||
} | ||
let buffer; | ||
@@ -343,12 +340,3 @@ if (message instanceof Buffer) { | ||
} | ||
return new Promise((resolve, reject) => { | ||
this._channel.publish(exchange, routingKey, buffer, options, (err, ok) => { | ||
if (err) { | ||
reject(err); | ||
} | ||
else { | ||
resolve(ok); | ||
} | ||
}); | ||
}); | ||
return this._managedChannel.publish(exchange, routingKey, buffer, options); | ||
} | ||
@@ -395,4 +383,4 @@ handleMessage(handler, msg, allowNonJsonMessages) { | ||
let bindQueueArguments; | ||
if (subscriptionOptions.queueOptions) { | ||
bindQueueArguments = subscriptionOptions.queueOptions.bindQueueArguments; | ||
if (queueOptions) { | ||
bindQueueArguments = queueOptions.bindQueueArguments; | ||
} | ||
@@ -403,3 +391,3 @@ const routingKeys = Array.isArray(routingKey) ? routingKey : [routingKey]; | ||
if (routingKey != null) { | ||
channel.bindQueue(actualQueue, exchange, routingKey, bindQueueArguments); | ||
return channel.bindQueue(actualQueue, exchange, routingKey, bindQueueArguments); | ||
} | ||
@@ -406,0 +394,0 @@ })); |
import 'reflect-metadata'; | ||
import { PipeTransform, Type } from '@nestjs/common'; | ||
import { RabbitHandlerConfig } from './rabbitmq.interfaces'; | ||
export declare const makeRabbitDecorator: <T extends Partial<RabbitHandlerConfig>>(input: T) => (config: Pick<RabbitHandlerConfig, Exclude<"queue", keyof T> | Exclude<"type", keyof T> | Exclude<"name", keyof T> | Exclude<"connection", keyof T> | Exclude<"createQueueIfNotExists", keyof T> | Exclude<"exchange", keyof T> | Exclude<"routingKey", keyof T> | Exclude<"assertQueueErrorHandler", keyof T> | Exclude<"queueOptions", keyof T> | Exclude<"errorBehavior", keyof T> | Exclude<"errorHandler", keyof T> | Exclude<"allowNonJsonMessages", keyof T>>) => <TFunction extends Function, Y>(target: object | TFunction, propertyKey?: string | symbol | undefined, descriptor?: TypedPropertyDescriptor<Y> | undefined) => void; | ||
export declare const makeRabbitDecorator: <T extends Partial<RabbitHandlerConfig>>(input: T) => (config: Pick<RabbitHandlerConfig, Exclude<"queue", keyof T> | Exclude<"type", keyof T> | Exclude<"name", keyof T> | Exclude<"connection", keyof T> | Exclude<"exchange", keyof T> | Exclude<"routingKey", keyof T> | Exclude<"createQueueIfNotExists", keyof T> | Exclude<"assertQueueErrorHandler", keyof T> | Exclude<"queueOptions", keyof T> | Exclude<"errorBehavior", keyof T> | Exclude<"errorHandler", keyof T> | Exclude<"allowNonJsonMessages", keyof T> | Exclude<"usePersistentReplyTo", keyof T>>) => <TFunction extends Function, Y>(target: object | TFunction, propertyKey?: string | symbol | undefined, descriptor?: TypedPropertyDescriptor<Y> | undefined) => void; | ||
export declare const RabbitHandler: (config: RabbitHandlerConfig) => (target: any, key: any, descriptor: any) => void | TypedPropertyDescriptor<unknown>; | ||
export declare const RabbitSubscribe: (config: Pick<RabbitHandlerConfig, "queue" | "name" | "connection" | "createQueueIfNotExists" | "exchange" | "routingKey" | "assertQueueErrorHandler" | "queueOptions" | "errorBehavior" | "errorHandler" | "allowNonJsonMessages">) => <TFunction extends Function, Y>(target: object | TFunction, propertyKey?: string | symbol | undefined, descriptor?: TypedPropertyDescriptor<Y> | undefined) => void; | ||
export declare const RabbitRPC: (config: Pick<RabbitHandlerConfig, "queue" | "name" | "connection" | "createQueueIfNotExists" | "exchange" | "routingKey" | "assertQueueErrorHandler" | "queueOptions" | "errorBehavior" | "errorHandler" | "allowNonJsonMessages">) => <TFunction extends Function, Y>(target: object | TFunction, propertyKey?: string | symbol | undefined, descriptor?: TypedPropertyDescriptor<Y> | undefined) => void; | ||
export declare const RabbitSubscribe: (config: Pick<RabbitHandlerConfig, "queue" | "name" | "connection" | "exchange" | "routingKey" | "createQueueIfNotExists" | "assertQueueErrorHandler" | "queueOptions" | "errorBehavior" | "errorHandler" | "allowNonJsonMessages" | "usePersistentReplyTo">) => <TFunction extends Function, Y>(target: object | TFunction, propertyKey?: string | symbol | undefined, descriptor?: TypedPropertyDescriptor<Y> | undefined) => void; | ||
export declare const RabbitRPC: (config: Pick<RabbitHandlerConfig, "queue" | "name" | "connection" | "exchange" | "routingKey" | "createQueueIfNotExists" | "assertQueueErrorHandler" | "queueOptions" | "errorBehavior" | "errorHandler" | "allowNonJsonMessages" | "usePersistentReplyTo">) => <TFunction extends Function, Y>(target: object | TFunction, propertyKey?: string | symbol | undefined, descriptor?: TypedPropertyDescriptor<Y> | undefined) => void; | ||
export declare const InjectRabbitMQConfig: () => ParameterDecorator; | ||
@@ -9,0 +9,0 @@ export declare const createPipesRpcParamDecorator: (data?: any, type?: number, ...pipes: (Type<PipeTransform> | PipeTransform)[]) => ParameterDecorator; |
@@ -20,2 +20,8 @@ /// <reference types="node" /> | ||
} | ||
export interface RabbitMQExchangeBindingConfig { | ||
destination: string; | ||
source: string; | ||
pattern: string; | ||
args?: any; | ||
} | ||
export type ConsumeOptions = Options.Consume; | ||
@@ -55,2 +61,3 @@ export interface MessageOptions { | ||
channel?: string; | ||
consumerOptions?: ConsumeOptions; | ||
} | ||
@@ -83,2 +90,7 @@ export interface MessageHandlerOptions { | ||
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; | ||
} | ||
@@ -91,3 +103,3 @@ export interface ConnectionInitOptions { | ||
export type RabbitMQChannels = Record<string, RabbitMQChannelConfig>; | ||
export type RabbitMQHandlers = Record<string, MessageHandlerOptions>; | ||
export type RabbitMQHandlers = Record<string, MessageHandlerOptions | MessageHandlerOptions[]>; | ||
export interface RabbitMQConfig { | ||
@@ -101,2 +113,3 @@ name?: string; | ||
exchanges?: RabbitMQExchangeConfig[]; | ||
exchangeBindings?: RabbitMQExchangeBindingConfig[]; | ||
queues?: RabbitMQQueueConfig[]; | ||
@@ -103,0 +116,0 @@ defaultRpcTimeout?: number; |
@@ -19,6 +19,7 @@ import { DiscoveryService } from '@golevelup/nestjs-discovery'; | ||
constructor(discover: DiscoveryService, externalContextCreator: ExternalContextCreator, rpcParamsFactory: RabbitRpcParamsFactory, connectionManager: AmqpConnectionManager, config: RabbitMQConfig); | ||
static AmqpConnectionFactory(config: RabbitMQConfig): Promise<AmqpConnection>; | ||
static AmqpConnectionFactory(config: RabbitMQConfig): Promise<AmqpConnection | undefined>; | ||
static build(config: RabbitMQConfig): DynamicModule; | ||
static attach(connection: AmqpConnection): DynamicModule; | ||
onApplicationShutdown(): Promise<void>; | ||
private setupHandler; | ||
onApplicationBootstrap(): Promise<void>; | ||
@@ -25,0 +26,0 @@ } |
@@ -40,3 +40,3 @@ "use strict"; | ||
useFactory: async (config, connectionManager) => { | ||
return connectionManager.getConnection(config.name || 'default'); | ||
return connectionManager.getConnection((config === null || config === void 0 ? void 0 : config.name) || 'default'); | ||
}, | ||
@@ -55,9 +55,13 @@ inject: [rabbitmq_constants_1.RABBIT_CONFIG_TOKEN, connectionManager_1.AmqpConnectionManager], | ||
this.connectionManager = connectionManager; | ||
this.logger = config.logger || new common_1.Logger(RabbitMQModule_1.name); | ||
this.logger = (config === null || config === void 0 ? void 0 : config.logger) || new common_1.Logger(RabbitMQModule_1.name); | ||
} | ||
static async AmqpConnectionFactory(config) { | ||
const logger = (config === null || config === void 0 ? void 0 : config.logger) || new common_1.Logger(RabbitMQModule_1.name); | ||
if (config == undefined) { | ||
logger.log('Rabbitmq config is not provided, skip connection initialization.'); | ||
return undefined; | ||
} | ||
const connection = new connection_1.AmqpConnection(config); | ||
this.connectionManager.addConnection(connection); | ||
await connection.init(); | ||
const logger = config.logger || new common_1.Logger(RabbitMQModule_1.name); | ||
logger.log('Successfully connected to RabbitMQ'); | ||
@@ -67,3 +71,3 @@ return connection; | ||
static build(config) { | ||
const logger = config.logger || new common_1.Logger(RabbitMQModule_1.name); | ||
const logger = (config === null || config === void 0 ? void 0 : config.logger) || new common_1.Logger(RabbitMQModule_1.name); | ||
logger.warn('build() is deprecated. use forRoot() or forRootAsync() to configure RabbitMQ'); | ||
@@ -76,3 +80,5 @@ return { | ||
useFactory: async () => { | ||
return RabbitMQModule_1.AmqpConnectionFactory(config); | ||
return config !== undefined | ||
? RabbitMQModule_1.AmqpConnectionFactory(config) | ||
: undefined; | ||
}, | ||
@@ -107,2 +113,17 @@ }, | ||
} | ||
async setupHandler(connection, discoveredMethod, config, handler) { | ||
var _a, _b; | ||
const handlerDisplayName = `${discoveredMethod.parentClass.name}.${discoveredMethod.methodName} {${config.type}} -> ${ | ||
// eslint-disable-next-line sonarjs/no-nested-template-literals | ||
((_a = config.queueOptions) === null || _a === void 0 ? void 0 : _a.channel) ? `${config.queueOptions.channel}::` : ''}${config.exchange}::${config.routingKey}::${config.queue || 'amqpgen'}`; | ||
if (config.type === 'rpc' && | ||
!connection.configuration.enableDirectReplyTo) { | ||
this.logger.warn(`Direct Reply-To Functionality is disabled. RPC handler ${handlerDisplayName} will not be registered`); | ||
return; | ||
} | ||
this.logger.log(handlerDisplayName); | ||
return config.type === 'rpc' | ||
? connection.createRpc(handler, config) | ||
: connection.createSubscriber(handler, config, discoveredMethod.methodName, (_b = config === null || config === void 0 ? void 0 : config.queueOptions) === null || _b === void 0 ? void 0 : _b.consumerOptions); | ||
} | ||
// eslint-disable-next-line sonarjs/cognitive-complexity | ||
@@ -139,16 +160,10 @@ async onApplicationBootstrap() { | ||
); | ||
const mergedConfig = Object.assign(Object.assign({}, config), connection.configuration.handlers[config.name || '']); | ||
const { exchange, routingKey, queue, queueOptions } = mergedConfig; | ||
const handlerDisplayName = `${discoveredMethod.parentClass.name}.${discoveredMethod.methodName} {${config.type}} -> ${ | ||
// eslint-disable-next-line sonarjs/no-nested-template-literals | ||
(queueOptions === null || queueOptions === void 0 ? void 0 : queueOptions.channel) ? `${queueOptions.channel}::` : ''}${exchange}::${routingKey}::${queue || 'amqpgen'}`; | ||
if (config.type === 'rpc' && | ||
!connection.configuration.enableDirectReplyTo) { | ||
this.logger.warn(`Direct Reply-To Functionality is disabled. RPC handler ${handlerDisplayName} will not be registered`); | ||
return; | ||
} | ||
this.logger.log(handlerDisplayName); | ||
return config.type === 'rpc' | ||
? connection.createRpc(handler, mergedConfig) | ||
: connection.createSubscriber(handler, mergedConfig, discoveredMethod.methodName); | ||
const moduleHandlerConfigRaw = connection.configuration.handlers[config.name || '']; | ||
const moduleHandlerConfigs = Array.isArray(moduleHandlerConfigRaw) | ||
? moduleHandlerConfigRaw | ||
: [moduleHandlerConfigRaw]; | ||
await Promise.all(moduleHandlerConfigs.map((moduleHandlerConfig) => { | ||
const mergedConfig = Object.assign(Object.assign({}, config), moduleHandlerConfig); | ||
return this.setupHandler(connection, discoveredMethod, mergedConfig, handler); | ||
})); | ||
})); | ||
@@ -155,0 +170,0 @@ } |
{ | ||
"name": "@golevelup/nestjs-rabbitmq", | ||
"version": "4.1.0", | ||
"version": "5.0.0", | ||
"description": "Badass RabbitMQ addons for NestJS", | ||
@@ -39,10 +39,9 @@ "author": "Jesse Carter <jesse.r.carter@gmail.com>", | ||
"@golevelup/nestjs-discovery": "^4.0.0", | ||
"@golevelup/nestjs-modules": "^0.7.0", | ||
"amqp-connection-manager": "^3.0.0", | ||
"amqplib": "^0.8.0", | ||
"@golevelup/nestjs-modules": "^0.7.1", | ||
"amqp-connection-manager": "^4.1.14", | ||
"amqplib": "^0.10.3", | ||
"lodash": "^4.17.21" | ||
}, | ||
"devDependencies": { | ||
"@types/amqp-connection-manager": "^2.0.4", | ||
"@types/amqplib": "^0.5.9" | ||
"@types/amqplib": "^0.10.4" | ||
}, | ||
@@ -72,3 +71,3 @@ "peerDependencies": { | ||
}, | ||
"gitHead": "be88a40d5b4c988d2b5e855b446f7a8e3b43b9bf" | ||
"gitHead": "db0f67eed8db673e6bf339f3c65deff42d767cfc" | ||
} |
@@ -32,3 +32,3 @@ # @golevelup/nestjs-rabbitmq | ||
- [Inject the AmqpConnection](#inject-the-amqpconnection) | ||
- [Publising Messages (Fire and Forget)](#publising-messages-fire-and-forget) | ||
- [Publishing Messages (Fire and Forget)](#publishing-messages-fire-and-forget) | ||
- [Requesting Data from an RPC](#requesting-data-from-an-rpc) | ||
@@ -450,3 +450,3 @@ - [Type Inference](#type-inference) | ||
### Publising Messages (Fire and Forget) | ||
### Publishing Messages (Fire and Forget) | ||
@@ -562,3 +562,3 @@ If you just want to publish a message onto a RabbitMQ exchange, use the `publish` method of the `AmqpConnection` which has the following signature: | ||
Please note that nack will trigger the dead-letter mecanism of RabbitMQ (and so, you can use the deadLetterExchange in the queueOptions in order to send the message somewhere else). | ||
Please note that nack will trigger the dead-letter mechanism of RabbitMQ (and so, you can use the deadLetterExchange in the queueOptions in order to send the message somewhere else). | ||
@@ -565,0 +565,0 @@ A complete error handling strategy for RabbitMQ is out of the scope of this library. |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
148580
1
1179
+ Added@acuminous/bitsyntax@0.1.2(transitive)
+ Addedamqp-connection-manager@4.1.14(transitive)
+ Addedamqplib@0.10.5(transitive)
+ Addeddebug@4.4.0(transitive)
+ Addedms@2.1.3(transitive)
+ Addedpromise-breaker@6.0.0(transitive)
- Removedamqp-connection-manager@3.9.0(transitive)
- Removedamqplib@0.8.0(transitive)
- Removedbitsyntax@0.1.0(transitive)
- Removedbluebird@3.7.2(transitive)
- Removedcore-util-is@1.0.3(transitive)
- Removeddebug@2.6.9(transitive)
- Removedinherits@2.0.4(transitive)
- Removedisarray@0.0.1(transitive)
- Removedms@2.0.0(transitive)
- Removedpromise-breaker@5.0.0(transitive)
- Removedreadable-stream@1.1.14(transitive)
- Removedsafe-buffer@5.2.1(transitive)
- Removedstring_decoder@0.10.31(transitive)
Updatedamqplib@^0.10.3