UNPKG

redis-smq

Version:

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

154 lines 6.85 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.QueueMessagesManagerAbstract = void 0; const redis_smq_common_1 = require("redis-smq-common"); const _delete_message_js_1 = require("../../message/_/_delete-message.js"); const _parse_queue_extended_params_js_1 = require("../../queue/_/_parse-queue-extended-params.js"); const _validate_queue_extended_params_js_1 = require("../_/_validate-queue-extended-params.js"); class QueueMessagesManagerAbstract { constructor(redisClient, messagesStorage, message, redisKey) { this.requireGroupId = false; this.redisClient = redisClient; this.messageStorage = messagesStorage; this.message = message; this.redisKey = redisKey; } getTotalPages(pageSize, totalItems) { if (pageSize <= 0) { return 1; } const totalPages = Math.ceil(totalItems / pageSize); return totalPages > 0 ? totalPages : 1; } getPaginationParams(cursor, totalItems, pageSize) { const totalPages = this.getTotalPages(pageSize, totalItems); const currentPage = cursor < 1 || cursor > totalPages ? 1 : cursor; const offsetStart = (currentPage - 1) * pageSize; const offsetEnd = offsetStart + pageSize - 1; return { offsetStart, offsetEnd, currentPage, totalPages }; } getMessagesIds(queue, page, pageSize, cb) { redis_smq_common_1.async.waterfall([ (next) => this.messageStorage.count(queue, this.redisKey, next), (totalItems, next) => { const { currentPage, offsetStart, offsetEnd, totalPages } = this.getPaginationParams(page, totalItems, pageSize); const nextCursor = currentPage < totalPages ? currentPage + 1 : 0; if (totalItems === 0) { return next(null, { cursor: nextCursor, totalItems, items: [], }); } this.messageStorage.fetchItems(queue, this.redisKey, offsetStart, offsetEnd, (err, items) => { if (err) return next(err); next(null, { cursor: nextCursor, totalItems, items: items !== null && items !== void 0 ? items : [], }); }); }, ], cb); } purge(queue, cb) { const parsedParams = (0, _parse_queue_extended_params_js_1._parseQueueExtendedParams)(queue); if (parsedParams instanceof Error) return cb(parsedParams); this.redisClient.getSetInstance((err, client) => { if (err) return cb(err); if (!client) return cb(new redis_smq_common_1.CallbackEmptyReplyError()); (0, _validate_queue_extended_params_js_1._validateQueueExtendedParams)(client, parsedParams, this.requireGroupId, (err) => { if (err) return cb(err); this._purgeMessages(client, parsedParams, cb); }); }); } _purgeMessages(client, parsedParams, cb) { const purgeBatch = (cursor = '0') => { redis_smq_common_1.async.waterfall([ (next) => { this.getMessagesIds(parsedParams, Number(cursor), 1000, next); }, (page, next) => { const { items, cursor: nextCursor } = page; if (items.length === 0) { return next(null, String(nextCursor)); } (0, _delete_message_js_1._deleteMessage)(client, items, (err) => { if (err) return next(err); next(null, String(nextCursor)); }); }, ], (err, nextCursor) => { if (err) return cb(err); if (nextCursor !== '0') { purgeBatch(String(nextCursor)); } else { cb(); } }); }; purgeBatch('0'); } getMessages(queue, page, pageSize, cb) { const parsedParams = (0, _parse_queue_extended_params_js_1._parseQueueExtendedParams)(queue); if (parsedParams instanceof Error) return cb(parsedParams); this.redisClient.getSetInstance((err, client) => { if (err) return cb(err); if (!client) return cb(new redis_smq_common_1.CallbackEmptyReplyError()); (0, _validate_queue_extended_params_js_1._validateQueueExtendedParams)(client, parsedParams, this.requireGroupId, (err) => { if (err) return cb(err); this.getMessagesIds(parsedParams, page, pageSize, (err, pageResult) => { if (err) return cb(err); if (!pageResult) return cb(new redis_smq_common_1.CallbackEmptyReplyError()); if (pageResult.items.length === 0) { return cb(null, Object.assign(Object.assign({}, pageResult), { items: [] })); } this.message.getMessagesByIds(pageResult.items, (err, messages) => { if (err) return cb(err); cb(null, Object.assign(Object.assign({}, pageResult), { items: messages !== null && messages !== void 0 ? messages : [] })); }); }); }); }); } countMessages(queue, cb) { this.redisClient.getSetInstance((err, client) => { if (err) return cb(err); if (!client) return cb(new redis_smq_common_1.CallbackEmptyReplyError()); const parsedParams = (0, _parse_queue_extended_params_js_1._parseQueueExtendedParams)(queue); if (parsedParams instanceof Error) return cb(parsedParams); (0, _validate_queue_extended_params_js_1._validateQueueExtendedParams)(client, parsedParams, this.requireGroupId, (err) => { if (err) return cb(err); this.messageStorage.count(parsedParams, this.redisKey, cb); }); }); } shutdown(cb) { redis_smq_common_1.async.waterfall([ (next) => this.message.shutdown(next), (next) => this.redisClient.shutdown(next), ], cb); } } exports.QueueMessagesManagerAbstract = QueueMessagesManagerAbstract; //# sourceMappingURL=queue-messages-manager-abstract.js.map