redis-smq 6.0.4 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/src/monitor-server/index.d.ts +1 -0
- package/dist/src/monitor-server/index.js +1 -1
- package/dist/src/monitor-server/workers/websocket-heartbeat-stream.worker.js +1 -1
- package/dist/src/monitor-server/workers/websocket-main-stream.worker.js +1 -1
- package/dist/src/monitor-server/workers/websocket-online-stream.worker.js +1 -1
- package/dist/src/monitor-server/workers/websocket-rate-stream.worker.js +1 -1
- package/dist/src/system/app/consumer/consumer-message-handler.d.ts +1 -2
- package/dist/src/system/app/consumer/consumer-message-handler.js +3 -4
- package/dist/src/system/app/consumer/consumer.js +9 -14
- package/dist/src/system/app/message/message.js +1 -1
- package/dist/src/system/app/message-manager/message-manager.js +1 -1
- package/dist/src/system/app/producer/producer.js +2 -2
- package/dist/src/system/app/queue-manager/queue-manager-frontend.js +1 -1
- package/dist/src/system/common/base.js +1 -1
- package/dist/src/system/common/broker/broker.d.ts +10 -0
- package/dist/src/system/common/broker/broker.js +38 -0
- package/dist/src/system/common/broker/retry/dead-letter-message.d.ts +5 -0
- package/dist/src/system/common/broker/retry/dead-letter-message.js +60 -0
- package/dist/src/system/common/broker/retry/delay-message.d.ts +6 -0
- package/dist/src/system/common/broker/retry/delay-message.js +26 -0
- package/dist/src/system/common/broker/retry/requeue-message.d.ts +5 -0
- package/dist/src/system/common/broker/retry/requeue-message.js +20 -0
- package/dist/src/system/common/broker/retry/retry.d.ts +5 -0
- package/dist/src/system/common/broker/retry/retry.js +80 -0
- package/dist/src/system/common/broker/schedule-message.d.ts +5 -0
- package/dist/src/system/common/broker/schedule-message.js +57 -0
- package/dist/src/system/common/configuration/configuration.d.ts +4 -0
- package/dist/src/system/common/{errors → configuration}/configuration.error.d.ts +1 -1
- package/dist/src/system/common/{errors → configuration}/configuration.error.js +1 -1
- package/dist/src/system/common/{configuration.js → configuration/configuration.js} +12 -21
- package/dist/src/system/common/configuration/default-configuration.d.ts +2 -0
- package/dist/src/system/common/configuration/default-configuration.js +35 -0
- package/dist/src/system/common/configuration/message-storage.d.ts +2 -0
- package/dist/src/system/common/configuration/message-storage.js +47 -0
- package/dist/src/system/common/logger.js +1 -1
- package/dist/src/system/common/redis-client/lua/lpoprpushextra.lua +20 -0
- package/dist/src/system/common/redis-client/lua-scripts.d.ts +2 -1
- package/dist/src/system/common/redis-client/lua-scripts.js +4 -0
- package/dist/src/system/common/redis-client/redis-client.d.ts +1 -0
- package/dist/src/system/common/redis-client/redis-client.js +17 -12
- package/dist/src/system/workers/delay.worker.js +3 -3
- package/dist/src/system/workers/heartbeat-monitor.worker.js +1 -1
- package/dist/src/system/workers/requeue.worker.js +1 -1
- package/dist/src/system/workers/schedule.worker.js +1 -1
- package/dist/src/system/workers/time-series.worker.js +1 -1
- package/dist/types/index.d.ts +57 -49
- package/package.json +1 -1
- package/dist/src/system/common/broker.d.ts +0 -9
- package/dist/src/system/common/broker.js +0 -151
- package/dist/src/system/common/configuration.d.ts +0 -4
package/CHANGELOG.md
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -4,5 +4,5 @@ export { Message } from './src/message';
|
|
|
4
4
|
export { MessageManager } from './src/message-manager';
|
|
5
5
|
export { QueueManager } from './src/queue-manager';
|
|
6
6
|
export { MonitorServer } from './src/monitor-server';
|
|
7
|
-
export { setConfiguration } from './src/system/common/configuration';
|
|
7
|
+
export { setConfiguration } from './src/system/common/configuration/configuration';
|
|
8
8
|
export { setLogger } from './src/system/common/logger';
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,7 @@ var queue_manager_1 = require("./src/queue-manager");
|
|
|
13
13
|
Object.defineProperty(exports, "QueueManager", { enumerable: true, get: function () { return queue_manager_1.QueueManager; } });
|
|
14
14
|
var monitor_server_1 = require("./src/monitor-server");
|
|
15
15
|
Object.defineProperty(exports, "MonitorServer", { enumerable: true, get: function () { return monitor_server_1.MonitorServer; } });
|
|
16
|
-
var configuration_1 = require("./src/system/common/configuration");
|
|
16
|
+
var configuration_1 = require("./src/system/common/configuration/configuration");
|
|
17
17
|
Object.defineProperty(exports, "setConfiguration", { enumerable: true, get: function () { return configuration_1.setConfiguration; } });
|
|
18
18
|
var logger_1 = require("./src/system/common/logger");
|
|
19
19
|
Object.defineProperty(exports, "setLogger", { enumerable: true, get: function () { return logger_1.setLogger; } });
|
|
@@ -54,6 +54,7 @@ declare const RedisClientPrototypeAsync: {
|
|
|
54
54
|
delAsync: (key: string) => Promise<number>;
|
|
55
55
|
llenAsync: (key: string) => Promise<number>;
|
|
56
56
|
lmoveAsync: (source: string, destination: string, from: "LEFT" | "RIGHT", to: "LEFT" | "RIGHT") => Promise<string>;
|
|
57
|
+
lpoprpushextraAsync: (source: string, destination: string, listSize: number, expire: number) => Promise<string>;
|
|
57
58
|
lpoprpushAsync: (source: string, destination: string) => Promise<string>;
|
|
58
59
|
runScriptAsync: (scriptName: import("../system/common/redis-client/lua-scripts").ELuaScriptName, keys: string[], args: (string | number)[]) => Promise<unknown>;
|
|
59
60
|
zremrangebyscoreAsync: (source: string, min: string | number, max: string | number) => Promise<number>;
|
|
@@ -29,7 +29,7 @@ const worker_runner_1 = require("../system/common/worker/worker-runner/worker-ru
|
|
|
29
29
|
const cors = require("@koa/cors");
|
|
30
30
|
const panic_error_1 = require("../system/common/errors/panic.error");
|
|
31
31
|
const api_controller_1 = require("./controllers/api/api-controller");
|
|
32
|
-
const configuration_1 = require("../system/common/configuration");
|
|
32
|
+
const configuration_1 = require("../system/common/configuration/configuration");
|
|
33
33
|
const logger_1 = require("../system/common/logger");
|
|
34
34
|
const redis_keys_1 = require("../system/common/redis-keys/redis-keys");
|
|
35
35
|
const worker_pool_1 = require("../system/common/worker/worker-runner/worker-pool");
|
|
@@ -4,7 +4,7 @@ exports.WebsocketHeartbeatStreamWorker = void 0;
|
|
|
4
4
|
const redis_client_1 = require("../../system/common/redis-client/redis-client");
|
|
5
5
|
const empty_callback_reply_error_1 = require("../../system/common/errors/empty-callback-reply.error");
|
|
6
6
|
const consumer_heartbeat_1 = require("../../system/app/consumer/consumer-heartbeat");
|
|
7
|
-
const configuration_1 = require("../../system/common/configuration");
|
|
7
|
+
const configuration_1 = require("../../system/common/configuration/configuration");
|
|
8
8
|
const worker_1 = require("../../system/common/worker/worker");
|
|
9
9
|
const async_1 = require("../../system/lib/async");
|
|
10
10
|
class WebsocketHeartbeatStreamWorker extends worker_1.Worker {
|
|
@@ -7,7 +7,7 @@ const message_manager_1 = require("../../system/app/message-manager/message-mana
|
|
|
7
7
|
const empty_callback_reply_error_1 = require("../../system/common/errors/empty-callback-reply.error");
|
|
8
8
|
const consumer_1 = require("../../system/app/consumer/consumer");
|
|
9
9
|
const queue_manager_1 = require("../../system/app/queue-manager/queue-manager");
|
|
10
|
-
const configuration_1 = require("../../system/common/configuration");
|
|
10
|
+
const configuration_1 = require("../../system/common/configuration/configuration");
|
|
11
11
|
const worker_1 = require("../../system/common/worker/worker");
|
|
12
12
|
const async_1 = require("../../system/lib/async");
|
|
13
13
|
class WebsocketMainStreamWorker extends worker_1.Worker {
|
|
@@ -5,7 +5,7 @@ const redis_client_1 = require("../../system/common/redis-client/redis-client");
|
|
|
5
5
|
const empty_callback_reply_error_1 = require("../../system/common/errors/empty-callback-reply.error");
|
|
6
6
|
const consumer_1 = require("../../system/app/consumer/consumer");
|
|
7
7
|
const queue_manager_1 = require("../../system/app/queue-manager/queue-manager");
|
|
8
|
-
const configuration_1 = require("../../system/common/configuration");
|
|
8
|
+
const configuration_1 = require("../../system/common/configuration/configuration");
|
|
9
9
|
const worker_1 = require("../../system/common/worker/worker");
|
|
10
10
|
const async_1 = require("../../system/lib/async");
|
|
11
11
|
class WebsocketOnlineStreamWorker extends worker_1.Worker {
|
|
@@ -15,7 +15,7 @@ const global_dead_lettered_time_series_1 = require("../../system/app/consumer/co
|
|
|
15
15
|
const consumer_acknowledged_time_series_1 = require("../../system/app/consumer/consumer-time-series/consumer-acknowledged-time-series");
|
|
16
16
|
const consumer_dead_lettered_time_series_1 = require("../../system/app/consumer/consumer-time-series/consumer-dead-lettered-time-series");
|
|
17
17
|
const consumer_queues_1 = require("../../system/app/consumer/consumer-queues");
|
|
18
|
-
const configuration_1 = require("../../system/common/configuration");
|
|
18
|
+
const configuration_1 = require("../../system/common/configuration/configuration");
|
|
19
19
|
const worker_1 = require("../../system/common/worker/worker");
|
|
20
20
|
const async_1 = require("../../system/lib/async");
|
|
21
21
|
class WebsocketRateStreamWorker extends worker_1.Worker {
|
|
@@ -16,14 +16,13 @@ export declare class ConsumerMessageHandler extends EventEmitter {
|
|
|
16
16
|
protected powerManager: PowerManager;
|
|
17
17
|
protected messageRate: ConsumerMessageRate | null;
|
|
18
18
|
protected usingPriorityQueuing: boolean;
|
|
19
|
-
protected storeMessages: boolean;
|
|
20
19
|
protected keyQueue: string;
|
|
21
20
|
protected keyQueuePriority: string;
|
|
22
21
|
protected keyPendingMessagesWithPriority: string;
|
|
23
22
|
protected keyQueueProcessing: string;
|
|
24
23
|
protected ticker: Ticker;
|
|
25
24
|
protected logger: ICompatibleLogger;
|
|
26
|
-
constructor(consumerId: string, queue: TQueueParams, handler: TConsumerMessageHandler, usePriorityQueuing: boolean,
|
|
25
|
+
constructor(consumerId: string, queue: TQueueParams, handler: TConsumerMessageHandler, usePriorityQueuing: boolean, redisClient: RedisClient, messageRate?: ConsumerMessageRate | null);
|
|
27
26
|
protected registerEventsHandlers(): void;
|
|
28
27
|
protected unacknowledgeMessage(msg: Message, cause: EMessageUnacknowledgedCause, err?: Error): void;
|
|
29
28
|
protected handleReceivedMessage(json: string): void;
|
|
@@ -11,13 +11,13 @@ const events_2 = require("events");
|
|
|
11
11
|
const power_manager_1 = require("../../common/power-manager/power-manager");
|
|
12
12
|
const empty_callback_reply_error_1 = require("../../common/errors/empty-callback-reply.error");
|
|
13
13
|
const consumer_queues_1 = require("./consumer-queues");
|
|
14
|
-
const broker_1 = require("../../common/broker");
|
|
14
|
+
const broker_1 = require("../../common/broker/broker");
|
|
15
15
|
const queue_manager_1 = require("../queue-manager/queue-manager");
|
|
16
16
|
const ticker_1 = require("../../common/ticker/ticker");
|
|
17
17
|
const logger_1 = require("../../common/logger");
|
|
18
18
|
const async_1 = require("../../lib/async");
|
|
19
19
|
class ConsumerMessageHandler extends events_2.EventEmitter {
|
|
20
|
-
constructor(consumerId, queue, handler, usePriorityQueuing,
|
|
20
|
+
constructor(consumerId, queue, handler, usePriorityQueuing, redisClient, messageRate = null) {
|
|
21
21
|
super();
|
|
22
22
|
this.messageRate = null;
|
|
23
23
|
this.run = (cb) => {
|
|
@@ -74,7 +74,6 @@ class ConsumerMessageHandler extends events_2.EventEmitter {
|
|
|
74
74
|
this.handler = handler;
|
|
75
75
|
this.redisClient = redisClient;
|
|
76
76
|
this.usingPriorityQueuing = usePriorityQueuing;
|
|
77
|
-
this.storeMessages = storeMessages;
|
|
78
77
|
this.redisKeys = redis_keys_1.redisKeys.getQueueConsumerKeys(this.queue, this.consumerId);
|
|
79
78
|
const { keyQueuePendingPriorityMessageIds, keyQueuePending, keyQueuePendingPriorityMessages, keyQueueProcessing, } = this.redisKeys;
|
|
80
79
|
this.keyQueue = keyQueuePending;
|
|
@@ -175,7 +174,7 @@ class ConsumerMessageHandler extends events_2.EventEmitter {
|
|
|
175
174
|
this.unacknowledgeMessage(msg, types_1.EMessageUnacknowledgedCause.UNACKNOWLEDGED, err);
|
|
176
175
|
else {
|
|
177
176
|
const { keyQueueProcessing } = this.redisKeys;
|
|
178
|
-
broker_1.broker.acknowledgeMessage(this.redisClient, msg, keyQueueProcessing,
|
|
177
|
+
broker_1.broker.acknowledgeMessage(this.redisClient, msg, keyQueueProcessing, (err) => {
|
|
179
178
|
if (err)
|
|
180
179
|
this.emit(events_1.events.ERROR, err);
|
|
181
180
|
else
|
|
@@ -19,7 +19,7 @@ const queue_manager_1 = require("../queue-manager/queue-manager");
|
|
|
19
19
|
const worker_pool_1 = require("../../common/worker/worker-runner/worker-pool");
|
|
20
20
|
const async_1 = require("../../lib/async");
|
|
21
21
|
const message_1 = require("../message/message");
|
|
22
|
-
const broker_1 = require("../../common/broker");
|
|
22
|
+
const broker_1 = require("../../common/broker/broker");
|
|
23
23
|
const time_series_1 = require("../../common/time-series/time-series");
|
|
24
24
|
const global_dead_lettered_time_series_1 = require("./consumer-time-series/global-dead-lettered-time-series");
|
|
25
25
|
const queue_dead_lettered_time_series_1 = require("./consumer-time-series/queue-dead-lettered-time-series");
|
|
@@ -96,7 +96,7 @@ class Consumer extends base_1.Base {
|
|
|
96
96
|
const messageRate = this.getConfig().monitor.enabled
|
|
97
97
|
? this.createMessageRateInstance(queue, sharedRedisClient)
|
|
98
98
|
: null;
|
|
99
|
-
const handler = new consumer_message_handler_1.ConsumerMessageHandler(this.id, queue, messageHandler, usePriorityQueuing,
|
|
99
|
+
const handler = new consumer_message_handler_1.ConsumerMessageHandler(this.id, queue, messageHandler, usePriorityQueuing, redisClient, messageRate);
|
|
100
100
|
this.registerMessageHandlerEvents(handler);
|
|
101
101
|
this.messageHandlerInstances.push(handler);
|
|
102
102
|
this.logger.info(`Created a new instance (ID: ${handler.getId()}) for MessageHandler (${JSON.stringify(handlerParams)}).`);
|
|
@@ -282,18 +282,13 @@ class Consumer extends base_1.Base {
|
|
|
282
282
|
if (err)
|
|
283
283
|
cb(err);
|
|
284
284
|
else if (msg) {
|
|
285
|
-
broker_1.broker.retry(multi, keyQueueProcessing, msg, types_1.EMessageUnacknowledgedCause.RECOVERY
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
cb();
|
|
293
|
-
}
|
|
294
|
-
else
|
|
295
|
-
cb();
|
|
296
|
-
});
|
|
285
|
+
const deadLettered = broker_1.broker.retry(multi, keyQueueProcessing, msg, types_1.EMessageUnacknowledgedCause.RECOVERY);
|
|
286
|
+
if (typeof deadLettered === 'string') {
|
|
287
|
+
const timestamp = time_series_1.TimeSeries.getCurrentTimestamp();
|
|
288
|
+
(0, global_dead_lettered_time_series_1.GlobalDeadLetteredTimeSeries)(redisClient).add(timestamp, 1, multi);
|
|
289
|
+
(0, queue_dead_lettered_time_series_1.QueueDeadLetteredTimeSeries)(redisClient, queue).add(timestamp, 1, multi);
|
|
290
|
+
}
|
|
291
|
+
cb();
|
|
297
292
|
}
|
|
298
293
|
else
|
|
299
294
|
cb();
|
|
@@ -4,7 +4,7 @@ exports.Message = void 0;
|
|
|
4
4
|
const cron_parser_1 = require("cron-parser");
|
|
5
5
|
const argument_error_1 = require("../../common/errors/argument.error");
|
|
6
6
|
const queue_manager_1 = require("../queue-manager/queue-manager");
|
|
7
|
-
const configuration_1 = require("../../common/configuration");
|
|
7
|
+
const configuration_1 = require("../../common/configuration/configuration");
|
|
8
8
|
const message_metadata_1 = require("./message-metadata");
|
|
9
9
|
const panic_error_1 = require("../../common/errors/panic.error");
|
|
10
10
|
class Message {
|
|
@@ -7,7 +7,7 @@ const queue_manager_1 = require("../queue-manager/queue-manager");
|
|
|
7
7
|
const redis_keys_1 = require("../../common/redis-keys/redis-keys");
|
|
8
8
|
const common_1 = require("./common");
|
|
9
9
|
const message_not_found_error_1 = require("./errors/message-not-found.error");
|
|
10
|
-
const configuration_1 = require("../../common/configuration");
|
|
10
|
+
const configuration_1 = require("../../common/configuration/configuration");
|
|
11
11
|
const logger_1 = require("../../common/logger");
|
|
12
12
|
class MessageManager {
|
|
13
13
|
constructor(redisClient) {
|
|
@@ -8,8 +8,8 @@ const base_1 = require("../../common/base");
|
|
|
8
8
|
const producer_message_rate_writer_1 = require("./producer-message-rate-writer");
|
|
9
9
|
const redis_keys_1 = require("../../common/redis-keys/redis-keys");
|
|
10
10
|
const lua_scripts_1 = require("../../common/redis-client/lua-scripts");
|
|
11
|
-
const broker_1 = require("../../common/broker");
|
|
12
|
-
const configuration_1 = require("../../common/configuration");
|
|
11
|
+
const broker_1 = require("../../common/broker/broker");
|
|
12
|
+
const configuration_1 = require("../../common/configuration/configuration");
|
|
13
13
|
const message_error_1 = require("../../common/errors/message.error");
|
|
14
14
|
class Producer extends base_1.Base {
|
|
15
15
|
constructor() {
|
|
@@ -4,7 +4,7 @@ exports.QueueManagerFrontend = void 0;
|
|
|
4
4
|
const redis_client_1 = require("../../common/redis-client/redis-client");
|
|
5
5
|
const empty_callback_reply_error_1 = require("../../common/errors/empty-callback-reply.error");
|
|
6
6
|
const queue_manager_1 = require("./queue-manager");
|
|
7
|
-
const configuration_1 = require("../../common/configuration");
|
|
7
|
+
const configuration_1 = require("../../common/configuration/configuration");
|
|
8
8
|
const logger_1 = require("../../common/logger");
|
|
9
9
|
class QueueManagerFrontend {
|
|
10
10
|
constructor(redisClient) {
|
|
@@ -8,7 +8,7 @@ const events_2 = require("./events");
|
|
|
8
8
|
const redis_client_1 = require("./redis-client/redis-client");
|
|
9
9
|
const empty_callback_reply_error_1 = require("./errors/empty-callback-reply.error");
|
|
10
10
|
const panic_error_1 = require("./errors/panic.error");
|
|
11
|
-
const configuration_1 = require("./configuration");
|
|
11
|
+
const configuration_1 = require("./configuration/configuration");
|
|
12
12
|
const logger_1 = require("./logger");
|
|
13
13
|
const async_1 = require("../lib/async");
|
|
14
14
|
class Base extends events_1.EventEmitter {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ICallback } from '../../../../types';
|
|
2
|
+
import { Message } from '../../app/message/message';
|
|
3
|
+
import { RedisClient } from '../redis-client/redis-client';
|
|
4
|
+
import { retry } from './retry/retry';
|
|
5
|
+
import { scheduleMessage } from './schedule-message';
|
|
6
|
+
export declare const broker: {
|
|
7
|
+
retry: typeof retry;
|
|
8
|
+
scheduleMessage: typeof scheduleMessage;
|
|
9
|
+
acknowledgeMessage(redisClient: RedisClient, message: Message, keyQueueProcessing: string, cb: ICallback<void>): void;
|
|
10
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.broker = void 0;
|
|
4
|
+
const redis_keys_1 = require("../redis-keys/redis-keys");
|
|
5
|
+
const configuration_1 = require("../configuration/configuration");
|
|
6
|
+
const retry_1 = require("./retry/retry");
|
|
7
|
+
const schedule_message_1 = require("./schedule-message");
|
|
8
|
+
exports.broker = {
|
|
9
|
+
retry: retry_1.retry,
|
|
10
|
+
scheduleMessage: schedule_message_1.scheduleMessage,
|
|
11
|
+
acknowledgeMessage(redisClient, message, keyQueueProcessing, cb) {
|
|
12
|
+
const queue = message.getRequiredQueue();
|
|
13
|
+
const { store, queueSize, expire } = (0, configuration_1.getConfiguration)().storeMessages.acknowledged;
|
|
14
|
+
if (store) {
|
|
15
|
+
const { keyQueueAcknowledged } = redis_keys_1.redisKeys.getQueueKeys(queue);
|
|
16
|
+
if (queueSize || expire) {
|
|
17
|
+
redisClient.lpoprpushextra(keyQueueProcessing, keyQueueAcknowledged, queueSize > 0 ? queueSize * -1 : queueSize, expire, (err) => {
|
|
18
|
+
if (err)
|
|
19
|
+
cb(err);
|
|
20
|
+
else
|
|
21
|
+
cb();
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
redisClient.lpoprpush(keyQueueProcessing, keyQueueAcknowledged, (err) => {
|
|
26
|
+
if (err)
|
|
27
|
+
cb(err);
|
|
28
|
+
else
|
|
29
|
+
cb();
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
redisClient.rpop(keyQueueProcessing, (err) => cb(err));
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=broker.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { EMessageDeadLetterCause, EMessageUnacknowledgedCause, ICallback, TRedisClientMulti } from '../../../../../types';
|
|
2
|
+
import { Message } from '../../../app/message/message';
|
|
3
|
+
import { RedisClient } from '../../redis-client/redis-client';
|
|
4
|
+
export declare function deadLetterMessage(mixed: TRedisClientMulti, message: Message, keyQueueProcessing: string, unacknowledgedCause: EMessageUnacknowledgedCause, deadLetterCause: EMessageDeadLetterCause): void;
|
|
5
|
+
export declare function deadLetterMessage(mixed: RedisClient, message: Message, keyQueueProcessing: string, unacknowledgedCause: EMessageUnacknowledgedCause, deadLetterCause: EMessageDeadLetterCause, cb: ICallback<void>): void;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deadLetterMessage = void 0;
|
|
4
|
+
const redis_keys_1 = require("../../redis-keys/redis-keys");
|
|
5
|
+
const configuration_1 = require("../../configuration/configuration");
|
|
6
|
+
const redis_client_1 = require("../../redis-client/redis-client");
|
|
7
|
+
const panic_error_1 = require("../../errors/panic.error");
|
|
8
|
+
function deadLetterMessageTransaction(mixed, message, keyQueueProcessing) {
|
|
9
|
+
const queue = message.getRequiredQueue();
|
|
10
|
+
const { keyQueueDL } = redis_keys_1.redisKeys.getQueueKeys(queue);
|
|
11
|
+
const { store, expire, queueSize } = (0, configuration_1.getConfiguration)().storeMessages.deadLettered;
|
|
12
|
+
if (store) {
|
|
13
|
+
mixed.lpop(keyQueueProcessing);
|
|
14
|
+
mixed.rpush(keyQueueDL, JSON.stringify(message));
|
|
15
|
+
if (expire) {
|
|
16
|
+
mixed.pexpire(keyQueueDL, expire);
|
|
17
|
+
}
|
|
18
|
+
if (queueSize) {
|
|
19
|
+
mixed.ltrim(keyQueueDL, queueSize * -1, -1);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
mixed.rpop(keyQueueProcessing);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function deadLetterMessage(mixed, message, keyQueueProcessing, unacknowledgedCause, deadLetterCause, cb) {
|
|
27
|
+
if (mixed instanceof redis_client_1.RedisClient) {
|
|
28
|
+
if (!cb)
|
|
29
|
+
throw new panic_error_1.PanicError(`Expected a callback function`);
|
|
30
|
+
const queue = message.getRequiredQueue();
|
|
31
|
+
const { keyQueueDL } = redis_keys_1.redisKeys.getQueueKeys(queue);
|
|
32
|
+
const { store, expire, queueSize } = (0, configuration_1.getConfiguration)().storeMessages.deadLettered;
|
|
33
|
+
if (store) {
|
|
34
|
+
if (expire || queueSize) {
|
|
35
|
+
mixed.lpoprpushextra(keyQueueProcessing, keyQueueDL, queueSize ? queueSize * -1 : queueSize, expire, (err) => {
|
|
36
|
+
if (err)
|
|
37
|
+
cb(err);
|
|
38
|
+
else
|
|
39
|
+
cb();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
mixed.lpoprpush(keyQueueProcessing, keyQueueDL, (err) => {
|
|
44
|
+
if (err)
|
|
45
|
+
cb(err);
|
|
46
|
+
else
|
|
47
|
+
cb();
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
mixed.rpop(keyQueueProcessing, (err) => cb(err));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
deadLetterMessageTransaction(mixed, message, keyQueueProcessing);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.deadLetterMessage = deadLetterMessage;
|
|
60
|
+
//# sourceMappingURL=dead-letter-message.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { RedisClient } from '../../redis-client/redis-client';
|
|
2
|
+
import { EMessageUnacknowledgedCause, ICallback, TRedisClientMulti } from '../../../../../types';
|
|
3
|
+
import { Message } from '../../../app/message/message';
|
|
4
|
+
export declare function delayMessageTransaction(mixed: TRedisClientMulti, message: Message, keyQueueProcessing: string): void;
|
|
5
|
+
export declare function delayMessage(mixed: TRedisClientMulti, message: Message, keyQueueProcessing: string, unacknowledgedCause: EMessageUnacknowledgedCause): void;
|
|
6
|
+
export declare function delayMessage(mixed: RedisClient, message: Message, keyQueueProcessing: string, unacknowledgedCause: EMessageUnacknowledgedCause, cb: ICallback<void>): void;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.delayMessage = exports.delayMessageTransaction = void 0;
|
|
4
|
+
const redis_client_1 = require("../../redis-client/redis-client");
|
|
5
|
+
const redis_keys_1 = require("../../redis-keys/redis-keys");
|
|
6
|
+
const panic_error_1 = require("../../errors/panic.error");
|
|
7
|
+
function delayMessageTransaction(mixed, message, keyQueueProcessing) {
|
|
8
|
+
const queue = message.getRequiredQueue();
|
|
9
|
+
const { keyDelayedMessages } = redis_keys_1.redisKeys.getQueueKeys(queue);
|
|
10
|
+
mixed.rpoplpush(keyQueueProcessing, keyDelayedMessages);
|
|
11
|
+
}
|
|
12
|
+
exports.delayMessageTransaction = delayMessageTransaction;
|
|
13
|
+
function delayMessage(mixed, message, keyQueueProcessing, unacknowledgedCause, cb) {
|
|
14
|
+
if (mixed instanceof redis_client_1.RedisClient) {
|
|
15
|
+
if (!cb)
|
|
16
|
+
throw new panic_error_1.PanicError(`Expected a callback function`);
|
|
17
|
+
const queue = message.getRequiredQueue();
|
|
18
|
+
const { keyDelayedMessages } = redis_keys_1.redisKeys.getQueueKeys(queue);
|
|
19
|
+
mixed.rpoplpush(keyQueueProcessing, keyDelayedMessages, (err) => cb(err));
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
delayMessageTransaction(mixed, message, keyQueueProcessing);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.delayMessage = delayMessage;
|
|
26
|
+
//# sourceMappingURL=delay-message.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { RedisClient } from '../../redis-client/redis-client';
|
|
2
|
+
import { EMessageUnacknowledgedCause, ICallback, TRedisClientMulti } from '../../../../../types';
|
|
3
|
+
import { Message } from '../../../app/message/message';
|
|
4
|
+
export declare function requeueMessage(mixed: TRedisClientMulti, message: Message, keyQueueProcessing: string, unacknowledgedCause: EMessageUnacknowledgedCause): void;
|
|
5
|
+
export declare function requeueMessage(mixed: RedisClient, message: Message, keyQueueProcessing: string, unacknowledgedCause: EMessageUnacknowledgedCause, cb: ICallback<void>): void;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requeueMessage = void 0;
|
|
4
|
+
const redis_client_1 = require("../../redis-client/redis-client");
|
|
5
|
+
const redis_keys_1 = require("../../redis-keys/redis-keys");
|
|
6
|
+
const panic_error_1 = require("../../errors/panic.error");
|
|
7
|
+
function requeueMessage(mixed, message, keyQueueProcessing, unacknowledgedCause, cb) {
|
|
8
|
+
const queue = message.getRequiredQueue();
|
|
9
|
+
const { keyRequeueMessages } = redis_keys_1.redisKeys.getQueueKeys(queue);
|
|
10
|
+
if (mixed instanceof redis_client_1.RedisClient) {
|
|
11
|
+
if (!cb)
|
|
12
|
+
throw new panic_error_1.PanicError(`Expected a callback function`);
|
|
13
|
+
mixed.rpoplpush(keyQueueProcessing, keyRequeueMessages, (err) => cb(err));
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
mixed.rpoplpush(keyQueueProcessing, keyRequeueMessages);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.requeueMessage = requeueMessage;
|
|
20
|
+
//# sourceMappingURL=requeue-message.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { EMessageDeadLetterCause, EMessageUnacknowledgedCause, ICallback, TRedisClientMulti } from '../../../../../types';
|
|
2
|
+
import { Message } from '../../../app/message/message';
|
|
3
|
+
import { RedisClient } from '../../redis-client/redis-client';
|
|
4
|
+
export declare function retry(mixed: TRedisClientMulti, processingQueue: string, message: Message, unacknowledgedCause: EMessageUnacknowledgedCause): EMessageDeadLetterCause | void;
|
|
5
|
+
export declare function retry(mixed: RedisClient, processingQueue: string, message: Message, unacknowledgedCause: EMessageUnacknowledgedCause, cb: ICallback<EMessageDeadLetterCause | void>): void;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.retry = void 0;
|
|
4
|
+
const types_1 = require("../../../../../types");
|
|
5
|
+
const dead_letter_message_1 = require("./dead-letter-message");
|
|
6
|
+
const requeue_message_1 = require("./requeue-message");
|
|
7
|
+
const redis_client_1 = require("../../redis-client/redis-client");
|
|
8
|
+
const panic_error_1 = require("../../errors/panic.error");
|
|
9
|
+
const delay_message_1 = require("./delay-message");
|
|
10
|
+
var EValidateAction;
|
|
11
|
+
(function (EValidateAction) {
|
|
12
|
+
EValidateAction[EValidateAction["DEAD_LETTER"] = 0] = "DEAD_LETTER";
|
|
13
|
+
EValidateAction[EValidateAction["REQUEUE"] = 1] = "REQUEUE";
|
|
14
|
+
EValidateAction[EValidateAction["DELAY"] = 2] = "DELAY";
|
|
15
|
+
})(EValidateAction || (EValidateAction = {}));
|
|
16
|
+
function getRetryAction(message, unacknowledgedCause) {
|
|
17
|
+
if (unacknowledgedCause === types_1.EMessageUnacknowledgedCause.TTL_EXPIRED ||
|
|
18
|
+
message.getSetExpired()) {
|
|
19
|
+
return {
|
|
20
|
+
action: EValidateAction.DEAD_LETTER,
|
|
21
|
+
deadLetterCause: types_1.EMessageDeadLetterCause.TTL_EXPIRED,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (message.isPeriodic()) {
|
|
25
|
+
return {
|
|
26
|
+
action: EValidateAction.DEAD_LETTER,
|
|
27
|
+
deadLetterCause: types_1.EMessageDeadLetterCause.PERIODIC_MESSAGE,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (message.hasRetryThresholdExceeded()) {
|
|
31
|
+
return {
|
|
32
|
+
action: EValidateAction.DEAD_LETTER,
|
|
33
|
+
deadLetterCause: types_1.EMessageDeadLetterCause.RETRY_THRESHOLD_EXCEEDED,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const delay = message.getRetryDelay();
|
|
37
|
+
if (delay) {
|
|
38
|
+
return {
|
|
39
|
+
action: EValidateAction.DELAY,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
action: EValidateAction.REQUEUE,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function retryTransaction(mixed, processingQueue, message, unacknowledgedCause) {
|
|
47
|
+
const r = getRetryAction(message, unacknowledgedCause);
|
|
48
|
+
if (r.action === EValidateAction.DEAD_LETTER) {
|
|
49
|
+
(0, dead_letter_message_1.deadLetterMessage)(mixed, message, processingQueue, unacknowledgedCause, r.deadLetterCause);
|
|
50
|
+
return r.deadLetterCause;
|
|
51
|
+
}
|
|
52
|
+
if (r.action === EValidateAction.REQUEUE) {
|
|
53
|
+
return (0, requeue_message_1.requeueMessage)(mixed, message, processingQueue, unacknowledgedCause);
|
|
54
|
+
}
|
|
55
|
+
return (0, delay_message_1.delayMessage)(mixed, message, processingQueue, unacknowledgedCause);
|
|
56
|
+
}
|
|
57
|
+
function retry(mixed, processingQueue, message, unacknowledgedCause, cb) {
|
|
58
|
+
if (mixed instanceof redis_client_1.RedisClient) {
|
|
59
|
+
if (!cb)
|
|
60
|
+
throw new panic_error_1.PanicError(`Expected a callback function`);
|
|
61
|
+
const r = getRetryAction(message, unacknowledgedCause);
|
|
62
|
+
if (r.action === EValidateAction.DEAD_LETTER) {
|
|
63
|
+
return (0, dead_letter_message_1.deadLetterMessage)(mixed, message, processingQueue, unacknowledgedCause, r.deadLetterCause, (err) => {
|
|
64
|
+
if (err)
|
|
65
|
+
cb(err);
|
|
66
|
+
else
|
|
67
|
+
cb(null, r.deadLetterCause);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
if (r.action === EValidateAction.DELAY) {
|
|
71
|
+
return (0, delay_message_1.delayMessage)(mixed, message, processingQueue, unacknowledgedCause, cb);
|
|
72
|
+
}
|
|
73
|
+
return (0, requeue_message_1.requeueMessage)(mixed, message, processingQueue, unacknowledgedCause, cb);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return retryTransaction(mixed, processingQueue, message, unacknowledgedCause);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.retry = retry;
|
|
80
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ICallback, TRedisClientMulti } from '../../../../types';
|
|
2
|
+
import { Message } from '../../app/message/message';
|
|
3
|
+
import { RedisClient } from '../redis-client/redis-client';
|
|
4
|
+
export declare function scheduleMessage(mixed: TRedisClientMulti, message: Message): boolean;
|
|
5
|
+
export declare function scheduleMessage(mixed: RedisClient, message: Message, cb: ICallback<boolean>): void;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scheduleMessage = void 0;
|
|
4
|
+
const redis_keys_1 = require("../redis-keys/redis-keys");
|
|
5
|
+
const redis_client_1 = require("../redis-client/redis-client");
|
|
6
|
+
const lua_scripts_1 = require("../redis-client/lua-scripts");
|
|
7
|
+
const panic_error_1 = require("../errors/panic.error");
|
|
8
|
+
function scheduleMessageTransaction(multi, message) {
|
|
9
|
+
const timestamp = message.getNextScheduledTimestamp();
|
|
10
|
+
if (timestamp > 0) {
|
|
11
|
+
const { keyScheduledMessageIds, keyScheduledMessages } = redis_keys_1.redisKeys.getMainKeys();
|
|
12
|
+
message.getRequiredMetadata().setScheduledAt(Date.now());
|
|
13
|
+
const messageId = message.getRequiredId();
|
|
14
|
+
multi.zadd(keyScheduledMessageIds, timestamp, messageId);
|
|
15
|
+
multi.hset(keyScheduledMessages, messageId, JSON.stringify(message));
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
function scheduleMessage(mixed, message, cb) {
|
|
21
|
+
if (mixed instanceof redis_client_1.RedisClient) {
|
|
22
|
+
if (!cb)
|
|
23
|
+
throw new panic_error_1.PanicError(`Expected a callback function`);
|
|
24
|
+
const timestamp = message.getNextScheduledTimestamp();
|
|
25
|
+
if (timestamp > 0) {
|
|
26
|
+
const queue = message.getRequiredQueue();
|
|
27
|
+
const { keyNamespaces, keyNsQueues, keyQueues, keyScheduledMessageIds, keyScheduledMessages, } = redis_keys_1.redisKeys.getQueueKeys(queue);
|
|
28
|
+
message.getRequiredMetadata().setScheduledAt(Date.now());
|
|
29
|
+
const messageId = message.getRequiredId();
|
|
30
|
+
mixed.runScript(lua_scripts_1.ELuaScriptName.SCHEDULE_MESSAGE, [
|
|
31
|
+
keyNamespaces,
|
|
32
|
+
keyNsQueues,
|
|
33
|
+
keyQueues,
|
|
34
|
+
keyScheduledMessageIds,
|
|
35
|
+
keyScheduledMessages,
|
|
36
|
+
], [
|
|
37
|
+
queue.ns,
|
|
38
|
+
JSON.stringify(queue),
|
|
39
|
+
messageId,
|
|
40
|
+
JSON.stringify(message),
|
|
41
|
+
`${timestamp}`,
|
|
42
|
+
], (err) => {
|
|
43
|
+
if (err)
|
|
44
|
+
cb(err);
|
|
45
|
+
else
|
|
46
|
+
cb(null, true);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
else
|
|
50
|
+
cb(null, false);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
return scheduleMessageTransaction(mixed, message);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.scheduleMessage = scheduleMessage;
|
|
57
|
+
//# sourceMappingURL=schedule-message.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ConfigurationError = void 0;
|
|
4
|
-
const redis_smq_error_1 = require("
|
|
4
|
+
const redis_smq_error_1 = require("../errors/redis-smq.error");
|
|
5
5
|
class ConfigurationError extends redis_smq_error_1.RedisSMQError {
|
|
6
6
|
}
|
|
7
7
|
exports.ConfigurationError = ConfigurationError;
|