lonnymq 0.0.4 → 0.0.6

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