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.
Files changed (53) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/src/monitor-server/index.d.ts +1 -0
  5. package/dist/src/monitor-server/index.js +1 -1
  6. package/dist/src/monitor-server/workers/websocket-heartbeat-stream.worker.js +1 -1
  7. package/dist/src/monitor-server/workers/websocket-main-stream.worker.js +1 -1
  8. package/dist/src/monitor-server/workers/websocket-online-stream.worker.js +1 -1
  9. package/dist/src/monitor-server/workers/websocket-rate-stream.worker.js +1 -1
  10. package/dist/src/system/app/consumer/consumer-message-handler.d.ts +1 -2
  11. package/dist/src/system/app/consumer/consumer-message-handler.js +3 -4
  12. package/dist/src/system/app/consumer/consumer.js +9 -14
  13. package/dist/src/system/app/message/message.js +1 -1
  14. package/dist/src/system/app/message-manager/message-manager.js +1 -1
  15. package/dist/src/system/app/producer/producer.js +2 -2
  16. package/dist/src/system/app/queue-manager/queue-manager-frontend.js +1 -1
  17. package/dist/src/system/common/base.js +1 -1
  18. package/dist/src/system/common/broker/broker.d.ts +10 -0
  19. package/dist/src/system/common/broker/broker.js +38 -0
  20. package/dist/src/system/common/broker/retry/dead-letter-message.d.ts +5 -0
  21. package/dist/src/system/common/broker/retry/dead-letter-message.js +60 -0
  22. package/dist/src/system/common/broker/retry/delay-message.d.ts +6 -0
  23. package/dist/src/system/common/broker/retry/delay-message.js +26 -0
  24. package/dist/src/system/common/broker/retry/requeue-message.d.ts +5 -0
  25. package/dist/src/system/common/broker/retry/requeue-message.js +20 -0
  26. package/dist/src/system/common/broker/retry/retry.d.ts +5 -0
  27. package/dist/src/system/common/broker/retry/retry.js +80 -0
  28. package/dist/src/system/common/broker/schedule-message.d.ts +5 -0
  29. package/dist/src/system/common/broker/schedule-message.js +57 -0
  30. package/dist/src/system/common/configuration/configuration.d.ts +4 -0
  31. package/dist/src/system/common/{errors → configuration}/configuration.error.d.ts +1 -1
  32. package/dist/src/system/common/{errors → configuration}/configuration.error.js +1 -1
  33. package/dist/src/system/common/{configuration.js → configuration/configuration.js} +12 -21
  34. package/dist/src/system/common/configuration/default-configuration.d.ts +2 -0
  35. package/dist/src/system/common/configuration/default-configuration.js +35 -0
  36. package/dist/src/system/common/configuration/message-storage.d.ts +2 -0
  37. package/dist/src/system/common/configuration/message-storage.js +47 -0
  38. package/dist/src/system/common/logger.js +1 -1
  39. package/dist/src/system/common/redis-client/lua/lpoprpushextra.lua +20 -0
  40. package/dist/src/system/common/redis-client/lua-scripts.d.ts +2 -1
  41. package/dist/src/system/common/redis-client/lua-scripts.js +4 -0
  42. package/dist/src/system/common/redis-client/redis-client.d.ts +1 -0
  43. package/dist/src/system/common/redis-client/redis-client.js +17 -12
  44. package/dist/src/system/workers/delay.worker.js +3 -3
  45. package/dist/src/system/workers/heartbeat-monitor.worker.js +1 -1
  46. package/dist/src/system/workers/requeue.worker.js +1 -1
  47. package/dist/src/system/workers/schedule.worker.js +1 -1
  48. package/dist/src/system/workers/time-series.worker.js +1 -1
  49. package/dist/types/index.d.ts +57 -49
  50. package/package.json +1 -1
  51. package/dist/src/system/common/broker.d.ts +0 -9
  52. package/dist/src/system/common/broker.js +0 -151
  53. package/dist/src/system/common/configuration.d.ts +0 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 6.1.0 (2022-02-14)
4
+
5
+ * Allow configuring which messages to store with extended parameters (7bd37a1)
6
+
3
7
  ## 6.0.4 (2022-02-13)
4
8
 
5
9
  * Fix missing type definition for koa-bodyparser (4b8a11e)
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, storeMessages: boolean, redisClient: RedisClient, messageRate?: ConsumerMessageRate | null);
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, storeMessages, redisClient, messageRate = null) {
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, this.storeMessages, (err) => {
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, this.getConfig().storeMessages, redisClient, messageRate);
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, (err, deadLetteredCause) => {
286
- if (err)
287
- cb(err);
288
- else if (deadLetteredCause) {
289
- const timestamp = time_series_1.TimeSeries.getCurrentTimestamp();
290
- (0, global_dead_lettered_time_series_1.GlobalDeadLetteredTimeSeries)(redisClient).add(timestamp, 1, multi);
291
- (0, queue_dead_lettered_time_series_1.QueueDeadLetteredTimeSeries)(redisClient, queue).add(timestamp, 1, multi);
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
@@ -0,0 +1,4 @@
1
+ import { IConfig, IRequiredConfig } from '../../../../types';
2
+ export declare function setConfiguration(config?: IConfig): IRequiredConfig;
3
+ export declare function setConfigurationIfNotExists(): boolean;
4
+ export declare function getConfiguration(): IRequiredConfig;
@@ -1,3 +1,3 @@
1
- import { RedisSMQError } from './redis-smq.error';
1
+ import { RedisSMQError } from '../errors/redis-smq.error';
2
2
  export declare class ConfigurationError extends RedisSMQError {
3
3
  }
@@ -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("./redis-smq.error");
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;