@xnestjs/rabbitmq
Version:
NestJS extension library for RabbitMQ
119 lines (118 loc) • 4.64 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 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 types_js_1 = require("./types.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 ?? types_js_1.RmqClient;
// const name = typeof token === 'string' ? token : 'RabbitMQ';
const logger = typeof opts.logger === 'string' ? new common_1.Logger(opts.logger) : opts.logger;
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(),
},
{
provide: token,
inject: [constants_js_1.RMQ_CONNECTION_OPTIONS],
useFactory: async (connectionOptions) => {
const client = new types_js_1.RmqClient(connectionOptions);
if (logger) {
client.on('connection', () => {
logger.log('RabbitMQ client connected');
});
client.on('error', err => {
logger.error('RabbitMQ connection error: ' + err?.message);
});
}
return client;
},
},
];
return {
global: opts.global,
module: RabbitmqCoreModule_1,
imports: opts.imports,
providers,
exports: [constants_js_1.RMQ_CONNECTION_OPTIONS, token, ...(metadata.exports ?? [])],
};
}
/**
*
* @constructor
*/
constructor(client, connectionOptions, logger) {
this.client = client;
this.connectionOptions = connectionOptions;
this.logger = logger;
}
async onApplicationBootstrap() {
const options = this.connectionOptions;
if (options.lazyConnect || !options.hosts?.length)
return;
this.logger?.log('Connecting to RabbitMQ at ' + ansi_colors_1.default.blue(options.hosts.toString()));
common_1.Logger.flush();
await this.client.onConnect();
}
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", [types_js_1.RmqClient, Object, common_1.Logger])
], RabbitmqCoreModule);