redis-smq
Version:
A high-performance, reliable, and scalable message queue for Node.js.
142 lines • 6.41 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/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