redis-smq
Version:
A simple high-performance Redis message queue for Node.js.
223 lines • 6.89 kB
JavaScript
import cronParser from 'cron-parser';
import { _getExchangeDirectTransferable } from '../exchange/exchange-direct/_/_get-exchange-direct-transferable.js';
import { _getExchangeFanOutTransferable } from '../exchange/exchange-fan-out/_/_get-exchange-fanout-transferable.js';
import { _getExchangeTopicTransferable } from '../exchange/exchange-topic/_/_get-exchange-topic-transferable.js';
import { EExchangeType, } from '../exchange/index.js';
import { MessageMessagePropertyError } from './errors/index.js';
export class ProducibleMessage {
static defaultConsumeOptions = {
ttl: 0,
retryThreshold: 3,
retryDelay: 60000,
consumeTimeout: 0,
};
createdAt;
ttl = 0;
retryThreshold = 3;
retryDelay = 60000;
consumeTimeout = 0;
body = null;
priority = null;
scheduledCron = null;
scheduledDelay = null;
scheduledRepeatPeriod = null;
scheduledRepeat = 0;
exchange = null;
constructor() {
this.createdAt = Date.now();
const { consumeTimeout, retryDelay, ttl, retryThreshold } = ProducibleMessage.defaultConsumeOptions;
this.setConsumeTimeout(consumeTimeout);
this.setRetryDelay(retryDelay);
this.setTTL(ttl);
this.setRetryThreshold(retryThreshold);
}
static setDefaultConsumeOptions(consumeOptions) {
const { ttl = null, retryThreshold = null, retryDelay = null, consumeTimeout = null, } = consumeOptions;
if (ttl !== null)
ProducibleMessage.defaultConsumeOptions.ttl =
ProducibleMessage.validateTTL(ttl);
if (retryDelay !== null)
ProducibleMessage.defaultConsumeOptions.retryDelay =
ProducibleMessage.validateRetryDelay(retryDelay);
if (retryThreshold !== null)
ProducibleMessage.defaultConsumeOptions.retryThreshold =
ProducibleMessage.validateRetryThreshold(retryThreshold);
if (consumeTimeout !== null)
ProducibleMessage.defaultConsumeOptions.consumeTimeout =
ProducibleMessage.validateConsumeTimeout(consumeTimeout);
}
static validateRetryDelay(delay) {
const value = Number(delay);
if (isNaN(value) || value < 0) {
throw new MessageMessagePropertyError();
}
return value;
}
static validateTTL(ttl) {
const value = Number(ttl);
if (isNaN(value) || value < 0) {
throw new MessageMessagePropertyError();
}
return value;
}
static validateConsumeTimeout(timeout) {
const value = Number(timeout);
if (isNaN(value) || value < 0) {
throw new MessageMessagePropertyError();
}
return value;
}
static validateRetryThreshold(threshold) {
const value = Number(threshold);
if (isNaN(value) || value < 0) {
throw new MessageMessagePropertyError();
}
return value;
}
getCreatedAt() {
return this.createdAt;
}
setScheduledRepeatPeriod(period) {
const value = Number(period);
if (isNaN(value) || value < 0) {
throw new MessageMessagePropertyError();
}
this.scheduledRepeatPeriod = value;
return this;
}
setScheduledDelay(delay) {
const value = Number(delay);
if (isNaN(value) || value < 0) {
throw new MessageMessagePropertyError();
}
this.scheduledDelay = value;
return this;
}
getScheduledDelay() {
return this.scheduledDelay;
}
setScheduledCRON(cron) {
cronParser.parseExpression(cron);
this.scheduledCron = cron;
return this;
}
setScheduledRepeat(repeat) {
const value = Number(repeat);
if (isNaN(value) || value < 0) {
throw new MessageMessagePropertyError();
}
this.scheduledRepeat = value;
return this;
}
resetScheduledParams() {
this.scheduledCron = null;
this.scheduledDelay = null;
this.scheduledRepeatPeriod = null;
this.scheduledRepeat = 0;
return this;
}
setTTL(ttl) {
this.ttl = ProducibleMessage.validateTTL(ttl);
return this;
}
setConsumeTimeout(timeout) {
this.consumeTimeout = ProducibleMessage.validateConsumeTimeout(timeout);
return this;
}
setRetryThreshold(threshold) {
this.retryThreshold = ProducibleMessage.validateRetryThreshold(threshold);
return this;
}
setRetryDelay(delay) {
this.retryDelay = ProducibleMessage.validateRetryDelay(delay);
return this;
}
setBody(body) {
this.body = body;
return this;
}
setPriority(priority) {
this.priority = priority;
return this;
}
hasPriority() {
return this.priority !== null;
}
disablePriority() {
this.priority = null;
return this;
}
setFanOut(fanOutName) {
const exchange = _getExchangeFanOutTransferable(fanOutName);
if (exchange instanceof Error)
throw exchange;
this.exchange = exchange;
return this;
}
setTopic(topicParams) {
const exchange = _getExchangeTopicTransferable(topicParams);
if (exchange instanceof Error)
throw exchange;
this.exchange = exchange;
return this;
}
setQueue(queueParams) {
const exchange = _getExchangeDirectTransferable(queueParams);
if (exchange instanceof Error)
throw exchange;
this.exchange = exchange;
return this;
}
getQueue() {
if (this.exchange && this.exchange.type === EExchangeType.DIRECT) {
return this.exchange.params;
}
return null;
}
getTopic() {
if (this.exchange && this.exchange.type === EExchangeType.TOPIC) {
return this.exchange.params;
}
return null;
}
getFanOut() {
if (this.exchange && this.exchange.type === EExchangeType.FANOUT) {
return this.exchange.params;
}
return null;
}
getExchange() {
if (this.exchange) {
return this.exchange;
}
return null;
}
getScheduledRepeatPeriod() {
return this.scheduledRepeatPeriod;
}
getScheduledCRON() {
return this.scheduledCron;
}
getScheduledRepeat() {
return this.scheduledRepeat;
}
getTTL() {
return this.ttl;
}
getRetryThreshold() {
return this.retryThreshold;
}
getRetryDelay() {
return this.retryDelay;
}
getConsumeTimeout() {
return this.consumeTimeout;
}
getPriority() {
return this.priority;
}
getBody() {
return this.body;
}
}
//# sourceMappingURL=producible-message.js.map