lonnymq 0.0.5 → 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 +40 -52
- package/dist/index.d.ts +15 -32
- package/dist/index.js +61 -73
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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
|
)
|
|
@@ -9,16 +9,16 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
9
9
|
$3::INTEGER,
|
|
10
10
|
$4::INTEGER
|
|
11
11
|
)
|
|
12
|
-
`.value,[this.channelName,this.maxSize,this.maxConcurrency,this.releaseIntervalMs])}}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
17
|
p_content BYTEA,
|
|
17
18
|
p_lock_ms INTEGER,
|
|
18
19
|
p_delay_ms INTEGER
|
|
19
20
|
) RETURNS TABLE (
|
|
20
|
-
result_code INTEGER
|
|
21
|
-
metadata JSON
|
|
21
|
+
result_code INTEGER
|
|
22
22
|
) AS $$
|
|
23
23
|
DECLARE
|
|
24
24
|
v_now TIMESTAMP;
|
|
@@ -70,18 +70,19 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
70
70
|
|
|
71
71
|
IF v_channel_state."current_size" >= v_channel_policy."max_size" THEN
|
|
72
72
|
RETURN QUERY SELECT
|
|
73
|
-
${E(1)}
|
|
74
|
-
JSON_BUILD_OBJECT();
|
|
73
|
+
${E(1)};
|
|
75
74
|
RETURN;
|
|
76
75
|
END IF;
|
|
77
76
|
|
|
78
77
|
INSERT INTO ${t(e.schema)}."message" (
|
|
78
|
+
"id",
|
|
79
79
|
"channel_name",
|
|
80
80
|
"name",
|
|
81
81
|
"content",
|
|
82
82
|
"lock_ms",
|
|
83
83
|
"dequeue_after"
|
|
84
84
|
) VALUES (
|
|
85
|
+
p_id,
|
|
85
86
|
p_channel_name,
|
|
86
87
|
p_name,
|
|
87
88
|
p_content,
|
|
@@ -94,14 +95,12 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
94
95
|
"name" = EXCLUDED."name"
|
|
95
96
|
RETURNING
|
|
96
97
|
"id",
|
|
97
|
-
"xmax",
|
|
98
98
|
"dequeue_after"
|
|
99
99
|
INTO v_message;
|
|
100
100
|
|
|
101
|
-
IF v_message."
|
|
101
|
+
IF v_message."id" != p_id THEN
|
|
102
102
|
RETURN QUERY SELECT
|
|
103
|
-
${E(2)}
|
|
104
|
-
JSON_BUILD_OBJECT('id', v_message."id");
|
|
103
|
+
${E(2)};
|
|
105
104
|
RETURN;
|
|
106
105
|
END IF;
|
|
107
106
|
|
|
@@ -123,20 +122,20 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
123
122
|
PERFORM ${t(e.schema)}."wake"(GREATEST(0, p_delay_ms));
|
|
124
123
|
|
|
125
124
|
RETURN QUERY SELECT
|
|
126
|
-
${E(0)}
|
|
127
|
-
JSON_BUILD_OBJECT('id', v_message."id");
|
|
125
|
+
${E(0)};
|
|
128
126
|
RETURN;
|
|
129
127
|
END;
|
|
130
128
|
$$ LANGUAGE plpgsql;
|
|
131
|
-
`]}};class o{schema;channelName;name;content;lockMs;delayMs;createdAt;constructor(e){let n=e.name??null,a=e.lockMs===void 0?
|
|
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`
|
|
132
130
|
SELECT * FROM ${t(this.schema)}."message_create"(
|
|
133
131
|
$1,
|
|
134
132
|
$2,
|
|
135
133
|
$3,
|
|
136
|
-
$4
|
|
137
|
-
$5::INTEGER
|
|
134
|
+
$4,
|
|
135
|
+
$5::INTEGER,
|
|
136
|
+
$6::INTEGER
|
|
138
137
|
)
|
|
139
|
-
`.value,[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"
|
|
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`
|
|
140
139
|
CREATE FUNCTION ${t(e.schema)}."message_dequeue" ()
|
|
141
140
|
RETURNS TABLE (
|
|
142
141
|
result_code INTEGER,
|
|
@@ -146,7 +145,6 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
146
145
|
) AS $$
|
|
147
146
|
DECLARE
|
|
148
147
|
v_now TIMESTAMP;
|
|
149
|
-
v_dequeue_nonce UUID;
|
|
150
148
|
v_channel_state RECORD;
|
|
151
149
|
v_message_locked RECORD;
|
|
152
150
|
v_retry_after TIMESTAMP;
|
|
@@ -155,7 +153,6 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
155
153
|
v_message_next_dequeue_after TIMESTAMP;
|
|
156
154
|
BEGIN
|
|
157
155
|
v_now := NOW();
|
|
158
|
-
v_dequeue_nonce := GEN_RANDOM_UUID();
|
|
159
156
|
|
|
160
157
|
SELECT
|
|
161
158
|
"message"."id",
|
|
@@ -177,8 +174,7 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
177
174
|
IF v_message_locked."dequeue_after" <= v_now THEN
|
|
178
175
|
UPDATE ${t(e.schema)}."message" SET
|
|
179
176
|
"num_attempts" = v_message_locked."num_attempts" + 1,
|
|
180
|
-
"dequeue_after" = v_now + (v_message_locked."lock_ms" * INTERVAL '1 millisecond')
|
|
181
|
-
"dequeue_nonce" = v_dequeue_nonce
|
|
177
|
+
"dequeue_after" = v_now + (v_message_locked."lock_ms" * INTERVAL '1 millisecond')
|
|
182
178
|
WHERE "id" = v_message_locked."id";
|
|
183
179
|
|
|
184
180
|
PERFORM ${t(e.schema)}."wake"(v_message_locked."lock_ms");
|
|
@@ -191,8 +187,7 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
191
187
|
'id', v_message_locked.id,
|
|
192
188
|
'channel_name', v_message_locked.channel_name,
|
|
193
189
|
'state', v_message_locked.state,
|
|
194
|
-
'name', v_message_locked.name
|
|
195
|
-
'dequeue_nonce', v_dequeue_nonce,
|
|
190
|
+
'name', v_message_locked.name
|
|
196
191
|
'content', v_message_locked.content,
|
|
197
192
|
'num_attempts', v_message_locked.num_attempts
|
|
198
193
|
);
|
|
@@ -246,7 +241,6 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
246
241
|
UPDATE ${t(e.schema)}."message" SET
|
|
247
242
|
"is_locked" = TRUE,
|
|
248
243
|
"num_attempts" = v_message_dequeue."num_attempts" + 1,
|
|
249
|
-
"dequeue_nonce" = v_dequeue_nonce,
|
|
250
244
|
"dequeue_after" = v_now + (v_message_dequeue."lock_ms" * INTERVAL '1 millisecond')
|
|
251
245
|
WHERE "id" = v_message_dequeue."id";
|
|
252
246
|
|
|
@@ -288,24 +282,22 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
288
282
|
JSON_BUILD_OBJECT(
|
|
289
283
|
'id', v_message_dequeue.id,
|
|
290
284
|
'channel_name', v_message_dequeue.channel_name,
|
|
291
|
-
'dequeue_nonce', v_dequeue_nonce,
|
|
292
285
|
'name', v_message_dequeue.name,
|
|
293
286
|
'num_attempts', v_message_dequeue.num_attempts
|
|
294
287
|
);
|
|
295
288
|
RETURN;
|
|
296
289
|
END;
|
|
297
290
|
$$ LANGUAGE plpgsql;
|
|
298
|
-
`]}};class
|
|
291
|
+
`]}};class i{schema;constructor(e){this.schema=e.schema}async execute(e){let n=await e.query(s`
|
|
299
292
|
SELECT
|
|
300
293
|
result_code,
|
|
301
294
|
metadata,
|
|
302
295
|
content,
|
|
303
296
|
state
|
|
304
297
|
FROM ${t(this.schema)}."message_dequeue"()
|
|
305
|
-
`.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:
|
|
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`
|
|
306
299
|
CREATE FUNCTION ${t(e.schema)}."message_delete" (
|
|
307
|
-
p_id
|
|
308
|
-
p_dequeue_nonce UUID
|
|
300
|
+
p_id UUID
|
|
309
301
|
)
|
|
310
302
|
RETURNS TABLE (
|
|
311
303
|
result_code INTEGER
|
|
@@ -318,7 +310,7 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
318
310
|
SELECT
|
|
319
311
|
"message"."id",
|
|
320
312
|
"message"."channel_name",
|
|
321
|
-
"message"."
|
|
313
|
+
"message"."is_locked"
|
|
322
314
|
FROM ${t(e.schema)}."message"
|
|
323
315
|
WHERE "id" = p_id
|
|
324
316
|
FOR UPDATE
|
|
@@ -328,7 +320,7 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
328
320
|
RETURN QUERY SELECT
|
|
329
321
|
${E(0)};
|
|
330
322
|
RETURN;
|
|
331
|
-
|
|
323
|
+
ELSIF NOT v_message."is_locked" THEN
|
|
332
324
|
RETURN QUERY SELECT
|
|
333
325
|
${E(1)};
|
|
334
326
|
RETURN;
|
|
@@ -368,15 +360,13 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
368
360
|
RETURN;
|
|
369
361
|
END;
|
|
370
362
|
$$ LANGUAGE plpgsql;
|
|
371
|
-
`]}};class
|
|
363
|
+
`]}};class l{schema;id;constructor(e){this.schema=e.schema,this.id=e.id}async execute(e){let n=await e.query(s`
|
|
372
364
|
SELECT * FROM ${t(this.schema)}."message_delete"(
|
|
373
|
-
$1
|
|
374
|
-
$2
|
|
365
|
+
$1
|
|
375
366
|
)
|
|
376
|
-
`.value,[this.id
|
|
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`
|
|
377
368
|
CREATE FUNCTION ${t(e.schema)}."message_defer" (
|
|
378
|
-
p_id
|
|
379
|
-
p_dequeue_nonce UUID,
|
|
369
|
+
p_id UUID,
|
|
380
370
|
p_delay_ms INTEGER,
|
|
381
371
|
p_state BYTEA
|
|
382
372
|
)
|
|
@@ -391,7 +381,7 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
391
381
|
SELECT
|
|
392
382
|
"message"."id",
|
|
393
383
|
"message"."channel_name",
|
|
394
|
-
"message"."
|
|
384
|
+
"message"."is_locked"
|
|
395
385
|
FROM ${t(e.schema)}."message"
|
|
396
386
|
WHERE "id" = p_id
|
|
397
387
|
FOR UPDATE
|
|
@@ -401,7 +391,7 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
401
391
|
RETURN QUERY SELECT
|
|
402
392
|
${E(0)};
|
|
403
393
|
RETURN;
|
|
404
|
-
|
|
394
|
+
ELSIF NOT v_message."is_locked" THEN
|
|
405
395
|
RETURN QUERY SELECT
|
|
406
396
|
${E(1)};
|
|
407
397
|
RETURN;
|
|
@@ -446,18 +436,17 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
446
436
|
RETURN;
|
|
447
437
|
END;
|
|
448
438
|
$$ LANGUAGE plpgsql;
|
|
449
|
-
`]}};class
|
|
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`
|
|
450
440
|
SELECT * FROM ${t(this.schema)}."message_defer"(
|
|
451
441
|
$1,
|
|
452
442
|
$2,
|
|
453
|
-
$3
|
|
454
|
-
$4
|
|
443
|
+
$3
|
|
455
444
|
)
|
|
456
|
-
`.value,[this.id,this.
|
|
457
|
-
`),a=Number.MAX_SAFE_INTEGER;for(let _ of n){if(_.trim().length===0)continue;let
|
|
458
|
-
`).trim()};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/00-table-channel-policy.ts",
|
|
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`
|
|
459
448
|
CREATE TABLE ${t(e.schema)}."channel_policy" (
|
|
460
|
-
"id"
|
|
449
|
+
"id" UUID NOT NULL DEFAULT GEN_RANDOM_UUID(),
|
|
461
450
|
"name" TEXT NOT NULL,
|
|
462
451
|
"max_size" INTEGER,
|
|
463
452
|
"max_concurrency" INTEGER,
|
|
@@ -467,16 +456,16 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
467
456
|
`,s`
|
|
468
457
|
CREATE UNIQUE INDEX "channel_policy_name_ux"
|
|
469
458
|
ON ${t(e.schema)}."channel_policy" ("name");
|
|
470
|
-
`]}};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`
|
|
471
460
|
CREATE TABLE ${t(e.schema)}."channel_state" (
|
|
472
|
-
"id"
|
|
461
|
+
"id" UUID NOT NULL DEFAULT GEN_RANDOM_UUID(),
|
|
473
462
|
"name" TEXT NOT NULL,
|
|
474
463
|
"max_size" INTEGER,
|
|
475
464
|
"max_concurrency" INTEGER,
|
|
476
465
|
"release_interval_ms" INTEGER,
|
|
477
466
|
"current_size" INTEGER NOT NULL,
|
|
478
467
|
"current_concurrency" INTEGER NOT NULL,
|
|
479
|
-
"message_next_id"
|
|
468
|
+
"message_next_id" UUID,
|
|
480
469
|
"message_next_dequeue_after" TIMESTAMP,
|
|
481
470
|
PRIMARY KEY ("id")
|
|
482
471
|
);
|
|
@@ -491,9 +480,8 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
491
480
|
AND ("max_concurrency" IS NULL OR "current_concurrency" < "max_concurrency");
|
|
492
481
|
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/02-table-message.ts",z={name:c(__filename),sql:(e)=>{return[s`
|
|
493
482
|
CREATE TABLE ${t(e.schema)}."message" (
|
|
494
|
-
"id"
|
|
483
|
+
"id" UUID NOT NULL,
|
|
495
484
|
"channel_name" TEXT NOT NULL,
|
|
496
|
-
"dequeue_nonce" UUID,
|
|
497
485
|
"name" TEXT,
|
|
498
486
|
"content" BYTEA NOT NULL,
|
|
499
487
|
"state" BYTEA,
|
|
@@ -521,7 +509,7 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
521
509
|
ON ${t(e.schema)}."message" (
|
|
522
510
|
"dequeue_after" ASC
|
|
523
511
|
) WHERE "is_locked";
|
|
524
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/03-function-wake.ts",w={name:c(__filename),sql:(e)=>{let n=
|
|
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`
|
|
525
513
|
CREATE FUNCTION ${t(e.schema)}."wake" (
|
|
526
514
|
p_delay_ms INTEGER
|
|
527
515
|
) RETURNS VOID AS $$
|
|
@@ -595,4 +583,4 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
595
583
|
PERFORM ${t(e.schema)}."wake"(0);
|
|
596
584
|
END;
|
|
597
585
|
$$ LANGUAGE plpgsql;
|
|
598
|
-
`]}};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)}}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,18 +1,5 @@
|
|
|
1
1
|
// Generated by dts-bundle-generator v9.5.1
|
|
2
2
|
|
|
3
|
-
export type DeferredGetResult<T> = {
|
|
4
|
-
resultType: "RESULT_NOT_SET";
|
|
5
|
-
} | {
|
|
6
|
-
resultType: "RESULT_SET";
|
|
7
|
-
value: T;
|
|
8
|
-
};
|
|
9
|
-
export declare class Deferred<T> {
|
|
10
|
-
private value;
|
|
11
|
-
private isSet;
|
|
12
|
-
constructor();
|
|
13
|
-
get(): DeferredGetResult<T>;
|
|
14
|
-
set(value: T): void;
|
|
15
|
-
}
|
|
16
3
|
export type DatabaseClientQueryResult = {
|
|
17
4
|
rows: Array<Record<string, unknown>>;
|
|
18
5
|
};
|
|
@@ -49,11 +36,9 @@ export declare class ChannelPolicySetCommand {
|
|
|
49
36
|
}
|
|
50
37
|
export type MessageCreateCommandResultMessageCreated = {
|
|
51
38
|
resultType: "MESSAGE_CREATED";
|
|
52
|
-
id: bigint;
|
|
53
39
|
};
|
|
54
40
|
export type MessageCreateCommandResultMessageDeduplicated = {
|
|
55
41
|
resultType: "MESSAGE_DEDUPLICATED";
|
|
56
|
-
id: bigint;
|
|
57
42
|
};
|
|
58
43
|
export type MessageCreateCommandResultMessageDropped = {
|
|
59
44
|
resultType: "MESSAGE_DROPPED";
|
|
@@ -65,6 +50,7 @@ export declare class MessageCreateCommand {
|
|
|
65
50
|
readonly name: string | null;
|
|
66
51
|
readonly content: Buffer;
|
|
67
52
|
readonly lockMs: number;
|
|
53
|
+
readonly id: string;
|
|
68
54
|
readonly delayMs: number;
|
|
69
55
|
readonly createdAt: Date;
|
|
70
56
|
constructor(params: {
|
|
@@ -80,11 +66,10 @@ export declare class MessageCreateCommand {
|
|
|
80
66
|
export type MessageDequeueCommandResultMessageDequeued = {
|
|
81
67
|
resultType: "MESSAGE_DEQUEUED";
|
|
82
68
|
message: {
|
|
83
|
-
id:
|
|
69
|
+
id: string;
|
|
84
70
|
channelName: string;
|
|
85
71
|
name: string | null;
|
|
86
72
|
content: Buffer;
|
|
87
|
-
dequeueNonce: string;
|
|
88
73
|
state: Buffer | null;
|
|
89
74
|
numAttempts: number;
|
|
90
75
|
};
|
|
@@ -113,12 +98,10 @@ export type MessageDeleteCommandResultMessageDeleted = {
|
|
|
113
98
|
export type MessageDeleteCommandResult = MessageDeleteCommandResultMessageNotFound | MessageDeleteCommandResultStateInvalid | MessageDeleteCommandResultMessageDeleted;
|
|
114
99
|
export declare class MessageDeleteCommand {
|
|
115
100
|
readonly schema: string;
|
|
116
|
-
readonly id:
|
|
117
|
-
readonly dequeueNonce: string;
|
|
101
|
+
readonly id: string;
|
|
118
102
|
constructor(params: {
|
|
119
103
|
schema: string;
|
|
120
|
-
id:
|
|
121
|
-
dequeueNonce: string;
|
|
104
|
+
id: string;
|
|
122
105
|
});
|
|
123
106
|
execute(databaseClient: DatabaseClient): Promise<MessageDeleteCommandResult>;
|
|
124
107
|
}
|
|
@@ -134,19 +117,21 @@ export type MessageDeferCommandResultMessageDeferred = {
|
|
|
134
117
|
export type MessageDeferCommandResult = MessageDeferCommandResultMessageNotFound | MessageDeferCommandResultStateInvalid | MessageDeferCommandResultMessageDeferred;
|
|
135
118
|
export declare class MessageDeferCommand {
|
|
136
119
|
readonly schema: string;
|
|
137
|
-
readonly id:
|
|
138
|
-
readonly dequeueNonce: string;
|
|
120
|
+
readonly id: string;
|
|
139
121
|
readonly delayMs: number;
|
|
140
122
|
readonly state: Buffer | null;
|
|
141
123
|
constructor(params: {
|
|
142
124
|
schema: string;
|
|
143
|
-
id:
|
|
144
|
-
dequeueNonce: string;
|
|
125
|
+
id: string;
|
|
145
126
|
delayMs?: number;
|
|
146
127
|
state?: Buffer | null;
|
|
147
128
|
});
|
|
148
129
|
execute(databaseClient: DatabaseClient): Promise<MessageDeferCommandResult>;
|
|
149
130
|
}
|
|
131
|
+
export type QueueBatchChannelMessageCreateResult = {
|
|
132
|
+
messageId: string;
|
|
133
|
+
promise: Promise<MessageCreateCommandResult>;
|
|
134
|
+
};
|
|
150
135
|
export declare class QueueBatchChannelMessage {
|
|
151
136
|
private readonly schema;
|
|
152
137
|
private readonly channelName;
|
|
@@ -161,7 +146,7 @@ export declare class QueueBatchChannelMessage {
|
|
|
161
146
|
lockMs?: number;
|
|
162
147
|
content: Buffer;
|
|
163
148
|
delayMs?: number;
|
|
164
|
-
}):
|
|
149
|
+
}): QueueBatchChannelMessageCreateResult;
|
|
165
150
|
}
|
|
166
151
|
export declare class QueueBatchChannelPolicy {
|
|
167
152
|
private readonly schema;
|
|
@@ -176,8 +161,8 @@ export declare class QueueBatchChannelPolicy {
|
|
|
176
161
|
maxConcurrency?: number | null;
|
|
177
162
|
maxSize?: number | null;
|
|
178
163
|
releaseIntervalMs?: number | null;
|
|
179
|
-
}):
|
|
180
|
-
clear():
|
|
164
|
+
}): void;
|
|
165
|
+
clear(): void;
|
|
181
166
|
}
|
|
182
167
|
export declare class QueueBatchChannel {
|
|
183
168
|
readonly policy: QueueBatchChannelPolicy;
|
|
@@ -246,17 +231,15 @@ export declare class QueueChannel {
|
|
|
246
231
|
}
|
|
247
232
|
export declare class QueueMessage {
|
|
248
233
|
private readonly schema;
|
|
249
|
-
readonly id:
|
|
234
|
+
readonly id: string;
|
|
250
235
|
readonly channelName: string;
|
|
251
236
|
readonly name: string | null;
|
|
252
237
|
readonly content: Buffer;
|
|
253
|
-
readonly dequeueNonce: string;
|
|
254
238
|
readonly state: Buffer | null;
|
|
255
239
|
readonly numAttempts: number;
|
|
256
240
|
constructor(params: {
|
|
257
241
|
schema: string;
|
|
258
|
-
id:
|
|
259
|
-
dequeueNonce: string;
|
|
242
|
+
id: string;
|
|
260
243
|
channelName: string;
|
|
261
244
|
name: string | null;
|
|
262
245
|
content: Buffer;
|
package/dist/index.js
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
var
|
|
1
|
+
var c=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=>({nodeType:"RAW",value:e}),W=(e)=>{return`'${e.replace(/'/g,"''")}'`},Y=(e)=>{if(e===null)return"NULL";else if(typeof e==="string")return W(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}`)},Q=(e)=>{return`"${e.replace(/"/g,'""')}"`},V=(e)=>{if(e.nodeType==="VALUE")return Y(e.value);else if(e.nodeType==="REF")return Q(e.value);else if(e.nodeType==="RAW")return e.value;else throw new Error("Unsupported SQL node type")};var a=(e,...t)=>{let s=[];for(let E=0;E<e.length;E+=1)if(s.push(e[E]),E<t.length)s.push(V(t[E]));return w(s.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(a`
|
|
2
2
|
SELECT 1 FROM ${n(this.schema)}."channel_policy_clear"(
|
|
3
3
|
$1
|
|
4
4
|
)
|
|
5
|
-
`.value,[this.channelName])}}class m{schema;channelName;maxSize;maxConcurrency;releaseIntervalMs;createdAt;constructor(e){this.schema=e.schema,this.channelName=e.channelName;let t=e.maxConcurrency??null;this.maxConcurrency=t!==null?Math.max(0,t):null;let
|
|
5
|
+
`.value,[this.channelName])}}class m{schema;channelName;maxSize;maxConcurrency;releaseIntervalMs;createdAt;constructor(e){this.schema=e.schema,this.channelName=e.channelName;let t=e.maxConcurrency??null;this.maxConcurrency=t!==null?Math.max(0,t):null;let s=e.maxSize??null;this.maxSize=s!==null?Math.max(0,s):null;let E=e.releaseIntervalMs??null;this.releaseIntervalMs=E!==null?Math.max(0,E):null,this.createdAt=new Date}sortKeyGet(){return JSON.stringify([this.channelName,null,this.createdAt.toISOString()])}async execute(e){await e.query(a`
|
|
6
6
|
SELECT 1 FROM ${n(this.schema)}."channel_policy_set"(
|
|
7
7
|
$1,
|
|
8
8
|
$2::INTEGER,
|
|
9
9
|
$3::INTEGER,
|
|
10
10
|
$4::INTEGER
|
|
11
11
|
)
|
|
12
|
-
`.value,[this.channelName,this.maxSize,this.maxConcurrency,this.releaseIntervalMs])}}var
|
|
12
|
+
`.value,[this.channelName,this.maxSize,this.maxConcurrency,this.releaseIntervalMs])}}var d=(e)=>{return e*1000},X=(e)=>{return d(e*60)},O=(e)=>{return X(e*60)};import{createHash as K}from"node:crypto";class v{value;constructor(e){this.value=e}toString(e){return K("sha256").update(e).update(this.value).digest("base64").replace(/=/g,"")}}var i=new v("WAKE"),y=!1,l=d(0),x=O(1);import{dirname as f}from"path";var __filename="/home/runner/work/lonnymq/lonnymq/src/core/path.ts",J=f(f(__filename)),j=new RegExp(`^${J}/`),_=(e)=>{return e.replace(j,"")};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/04-function-message-create.ts";var C={name:_(__filename),sql:(e)=>{return[a`
|
|
13
13
|
CREATE FUNCTION ${n(e.schema)}."message_create" (
|
|
14
|
+
p_id UUID,
|
|
14
15
|
p_channel_name TEXT,
|
|
15
16
|
p_name TEXT,
|
|
16
17
|
p_content BYTEA,
|
|
17
18
|
p_lock_ms INTEGER,
|
|
18
19
|
p_delay_ms INTEGER
|
|
19
20
|
) RETURNS TABLE (
|
|
20
|
-
result_code INTEGER
|
|
21
|
-
metadata JSON
|
|
21
|
+
result_code INTEGER
|
|
22
22
|
) AS $$
|
|
23
23
|
DECLARE
|
|
24
24
|
v_now TIMESTAMP;
|
|
@@ -70,18 +70,19 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
70
70
|
|
|
71
71
|
IF v_channel_state."current_size" >= v_channel_policy."max_size" THEN
|
|
72
72
|
RETURN QUERY SELECT
|
|
73
|
-
${
|
|
74
|
-
JSON_BUILD_OBJECT();
|
|
73
|
+
${c(1)};
|
|
75
74
|
RETURN;
|
|
76
75
|
END IF;
|
|
77
76
|
|
|
78
77
|
INSERT INTO ${n(e.schema)}."message" (
|
|
78
|
+
"id",
|
|
79
79
|
"channel_name",
|
|
80
80
|
"name",
|
|
81
81
|
"content",
|
|
82
82
|
"lock_ms",
|
|
83
83
|
"dequeue_after"
|
|
84
84
|
) VALUES (
|
|
85
|
+
p_id,
|
|
85
86
|
p_channel_name,
|
|
86
87
|
p_name,
|
|
87
88
|
p_content,
|
|
@@ -94,14 +95,12 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
94
95
|
"name" = EXCLUDED."name"
|
|
95
96
|
RETURNING
|
|
96
97
|
"id",
|
|
97
|
-
"xmax",
|
|
98
98
|
"dequeue_after"
|
|
99
99
|
INTO v_message;
|
|
100
100
|
|
|
101
|
-
IF v_message."
|
|
101
|
+
IF v_message."id" != p_id THEN
|
|
102
102
|
RETURN QUERY SELECT
|
|
103
|
-
${
|
|
104
|
-
JSON_BUILD_OBJECT('id', v_message."id");
|
|
103
|
+
${c(2)};
|
|
105
104
|
RETURN;
|
|
106
105
|
END IF;
|
|
107
106
|
|
|
@@ -123,20 +122,20 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
123
122
|
PERFORM ${n(e.schema)}."wake"(GREATEST(0, p_delay_ms));
|
|
124
123
|
|
|
125
124
|
RETURN QUERY SELECT
|
|
126
|
-
${
|
|
127
|
-
JSON_BUILD_OBJECT('id', v_message."id");
|
|
125
|
+
${c(0)};
|
|
128
126
|
RETURN;
|
|
129
127
|
END;
|
|
130
128
|
$$ LANGUAGE plpgsql;
|
|
131
|
-
`]}};class o{schema;channelName;name;content;lockMs;delayMs;createdAt;constructor(e){let t=e.name??null,
|
|
129
|
+
`]}};import{randomUUID as Z}from"node:crypto";class o{schema;channelName;name;content;lockMs;id;delayMs;createdAt;constructor(e){let t=e.name??null,s=e.lockMs===void 0?x:Math.max(0,e.lockMs),E=e.delayMs===void 0?l:e.delayMs;this.id=Z(),this.schema=e.schema,this.channelName=e.channelName,this.content=e.content,this.name=t,this.lockMs=s,this.delayMs=E,this.createdAt=new Date}async execute(e){let t=await e.query(a`
|
|
132
130
|
SELECT * FROM ${n(this.schema)}."message_create"(
|
|
133
131
|
$1,
|
|
134
132
|
$2,
|
|
135
133
|
$3,
|
|
136
|
-
$4
|
|
137
|
-
$5::INTEGER
|
|
134
|
+
$4,
|
|
135
|
+
$5::INTEGER,
|
|
136
|
+
$6::INTEGER
|
|
138
137
|
)
|
|
139
|
-
`.value,[this.channelName,this.name,this.content,this.lockMs,this.delayMs]).then((
|
|
138
|
+
`.value,[this.id,this.channelName,this.name,this.content,this.lockMs,this.delayMs]).then((s)=>s.rows[0]);if(t.result_code===1)return{resultType:"MESSAGE_DROPPED"};else if(t.result_code===2)return{resultType:"MESSAGE_DEDUPLICATED"};else if(t.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 p={name:_(__filename),sql:(e)=>{return[a`
|
|
140
139
|
CREATE FUNCTION ${n(e.schema)}."message_dequeue" ()
|
|
141
140
|
RETURNS TABLE (
|
|
142
141
|
result_code INTEGER,
|
|
@@ -146,7 +145,6 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
146
145
|
) AS $$
|
|
147
146
|
DECLARE
|
|
148
147
|
v_now TIMESTAMP;
|
|
149
|
-
v_dequeue_nonce UUID;
|
|
150
148
|
v_channel_state RECORD;
|
|
151
149
|
v_message_locked RECORD;
|
|
152
150
|
v_retry_after TIMESTAMP;
|
|
@@ -155,7 +153,6 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
155
153
|
v_message_next_dequeue_after TIMESTAMP;
|
|
156
154
|
BEGIN
|
|
157
155
|
v_now := NOW();
|
|
158
|
-
v_dequeue_nonce := GEN_RANDOM_UUID();
|
|
159
156
|
|
|
160
157
|
SELECT
|
|
161
158
|
"message"."id",
|
|
@@ -177,22 +174,20 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
177
174
|
IF v_message_locked."dequeue_after" <= v_now THEN
|
|
178
175
|
UPDATE ${n(e.schema)}."message" SET
|
|
179
176
|
"num_attempts" = v_message_locked."num_attempts" + 1,
|
|
180
|
-
"dequeue_after" = v_now + (v_message_locked."lock_ms" * INTERVAL '1 millisecond')
|
|
181
|
-
"dequeue_nonce" = v_dequeue_nonce
|
|
177
|
+
"dequeue_after" = v_now + (v_message_locked."lock_ms" * INTERVAL '1 millisecond')
|
|
182
178
|
WHERE "id" = v_message_locked."id";
|
|
183
179
|
|
|
184
180
|
PERFORM ${n(e.schema)}."wake"(v_message_locked."lock_ms");
|
|
185
181
|
|
|
186
182
|
RETURN QUERY SELECT
|
|
187
|
-
${
|
|
183
|
+
${c(1)},
|
|
188
184
|
NULL::BYTEA,
|
|
189
185
|
NULL::BYTEA,
|
|
190
186
|
JSON_BUILD_OBJECT(
|
|
191
187
|
'id', v_message_locked.id,
|
|
192
188
|
'channel_name', v_message_locked.channel_name,
|
|
193
189
|
'state', v_message_locked.state,
|
|
194
|
-
'name', v_message_locked.name
|
|
195
|
-
'dequeue_nonce', v_dequeue_nonce,
|
|
190
|
+
'name', v_message_locked.name
|
|
196
191
|
'content', v_message_locked.content,
|
|
197
192
|
'num_attempts', v_message_locked.num_attempts
|
|
198
193
|
);
|
|
@@ -222,7 +217,7 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
222
217
|
);
|
|
223
218
|
|
|
224
219
|
RETURN QUERY SELECT
|
|
225
|
-
${
|
|
220
|
+
${c(0)},
|
|
226
221
|
NULL::BYTEA,
|
|
227
222
|
NULL::BYTEA,
|
|
228
223
|
JSON_BUILD_OBJECT(
|
|
@@ -246,7 +241,6 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
246
241
|
UPDATE ${n(e.schema)}."message" SET
|
|
247
242
|
"is_locked" = TRUE,
|
|
248
243
|
"num_attempts" = v_message_dequeue."num_attempts" + 1,
|
|
249
|
-
"dequeue_nonce" = v_dequeue_nonce,
|
|
250
244
|
"dequeue_after" = v_now + (v_message_dequeue."lock_ms" * INTERVAL '1 millisecond')
|
|
251
245
|
WHERE "id" = v_message_dequeue."id";
|
|
252
246
|
|
|
@@ -282,30 +276,28 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
282
276
|
|
|
283
277
|
|
|
284
278
|
RETURN QUERY SELECT
|
|
285
|
-
${
|
|
279
|
+
${c(1)},
|
|
286
280
|
v_message_dequeue.content,
|
|
287
281
|
v_message_dequeue.state,
|
|
288
282
|
JSON_BUILD_OBJECT(
|
|
289
283
|
'id', v_message_dequeue.id,
|
|
290
284
|
'channel_name', v_message_dequeue.channel_name,
|
|
291
|
-
'dequeue_nonce', v_dequeue_nonce,
|
|
292
285
|
'name', v_message_dequeue.name,
|
|
293
286
|
'num_attempts', v_message_dequeue.num_attempts
|
|
294
287
|
);
|
|
295
288
|
RETURN;
|
|
296
289
|
END;
|
|
297
290
|
$$ LANGUAGE plpgsql;
|
|
298
|
-
`]}};class
|
|
291
|
+
`]}};class h{schema;constructor(e){this.schema=e.schema}async execute(e){let t=await e.query(a`
|
|
299
292
|
SELECT
|
|
300
293
|
result_code,
|
|
301
294
|
metadata,
|
|
302
295
|
content,
|
|
303
296
|
state
|
|
304
297
|
FROM ${n(this.schema)}."message_dequeue"()
|
|
305
|
-
`.value,[]).then((
|
|
298
|
+
`.value,[]).then((s)=>s.rows[0]);if(t.result_code===0)return{resultType:"MESSAGE_NOT_AVAILABLE",retryMs:t.metadata.retry_ms};else if(t.result_code===1)return{resultType:"MESSAGE_DEQUEUED",message:{id:t.metadata.id,channelName:t.metadata.channel_name,name:t.metadata.name,content:t.content,state:t.state,numAttempts:t.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 $={name:_(__filename),sql:(e)=>{return[a`
|
|
306
299
|
CREATE FUNCTION ${n(e.schema)}."message_delete" (
|
|
307
|
-
p_id
|
|
308
|
-
p_dequeue_nonce UUID
|
|
300
|
+
p_id UUID
|
|
309
301
|
)
|
|
310
302
|
RETURNS TABLE (
|
|
311
303
|
result_code INTEGER
|
|
@@ -318,7 +310,7 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
318
310
|
SELECT
|
|
319
311
|
"message"."id",
|
|
320
312
|
"message"."channel_name",
|
|
321
|
-
"message"."
|
|
313
|
+
"message"."is_locked"
|
|
322
314
|
FROM ${n(e.schema)}."message"
|
|
323
315
|
WHERE "id" = p_id
|
|
324
316
|
FOR UPDATE
|
|
@@ -326,11 +318,11 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
326
318
|
|
|
327
319
|
IF v_message."id" IS NULL THEN
|
|
328
320
|
RETURN QUERY SELECT
|
|
329
|
-
${
|
|
321
|
+
${c(0)};
|
|
330
322
|
RETURN;
|
|
331
|
-
|
|
323
|
+
ELSIF NOT v_message."is_locked" THEN
|
|
332
324
|
RETURN QUERY SELECT
|
|
333
|
-
${
|
|
325
|
+
${c(1)};
|
|
334
326
|
RETURN;
|
|
335
327
|
END IF;
|
|
336
328
|
|
|
@@ -364,19 +356,17 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
364
356
|
WHERE "id" = p_id;
|
|
365
357
|
|
|
366
358
|
RETURN QUERY SELECT
|
|
367
|
-
${
|
|
359
|
+
${c(2)};
|
|
368
360
|
RETURN;
|
|
369
361
|
END;
|
|
370
362
|
$$ LANGUAGE plpgsql;
|
|
371
|
-
`]}};class
|
|
363
|
+
`]}};class u{schema;id;constructor(e){this.schema=e.schema,this.id=e.id}async execute(e){let t=await e.query(a`
|
|
372
364
|
SELECT * FROM ${n(this.schema)}."message_delete"(
|
|
373
|
-
$1
|
|
374
|
-
$2
|
|
365
|
+
$1
|
|
375
366
|
)
|
|
376
|
-
`.value,[this.id
|
|
367
|
+
`.value,[this.id]).then((s)=>s.rows[0]);if(t.result_code===0)return{resultType:"MESSAGE_NOT_FOUND"};else if(t.result_code===1)return{resultType:"STATE_INVALID"};else if(t.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 q={name:_(__filename),sql:(e)=>{return[a`
|
|
377
368
|
CREATE FUNCTION ${n(e.schema)}."message_defer" (
|
|
378
|
-
p_id
|
|
379
|
-
p_dequeue_nonce UUID,
|
|
369
|
+
p_id UUID,
|
|
380
370
|
p_delay_ms INTEGER,
|
|
381
371
|
p_state BYTEA
|
|
382
372
|
)
|
|
@@ -391,7 +381,7 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
391
381
|
SELECT
|
|
392
382
|
"message"."id",
|
|
393
383
|
"message"."channel_name",
|
|
394
|
-
"message"."
|
|
384
|
+
"message"."is_locked"
|
|
395
385
|
FROM ${n(e.schema)}."message"
|
|
396
386
|
WHERE "id" = p_id
|
|
397
387
|
FOR UPDATE
|
|
@@ -399,11 +389,11 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
399
389
|
|
|
400
390
|
IF v_message."id" IS NULL THEN
|
|
401
391
|
RETURN QUERY SELECT
|
|
402
|
-
${
|
|
392
|
+
${c(0)};
|
|
403
393
|
RETURN;
|
|
404
|
-
|
|
394
|
+
ELSIF NOT v_message."is_locked" THEN
|
|
405
395
|
RETURN QUERY SELECT
|
|
406
|
-
${
|
|
396
|
+
${c(1)};
|
|
407
397
|
RETURN;
|
|
408
398
|
END IF;
|
|
409
399
|
|
|
@@ -442,58 +432,56 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
442
432
|
PERFORM ${n(e.schema)}."wake"(GREATEST(0, p_delay_ms));
|
|
443
433
|
|
|
444
434
|
RETURN QUERY SELECT
|
|
445
|
-
${
|
|
435
|
+
${c(2)};
|
|
446
436
|
RETURN;
|
|
447
437
|
END;
|
|
448
438
|
$$ LANGUAGE plpgsql;
|
|
449
|
-
`]}};class
|
|
439
|
+
`]}};class N{schema;id;delayMs;state;constructor(e){let t=e.delayMs===void 0?l:e.delayMs;this.schema=e.schema,this.id=e.id,this.delayMs=t,this.state=e.state??null}async execute(e){let t=await e.query(a`
|
|
450
440
|
SELECT * FROM ${n(this.schema)}."message_defer"(
|
|
451
441
|
$1,
|
|
452
442
|
$2,
|
|
453
|
-
$3
|
|
454
|
-
$4
|
|
443
|
+
$3
|
|
455
444
|
)
|
|
456
|
-
`.value,[this.id,this.
|
|
457
|
-
`),
|
|
458
|
-
`).trim()};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/00-table-channel-policy.ts",
|
|
445
|
+
`.value,[this.id,this.delayMs,this.state]).then((s)=>s.rows[0]);if(t.result_code===0)return{resultType:"MESSAGE_NOT_FOUND"};else if(t.result_code===1)return{resultType:"STATE_INVALID"};else if(t.result_code===2)return{resultType:"MESSAGE_DEFERRED"};else throw new Error("Unexpected result")}}var F=(e)=>{let t=e.split(`
|
|
446
|
+
`),s=Number.MAX_SAFE_INTEGER;for(let E of t){if(E.trim().length===0)continue;let T=E.search(/\S/);s=Math.min(s,T)}return t.map((E)=>E.slice(s)).join(`
|
|
447
|
+
`).trim()};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/00-table-channel-policy.ts",M={name:_(__filename),sql:(e)=>{return[a`
|
|
459
448
|
CREATE TABLE ${n(e.schema)}."channel_policy" (
|
|
460
|
-
"id"
|
|
449
|
+
"id" UUID NOT NULL DEFAULT GEN_RANDOM_UUID(),
|
|
461
450
|
"name" TEXT NOT NULL,
|
|
462
451
|
"max_size" INTEGER,
|
|
463
452
|
"max_concurrency" INTEGER,
|
|
464
453
|
"release_interval_ms" INTEGER,
|
|
465
454
|
PRIMARY KEY ("id")
|
|
466
455
|
);
|
|
467
|
-
`,
|
|
456
|
+
`,a`
|
|
468
457
|
CREATE UNIQUE INDEX "channel_policy_name_ux"
|
|
469
458
|
ON ${n(e.schema)}."channel_policy" ("name");
|
|
470
|
-
`]}};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",G={name:_(__filename),sql:(e)=>{return[a`
|
|
471
460
|
CREATE TABLE ${n(e.schema)}."channel_state" (
|
|
472
|
-
"id"
|
|
461
|
+
"id" UUID NOT NULL DEFAULT GEN_RANDOM_UUID(),
|
|
473
462
|
"name" TEXT NOT NULL,
|
|
474
463
|
"max_size" INTEGER,
|
|
475
464
|
"max_concurrency" INTEGER,
|
|
476
465
|
"release_interval_ms" INTEGER,
|
|
477
466
|
"current_size" INTEGER NOT NULL,
|
|
478
467
|
"current_concurrency" INTEGER NOT NULL,
|
|
479
|
-
"message_next_id"
|
|
468
|
+
"message_next_id" UUID,
|
|
480
469
|
"message_next_dequeue_after" TIMESTAMP,
|
|
481
470
|
PRIMARY KEY ("id")
|
|
482
471
|
);
|
|
483
|
-
`,
|
|
472
|
+
`,a`
|
|
484
473
|
CREATE UNIQUE INDEX "channel_state_name_ux"
|
|
485
474
|
ON ${n(e.schema)}."channel_state" ("name");
|
|
486
|
-
`,
|
|
475
|
+
`,a`
|
|
487
476
|
CREATE INDEX "channel_state_dequeue_ix"
|
|
488
477
|
ON ${n(e.schema)}."channel_state" (
|
|
489
478
|
"message_next_dequeue_after" ASC
|
|
490
479
|
) WHERE "message_next_id" IS NOT NULL
|
|
491
480
|
AND ("max_concurrency" IS NULL OR "current_concurrency" < "max_concurrency");
|
|
492
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/02-table-message.ts",
|
|
481
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/02-table-message.ts",B={name:_(__filename),sql:(e)=>{return[a`
|
|
493
482
|
CREATE TABLE ${n(e.schema)}."message" (
|
|
494
|
-
"id"
|
|
483
|
+
"id" UUID NOT NULL,
|
|
495
484
|
"channel_name" TEXT NOT NULL,
|
|
496
|
-
"dequeue_nonce" UUID,
|
|
497
485
|
"name" TEXT,
|
|
498
486
|
"content" BYTEA NOT NULL,
|
|
499
487
|
"state" BYTEA,
|
|
@@ -503,35 +491,35 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
503
491
|
"dequeue_after" TIMESTAMP NOT NULL,
|
|
504
492
|
PRIMARY KEY ("id")
|
|
505
493
|
);
|
|
506
|
-
`,
|
|
494
|
+
`,a`
|
|
507
495
|
CREATE UNIQUE INDEX "message_name_ux"
|
|
508
496
|
ON ${n(e.schema)}."message" (
|
|
509
497
|
"channel_name",
|
|
510
498
|
"name"
|
|
511
499
|
) WHERE "num_attempts" = 0
|
|
512
|
-
`,
|
|
500
|
+
`,a`
|
|
513
501
|
CREATE INDEX "message_dequeue_ix"
|
|
514
502
|
ON ${n(e.schema)}."message" (
|
|
515
503
|
"channel_name",
|
|
516
504
|
"dequeue_after" ASC,
|
|
517
505
|
"id" ASC
|
|
518
506
|
) WHERE NOT "is_locked";
|
|
519
|
-
`,
|
|
507
|
+
`,a`
|
|
520
508
|
CREATE INDEX "message_locked_dequeue_ix"
|
|
521
509
|
ON ${n(e.schema)}."message" (
|
|
522
510
|
"dequeue_after" ASC
|
|
523
511
|
) WHERE "is_locked";
|
|
524
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/03-function-wake.ts",
|
|
512
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/03-function-wake.ts",P={name:_(__filename),sql:(e)=>{let t=i.toString(e.schema);return[a`
|
|
525
513
|
CREATE FUNCTION ${n(e.schema)}."wake" (
|
|
526
514
|
p_delay_ms INTEGER
|
|
527
515
|
) RETURNS VOID AS $$
|
|
528
516
|
BEGIN
|
|
529
|
-
IF ${
|
|
530
|
-
PERFORM PG_NOTIFY(${
|
|
517
|
+
IF ${c(e.useWake)} THEN
|
|
518
|
+
PERFORM PG_NOTIFY(${c(t)}, p_delay_ms::TEXT);
|
|
531
519
|
END IF;
|
|
532
520
|
END;
|
|
533
521
|
$$ LANGUAGE plpgsql;
|
|
534
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/08-function-channel-policy-set.ts",
|
|
522
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/08-function-channel-policy-set.ts",H={name:_(__filename),sql:(e)=>{return[a`
|
|
535
523
|
CREATE FUNCTION ${n(e.schema)}."channel_policy_set" (
|
|
536
524
|
p_name TEXT,
|
|
537
525
|
p_max_size INTEGER,
|
|
@@ -563,7 +551,7 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
563
551
|
PERFORM ${n(e.schema)}."wake"(0);
|
|
564
552
|
END;
|
|
565
553
|
$$ LANGUAGE plpgsql;
|
|
566
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/09-function-channel-policy-clear.ts",k={name:
|
|
554
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/09-function-channel-policy-clear.ts",k={name:_(__filename),sql:(e)=>{return[a`
|
|
567
555
|
CREATE FUNCTION ${n(e.schema)}."channel_policy_clear" (
|
|
568
556
|
p_name TEXT
|
|
569
557
|
) RETURNS VOID AS $$
|
|
@@ -595,4 +583,4 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
595
583
|
PERFORM ${n(e.schema)}."wake"(0);
|
|
596
584
|
END;
|
|
597
585
|
$$ LANGUAGE plpgsql;
|
|
598
|
-
`]}};class
|
|
586
|
+
`]}};class R{schema;channelName;registerFn;constructor(e){this.schema=e.schema,this.channelName=e.channelName,this.registerFn=e.registerFn}create(e){let t=new o({schema:this.schema,channelName:this.channelName,name:e.name,content:e.content,lockMs:e.lockMs,delayMs:e.delayMs}),s=new Promise((E)=>{this.registerFn({sortKey:JSON.stringify([t.channelName,t.name,t.createdAt.toISOString()]),execute:(T)=>t.execute(T).then((z)=>E(z))})});return{messageId:t.id,promise:s}}}class g{schema;channelName;registerFn;constructor(e){this.schema=e.schema,this.channelName=e.channelName,this.registerFn=e.registerFn}set(e){let t=new m({schema:this.schema,channelName:this.channelName,maxConcurrency:e.maxConcurrency,maxSize:e.maxSize,releaseIntervalMs:e.releaseIntervalMs});this.registerFn({sortKey:JSON.stringify([t.channelName,null,t.createdAt.toISOString()]),execute:async(s)=>{await t.execute(s)}})}clear(){let e=new r({schema:this.schema,channelName:this.channelName});this.registerFn({sortKey:JSON.stringify([e.channelName,null,e.createdAt.toISOString()]),execute:async(t)=>{await e.execute(t)}})}}class S{policy;message;constructor(e){this.message=new R(e),this.policy=new g(e)}}var ee=(e,t)=>{return e.sortKey.localeCompare(t.sortKey)};class A{commands;schema;constructor(e){this.commands=[],this.schema=e.schema}channel(e){return new S({schema:this.schema,channelName:e,registerFn:(t)=>{this.commands.push(t)}})}async execute(e){for(let t of this.commands.sort(ee))await t.execute(e.databaseClient)}}class L{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 I{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 U{policy;message;constructor(e){this.message=new L({schema:e.schema,channelName:e.channelName}),this.policy=new I({schema:e.schema,channelName:e.channelName})}}class D{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 N({schema:this.schema,id:this.id,delayMs:e.delayMs,state:e.state}).execute(e.databaseClient)}async delete(e){return new u({schema:this.schema,id:this.id}).execute(e.databaseClient)}}class b{schema;constructor(e){this.schema=e}async dequeue(e){let s=await new h({schema:this.schema}).execute(e.databaseClient);if(s.resultType==="MESSAGE_DEQUEUED")return{resultType:"MESSAGE_DEQUEUED",message:new D({schema:this.schema,id:s.message.id,channelName:s.message.channelName,name:s.message.name,content:s.message.content,state:s.message.state,numAttempts:s.message.numAttempts})};else return s}channel(e){return new U({schema:this.schema,channelName:e})}batch(){return new A({schema:this.schema})}migrations(e){return[M,G,B,P,C,p,$,q,H,k].map((t)=>({name:t.name,sql:t.sql({schema:this.schema,useWake:e.useWake??y}).map((s)=>F(s.value))})).sort((t,s)=>t.name.localeCompare(s.name))}wakeChannel(){return i.toString(this.schema)}}export{b as Queue,h as MessageDequeueCommand,u as MessageDeleteCommand,N as MessageDeferCommand,o as MessageCreateCommand,m as ChannelPolicySetCommand,r as ChannelPolicyClearCommand};
|