redis-smq 8.0.0-rc.2 → 8.0.0-rc.4

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 CHANGED
@@ -1,5 +1,35 @@
1
1
 
2
2
 
3
+ ## [8.0.0-rc.4](https://github.com/weyoss/redis-smq/compare/v8.0.0-rc.3...v8.0.0-rc.4) (2023-12-02)
4
+
5
+
6
+ ### Documentation
7
+
8
+ * clean up outdated examples ([dd1c68b](https://github.com/weyoss/redis-smq/commit/dd1c68bdd7cf7de2dfa309dbe7efff76fed5c983))
9
+
10
+
11
+ ### Misc
12
+
13
+ * move redis-smq-common from dev-deps to deps ([675880d](https://github.com/weyoss/redis-smq/commit/675880d3803cca9c89aa860486bae43dbe7e2f70))
14
+
15
+ ## [8.0.0-rc.3](https://github.com/weyoss/redis-smq/compare/v8.0.0-rc.2...v8.0.0-rc.3) (2023-12-02)
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * **scheduler:** handle unacked messages with retry delay correctly ([a97b145](https://github.com/weyoss/redis-smq/commit/a97b145f605d6b5c7d9f6f83c844c9d2447c5786))
21
+
22
+
23
+ ### Documentation
24
+
25
+ * update Message reference ([1cff3e3](https://github.com/weyoss/redis-smq/commit/1cff3e3fe3634ffa2d502a4bbb589948ed8e56ea))
26
+ * update TRedisSMQEvent reference ([5afa22e](https://github.com/weyoss/redis-smq/commit/5afa22ea1d2de00cb9c4708c55ec8fe1ef5a39b5))
27
+
28
+
29
+ ### Tests
30
+
31
+ * **message:** add new test cases covering message status ([9eec7e9](https://github.com/weyoss/redis-smq/commit/9eec7e9e2a39244ab62b9f8db4d049d3363a534d))
32
+
3
33
  ## [8.0.0-rc.2](https://github.com/weyoss/redis-smq/compare/v8.0.0-rc.1...v8.0.0-rc.2) (2023-11-27)
4
34
 
5
35
 
package/dist/index.cjs CHANGED
@@ -3745,11 +3745,13 @@ var PublishScheduledWorker = class extends import_redis_smq_common33.Worker {
3745
3745
  (msg, _, done) => {
3746
3746
  var _a;
3747
3747
  const ts = Date.now();
3748
- const message = _fromMessage(msg, null, null);
3749
- const messageState = message.resetScheduledParams().getSetMessageState().setPublishedAt(ts).setScheduledMessageId(msg.getRequiredId());
3750
- const messageId = messageState.getId();
3751
- const messagePriority = (_a = message.getPriority()) != null ? _a : "";
3752
- const queue = message.getDestinationQueue();
3748
+ const messagePriority = (_a = msg.getPriority()) != null ? _a : "";
3749
+ const queue = msg.getDestinationQueue();
3750
+ const { keyMessage: keyScheduledMessage } = redisKeys.getMessageKeys(
3751
+ msg.getRequiredId()
3752
+ );
3753
+ const nextScheduleTimestamp = msg.getNextScheduledTimestamp();
3754
+ const scheduledMessageState = msg.getRequiredMessageState().setLastScheduledAt(ts);
3753
3755
  const {
3754
3756
  keyQueueProperties,
3755
3757
  keyQueuePending,
@@ -3757,26 +3759,31 @@ var PublishScheduledWorker = class extends import_redis_smq_common33.Worker {
3757
3759
  keyQueueScheduled,
3758
3760
  keyQueueMessages
3759
3761
  } = redisKeys.getQueueKeys(queue);
3760
- const { keyMessage } = redisKeys.getMessageKeys(messageId);
3761
- const { keyMessage: keyScheduledMessage } = redisKeys.getMessageKeys(
3762
- msg.getRequiredId()
3763
- );
3764
- const nextScheduleTimestamp = msg.getNextScheduledTimestamp();
3765
- const scheduledMessageState = msg.getRequiredMessageState().setLastScheduledAt(ts);
3762
+ let newMessage = null;
3763
+ let newMessageState = null;
3764
+ let newMessageId = "";
3765
+ let newKeyMessage = "";
3766
+ const hasBeenUnacknowledged = msg.getRetryDelay() > 0 && msg.getRequiredMessageState().getAttempts() > 0;
3767
+ if (!hasBeenUnacknowledged) {
3768
+ newMessage = _fromMessage(msg, null, null);
3769
+ newMessageState = newMessage.resetScheduledParams().getSetMessageState().setPublishedAt(ts).setScheduledMessageId(msg.getRequiredId());
3770
+ newMessageId = newMessageState.getId();
3771
+ newKeyMessage = redisKeys.getMessageKeys(newMessageId).keyMessage;
3772
+ }
3766
3773
  keys.push(
3767
- keyMessage,
3774
+ newKeyMessage,
3768
3775
  keyQueuePending,
3769
3776
  keyQueueProperties,
3777
+ keyQueueMessages,
3770
3778
  keyPriorityQueuePending,
3771
3779
  keyQueueScheduled,
3772
3780
  keyScheduledMessage
3773
3781
  );
3774
3782
  argv.push(
3775
- messageId,
3783
+ newMessageId,
3784
+ newMessage ? JSON.stringify(newMessage) : "",
3785
+ newMessageState ? JSON.stringify(newMessageState) : "",
3776
3786
  messagePriority,
3777
- JSON.stringify(message),
3778
- JSON.stringify(messageState),
3779
- keyQueueMessages,
3780
3787
  msg.getRequiredId(),
3781
3788
  nextScheduleTimestamp,
3782
3789
  JSON.stringify(scheduledMessageState)
package/dist/index.js CHANGED
@@ -3735,11 +3735,13 @@ var PublishScheduledWorker = class extends Worker4 {
3735
3735
  (msg, _, done) => {
3736
3736
  var _a;
3737
3737
  const ts = Date.now();
3738
- const message = _fromMessage(msg, null, null);
3739
- const messageState = message.resetScheduledParams().getSetMessageState().setPublishedAt(ts).setScheduledMessageId(msg.getRequiredId());
3740
- const messageId = messageState.getId();
3741
- const messagePriority = (_a = message.getPriority()) != null ? _a : "";
3742
- const queue = message.getDestinationQueue();
3738
+ const messagePriority = (_a = msg.getPriority()) != null ? _a : "";
3739
+ const queue = msg.getDestinationQueue();
3740
+ const { keyMessage: keyScheduledMessage } = redisKeys.getMessageKeys(
3741
+ msg.getRequiredId()
3742
+ );
3743
+ const nextScheduleTimestamp = msg.getNextScheduledTimestamp();
3744
+ const scheduledMessageState = msg.getRequiredMessageState().setLastScheduledAt(ts);
3743
3745
  const {
3744
3746
  keyQueueProperties,
3745
3747
  keyQueuePending,
@@ -3747,26 +3749,31 @@ var PublishScheduledWorker = class extends Worker4 {
3747
3749
  keyQueueScheduled,
3748
3750
  keyQueueMessages
3749
3751
  } = redisKeys.getQueueKeys(queue);
3750
- const { keyMessage } = redisKeys.getMessageKeys(messageId);
3751
- const { keyMessage: keyScheduledMessage } = redisKeys.getMessageKeys(
3752
- msg.getRequiredId()
3753
- );
3754
- const nextScheduleTimestamp = msg.getNextScheduledTimestamp();
3755
- const scheduledMessageState = msg.getRequiredMessageState().setLastScheduledAt(ts);
3752
+ let newMessage = null;
3753
+ let newMessageState = null;
3754
+ let newMessageId = "";
3755
+ let newKeyMessage = "";
3756
+ const hasBeenUnacknowledged = msg.getRetryDelay() > 0 && msg.getRequiredMessageState().getAttempts() > 0;
3757
+ if (!hasBeenUnacknowledged) {
3758
+ newMessage = _fromMessage(msg, null, null);
3759
+ newMessageState = newMessage.resetScheduledParams().getSetMessageState().setPublishedAt(ts).setScheduledMessageId(msg.getRequiredId());
3760
+ newMessageId = newMessageState.getId();
3761
+ newKeyMessage = redisKeys.getMessageKeys(newMessageId).keyMessage;
3762
+ }
3756
3763
  keys.push(
3757
- keyMessage,
3764
+ newKeyMessage,
3758
3765
  keyQueuePending,
3759
3766
  keyQueueProperties,
3767
+ keyQueueMessages,
3760
3768
  keyPriorityQueuePending,
3761
3769
  keyQueueScheduled,
3762
3770
  keyScheduledMessage
3763
3771
  );
3764
3772
  argv.push(
3765
- messageId,
3773
+ newMessageId,
3774
+ newMessage ? JSON.stringify(newMessage) : "",
3775
+ newMessageState ? JSON.stringify(newMessageState) : "",
3766
3776
  messagePriority,
3767
- JSON.stringify(message),
3768
- JSON.stringify(messageState),
3769
- keyQueueMessages,
3770
3777
  msg.getRequiredId(),
3771
3778
  nextScheduleTimestamp,
3772
3779
  JSON.stringify(scheduledMessageState)
@@ -16,16 +16,16 @@ local EMessagePropertyMessage = ARGV[9]
16
16
 
17
17
  local keyMessage = ''
18
18
  local keyQueuePending = ''
19
+ local keyQueueMessages = ''
19
20
  local keyQueueProperties = ''
20
21
  local keyPriorityQueuePending = ''
21
22
  local keyQueueScheduled = ''
22
23
  local keyScheduledMessage = ''
23
24
 
24
25
  local messageId = ''
25
- local messagePriority = ''
26
26
  local message = ''
27
27
  local messageState = ''
28
- local keyQueueMessages = ''
28
+ local messagePriority = ''
29
29
  local scheduledMessageId = ''
30
30
  local scheduledMessageNextScheduleTimestamp = ''
31
31
  local scheduledMessageState = ''
@@ -37,14 +37,7 @@ local argvIndexOffset = 9
37
37
 
38
38
  ---
39
39
 
40
- local function publishMessage(queueType)
41
- if queueType == EQueuePropertyQueueTypeLIFOQueue then
42
- redis.call("RPUSH", keyQueuePending, messageId)
43
- elseif queueType == EQueuePropertyQueueTypeFIFOQueue then
44
- redis.call("LPUSH", keyQueuePending, messageId)
45
- else
46
- redis.call("ZADD", keyPriorityQueuePending, messagePriority, messageId)
47
- end
40
+ local function addToQueueMessages()
48
41
  redis.call("SADD", keyQueueMessages, messageId)
49
42
  redis.call(
50
43
  "HMSET", keyMessage,
@@ -55,62 +48,96 @@ local function publishMessage(queueType)
55
48
  redis.call("HINCRBY", keyQueueProperties, EQueuePropertyMessagesCount, 1)
56
49
  end
57
50
 
58
- local function deleteScheduledMessage(queueExists)
59
- redis.call("ZREM", keyScheduledMessages, scheduledMessageId)
60
- redis.call("ZREM", keyQueueScheduled, scheduledMessageId)
51
+ local function publishMessage(queueType, msgId)
52
+ if queueType == EQueuePropertyQueueTypeLIFOQueue then
53
+ redis.call("RPUSH", keyQueuePending, msgId)
54
+ elseif queueType == EQueuePropertyQueueTypeFIFOQueue then
55
+ redis.call("LPUSH", keyQueuePending, msgId)
56
+ else
57
+ redis.call("ZADD", keyPriorityQueuePending, messagePriority, msgId)
58
+ end
59
+ end
60
+
61
+ local function deletedScheduledMessage(updateMessageCount)
61
62
  redis.call("DEL", keyScheduledMessage)
62
- if queueExists == true then
63
+ if updateMessageCount == true then
63
64
  redis.call("HINCRBY", keyQueueProperties, EQueuePropertyMessagesCount, -1)
64
65
  end
65
66
  end
66
67
 
67
- local function scheduleMessage()
68
- if scheduledMessageNextScheduleTimestamp == "0" then
69
- deleteScheduledMessage(true)
70
- else
71
- redis.call("ZADD", keyScheduledMessages, scheduledMessageNextScheduleTimestamp, scheduledMessageId)
72
- redis.call("ZADD", keyQueueScheduled, scheduledMessageNextScheduleTimestamp, scheduledMessageId)
68
+ local function removeFromScheduled()
69
+ redis.call("ZREM", keyScheduledMessages, scheduledMessageId)
70
+ redis.call("ZREM", keyQueueScheduled, scheduledMessageId)
71
+ end
72
+
73
+ local function updateScheduledMessageProperties(status )
74
+ if status == '' then
73
75
  redis.call("HSET", keyScheduledMessage, EMessagePropertyState, scheduledMessageState)
76
+ else
77
+ redis.call(
78
+ "HMSET", keyScheduledMessage,
79
+ EMessagePropertyState, scheduledMessageState,
80
+ EMessagePropertyStatus, status
81
+ )
74
82
  end
75
83
  end
76
84
 
85
+ local function scheduleMessage()
86
+ redis.call("ZADD", keyScheduledMessages, scheduledMessageNextScheduleTimestamp, scheduledMessageId)
87
+ redis.call("ZADD", keyQueueScheduled, scheduledMessageNextScheduleTimestamp, scheduledMessageId)
88
+ end
89
+
77
90
  local function handleMessage()
78
91
  local properties = redis.call("HMGET", keyQueueProperties, EQueuePropertyQueueType)
79
92
  local queueType = properties[1]
80
- if (queueType == false) or (queueType ~= EQueuePropertyQueueTypeLIFOQueue and queueType ~= EQueuePropertyQueueTypeFIFOQueue and queueType ~= EQueuePropertyQueueTypePriorityQueue) then
81
- deleteScheduledMessage(false)
93
+ if (queueType == false) then
94
+ removeFromScheduled()
95
+ deletedScheduledMessage(false)
96
+ elseif (queueType ~= EQueuePropertyQueueTypeLIFOQueue and queueType ~= EQueuePropertyQueueTypeFIFOQueue and queueType ~= EQueuePropertyQueueTypePriorityQueue) then
97
+ removeFromScheduled()
98
+ deletedScheduledMessage(true)
99
+ elseif messageId == '' then
100
+ publishMessage(queueType, scheduledMessageId)
101
+ removeFromScheduled()
102
+ updateScheduledMessageProperties(EMessagePropertyStatusPending)
82
103
  else
83
- publishMessage(queueType)
84
- scheduleMessage()
104
+ publishMessage(queueType, messageId)
105
+ addToQueueMessages();
106
+ if scheduledMessageNextScheduleTimestamp == "0" then
107
+ removeFromScheduled()
108
+ deletedScheduledMessage(true)
109
+ else
110
+ scheduleMessage()
111
+ updateScheduledMessageProperties('')
112
+ end
85
113
  end
86
114
  end
87
115
 
88
116
  if #ARGV > argvIndexOffset then
89
117
  for index in pairs(ARGV) do
90
118
  if (index > argvIndexOffset) then
91
- local idx = index % 8
92
- if idx == 2 then
119
+ local idx = index % 7
120
+ if idx == 3 then
93
121
  messageId = ARGV[index]
94
122
  keyMessage = KEYS[keyIndexOffset + 1]
95
123
  keyQueuePending = KEYS[keyIndexOffset + 2]
96
124
  keyQueueProperties = KEYS[keyIndexOffset + 3]
97
- keyPriorityQueuePending = KEYS[keyIndexOffset + 4]
98
- keyQueueScheduled = KEYS[keyIndexOffset + 5]
99
- keyScheduledMessage = KEYS[keyIndexOffset + 6]
100
- keyIndexOffset = keyIndexOffset + 6
101
- elseif idx == 3 then
102
- messagePriority = ARGV[index]
125
+ keyQueueMessages = KEYS[keyIndexOffset + 4]
126
+ keyPriorityQueuePending = KEYS[keyIndexOffset + 5]
127
+ keyQueueScheduled = KEYS[keyIndexOffset + 6]
128
+ keyScheduledMessage = KEYS[keyIndexOffset + 7]
129
+ keyIndexOffset = keyIndexOffset + 7
103
130
  elseif idx == 4 then
104
131
  message = ARGV[index]
105
132
  elseif idx == 5 then
106
133
  messageState = ARGV[index]
107
134
  elseif idx == 6 then
108
- keyQueueMessages = ARGV[index]
109
- elseif idx == 7 then
110
- scheduledMessageId = ARGV[index]
135
+ messagePriority = ARGV[index]
111
136
  elseif idx == 0 then
112
- scheduledMessageNextScheduleTimestamp = ARGV[index]
137
+ scheduledMessageId = ARGV[index]
113
138
  elseif idx == 1 then
139
+ scheduledMessageNextScheduleTimestamp = ARGV[index]
140
+ elseif idx == 2 then
114
141
  scheduledMessageState = ARGV[index]
115
142
  handleMessage()
116
143
  end
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "redis-smq",
3
- "version": "8.0.0-rc.2",
3
+ "version": "8.0.0-rc.4",
4
4
  "description": "A simple high-performance Redis message queue for Node.js.",
5
5
  "author": "Weyoss <weyoss@protonmail.com>",
6
6
  "license": "MIT",
@@ -35,9 +35,9 @@
35
35
  "module": "dist/index.js",
36
36
  "types": "dist/index.d.ts",
37
37
  "dependencies": {
38
- "bluebird": "3.7.2",
39
38
  "cron-parser": "4.7.1",
40
39
  "lodash": "4.17.21",
40
+ "redis-smq-common": "3.0.0-rc.7",
41
41
  "uuid": "9.0.0"
42
42
  },
43
43
  "devDependencies": {
@@ -45,11 +45,12 @@
45
45
  "@types/debug": "4.1.7",
46
46
  "@types/jest": "27.0.2",
47
47
  "@types/lodash": "4.14.191",
48
- "@types/node": "16.10.2",
48
+ "@types/node": "18.19.1",
49
49
  "@types/supertest": "2.0.11",
50
50
  "@types/uuid": "9.0.0",
51
51
  "@typescript-eslint/eslint-plugin": "6.10.0",
52
52
  "@typescript-eslint/parser": "6.10.0",
53
+ "bluebird": "3.7.2",
53
54
  "eslint": "8.53.0",
54
55
  "eslint-config-prettier": "9.0.0",
55
56
  "eslint-plugin-prettier": "5.0.1",
@@ -57,7 +58,6 @@
57
58
  "jest": "27.2.4",
58
59
  "lint-staged": "11.1.2",
59
60
  "prettier": "3.0.3",
60
- "redis-smq-common": "3.0.0-rc.7",
61
61
  "supertest": "6.1.6",
62
62
  "type-coverage": "2.27.0",
63
63
  "typescript": "4.9.4"