@xnestjs/rabbitmq
Version:
NestJS extension library for RabbitMQ
133 lines (132 loc) • 5.06 kB
JavaScript
;
var RabbitmqCoreModule_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RabbitmqCoreModule = void 0;
const tslib_1 = require("tslib");
const node_assert_1 = tslib_1.__importDefault(require("node:assert"));
const crypto = tslib_1.__importStar(require("node:crypto"));
const common_1 = require("@nestjs/common");
const microservices_1 = require("@nestjs/microservices");
const ansi_colors_1 = tslib_1.__importDefault(require("ansi-colors"));
const constants_js_1 = require("./constants.js");
const get_rabbitmq_config_js_1 = require("./get-rabbitmq-config.js");
const CLIENT_TOKEN = Symbol('CLIENT_TOKEN');
let RabbitmqCoreModule = RabbitmqCoreModule_1 = class RabbitmqCoreModule {
/**
*
*/
static forRoot(moduleOptions) {
const connectionOptions = (0, get_rabbitmq_config_js_1.getRabbitmqConfig)(moduleOptions.useValue || {}, moduleOptions.envPrefix);
return this._createDynamicModule(moduleOptions, {
global: moduleOptions.global,
providers: [
{
provide: constants_js_1.RMQ_CONNECTION_OPTIONS,
useValue: connectionOptions,
},
],
});
}
/**
*
*/
static forRootAsync(asyncOptions) {
node_assert_1.default.ok(asyncOptions.useFactory, 'useFactory is required');
return this._createDynamicModule(asyncOptions, {
global: asyncOptions.global,
providers: [
{
provide: constants_js_1.RMQ_CONNECTION_OPTIONS,
inject: asyncOptions.inject,
useFactory: async (...args) => {
const opts = await asyncOptions.useFactory(...args);
return (0, get_rabbitmq_config_js_1.getRabbitmqConfig)(opts, asyncOptions.envPrefix);
},
},
],
});
}
static _createDynamicModule(opts, metadata) {
const token = opts.token ?? microservices_1.ClientRMQ;
const name = typeof token === 'string' ? token : 'RabbitMQ';
const logger = typeof opts.logger === 'string' ? new common_1.Logger(opts.logger) : opts.logger;
const exports = [constants_js_1.RMQ_CONNECTION_OPTIONS, ...(metadata.exports ?? [])];
const providers = [
...(metadata.providers ?? []),
{
provide: common_1.Logger,
useValue: logger,
},
{
provide: CLIENT_TOKEN,
useExisting: token,
},
{
provide: constants_js_1.RMQ_MODULE_ID,
useValue: crypto.randomUUID(),
},
];
if (name !== token) {
exports.push(token);
providers.push({
provide: token,
useExisting: name,
});
}
return {
module: RabbitmqCoreModule_1,
providers,
imports: [
/** Import ClientsModule */
microservices_1.ClientsModule.registerAsync({
clients: [
{
name,
extraProviders: metadata.providers,
inject: [constants_js_1.RMQ_CONNECTION_OPTIONS],
useFactory: (connectionOptions) => {
return {
transport: microservices_1.Transport.RMQ,
options: connectionOptions,
};
},
},
],
}),
],
exports,
};
}
/**
*
* @constructor
*/
constructor(client, connectionOptions, logger) {
this.client = client;
this.connectionOptions = connectionOptions;
this.logger = logger;
}
async onApplicationBootstrap() {
const options = this.connectionOptions;
this.client.on('error', e => {
console.log(e);
});
if (options.lazyConnect || !options.urls?.length)
return;
this.logger?.log('Connecting to RabbitMQ at ' + ansi_colors_1.default.blue(options.urls.join(',')));
common_1.Logger.flush();
await this.client.connect().catch(e => {
this.logger?.error('RabbitMQ connection failed: ' + e.message);
throw e;
});
}
onApplicationShutdown() {
return this.client.close();
}
};
exports.RabbitmqCoreModule = RabbitmqCoreModule;
exports.RabbitmqCoreModule = RabbitmqCoreModule = RabbitmqCoreModule_1 = tslib_1.__decorate([
tslib_1.__param(0, (0, common_1.Inject)(CLIENT_TOKEN)),
tslib_1.__param(1, (0, common_1.Inject)(constants_js_1.RMQ_CONNECTION_OPTIONS)),
tslib_1.__metadata("design:paramtypes", [microservices_1.ClientRMQ, Object, common_1.Logger])
], RabbitmqCoreModule);