lonnymq 0.0.4 → 0.0.6
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/dist/index.cjs +186 -169
- package/dist/index.d.ts +29 -46
- package/dist/index.js +180 -163
- package/package.json +1 -2
package/dist/index.cjs
CHANGED
|
@@ -1,22 +1,25 @@
|
|
|
1
|
-
var{defineProperty:
|
|
1
|
+
var{defineProperty:d,getOwnPropertyNames:V,getOwnPropertyDescriptor:X}=Object,K=Object.prototype.hasOwnProperty;var x=new WeakMap,J=(e)=>{var n=x.get(e),a;if(n)return n;if(n=d({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")V(e).map((_)=>!K.call(n,_)&&d(n,_,{get:()=>e[_],enumerable:!(a=X(e,_))||a.enumerable}));return x.set(e,n),n};var j=(e,n)=>{for(var a in n)d(e,a,{get:n[a],enumerable:!0,configurable:!0,set:(_)=>n[a]=()=>_})};var re={};j(re,{Queue:()=>y,MessageDequeueCommand:()=>i,MessageDeleteCommand:()=>l,MessageDeferCommand:()=>h,MessageCreateCommand:()=>o,ChannelPolicySetCommand:()=>m,ChannelPolicyClearCommand:()=>r});module.exports=J(re);var E=(e)=>({nodeType:"VALUE",value:e}),t=(e)=>({nodeType:"REF",value:e}),Z=(e)=>({nodeType:"RAW",value:e}),ee=(e)=>{return`'${e.replace(/'/g,"''")}'`},ne=(e)=>{if(e===null)return"NULL";else if(typeof e==="string")return ee(e);else if(typeof e==="number")return e.toString();else if(typeof e==="boolean")return e?"TRUE":"FALSE";else if(e instanceof Date)return`'${e.toISOString()}'`;else if(typeof e==="bigint")return e.toString();else throw new Error(`Unsupported value type: ${typeof e}`)},te=(e)=>{return`"${e.replace(/"/g,'""')}"`},ae=(e)=>{if(e.nodeType==="VALUE")return ne(e.value);else if(e.nodeType==="REF")return te(e.value);else if(e.nodeType==="RAW")return e.value;else throw new Error("Unsupported SQL node type")};var s=(e,...n)=>{let a=[];for(let _=0;_<e.length;_+=1)if(a.push(e[_]),_<n.length)a.push(ae(n[_]));return Z(a.join(""))};class r{schema;channelName;createdAt;constructor(e){this.schema=e.schema,this.channelName=e.channelName,this.createdAt=new Date}sortKeyGet(){return JSON.stringify([this.channelName,null,this.createdAt.toISOString()])}async execute(e){await e.query(s`
|
|
2
2
|
SELECT 1 FROM ${t(this.schema)}."channel_policy_clear"(
|
|
3
|
-
$
|
|
3
|
+
$1
|
|
4
4
|
)
|
|
5
|
-
`.value)}}class
|
|
5
|
+
`.value,[this.channelName])}}class m{schema;channelName;maxSize;maxConcurrency;releaseIntervalMs;createdAt;constructor(e){this.schema=e.schema,this.channelName=e.channelName;let n=e.maxConcurrency??null;this.maxConcurrency=n!==null?Math.max(0,n):null;let a=e.maxSize??null;this.maxSize=a!==null?Math.max(0,a):null;let _=e.releaseIntervalMs??null;this.releaseIntervalMs=_!==null?Math.max(0,_):null,this.createdAt=new Date}sortKeyGet(){return JSON.stringify([this.channelName,null,this.createdAt.toISOString()])}async execute(e){await e.query(s`
|
|
6
6
|
SELECT 1 FROM ${t(this.schema)}."channel_policy_set"(
|
|
7
|
-
$
|
|
8
|
-
$
|
|
9
|
-
$
|
|
10
|
-
$
|
|
7
|
+
$1,
|
|
8
|
+
$2::INTEGER,
|
|
9
|
+
$3::INTEGER,
|
|
10
|
+
$4::INTEGER
|
|
11
11
|
)
|
|
12
|
-
`.value)}}var
|
|
12
|
+
`.value,[this.channelName,this.maxSize,this.maxConcurrency,this.releaseIntervalMs])}}var R=(e)=>{return e*1000},se=(e)=>{return R(e*60)},f=(e)=>{return se(e*60)};var C=require("node:crypto");class p{value;constructor(e){this.value=e}toString(e){return C.createHash("sha256").update(e).update(this.value).digest("base64").replace(/=/g,"")}}var u=new p("WAKE"),$=!1,N=R(0),q=f(1);var g=require("path"),__filename="/home/runner/work/lonnymq/lonnymq/src/core/path.ts",_e=g.dirname(g.dirname(__filename)),ce=new RegExp(`^${_e}/`),c=(e)=>{return e.replace(ce,"")};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/04-function-message-create.ts";var F={name:c(__filename),sql:(e)=>{return[s`
|
|
13
13
|
CREATE FUNCTION ${t(e.schema)}."message_create" (
|
|
14
|
+
p_id UUID,
|
|
14
15
|
p_channel_name TEXT,
|
|
15
16
|
p_name TEXT,
|
|
16
|
-
p_content
|
|
17
|
+
p_content BYTEA,
|
|
17
18
|
p_lock_ms INTEGER,
|
|
18
19
|
p_delay_ms INTEGER
|
|
19
|
-
) RETURNS
|
|
20
|
+
) RETURNS TABLE (
|
|
21
|
+
result_code INTEGER
|
|
22
|
+
) AS $$
|
|
20
23
|
DECLARE
|
|
21
24
|
v_now TIMESTAMP;
|
|
22
25
|
v_channel_policy RECORD;
|
|
@@ -27,9 +30,9 @@ var{defineProperty:R,getOwnPropertyNames:X,getOwnPropertyDescriptor:V}=Object,K=
|
|
|
27
30
|
v_now := NOW();
|
|
28
31
|
|
|
29
32
|
SELECT
|
|
30
|
-
"max_size",
|
|
31
|
-
"max_concurrency",
|
|
32
|
-
"release_interval_ms"
|
|
33
|
+
"channel_policy"."max_size",
|
|
34
|
+
"channel_policy"."max_concurrency",
|
|
35
|
+
"channel_policy"."release_interval_ms"
|
|
33
36
|
FROM ${t(e.schema)}."channel_policy"
|
|
34
37
|
WHERE "name" = p_channel_name
|
|
35
38
|
FOR SHARE
|
|
@@ -66,18 +69,20 @@ var{defineProperty:R,getOwnPropertyNames:X,getOwnPropertyDescriptor:V}=Object,K=
|
|
|
66
69
|
INTO v_channel_state;
|
|
67
70
|
|
|
68
71
|
IF v_channel_state."current_size" >= v_channel_policy."max_size" THEN
|
|
69
|
-
RETURN
|
|
70
|
-
|
|
71
|
-
|
|
72
|
+
RETURN QUERY SELECT
|
|
73
|
+
${E(1)};
|
|
74
|
+
RETURN;
|
|
72
75
|
END IF;
|
|
73
76
|
|
|
74
77
|
INSERT INTO ${t(e.schema)}."message" (
|
|
78
|
+
"id",
|
|
75
79
|
"channel_name",
|
|
76
80
|
"name",
|
|
77
81
|
"content",
|
|
78
82
|
"lock_ms",
|
|
79
83
|
"dequeue_after"
|
|
80
84
|
) VALUES (
|
|
85
|
+
p_id,
|
|
81
86
|
p_channel_name,
|
|
82
87
|
p_name,
|
|
83
88
|
p_content,
|
|
@@ -90,15 +95,13 @@ var{defineProperty:R,getOwnPropertyNames:X,getOwnPropertyDescriptor:V}=Object,K=
|
|
|
90
95
|
"name" = EXCLUDED."name"
|
|
91
96
|
RETURNING
|
|
92
97
|
"id",
|
|
93
|
-
"xmax",
|
|
94
98
|
"dequeue_after"
|
|
95
99
|
INTO v_message;
|
|
96
100
|
|
|
97
|
-
IF v_message."
|
|
98
|
-
RETURN
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
);
|
|
101
|
+
IF v_message."id" != p_id THEN
|
|
102
|
+
RETURN QUERY SELECT
|
|
103
|
+
${E(2)};
|
|
104
|
+
RETURN;
|
|
102
105
|
END IF;
|
|
103
106
|
|
|
104
107
|
IF
|
|
@@ -118,26 +121,30 @@ var{defineProperty:R,getOwnPropertyNames:X,getOwnPropertyDescriptor:V}=Object,K=
|
|
|
118
121
|
|
|
119
122
|
PERFORM ${t(e.schema)}."wake"(GREATEST(0, p_delay_ms));
|
|
120
123
|
|
|
121
|
-
RETURN
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
);
|
|
124
|
+
RETURN QUERY SELECT
|
|
125
|
+
${E(0)};
|
|
126
|
+
RETURN;
|
|
125
127
|
END;
|
|
126
128
|
$$ LANGUAGE plpgsql;
|
|
127
|
-
`]}};class
|
|
128
|
-
SELECT ${t(this.schema)}."message_create"(
|
|
129
|
-
$
|
|
130
|
-
$
|
|
131
|
-
$
|
|
132
|
-
$
|
|
133
|
-
$
|
|
134
|
-
|
|
135
|
-
|
|
129
|
+
`]}};var M=require("node:crypto");class o{schema;channelName;name;content;lockMs;id;delayMs;createdAt;constructor(e){let n=e.name??null,a=e.lockMs===void 0?q:Math.max(0,e.lockMs),_=e.delayMs===void 0?N:e.delayMs;this.id=M.randomUUID(),this.schema=e.schema,this.channelName=e.channelName,this.content=e.content,this.name=n,this.lockMs=a,this.delayMs=_,this.createdAt=new Date}async execute(e){let n=await e.query(s`
|
|
130
|
+
SELECT * FROM ${t(this.schema)}."message_create"(
|
|
131
|
+
$1,
|
|
132
|
+
$2,
|
|
133
|
+
$3,
|
|
134
|
+
$4,
|
|
135
|
+
$5::INTEGER,
|
|
136
|
+
$6::INTEGER
|
|
137
|
+
)
|
|
138
|
+
`.value,[this.id,this.channelName,this.name,this.content,this.lockMs,this.delayMs]).then((a)=>a.rows[0]);if(n.result_code===1)return{resultType:"MESSAGE_DROPPED"};else if(n.result_code===2)return{resultType:"MESSAGE_DEDUPLICATED"};else if(n.result_code===0)return{resultType:"MESSAGE_CREATED"};else throw new Error("Unexpected result")}}var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/05-function-message-dequeue.ts";var G={name:c(__filename),sql:(e)=>{return[s`
|
|
136
139
|
CREATE FUNCTION ${t(e.schema)}."message_dequeue" ()
|
|
137
|
-
RETURNS
|
|
140
|
+
RETURNS TABLE (
|
|
141
|
+
result_code INTEGER,
|
|
142
|
+
content BYTEA,
|
|
143
|
+
state BYTEA,
|
|
144
|
+
metadata JSON
|
|
145
|
+
) AS $$
|
|
138
146
|
DECLARE
|
|
139
147
|
v_now TIMESTAMP;
|
|
140
|
-
v_dequeue_nonce UUID;
|
|
141
148
|
v_channel_state RECORD;
|
|
142
149
|
v_message_locked RECORD;
|
|
143
150
|
v_retry_after TIMESTAMP;
|
|
@@ -146,17 +153,16 @@ var{defineProperty:R,getOwnPropertyNames:X,getOwnPropertyDescriptor:V}=Object,K=
|
|
|
146
153
|
v_message_next_dequeue_after TIMESTAMP;
|
|
147
154
|
BEGIN
|
|
148
155
|
v_now := NOW();
|
|
149
|
-
v_dequeue_nonce := GEN_RANDOM_UUID();
|
|
150
156
|
|
|
151
157
|
SELECT
|
|
152
|
-
"id",
|
|
153
|
-
"name",
|
|
154
|
-
"state",
|
|
155
|
-
"content",
|
|
156
|
-
"channel_name",
|
|
157
|
-
"lock_ms",
|
|
158
|
-
"dequeue_after",
|
|
159
|
-
"num_attempts"
|
|
158
|
+
"message"."id",
|
|
159
|
+
"message"."name",
|
|
160
|
+
"message"."state",
|
|
161
|
+
"message"."content",
|
|
162
|
+
"message"."channel_name",
|
|
163
|
+
"message"."lock_ms",
|
|
164
|
+
"message"."dequeue_after",
|
|
165
|
+
"message"."num_attempts"
|
|
160
166
|
FROM ${t(e.schema)}."message"
|
|
161
167
|
WHERE "is_locked"
|
|
162
168
|
ORDER BY "dequeue_after" ASC
|
|
@@ -168,31 +174,33 @@ var{defineProperty:R,getOwnPropertyNames:X,getOwnPropertyDescriptor:V}=Object,K=
|
|
|
168
174
|
IF v_message_locked."dequeue_after" <= v_now THEN
|
|
169
175
|
UPDATE ${t(e.schema)}."message" SET
|
|
170
176
|
"num_attempts" = v_message_locked."num_attempts" + 1,
|
|
171
|
-
"dequeue_after" = v_now + (v_message_locked."lock_ms" * INTERVAL '1 millisecond')
|
|
172
|
-
"dequeue_nonce" = v_dequeue_nonce
|
|
177
|
+
"dequeue_after" = v_now + (v_message_locked."lock_ms" * INTERVAL '1 millisecond')
|
|
173
178
|
WHERE "id" = v_message_locked."id";
|
|
174
179
|
|
|
175
180
|
PERFORM ${t(e.schema)}."wake"(v_message_locked."lock_ms");
|
|
176
181
|
|
|
177
|
-
RETURN
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
182
|
+
RETURN QUERY SELECT
|
|
183
|
+
${E(1)},
|
|
184
|
+
NULL::BYTEA,
|
|
185
|
+
NULL::BYTEA,
|
|
186
|
+
JSON_BUILD_OBJECT(
|
|
187
|
+
'id', v_message_locked.id,
|
|
188
|
+
'channel_name', v_message_locked.channel_name,
|
|
189
|
+
'state', v_message_locked.state,
|
|
190
|
+
'name', v_message_locked.name
|
|
191
|
+
'content', v_message_locked.content,
|
|
192
|
+
'num_attempts', v_message_locked.num_attempts
|
|
193
|
+
);
|
|
194
|
+
RETURN;
|
|
187
195
|
END IF;
|
|
188
196
|
|
|
189
197
|
SELECT
|
|
190
|
-
"id",
|
|
191
|
-
"name",
|
|
192
|
-
"release_interval_ms",
|
|
193
|
-
"message_next_id",
|
|
194
|
-
"message_next_dequeue_after",
|
|
195
|
-
"current_concurrency"
|
|
198
|
+
"channel_state"."id",
|
|
199
|
+
"channel_state"."name",
|
|
200
|
+
"channel_state"."release_interval_ms",
|
|
201
|
+
"channel_state"."message_next_id",
|
|
202
|
+
"channel_state"."message_next_dequeue_after",
|
|
203
|
+
"channel_state"."current_concurrency"
|
|
196
204
|
FROM ${t(e.schema)}."channel_state"
|
|
197
205
|
WHERE "message_next_id" IS NOT NULL
|
|
198
206
|
AND ("max_concurrency" IS NULL OR "current_concurrency" < "max_concurrency")
|
|
@@ -208,20 +216,24 @@ var{defineProperty:R,getOwnPropertyNames:X,getOwnPropertyDescriptor:V}=Object,K=
|
|
|
208
216
|
v_message_locked."dequeue_after"
|
|
209
217
|
);
|
|
210
218
|
|
|
211
|
-
RETURN
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
219
|
+
RETURN QUERY SELECT
|
|
220
|
+
${E(0)},
|
|
221
|
+
NULL::BYTEA,
|
|
222
|
+
NULL::BYTEA,
|
|
223
|
+
JSON_BUILD_OBJECT(
|
|
224
|
+
'retry_ms', CEIL(EXTRACT(MILLISECOND FROM v_retry_after - v_now))
|
|
225
|
+
);
|
|
226
|
+
RETURN;
|
|
215
227
|
END IF;
|
|
216
228
|
|
|
217
229
|
SELECT
|
|
218
|
-
"id",
|
|
219
|
-
"name",
|
|
220
|
-
"channel_name",
|
|
221
|
-
"content",
|
|
222
|
-
"num_attempts",
|
|
223
|
-
"state",
|
|
224
|
-
"lock_ms"
|
|
230
|
+
"message"."id",
|
|
231
|
+
"message"."name",
|
|
232
|
+
"message"."channel_name",
|
|
233
|
+
"message"."content",
|
|
234
|
+
"message"."num_attempts",
|
|
235
|
+
"message"."state",
|
|
236
|
+
"message"."lock_ms"
|
|
225
237
|
FROM ${t(e.schema)}."message"
|
|
226
238
|
WHERE "id" = v_channel_state."message_next_id"
|
|
227
239
|
INTO v_message_dequeue;
|
|
@@ -229,15 +241,14 @@ var{defineProperty:R,getOwnPropertyNames:X,getOwnPropertyDescriptor:V}=Object,K=
|
|
|
229
241
|
UPDATE ${t(e.schema)}."message" SET
|
|
230
242
|
"is_locked" = TRUE,
|
|
231
243
|
"num_attempts" = v_message_dequeue."num_attempts" + 1,
|
|
232
|
-
"dequeue_nonce" = v_dequeue_nonce,
|
|
233
244
|
"dequeue_after" = v_now + (v_message_dequeue."lock_ms" * INTERVAL '1 millisecond')
|
|
234
245
|
WHERE "id" = v_message_dequeue."id";
|
|
235
246
|
|
|
236
247
|
PERFORM ${t(e.schema)}."wake"(v_message_dequeue."lock_ms");
|
|
237
248
|
|
|
238
249
|
SELECT
|
|
239
|
-
"id",
|
|
240
|
-
"dequeue_after"
|
|
250
|
+
"message"."id",
|
|
251
|
+
"message"."dequeue_after"
|
|
241
252
|
FROM ${t(e.schema)}."message"
|
|
242
253
|
WHERE NOT "is_locked"
|
|
243
254
|
AND "channel_name" = v_message_dequeue."channel_name"
|
|
@@ -264,61 +275,68 @@ var{defineProperty:R,getOwnPropertyNames:X,getOwnPropertyDescriptor:V}=Object,K=
|
|
|
264
275
|
END IF;
|
|
265
276
|
|
|
266
277
|
|
|
267
|
-
RETURN
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
278
|
+
RETURN QUERY SELECT
|
|
279
|
+
${E(1)},
|
|
280
|
+
v_message_dequeue.content,
|
|
281
|
+
v_message_dequeue.state,
|
|
282
|
+
JSON_BUILD_OBJECT(
|
|
283
|
+
'id', v_message_dequeue.id,
|
|
284
|
+
'channel_name', v_message_dequeue.channel_name,
|
|
285
|
+
'name', v_message_dequeue.name,
|
|
286
|
+
'num_attempts', v_message_dequeue.num_attempts
|
|
287
|
+
);
|
|
288
|
+
RETURN;
|
|
277
289
|
END;
|
|
278
290
|
$$ LANGUAGE plpgsql;
|
|
279
|
-
`]}};class
|
|
280
|
-
SELECT
|
|
281
|
-
|
|
291
|
+
`]}};class i{schema;constructor(e){this.schema=e.schema}async execute(e){let n=await e.query(s`
|
|
292
|
+
SELECT
|
|
293
|
+
result_code,
|
|
294
|
+
metadata,
|
|
295
|
+
content,
|
|
296
|
+
state
|
|
297
|
+
FROM ${t(this.schema)}."message_dequeue"()
|
|
298
|
+
`.value,[]).then((a)=>a.rows[0]);if(n.result_code===0)return{resultType:"MESSAGE_NOT_AVAILABLE",retryMs:n.metadata.retry_ms};else if(n.result_code===1)return{resultType:"MESSAGE_DEQUEUED",message:{id:n.metadata.id,channelName:n.metadata.channel_name,name:n.metadata.name,content:n.content,state:n.state,numAttempts:n.metadata.num_attempts}};else throw new Error("Unexpected dequeue result")}}var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/06-function-message-delete.ts";var B={name:c(__filename),sql:(e)=>{return[s`
|
|
282
299
|
CREATE FUNCTION ${t(e.schema)}."message_delete" (
|
|
283
|
-
p_id
|
|
284
|
-
p_dequeue_nonce UUID
|
|
300
|
+
p_id UUID
|
|
285
301
|
)
|
|
286
|
-
RETURNS
|
|
302
|
+
RETURNS TABLE (
|
|
303
|
+
result_code INTEGER
|
|
304
|
+
) AS $$
|
|
287
305
|
DECLARE
|
|
288
306
|
v_channel_policy RECORD;
|
|
289
307
|
v_channel_state RECORD;
|
|
290
308
|
v_message RECORD;
|
|
291
309
|
BEGIN
|
|
292
310
|
SELECT
|
|
293
|
-
"id",
|
|
294
|
-
"channel_name",
|
|
295
|
-
"
|
|
311
|
+
"message"."id",
|
|
312
|
+
"message"."channel_name",
|
|
313
|
+
"message"."is_locked"
|
|
296
314
|
FROM ${t(e.schema)}."message"
|
|
297
315
|
WHERE "id" = p_id
|
|
298
316
|
FOR UPDATE
|
|
299
317
|
INTO v_message;
|
|
300
318
|
|
|
301
319
|
IF v_message."id" IS NULL THEN
|
|
302
|
-
RETURN
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
RETURN
|
|
307
|
-
|
|
308
|
-
|
|
320
|
+
RETURN QUERY SELECT
|
|
321
|
+
${E(0)};
|
|
322
|
+
RETURN;
|
|
323
|
+
ELSIF NOT v_message."is_locked" THEN
|
|
324
|
+
RETURN QUERY SELECT
|
|
325
|
+
${E(1)};
|
|
326
|
+
RETURN;
|
|
309
327
|
END IF;
|
|
310
328
|
|
|
311
329
|
SELECT
|
|
312
|
-
"id"
|
|
330
|
+
"channel_policy"."id"
|
|
313
331
|
FROM ${t(e.schema)}."channel_policy"
|
|
314
332
|
WHERE "name" = v_message."channel_name"
|
|
315
333
|
FOR SHARE
|
|
316
334
|
INTO v_channel_policy;
|
|
317
335
|
|
|
318
336
|
SELECT
|
|
319
|
-
"id",
|
|
320
|
-
"current_size",
|
|
321
|
-
"current_concurrency"
|
|
337
|
+
"channel_state"."id",
|
|
338
|
+
"channel_state"."current_size",
|
|
339
|
+
"channel_state"."current_concurrency"
|
|
322
340
|
FROM ${t(e.schema)}."channel_state"
|
|
323
341
|
WHERE "name" = v_message."channel_name"
|
|
324
342
|
FOR UPDATE
|
|
@@ -337,51 +355,52 @@ var{defineProperty:R,getOwnPropertyNames:X,getOwnPropertyDescriptor:V}=Object,K=
|
|
|
337
355
|
DELETE FROM ${t(e.schema)}."message"
|
|
338
356
|
WHERE "id" = p_id;
|
|
339
357
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
358
|
+
RETURN QUERY SELECT
|
|
359
|
+
${E(2)};
|
|
360
|
+
RETURN;
|
|
343
361
|
END;
|
|
344
362
|
$$ LANGUAGE plpgsql;
|
|
345
|
-
`]}};class
|
|
346
|
-
SELECT ${t(this.schema)}."message_delete"(
|
|
347
|
-
$
|
|
348
|
-
)
|
|
349
|
-
`.value).then((
|
|
363
|
+
`]}};class l{schema;id;constructor(e){this.schema=e.schema,this.id=e.id}async execute(e){let n=await e.query(s`
|
|
364
|
+
SELECT * FROM ${t(this.schema)}."message_delete"(
|
|
365
|
+
$1
|
|
366
|
+
)
|
|
367
|
+
`.value,[this.id]).then((a)=>a.rows[0]);if(n.result_code===0)return{resultType:"MESSAGE_NOT_FOUND"};else if(n.result_code===1)return{resultType:"STATE_INVALID"};else if(n.result_code===2)return{resultType:"MESSAGE_DELETED"};else throw new Error("Unexpected result")}}var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/07-function-message-defer.ts";var P={name:c(__filename),sql:(e)=>{return[s`
|
|
350
368
|
CREATE FUNCTION ${t(e.schema)}."message_defer" (
|
|
351
|
-
p_id
|
|
352
|
-
p_dequeue_nonce UUID,
|
|
369
|
+
p_id UUID,
|
|
353
370
|
p_delay_ms INTEGER,
|
|
354
|
-
p_state
|
|
371
|
+
p_state BYTEA
|
|
355
372
|
)
|
|
356
|
-
RETURNS
|
|
373
|
+
RETURNS TABLE (
|
|
374
|
+
result_code INTEGER
|
|
375
|
+
) AS $$
|
|
357
376
|
DECLARE
|
|
358
377
|
v_channel_state RECORD;
|
|
359
378
|
v_dequeue_after TIMESTAMP;
|
|
360
379
|
v_message RECORD;
|
|
361
380
|
BEGIN
|
|
362
381
|
SELECT
|
|
363
|
-
"id",
|
|
364
|
-
"channel_name",
|
|
365
|
-
"
|
|
382
|
+
"message"."id",
|
|
383
|
+
"message"."channel_name",
|
|
384
|
+
"message"."is_locked"
|
|
366
385
|
FROM ${t(e.schema)}."message"
|
|
367
386
|
WHERE "id" = p_id
|
|
368
387
|
FOR UPDATE
|
|
369
388
|
INTO v_message;
|
|
370
389
|
|
|
371
390
|
IF v_message."id" IS NULL THEN
|
|
372
|
-
RETURN
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
RETURN
|
|
377
|
-
|
|
378
|
-
|
|
391
|
+
RETURN QUERY SELECT
|
|
392
|
+
${E(0)};
|
|
393
|
+
RETURN;
|
|
394
|
+
ELSIF NOT v_message."is_locked" THEN
|
|
395
|
+
RETURN QUERY SELECT
|
|
396
|
+
${E(1)};
|
|
397
|
+
RETURN;
|
|
379
398
|
END IF;
|
|
380
399
|
|
|
381
400
|
SELECT
|
|
382
|
-
"current_concurrency",
|
|
383
|
-
"message_next_id",
|
|
384
|
-
"message_next_dequeue_after"
|
|
401
|
+
"channel_state"."current_concurrency",
|
|
402
|
+
"channel_state"."message_next_id",
|
|
403
|
+
"channel_state"."message_next_dequeue_after"
|
|
385
404
|
FROM ${t(e.schema)}."channel_state"
|
|
386
405
|
WHERE "name" = v_message."channel_name"
|
|
387
406
|
FOR UPDATE
|
|
@@ -412,97 +431,95 @@ var{defineProperty:R,getOwnPropertyNames:X,getOwnPropertyDescriptor:V}=Object,K=
|
|
|
412
431
|
|
|
413
432
|
PERFORM ${t(e.schema)}."wake"(GREATEST(0, p_delay_ms));
|
|
414
433
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
434
|
+
RETURN QUERY SELECT
|
|
435
|
+
${E(2)};
|
|
436
|
+
RETURN;
|
|
418
437
|
END;
|
|
419
438
|
$$ LANGUAGE plpgsql;
|
|
420
|
-
`]}};class
|
|
421
|
-
SELECT ${t(this.schema)}."message_defer"(
|
|
422
|
-
$
|
|
423
|
-
$
|
|
424
|
-
$
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
`)
|
|
429
|
-
`).trim()};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/00-table-channel-policy.ts",b={name:E(__filename),sql:(e)=>{return[a`
|
|
439
|
+
`]}};class h{schema;id;delayMs;state;constructor(e){let n=e.delayMs===void 0?N:e.delayMs;this.schema=e.schema,this.id=e.id,this.delayMs=n,this.state=e.state??null}async execute(e){let n=await e.query(s`
|
|
440
|
+
SELECT * FROM ${t(this.schema)}."message_defer"(
|
|
441
|
+
$1,
|
|
442
|
+
$2,
|
|
443
|
+
$3
|
|
444
|
+
)
|
|
445
|
+
`.value,[this.id,this.delayMs,this.state]).then((a)=>a.rows[0]);if(n.result_code===0)return{resultType:"MESSAGE_NOT_FOUND"};else if(n.result_code===1)return{resultType:"STATE_INVALID"};else if(n.result_code===2)return{resultType:"MESSAGE_DEFERRED"};else throw new Error("Unexpected result")}}var H=(e)=>{let n=e.split(`
|
|
446
|
+
`),a=Number.MAX_SAFE_INTEGER;for(let _ of n){if(_.trim().length===0)continue;let T=_.search(/\S/);a=Math.min(a,T)}return n.map((_)=>_.slice(a)).join(`
|
|
447
|
+
`).trim()};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/00-table-channel-policy.ts",k={name:c(__filename),sql:(e)=>{return[s`
|
|
430
448
|
CREATE TABLE ${t(e.schema)}."channel_policy" (
|
|
431
|
-
"id"
|
|
449
|
+
"id" UUID NOT NULL DEFAULT GEN_RANDOM_UUID(),
|
|
432
450
|
"name" TEXT NOT NULL,
|
|
433
451
|
"max_size" INTEGER,
|
|
434
452
|
"max_concurrency" INTEGER,
|
|
435
453
|
"release_interval_ms" INTEGER,
|
|
436
454
|
PRIMARY KEY ("id")
|
|
437
455
|
);
|
|
438
|
-
`,
|
|
456
|
+
`,s`
|
|
439
457
|
CREATE UNIQUE INDEX "channel_policy_name_ux"
|
|
440
458
|
ON ${t(e.schema)}."channel_policy" ("name");
|
|
441
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/01-table-channel-state.ts",
|
|
459
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/01-table-channel-state.ts",b={name:c(__filename),sql:(e)=>{return[s`
|
|
442
460
|
CREATE TABLE ${t(e.schema)}."channel_state" (
|
|
443
|
-
"id"
|
|
461
|
+
"id" UUID NOT NULL DEFAULT GEN_RANDOM_UUID(),
|
|
444
462
|
"name" TEXT NOT NULL,
|
|
445
463
|
"max_size" INTEGER,
|
|
446
464
|
"max_concurrency" INTEGER,
|
|
447
465
|
"release_interval_ms" INTEGER,
|
|
448
466
|
"current_size" INTEGER NOT NULL,
|
|
449
467
|
"current_concurrency" INTEGER NOT NULL,
|
|
450
|
-
"message_next_id"
|
|
468
|
+
"message_next_id" UUID,
|
|
451
469
|
"message_next_dequeue_after" TIMESTAMP,
|
|
452
470
|
PRIMARY KEY ("id")
|
|
453
471
|
);
|
|
454
|
-
`,
|
|
472
|
+
`,s`
|
|
455
473
|
CREATE UNIQUE INDEX "channel_state_name_ux"
|
|
456
474
|
ON ${t(e.schema)}."channel_state" ("name");
|
|
457
|
-
`,
|
|
475
|
+
`,s`
|
|
458
476
|
CREATE INDEX "channel_state_dequeue_ix"
|
|
459
477
|
ON ${t(e.schema)}."channel_state" (
|
|
460
478
|
"message_next_dequeue_after" ASC
|
|
461
479
|
) WHERE "message_next_id" IS NOT NULL
|
|
462
480
|
AND ("max_concurrency" IS NULL OR "current_concurrency" < "max_concurrency");
|
|
463
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/02-table-message.ts",z={name:
|
|
481
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/02-table-message.ts",z={name:c(__filename),sql:(e)=>{return[s`
|
|
464
482
|
CREATE TABLE ${t(e.schema)}."message" (
|
|
465
|
-
"id"
|
|
483
|
+
"id" UUID NOT NULL,
|
|
466
484
|
"channel_name" TEXT NOT NULL,
|
|
467
|
-
"dequeue_nonce" UUID,
|
|
468
485
|
"name" TEXT,
|
|
469
|
-
"content"
|
|
470
|
-
"state"
|
|
486
|
+
"content" BYTEA NOT NULL,
|
|
487
|
+
"state" BYTEA,
|
|
471
488
|
"lock_ms" INTEGER NOT NULL,
|
|
472
489
|
"is_locked" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
473
490
|
"num_attempts" INTEGER NOT NULL DEFAULT 0,
|
|
474
491
|
"dequeue_after" TIMESTAMP NOT NULL,
|
|
475
492
|
PRIMARY KEY ("id")
|
|
476
493
|
);
|
|
477
|
-
`,
|
|
494
|
+
`,s`
|
|
478
495
|
CREATE UNIQUE INDEX "message_name_ux"
|
|
479
496
|
ON ${t(e.schema)}."message" (
|
|
480
497
|
"channel_name",
|
|
481
498
|
"name"
|
|
482
499
|
) WHERE "num_attempts" = 0
|
|
483
|
-
`,
|
|
500
|
+
`,s`
|
|
484
501
|
CREATE INDEX "message_dequeue_ix"
|
|
485
502
|
ON ${t(e.schema)}."message" (
|
|
486
503
|
"channel_name",
|
|
487
504
|
"dequeue_after" ASC,
|
|
488
505
|
"id" ASC
|
|
489
506
|
) WHERE NOT "is_locked";
|
|
490
|
-
`,
|
|
507
|
+
`,s`
|
|
491
508
|
CREATE INDEX "message_locked_dequeue_ix"
|
|
492
509
|
ON ${t(e.schema)}."message" (
|
|
493
510
|
"dequeue_after" ASC
|
|
494
511
|
) WHERE "is_locked";
|
|
495
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/03-function-wake.ts",w={name:
|
|
512
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/03-function-wake.ts",w={name:c(__filename),sql:(e)=>{let n=u.toString(e.schema);return[s`
|
|
496
513
|
CREATE FUNCTION ${t(e.schema)}."wake" (
|
|
497
514
|
p_delay_ms INTEGER
|
|
498
515
|
) RETURNS VOID AS $$
|
|
499
516
|
BEGIN
|
|
500
|
-
IF ${
|
|
501
|
-
PERFORM PG_NOTIFY(${
|
|
517
|
+
IF ${E(e.useWake)} THEN
|
|
518
|
+
PERFORM PG_NOTIFY(${E(n)}, p_delay_ms::TEXT);
|
|
502
519
|
END IF;
|
|
503
520
|
END;
|
|
504
521
|
$$ LANGUAGE plpgsql;
|
|
505
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/08-function-channel-policy-set.ts",W={name:
|
|
522
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/08-function-channel-policy-set.ts",W={name:c(__filename),sql:(e)=>{return[s`
|
|
506
523
|
CREATE FUNCTION ${t(e.schema)}."channel_policy_set" (
|
|
507
524
|
p_name TEXT,
|
|
508
525
|
p_max_size INTEGER,
|
|
@@ -534,7 +551,7 @@ var{defineProperty:R,getOwnPropertyNames:X,getOwnPropertyDescriptor:V}=Object,K=
|
|
|
534
551
|
PERFORM ${t(e.schema)}."wake"(0);
|
|
535
552
|
END;
|
|
536
553
|
$$ LANGUAGE plpgsql;
|
|
537
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/09-function-channel-policy-clear.ts",
|
|
554
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/09-function-channel-policy-clear.ts",Y={name:c(__filename),sql:(e)=>{return[s`
|
|
538
555
|
CREATE FUNCTION ${t(e.schema)}."channel_policy_clear" (
|
|
539
556
|
p_name TEXT
|
|
540
557
|
) RETURNS VOID AS $$
|
|
@@ -545,8 +562,8 @@ var{defineProperty:R,getOwnPropertyNames:X,getOwnPropertyDescriptor:V}=Object,K=
|
|
|
545
562
|
WHERE "name" = p_name;
|
|
546
563
|
|
|
547
564
|
SELECT
|
|
548
|
-
"id",
|
|
549
|
-
"current_size"
|
|
565
|
+
"channel_state"."id",
|
|
566
|
+
"channel_state"."current_size"
|
|
550
567
|
FROM ${t(e.schema)}."channel_state"
|
|
551
568
|
WHERE "name" = p_name
|
|
552
569
|
FOR UPDATE
|
|
@@ -566,4 +583,4 @@ var{defineProperty:R,getOwnPropertyNames:X,getOwnPropertyDescriptor:V}=Object,K=
|
|
|
566
583
|
PERFORM ${t(e.schema)}."wake"(0);
|
|
567
584
|
END;
|
|
568
585
|
$$ LANGUAGE plpgsql;
|
|
569
|
-
`]}};class
|
|
586
|
+
`]}};class S{schema;channelName;registerFn;constructor(e){this.schema=e.schema,this.channelName=e.channelName,this.registerFn=e.registerFn}create(e){let n=new o({schema:this.schema,channelName:this.channelName,name:e.name,content:e.content,lockMs:e.lockMs,delayMs:e.delayMs}),a=new Promise((_)=>{this.registerFn({sortKey:JSON.stringify([n.channelName,n.name,n.createdAt.toISOString()]),execute:(T)=>n.execute(T).then((Q)=>_(Q))})});return{messageId:n.id,promise:a}}}class A{schema;channelName;registerFn;constructor(e){this.schema=e.schema,this.channelName=e.channelName,this.registerFn=e.registerFn}set(e){let n=new m({schema:this.schema,channelName:this.channelName,maxConcurrency:e.maxConcurrency,maxSize:e.maxSize,releaseIntervalMs:e.releaseIntervalMs});this.registerFn({sortKey:JSON.stringify([n.channelName,null,n.createdAt.toISOString()]),execute:async(a)=>{await n.execute(a)}})}clear(){let e=new r({schema:this.schema,channelName:this.channelName});this.registerFn({sortKey:JSON.stringify([e.channelName,null,e.createdAt.toISOString()]),execute:async(n)=>{await e.execute(n)}})}}class L{policy;message;constructor(e){this.message=new S(e),this.policy=new A(e)}}var Ee=(e,n)=>{return e.sortKey.localeCompare(n.sortKey)};class I{commands;schema;constructor(e){this.commands=[],this.schema=e.schema}channel(e){return new L({schema:this.schema,channelName:e,registerFn:(n)=>{this.commands.push(n)}})}async execute(e){for(let n of this.commands.sort(Ee))await n.execute(e.databaseClient)}}class U{schema;channelName;constructor(e){this.schema=e.schema,this.channelName=e.channelName}async create(e){return new o({schema:this.schema,channelName:this.channelName,name:e.name,content:e.content,lockMs:e.lockMs,delayMs:e.delayMs}).execute(e.databaseClient)}}class D{schema;channelName;constructor(e){this.schema=e.schema,this.channelName=e.channelName}set(e){return new m({schema:this.schema,channelName:this.channelName,maxConcurrency:e.maxConcurrency,maxSize:e.maxSize,releaseIntervalMs:e.releaseIntervalMs}).execute(e.databaseClient)}clear(e){return new r({schema:this.schema,channelName:this.channelName}).execute(e.databaseClient)}}class O{policy;message;constructor(e){this.message=new U({schema:e.schema,channelName:e.channelName}),this.policy=new D({schema:e.schema,channelName:e.channelName})}}class v{schema;id;channelName;name;content;state;numAttempts;constructor(e){this.schema=e.schema,this.id=e.id,this.channelName=e.channelName,this.name=e.name,this.content=e.content,this.state=e.state,this.numAttempts=e.numAttempts}async defer(e){return new h({schema:this.schema,id:this.id,delayMs:e.delayMs,state:e.state}).execute(e.databaseClient)}async delete(e){return new l({schema:this.schema,id:this.id}).execute(e.databaseClient)}}class y{schema;constructor(e){this.schema=e}async dequeue(e){let a=await new i({schema:this.schema}).execute(e.databaseClient);if(a.resultType==="MESSAGE_DEQUEUED")return{resultType:"MESSAGE_DEQUEUED",message:new v({schema:this.schema,id:a.message.id,channelName:a.message.channelName,name:a.message.name,content:a.message.content,state:a.message.state,numAttempts:a.message.numAttempts})};else return a}channel(e){return new O({schema:this.schema,channelName:e})}batch(){return new I({schema:this.schema})}migrations(e){return[k,b,z,w,F,G,B,P,W,Y].map((n)=>({name:n.name,sql:n.sql({schema:this.schema,useWake:e.useWake??$}).map((a)=>H(a.value))})).sort((n,a)=>n.name.localeCompare(a.name))}wakeChannel(){return u.toString(this.schema)}}
|