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