lonnymq 0.0.19 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -63
- package/dist/index.cjs +96 -144
- package/dist/index.d.ts +27 -95
- package/dist/index.js +96 -144
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,49 +1,44 @@
|
|
|
1
|
-
var{defineProperty:
|
|
2
|
-
SELECT 1 FROM ${
|
|
1
|
+
var{defineProperty:T,getOwnPropertyNames:P,getOwnPropertyDescriptor:w}=Object,Q=Object.prototype.hasOwnProperty;var y=new WeakMap,H=(e)=>{var t=y.get(e),a;if(t)return t;if(t=T({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")P(e).map((_)=>!Q.call(t,_)&&T(t,_,{get:()=>e[_],enumerable:!(a=w(e,_))||a.enumerable}));return y.set(e,t),t};var V=(e,t)=>{for(var a in t)T(e,a,{get:t[a],enumerable:!0,configurable:!0,set:(_)=>t[a]=()=>_})};var _e={};V(_e,{queueEventDecode:()=>M,Queue:()=>p,MessageDequeueCommand:()=>m,MessageDeleteCommand:()=>i,MessageDeferCommand:()=>u,MessageCreateCommand:()=>c,ChannelPolicySetCommand:()=>o,ChannelPolicyClearCommand:()=>l});module.exports=H(_e);var v=(e)=>{return e*1000};var d=v(0);var M=(e)=>{let t=JSON.parse(e);if(t.type===0)return{eventType:"MESSAGE_CREATED",id:t.id,delayMs:t.delay_ms};else if(t.type===1)return{eventType:"MESSAGE_DELETED",id:t.id};else if(t.type===2)return{eventType:"MESSAGE_DEFERRED",id:t.id,delayMs:t.delay_ms};else throw new Error("Unknown event type")};var r=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),W=(e)=>({nodeType:"RAW",value:e}),Y=(e)=>{return`'${e.replace(/'/g,"''")}'`},z=(e)=>{if(e===null)return"NULL";else if(typeof e==="string")return Y(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}`)},X=(e)=>{return`"${e.replace(/"/g,'""')}"`},J=(e)=>{if(e.nodeType==="VALUE")return z(e.value);else if(e.nodeType==="REF")return X(e.value);else if(e.nodeType==="RAW")return e.value;else throw new Error("Unsupported SQL node type")};var s=(e,...t)=>{let a=[];for(let _=0;_<e.length;_+=1)if(a.push(e[_]),_<t.length)a.push(J(t[_]));return W(a.join(""))};class l{schema;channelName;createdAt;constructor(e){this.schema=e.schema,this.channelName=e.channelName,this.createdAt=new Date}async execute(e){await e.query(s`
|
|
2
|
+
SELECT 1 FROM ${n(this.schema)}."channel_policy_clear"(
|
|
3
3
|
$1
|
|
4
4
|
)
|
|
5
|
-
`.value,[this.channelName])}}class
|
|
6
|
-
SELECT 1 FROM ${
|
|
5
|
+
`.value,[this.channelName])}}class o{schema;channelName;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 a=e.releaseIntervalMs??null;this.releaseIntervalMs=a!==null?Math.max(0,a):null,this.createdAt=new Date}async execute(e){await e.query(s`
|
|
6
|
+
SELECT 1 FROM ${n(this.schema)}."channel_policy_set"(
|
|
7
7
|
$1,
|
|
8
8
|
$2::INTEGER,
|
|
9
9
|
$3::INTEGER
|
|
10
10
|
)
|
|
11
|
-
`.value,[this.channelName,this.maxConcurrency,this.releaseIntervalMs])}}var
|
|
12
|
-
SELECT 1 FROM ${
|
|
11
|
+
`.value,[this.channelName,this.maxConcurrency,this.releaseIntervalMs])}}var I=require("crypto"),L=()=>{return I.randomBytes(16).toString("base64url")};var U=require("node:crypto");class c{schema;channelName;content;lockMs;id;delayMs;createdAt;constructor(e){let t=Math.max(0,e.lockMs),a=e.delayMs===void 0?d:e.delayMs;this.id=U.randomUUID(),this.schema=e.schema,this.channelName=e.channelName??L(),this.content=e.content,this.lockMs=t,this.delayMs=a,this.createdAt=new Date}async execute(e){await e.query(s`
|
|
12
|
+
SELECT 1 FROM ${n(this.schema)}."message_create"(
|
|
13
13
|
$1,
|
|
14
14
|
$2,
|
|
15
15
|
$3,
|
|
16
16
|
$4::BIGINT,
|
|
17
17
|
$5::BIGINT
|
|
18
18
|
)
|
|
19
|
-
`.value,[this.id,this.channelName,this.content,this.lockMs,this.delayMs])}}class m{schema;constructor(e){this.schema=e.schema}async execute(e){let t=await e.query(
|
|
19
|
+
`.value,[this.id,this.channelName,this.content,this.lockMs,this.delayMs])}}class m{schema;constructor(e){this.schema=e.schema}async execute(e){let t=await e.query(s`
|
|
20
20
|
SELECT
|
|
21
21
|
result_code,
|
|
22
22
|
metadata,
|
|
23
23
|
content,
|
|
24
24
|
state
|
|
25
|
-
FROM ${
|
|
26
|
-
`.value,[]).then((a)=>a.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,isUnlocked:t.metadata.is_unlocked,content:t.content,state:t.state,numAttempts:t.metadata.num_attempts}};else throw new Error("Unexpected dequeue result")}}class i{schema;id;numAttempts;constructor(e){this.schema=e.schema,this.id=e.id,this.numAttempts=e.numAttempts}async execute(e){let t=await e.query(
|
|
27
|
-
SELECT * FROM ${
|
|
25
|
+
FROM ${n(this.schema)}."message_dequeue"()
|
|
26
|
+
`.value,[]).then((a)=>a.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,isUnlocked:t.metadata.is_unlocked,content:t.content,state:t.state,numAttempts:t.metadata.num_attempts}};else throw new Error("Unexpected dequeue result")}}class i{schema;id;numAttempts;constructor(e){this.schema=e.schema,this.id=e.id,this.numAttempts=e.numAttempts}async execute(e){let t=await e.query(s`
|
|
27
|
+
SELECT * FROM ${n(this.schema)}."message_delete"(
|
|
28
28
|
$1,
|
|
29
29
|
$2::BIGINT
|
|
30
30
|
)
|
|
31
|
-
`.value,[this.id,this.numAttempts]).then((a)=>a.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")}}class u{schema;id;numAttempts;delayMs;state;constructor(e){let t=e.delayMs===void 0?
|
|
32
|
-
SELECT * FROM ${
|
|
31
|
+
`.value,[this.id,this.numAttempts]).then((a)=>a.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")}}class u{schema;id;numAttempts;delayMs;state;constructor(e){let t=e.delayMs===void 0?d:e.delayMs;this.schema=e.schema,this.numAttempts=e.numAttempts,this.id=e.id,this.delayMs=t,this.state=e.state??null}async execute(e){let t=await e.query(s`
|
|
32
|
+
SELECT * FROM ${n(this.schema)}."message_defer"(
|
|
33
33
|
$1,
|
|
34
34
|
$2::BIGINT,
|
|
35
35
|
$3::BIGINT,
|
|
36
36
|
$4
|
|
37
37
|
)
|
|
38
|
-
`.value,[this.id,this.numAttempts,this.delayMs,this.state]).then((a)=>a.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")}}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
$
|
|
42
|
-
)
|
|
43
|
-
`.value,[this.id,this.numAttempts]).then((a)=>a.rows[0]);if(t.result_code===0)return{resultType:"MESSAGE_NOT_FOUND"};else if(t.result_code===1)return{resultType:"MESSAGE_STATE_INVALID"};else if(t.result_code===2)return{resultType:"MESSAGE_HEARTBEATED"};else throw new Error("Unexpected result")}}var F=(e)=>{let t=e.split(`
|
|
44
|
-
`),a=Number.MAX_SAFE_INTEGER;for(let r of t){if(r.trim().length===0)continue;let h=r.search(/\S/);a=Math.min(a,h)}return t.map((r)=>r.slice(a)).join(`
|
|
45
|
-
`).trim()};var R=require("path"),__filename="/home/runner/work/lonnymq/lonnymq/src/core/path.ts",ae=R.dirname(R.dirname(__filename)),re=new RegExp(`^${ae}/`),E=(e)=>{return e.replace(re,"")};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/00-table-channel-policy.ts",G={name:E(__filename),sql:(e)=>{return[n`
|
|
46
|
-
CREATE TABLE ${s(e.schema)}."channel_policy" (
|
|
38
|
+
`.value,[this.id,this.numAttempts,this.delayMs,this.state]).then((a)=>a.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 O=(e)=>{let t=e.split(`
|
|
39
|
+
`),a=Number.MAX_SAFE_INTEGER;for(let _ of t){if(_.trim().length===0)continue;let k=_.search(/\S/);a=Math.min(a,k)}return t.map((_)=>_.slice(a)).join(`
|
|
40
|
+
`).trim()};var N=require("path"),__filename="/home/runner/work/lonnymq/lonnymq/src/core/path.ts",ee=N.dirname(N.dirname(__filename)),te=new RegExp(`^${ee}/`),E=(e)=>{return e.replace(te,"")};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/00-table-channel-policy.ts",C={name:E(__filename),sql:(e)=>{return[s`
|
|
41
|
+
CREATE TABLE ${n(e.schema)}."channel_policy" (
|
|
47
42
|
"id" UUID NOT NULL DEFAULT GEN_RANDOM_UUID(),
|
|
48
43
|
"name" TEXT NOT NULL,
|
|
49
44
|
"max_concurrency" INTEGER,
|
|
@@ -51,11 +46,11 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
51
46
|
"created_at" TIMESTAMP NOT NULL,
|
|
52
47
|
PRIMARY KEY ("id")
|
|
53
48
|
);
|
|
54
|
-
`,
|
|
49
|
+
`,s`
|
|
55
50
|
CREATE UNIQUE INDEX "channel_policy_name_ux"
|
|
56
|
-
ON ${
|
|
57
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/01-table-channel-state.ts",
|
|
58
|
-
CREATE TABLE ${
|
|
51
|
+
ON ${n(e.schema)}."channel_policy" ("name");
|
|
52
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/01-table-channel-state.ts",f={name:E(__filename),sql:(e)=>{return[s`
|
|
53
|
+
CREATE TABLE ${n(e.schema)}."channel_state" (
|
|
59
54
|
"id" UUID NOT NULL DEFAULT GEN_RANDOM_UUID(),
|
|
60
55
|
"name" TEXT NOT NULL,
|
|
61
56
|
"max_concurrency" INTEGER,
|
|
@@ -70,17 +65,17 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
70
65
|
"created_at" TIMESTAMP NOT NULL,
|
|
71
66
|
PRIMARY KEY ("id")
|
|
72
67
|
);
|
|
73
|
-
`,
|
|
68
|
+
`,s`
|
|
74
69
|
CREATE UNIQUE INDEX "channel_state_name_ux"
|
|
75
|
-
ON ${
|
|
76
|
-
`,
|
|
70
|
+
ON ${n(e.schema)}."channel_state" ("name");
|
|
71
|
+
`,s`
|
|
77
72
|
CREATE INDEX "channel_state_dequeue_ix"
|
|
78
|
-
ON ${
|
|
73
|
+
ON ${n(e.schema)}."channel_state" (
|
|
79
74
|
"active_next_at" ASC
|
|
80
75
|
) WHERE "message_id" IS NOT NULL
|
|
81
76
|
AND ("max_concurrency" IS NULL OR "current_concurrency" < "max_concurrency");
|
|
82
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/02-table-message.ts",q={name:E(__filename),sql:(e)=>{return[
|
|
83
|
-
CREATE TABLE ${
|
|
77
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/02-table-message.ts",q={name:E(__filename),sql:(e)=>{return[s`
|
|
78
|
+
CREATE TABLE ${n(e.schema)}."message" (
|
|
84
79
|
"id" UUID NOT NULL,
|
|
85
80
|
"channel_name" TEXT NOT NULL,
|
|
86
81
|
"seq_no" BIGSERIAL NOT NULL,
|
|
@@ -94,20 +89,20 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
94
89
|
"created_at" TIMESTAMP NOT NULL,
|
|
95
90
|
PRIMARY KEY ("id")
|
|
96
91
|
);
|
|
97
|
-
`,
|
|
92
|
+
`,s`
|
|
98
93
|
CREATE INDEX "message_dequeue_ix"
|
|
99
|
-
ON ${
|
|
94
|
+
ON ${n(e.schema)}."message" (
|
|
100
95
|
"channel_name",
|
|
101
96
|
"dequeue_at" ASC,
|
|
102
97
|
"seq_no" ASC
|
|
103
98
|
) WHERE NOT "is_locked";
|
|
104
|
-
`,
|
|
99
|
+
`,s`
|
|
105
100
|
CREATE INDEX "message_locked_dequeue_ix"
|
|
106
|
-
ON ${
|
|
101
|
+
ON ${n(e.schema)}."message" (
|
|
107
102
|
"unlock_at" ASC
|
|
108
103
|
) WHERE "is_locked";
|
|
109
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/03-function-message-create.ts"
|
|
110
|
-
CREATE FUNCTION ${
|
|
104
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/03-function-message-create.ts",x={name:E(__filename),sql:(e)=>{return[s`
|
|
105
|
+
CREATE FUNCTION ${n(e.schema)}."message_create" (
|
|
111
106
|
p_id UUID,
|
|
112
107
|
p_channel_name TEXT,
|
|
113
108
|
p_content BYTEA,
|
|
@@ -122,7 +117,7 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
122
117
|
BEGIN
|
|
123
118
|
v_now := NOW();
|
|
124
119
|
|
|
125
|
-
INSERT INTO ${
|
|
120
|
+
INSERT INTO ${n(e.schema)}."message" (
|
|
126
121
|
"id",
|
|
127
122
|
"channel_name",
|
|
128
123
|
"content",
|
|
@@ -149,12 +144,12 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
149
144
|
SELECT
|
|
150
145
|
"channel_policy"."max_concurrency",
|
|
151
146
|
"channel_policy"."release_interval_ms"
|
|
152
|
-
FROM ${
|
|
147
|
+
FROM ${n(e.schema)}."channel_policy"
|
|
153
148
|
WHERE "name" = p_channel_name
|
|
154
149
|
FOR SHARE
|
|
155
150
|
INTO v_channel_policy;
|
|
156
151
|
|
|
157
|
-
INSERT INTO ${
|
|
152
|
+
INSERT INTO ${n(e.schema)}."channel_state" (
|
|
158
153
|
"name",
|
|
159
154
|
"current_concurrency",
|
|
160
155
|
"current_size",
|
|
@@ -189,7 +184,7 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
189
184
|
v_message."dequeue_at" < v_channel_state."message_dequeue_at" OR
|
|
190
185
|
v_message."dequeue_at" = v_channel_state."message_dequeue_at" AND v_message."seq_no" < v_channel_state."message_seq_no"
|
|
191
186
|
THEN
|
|
192
|
-
UPDATE ${
|
|
187
|
+
UPDATE ${n(e.schema)}."channel_state" SET
|
|
193
188
|
"current_size" = v_channel_state."current_size" + 1,
|
|
194
189
|
"message_id" = v_message."id",
|
|
195
190
|
"message_dequeue_at" = v_message."dequeue_at",
|
|
@@ -200,16 +195,16 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
200
195
|
)
|
|
201
196
|
WHERE "id" = v_channel_state."id";
|
|
202
197
|
ELSE
|
|
203
|
-
UPDATE ${
|
|
198
|
+
UPDATE ${n(e.schema)}."channel_state" SET
|
|
204
199
|
"current_size" = v_channel_state."current_size" + 1
|
|
205
200
|
WHERE "id" = v_channel_state."id";
|
|
206
201
|
END IF;
|
|
207
202
|
|
|
208
|
-
IF ${
|
|
203
|
+
IF ${r(e.eventChannel!==null)} THEN
|
|
209
204
|
PERFORM PG_NOTIFY(
|
|
210
|
-
${
|
|
205
|
+
${r(e.eventChannel)},
|
|
211
206
|
JSON_BUILD_OBJECT(
|
|
212
|
-
'type', ${
|
|
207
|
+
'type', ${r(0)},
|
|
213
208
|
'id', p_id,
|
|
214
209
|
'delay_ms', p_delay_ms
|
|
215
210
|
)::TEXT
|
|
@@ -217,7 +212,7 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
217
212
|
END IF;
|
|
218
213
|
END;
|
|
219
214
|
$$ LANGUAGE plpgsql;
|
|
220
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/04-function-message-dequeue.ts",
|
|
215
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/04-function-message-dequeue.ts",ne=(e)=>s`
|
|
221
216
|
SELECT
|
|
222
217
|
"message"."id",
|
|
223
218
|
"message"."state",
|
|
@@ -226,11 +221,11 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
226
221
|
"message"."lock_ms",
|
|
227
222
|
"message"."unlock_at",
|
|
228
223
|
"message"."num_attempts"
|
|
229
|
-
FROM ${
|
|
224
|
+
FROM ${n(e.schema)}."message"
|
|
230
225
|
WHERE "is_locked"
|
|
231
226
|
AND "unlock_at" <= ${e.now}
|
|
232
227
|
ORDER BY "unlock_at" ASC
|
|
233
|
-
`,
|
|
228
|
+
`,se=(e)=>s`
|
|
234
229
|
SELECT
|
|
235
230
|
"channel_state"."id",
|
|
236
231
|
"channel_state"."name",
|
|
@@ -239,21 +234,21 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
239
234
|
"channel_state"."active_next_at",
|
|
240
235
|
"channel_state"."active_prev_at",
|
|
241
236
|
"channel_state"."current_concurrency"
|
|
242
|
-
FROM ${
|
|
237
|
+
FROM ${n(e.schema)}."channel_state"
|
|
243
238
|
WHERE "message_id" IS NOT NULL
|
|
244
239
|
AND ("max_concurrency" IS NULL OR "current_concurrency" < "max_concurrency")
|
|
245
240
|
ORDER BY "active_next_at" ASC
|
|
246
|
-
`,
|
|
241
|
+
`,ae=(e)=>s`
|
|
247
242
|
SELECT
|
|
248
243
|
"message"."id",
|
|
249
244
|
"message"."dequeue_at",
|
|
250
245
|
"message"."seq_no"
|
|
251
|
-
FROM ${
|
|
246
|
+
FROM ${n(e.schema)}."message"
|
|
252
247
|
WHERE NOT "is_locked"
|
|
253
248
|
AND "channel_name" = ${e.channelName}
|
|
254
249
|
ORDER BY "dequeue_at" ASC, "seq_no" ASC
|
|
255
|
-
`,
|
|
256
|
-
CREATE FUNCTION ${
|
|
250
|
+
`,G={name:E(__filename),sql:(e)=>{let t=ne({now:s`v_now`,schema:e.schema}),a=ae({channelName:s`v_channel_state."name"`,schema:e.schema}),_=se({schema:e.schema});return[s`
|
|
251
|
+
CREATE FUNCTION ${n(e.schema)}."message_dequeue" ()
|
|
257
252
|
RETURNS TABLE (
|
|
258
253
|
result_code INTEGER,
|
|
259
254
|
content BYTEA,
|
|
@@ -276,13 +271,13 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
276
271
|
INTO v_message_locked;
|
|
277
272
|
|
|
278
273
|
IF v_message_locked."id" IS NOT NULL THEN
|
|
279
|
-
UPDATE ${
|
|
274
|
+
UPDATE ${n(e.schema)}."message" SET
|
|
280
275
|
"num_attempts" = v_message_locked."num_attempts" + 1,
|
|
281
276
|
"unlock_at" = v_now + (v_message_locked."lock_ms" * INTERVAL '1 millisecond')
|
|
282
277
|
WHERE "id" = v_message_locked."id";
|
|
283
278
|
|
|
284
279
|
RETURN QUERY SELECT
|
|
285
|
-
${
|
|
280
|
+
${r(1)},
|
|
286
281
|
v_message_locked.content,
|
|
287
282
|
v_message_locked.state,
|
|
288
283
|
JSON_BUILD_OBJECT(
|
|
@@ -294,7 +289,7 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
294
289
|
RETURN;
|
|
295
290
|
END IF;
|
|
296
291
|
|
|
297
|
-
${
|
|
292
|
+
${_}
|
|
298
293
|
FOR UPDATE
|
|
299
294
|
SKIP LOCKED
|
|
300
295
|
LIMIT 1
|
|
@@ -302,7 +297,7 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
302
297
|
|
|
303
298
|
IF v_channel_state."id" IS NULL THEN
|
|
304
299
|
RETURN QUERY SELECT
|
|
305
|
-
${
|
|
300
|
+
${r(0)},
|
|
306
301
|
NULL::BYTEA,
|
|
307
302
|
NULL::BYTEA,
|
|
308
303
|
JSON_BUILD_OBJECT('retry_ms', NULL);
|
|
@@ -311,7 +306,7 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
311
306
|
|
|
312
307
|
IF v_channel_state."active_next_at" > v_now THEN
|
|
313
308
|
RETURN QUERY SELECT
|
|
314
|
-
${
|
|
309
|
+
${r(0)},
|
|
315
310
|
NULL::BYTEA,
|
|
316
311
|
NULL::BYTEA,
|
|
317
312
|
JSON_BUILD_OBJECT(
|
|
@@ -327,11 +322,11 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
327
322
|
"message"."num_attempts",
|
|
328
323
|
"message"."state",
|
|
329
324
|
"message"."lock_ms"
|
|
330
|
-
FROM ${
|
|
325
|
+
FROM ${n(e.schema)}."message"
|
|
331
326
|
WHERE "id" = v_channel_state."message_id"
|
|
332
327
|
INTO v_message_dequeue;
|
|
333
328
|
|
|
334
|
-
UPDATE ${
|
|
329
|
+
UPDATE ${n(e.schema)}."message" SET
|
|
335
330
|
"is_locked" = TRUE,
|
|
336
331
|
"num_attempts" = v_message_dequeue."num_attempts" + 1,
|
|
337
332
|
"unlock_at" = v_now + (v_message_dequeue."lock_ms" * INTERVAL '1 millisecond')
|
|
@@ -342,13 +337,13 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
342
337
|
INTO v_message_next;
|
|
343
338
|
|
|
344
339
|
IF v_message_next."id" IS NULL THEN
|
|
345
|
-
UPDATE ${
|
|
340
|
+
UPDATE ${n(e.schema)}."channel_state" SET
|
|
346
341
|
"current_concurrency" = v_channel_state."current_concurrency" + 1,
|
|
347
342
|
"active_prev_at" = v_now,
|
|
348
343
|
"message_id" = NULL
|
|
349
344
|
WHERE "id" = v_channel_state."id";
|
|
350
345
|
ELSE
|
|
351
|
-
UPDATE ${
|
|
346
|
+
UPDATE ${n(e.schema)}."channel_state" SET
|
|
352
347
|
"current_concurrency" = v_channel_state."current_concurrency" + 1,
|
|
353
348
|
"message_id" = v_message_next."id",
|
|
354
349
|
"message_dequeue_at" = v_message_next."dequeue_at",
|
|
@@ -362,7 +357,7 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
362
357
|
END IF;
|
|
363
358
|
|
|
364
359
|
RETURN QUERY SELECT
|
|
365
|
-
${
|
|
360
|
+
${r(1)},
|
|
366
361
|
v_message_dequeue.content,
|
|
367
362
|
v_message_dequeue.state,
|
|
368
363
|
JSON_BUILD_OBJECT(
|
|
@@ -374,8 +369,8 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
374
369
|
RETURN;
|
|
375
370
|
END;
|
|
376
371
|
$$ LANGUAGE plpgsql;
|
|
377
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/05-function-message-delete.ts"
|
|
378
|
-
CREATE FUNCTION ${
|
|
372
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/05-function-message-delete.ts",$={name:E(__filename),sql:(e)=>{return[s`
|
|
373
|
+
CREATE FUNCTION ${n(e.schema)}."message_delete" (
|
|
379
374
|
p_id UUID,
|
|
380
375
|
p_num_attempts BIGINT
|
|
381
376
|
)
|
|
@@ -392,24 +387,24 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
392
387
|
"message"."channel_name",
|
|
393
388
|
"message"."num_attempts",
|
|
394
389
|
"message"."is_locked"
|
|
395
|
-
FROM ${
|
|
390
|
+
FROM ${n(e.schema)}."message"
|
|
396
391
|
WHERE "id" = p_id
|
|
397
392
|
FOR UPDATE
|
|
398
393
|
INTO v_message;
|
|
399
394
|
|
|
400
395
|
IF v_message."id" IS NULL THEN
|
|
401
396
|
RETURN QUERY SELECT
|
|
402
|
-
${
|
|
397
|
+
${r(0)};
|
|
403
398
|
RETURN;
|
|
404
399
|
ELSIF NOT v_message."is_locked" OR v_message."num_attempts" <> p_num_attempts THEN
|
|
405
400
|
RETURN QUERY SELECT
|
|
406
|
-
${
|
|
401
|
+
${r(1)};
|
|
407
402
|
RETURN;
|
|
408
403
|
END IF;
|
|
409
404
|
|
|
410
405
|
SELECT
|
|
411
406
|
"channel_policy"."id"
|
|
412
|
-
FROM ${
|
|
407
|
+
FROM ${n(e.schema)}."channel_policy"
|
|
413
408
|
WHERE "name" = v_message."channel_name"
|
|
414
409
|
FOR SHARE
|
|
415
410
|
INTO v_channel_policy;
|
|
@@ -418,41 +413,41 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
418
413
|
"channel_state"."id",
|
|
419
414
|
"channel_state"."current_size",
|
|
420
415
|
"channel_state"."current_concurrency"
|
|
421
|
-
FROM ${
|
|
416
|
+
FROM ${n(e.schema)}."channel_state"
|
|
422
417
|
WHERE "name" = v_message."channel_name"
|
|
423
418
|
FOR UPDATE
|
|
424
419
|
INTO v_channel_state;
|
|
425
420
|
|
|
426
421
|
IF v_channel_policy."id" IS NULL AND v_channel_state."current_size" = 1 THEN
|
|
427
|
-
DELETE FROM ${
|
|
422
|
+
DELETE FROM ${n(e.schema)}."channel_state"
|
|
428
423
|
WHERE "id" = v_channel_state."id";
|
|
429
424
|
ELSE
|
|
430
|
-
UPDATE ${
|
|
425
|
+
UPDATE ${n(e.schema)}."channel_state" SET
|
|
431
426
|
"current_concurrency" = v_channel_state."current_concurrency" - 1,
|
|
432
427
|
"current_size" = v_channel_state."current_size" - 1
|
|
433
428
|
WHERE "id" = v_channel_state."id";
|
|
434
429
|
END IF;
|
|
435
430
|
|
|
436
|
-
IF ${
|
|
431
|
+
IF ${r(e.eventChannel!==null)} THEN
|
|
437
432
|
PERFORM PG_NOTIFY(
|
|
438
|
-
${
|
|
433
|
+
${r(e.eventChannel)},
|
|
439
434
|
JSON_BUILD_OBJECT(
|
|
440
|
-
'type', ${
|
|
435
|
+
'type', ${r(1)},
|
|
441
436
|
'id', p_id
|
|
442
437
|
)::TEXT
|
|
443
438
|
);
|
|
444
439
|
END IF;
|
|
445
440
|
|
|
446
|
-
DELETE FROM ${
|
|
441
|
+
DELETE FROM ${n(e.schema)}."message"
|
|
447
442
|
WHERE "id" = p_id;
|
|
448
443
|
|
|
449
444
|
RETURN QUERY SELECT
|
|
450
|
-
${
|
|
445
|
+
${r(2)};
|
|
451
446
|
RETURN;
|
|
452
447
|
END;
|
|
453
448
|
$$ LANGUAGE plpgsql;
|
|
454
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/06-function-message-defer.ts",
|
|
455
|
-
CREATE FUNCTION ${
|
|
449
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/06-function-message-defer.ts",F={name:E(__filename),sql:(e)=>{return[s`
|
|
450
|
+
CREATE FUNCTION ${n(e.schema)}."message_defer" (
|
|
456
451
|
p_id UUID,
|
|
457
452
|
p_num_attempts BIGINT,
|
|
458
453
|
p_delay_ms BIGINT,
|
|
@@ -475,18 +470,18 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
475
470
|
"message"."num_attempts",
|
|
476
471
|
"message"."is_locked",
|
|
477
472
|
"message"."seq_no"
|
|
478
|
-
FROM ${
|
|
473
|
+
FROM ${n(e.schema)}."message"
|
|
479
474
|
WHERE "id" = p_id
|
|
480
475
|
FOR UPDATE
|
|
481
476
|
INTO v_message;
|
|
482
477
|
|
|
483
478
|
IF v_message."id" IS NULL THEN
|
|
484
479
|
RETURN QUERY SELECT
|
|
485
|
-
${
|
|
480
|
+
${r(0)};
|
|
486
481
|
RETURN;
|
|
487
482
|
ELSIF NOT v_message."is_locked" OR v_message."num_attempts" <> p_num_attempts THEN
|
|
488
483
|
RETURN QUERY SELECT
|
|
489
|
-
${
|
|
484
|
+
${r(1)};
|
|
490
485
|
RETURN;
|
|
491
486
|
END IF;
|
|
492
487
|
|
|
@@ -497,7 +492,7 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
497
492
|
"channel_state"."message_dequeue_at",
|
|
498
493
|
"channel_state"."active_prev_at",
|
|
499
494
|
"channel_state"."message_seq_no"
|
|
500
|
-
FROM ${
|
|
495
|
+
FROM ${n(e.schema)}."channel_state"
|
|
501
496
|
WHERE "name" = v_message."channel_name"
|
|
502
497
|
FOR UPDATE
|
|
503
498
|
INTO v_channel_state;
|
|
@@ -509,7 +504,7 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
509
504
|
v_dequeue_at < v_channel_state."message_dequeue_at" OR
|
|
510
505
|
v_dequeue_at = v_channel_state."message_dequeue_at" AND v_message."seq_no" < v_channel_state."message_seq_no"
|
|
511
506
|
THEN
|
|
512
|
-
UPDATE ${
|
|
507
|
+
UPDATE ${n(e.schema)}."channel_state" SET
|
|
513
508
|
"current_concurrency" = v_channel_state."current_concurrency" - 1,
|
|
514
509
|
"message_id" = v_message."id",
|
|
515
510
|
"message_dequeue_at" = v_dequeue_at,
|
|
@@ -520,22 +515,22 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
520
515
|
)
|
|
521
516
|
WHERE "name" = v_message."channel_name";
|
|
522
517
|
ELSE
|
|
523
|
-
UPDATE ${
|
|
518
|
+
UPDATE ${n(e.schema)}."channel_state" SET
|
|
524
519
|
"current_concurrency" = v_channel_state."current_concurrency" - 1
|
|
525
520
|
WHERE "name" = v_message."channel_name";
|
|
526
521
|
END IF;
|
|
527
522
|
|
|
528
|
-
UPDATE ${
|
|
523
|
+
UPDATE ${n(e.schema)}."message" SET
|
|
529
524
|
"state" = p_state,
|
|
530
525
|
"is_locked" = FALSE,
|
|
531
526
|
"dequeue_at" = v_dequeue_at
|
|
532
527
|
WHERE "id" = p_id;
|
|
533
528
|
|
|
534
|
-
IF ${
|
|
529
|
+
IF ${r(e.eventChannel!==null)} THEN
|
|
535
530
|
PERFORM PG_NOTIFY(
|
|
536
|
-
${
|
|
531
|
+
${r(e.eventChannel)},
|
|
537
532
|
JSON_BUILD_OBJECT(
|
|
538
|
-
'type', ${
|
|
533
|
+
'type', ${r(2)},
|
|
539
534
|
'delay_ms', p_delay_ms,
|
|
540
535
|
'id', p_id
|
|
541
536
|
)::TEXT
|
|
@@ -543,84 +538,41 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
543
538
|
END IF;
|
|
544
539
|
|
|
545
540
|
RETURN QUERY SELECT
|
|
546
|
-
${
|
|
547
|
-
RETURN;
|
|
548
|
-
END;
|
|
549
|
-
$$ LANGUAGE plpgsql;
|
|
550
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/07-function-message-heartbeat.ts",w={name:E(__filename),sql:(e)=>{return[n`
|
|
551
|
-
CREATE FUNCTION ${s(e.schema)}."message_heartbeat" (
|
|
552
|
-
p_id UUID,
|
|
553
|
-
p_num_attempts BIGINT
|
|
554
|
-
)
|
|
555
|
-
RETURNS TABLE (
|
|
556
|
-
result_code INTEGER
|
|
557
|
-
) AS $$
|
|
558
|
-
DECLARE
|
|
559
|
-
v_now TIMESTAMP;
|
|
560
|
-
v_message RECORD;
|
|
561
|
-
BEGIN
|
|
562
|
-
v_now := NOW();
|
|
563
|
-
|
|
564
|
-
SELECT
|
|
565
|
-
"message"."id",
|
|
566
|
-
"message"."is_locked",
|
|
567
|
-
"message"."num_attempts",
|
|
568
|
-
"message"."lock_ms"
|
|
569
|
-
FROM ${s(e.schema)}."message"
|
|
570
|
-
WHERE "id" = p_id
|
|
571
|
-
FOR UPDATE
|
|
572
|
-
INTO v_message;
|
|
573
|
-
|
|
574
|
-
IF v_message."id" IS NULL THEN
|
|
575
|
-
RETURN QUERY SELECT
|
|
576
|
-
${_(0)};
|
|
577
|
-
RETURN;
|
|
578
|
-
ELSIF NOT v_message."is_locked" OR v_message."num_attempts" <> p_num_attempts THEN
|
|
579
|
-
RETURN QUERY SELECT
|
|
580
|
-
${_(1)};
|
|
581
|
-
RETURN;
|
|
582
|
-
END IF;
|
|
583
|
-
|
|
584
|
-
UPDATE ${s(e.schema)}."message" SET
|
|
585
|
-
"unlock_at" = v_now + INTERVAL '1 MILLISECOND' * v_message."lock_ms"
|
|
586
|
-
WHERE "id" = p_id;
|
|
587
|
-
|
|
588
|
-
RETURN QUERY SELECT
|
|
589
|
-
${_(2)};
|
|
541
|
+
${r(2)};
|
|
590
542
|
RETURN;
|
|
591
543
|
END;
|
|
592
544
|
$$ LANGUAGE plpgsql;
|
|
593
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/08-function-channel-policy-clear.ts",
|
|
594
|
-
CREATE FUNCTION ${
|
|
545
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/08-function-channel-policy-clear.ts",b={name:E(__filename),sql:(e)=>{return[s`
|
|
546
|
+
CREATE FUNCTION ${n(e.schema)}."channel_policy_clear" (
|
|
595
547
|
p_name TEXT
|
|
596
548
|
) RETURNS VOID AS $$
|
|
597
549
|
DECLARE
|
|
598
550
|
v_channel_state RECORD;
|
|
599
551
|
BEGIN
|
|
600
|
-
DELETE FROM ${
|
|
552
|
+
DELETE FROM ${n(e.schema)}."channel_policy"
|
|
601
553
|
WHERE "name" = p_name;
|
|
602
554
|
|
|
603
555
|
SELECT
|
|
604
556
|
"channel_state"."id",
|
|
605
557
|
"channel_state"."current_size"
|
|
606
|
-
FROM ${
|
|
558
|
+
FROM ${n(e.schema)}."channel_state"
|
|
607
559
|
WHERE "name" = p_name
|
|
608
560
|
FOR UPDATE
|
|
609
561
|
INTO v_channel_state;
|
|
610
562
|
|
|
611
563
|
IF v_channel_state."current_size" = 0 THEN
|
|
612
|
-
DELETE FROM ${
|
|
564
|
+
DELETE FROM ${n(e.schema)}."channel_state"
|
|
613
565
|
WHERE "id" = v_channel_state."id";
|
|
614
566
|
ELSE
|
|
615
|
-
UPDATE ${
|
|
567
|
+
UPDATE ${n(e.schema)}."channel_state" SET
|
|
616
568
|
"max_concurrency" = NULL,
|
|
617
569
|
"release_interval_ms" = NULL
|
|
618
570
|
WHERE "name" = p_name;
|
|
619
571
|
END IF;
|
|
620
572
|
END;
|
|
621
573
|
$$ LANGUAGE plpgsql;
|
|
622
|
-
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/09-function-channel-policy-set.ts",
|
|
623
|
-
CREATE FUNCTION ${
|
|
574
|
+
`]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/09-function-channel-policy-set.ts",B={name:E(__filename),sql:(e)=>{return[s`
|
|
575
|
+
CREATE FUNCTION ${n(e.schema)}."channel_policy_set" (
|
|
624
576
|
p_name TEXT,
|
|
625
577
|
p_max_concurrency INTEGER,
|
|
626
578
|
p_release_interval_ms INTEGER
|
|
@@ -630,7 +582,7 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
630
582
|
BEGIN
|
|
631
583
|
v_now := NOW();
|
|
632
584
|
|
|
633
|
-
INSERT INTO ${
|
|
585
|
+
INSERT INTO ${n(e.schema)}."channel_policy" (
|
|
634
586
|
"name",
|
|
635
587
|
"max_concurrency",
|
|
636
588
|
"release_interval_ms",
|
|
@@ -644,10 +596,10 @@ var{defineProperty:N,getOwnPropertyNames:Q,getOwnPropertyDescriptor:V}=Object,W=
|
|
|
644
596
|
"max_concurrency" = EXCLUDED."max_concurrency",
|
|
645
597
|
"release_interval_ms" = EXCLUDED."release_interval_ms";
|
|
646
598
|
|
|
647
|
-
UPDATE ${
|
|
599
|
+
UPDATE ${n(e.schema)}."channel_state" SET
|
|
648
600
|
"max_concurrency" = p_max_concurrency,
|
|
649
601
|
"release_interval_ms" = p_release_interval_ms
|
|
650
602
|
WHERE "name" = p_name;
|
|
651
603
|
END;
|
|
652
604
|
$$ LANGUAGE plpgsql;
|
|
653
|
-
`]}};class S{schema;channelName;
|
|
605
|
+
`]}};class S{schema;channelName;adaptor;constructor(e){this.schema=e.schema,this.adaptor=e.adaptor,this.channelName=e.channelName}async create(e){let t=this.adaptor(e.databaseClient),a=new c({schema:this.schema,channelName:this.channelName,content:e.content,lockMs:e.lockMs,delayMs:e.delayMs});return await a.execute(t),{messageId:a.id}}}class R{schema;adaptor;channelName;constructor(e){this.schema=e.schema,this.adaptor=e.adaptor,this.channelName=e.channelName}set(e){let t=this.adaptor(e.databaseClient);return new o({schema:this.schema,channelName:this.channelName,maxConcurrency:e.maxConcurrency,releaseIntervalMs:e.releaseIntervalMs}).execute(t)}clear(e){let t=this.adaptor(e.databaseClient);return new l({schema:this.schema,channelName:this.channelName}).execute(t)}}class A{policy;message;constructor(e){this.message=new S({schema:e.schema,adaptor:e.adaptor,channelName:e.channelName}),this.policy=new R({schema:e.schema,adaptor:e.adaptor,channelName:e.channelName})}}class D{schema;adaptor;id;isUnlocked;channelName;content;state;numAttempts;constructor(e){this.schema=e.schema,this.adaptor=e.adaptor,this.id=e.id,this.channelName=e.channelName,this.isUnlocked=e.isUnlocked,this.content=e.content,this.state=e.state,this.numAttempts=e.numAttempts}async defer(e){let t=this.adaptor(e.databaseClient);return new u({schema:this.schema,id:this.id,numAttempts:this.numAttempts,delayMs:e.delayMs,state:e.state}).execute(t)}async delete(e){let t=this.adaptor(e.databaseClient);return new i({schema:this.schema,numAttempts:this.numAttempts,id:this.id}).execute(t)}}class g{schema;adaptor;constructor(e){this.schema=e.schema,this.adaptor=e.adaptor}async create(e){let t=this.adaptor(e.databaseClient),a=new c({schema:this.schema,content:e.content,lockMs:e.lockMs,delayMs:e.delayMs});return await a.execute(t),{messageId:a.id,channelName:a.channelName}}}class p{schema;adaptor;message;constructor(e){this.schema=e.schema,this.adaptor=e.adaptor?e.adaptor:(t)=>t,this.message=new g({schema:this.schema,adaptor:this.adaptor})}async dequeue(e){let t=new m({schema:this.schema}),a=this.adaptor(e.databaseClient),_=await t.execute(a);if(_.resultType==="MESSAGE_DEQUEUED")return{resultType:"MESSAGE_DEQUEUED",message:new D({schema:this.schema,adaptor:this.adaptor,id:_.message.id,channelName:_.message.channelName,isUnlocked:_.message.isUnlocked,content:_.message.content,state:_.message.state,numAttempts:_.message.numAttempts})};else return _}channel(e){return new A({adaptor:this.adaptor,schema:this.schema,channelName:e})}migrations(e={}){return[C,f,q,x,G,$,F,B,b].sort((t,a)=>t.name.localeCompare(a.name)).flatMap((t)=>t.sql({schema:this.schema,eventChannel:e.eventChannel??null})).map((t)=>O(t.value))}}
|