UNPKG

redis-smq

Version:

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

218 lines 10.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Namespace = void 0; const redis_smq_common_1 = require("redis-smq-common"); const redis_client_js_1 = require("../../common/redis-client/redis-client.js"); const redis_keys_js_1 = require("../../common/redis-keys/redis-keys.js"); const index_js_1 = require("../../config/index.js"); const _delete_queue_js_1 = require("../queue/_/_delete-queue.js"); const _get_queues_js_1 = require("../queue/_/_get-queues.js"); const index_js_2 = require("./errors/index.js"); class Namespace { constructor() { this.shutdown = (cb) => { this.logger.debug('Shutting down Namespace instance'); this.redisClient.shutdown((err) => { if (err) { this.logger.error('Error during shutdown', { error: err.message }); cb(err); } else { this.logger.debug('Successfully shut down Namespace instance'); cb(); } }); }; this.logger = redis_smq_common_1.logger.getLogger(index_js_1.Configuration.getSetConfig().logger, this.constructor.name.toLowerCase()); this.redisClient = new redis_client_js_1.RedisClient(); this.redisClient.on('error', (err) => this.logger.error(err)); this.logger.debug('Namespace instance created'); } getNamespaces(cb) { this.logger.debug('Getting all namespaces'); (0, redis_smq_common_1.withRedisClient)(this.redisClient, (client, cb) => { const { keyNamespaces } = redis_keys_js_1.redisKeys.getMainKeys(); this.logger.debug('Fetching namespaces from Redis', { key: keyNamespaces, }); client.smembers(keyNamespaces, (err, reply) => { if (err) { this.logger.error('Failed to get namespaces', { error: err.message, }); return cb(err); } if (!reply) { this.logger.error('Empty namespaces reply'); return cb(new redis_smq_common_1.CallbackEmptyReplyError()); } this.logger.debug('Successfully retrieved namespaces', { count: reply.length, }); cb(null, reply); }); }, cb); } getNamespaceQueues(namespace, cb) { this.logger.debug('Getting queues for namespace', { namespace }); const ns = redis_keys_js_1.redisKeys.validateRedisKey(namespace); if (ns instanceof Error) { this.logger.error('Invalid namespace', { namespace }); return cb(new index_js_2.NamespaceInvalidNamespaceError()); } (0, redis_smq_common_1.withRedisClient)(this.redisClient, (client, cb) => { const { keyNamespaces } = redis_keys_js_1.redisKeys.getMainKeys(); const { keyNamespaceQueues } = redis_keys_js_1.redisKeys.getNamespaceKeys(ns); this.logger.debug('Checking if namespace exists', { namespace: ns, key: keyNamespaces, }); redis_smq_common_1.async.waterfall([ (cb) => { client.sismember(keyNamespaces, ns, (err, reply) => { if (err) { this.logger.error('Failed to check namespace existence', { namespace: ns, error: err.message, }); return cb(err); } if (!reply) { this.logger.error('Namespace not found', { namespace: ns }); return cb(new index_js_2.NamespaceNotFoundError()); } this.logger.debug('Namespace exists', { namespace: ns }); cb(); }); }, (_, cb) => { this.logger.debug('Fetching queues for namespace', { namespace: ns, key: keyNamespaceQueues, }); client.smembers(keyNamespaceQueues, (err, reply) => { if (err) { this.logger.error('Failed to get namespace queues', { namespace: ns, error: err.message, }); return cb(err); } if (!reply) { this.logger.error('Empty queues reply', { namespace: ns }); return cb(new redis_smq_common_1.CallbackEmptyReplyError()); } const messageQueues = reply.map((i) => JSON.parse(i)); this.logger.debug('Successfully retrieved namespace queues', { namespace: ns, queueCount: messageQueues.length, }); cb(null, messageQueues); }); }, ], cb); }, cb); } delete(namespace, cb) { this.logger.debug('Deleting namespace', { namespace }); const ns = redis_keys_js_1.redisKeys.validateRedisKey(namespace); if (ns instanceof Error) { this.logger.error('Invalid namespace', { namespace }); return cb(new index_js_2.NamespaceInvalidNamespaceError()); } (0, redis_smq_common_1.withRedisClient)(this.redisClient, (client, cb) => { const { keyNamespaces } = redis_keys_js_1.redisKeys.getMainKeys(); this.logger.debug('Checking if namespace exists before deletion', { namespace: ns, key: keyNamespaces, }); redis_smq_common_1.async.waterfall([ (cb) => { client.sismember(keyNamespaces, ns, (err, isMember) => { if (err) { this.logger.error('Failed to check namespace existence', { namespace: ns, error: err.message, }); return cb(err); } if (!isMember) { this.logger.error('Namespace not found for deletion', { namespace: ns, }); return cb(new index_js_2.NamespaceNotFoundError()); } this.logger.debug('Namespace exists, proceeding with deletion', { namespace: ns, }); cb(); }); }, ], (err) => { if (err) return cb(err); this.logger.debug('Getting all queues for deletion', { namespace: ns, }); (0, _get_queues_js_1._getQueues)(client, (err, reply) => { if (err) { this.logger.error('Failed to get queues for deletion', { namespace: ns, error: err.message, }); return cb(err); } const queues = reply !== null && reply !== void 0 ? reply : []; this.logger.debug('Preparing to delete namespace and queues', { namespace: ns, queueCount: queues.length, }); const multi = client.multi(); multi.srem(keyNamespaces, ns); redis_smq_common_1.async.eachOf(queues, (queueParams, _, done) => { this.logger.debug('Deleting queue', { namespace: ns, queue: queueParams.name, }); (0, _delete_queue_js_1._deleteQueue)(client, queueParams, multi, (err) => { if (err) { this.logger.error('Failed to delete queue', { namespace: ns, queue: queueParams.name, error: err.message, }); } done(err); }); }, (err) => { if (err) { this.logger.error('Failed during queue deletion', { namespace: ns, error: err.message, }); return cb(err); } this.logger.debug('Executing namespace deletion transaction', { namespace: ns, }); multi.exec((err) => { if (err) { this.logger.error('Failed to execute namespace deletion transaction', { namespace: ns, error: err.message, }); return cb(err); } this.logger.debug('Successfully deleted namespace', { namespace: ns, }); cb(); }); }); }); }); }, cb); } } exports.Namespace = Namespace; //# sourceMappingURL=namespace.js.map