redis-smq 7.1.3 → 7.2.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 (40) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/LICENSE +1 -1
  3. package/README.md +10 -11
  4. package/dist/src/common/redis-client/lua/create-queue.lua +2 -2
  5. package/dist/src/common/redis-client/lua/enqueue-scheduled-message.lua +44 -13
  6. package/dist/src/common/redis-client/lua/publish-message.lua +11 -5
  7. package/dist/src/common/redis-client/lua/requeue-message.lua +9 -5
  8. package/dist/src/common/redis-client/lua/schedule-message.lua +4 -4
  9. package/dist/src/lib/consumer/consumer-message-handler/dequeue-message.d.ts +3 -2
  10. package/dist/src/lib/consumer/consumer-message-handler/dequeue-message.js +10 -7
  11. package/dist/src/lib/consumer/consumer-message-handler/multiplexed-message-handler/multiplexed-dequeue-message.js +1 -1
  12. package/dist/src/lib/exchange/fan-out-exchange-manager.js +1 -2
  13. package/dist/src/lib/message/message-state.js +5 -10
  14. package/dist/src/lib/message-manager/message-manager.d.ts +4 -4
  15. package/dist/src/lib/message-manager/message-manager.js +4 -4
  16. package/dist/src/lib/message-manager/message-storage/{list.d.ts → list-message-storage.d.ts} +1 -1
  17. package/dist/src/lib/message-manager/message-storage/{list.js → list-message-storage.js} +5 -5
  18. package/dist/src/lib/message-manager/message-storage/{sorted-set.d.ts → sorted-set-message-storage.d.ts} +1 -1
  19. package/dist/src/lib/message-manager/message-storage/{sorted-set.js → sorted-set-message-storage.js} +4 -4
  20. package/dist/src/lib/message-manager/{acknowledged-messages.d.ts → messages/acknowledged-messages.d.ts} +3 -3
  21. package/dist/src/lib/message-manager/{acknowledged-messages.js → messages/acknowledged-messages.js} +4 -4
  22. package/dist/src/lib/message-manager/{dead-lettered-messages.d.ts → messages/dead-lettered-messages.d.ts} +3 -3
  23. package/dist/src/lib/message-manager/{dead-lettered-messages.js → messages/dead-lettered-messages.js} +4 -4
  24. package/dist/src/lib/message-manager/{pending-messages.d.ts → messages/pending-messages.d.ts} +3 -3
  25. package/dist/src/lib/message-manager/{pending-messages.js → messages/pending-messages.js} +12 -11
  26. package/dist/src/lib/message-manager/{pending-lifo-messages.d.ts → messages/pending-non-priority-messages.d.ts} +3 -3
  27. package/dist/src/lib/message-manager/{pending-lifo-messages.js → messages/pending-non-priority-messages.js} +8 -8
  28. package/dist/src/lib/message-manager/{pending-priority-messages.d.ts → messages/pending-priority-messages.d.ts} +3 -3
  29. package/dist/src/lib/message-manager/{pending-priority-messages.js → messages/pending-priority-messages.js} +4 -4
  30. package/dist/src/lib/message-manager/{scheduled-messages.d.ts → messages/scheduled-messages.d.ts} +3 -3
  31. package/dist/src/lib/message-manager/{scheduled-messages.js → messages/scheduled-messages.js} +3 -3
  32. package/dist/src/lib/producer/producer.js +1 -1
  33. package/dist/src/lib/producer/schedule-message.js +1 -1
  34. package/dist/src/lib/queue-manager/queue-metrics.js +4 -3
  35. package/dist/src/lib/queue-manager/queue.d.ts +6 -1
  36. package/dist/src/lib/queue-manager/queue.js +36 -18
  37. package/dist/src/workers/schedule.worker.js +1 -1
  38. package/dist/types/index.d.ts +7 -0
  39. package/dist/types/index.js +8 -1
  40. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 7.2.0 (2023-01-06)
4
+
5
+ * build: fix NPM vulnerability warnings (e2ca247)
6
+ * build: bump up redis-smq-common to v1.0.5 (cc08fe7)
7
+ * docs(readme): update documentation (3713643)
8
+ * refactor(message-state): improve getSetExpired() logic (bb6f262)
9
+ * test(queue): test settings parsing compatibility with v7.1 (0656217)
10
+ * refactor(queue): move out settings parsing logic from getSettings() (cf4ba86)
11
+ * fix(queue): Keep compatibility with v7.1 queue settings schema (d49735e)
12
+ * docs(queue-manager): update queue.getSettings() reference (09214a4)
13
+ * chore: update license (6016483)
14
+ * docs(queues): improve documentation (494a0ce)
15
+ * docs(queue-manager): update docs (77d2e64)
16
+ * fix(examples): use save() method to create queues (9026923)
17
+ * test(queue-manager): test FIFO queues (b97dc4d)
18
+ * refactor(queue-manager): clean up (7f2d693)
19
+ * refactor(message-manager): refactor and clean up (4f55431)
20
+ * feat(queue-manager): allow to create and use FIFO queues (853a29b)
21
+ * docs(message-manager): update scheduled messages API reference (7fa3d23)
22
+
3
23
  ## 7.1.3 (2022-10-26)
4
24
 
5
25
  * test(FanOutExchangeManager): test binding queues of different types (d2e287c)
package/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2017-2022 Weyoss <weyoss@protonmail.com>
1
+ Copyright (c) 2017-2023 Weyoss <weyoss@protonmail.com>
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
package/README.md CHANGED
@@ -21,11 +21,11 @@ RedisSMQ is a Node.js library for queuing messages (aka jobs) and processing the
21
21
  * **[Multi-Queue Producers](#producer) & [Multi-Queue Consumers](#consumer)**: Offering flexible Producer/Consumer models, with focus on simplicity and without tons of features. This can make RedisSMQ an ideal message broker for your microservices.
22
22
  * **[at-least-once/at-most-once Delivery](/docs/api/message.md#messageprototypesetretrythreshold)**: In case of failures, while delivering or processing a message, RedisSMQ can guaranty that the message will be not lost and redelivered again. When configured to do so, RedisSMQ can also ensure that the message is delivered at-most-once.
23
23
  * **[Different Exchange Types](/docs/message-exchanges.md)**: RedisSMQ offers 3 types of exchanges: [Direct Exchange](/docs/message-exchanges.md#direct-exchange), [Topic Exchange](/docs/message-exchanges.md#topic-exchange), and [Fanout Exchange](/docs/message-exchanges.md#fanout-exchange) for publishing a message to one or multiple queues.
24
- * **[Message Expiration](/docs/api/message.md#messageprototypesetttl)**: A message will not be delivered if it has been in a queue for longer than a given amount of time, called TTL (time-to-live).
25
- * **[Message Consumption Timeout](/docs/api/message.md#messageprototypesetconsumetimeout)**: Timeout for consuming messages.
26
- * **[Queue Rate Limiting](/docs/queue-rate-limiting.md)**: Allowing you to control the rate at which the messages are consumed from a given queue.
24
+ * **[FIFO queues, LIFO queues, and Reliable Priority Queues](/docs/queues.md)**: Provides different queuing strategies that you may use depending on your needs and requirements.
25
+ * **[Message Expiration](/docs/api/message.md#messageprototypesetttl)**: Allowing a message to expire if it has not been delivered within a given amount of time.
26
+ * **[Message Consumption Timeout](/docs/api/message.md#messageprototypesetconsumetimeout)**: Allowing to set up a timeout for consuming messages.
27
+ * **[Queue Rate Limiting](/docs/queue-rate-limiting.md)**: Allowing to control the rate at which the messages are consumed from a given queue.
27
28
  * **[Scheduling Messages](/docs/scheduling-messages.md)**: Messages can be configured to be delayed, delivered for N times with an optional period between deliveries, and to be scheduled using CRON expressions.
28
- * **[Reliable Priority Queues](/docs/queues.md)**: Supports priority messaging.
29
29
  * **[Multiplexing](/docs/multiplexing.md)**: A feature which allows message handlers to use a single redis connection to dequeue and consume messages.
30
30
  * **[HTTP API](https://github.com/weyoss/redis-smq-monitor)**: an HTTP interface is provided to interact with the MQ.
31
31
  * **[Web UI](https://github.com/weyoss/redis-smq-monitor-client)**: RedisSMQ can be managed also from your web browser.
@@ -69,11 +69,11 @@ RedisSMQ is a Node.js library for queuing messages (aka jobs) and processing the
69
69
 
70
70
  ## What's new?
71
71
 
72
- **2022.10.06**
72
+ **2023.01.06**
73
73
 
74
- :rocket: RedisSMQ v7.1 is out! This new release extends the message queue features by introducing [Message Exchanges](/docs/message-exchanges.md).
75
- Also, the [Web UI](https://github.com/weyoss/redis-smq-monitor-client) has been reworked for better user experience and
76
- to fully support message exchanges and other various routine operations.
74
+ :rocket: RedisSMQ v7.2 is released! Before this release RedisSMQ supported both LIFO queues and Priority queues.
75
+ With this new release, RedisSMQ now provides FIFO queues as a third option that completes the list of supported queue types.
76
+ For more details see [Queues](/docs/queues.md).
77
77
 
78
78
  ## Installation
79
79
 
@@ -100,16 +100,15 @@ Producers and consumers exchange data using one or multiple queues that may be c
100
100
 
101
101
  A queue is responsible for holding messages which are produced by producers and are delivered to consumers.
102
102
 
103
- RedisSMQ supports 2 types of queues: [LIFO Queues and Priority Queues](/docs/queues.md).
104
-
105
103
  ```javascript
106
104
  const { QueueManager } = require('redis-smq');
105
+ const { EQueueType } = require('redis-smq/dist/types');
107
106
  const config = require('./config')
108
107
 
109
108
  QueueManager.createInstance(config, (err, queueManager) => {
110
109
  if (err) console.log(err);
111
110
  // Creating a LIFO queue
112
- else queueManager.queue.create('test_queue', false, (err) => console.log(err));
111
+ else queueManager.queue.save('test_queue', EQueueType.LIFO_QUEUE, (err) => console.log(err));
113
112
  })
114
113
  ```
115
114
 
@@ -2,10 +2,10 @@
2
2
  --- KEYS[2] keyNsQueues (set)
3
3
  --- KEYS[3] keyQueues (set)
4
4
  --- KEYS[4] keyQueueSettings (hash)
5
- --- KEYS[5] keyQueueSettingsPriorityQueuing
5
+ --- KEYS[5] keyQueueSettingsQueueType
6
6
  --- ARGV[1] namespace
7
7
  --- ARGV[2] queue
8
- --- ARGV[3] priorityQueuing
8
+ --- ARGV[3] queueType
9
9
  if redis.call("SISMEMBER", KEYS[3], ARGV[2]) == 0 then
10
10
  redis.call("SADD", KEYS[3], ARGV[2])
11
11
  redis.call("SADD", KEYS[2], ARGV[2])
@@ -1,5 +1,5 @@
1
1
  --- KEYS[1] keyQueuesSettings (hash)
2
- --- KEYS[2] keyQueuesSettingsPriorityQueuing
2
+ --- KEYS[2] keyQueuesSettingsQueueType
3
3
  --- KEYS[3] keyQueuePendingWithPriority (hash)
4
4
  --- KEYS[4] keyQueuePriority (sorted set)
5
5
  --- KEYS[5] keyQueuePending (list)
@@ -9,24 +9,55 @@
9
9
  --- ARGV[2] message
10
10
  --- ARGV[3] messagePriority
11
11
  --- ARGV[4] nextScheduleTimestamp
12
- local priorityQueuing = redis.call("HGET", KEYS[1], KEYS[2])
13
- if (priorityQueuing == 'true' and not(ARGV[3] == nil or ARGV[3] == '')) or (priorityQueuing == 'false' and (ARGV[3] == nil or ARGV[3] == '')) then
14
- if priorityQueuing == 'true' and not(ARGV[3] == nil or ARGV[3] == '') then
12
+
13
+ local function deleteMessage()
14
+ redis.call("ZREM", KEYS[6], ARGV[1])
15
+ redis.call("HDEL", KEYS[7], ARGV[1])
16
+ end
17
+
18
+ local function publishMessage(queueType)
19
+ if queueType == "0" or queueType == "1" then
20
+ if not(ARGV[3] == nil or ARGV[3] == '') then
21
+ return "PRIORITY_QUEUING_NOT_ENABLED"
22
+ end
23
+ if queueType == "0" then
24
+ redis.call("RPUSH", KEYS[5], ARGV[2])
25
+ else
26
+ redis.call("LPUSH", KEYS[5], ARGV[2])
27
+ end
28
+ return "OK"
29
+ end
30
+ if queueType == "2" then
31
+ if ARGV[3] == nil or ARGV[3] == "" then
32
+ return "MESSAGE_PRIORITY_REQUIRED"
33
+ end
15
34
  redis.call("HSET", KEYS[3], ARGV[1], ARGV[2])
16
35
  redis.call("ZADD", KEYS[4], ARGV[3], ARGV[1])
17
- else
18
- redis.call("RPUSH", KEYS[5], ARGV[2])
36
+ return "OK"
19
37
  end
20
- if ARGV[4] == '0' then
21
- redis.call("ZREM", KEYS[6], ARGV[1])
22
- redis.call("HDEL", KEYS[7], ARGV[1])
38
+ return "UNKNOWN_QUEUE_TYPE"
39
+ end
40
+
41
+ local function scheduleMessage()
42
+ if ARGV[4] == "0" then
43
+ deleteMessage()
23
44
  else
24
45
  redis.call("ZADD", KEYS[6], ARGV[4], ARGV[1])
25
46
  redis.call("HSET", KEYS[7], ARGV[1], ARGV[2])
26
47
  end
27
- return 1
48
+ end
49
+
50
+ local queueType = redis.call("HGET", KEYS[1], KEYS[2])
51
+ if queueType == false then
52
+ deleteMessage()
53
+ return "QUEUE_NOT_FOUND"
54
+ end
55
+
56
+ local result = publishMessage(queueType)
57
+ if result == "OK" then
58
+ scheduleMessage()
28
59
  else
29
- redis.call("ZREM", KEYS[6], ARGV[1])
30
- redis.call("HDEL", KEYS[7], ARGV[1])
31
- return 0
60
+ deleteMessage()
32
61
  end
62
+
63
+ return result
@@ -1,16 +1,16 @@
1
1
  --- KEYS[1] keyQueueSettings
2
- --- KEYS[2] keyQueueSettingsPriorityQueuing
2
+ --- KEYS[2] keyQueueSettingsQueueType
3
3
  --- KEYS[3] keyQueuePendingPriorityMessages (hash)
4
4
  --- KEYS[4] keyQueuePendingPriorityMessageIds (sorted set)
5
5
  --- KEYS[5] keyQueuePending (list)
6
6
  --- ARGV[1] message id
7
7
  --- ARGV[2] message
8
8
  --- ARGV[3] messagePriority
9
- local priorityQueuing = redis.call("HGET", KEYS[1], KEYS[2])
10
- if priorityQueuing == false then
9
+ local queueType = redis.call("HGET", KEYS[1], KEYS[2])
10
+ if queueType == false then
11
11
  return 'QUEUE_NOT_FOUND'
12
12
  end
13
- if priorityQueuing == 'true' then
13
+ if queueType == '2' then
14
14
  if ARGV[3] == nil or ARGV[3] == '' then
15
15
  return 'MESSAGE_PRIORITY_REQUIRED'
16
16
  end
@@ -21,6 +21,12 @@ end
21
21
  if not(ARGV[3] == nil or ARGV[3] == '') then
22
22
  return 'PRIORITY_QUEUING_NOT_ENABLED'
23
23
  end
24
- redis.call("RPUSH", KEYS[5], ARGV[2])
24
+ if queueType == '0' then
25
+ redis.call("RPUSH", KEYS[5], ARGV[2])
26
+ elseif queueType == '1' then
27
+ redis.call("LPUSH", KEYS[5], ARGV[2])
28
+ else
29
+ return 'UNKNOWN_QUEUE_TYPE'
30
+ end
25
31
  return 'OK'
26
32
 
@@ -1,5 +1,5 @@
1
1
  --- KEYS[1] keyQueueSettings (hash)
2
- --- KEYS[2] keyQueueSettingsPriorityQueuing
2
+ --- KEYS[2] keyQueueSettingsQueueType
3
3
  --- KEYS[3] keyQueuePendingWithPriority (hash)
4
4
  --- KEYS[4] keyQueuePriority (sorted set)
5
5
  --- KEYS[5] keyQueuePending (list)
@@ -10,13 +10,17 @@
10
10
  --- ARGV[4] fromMessage
11
11
  local result = redis.call("LREM", KEYS[6], 1, ARGV[4])
12
12
  if result then
13
- local priorityQueuing = redis.call("HGET", KEYS[1], KEYS[2])
14
- if priorityQueuing == 'true' and not(ARGV[3] == nil or ARGV[3] == '') then
13
+ local queueType = redis.call("HGET", KEYS[1], KEYS[2])
14
+ if queueType == '2' and not(ARGV[3] == nil or ARGV[3] == '') then
15
15
  redis.call("HSET", KEYS[3], ARGV[1], ARGV[2])
16
16
  redis.call("ZADD", KEYS[4], ARGV[3], ARGV[1])
17
17
  return 1
18
- elseif priorityQueuing == 'false' and (ARGV[3] == nil or ARGV[3] == '') then
19
- redis.call("RPUSH", KEYS[5], ARGV[2])
18
+ elseif (queueType == '0' or queueType == '1') and (ARGV[3] == nil or ARGV[3] == '') then
19
+ if queueType == '0' then
20
+ redis.call("RPUSH", KEYS[5], ARGV[2])
21
+ else
22
+ redis.call("LPUSH", KEYS[5], ARGV[2])
23
+ end
20
24
  return 1
21
25
  end
22
26
  end
@@ -1,16 +1,16 @@
1
1
  --- KEYS[1] keyQueueSettings
2
- --- KEYS[2] keyQueueSettingsPriorityQueuing
2
+ --- KEYS[2] keyQueueSettingsQueueType
3
3
  --- KEYS[3] keyScheduledMessages (sorted set)
4
4
  --- KEYS[4] keyScheduledMessagesIndex (hash)
5
5
  --- ARGV[1] message id
6
6
  --- ARGV[2] message
7
7
  --- ARGV[3] scheduleTimestamp
8
8
  --- ARGV[4] message priority
9
- local priorityQueuing = redis.call("HGET", KEYS[1], KEYS[2])
10
- if (priorityQueuing == false) then
9
+ local queueType = redis.call("HGET", KEYS[1], KEYS[2])
10
+ if (queueType == false) then
11
11
  return 'QUEUE_NOT_FOUND'
12
12
  end
13
- if priorityQueuing == 'true' then
13
+ if queueType == '2' then
14
14
  if ARGV[4] == nil or ARGV[4] == '' then
15
15
  return 'MESSAGE_PRIORITY_REQUIRED'
16
16
  end
@@ -1,4 +1,4 @@
1
- import { TQueueParams, TQueueRateLimit } from '../../../../types';
1
+ import { EQueueType, TQueueParams, TQueueRateLimit } from '../../../../types';
2
2
  import { redisKeys } from '../../../common/redis-keys/redis-keys';
3
3
  import { RedisClient, Ticker } from 'redis-smq-common';
4
4
  import { MessageHandler } from './message-handler';
@@ -11,12 +11,13 @@ export declare class DequeueMessage {
11
11
  protected queueRateLimit: TQueueRateLimit | null;
12
12
  protected ticker: Ticker;
13
13
  protected messageHandler: MessageHandler;
14
- protected priorityQueuing: boolean;
14
+ protected queueType: EQueueType | null;
15
15
  constructor(messageHandler: MessageHandler, redisClient: RedisClient);
16
16
  protected dequeueMessageWithPriority(cb: ICallback<string | null>): void;
17
17
  protected waitForMessage(cb: ICallback<string | null>): void;
18
18
  protected dequeueMessage(cb: ICallback<string | null>): void;
19
19
  dequeue(): void;
20
+ protected isPriorityQueuingEnabled(): boolean;
20
21
  run(cb: ICallback<void>): void;
21
22
  quit(cb: ICallback<void>): void;
22
23
  }
@@ -2,12 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DequeueMessage = void 0;
4
4
  const os = require("os");
5
+ const types_1 = require("../../../../types");
5
6
  const redis_keys_1 = require("../../../common/redis-keys/redis-keys");
6
7
  const redis_smq_common_1 = require("redis-smq-common");
7
8
  const events_1 = require("../../../common/events/events");
8
9
  const message_1 = require("../../message/message");
9
10
  const queue_rate_limit_1 = require("../../queue-manager/queue-rate-limit");
10
- const redis_smq_common_2 = require("redis-smq-common");
11
11
  const queue_1 = require("../../queue-manager/queue");
12
12
  const redis_client_1 = require("../../../common/redis-client/redis-client");
13
13
  const queue_not_found_error_1 = require("../../queue-manager/errors/queue-not-found.error");
@@ -28,7 +28,7 @@ const IPAddresses = (() => {
28
28
  class DequeueMessage {
29
29
  constructor(messageHandler, redisClient) {
30
30
  this.queueRateLimit = null;
31
- this.priorityQueuing = false;
31
+ this.queueType = null;
32
32
  this.messageHandler = messageHandler;
33
33
  this.redisClient = redisClient;
34
34
  this.queue = messageHandler.getQueue();
@@ -60,12 +60,12 @@ class DequeueMessage {
60
60
  }
61
61
  };
62
62
  const deq = () => {
63
- if (this.priorityQueuing)
63
+ if (this.isPriorityQueuingEnabled())
64
64
  this.dequeueMessageWithPriority(cb);
65
65
  else
66
66
  this.dequeueMessage(cb);
67
67
  };
68
- if (this.priorityQueuing || this.queueRateLimit) {
68
+ if (this.isPriorityQueuingEnabled() || this.queueRateLimit) {
69
69
  if (this.queueRateLimit) {
70
70
  queue_rate_limit_1.QueueRateLimit.hasExceeded(this.redisClient, this.queue, this.queueRateLimit, (err, isExceeded) => {
71
71
  if (err)
@@ -83,8 +83,11 @@ class DequeueMessage {
83
83
  this.waitForMessage(cb);
84
84
  }
85
85
  }
86
+ isPriorityQueuingEnabled() {
87
+ return this.queueType === types_1.EQueueType.PRIORITY_QUEUE;
88
+ }
86
89
  run(cb) {
87
- redis_smq_common_2.async.waterfall([
90
+ redis_smq_common_1.async.waterfall([
88
91
  (cb) => {
89
92
  const { keyQueues, keyQueueConsumers, keyConsumerQueues, keyQueueProcessing, keyProcessingQueues, keyQueueProcessingQueues, } = this.redisKeys;
90
93
  const consumerInfo = {
@@ -119,9 +122,9 @@ class DequeueMessage {
119
122
  if (err)
120
123
  cb(err);
121
124
  else if (!reply)
122
- cb(new redis_smq_common_2.errors.EmptyCallbackReplyError());
125
+ cb(new redis_smq_common_1.errors.EmptyCallbackReplyError());
123
126
  else {
124
- this.priorityQueuing = reply.priorityQueuing;
127
+ this.queueType = reply.type;
125
128
  this.queueRateLimit = (_a = reply.rateLimit) !== null && _a !== void 0 ? _a : null;
126
129
  cb();
127
130
  }
@@ -21,7 +21,7 @@ class MultiplexedDequeueMessage extends dequeue_message_1.DequeueMessage {
21
21
  }
22
22
  };
23
23
  const deq = () => {
24
- if (this.priorityQueuing)
24
+ if (this.isPriorityQueuingEnabled())
25
25
  this.dequeueMessageWithPriority(cb);
26
26
  else
27
27
  this.dequeueMessage(cb);
@@ -57,8 +57,7 @@ class FanOutExchangeManager {
57
57
  queue_1.Queue.getSettings(this.config, this.redisClient, eQueue, (err, exchangeQueueSetting) => {
58
58
  if (err)
59
59
  cb(err);
60
- else if ((exchangeQueueSetting === null || exchangeQueueSetting === void 0 ? void 0 : exchangeQueueSetting.priorityQueuing) !==
61
- queueSettings.priorityQueuing)
60
+ else if ((exchangeQueueSetting === null || exchangeQueueSetting === void 0 ? void 0 : exchangeQueueSetting.type) !== queueSettings.type)
62
61
  cb(new fan_out_exchange_queue_error_1.FanOutExchangeQueueError());
63
62
  else
64
63
  cb(null, queueSettings);
@@ -105,17 +105,12 @@ class MessageState {
105
105
  return this.expired;
106
106
  }
107
107
  getSetExpired(ttl, createdAt) {
108
- if (!this.hasExpired()) {
109
- const messageTTL = ttl;
110
- if (messageTTL) {
111
- const curTime = new Date().getTime();
112
- const expired = createdAt + messageTTL - curTime <= 0;
113
- this.setExpired(expired);
114
- return expired;
115
- }
116
- return false;
108
+ if (ttl) {
109
+ const curTime = new Date().getTime();
110
+ const expired = createdAt + ttl - curTime <= 0;
111
+ this.setExpired(expired);
117
112
  }
118
- return true;
113
+ return this.hasExpired();
119
114
  }
120
115
  getSetNextDelay() {
121
116
  const retryDelay = this.getSetNextRetryDelay();
@@ -1,7 +1,7 @@
1
- import { ScheduledMessages } from './scheduled-messages';
2
- import { AcknowledgedMessages } from './acknowledged-messages';
3
- import { DeadLetteredMessages } from './dead-lettered-messages';
4
- import { PendingMessages } from './pending-messages';
1
+ import { ScheduledMessages } from './messages/scheduled-messages';
2
+ import { AcknowledgedMessages } from './messages/acknowledged-messages';
3
+ import { DeadLetteredMessages } from './messages/dead-lettered-messages';
4
+ import { PendingMessages } from './messages/pending-messages';
5
5
  import { ICallback } from 'redis-smq-common/dist/types';
6
6
  import { IConfig } from '../../../types';
7
7
  export declare class MessageManager {
@@ -2,10 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MessageManager = void 0;
4
4
  const redis_smq_common_1 = require("redis-smq-common");
5
- const scheduled_messages_1 = require("./scheduled-messages");
6
- const acknowledged_messages_1 = require("./acknowledged-messages");
7
- const dead_lettered_messages_1 = require("./dead-lettered-messages");
8
- const pending_messages_1 = require("./pending-messages");
5
+ const scheduled_messages_1 = require("./messages/scheduled-messages");
6
+ const acknowledged_messages_1 = require("./messages/acknowledged-messages");
7
+ const dead_lettered_messages_1 = require("./messages/dead-lettered-messages");
8
+ const pending_messages_1 = require("./messages/pending-messages");
9
9
  const configuration_1 = require("../../config/configuration");
10
10
  class MessageManager {
11
11
  constructor(redisClient, acknowledgedMessages, deadLetteredMessages, pendingMessages, scheduledMessages) {
@@ -13,7 +13,7 @@ declare type TListMessageIdParams = {
13
13
  messageId: string;
14
14
  sequenceId: number;
15
15
  };
16
- export declare abstract class List extends AbstractMessageStorage<TListKeyMessagesParams, TListMessageIdParams> {
16
+ export declare abstract class ListMessageStorage extends AbstractMessageStorage<TListKeyMessagesParams, TListMessageIdParams> {
17
17
  protected getMessageById(key: TListKeyMessagesParams, id: TListMessageIdParams, cb: ICallback<Message>): void;
18
18
  protected requeueMessage(key: TListKeyMessagesParams, id: TListMessageIdParams, cb: ICallback<void>): void;
19
19
  protected deleteMessage(key: TListKeyMessagesParams, id: TListMessageIdParams, cb: ICallback<void>): void;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.List = void 0;
3
+ exports.ListMessageStorage = void 0;
4
4
  const abstract_message_storage_1 = require("./abstract-message-storage");
5
5
  const types_1 = require("../../../../types");
6
6
  const message_1 = require("../../message/message");
@@ -9,7 +9,7 @@ const message_not_found_error_1 = require("../errors/message-not-found.error");
9
9
  const redis_keys_1 = require("../../../common/redis-keys/redis-keys");
10
10
  const message_requeue_error_1 = require("../errors/message-requeue.error");
11
11
  const redis_client_1 = require("../../../common/redis-client/redis-client");
12
- class List extends abstract_message_storage_1.AbstractMessageStorage {
12
+ class ListMessageStorage extends abstract_message_storage_1.AbstractMessageStorage {
13
13
  getMessageById(key, id, cb) {
14
14
  const { keyMessages } = key;
15
15
  const { messageId, sequenceId } = id;
@@ -43,7 +43,7 @@ class List extends abstract_message_storage_1.AbstractMessageStorage {
43
43
  const { keyQueueSettings, keyQueuePending, keyQueuePendingPriorityMessageWeight, keyQueuePendingPriorityMessages, } = redis_keys_1.redisKeys.getQueueKeys(queue);
44
44
  this.redisClient.runScript(redis_client_1.ELuaScriptName.REQUEUE_MESSAGE, [
45
45
  keyQueueSettings,
46
- types_1.EQueueSettingType.PRIORITY_QUEUING,
46
+ types_1.EQueueSettingType.QUEUE_TYPE,
47
47
  keyQueuePendingPriorityMessages,
48
48
  keyQueuePendingPriorityMessageWeight,
49
49
  keyQueuePending,
@@ -118,5 +118,5 @@ class List extends abstract_message_storage_1.AbstractMessageStorage {
118
118
  });
119
119
  }
120
120
  }
121
- exports.List = List;
122
- //# sourceMappingURL=list.js.map
121
+ exports.ListMessageStorage = ListMessageStorage;
122
+ //# sourceMappingURL=list-message-storage.js.map
@@ -9,7 +9,7 @@ declare type TSortedSetKeyMessagesParams = {
9
9
  declare type TSortedSetMessageIdParams = {
10
10
  messageId: string;
11
11
  };
12
- export declare abstract class SortedSet extends AbstractMessageStorage<TSortedSetKeyMessagesParams, TSortedSetMessageIdParams> {
12
+ export declare abstract class SortedSetMessageStorage extends AbstractMessageStorage<TSortedSetKeyMessagesParams, TSortedSetMessageIdParams> {
13
13
  protected deleteMessage(key: TSortedSetKeyMessagesParams, id: TSortedSetMessageIdParams, cb: ICallback<void>): void;
14
14
  protected fetchMessages(key: TSortedSetKeyMessagesParams, skip: number, take: number, cb: ICallback<TGetMessagesReply>): void;
15
15
  protected purgeMessages(key: TSortedSetKeyMessagesParams, cb: ICallback<void>): void;
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SortedSet = void 0;
3
+ exports.SortedSetMessageStorage = void 0;
4
4
  const abstract_message_storage_1 = require("./abstract-message-storage");
5
5
  const message_1 = require("../../message/message");
6
6
  const redis_smq_common_1 = require("redis-smq-common");
7
7
  const message_not_found_error_1 = require("../errors/message-not-found.error");
8
- class SortedSet extends abstract_message_storage_1.AbstractMessageStorage {
8
+ class SortedSetMessageStorage extends abstract_message_storage_1.AbstractMessageStorage {
9
9
  deleteMessage(key, id, cb) {
10
10
  const { keyMessages, keyMessagesWeight } = key;
11
11
  const { messageId } = id;
@@ -97,5 +97,5 @@ class SortedSet extends abstract_message_storage_1.AbstractMessageStorage {
97
97
  });
98
98
  }
99
99
  }
100
- exports.SortedSet = SortedSet;
101
- //# sourceMappingURL=sorted-set.js.map
100
+ exports.SortedSetMessageStorage = SortedSetMessageStorage;
101
+ //# sourceMappingURL=sorted-set-message-storage.js.map
@@ -1,7 +1,7 @@
1
- import { TGetMessagesReply, TQueueParams } from '../../../types';
2
- import { List } from './message-storage/list';
1
+ import { TGetMessagesReply, TQueueParams } from '../../../../types';
2
+ import { ListMessageStorage } from '../message-storage/list-message-storage';
3
3
  import { ICallback } from 'redis-smq-common/dist/types';
4
- export declare class AcknowledgedMessages extends List {
4
+ export declare class AcknowledgedMessages extends ListMessageStorage {
5
5
  list(queue: string | TQueueParams, skip: number, take: number, cb: ICallback<TGetMessagesReply>): void;
6
6
  purge(queue: string | TQueueParams, cb: ICallback<void>): void;
7
7
  requeue(queue: string | TQueueParams, messageId: string, sequenceId: number, cb: ICallback<void>): void;
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AcknowledgedMessages = void 0;
4
- const redis_keys_1 = require("../../common/redis-keys/redis-keys");
5
- const list_1 = require("./message-storage/list");
6
- const queue_1 = require("../queue-manager/queue");
7
- class AcknowledgedMessages extends list_1.List {
4
+ const redis_keys_1 = require("../../../common/redis-keys/redis-keys");
5
+ const list_message_storage_1 = require("../message-storage/list-message-storage");
6
+ const queue_1 = require("../../queue-manager/queue");
7
+ class AcknowledgedMessages extends list_message_storage_1.ListMessageStorage {
8
8
  list(queue, skip, take, cb) {
9
9
  const queueParams = queue_1.Queue.getParams(this.config, queue);
10
10
  const { keyQueueAcknowledged } = redis_keys_1.redisKeys.getQueueKeys(queueParams);
@@ -1,7 +1,7 @@
1
- import { TGetMessagesReply, TQueueParams } from '../../../types';
2
- import { List } from './message-storage/list';
1
+ import { TGetMessagesReply, TQueueParams } from '../../../../types';
2
+ import { ListMessageStorage } from '../message-storage/list-message-storage';
3
3
  import { ICallback } from 'redis-smq-common/dist/types';
4
- export declare class DeadLetteredMessages extends List {
4
+ export declare class DeadLetteredMessages extends ListMessageStorage {
5
5
  purge(queue: string | TQueueParams, cb: ICallback<void>): void;
6
6
  requeue(queue: string | TQueueParams, messageId: string, sequenceId: number, cb: ICallback<void>): void;
7
7
  delete(queue: string | TQueueParams, messageId: string, sequenceId: number, cb: ICallback<void>): void;
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DeadLetteredMessages = void 0;
4
- const redis_keys_1 = require("../../common/redis-keys/redis-keys");
5
- const list_1 = require("./message-storage/list");
6
- const queue_1 = require("../queue-manager/queue");
7
- class DeadLetteredMessages extends list_1.List {
4
+ const redis_keys_1 = require("../../../common/redis-keys/redis-keys");
5
+ const list_message_storage_1 = require("../message-storage/list-message-storage");
6
+ const queue_1 = require("../../queue-manager/queue");
7
+ class DeadLetteredMessages extends list_message_storage_1.ListMessageStorage {
8
8
  purge(queue, cb) {
9
9
  const queueParams = queue_1.Queue.getParams(this.config, queue);
10
10
  const { keyQueueDL } = redis_keys_1.redisKeys.getQueueKeys(queueParams);
@@ -1,12 +1,12 @@
1
1
  import { RedisClient } from 'redis-smq-common';
2
- import { IRequiredConfig, TGetMessagesReply, TQueueParams } from '../../../types';
2
+ import { IRequiredConfig, TGetMessagesReply, TQueueParams } from '../../../../types';
3
3
  import { PendingPriorityMessages } from './pending-priority-messages';
4
- import { PendingLifoMessages } from './pending-lifo-messages';
4
+ import { PendingNonPriorityMessages } from './pending-non-priority-messages';
5
5
  import { ICallback, ICompatibleLogger } from 'redis-smq-common/dist/types';
6
6
  export declare class PendingMessages {
7
7
  protected redisClient: RedisClient;
8
8
  protected pendingPriorityMessages: PendingPriorityMessages;
9
- protected pendingLifoMessages: PendingLifoMessages;
9
+ protected pendingNonPriorityMessages: PendingNonPriorityMessages;
10
10
  protected config: IRequiredConfig;
11
11
  constructor(config: IRequiredConfig, redisClient: RedisClient, logger: ICompatibleLogger);
12
12
  purge(queue: string | TQueueParams, cb: ICallback<void>): void;
@@ -1,14 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PendingMessages = void 0;
4
- const queue_1 = require("../queue-manager/queue");
4
+ const types_1 = require("../../../../types");
5
+ const queue_1 = require("../../queue-manager/queue");
5
6
  const pending_priority_messages_1 = require("./pending-priority-messages");
6
- const pending_lifo_messages_1 = require("./pending-lifo-messages");
7
+ const pending_non_priority_messages_1 = require("./pending-non-priority-messages");
7
8
  class PendingMessages {
8
9
  constructor(config, redisClient, logger) {
9
10
  this.redisClient = redisClient;
10
11
  this.config = config;
11
- this.pendingLifoMessages = new pending_lifo_messages_1.PendingLifoMessages(config, redisClient, logger);
12
+ this.pendingNonPriorityMessages = new pending_non_priority_messages_1.PendingNonPriorityMessages(config, redisClient, logger);
12
13
  this.pendingPriorityMessages = new pending_priority_messages_1.PendingPriorityMessages(config, redisClient, logger);
13
14
  }
14
15
  purge(queue, cb) {
@@ -16,11 +17,11 @@ class PendingMessages {
16
17
  queue_1.Queue.getSettings(this.config, this.redisClient, queueParams, (err, settings) => {
17
18
  if (err)
18
19
  cb(err);
19
- else if (settings === null || settings === void 0 ? void 0 : settings.priorityQueuing) {
20
+ else if ((settings === null || settings === void 0 ? void 0 : settings.type) === types_1.EQueueType.PRIORITY_QUEUE) {
20
21
  this.pendingPriorityMessages.purge(queueParams, cb);
21
22
  }
22
23
  else {
23
- this.pendingLifoMessages.purge(queueParams, cb);
24
+ this.pendingNonPriorityMessages.purge(queueParams, cb);
24
25
  }
25
26
  });
26
27
  }
@@ -28,11 +29,11 @@ class PendingMessages {
28
29
  queue_1.Queue.getSettings(this.config, this.redisClient, queue, (err, settings) => {
29
30
  if (err)
30
31
  cb(err);
31
- else if (settings === null || settings === void 0 ? void 0 : settings.priorityQueuing) {
32
+ else if ((settings === null || settings === void 0 ? void 0 : settings.type) === types_1.EQueueType.PRIORITY_QUEUE) {
32
33
  this.pendingPriorityMessages.list(queue, skip, take, cb);
33
34
  }
34
35
  else {
35
- this.pendingLifoMessages.list(queue, skip, take, cb);
36
+ this.pendingNonPriorityMessages.list(queue, skip, take, cb);
36
37
  }
37
38
  });
38
39
  }
@@ -40,11 +41,11 @@ class PendingMessages {
40
41
  queue_1.Queue.getSettings(this.config, this.redisClient, queue, (err, settings) => {
41
42
  if (err)
42
43
  cb(err);
43
- else if (settings === null || settings === void 0 ? void 0 : settings.priorityQueuing) {
44
+ else if ((settings === null || settings === void 0 ? void 0 : settings.type) === types_1.EQueueType.PRIORITY_QUEUE) {
44
45
  this.pendingPriorityMessages.delete(queue, messageId, cb);
45
46
  }
46
47
  else {
47
- this.pendingLifoMessages.delete(queue, messageId, sequenceId, cb);
48
+ this.pendingNonPriorityMessages.delete(queue, messageId, sequenceId, cb);
48
49
  }
49
50
  });
50
51
  }
@@ -52,10 +53,10 @@ class PendingMessages {
52
53
  queue_1.Queue.getSettings(this.config, this.redisClient, queue, (err, settings) => {
53
54
  if (err)
54
55
  cb(err);
55
- else if (settings === null || settings === void 0 ? void 0 : settings.priorityQueuing)
56
+ else if ((settings === null || settings === void 0 ? void 0 : settings.type) === types_1.EQueueType.PRIORITY_QUEUE)
56
57
  this.pendingPriorityMessages.count(queue, cb);
57
58
  else
58
- this.pendingLifoMessages.count(queue, cb);
59
+ this.pendingNonPriorityMessages.count(queue, cb);
59
60
  });
60
61
  }
61
62
  }
@@ -1,7 +1,7 @@
1
- import { TGetMessagesReply, TQueueParams } from '../../../types';
2
- import { List } from './message-storage/list';
1
+ import { TGetMessagesReply, TQueueParams } from '../../../../types';
2
+ import { ListMessageStorage } from '../message-storage/list-message-storage';
3
3
  import { ICallback } from 'redis-smq-common/dist/types';
4
- export declare class PendingLifoMessages extends List {
4
+ export declare class PendingNonPriorityMessages extends ListMessageStorage {
5
5
  purge(queue: string | TQueueParams, cb: ICallback<void>): void;
6
6
  delete(queue: string | TQueueParams, messageId: string, sequenceId: number, cb: ICallback<void>): void;
7
7
  list(queue: string | TQueueParams, skip: number, take: number, cb: ICallback<TGetMessagesReply>): void;
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PendingLifoMessages = void 0;
4
- const redis_keys_1 = require("../../common/redis-keys/redis-keys");
5
- const message_not_found_error_1 = require("./errors/message-not-found.error");
6
- const list_1 = require("./message-storage/list");
7
- const queue_1 = require("../queue-manager/queue");
8
- class PendingLifoMessages extends list_1.List {
3
+ exports.PendingNonPriorityMessages = void 0;
4
+ const redis_keys_1 = require("../../../common/redis-keys/redis-keys");
5
+ const message_not_found_error_1 = require("../errors/message-not-found.error");
6
+ const list_message_storage_1 = require("../message-storage/list-message-storage");
7
+ const queue_1 = require("../../queue-manager/queue");
8
+ class PendingNonPriorityMessages extends list_message_storage_1.ListMessageStorage {
9
9
  purge(queue, cb) {
10
10
  const queueParams = queue_1.Queue.getParams(this.config, queue);
11
11
  const { keyQueuePending } = redis_keys_1.redisKeys.getQueueKeys(queueParams);
@@ -42,5 +42,5 @@ class PendingLifoMessages extends list_1.List {
42
42
  this.countMessages({ keyMessages: keyQueuePending }, cb);
43
43
  }
44
44
  }
45
- exports.PendingLifoMessages = PendingLifoMessages;
46
- //# sourceMappingURL=pending-lifo-messages.js.map
45
+ exports.PendingNonPriorityMessages = PendingNonPriorityMessages;
46
+ //# sourceMappingURL=pending-non-priority-messages.js.map
@@ -1,8 +1,8 @@
1
- import { TGetMessagesReply, TQueueParams } from '../../../types';
2
- import { SortedSet } from './message-storage/sorted-set';
1
+ import { TGetMessagesReply, TQueueParams } from '../../../../types';
2
+ import { SortedSetMessageStorage } from '../message-storage/sorted-set-message-storage';
3
3
  import { RedisClient } from 'redis-smq-common';
4
4
  import { ICallback } from 'redis-smq-common/dist/types';
5
- export declare class PendingPriorityMessages extends SortedSet {
5
+ export declare class PendingPriorityMessages extends SortedSetMessageStorage {
6
6
  delete(queue: string | TQueueParams, messageId: string, cb: ICallback<void>): void;
7
7
  purge(queue: string | TQueueParams, cb: ICallback<void>): void;
8
8
  list(queue: string | TQueueParams, skip: number, take: number, cb: ICallback<TGetMessagesReply>): void;
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PendingPriorityMessages = void 0;
4
- const queue_1 = require("../queue-manager/queue");
5
- const redis_keys_1 = require("../../common/redis-keys/redis-keys");
6
- const sorted_set_1 = require("./message-storage/sorted-set");
7
- class PendingPriorityMessages extends sorted_set_1.SortedSet {
4
+ const queue_1 = require("../../queue-manager/queue");
5
+ const redis_keys_1 = require("../../../common/redis-keys/redis-keys");
6
+ const sorted_set_message_storage_1 = require("../message-storage/sorted-set-message-storage");
7
+ class PendingPriorityMessages extends sorted_set_message_storage_1.SortedSetMessageStorage {
8
8
  delete(queue, messageId, cb) {
9
9
  const queueParams = queue_1.Queue.getParams(this.config, queue);
10
10
  const { keyQueuePendingPriorityMessageWeight, keyQueuePendingPriorityMessages, } = redis_keys_1.redisKeys.getQueueKeys(queueParams);
@@ -1,7 +1,7 @@
1
- import { TGetMessagesReply } from '../../../types';
2
- import { SortedSet } from './message-storage/sorted-set';
1
+ import { TGetMessagesReply } from '../../../../types';
2
+ import { SortedSetMessageStorage } from '../message-storage/sorted-set-message-storage';
3
3
  import { ICallback } from 'redis-smq-common/dist/types';
4
- export declare class ScheduledMessages extends SortedSet {
4
+ export declare class ScheduledMessages extends SortedSetMessageStorage {
5
5
  delete(messageId: string, cb: ICallback<void>): void;
6
6
  purge(cb: ICallback<void>): void;
7
7
  list(skip: number, take: number, cb: ICallback<TGetMessagesReply>): void;
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ScheduledMessages = void 0;
4
- const redis_keys_1 = require("../../common/redis-keys/redis-keys");
5
- const sorted_set_1 = require("./message-storage/sorted-set");
6
- class ScheduledMessages extends sorted_set_1.SortedSet {
4
+ const redis_keys_1 = require("../../../common/redis-keys/redis-keys");
5
+ const sorted_set_message_storage_1 = require("../message-storage/sorted-set-message-storage");
6
+ class ScheduledMessages extends sorted_set_message_storage_1.SortedSetMessageStorage {
7
7
  delete(messageId, cb) {
8
8
  const { keyScheduledMessages, keyScheduledMessageWeight } = redis_keys_1.redisKeys.getMainKeys();
9
9
  this.deleteMessage({
@@ -30,7 +30,7 @@ class Producer extends base_1.Base {
30
30
  const { keyQueueSettings, keyQueuePendingPriorityMessages, keyQueuePendingPriorityMessageWeight, keyQueuePending, } = redis_keys_1.redisKeys.getQueueKeys(queue);
31
31
  redisClient.runScript(redis_client_1.ELuaScriptName.PUBLISH_MESSAGE, [
32
32
  keyQueueSettings,
33
- types_1.EQueueSettingType.PRIORITY_QUEUING,
33
+ types_1.EQueueSettingType.QUEUE_TYPE,
34
34
  keyQueuePendingPriorityMessages,
35
35
  keyQueuePendingPriorityMessageWeight,
36
36
  keyQueuePending,
@@ -31,7 +31,7 @@ function scheduleMessage(mixed, message, cb) {
31
31
  const messageId = message.getRequiredId();
32
32
  mixed.runScript(redis_client_1.ELuaScriptName.SCHEDULE_MESSAGE, [
33
33
  keyQueueSettings,
34
- types_1.EQueueSettingType.PRIORITY_QUEUING,
34
+ types_1.EQueueSettingType.QUEUE_TYPE,
35
35
  keyScheduledMessageWeight,
36
36
  keyScheduledMessages,
37
37
  ], [
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.QueueMetrics = void 0;
4
+ const types_1 = require("../../../types");
4
5
  const redis_keys_1 = require("../../common/redis-keys/redis-keys");
5
6
  const redis_smq_common_1 = require("redis-smq-common");
6
7
  const queue_1 = require("./queue");
@@ -25,10 +26,10 @@ class QueueMetrics {
25
26
  if (!settings)
26
27
  cb(new redis_smq_common_1.errors.EmptyCallbackReplyError());
27
28
  else
28
- cb(null, settings.priorityQueuing);
29
+ cb(null, settings.type);
29
30
  }),
30
- (priorityQueuing, cb) => {
31
- if (priorityQueuing) {
31
+ (queueType, cb) => {
32
+ if (queueType === types_1.EQueueType.PRIORITY_QUEUE) {
32
33
  this.redisClient.zcard(keyQueuePendingPriorityMessageWeight, (err, reply) => {
33
34
  if (err)
34
35
  cb(err);
@@ -1,4 +1,4 @@
1
- import { IRequiredConfig, TQueueParams, TQueueSettings } from '../../../types';
1
+ import { EQueueType, IRequiredConfig, TQueueParams, TQueueSettings } from '../../../types';
2
2
  import { RedisClient } from 'redis-smq-common';
3
3
  import { ICallback, ICompatibleLogger } from 'redis-smq-common/dist/types';
4
4
  export declare class Queue {
@@ -10,11 +10,16 @@ export declare class Queue {
10
10
  queue: TQueueParams;
11
11
  settings: TQueueSettings;
12
12
  }>): void;
13
+ save(queue: string | TQueueParams, queueType: EQueueType, cb: ICallback<{
14
+ queue: TQueueParams;
15
+ settings: TQueueSettings;
16
+ }>): void;
13
17
  getSettings(queue: string | TQueueParams, cb: ICallback<TQueueSettings>): void;
14
18
  exists(queue: string | TQueueParams, cb: ICallback<boolean>): void;
15
19
  list(cb: ICallback<TQueueParams[]>): void;
16
20
  delete(queue: string | TQueueParams, cb: ICallback<void>): void;
17
21
  static getParams(config: IRequiredConfig, queue: string | TQueueParams): TQueueParams;
22
+ static parseSettings(raw: Record<string, string>): TQueueSettings;
18
23
  static getSettings(config: IRequiredConfig, redisClient: RedisClient, queue: string | TQueueParams, cb: ICallback<TQueueSettings>): void;
19
24
  static list(redisClient: RedisClient, cb: ICallback<TQueueParams[]>): void;
20
25
  static exists(config: IRequiredConfig, redisClient: RedisClient, queue: string | TQueueParams, cb: ICallback<boolean>): void;
@@ -16,6 +16,12 @@ class Queue {
16
16
  this.logger = logger;
17
17
  }
18
18
  create(queue, priorityQueuing, cb) {
19
+ const queueType = priorityQueuing
20
+ ? types_1.EQueueType.PRIORITY_QUEUE
21
+ : types_1.EQueueType.LIFO_QUEUE;
22
+ this.save(queue, queueType, cb);
23
+ }
24
+ save(queue, queueType, cb) {
19
25
  const queueParams = Queue.getParams(this.config, queue);
20
26
  const { keyQueues, keyNsQueues, keyNamespaces, keyQueueSettings } = redis_keys_1.redisKeys.getQueueKeys(queueParams);
21
27
  const queueIndex = JSON.stringify(queueParams);
@@ -24,8 +30,8 @@ class Queue {
24
30
  keyNsQueues,
25
31
  keyQueues,
26
32
  keyQueueSettings,
27
- types_1.EQueueSettingType.PRIORITY_QUEUING,
28
- ], [queueParams.ns, queueIndex, JSON.stringify(priorityQueuing)], (err, reply) => {
33
+ types_1.EQueueSettingType.QUEUE_TYPE,
34
+ ], [queueParams.ns, queueIndex, queueType], (err, reply) => {
29
35
  if (err)
30
36
  cb(err);
31
37
  else if (!reply)
@@ -72,6 +78,33 @@ class Queue {
72
78
  ns,
73
79
  };
74
80
  }
81
+ static parseSettings(raw) {
82
+ const queueSettings = {
83
+ priorityQueuing: false,
84
+ type: types_1.EQueueType.LIFO_QUEUE,
85
+ exchange: null,
86
+ rateLimit: null,
87
+ };
88
+ for (const key in raw) {
89
+ if (key === types_1.EQueueSettingType.PRIORITY_QUEUING && JSON.parse(raw[key])) {
90
+ queueSettings.type = types_1.EQueueType.PRIORITY_QUEUE;
91
+ queueSettings.priorityQueuing = true;
92
+ }
93
+ if (key === types_1.EQueueSettingType.QUEUE_TYPE) {
94
+ queueSettings.type = Number(raw[key]);
95
+ if (queueSettings.type === types_1.EQueueType.PRIORITY_QUEUE) {
96
+ queueSettings.priorityQueuing = true;
97
+ }
98
+ }
99
+ if (key === types_1.EQueueSettingType.RATE_LIMIT) {
100
+ queueSettings.rateLimit = JSON.parse(raw[key]);
101
+ }
102
+ if (key === types_1.EQueueSettingType.EXCHANGE) {
103
+ queueSettings.exchange = raw[key];
104
+ }
105
+ }
106
+ return queueSettings;
107
+ }
75
108
  static getSettings(config, redisClient, queue, cb) {
76
109
  const queueParams = Queue.getParams(config, queue);
77
110
  const { keyQueueSettings } = redis_keys_1.redisKeys.getQueueKeys(queueParams);
@@ -81,22 +114,7 @@ class Queue {
81
114
  else if (!reply || !Object.keys(reply).length)
82
115
  cb(new queue_not_found_error_1.QueueNotFoundError());
83
116
  else {
84
- const queueSettings = {
85
- priorityQueuing: false,
86
- exchange: null,
87
- rateLimit: null,
88
- };
89
- for (const key in reply) {
90
- if (key === types_1.EQueueSettingType.PRIORITY_QUEUING) {
91
- queueSettings.priorityQueuing = JSON.parse(reply[key]);
92
- }
93
- if (key === types_1.EQueueSettingType.RATE_LIMIT) {
94
- queueSettings.rateLimit = JSON.parse(reply[key]);
95
- }
96
- if (key === types_1.EQueueSettingType.EXCHANGE) {
97
- queueSettings.exchange = reply[key];
98
- }
99
- }
117
+ const queueSettings = Queue.parseSettings(reply);
100
118
  cb(null, queueSettings);
101
119
  }
102
120
  });
@@ -51,7 +51,7 @@ class ScheduleWorker extends redis_smq_common_1.Worker {
51
51
  message.getRequiredMessageState().setPublishedAt(Date.now());
52
52
  this.redisClient.runScript(redis_client_1.ELuaScriptName.ENQUEUE_SCHEDULED_MESSAGE, [
53
53
  keyQueueSettings,
54
- types_1.EQueueSettingType.PRIORITY_QUEUING,
54
+ types_1.EQueueSettingType.QUEUE_TYPE,
55
55
  keyQueuePendingPriorityMessages,
56
56
  keyQueuePendingPriorityMessageWeight,
57
57
  keyQueuePending,
@@ -93,14 +93,21 @@ export declare type TQueueRateLimit = {
93
93
  };
94
94
  export declare type TQueueSettings = {
95
95
  priorityQueuing: boolean;
96
+ type: EQueueType;
96
97
  rateLimit: TQueueRateLimit | null;
97
98
  exchange: string | null;
98
99
  };
99
100
  export declare enum EQueueSettingType {
100
101
  PRIORITY_QUEUING = "PRIORITY_QUEUING",
102
+ QUEUE_TYPE = "QUEUE_TYPE",
101
103
  RATE_LIMIT = "RATE_LIMIT",
102
104
  EXCHANGE = "EXCHANGE"
103
105
  }
106
+ export declare enum EQueueType {
107
+ LIFO_QUEUE = 0,
108
+ FIFO_QUEUE = 1,
109
+ PRIORITY_QUEUE = 2
110
+ }
104
111
  export declare type TConsumerInfo = {
105
112
  ipAddress: string[];
106
113
  hostname: string;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EExchangeType = exports.EQueueSettingType = exports.EMessageUnacknowledgedCause = exports.EMessageDeadLetterCause = void 0;
3
+ exports.EExchangeType = exports.EQueueType = exports.EQueueSettingType = exports.EMessageUnacknowledgedCause = exports.EMessageDeadLetterCause = void 0;
4
4
  var EMessageDeadLetterCause;
5
5
  (function (EMessageDeadLetterCause) {
6
6
  EMessageDeadLetterCause["TTL_EXPIRED"] = "ttl_expired";
@@ -18,9 +18,16 @@ var EMessageUnacknowledgedCause;
18
18
  var EQueueSettingType;
19
19
  (function (EQueueSettingType) {
20
20
  EQueueSettingType["PRIORITY_QUEUING"] = "PRIORITY_QUEUING";
21
+ EQueueSettingType["QUEUE_TYPE"] = "QUEUE_TYPE";
21
22
  EQueueSettingType["RATE_LIMIT"] = "RATE_LIMIT";
22
23
  EQueueSettingType["EXCHANGE"] = "EXCHANGE";
23
24
  })(EQueueSettingType = exports.EQueueSettingType || (exports.EQueueSettingType = {}));
25
+ var EQueueType;
26
+ (function (EQueueType) {
27
+ EQueueType[EQueueType["LIFO_QUEUE"] = 0] = "LIFO_QUEUE";
28
+ EQueueType[EQueueType["FIFO_QUEUE"] = 1] = "FIFO_QUEUE";
29
+ EQueueType[EQueueType["PRIORITY_QUEUE"] = 2] = "PRIORITY_QUEUE";
30
+ })(EQueueType = exports.EQueueType || (exports.EQueueType = {}));
24
31
  var EExchangeType;
25
32
  (function (EExchangeType) {
26
33
  EExchangeType[EExchangeType["DIRECT"] = 0] = "DIRECT";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "redis-smq",
3
- "version": "7.1.3",
3
+ "version": "7.2.0",
4
4
  "description": "A simple high-performance Redis message queue for Node.js.",
5
5
  "author": "Weyoss <weyoss@protonmail.com>",
6
6
  "license": "MIT",
@@ -39,7 +39,7 @@
39
39
  "uuid": "8.3.2"
40
40
  },
41
41
  "peerDependencies": {
42
- "redis-smq-common": "^1.0.4"
42
+ "redis-smq-common": "^1.0.5"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/bluebird": "3.5.36",
@@ -59,7 +59,7 @@
59
59
  "jest": "27.2.4",
60
60
  "lint-staged": "11.1.2",
61
61
  "prettier": "2.4.1",
62
- "redis-smq-common": "^1.0.4",
62
+ "redis-smq-common": "^1.0.5",
63
63
  "supertest": "6.1.6",
64
64
  "ts-jest": "27.0.5",
65
65
  "ts-node": "10.2.1",