queen-mq 0.2.22 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +162 -136
- package/client-js/benchmark/consumer.js +1 -1
- package/client-js/client/client.js +24 -3
- package/client-js/client-v2/LOGGING.md +240 -0
- package/client-js/client-v2/Queen.js +389 -0
- package/client-js/client-v2/README.md +1883 -0
- package/client-js/client-v2/buffer/BufferManager.js +215 -0
- package/client-js/client-v2/buffer/MessageBuffer.js +132 -0
- package/client-js/client-v2/builders/QueueBuilder.js +724 -0
- package/client-js/client-v2/builders/TransactionBuilder.js +110 -0
- package/client-js/client-v2/consumer/ConsumerManager.js +390 -0
- package/client-js/client-v2/http/HttpClient.js +215 -0
- package/client-js/client-v2/http/LoadBalancer.js +50 -0
- package/client-js/client-v2/index.js +7 -0
- package/client-js/client-v2/utils/defaults.js +54 -0
- package/client-js/client-v2/utils/logger.js +54 -0
- package/client-js/client-v2/utils/validation.js +31 -0
- package/client-js/test-v2/AI_TEST_SUMMARY.md +226 -0
- package/client-js/test-v2/GETTING_STARTED.md +154 -0
- package/client-js/test-v2/ai_buffering.js +194 -0
- package/client-js/test-v2/ai_error_handling.js +223 -0
- package/client-js/test-v2/ai_lease_renewal.js +206 -0
- package/client-js/test-v2/ai_mixed_scenarios.js +278 -0
- package/client-js/test-v2/ai_priority.js +169 -0
- package/client-js/test-v2/ai_resources.js +217 -0
- package/client-js/test-v2/ai_ttl_retention.js +170 -0
- package/client-js/test-v2/complete.js +59 -0
- package/client-js/test-v2/consume.js +655 -0
- package/client-js/test-v2/dlq.js +82 -0
- package/client-js/test-v2/load.js +177 -0
- package/client-js/test-v2/pop.js +114 -0
- package/client-js/test-v2/push.js +333 -0
- package/client-js/test-v2/queue.js +39 -0
- package/client-js/test-v2/run.js +187 -0
- package/client-js/test-v2/subscription.js +354 -0
- package/client-js/test-v2/transaction.js +443 -0
- package/package.json +1 -1
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TTL and Retention Tests
|
|
3
|
+
* Tests for message TTL, retention policies
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export async function testMessageTTL(client) {
|
|
7
|
+
const queue = await client.queue('test-queue-v2-ttl')
|
|
8
|
+
.config({
|
|
9
|
+
ttl: 2 // 2 seconds TTL
|
|
10
|
+
})
|
|
11
|
+
.create()
|
|
12
|
+
|
|
13
|
+
if (!queue.configured) {
|
|
14
|
+
return { success: false, message: 'Queue not created' }
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Push a message
|
|
18
|
+
await client.queue('test-queue-v2-ttl')
|
|
19
|
+
.push([{ data: { test: 'ttl-message' } }])
|
|
20
|
+
|
|
21
|
+
// Wait for TTL to expire
|
|
22
|
+
await new Promise(resolve => setTimeout(resolve, 3000))
|
|
23
|
+
|
|
24
|
+
// Try to pop - message should be expired
|
|
25
|
+
const messages = await client.queue('test-queue-v2-ttl')
|
|
26
|
+
.batch(1)
|
|
27
|
+
.wait(false)
|
|
28
|
+
.pop()
|
|
29
|
+
|
|
30
|
+
// Note: TTL behavior may vary - message might be deleted or marked as expired
|
|
31
|
+
return {
|
|
32
|
+
success: true,
|
|
33
|
+
message: `TTL test completed: ${messages.length} messages found (expired messages may be auto-deleted)`
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export async function testRetentionEnabled(client) {
|
|
38
|
+
const queue = await client.queue('test-queue-v2-retention')
|
|
39
|
+
.config({
|
|
40
|
+
retentionEnabled: true,
|
|
41
|
+
retentionSeconds: 3600 // 1 hour
|
|
42
|
+
})
|
|
43
|
+
.create()
|
|
44
|
+
|
|
45
|
+
if (!queue.configured) {
|
|
46
|
+
return { success: false, message: 'Queue not created' }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Push and process a message
|
|
50
|
+
await client.queue('test-queue-v2-retention')
|
|
51
|
+
.push([{ data: { test: 'retention' } }])
|
|
52
|
+
|
|
53
|
+
const messages = await client.queue('test-queue-v2-retention')
|
|
54
|
+
.batch(1)
|
|
55
|
+
.wait(false)
|
|
56
|
+
.pop()
|
|
57
|
+
|
|
58
|
+
if (messages.length === 0) {
|
|
59
|
+
return { success: false, message: 'No message to process' }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
await client.ack(messages[0], true)
|
|
63
|
+
|
|
64
|
+
// With retention enabled, we should be able to query completed messages
|
|
65
|
+
// This would require accessing the messages API
|
|
66
|
+
return {
|
|
67
|
+
success: true,
|
|
68
|
+
message: 'Retention policy configured'
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export async function testCompletedRetention(client) {
|
|
73
|
+
const queue = await client.queue('test-queue-v2-completed-retention')
|
|
74
|
+
.config({
|
|
75
|
+
completedRetentionSeconds: 60 // 1 minute
|
|
76
|
+
})
|
|
77
|
+
.create()
|
|
78
|
+
|
|
79
|
+
if (!queue.configured) {
|
|
80
|
+
return { success: false, message: 'Queue not created' }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Push, pop, and ack a message
|
|
84
|
+
await client.queue('test-queue-v2-completed-retention')
|
|
85
|
+
.push([{ data: { test: 'completed' } }])
|
|
86
|
+
|
|
87
|
+
const messages = await client.queue('test-queue-v2-completed-retention')
|
|
88
|
+
.batch(1)
|
|
89
|
+
.wait(false)
|
|
90
|
+
.pop()
|
|
91
|
+
|
|
92
|
+
if (messages.length === 0) {
|
|
93
|
+
return { success: false, message: 'No message to process' }
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
await client.ack(messages[0], true)
|
|
97
|
+
|
|
98
|
+
// Message should be retained for the specified time
|
|
99
|
+
return {
|
|
100
|
+
success: true,
|
|
101
|
+
message: 'Completed retention configured'
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export async function testNoRetention(client) {
|
|
106
|
+
const queue = await client.queue('test-queue-v2-no-retention')
|
|
107
|
+
.config({
|
|
108
|
+
retentionEnabled: false,
|
|
109
|
+
retentionSeconds: 0,
|
|
110
|
+
completedRetentionSeconds: 0
|
|
111
|
+
})
|
|
112
|
+
.create()
|
|
113
|
+
|
|
114
|
+
if (!queue.configured) {
|
|
115
|
+
return { success: false, message: 'Queue not created' }
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Push, pop, and ack
|
|
119
|
+
await client.queue('test-queue-v2-no-retention')
|
|
120
|
+
.push([{ data: { test: 'no-retention' } }])
|
|
121
|
+
|
|
122
|
+
const messages = await client.queue('test-queue-v2-no-retention')
|
|
123
|
+
.batch(1)
|
|
124
|
+
.wait(false)
|
|
125
|
+
.pop()
|
|
126
|
+
|
|
127
|
+
if (messages.length > 0) {
|
|
128
|
+
await client.ack(messages[0], true)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Without retention, completed messages should be deleted immediately
|
|
132
|
+
return {
|
|
133
|
+
success: true,
|
|
134
|
+
message: 'No retention mode configured'
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export async function testMaxWaitTimeDLQ(client) {
|
|
139
|
+
const queue = await client.queue('test-queue-v2-max-wait')
|
|
140
|
+
.config({
|
|
141
|
+
maxWaitTimeSeconds: 2, // 2 seconds max wait
|
|
142
|
+
dlqAfterMaxRetries: true,
|
|
143
|
+
deadLetterQueue: true
|
|
144
|
+
})
|
|
145
|
+
.create()
|
|
146
|
+
|
|
147
|
+
if (!queue.configured) {
|
|
148
|
+
return { success: false, message: 'Queue not created' }
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Push a message
|
|
152
|
+
await client.queue('test-queue-v2-max-wait')
|
|
153
|
+
.push([{ data: { test: 'max-wait' } }])
|
|
154
|
+
|
|
155
|
+
// Wait longer than maxWaitTimeSeconds without consuming
|
|
156
|
+
await new Promise(resolve => setTimeout(resolve, 3000))
|
|
157
|
+
|
|
158
|
+
// Check if message moved to DLQ
|
|
159
|
+
const dlqResult = await client.queue('test-queue-v2-max-wait')
|
|
160
|
+
.dlq()
|
|
161
|
+
.limit(10)
|
|
162
|
+
.get()
|
|
163
|
+
|
|
164
|
+
// Note: maxWaitTimeSeconds behavior may vary by implementation
|
|
165
|
+
return {
|
|
166
|
+
success: true,
|
|
167
|
+
message: `Max wait time test completed: ${dlqResult?.messages?.length || 0} in DLQ`
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export async function testComplete(client) {
|
|
2
|
+
const queueInit = await client.queue('test-queue-v2-complete-init').create()
|
|
3
|
+
const queueNext = await client.queue('test-queue-v2-complete-next').create()
|
|
4
|
+
const queueFinal = await client.queue('test-queue-v2-complete-final').create()
|
|
5
|
+
if (!queueInit.configured || !queueNext.configured || !queueFinal.configured) {
|
|
6
|
+
return { success: false, message: 'Queue not created' }
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
await client
|
|
10
|
+
.queue('test-queue-v2-complete-init')
|
|
11
|
+
.push([
|
|
12
|
+
{ data: { message: 'First', count: 0 }
|
|
13
|
+
}])
|
|
14
|
+
|
|
15
|
+
await client
|
|
16
|
+
.queue('test-queue-v2-complete-init')
|
|
17
|
+
.batch(1)
|
|
18
|
+
.wait(false)
|
|
19
|
+
.limit(1)
|
|
20
|
+
.each()
|
|
21
|
+
.autoAck(false) // Disable auto-ack since we're manually acking in the transaction
|
|
22
|
+
.consume(async msg => {
|
|
23
|
+
await client
|
|
24
|
+
.transaction()
|
|
25
|
+
.queue('test-queue-v2-complete-next')
|
|
26
|
+
.push([{ data: { message: 'Next', count: msg.data.count + 1 } }])
|
|
27
|
+
.ack(msg)
|
|
28
|
+
.commit()
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
await client
|
|
32
|
+
.queue('test-queue-v2-complete-next')
|
|
33
|
+
.batch(1)
|
|
34
|
+
.wait(false)
|
|
35
|
+
.limit(1)
|
|
36
|
+
.each()
|
|
37
|
+
.autoAck(false) // Disable auto-ack since we're manually acking in the transaction
|
|
38
|
+
.consume(async msg => {
|
|
39
|
+
await client
|
|
40
|
+
.transaction()
|
|
41
|
+
.queue('test-queue-v2-complete-final')
|
|
42
|
+
.push([{ data: { message: 'Final', count: msg.data.count + 1 } }])
|
|
43
|
+
.ack(msg)
|
|
44
|
+
.commit()
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
let finalMessage = null
|
|
48
|
+
await client
|
|
49
|
+
.queue('test-queue-v2-complete-final')
|
|
50
|
+
.batch(1)
|
|
51
|
+
.wait(false)
|
|
52
|
+
.limit(1)
|
|
53
|
+
.each()
|
|
54
|
+
.consume(async msg => {
|
|
55
|
+
finalMessage = msg
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
return { success: finalMessage !== null, message: 'Complete test completed successfully' }
|
|
59
|
+
}
|