UNPKG

redis-smq

Version:

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

110 lines 4.44 kB
import { async, CallbackEmptyReplyError, logger, } from 'redis-smq-common'; import { RedisClient } from '../../common/redis-client/redis-client.js'; import { redisKeys } from '../../common/redis-keys/redis-keys.js'; import { Configuration } from '../../config/index.js'; import { _deleteQueue } from '../queue/_/_delete-queue.js'; import { _getQueues } from '../queue/_/_get-queues.js'; import { NamespaceInvalidNamespaceError, NamespaceNotFoundError, } from './errors/index.js'; export class Namespace { logger; redisClient; constructor() { this.logger = logger.getLogger(Configuration.getSetConfig().logger, `exchange-fan-out-manager`); this.redisClient = new RedisClient(); this.redisClient.on('error', (err) => this.logger.error(err)); } getNamespaces(cb) { this.redisClient.getSetInstance((err, client) => { if (err) return cb(err); if (!client) return cb(new CallbackEmptyReplyError()); const { keyNamespaces } = redisKeys.getMainKeys(); client.smembers(keyNamespaces, (err, reply) => { if (err) return cb(err); if (!reply) return cb(new CallbackEmptyReplyError()); cb(null, reply); }); }); } getNamespaceQueues(namespace, cb) { const ns = redisKeys.validateRedisKey(namespace); if (ns instanceof Error) return cb(new NamespaceInvalidNamespaceError()); this.redisClient.getSetInstance((err, client) => { if (err) return cb(err); if (!client) return cb(new CallbackEmptyReplyError()); const { keyNamespaces } = redisKeys.getMainKeys(); const { keyNamespaceQueues } = redisKeys.getNamespaceKeys(ns); async.waterfall([ (cb) => { client.sismember(keyNamespaces, ns, (err, reply) => { if (err) return cb(err); if (!reply) return cb(new NamespaceNotFoundError()); cb(); }); }, (cb) => { client.smembers(keyNamespaceQueues, (err, reply) => { if (err) return cb(err); if (!reply) return cb(new CallbackEmptyReplyError()); const messageQueues = reply.map((i) => JSON.parse(i)); cb(null, messageQueues); }); }, ], cb); }); } delete(namespace, cb) { const ns = redisKeys.validateRedisKey(namespace); if (ns instanceof Error) return cb(new NamespaceInvalidNamespaceError()); this.redisClient.getSetInstance((err, client) => { if (err) return cb(err); if (!client) return cb(new CallbackEmptyReplyError()); const { keyNamespaces } = redisKeys.getMainKeys(); async.waterfall([ (cb) => { client.sismember(keyNamespaces, ns, (err, isMember) => { if (err) return cb(err); if (!isMember) return cb(new NamespaceNotFoundError()); cb(); }); }, ], (err) => { if (err) return cb(err); _getQueues(client, (err, reply) => { if (err) return cb(err); const queues = reply ?? []; const multi = client.multi(); multi.srem(keyNamespaces, ns); async.eachOf(queues, (queueParams, _, done) => { _deleteQueue(client, queueParams, multi, (err) => done(err)); }, (err) => { if (err) return cb(err); multi.exec((err) => cb(err)); }); }); }); }); } shutdown = (cb) => { this.redisClient.shutdown(cb); }; } //# sourceMappingURL=namespace.js.map