UNPKG

redis-smq

Version:

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

122 lines 5.15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ListMessageStorage = void 0; const abstract_message_storage_1 = require("./abstract-message-storage"); const types_1 = require("../../../../types"); const message_1 = require("../../message/message"); const redis_smq_common_1 = require("redis-smq-common"); const message_not_found_error_1 = require("../errors/message-not-found.error"); const redis_keys_1 = require("../../../common/redis-keys/redis-keys"); const message_requeue_error_1 = require("../errors/message-requeue.error"); const redis_client_1 = require("../../../common/redis-client/redis-client"); class ListMessageStorage extends abstract_message_storage_1.AbstractMessageStorage { getMessageById(key, id, cb) { const { keyMessages } = key; const { messageId, sequenceId } = id; this.redisClient.lrange(keyMessages, sequenceId, sequenceId, (err, reply) => { if (err) cb(err); else if (!reply || !reply.length) cb(new message_not_found_error_1.MessageNotFoundError()); else { const [msg] = reply; const message = message_1.Message.createFromMessage(msg); if (message.getRequiredId() !== messageId) cb(new message_not_found_error_1.MessageNotFoundError()); else cb(null, message); } }); } requeueMessage(key, id, cb) { this.getMessageById(key, id, (err, msg) => { var _a; if (err) cb(err); else if (!msg) cb(new redis_smq_common_1.errors.EmptyCallbackReplyError()); else { const { keyMessages } = key; const message = message_1.Message.createFromMessage(msg); const queue = message.getDestinationQueue(); message.getRequiredMessageState().reset(); const { keyQueueSettings, keyQueuePending, keyQueuePendingPriorityMessageWeight, keyQueuePendingPriorityMessages, } = redis_keys_1.redisKeys.getQueueKeys(queue); this.redisClient.runScript(redis_client_1.ELuaScriptName.REQUEUE_MESSAGE, [ keyQueueSettings, types_1.EQueueSettingType.QUEUE_TYPE, keyQueuePendingPriorityMessages, keyQueuePendingPriorityMessageWeight, keyQueuePending, keyMessages, ], [ message.getRequiredId(), JSON.stringify(message), (_a = message.getPriority()) !== null && _a !== void 0 ? _a : '', JSON.stringify(msg), ], (err, reply) => { if (err) cb(err); else if (!reply) cb(new message_requeue_error_1.MessageRequeueError()); else cb(); }); } }); } deleteMessage(key, id, cb) { this.getMessageById(key, id, (err, message) => { if (err) cb(err); else if (!message) cb(new redis_smq_common_1.errors.EmptyCallbackReplyError()); else { const { keyMessages } = key; this.redisClient.lrem(keyMessages, 1, message.toString(), (err) => cb(err)); } }); } fetchMessages(key, skip, take, cb) { this.validatePaginationParams(skip, take); const { keyMessages } = key; const getItems = (total, cb) => { if (!total) { cb(null, { total, items: [], }); } else this.redisClient.lrange(keyMessages, skip, skip + take - 1, (err, result) => { if (err) cb(err); else { const items = (result !== null && result !== void 0 ? result : []).map((msg, index) => { const message = message_1.Message.createFromMessage(msg); return { sequenceId: skip + index, message, }; }); cb(null, { total, items }); } }); }; redis_smq_common_1.async.waterfall([(cb) => this.countMessages(key, cb), getItems], cb); } purgeMessages(key, cb) { const { keyMessages } = key; this.redisClient.del(keyMessages, (err) => cb(err)); } countMessages(key, cb) { const { keyMessages } = key; this.redisClient.llen(keyMessages, (err, reply) => { if (err) cb(err); else cb(null, reply !== null && reply !== void 0 ? reply : 0); }); } } exports.ListMessageStorage = ListMessageStorage; //# sourceMappingURL=list-message-storage.js.map