UNPKG

redis-smq

Version:

A high-performance, reliable, and scalable message queue for Node.js.

142 lines 6.41 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/redis-keys/redis-keys.js"); const _get_consumer_groups_js_1 = require("../../consumer-groups/_/_get-consumer-groups.js"); const index_js_1 = require("../../errors/index.js"); const index_js_2 = require("../types/index.js"); const _get_queue_consumer_ids_js_1 = require("./_get-queue-consumer-ids.js"); const scripts_js_1 = require("../../common/redis/scripts.js"); const _validate_operation_js_1 = require("../../queue-operation-validator/_/_validate-operation.js"); const index_js_3 = require("../../queue-operation-validator/index.js"); const _get_processing_queues_js_1 = require("./_get-processing-queues.js"); function _deleteQueue(redisClient, queueParams, cb) { let consumerIds = []; let consumerGroups = []; let processingQueues = []; redis_smq_common_1.async.series([ (cb) => { (0, _validate_operation_js_1._validateOperation)(redisClient, queueParams, index_js_3.EQueueOperation.DELETE, cb); }, (cb) => { (0, _get_queue_consumer_ids_js_1._getQueueConsumerIds)(redisClient, queueParams, (err, reply) => { if (err) cb(err); else { consumerIds = reply !== null && reply !== void 0 ? reply : []; cb(); } }); }, (cb) => { (0, _get_consumer_groups_js_1._getConsumerGroups)(redisClient, queueParams, (err, reply) => { if (err) cb(err); else { consumerGroups = reply !== null && reply !== void 0 ? reply : []; cb(); } }); }, (cb) => { (0, _get_processing_queues_js_1._getProcessingQueues)(redisClient, queueParams, (err, reply) => { if (err) cb(err); else { processingQueues = Object.keys(reply !== null && reply !== void 0 ? reply : {}); cb(); } }); }, ], (err) => { if (err) return cb(err); const { keyQueues } = redis_keys_js_1.redisKeys.getMainKeys(); const { keyNamespaceQueues } = redis_keys_js_1.redisKeys.getNamespaceKeys(queueParams.ns); const { keyQueueProperties, keyQueuePending, keyQueueDeadLetter, keyQueueProcessingQueues, keyQueuePriority, keyQueueAcknowledged, keyQueueConsumers, keyQueueRateLimit, keyQueueScheduled, keyQueueDelayed, keyQueueRequeued, keyQueuePublished, keyQueueConsumerGroups, keyQueueWorkersLock, keyQueueExchangeBindings, } = redis_keys_js_1.redisKeys.getQueueKeys(queueParams.ns, queueParams.name, null); const heartbeatKeys = consumerIds.map((id) => redis_keys_js_1.redisKeys.getConsumerKeys(id).keyConsumerHeartbeat); const consumerGroupKeys = consumerGroups.flatMap((groupId) => { const { keyQueuePriority, keyQueuePending } = redis_keys_js_1.redisKeys.getQueueKeys(queueParams.ns, queueParams.name, groupId); return [keyQueuePending, keyQueuePriority]; }); const keysToDelete = new Set([ keyQueueProperties, keyQueuePending, keyQueueDeadLetter, keyQueueProcessingQueues, keyQueuePriority, keyQueueAcknowledged, keyQueueConsumers, keyQueueRateLimit, keyQueueScheduled, keyQueueDelayed, keyQueueRequeued, keyQueuePublished, keyQueueConsumerGroups, keyQueueWorkersLock, keyQueueExchangeBindings, ...consumerGroupKeys, ...processingQueues, ]); const scriptKeys = [ keyQueues, keyNamespaceQueues, keyQueueProperties, keyQueueExchangeBindings, keyQueueConsumers, ...heartbeatKeys, ...Array.from(keysToDelete).filter((k) => k !== keyQueueProperties && k !== keyQueueExchangeBindings && k !== keyQueueConsumers), ]; const queueParamsStr = JSON.stringify(queueParams); const scriptArgs = [ queueParamsStr, index_js_2.EQueueProperty.MESSAGES_COUNT, String(heartbeatKeys.length), index_js_2.EQueueProperty.OPERATIONAL_STATE, index_js_2.EQueueOperationalState.LOCKED, index_js_2.EQueueProperty.LOCK_ID, '', ...consumerIds, ]; redisClient.runScript(scripts_js_1.ERedisScriptName.DELETE_QUEUE, scriptKeys, scriptArgs, (err, reply) => { if (err) cb(err); else if (reply !== 'OK') { if (reply === 'QUEUE_LOCKED') { cb(new index_js_1.QueueLockedError({ metadata: { queue: queueParams, }, message: `Cannot delete queue ${queueParams.name}: Queue is locked.`, })); } else if (reply === 'QUEUE_NOT_FOUND') cb(new index_js_1.QueueNotFoundError({ metadata: { queue: queueParams, }, })); else if (reply === 'QUEUE_NOT_EMPTY') cb(new index_js_1.QueueNotEmptyError()); else if (reply === 'QUEUE_HAS_ACTIVE_CONSUMERS') cb(new index_js_1.QueueHasActiveConsumersError({ metadata: { queue: queueParams, }, })); else if (reply === 'QUEUE_HAS_BOUND_EXCHANGE') cb(new index_js_1.QueueHasBoundExchangesError()); else if (reply === 'CONSUMER_SET_MISMATCH') cb(new index_js_1.ConsumerSetMismatchError()); else cb(new index_js_1.UnexpectedScriptReplyError({ metadata: { reply } })); } else cb(); }); }); } //# sourceMappingURL=_delete-queue.js.map