UNPKG

redis-smq

Version:

A simple high-performance Redis message queue for Node.js.

140 lines 5.78 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MessageHandlerRunner = void 0; const redis_smq_common_1 = require("redis-smq-common"); const index_js_1 = require("../errors/index.js"); const message_handler_js_1 = require("../message-handler/message-handler/message-handler.js"); const event_bus_publisher_js_1 = require("./event-bus-publisher.js"); class MessageHandlerRunner extends redis_smq_common_1.Runnable { constructor(consumer, redisClient, logger, eventBus) { super(); this.messageHandlerInstances = []; this.messageHandlers = []; this.runMessageHandlers = (cb) => { redis_smq_common_1.async.each(this.messageHandlers, (handlerParams, _, done) => { this.runMessageHandler(handlerParams, done); }, cb); }; this.shutDownMessageHandlers = (cb) => { redis_smq_common_1.async.each(this.messageHandlerInstances, (handler, queue, done) => { this.shutdownMessageHandler(handler, () => done()); }, () => { this.messageHandlerInstances = []; cb(); }); }; this.consumer = consumer; this.redisClient = redisClient; this.logger = logger; this.eventBus = eventBus; if (this.eventBus) { (0, event_bus_publisher_js_1.eventBusPublisher)(this, this.eventBus, logger); } } getLogger() { return this.logger; } getMessageHandlerInstance(queue) { const { queueParams, groupId } = queue; return this.messageHandlerInstances.find((i) => { const handlerQueue = i.getQueue(); return (handlerQueue.queueParams.name === queueParams.name && handlerQueue.queueParams.ns === queueParams.ns && handlerQueue.groupId === groupId); }); } getMessageHandler(queue) { const { queueParams, groupId } = queue; return this.messageHandlers.find((i) => i.queue.queueParams.name === queueParams.name && i.queue.queueParams.ns === queueParams.ns && i.queue.groupId === groupId); } createMessageHandlerInstance(handlerParams) { const instance = new message_handler_js_1.MessageHandler(this.consumer, this.redisClient, this.logger, handlerParams, true, this.eventBus); instance.on('consumer.messageHandler.error', (err, consumerId, queue) => { this.removeMessageHandler(queue, () => { this.logger.error(err); }); }); this.messageHandlerInstances.push(instance); this.logger.info(`Created a new instance (ID: ${instance.getId()}) for MessageHandler (${JSON.stringify(handlerParams)}).`); return instance; } runMessageHandler(handlerParams, cb) { const handler = this.createMessageHandlerInstance(handlerParams); handler.run((err) => { if (err) this.removeMessageHandler(handlerParams.queue, () => cb(err)); else { cb(); } }); } shutdownMessageHandler(messageHandler, cb) { const queue = messageHandler.getQueue(); messageHandler.shutdown(() => { this.messageHandlerInstances = this.messageHandlerInstances.filter((handler) => { const iQueue = handler.getQueue(); return !(iQueue.queueParams.name === queue.queueParams.name && iQueue.queueParams.ns === queue.queueParams.ns && iQueue.groupId === queue.groupId); }); cb(); }); } goingUp() { return super.goingUp().concat([this.runMessageHandlers]); } goingDown() { return [this.shutDownMessageHandlers].concat(super.goingDown()); } handleError(err) { if (this.isRunning()) { this.emit('consumer.messageHandlerRunner.error', err, this.consumer.getId()); } super.handleError(err); } removeMessageHandler(queue, cb) { const { queueParams, groupId } = queue; const handler = this.getMessageHandler(queue); if (!handler) cb(); else { this.messageHandlers = this.messageHandlers.filter((handler) => { const handerQueue = handler.queue; return !(queueParams.name === handerQueue.queueParams.name && queueParams.ns === handerQueue.queueParams.ns && groupId === handerQueue.groupId); }); this.logger.info(`Message handler with parameters (${JSON.stringify(queue)}) has been removed.`); const handlerInstance = this.getMessageHandlerInstance(queue); if (handlerInstance) this.shutdownMessageHandler(handlerInstance, cb); else cb(); } } addMessageHandler(queue, messageHandler, cb) { const handler = this.getMessageHandler(queue); if (handler) cb(new index_js_1.ConsumerConsumeMessageHandlerAlreadyExistsError()); else { const handlerParams = { queue, messageHandler, }; this.messageHandlers.push(handlerParams); this.logger.info(`Message handler with parameters (${JSON.stringify(handlerParams)}) has been registered.`); if (this.isRunning()) { this.runMessageHandler(handlerParams, cb); } else cb(); } } getQueues() { return this.messageHandlers.map((i) => i.queue); } } exports.MessageHandlerRunner = MessageHandlerRunner; //# sourceMappingURL=message-handler-runner.js.map