redis-smq
Version:
A simple high-performance Redis message queue for Node.js.
190 lines (189 loc) • 6 kB
TypeScript
/// <reference types="node" />
/// <reference types="node" />
import { Message } from '../src/lib/message/message';
import { redisKeys } from '../src/common/redis-keys/redis-keys';
import { ICallback, TLoggerConfig, TRedisConfig } from 'redis-smq-common/dist/types';
import { EventEmitter } from 'events';
import { DirectExchange } from '../src/lib/exchange/direct-exchange';
import { TopicExchange } from '../src/lib/exchange/topic-exchange';
import { FanOutExchange } from '../src/lib/exchange/fan-out-exchange';
export declare type TEventListenerInitArgs = {
eventProvider: EventEmitter;
config: IRequiredConfig;
instanceId: string;
};
export interface IEventListener {
init(args: TEventListenerInitArgs, cb: ICallback<void>): void;
quit(cb: ICallback<void>): void;
}
export interface IMessagesConfig {
store?: boolean | IMessagesConfigStore;
}
export interface IMessagesConfigStoreOptions {
queueSize?: number;
expire?: number;
}
export interface IMessagesConfigStore {
acknowledged?: boolean | IMessagesConfigStoreOptions;
deadLettered?: boolean | IMessagesConfigStoreOptions;
}
export interface IEventListenersConfig {
consumerEventListeners?: (new () => IEventListener)[];
producerEventListeners?: (new () => IEventListener)[];
}
export interface IConfig {
redis?: TRedisConfig;
namespace?: string;
logger?: TLoggerConfig;
messages?: IMessagesConfig;
eventListeners?: IEventListenersConfig;
}
export interface IRequiredStoreMessagesParams extends Required<IMessagesConfigStoreOptions> {
store: boolean;
}
export interface IRequiredMessagesConfigStore {
acknowledged: IRequiredStoreMessagesParams;
deadLettered: IRequiredStoreMessagesParams;
}
export declare type TRequiredEventListenersConfig = Required<IEventListenersConfig>;
export interface IRequiredConfig extends Required<IConfig> {
messages: {
store: IRequiredMessagesConfigStore;
};
eventListeners: TRequiredEventListenersConfig;
}
export declare type TPaginatedResponse<T> = {
total: number;
items: T[];
};
export declare type TGetMessagesReply = TPaginatedResponse<{
sequenceId: number;
message: Message;
}>;
export declare type TConsumerRedisKeys = ReturnType<typeof redisKeys['getConsumerKeys']>;
export declare type TQueueConsumerRedisKeys = ReturnType<typeof redisKeys['getQueueConsumerKeys']>;
export interface IQueueMetrics {
acknowledged: number;
deadLettered: number;
pending: number;
}
export declare enum EMessageDeadLetterCause {
TTL_EXPIRED = "ttl_expired",
RETRY_THRESHOLD_EXCEEDED = "retry_threshold_exceeded",
PERIODIC_MESSAGE = "periodic_message"
}
export declare enum EMessageUnacknowledgedCause {
TIMEOUT = "timeout",
CONSUME_ERROR = "consumer_error",
UNACKNOWLEDGED = "unacknowledged",
OFFLINE_CONSUMER = "offline_consumer",
TTL_EXPIRED = "ttl_expired"
}
export declare type TTopicParams = {
topic: string;
ns: string;
};
export declare type TQueueParams = {
name: string;
ns: string;
};
export declare type TQueueRateLimit = {
limit: number;
interval: number;
};
export declare type TQueueSettings = {
priorityQueuing: boolean;
type: EQueueType;
rateLimit: TQueueRateLimit | null;
exchange: string | null;
};
export declare enum EQueueSettingType {
PRIORITY_QUEUING = "PRIORITY_QUEUING",
QUEUE_TYPE = "QUEUE_TYPE",
RATE_LIMIT = "RATE_LIMIT",
EXCHANGE = "EXCHANGE"
}
export declare enum EQueueType {
LIFO_QUEUE = 0,
FIFO_QUEUE = 1,
PRIORITY_QUEUE = 2
}
export declare type TConsumerInfo = {
ipAddress: string[];
hostname: string;
pid: number;
createdAt: number;
};
export declare type TConsumerHeartbeat = {
timestamp: number;
data: TConsumerHeartbeatPayload;
};
export declare type TConsumerHeartbeatPayload = {
ram: {
usage: NodeJS.MemoryUsage;
free: number;
total: number;
};
cpu: {
user: number;
system: number;
percentage: string;
};
};
export declare type TConsumerMessageHandler = (msg: Message, cb: ICallback<void>) => void;
export declare type TConsumerMessageHandlerParams = {
queue: TQueueParams;
messageHandler: TConsumerMessageHandler;
};
export declare type TMessageJSON = {
createdAt: number;
queue: TQueueParams | string | null;
exchange: IDirectExchangeParams | ITopicExchangeParams | IFanOutExchangeParams | null;
ttl: number;
retryThreshold: number;
retryDelay: number;
consumeTimeout: number;
body: unknown;
priority: number | null;
scheduledCron: string | null;
scheduledDelay: number | null;
scheduledRepeatPeriod: number | null;
scheduledRepeat: number;
messageState: TMessageState | null;
};
export declare enum EExchangeType {
DIRECT = 0,
FANOUT = 1,
TOPIC = 2
}
export declare type TExchange = DirectExchange | TopicExchange | FanOutExchange;
export interface IExchangeParams<TBindingParams, TBindingType extends EExchangeType> {
exchangeTag: string;
destinationQueue: TQueueParams | null;
bindingParams: TBindingParams;
type: TBindingType;
}
export declare type IDirectExchangeParams = IExchangeParams<TQueueParams | string, EExchangeType.DIRECT>;
export declare type IFanOutExchangeParams = IExchangeParams<string, EExchangeType.FANOUT>;
export declare type ITopicExchangeParams = IExchangeParams<TTopicParams | string, EExchangeType.TOPIC>;
export declare type TMessageState = {
uuid: string;
publishedAt: number | null;
scheduledAt: number | null;
scheduledCronFired: boolean;
attempts: number;
scheduledRepeatCount: number;
expired: boolean;
nextScheduledDelay: number;
nextRetryDelay: number;
};
export declare type TMessageConsumeOptions = {
ttl: number;
retryThreshold: number;
retryDelay: number;
consumeTimeout: number;
};
export declare type TProduceMessageReply = {
messages: Message[];
scheduled: boolean;
};