lonnymq 0.0.5 → 0.0.7
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 +41 -55
- package/dist/index.d.ts +15 -32
- package/dist/index.js +62 -76
- 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:()=>o,MessageDeleteCommand:()=>l,MessageDeferCommand:()=>h,MessageCreateCommand:()=>i,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
|
|
129
|
+
`]}};var M=require("node:crypto");class i{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,23 +174,19 @@ 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");
|
|
185
181
|
|
|
186
182
|
RETURN QUERY SELECT
|
|
187
183
|
${E(1)},
|
|
188
|
-
|
|
189
|
-
|
|
184
|
+
v_message_locked.content,
|
|
185
|
+
v_message_locked.state,
|
|
190
186
|
JSON_BUILD_OBJECT(
|
|
191
187
|
'id', v_message_locked.id,
|
|
192
188
|
'channel_name', v_message_locked.channel_name,
|
|
193
|
-
'state', v_message_locked.state,
|
|
194
189
|
'name', v_message_locked.name,
|
|
195
|
-
'dequeue_nonce', v_dequeue_nonce,
|
|
196
|
-
'content', v_message_locked.content,
|
|
197
190
|
'num_attempts', v_message_locked.num_attempts
|
|
198
191
|
);
|
|
199
192
|
RETURN;
|
|
@@ -246,7 +239,6 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
246
239
|
UPDATE ${t(e.schema)}."message" SET
|
|
247
240
|
"is_locked" = TRUE,
|
|
248
241
|
"num_attempts" = v_message_dequeue."num_attempts" + 1,
|
|
249
|
-
"dequeue_nonce" = v_dequeue_nonce,
|
|
250
242
|
"dequeue_after" = v_now + (v_message_dequeue."lock_ms" * INTERVAL '1 millisecond')
|
|
251
243
|
WHERE "id" = v_message_dequeue."id";
|
|
252
244
|
|
|
@@ -288,24 +280,22 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
288
280
|
JSON_BUILD_OBJECT(
|
|
289
281
|
'id', v_message_dequeue.id,
|
|
290
282
|
'channel_name', v_message_dequeue.channel_name,
|
|
291
|
-
'dequeue_nonce', v_dequeue_nonce,
|
|
292
283
|
'name', v_message_dequeue.name,
|
|
293
284
|
'num_attempts', v_message_dequeue.num_attempts
|
|
294
285
|
);
|
|
295
286
|
RETURN;
|
|
296
287
|
END;
|
|
297
288
|
$$ LANGUAGE plpgsql;
|
|
298
|
-
`]}};class
|
|
289
|
+
`]}};class o{schema;constructor(e){this.schema=e.schema}async execute(e){let n=await e.query(s`
|
|
299
290
|
SELECT
|
|
300
291
|
result_code,
|
|
301
292
|
metadata,
|
|
302
293
|
content,
|
|
303
294
|
state
|
|
304
295
|
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:
|
|
296
|
+
`.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 P={name:c(__filename),sql:(e)=>{return[s`
|
|
306
297
|
CREATE FUNCTION ${t(e.schema)}."message_delete" (
|
|
307
|
-
p_id
|
|
308
|
-
p_dequeue_nonce UUID
|
|
298
|
+
p_id UUID
|
|
309
299
|
)
|
|
310
300
|
RETURNS TABLE (
|
|
311
301
|
result_code INTEGER
|
|
@@ -318,7 +308,7 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
318
308
|
SELECT
|
|
319
309
|
"message"."id",
|
|
320
310
|
"message"."channel_name",
|
|
321
|
-
"message"."
|
|
311
|
+
"message"."is_locked"
|
|
322
312
|
FROM ${t(e.schema)}."message"
|
|
323
313
|
WHERE "id" = p_id
|
|
324
314
|
FOR UPDATE
|
|
@@ -328,7 +318,7 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
328
318
|
RETURN QUERY SELECT
|
|
329
319
|
${E(0)};
|
|
330
320
|
RETURN;
|
|
331
|
-
|
|
321
|
+
ELSIF NOT v_message."is_locked" THEN
|
|
332
322
|
RETURN QUERY SELECT
|
|
333
323
|
${E(1)};
|
|
334
324
|
RETURN;
|
|
@@ -368,15 +358,13 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
368
358
|
RETURN;
|
|
369
359
|
END;
|
|
370
360
|
$$ LANGUAGE plpgsql;
|
|
371
|
-
`]}};class
|
|
361
|
+
`]}};class l{schema;id;constructor(e){this.schema=e.schema,this.id=e.id}async execute(e){let n=await e.query(s`
|
|
372
362
|
SELECT * FROM ${t(this.schema)}."message_delete"(
|
|
373
|
-
$1
|
|
374
|
-
$2
|
|
363
|
+
$1
|
|
375
364
|
)
|
|
376
|
-
`.value,[this.id
|
|
365
|
+
`.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 B={name:c(__filename),sql:(e)=>{return[s`
|
|
377
366
|
CREATE FUNCTION ${t(e.schema)}."message_defer" (
|
|
378
|
-
p_id
|
|
379
|
-
p_dequeue_nonce UUID,
|
|
367
|
+
p_id UUID,
|
|
380
368
|
p_delay_ms INTEGER,
|
|
381
369
|
p_state BYTEA
|
|
382
370
|
)
|
|
@@ -391,7 +379,7 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
391
379
|
SELECT
|
|
392
380
|
"message"."id",
|
|
393
381
|
"message"."channel_name",
|
|
394
|
-
"message"."
|
|
382
|
+
"message"."is_locked"
|
|
395
383
|
FROM ${t(e.schema)}."message"
|
|
396
384
|
WHERE "id" = p_id
|
|
397
385
|
FOR UPDATE
|
|
@@ -401,7 +389,7 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
401
389
|
RETURN QUERY SELECT
|
|
402
390
|
${E(0)};
|
|
403
391
|
RETURN;
|
|
404
|
-
|
|
392
|
+
ELSIF NOT v_message."is_locked" THEN
|
|
405
393
|
RETURN QUERY SELECT
|
|
406
394
|
${E(1)};
|
|
407
395
|
RETURN;
|
|
@@ -446,18 +434,17 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
446
434
|
RETURN;
|
|
447
435
|
END;
|
|
448
436
|
$$ LANGUAGE plpgsql;
|
|
449
|
-
`]}};class
|
|
437
|
+
`]}};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
438
|
SELECT * FROM ${t(this.schema)}."message_defer"(
|
|
451
439
|
$1,
|
|
452
440
|
$2,
|
|
453
|
-
$3
|
|
454
|
-
$4
|
|
441
|
+
$3
|
|
455
442
|
)
|
|
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",
|
|
443
|
+
`.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(`
|
|
444
|
+
`),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(`
|
|
445
|
+
`).trim()};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/00-table-channel-policy.ts",k={name:c(__filename),sql:(e)=>{return[s`
|
|
459
446
|
CREATE TABLE ${t(e.schema)}."channel_policy" (
|
|
460
|
-
"id"
|
|
447
|
+
"id" UUID NOT NULL DEFAULT GEN_RANDOM_UUID(),
|
|
461
448
|
"name" TEXT NOT NULL,
|
|
462
449
|
"max_size" INTEGER,
|
|
463
450
|
"max_concurrency" INTEGER,
|
|
@@ -467,16 +454,16 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
467
454
|
`,s`
|
|
468
455
|
CREATE UNIQUE INDEX "channel_policy_name_ux"
|
|
469
456
|
ON ${t(e.schema)}."channel_policy" ("name");
|
|
470
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/01-table-channel-state.ts",
|
|
457
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/01-table-channel-state.ts",b={name:c(__filename),sql:(e)=>{return[s`
|
|
471
458
|
CREATE TABLE ${t(e.schema)}."channel_state" (
|
|
472
|
-
"id"
|
|
459
|
+
"id" UUID NOT NULL DEFAULT GEN_RANDOM_UUID(),
|
|
473
460
|
"name" TEXT NOT NULL,
|
|
474
461
|
"max_size" INTEGER,
|
|
475
462
|
"max_concurrency" INTEGER,
|
|
476
463
|
"release_interval_ms" INTEGER,
|
|
477
464
|
"current_size" INTEGER NOT NULL,
|
|
478
465
|
"current_concurrency" INTEGER NOT NULL,
|
|
479
|
-
"message_next_id"
|
|
466
|
+
"message_next_id" UUID,
|
|
480
467
|
"message_next_dequeue_after" TIMESTAMP,
|
|
481
468
|
PRIMARY KEY ("id")
|
|
482
469
|
);
|
|
@@ -491,9 +478,8 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
491
478
|
AND ("max_concurrency" IS NULL OR "current_concurrency" < "max_concurrency");
|
|
492
479
|
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/02-table-message.ts",z={name:c(__filename),sql:(e)=>{return[s`
|
|
493
480
|
CREATE TABLE ${t(e.schema)}."message" (
|
|
494
|
-
"id"
|
|
481
|
+
"id" UUID NOT NULL,
|
|
495
482
|
"channel_name" TEXT NOT NULL,
|
|
496
|
-
"dequeue_nonce" UUID,
|
|
497
483
|
"name" TEXT,
|
|
498
484
|
"content" BYTEA NOT NULL,
|
|
499
485
|
"state" BYTEA,
|
|
@@ -521,7 +507,7 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
521
507
|
ON ${t(e.schema)}."message" (
|
|
522
508
|
"dequeue_after" ASC
|
|
523
509
|
) 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=
|
|
510
|
+
`]}};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
511
|
CREATE FUNCTION ${t(e.schema)}."wake" (
|
|
526
512
|
p_delay_ms INTEGER
|
|
527
513
|
) RETURNS VOID AS $$
|
|
@@ -595,4 +581,4 @@ var{defineProperty:R,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,X=
|
|
|
595
581
|
PERFORM ${t(e.schema)}."wake"(0);
|
|
596
582
|
END;
|
|
597
583
|
$$ LANGUAGE plpgsql;
|
|
598
|
-
`]}};class
|
|
584
|
+
`]}};class S{schema;channelName;registerFn;constructor(e){this.schema=e.schema,this.channelName=e.channelName,this.registerFn=e.registerFn}create(e){let n=new i({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 I{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 L{commands;schema;constructor(e){this.commands=[],this.schema=e.schema}channel(e){return new I({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 i({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 o({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 L({schema:this.schema})}migrations(e){return[k,b,z,w,F,G,P,B,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 o=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
|
|
129
|
+
`]}};import{randomUUID as Z}from"node:crypto";class i{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,23 +174,19 @@ 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
|
-
${
|
|
188
|
-
|
|
189
|
-
|
|
183
|
+
${c(1)},
|
|
184
|
+
v_message_locked.content,
|
|
185
|
+
v_message_locked.state,
|
|
190
186
|
JSON_BUILD_OBJECT(
|
|
191
187
|
'id', v_message_locked.id,
|
|
192
188
|
'channel_name', v_message_locked.channel_name,
|
|
193
|
-
'state', v_message_locked.state,
|
|
194
189
|
'name', v_message_locked.name,
|
|
195
|
-
'dequeue_nonce', v_dequeue_nonce,
|
|
196
|
-
'content', v_message_locked.content,
|
|
197
190
|
'num_attempts', v_message_locked.num_attempts
|
|
198
191
|
);
|
|
199
192
|
RETURN;
|
|
@@ -222,7 +215,7 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
222
215
|
);
|
|
223
216
|
|
|
224
217
|
RETURN QUERY SELECT
|
|
225
|
-
${
|
|
218
|
+
${c(0)},
|
|
226
219
|
NULL::BYTEA,
|
|
227
220
|
NULL::BYTEA,
|
|
228
221
|
JSON_BUILD_OBJECT(
|
|
@@ -246,7 +239,6 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
246
239
|
UPDATE ${n(e.schema)}."message" SET
|
|
247
240
|
"is_locked" = TRUE,
|
|
248
241
|
"num_attempts" = v_message_dequeue."num_attempts" + 1,
|
|
249
|
-
"dequeue_nonce" = v_dequeue_nonce,
|
|
250
242
|
"dequeue_after" = v_now + (v_message_dequeue."lock_ms" * INTERVAL '1 millisecond')
|
|
251
243
|
WHERE "id" = v_message_dequeue."id";
|
|
252
244
|
|
|
@@ -282,30 +274,28 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
282
274
|
|
|
283
275
|
|
|
284
276
|
RETURN QUERY SELECT
|
|
285
|
-
${
|
|
277
|
+
${c(1)},
|
|
286
278
|
v_message_dequeue.content,
|
|
287
279
|
v_message_dequeue.state,
|
|
288
280
|
JSON_BUILD_OBJECT(
|
|
289
281
|
'id', v_message_dequeue.id,
|
|
290
282
|
'channel_name', v_message_dequeue.channel_name,
|
|
291
|
-
'dequeue_nonce', v_dequeue_nonce,
|
|
292
283
|
'name', v_message_dequeue.name,
|
|
293
284
|
'num_attempts', v_message_dequeue.num_attempts
|
|
294
285
|
);
|
|
295
286
|
RETURN;
|
|
296
287
|
END;
|
|
297
288
|
$$ LANGUAGE plpgsql;
|
|
298
|
-
`]}};class
|
|
289
|
+
`]}};class h{schema;constructor(e){this.schema=e.schema}async execute(e){let t=await e.query(a`
|
|
299
290
|
SELECT
|
|
300
291
|
result_code,
|
|
301
292
|
metadata,
|
|
302
293
|
content,
|
|
303
294
|
state
|
|
304
295
|
FROM ${n(this.schema)}."message_dequeue"()
|
|
305
|
-
`.value,[]).then((
|
|
296
|
+
`.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
297
|
CREATE FUNCTION ${n(e.schema)}."message_delete" (
|
|
307
|
-
p_id
|
|
308
|
-
p_dequeue_nonce UUID
|
|
298
|
+
p_id UUID
|
|
309
299
|
)
|
|
310
300
|
RETURNS TABLE (
|
|
311
301
|
result_code INTEGER
|
|
@@ -318,7 +308,7 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
318
308
|
SELECT
|
|
319
309
|
"message"."id",
|
|
320
310
|
"message"."channel_name",
|
|
321
|
-
"message"."
|
|
311
|
+
"message"."is_locked"
|
|
322
312
|
FROM ${n(e.schema)}."message"
|
|
323
313
|
WHERE "id" = p_id
|
|
324
314
|
FOR UPDATE
|
|
@@ -326,11 +316,11 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
326
316
|
|
|
327
317
|
IF v_message."id" IS NULL THEN
|
|
328
318
|
RETURN QUERY SELECT
|
|
329
|
-
${
|
|
319
|
+
${c(0)};
|
|
330
320
|
RETURN;
|
|
331
|
-
|
|
321
|
+
ELSIF NOT v_message."is_locked" THEN
|
|
332
322
|
RETURN QUERY SELECT
|
|
333
|
-
${
|
|
323
|
+
${c(1)};
|
|
334
324
|
RETURN;
|
|
335
325
|
END IF;
|
|
336
326
|
|
|
@@ -364,19 +354,17 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
364
354
|
WHERE "id" = p_id;
|
|
365
355
|
|
|
366
356
|
RETURN QUERY SELECT
|
|
367
|
-
${
|
|
357
|
+
${c(2)};
|
|
368
358
|
RETURN;
|
|
369
359
|
END;
|
|
370
360
|
$$ LANGUAGE plpgsql;
|
|
371
|
-
`]}};class
|
|
361
|
+
`]}};class u{schema;id;constructor(e){this.schema=e.schema,this.id=e.id}async execute(e){let t=await e.query(a`
|
|
372
362
|
SELECT * FROM ${n(this.schema)}."message_delete"(
|
|
373
|
-
$1
|
|
374
|
-
$2
|
|
363
|
+
$1
|
|
375
364
|
)
|
|
376
|
-
`.value,[this.id
|
|
365
|
+
`.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
366
|
CREATE FUNCTION ${n(e.schema)}."message_defer" (
|
|
378
|
-
p_id
|
|
379
|
-
p_dequeue_nonce UUID,
|
|
367
|
+
p_id UUID,
|
|
380
368
|
p_delay_ms INTEGER,
|
|
381
369
|
p_state BYTEA
|
|
382
370
|
)
|
|
@@ -391,7 +379,7 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
391
379
|
SELECT
|
|
392
380
|
"message"."id",
|
|
393
381
|
"message"."channel_name",
|
|
394
|
-
"message"."
|
|
382
|
+
"message"."is_locked"
|
|
395
383
|
FROM ${n(e.schema)}."message"
|
|
396
384
|
WHERE "id" = p_id
|
|
397
385
|
FOR UPDATE
|
|
@@ -399,11 +387,11 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
399
387
|
|
|
400
388
|
IF v_message."id" IS NULL THEN
|
|
401
389
|
RETURN QUERY SELECT
|
|
402
|
-
${
|
|
390
|
+
${c(0)};
|
|
403
391
|
RETURN;
|
|
404
|
-
|
|
392
|
+
ELSIF NOT v_message."is_locked" THEN
|
|
405
393
|
RETURN QUERY SELECT
|
|
406
|
-
${
|
|
394
|
+
${c(1)};
|
|
407
395
|
RETURN;
|
|
408
396
|
END IF;
|
|
409
397
|
|
|
@@ -442,58 +430,56 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
442
430
|
PERFORM ${n(e.schema)}."wake"(GREATEST(0, p_delay_ms));
|
|
443
431
|
|
|
444
432
|
RETURN QUERY SELECT
|
|
445
|
-
${
|
|
433
|
+
${c(2)};
|
|
446
434
|
RETURN;
|
|
447
435
|
END;
|
|
448
436
|
$$ LANGUAGE plpgsql;
|
|
449
|
-
`]}};class
|
|
437
|
+
`]}};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
438
|
SELECT * FROM ${n(this.schema)}."message_defer"(
|
|
451
439
|
$1,
|
|
452
440
|
$2,
|
|
453
|
-
$3
|
|
454
|
-
$4
|
|
441
|
+
$3
|
|
455
442
|
)
|
|
456
|
-
`.value,[this.id,this.
|
|
457
|
-
`),
|
|
458
|
-
`).trim()};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/00-table-channel-policy.ts",
|
|
443
|
+
`.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(`
|
|
444
|
+
`),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(`
|
|
445
|
+
`).trim()};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/00-table-channel-policy.ts",M={name:_(__filename),sql:(e)=>{return[a`
|
|
459
446
|
CREATE TABLE ${n(e.schema)}."channel_policy" (
|
|
460
|
-
"id"
|
|
447
|
+
"id" UUID NOT NULL DEFAULT GEN_RANDOM_UUID(),
|
|
461
448
|
"name" TEXT NOT NULL,
|
|
462
449
|
"max_size" INTEGER,
|
|
463
450
|
"max_concurrency" INTEGER,
|
|
464
451
|
"release_interval_ms" INTEGER,
|
|
465
452
|
PRIMARY KEY ("id")
|
|
466
453
|
);
|
|
467
|
-
`,
|
|
454
|
+
`,a`
|
|
468
455
|
CREATE UNIQUE INDEX "channel_policy_name_ux"
|
|
469
456
|
ON ${n(e.schema)}."channel_policy" ("name");
|
|
470
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/01-table-channel-state.ts",
|
|
457
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/01-table-channel-state.ts",G={name:_(__filename),sql:(e)=>{return[a`
|
|
471
458
|
CREATE TABLE ${n(e.schema)}."channel_state" (
|
|
472
|
-
"id"
|
|
459
|
+
"id" UUID NOT NULL DEFAULT GEN_RANDOM_UUID(),
|
|
473
460
|
"name" TEXT NOT NULL,
|
|
474
461
|
"max_size" INTEGER,
|
|
475
462
|
"max_concurrency" INTEGER,
|
|
476
463
|
"release_interval_ms" INTEGER,
|
|
477
464
|
"current_size" INTEGER NOT NULL,
|
|
478
465
|
"current_concurrency" INTEGER NOT NULL,
|
|
479
|
-
"message_next_id"
|
|
466
|
+
"message_next_id" UUID,
|
|
480
467
|
"message_next_dequeue_after" TIMESTAMP,
|
|
481
468
|
PRIMARY KEY ("id")
|
|
482
469
|
);
|
|
483
|
-
`,
|
|
470
|
+
`,a`
|
|
484
471
|
CREATE UNIQUE INDEX "channel_state_name_ux"
|
|
485
472
|
ON ${n(e.schema)}."channel_state" ("name");
|
|
486
|
-
`,
|
|
473
|
+
`,a`
|
|
487
474
|
CREATE INDEX "channel_state_dequeue_ix"
|
|
488
475
|
ON ${n(e.schema)}."channel_state" (
|
|
489
476
|
"message_next_dequeue_after" ASC
|
|
490
477
|
) WHERE "message_next_id" IS NOT NULL
|
|
491
478
|
AND ("max_concurrency" IS NULL OR "current_concurrency" < "max_concurrency");
|
|
492
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/02-table-message.ts",P={name:
|
|
479
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/02-table-message.ts",P={name:_(__filename),sql:(e)=>{return[a`
|
|
493
480
|
CREATE TABLE ${n(e.schema)}."message" (
|
|
494
|
-
"id"
|
|
481
|
+
"id" UUID NOT NULL,
|
|
495
482
|
"channel_name" TEXT NOT NULL,
|
|
496
|
-
"dequeue_nonce" UUID,
|
|
497
483
|
"name" TEXT,
|
|
498
484
|
"content" BYTEA NOT NULL,
|
|
499
485
|
"state" BYTEA,
|
|
@@ -503,35 +489,35 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
503
489
|
"dequeue_after" TIMESTAMP NOT NULL,
|
|
504
490
|
PRIMARY KEY ("id")
|
|
505
491
|
);
|
|
506
|
-
`,
|
|
492
|
+
`,a`
|
|
507
493
|
CREATE UNIQUE INDEX "message_name_ux"
|
|
508
494
|
ON ${n(e.schema)}."message" (
|
|
509
495
|
"channel_name",
|
|
510
496
|
"name"
|
|
511
497
|
) WHERE "num_attempts" = 0
|
|
512
|
-
`,
|
|
498
|
+
`,a`
|
|
513
499
|
CREATE INDEX "message_dequeue_ix"
|
|
514
500
|
ON ${n(e.schema)}."message" (
|
|
515
501
|
"channel_name",
|
|
516
502
|
"dequeue_after" ASC,
|
|
517
503
|
"id" ASC
|
|
518
504
|
) WHERE NOT "is_locked";
|
|
519
|
-
`,
|
|
505
|
+
`,a`
|
|
520
506
|
CREATE INDEX "message_locked_dequeue_ix"
|
|
521
507
|
ON ${n(e.schema)}."message" (
|
|
522
508
|
"dequeue_after" ASC
|
|
523
509
|
) WHERE "is_locked";
|
|
524
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/03-function-wake.ts",
|
|
510
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/03-function-wake.ts",B={name:_(__filename),sql:(e)=>{let t=o.toString(e.schema);return[a`
|
|
525
511
|
CREATE FUNCTION ${n(e.schema)}."wake" (
|
|
526
512
|
p_delay_ms INTEGER
|
|
527
513
|
) RETURNS VOID AS $$
|
|
528
514
|
BEGIN
|
|
529
|
-
IF ${
|
|
530
|
-
PERFORM PG_NOTIFY(${
|
|
515
|
+
IF ${c(e.useWake)} THEN
|
|
516
|
+
PERFORM PG_NOTIFY(${c(t)}, p_delay_ms::TEXT);
|
|
531
517
|
END IF;
|
|
532
518
|
END;
|
|
533
519
|
$$ LANGUAGE plpgsql;
|
|
534
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/08-function-channel-policy-set.ts",
|
|
520
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/08-function-channel-policy-set.ts",H={name:_(__filename),sql:(e)=>{return[a`
|
|
535
521
|
CREATE FUNCTION ${n(e.schema)}."channel_policy_set" (
|
|
536
522
|
p_name TEXT,
|
|
537
523
|
p_max_size INTEGER,
|
|
@@ -563,7 +549,7 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
563
549
|
PERFORM ${n(e.schema)}."wake"(0);
|
|
564
550
|
END;
|
|
565
551
|
$$ LANGUAGE plpgsql;
|
|
566
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/09-function-channel-policy-clear.ts",k={name:
|
|
552
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/09-function-channel-policy-clear.ts",k={name:_(__filename),sql:(e)=>{return[a`
|
|
567
553
|
CREATE FUNCTION ${n(e.schema)}."channel_policy_clear" (
|
|
568
554
|
p_name TEXT
|
|
569
555
|
) RETURNS VOID AS $$
|
|
@@ -595,4 +581,4 @@ var E=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),w=(e)=
|
|
|
595
581
|
PERFORM ${n(e.schema)}."wake"(0);
|
|
596
582
|
END;
|
|
597
583
|
$$ LANGUAGE plpgsql;
|
|
598
|
-
`]}};class
|
|
584
|
+
`]}};class R{schema;channelName;registerFn;constructor(e){this.schema=e.schema,this.channelName=e.channelName,this.registerFn=e.registerFn}create(e){let t=new i({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 I{schema;channelName;constructor(e){this.schema=e.schema,this.channelName=e.channelName}async create(e){return new i({schema:this.schema,channelName:this.channelName,name:e.name,content:e.content,lockMs:e.lockMs,delayMs:e.delayMs}).execute(e.databaseClient)}}class L{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 I({schema:e.schema,channelName:e.channelName}),this.policy=new L({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,P,B,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 o.toString(this.schema)}}export{b as Queue,h as MessageDequeueCommand,u as MessageDeleteCommand,N as MessageDeferCommand,i as MessageCreateCommand,m as ChannelPolicySetCommand,r as ChannelPolicyClearCommand};
|