UNPKG

redis-smq

Version:

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

127 lines 5.88 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports._deleteQueue = _deleteQueue; const redis_smq_common_1 = require("redis-smq-common"); const redis_keys_js_1 = require("../../../common/redis-keys/redis-keys.js"); const _get_consumer_groups_js_1 = require("../../consumer-groups/_/_get-consumer-groups.js"); const consumer_heartbeat_js_1 = require("../../consumer/consumer-heartbeat/consumer-heartbeat.js"); const consumer_queues_js_1 = require("../../consumer/consumer-queues.js"); const processing_queue_js_1 = require("../../consumer/message-handler/processing-queue/processing-queue.js"); const index_js_1 = require("../errors/index.js"); const index_js_2 = require("../types/index.js"); const _get_queue_properties_js_1 = require("./_get-queue-properties.js"); function checkOnlineConsumers(redisClient, queue, cb) { consumer_queues_js_1.consumerQueues.getQueueConsumers(redisClient, queue, false, (err, consumers) => { if (err) cb(err); redis_smq_common_1.async.eachIn(consumers !== null && consumers !== void 0 ? consumers : {}, (_, consumerId, done) => { consumer_heartbeat_js_1.ConsumerHeartbeat.isConsumerAlive(redisClient, consumerId, (err, alive) => { if (err) done(err); else if (alive) done(new index_js_1.QueueQueueHasRunningConsumersError()); else done(); }); }, (err) => cb(err)); }); } function _deleteQueue(redisClient, queueParams, multi, cb) { const { keyQueuePending, keyQueueDL, keyQueueProcessingQueues, keyQueuePriorityPending, keyQueueAcknowledged, keyQueueConsumers, keyQueueRateLimitCounter, keyQueueProperties, keyQueueScheduled, keyQueueMessages, keyQueueConsumerGroups, } = redis_keys_js_1.redisKeys.getQueueKeys(queueParams, null); const { keyNamespaceQueues } = redis_keys_js_1.redisKeys.getNamespaceKeys(queueParams.ns); const { keyQueues } = redis_keys_js_1.redisKeys.getMainKeys(); const keys = [ keyQueuePending, keyQueueDL, keyQueueProcessingQueues, keyQueuePriorityPending, keyQueueAcknowledged, keyQueueConsumers, keyQueueRateLimitCounter, keyQueueProperties, keyQueueScheduled, keyQueueMessages, keyQueueConsumerGroups, ]; let exchange = null; let pubSubDelivery = false; redisClient.watch([ keyQueueConsumers, keyQueueProcessingQueues, keyQueueProperties, keyQueueConsumerGroups, ], (err) => { if (err) cb(err); else { const processingQueues = []; redis_smq_common_1.async.waterfall([ (cb) => (0, _get_queue_properties_js_1._getQueueProperties)(redisClient, queueParams, (err, reply) => { var _a; if (err) cb(err); else if (!reply) cb(new index_js_1.QueueQueueNotFoundError()); else { const messagesCount = reply.messagesCount; if (messagesCount) cb(new index_js_1.QueueQueueNotEmptyError()); else { exchange = (_a = reply.exchange) !== null && _a !== void 0 ? _a : null; pubSubDelivery = reply.deliveryModel === index_js_2.EQueueDeliveryModel.PUB_SUB; cb(); } } }), (cb) => { if (pubSubDelivery) { (0, _get_consumer_groups_js_1._getConsumerGroups)(redisClient, queueParams, (err, groups) => { if (err) cb(err); else { redis_smq_common_1.async.eachOf(groups !== null && groups !== void 0 ? groups : [], (groupId, _, cb) => { const { keyQueuePriorityPending, keyQueuePending } = redis_keys_js_1.redisKeys.getQueueKeys(queueParams, groupId); keys.push(keyQueuePending, keyQueuePriorityPending); cb(); }, cb); } }); } else cb(); }, (cb) => { checkOnlineConsumers(redisClient, queueParams, cb); }, (cb) => { processing_queue_js_1.processingQueue.getQueueProcessingQueues(redisClient, queueParams, (err, reply) => { if (err) cb(err); else { processingQueues.push(...Object.keys(reply !== null && reply !== void 0 ? reply : {})); cb(); } }); }, ], (err) => { if (err) redisClient.unwatch(() => cb(err)); else { const tx = multi || redisClient.multi(); const str = JSON.stringify(queueParams); tx.srem(keyQueues, str); tx.srem(keyNamespaceQueues, str); if (processingQueues.length) { keys.push(...processingQueues); } tx.del(keys); if (exchange) tx.srem(exchange, str); cb(null, tx); } }); } }); } //# sourceMappingURL=_delete-queue.js.map