UNPKG

redis-smq

Version:

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

75 lines 4.59 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const redis_smq_common_1 = require("redis-smq-common"); const _get_queue_consumer_ids_js_1 = require("../../queue/_/_get-queue-consumer-ids.js"); const consumer_heartbeat_js_1 = require("../consumer-heartbeat/consumer-heartbeat.js"); const message_unacknowledgement_js_1 = require("../message-handler/message-handler/consume-message/message-unacknowledgement.js"); const index_js_1 = require("../types/index.js"); const worker_js_1 = require("./worker.js"); class WatchConsumersWorker extends worker_js_1.Worker { constructor(args) { super(args); this.work = (cb) => { this.logger.debug('Starting watch consumers work cycle'); const redisClient = this.redisClient.getInstance(); if (redisClient instanceof Error) { this.logger.error('Failed to get Redis client instance', redisClient); cb(redisClient); return void 0; } const queueName = this.queueParsedParams.queueParams.name; const queueNamespace = this.queueParsedParams.queueParams.ns; this.logger.debug(`Checking consumers for queue: ${queueNamespace}:${queueName}`); (0, _get_queue_consumer_ids_js_1._getQueueConsumerIds)(redisClient, this.queueParsedParams.queueParams, (err, consumerIds) => { if (err) { this.logger.error(`Error retrieving consumer IDs for queue ${queueNamespace}:${queueName}`, err); cb(err); } else { const consumerCount = (consumerIds === null || consumerIds === void 0 ? void 0 : consumerIds.length) || 0; this.logger.debug(`Found ${consumerCount} consumers for queue ${queueNamespace}:${queueName}`); redis_smq_common_1.async.eachOf(consumerIds !== null && consumerIds !== void 0 ? consumerIds : [], (consumerId, index, done) => { this.logger.debug(`Checking heartbeat for consumer ${consumerId} (${index + 1}/${consumerCount})`); consumer_heartbeat_js_1.ConsumerHeartbeat.isConsumerAlive(redisClient, consumerId, (err, alive) => { if (err) { this.logger.error(`Error checking heartbeat for consumer ${consumerId}`, err); done(err); } else if (!alive) { this.logger.info(`Consumer ${consumerId} is offline, unacknowledging messages`); this.messageUnacknowledgement.unacknowledgeMessagesInProcess(consumerId, [this.queueParsedParams.queueParams], index_js_1.EMessageUnacknowledgementReason.OFFLINE_CONSUMER, (err, status) => { if (err) { this.logger.error(`Failed to unacknowledge messages for offline consumer ${consumerId}`, err); done(err); } else { const messageCount = status ? Object.keys(status).length : 0; this.logger.info(`Successfully unacknowledged ${messageCount} messages for offline consumer ${consumerId}`); done(); } }); } else { this.logger.debug(`Consumer ${consumerId} is alive and active`); done(); } }); }, (err) => { if (err) { this.logger.error('Error during consumer heartbeat check cycle', err); } else { this.logger.debug('Completed watch consumers work cycle successfully'); } cb(err); }); } }); }; this.messageUnacknowledgement = new message_unacknowledgement_js_1.MessageUnacknowledgement(this.redisClient); } } exports.default = (payload) => new WatchConsumersWorker(payload); //# sourceMappingURL=watch-consumers.worker.js.map