redis-smq
Version:
A simple high-performance Redis message queue for Node.js.
127 lines • 5.88 kB
JavaScript
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
;