redis-smq
Version:
A simple high-performance Redis message queue for Node.js.
97 lines • 4.33 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.retryMessage = exports.ERetryStatus = void 0;
const types_1 = require("../../../../types");
const dead_letter_message_1 = require("./dead-letter-message");
const requeue_message_1 = require("./requeue-message");
const delay_message_1 = require("./delay-message");
const redis_smq_common_1 = require("redis-smq-common");
var EValidateAction;
(function (EValidateAction) {
EValidateAction[EValidateAction["DEAD_LETTER"] = 0] = "DEAD_LETTER";
EValidateAction[EValidateAction["REQUEUE"] = 1] = "REQUEUE";
EValidateAction[EValidateAction["DELAY"] = 2] = "DELAY";
})(EValidateAction || (EValidateAction = {}));
var ERetryStatus;
(function (ERetryStatus) {
ERetryStatus[ERetryStatus["MESSAGE_DELAYED"] = 0] = "MESSAGE_DELAYED";
ERetryStatus[ERetryStatus["MESSAGE_REQUEUED"] = 1] = "MESSAGE_REQUEUED";
ERetryStatus[ERetryStatus["MESSAGE_DEAD_LETTERED"] = 2] = "MESSAGE_DEAD_LETTERED";
})(ERetryStatus = exports.ERetryStatus || (exports.ERetryStatus = {}));
function getRetryAction(message, unacknowledgedCause) {
if (unacknowledgedCause === types_1.EMessageUnacknowledgedCause.TTL_EXPIRED ||
message.getSetExpired()) {
return {
action: EValidateAction.DEAD_LETTER,
deadLetterCause: types_1.EMessageDeadLetterCause.TTL_EXPIRED,
};
}
if (message.isPeriodic()) {
return {
action: EValidateAction.DEAD_LETTER,
deadLetterCause: types_1.EMessageDeadLetterCause.PERIODIC_MESSAGE,
};
}
if (message.hasRetryThresholdExceeded()) {
return {
action: EValidateAction.DEAD_LETTER,
deadLetterCause: types_1.EMessageDeadLetterCause.RETRY_THRESHOLD_EXCEEDED,
};
}
const delay = message.getRetryDelay();
if (delay) {
return {
action: EValidateAction.DELAY,
};
}
return {
action: EValidateAction.REQUEUE,
};
}
function retryTransaction(config, mixed, processingQueue, message, unacknowledgedCause) {
const r = getRetryAction(message, unacknowledgedCause);
if (r.action === EValidateAction.DEAD_LETTER) {
(0, dead_letter_message_1.deadLetterMessage)(config, mixed, message, processingQueue, unacknowledgedCause, r.deadLetterCause);
return { message, status: ERetryStatus.MESSAGE_DEAD_LETTERED };
}
if (r.action === EValidateAction.REQUEUE) {
(0, requeue_message_1.requeueMessage)(mixed, message, processingQueue, unacknowledgedCause);
return { message, status: ERetryStatus.MESSAGE_REQUEUED };
}
(0, delay_message_1.delayMessage)(mixed, message, processingQueue, unacknowledgedCause);
return { message, status: ERetryStatus.MESSAGE_DELAYED };
}
function retryMessage(config, mixed, processingQueue, message, unacknowledgedCause, cb) {
if (mixed instanceof redis_smq_common_1.RedisClient) {
if (!cb)
throw new redis_smq_common_1.errors.PanicError(`Expected a callback function`);
const r = getRetryAction(message, unacknowledgedCause);
if (r.action === EValidateAction.DEAD_LETTER) {
return (0, dead_letter_message_1.deadLetterMessage)(config, mixed, message, processingQueue, unacknowledgedCause, r.deadLetterCause, (err) => {
if (err)
cb(err);
else
cb(null, { message, status: ERetryStatus.MESSAGE_DEAD_LETTERED });
});
}
if (r.action === EValidateAction.DELAY) {
return (0, delay_message_1.delayMessage)(mixed, message, processingQueue, unacknowledgedCause, (err) => {
if (err)
cb(err);
else
cb(null, { message, status: ERetryStatus.MESSAGE_DELAYED });
});
}
return (0, requeue_message_1.requeueMessage)(mixed, message, processingQueue, unacknowledgedCause, (err) => {
if (err)
cb(err);
else
cb(null, { message, status: ERetryStatus.MESSAGE_REQUEUED });
});
}
else {
return retryTransaction(config, mixed, processingQueue, message, unacknowledgedCause);
}
}
exports.retryMessage = retryMessage;
//# sourceMappingURL=retry-message.js.map
;