redis-smq 7.1.3 → 7.2.1
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 +26 -0
- package/LICENSE +1 -1
- package/README.md +10 -11
- package/dist/src/common/redis-client/lua/create-queue.lua +2 -2
- package/dist/src/common/redis-client/lua/enqueue-scheduled-message.lua +44 -13
- package/dist/src/common/redis-client/lua/publish-message.lua +11 -5
- package/dist/src/common/redis-client/lua/requeue-message.lua +9 -5
- package/dist/src/common/redis-client/lua/schedule-message.lua +4 -4
- package/dist/src/common/redis-client/redis-client.js +14 -7
- package/dist/src/lib/consumer/consumer-message-handler/dequeue-message.d.ts +3 -2
- package/dist/src/lib/consumer/consumer-message-handler/dequeue-message.js +10 -7
- package/dist/src/lib/consumer/consumer-message-handler/multiplexed-message-handler/multiplexed-dequeue-message.js +1 -1
- package/dist/src/lib/exchange/fan-out-exchange-manager.js +1 -2
- package/dist/src/lib/message/message-state.js +5 -10
- package/dist/src/lib/message-manager/message-manager.d.ts +4 -4
- package/dist/src/lib/message-manager/message-manager.js +4 -4
- package/dist/src/lib/message-manager/message-storage/{list.d.ts → list-message-storage.d.ts} +1 -1
- package/dist/src/lib/message-manager/message-storage/{list.js → list-message-storage.js} +5 -5
- package/dist/src/lib/message-manager/message-storage/{sorted-set.d.ts → sorted-set-message-storage.d.ts} +1 -1
- package/dist/src/lib/message-manager/message-storage/{sorted-set.js → sorted-set-message-storage.js} +4 -4
- package/dist/src/lib/message-manager/{acknowledged-messages.d.ts → messages/acknowledged-messages.d.ts} +3 -3
- package/dist/src/lib/message-manager/{acknowledged-messages.js → messages/acknowledged-messages.js} +4 -4
- package/dist/src/lib/message-manager/{dead-lettered-messages.d.ts → messages/dead-lettered-messages.d.ts} +3 -3
- package/dist/src/lib/message-manager/{dead-lettered-messages.js → messages/dead-lettered-messages.js} +4 -4
- package/dist/src/lib/message-manager/{pending-messages.d.ts → messages/pending-messages.d.ts} +3 -3
- package/dist/src/lib/message-manager/{pending-messages.js → messages/pending-messages.js} +12 -11
- package/dist/src/lib/message-manager/{pending-lifo-messages.d.ts → messages/pending-non-priority-messages.d.ts} +3 -3
- package/dist/src/lib/message-manager/{pending-lifo-messages.js → messages/pending-non-priority-messages.js} +8 -8
- package/dist/src/lib/message-manager/{pending-priority-messages.d.ts → messages/pending-priority-messages.d.ts} +3 -3
- package/dist/src/lib/message-manager/{pending-priority-messages.js → messages/pending-priority-messages.js} +4 -4
- package/dist/src/lib/message-manager/{scheduled-messages.d.ts → messages/scheduled-messages.d.ts} +3 -3
- package/dist/src/lib/message-manager/{scheduled-messages.js → messages/scheduled-messages.js} +3 -3
- package/dist/src/lib/producer/producer.js +1 -1
- package/dist/src/lib/producer/schedule-message.js +1 -1
- package/dist/src/lib/queue-manager/queue-metrics.js +4 -3
- package/dist/src/lib/queue-manager/queue.d.ts +6 -1
- package/dist/src/lib/queue-manager/queue.js +36 -18
- package/dist/src/workers/schedule.worker.js +1 -1
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.js +8 -1
- package/package.json +8 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 7.2.1 (2023-02-15)
|
|
4
|
+
|
|
5
|
+
* build: update deps (e362d7c)
|
|
6
|
+
* fix: use path.resolve() to fix 'no such file or directory' error (b713fbe)
|
|
7
|
+
* build: bump up redis-smq-common to v1.0.6 (fc25b15)
|
|
8
|
+
|
|
9
|
+
## 7.2.0 (2023-01-06)
|
|
10
|
+
|
|
11
|
+
* build: fix NPM vulnerability warnings (e2ca247)
|
|
12
|
+
* build: bump up redis-smq-common to v1.0.5 (cc08fe7)
|
|
13
|
+
* docs(readme): update documentation (3713643)
|
|
14
|
+
* refactor(message-state): improve getSetExpired() logic (bb6f262)
|
|
15
|
+
* test(queue): test settings parsing compatibility with v7.1 (0656217)
|
|
16
|
+
* refactor(queue): move out settings parsing logic from getSettings() (cf4ba86)
|
|
17
|
+
* fix(queue): Keep compatibility with v7.1 queue settings schema (d49735e)
|
|
18
|
+
* docs(queue-manager): update queue.getSettings() reference (09214a4)
|
|
19
|
+
* chore: update license (6016483)
|
|
20
|
+
* docs(queues): improve documentation (494a0ce)
|
|
21
|
+
* docs(queue-manager): update docs (77d2e64)
|
|
22
|
+
* fix(examples): use save() method to create queues (9026923)
|
|
23
|
+
* test(queue-manager): test FIFO queues (b97dc4d)
|
|
24
|
+
* refactor(queue-manager): clean up (7f2d693)
|
|
25
|
+
* refactor(message-manager): refactor and clean up (4f55431)
|
|
26
|
+
* feat(queue-manager): allow to create and use FIFO queues (853a29b)
|
|
27
|
+
* docs(message-manager): update scheduled messages API reference (7fa3d23)
|
|
28
|
+
|
|
3
29
|
## 7.1.3 (2022-10-26)
|
|
4
30
|
|
|
5
31
|
* test(FanOutExchangeManager): test binding queues of different types (d2e287c)
|
package/LICENSE
CHANGED
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
|
-
* **[
|
|
25
|
-
* **[Message
|
|
26
|
-
* **[
|
|
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
|
-
**
|
|
72
|
+
**2023.01.06**
|
|
73
73
|
|
|
74
|
-
:rocket: RedisSMQ v7.
|
|
75
|
-
|
|
76
|
-
|
|
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.
|
|
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]
|
|
5
|
+
--- KEYS[5] keyQueueSettingsQueueType
|
|
6
6
|
--- ARGV[1] namespace
|
|
7
7
|
--- ARGV[2] queue
|
|
8
|
-
--- ARGV[3]
|
|
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]
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
18
|
-
redis.call("RPUSH", KEYS[5], ARGV[2])
|
|
36
|
+
return "OK"
|
|
19
37
|
end
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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]
|
|
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
|
|
10
|
-
if
|
|
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
|
|
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
|
-
|
|
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]
|
|
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
|
|
14
|
-
if
|
|
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
|
|
19
|
-
|
|
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]
|
|
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
|
|
10
|
-
if (
|
|
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
|
|
13
|
+
if queueType == '2' then
|
|
14
14
|
if ARGV[4] == nil or ARGV[4] == '' then
|
|
15
15
|
return 'MESSAGE_PRIORITY_REQUIRED'
|
|
16
16
|
end
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ELuaScriptName = void 0;
|
|
4
4
|
const redis_smq_common_1 = require("redis-smq-common");
|
|
5
5
|
const fs = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
6
7
|
var ELuaScriptName;
|
|
7
8
|
(function (ELuaScriptName) {
|
|
8
9
|
ELuaScriptName["ENQUEUE_SCHEDULED_MESSAGE"] = "ENQUEUE_SCHEDULED_MESSAGE";
|
|
@@ -13,11 +14,17 @@ var ELuaScriptName;
|
|
|
13
14
|
ELuaScriptName["CREATE_QUEUE"] = "CREATE_QUEUE";
|
|
14
15
|
ELuaScriptName["INIT_CONSUMER_QUEUE"] = "INIT_CONSUMER_QUEUE";
|
|
15
16
|
})(ELuaScriptName = exports.ELuaScriptName || (exports.ELuaScriptName = {}));
|
|
16
|
-
redis_smq_common_1.RedisClient.addScript(ELuaScriptName.ENQUEUE_SCHEDULED_MESSAGE, fs
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
redis_smq_common_1.RedisClient.addScript(ELuaScriptName.
|
|
20
|
-
redis_smq_common_1.RedisClient.addScript(ELuaScriptName.
|
|
21
|
-
redis_smq_common_1.RedisClient.addScript(ELuaScriptName.
|
|
22
|
-
redis_smq_common_1.RedisClient.addScript(ELuaScriptName.
|
|
17
|
+
redis_smq_common_1.RedisClient.addScript(ELuaScriptName.ENQUEUE_SCHEDULED_MESSAGE, fs
|
|
18
|
+
.readFileSync((0, path_1.resolve)(__dirname, './lua/enqueue-scheduled-message.lua'))
|
|
19
|
+
.toString());
|
|
20
|
+
redis_smq_common_1.RedisClient.addScript(ELuaScriptName.PUBLISH_MESSAGE, fs.readFileSync((0, path_1.resolve)(__dirname, './lua/publish-message.lua')).toString());
|
|
21
|
+
redis_smq_common_1.RedisClient.addScript(ELuaScriptName.REQUEUE_MESSAGE, fs.readFileSync((0, path_1.resolve)(__dirname, './lua/requeue-message.lua')).toString());
|
|
22
|
+
redis_smq_common_1.RedisClient.addScript(ELuaScriptName.SCHEDULE_MESSAGE, fs.readFileSync((0, path_1.resolve)(__dirname, './lua/schedule-message.lua')).toString());
|
|
23
|
+
redis_smq_common_1.RedisClient.addScript(ELuaScriptName.HAS_QUEUE_RATE_EXCEEDED, fs
|
|
24
|
+
.readFileSync((0, path_1.resolve)(__dirname, './lua/has-queue-rate-exceeded.lua'))
|
|
25
|
+
.toString());
|
|
26
|
+
redis_smq_common_1.RedisClient.addScript(ELuaScriptName.CREATE_QUEUE, fs.readFileSync((0, path_1.resolve)(__dirname, './lua/create-queue.lua')).toString());
|
|
27
|
+
redis_smq_common_1.RedisClient.addScript(ELuaScriptName.INIT_CONSUMER_QUEUE, fs
|
|
28
|
+
.readFileSync((0, path_1.resolve)(__dirname, './lua/init-consumer-queue.lua'))
|
|
29
|
+
.toString());
|
|
23
30
|
//# sourceMappingURL=redis-client.js.map
|
|
@@ -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
|
|
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.
|
|
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.
|
|
63
|
+
if (this.isPriorityQueuingEnabled())
|
|
64
64
|
this.dequeueMessageWithPriority(cb);
|
|
65
65
|
else
|
|
66
66
|
this.dequeueMessage(cb);
|
|
67
67
|
};
|
|
68
|
-
if (this.
|
|
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
|
-
|
|
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
|
|
125
|
+
cb(new redis_smq_common_1.errors.EmptyCallbackReplyError());
|
|
123
126
|
else {
|
|
124
|
-
this.
|
|
127
|
+
this.queueType = reply.type;
|
|
125
128
|
this.queueRateLimit = (_a = reply.rateLimit) !== null && _a !== void 0 ? _a : null;
|
|
126
129
|
cb();
|
|
127
130
|
}
|
|
@@ -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.
|
|
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 (
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
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
|
|
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) {
|
package/dist/src/lib/message-manager/message-storage/{list.d.ts → list-message-storage.d.ts}
RENAMED
|
@@ -13,7 +13,7 @@ declare type TListMessageIdParams = {
|
|
|
13
13
|
messageId: string;
|
|
14
14
|
sequenceId: number;
|
|
15
15
|
};
|
|
16
|
-
export declare abstract class
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
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;
|
package/dist/src/lib/message-manager/message-storage/{sorted-set.js → sorted-set-message-storage.js}
RENAMED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
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
|
|
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.
|
|
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 '
|
|
2
|
-
import {
|
|
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
|
|
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;
|
package/dist/src/lib/message-manager/{acknowledged-messages.js → messages/acknowledged-messages.js}
RENAMED
|
@@ -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("
|
|
5
|
-
const
|
|
6
|
-
const queue_1 = require("
|
|
7
|
-
class AcknowledgedMessages extends
|
|
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 '
|
|
2
|
-
import {
|
|
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
|
|
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("
|
|
5
|
-
const
|
|
6
|
-
const queue_1 = require("
|
|
7
|
-
class DeadLetteredMessages extends
|
|
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);
|
package/dist/src/lib/message-manager/{pending-messages.d.ts → messages/pending-messages.d.ts}
RENAMED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { RedisClient } from 'redis-smq-common';
|
|
2
|
-
import { IRequiredConfig, TGetMessagesReply, TQueueParams } from '
|
|
2
|
+
import { IRequiredConfig, TGetMessagesReply, TQueueParams } from '../../../../types';
|
|
3
3
|
import { PendingPriorityMessages } from './pending-priority-messages';
|
|
4
|
-
import {
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
59
|
+
this.pendingNonPriorityMessages.count(queue, cb);
|
|
59
60
|
});
|
|
60
61
|
}
|
|
61
62
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { TGetMessagesReply, TQueueParams } from '
|
|
2
|
-
import {
|
|
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
|
|
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.
|
|
4
|
-
const redis_keys_1 = require("
|
|
5
|
-
const message_not_found_error_1 = require("
|
|
6
|
-
const
|
|
7
|
-
const queue_1 = require("
|
|
8
|
-
class
|
|
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.
|
|
46
|
-
//# sourceMappingURL=pending-
|
|
45
|
+
exports.PendingNonPriorityMessages = PendingNonPriorityMessages;
|
|
46
|
+
//# sourceMappingURL=pending-non-priority-messages.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { TGetMessagesReply, TQueueParams } from '
|
|
2
|
-
import {
|
|
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
|
|
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("
|
|
5
|
-
const redis_keys_1 = require("
|
|
6
|
-
const
|
|
7
|
-
class PendingPriorityMessages extends
|
|
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);
|
package/dist/src/lib/message-manager/{scheduled-messages.d.ts → messages/scheduled-messages.d.ts}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { TGetMessagesReply } from '
|
|
2
|
-
import {
|
|
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
|
|
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;
|
package/dist/src/lib/message-manager/{scheduled-messages.js → messages/scheduled-messages.js}
RENAMED
|
@@ -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("
|
|
5
|
-
const
|
|
6
|
-
class ScheduledMessages extends
|
|
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.
|
|
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.
|
|
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.
|
|
29
|
+
cb(null, settings.type);
|
|
29
30
|
}),
|
|
30
|
-
(
|
|
31
|
-
if (
|
|
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.
|
|
28
|
-
], [queueParams.ns, queueIndex,
|
|
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.
|
|
54
|
+
types_1.EQueueSettingType.QUEUE_TYPE,
|
|
55
55
|
keyQueuePendingPriorityMessages,
|
|
56
56
|
keyQueuePendingPriorityMessageWeight,
|
|
57
57
|
keyQueuePending,
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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;
|
package/dist/types/index.js
CHANGED
|
@@ -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
|
+
"version": "7.2.1",
|
|
4
4
|
"description": "A simple high-performance Redis message queue for Node.js.",
|
|
5
5
|
"author": "Weyoss <weyoss@protonmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -34,21 +34,21 @@
|
|
|
34
34
|
"types": "dist/index.d.ts",
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"bluebird": "3.7.2",
|
|
37
|
-
"cron-parser": "
|
|
37
|
+
"cron-parser": "4.7.1",
|
|
38
38
|
"lodash": "4.17.21",
|
|
39
|
-
"uuid": "
|
|
39
|
+
"uuid": "9.0.0"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
|
-
"redis-smq-common": "^1.0.
|
|
42
|
+
"redis-smq-common": "^1.0.6"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@types/bluebird": "3.5.
|
|
45
|
+
"@types/bluebird": "3.5.38",
|
|
46
46
|
"@types/debug": "4.1.7",
|
|
47
47
|
"@types/jest": "27.0.2",
|
|
48
|
-
"@types/lodash": "4.14.
|
|
48
|
+
"@types/lodash": "4.14.191",
|
|
49
49
|
"@types/node": "16.10.2",
|
|
50
50
|
"@types/supertest": "2.0.11",
|
|
51
|
-
"@types/uuid": "
|
|
51
|
+
"@types/uuid": "9.0.0",
|
|
52
52
|
"@typescript-eslint/eslint-plugin": "4.32.0",
|
|
53
53
|
"@typescript-eslint/parser": "4.32.0",
|
|
54
54
|
"coveralls": "3.1.1",
|
|
@@ -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.
|
|
62
|
+
"redis-smq-common": "^1.0.6",
|
|
63
63
|
"supertest": "6.1.6",
|
|
64
64
|
"ts-jest": "27.0.5",
|
|
65
65
|
"ts-node": "10.2.1",
|