redis-smq
Version:
A simple high-performance Redis message queue for Node.js.
61 lines • 2.83 kB
JavaScript
import { CallbackEmptyReplyError, } from 'redis-smq-common';
import { ELuaScriptName } from '../../../common/redis-client/scripts/scripts.js';
import { redisKeys } from '../../../common/redis-keys/redis-keys.js';
import { EQueueProperty, EQueueType } from '../../queue/index.js';
import { EMessageProperty, EMessagePropertyStatus, MessageError, MessageInvalidParametersError, MessageMessageNotFoundError, MessageMessageNotRequeuableError, } from '../index.js';
import { _getMessage } from './_get-message.js';
export function _requeueMessage(redisClient, messageId, cb) {
_getMessage(redisClient, messageId, (err, message) => {
if (err)
cb(err);
else if (!message)
cb(new CallbackEmptyReplyError());
else if (![
EMessagePropertyStatus.ACKNOWLEDGED,
EMessagePropertyStatus.DEAD_LETTERED,
].includes(message.getStatus()))
cb(new MessageMessageNotRequeuableError());
else {
message.getMessageState().reset();
const { keyQueueProperties, keyQueuePending, keyQueuePriorityPending, keyQueueAcknowledged, keyQueueDL, } = redisKeys.getQueueKeys(message.getDestinationQueue(), message.getConsumerGroupId());
const messageId = message.getId();
const { keyMessage } = redisKeys.getMessageKeys(messageId);
const status = message.getStatus();
const sourceKey = status === EMessagePropertyStatus.DEAD_LETTERED
? keyQueueDL
: keyQueueAcknowledged;
redisClient.runScript(ELuaScriptName.REQUEUE_MESSAGE, [
sourceKey,
keyQueueProperties,
keyQueuePriorityPending,
keyQueuePending,
keyMessage,
], [
EQueueProperty.QUEUE_TYPE,
EQueueType.PRIORITY_QUEUE,
EQueueType.LIFO_QUEUE,
EQueueType.FIFO_QUEUE,
EMessageProperty.STATUS,
EMessagePropertyStatus.PENDING,
EMessageProperty.STATE,
messageId,
message.producibleMessage.getPriority() ?? '',
JSON.stringify(message.getMessageState()),
], (err, reply) => {
if (err)
cb(err);
else if (reply !== 'OK') {
if (reply === 'MESSAGE_NOT_FOUND')
cb(new MessageMessageNotFoundError());
else if (reply === 'INVALID_PARAMETERS')
cb(new MessageInvalidParametersError());
else
cb(new MessageError());
}
else
cb();
});
}
});
}
//# sourceMappingURL=_requeue-message.js.map