lonnymq 0.0.22 → 0.0.23

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 CHANGED
@@ -26,9 +26,9 @@ databaseClient satisfies DatabaseClient
26
26
 
27
27
  const queue = new Queue({ schema: "lonny" })
28
28
 
29
- // Run migrations first
30
- for (const migration of queue.migrations()) {
31
- await databaseClient.query(migration, [])
29
+ // Install the queue
30
+ for (const sql of queue.install()) {
31
+ await databaseClient.query(sql, [])
32
32
  }
33
33
 
34
34
  // Create messages
@@ -60,26 +60,7 @@ LonnyMQ can be installed from npm:
60
60
  npm install lonnymq
61
61
  ```
62
62
 
63
- Once the package is installed, you need to install the required database schema. LonnyMQ is agnostic to database client and migration process, providing users with an ordered list of migrations - each containing a unique name and SQL fragments to be executed.
64
-
65
- ```typescript
66
- const queue = new Queue({ schema: "lonny" })
67
- const migrations = queue.migrations()
68
-
69
- // Execute migrations (in a transaction for safety)
70
- await databaseClient.query("BEGIN")
71
- try {
72
- for (const migration of migrations) {
73
- await databaseClient.query(migration, [])
74
- }
75
- await databaseClient.query("COMMIT")
76
- } catch (error) {
77
- await databaseClient.query("ROLLBACK")
78
- throw error
79
- }
80
- ```
81
-
82
- **Note:** Migration SQL is not idempotent and should be executed within a transaction that can be rolled back if an error occurs.
63
+ Once the package is installed, the queue needs to be "installed" to a postgres schema. The requisite SQL for this can be generated via: `queue.install()`.
83
64
 
84
65
  ## Channels
85
66
 
@@ -194,10 +175,10 @@ Using PostgreSQL `NOTIFY`, we can receive a granular stream of queue events:
194
175
  2. `MESSAGE_DEFERRED`
195
176
  4. `MESSAGE_DELETED`
196
177
 
197
- To enable this feature, ensure the optional `eventChannel` is defined when constructing the SQL migrations.
178
+ To enable this feature, ensure the optional `eventChannel` is defined when generating the installation SQL.
198
179
 
199
180
  ```typescript
200
- const migrations = queue.migrations({ eventChannel: "EVENTS"})
181
+ const install = queue.install({ eventChannel: "EVENTS"})
201
182
  ```
202
183
 
203
184
  ### Improving on Polling
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
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`
1
+ var{defineProperty:T,getOwnPropertyNames:w,getOwnPropertyDescriptor:P}=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")w(e).map((_)=>!Q.call(t,_)&&T(t,_,{get:()=>e[_],enumerable:!(a=P(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
2
  SELECT 1 FROM ${n(this.schema)}."channel_policy_clear"(
3
3
  $1
4
4
  )
@@ -37,7 +37,7 @@ var{defineProperty:T,getOwnPropertyNames:P,getOwnPropertyDescriptor:w}=Object,Q=
37
37
  )
38
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
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`
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/install/00-table-channel-policy.ts",C={name:E(__filename),sql:(e)=>{return[s`
41
41
  CREATE TABLE ${n(e.schema)}."channel_policy" (
42
42
  "id" UUID NOT NULL DEFAULT GEN_RANDOM_UUID(),
43
43
  "name" TEXT NOT NULL,
@@ -49,7 +49,7 @@ var{defineProperty:T,getOwnPropertyNames:P,getOwnPropertyDescriptor:w}=Object,Q=
49
49
  `,s`
50
50
  CREATE UNIQUE INDEX "channel_policy_name_ux"
51
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`
52
+ `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/01-table-channel-state.ts",f={name:E(__filename),sql:(e)=>{return[s`
53
53
  CREATE TABLE ${n(e.schema)}."channel_state" (
54
54
  "id" UUID NOT NULL DEFAULT GEN_RANDOM_UUID(),
55
55
  "name" TEXT NOT NULL,
@@ -74,7 +74,7 @@ var{defineProperty:T,getOwnPropertyNames:P,getOwnPropertyDescriptor:w}=Object,Q=
74
74
  "active_next_at" ASC
75
75
  ) WHERE "message_id" IS NOT NULL
76
76
  AND ("max_concurrency" IS NULL OR "current_concurrency" < "max_concurrency");
77
- `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/02-table-message.ts",q={name:E(__filename),sql:(e)=>{return[s`
77
+ `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/02-table-message.ts",q={name:E(__filename),sql:(e)=>{return[s`
78
78
  CREATE TABLE ${n(e.schema)}."message" (
79
79
  "id" UUID NOT NULL,
80
80
  "channel_name" TEXT NOT NULL,
@@ -101,7 +101,7 @@ var{defineProperty:T,getOwnPropertyNames:P,getOwnPropertyDescriptor:w}=Object,Q=
101
101
  ON ${n(e.schema)}."message" (
102
102
  "unlock_at" ASC
103
103
  ) WHERE "is_locked";
104
- `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/03-function-message-create.ts",x={name:E(__filename),sql:(e)=>{return[s`
104
+ `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/03-function-message-create.ts",x={name:E(__filename),sql:(e)=>{return[s`
105
105
  CREATE FUNCTION ${n(e.schema)}."message_create" (
106
106
  p_id UUID,
107
107
  p_channel_name TEXT,
@@ -212,7 +212,7 @@ var{defineProperty:T,getOwnPropertyNames:P,getOwnPropertyDescriptor:w}=Object,Q=
212
212
  END IF;
213
213
  END;
214
214
  $$ LANGUAGE plpgsql;
215
- `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/04-function-message-dequeue.ts",ne=(e)=>s`
215
+ `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/04-function-message-dequeue.ts",ne=(e)=>s`
216
216
  SELECT
217
217
  "message"."id",
218
218
  "message"."state",
@@ -369,7 +369,7 @@ var{defineProperty:T,getOwnPropertyNames:P,getOwnPropertyDescriptor:w}=Object,Q=
369
369
  RETURN;
370
370
  END;
371
371
  $$ LANGUAGE plpgsql;
372
- `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/05-function-message-delete.ts",$={name:E(__filename),sql:(e)=>{return[s`
372
+ `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/05-function-message-delete.ts",$={name:E(__filename),sql:(e)=>{return[s`
373
373
  CREATE FUNCTION ${n(e.schema)}."message_delete" (
374
374
  p_id UUID,
375
375
  p_num_attempts BIGINT
@@ -446,7 +446,7 @@ var{defineProperty:T,getOwnPropertyNames:P,getOwnPropertyDescriptor:w}=Object,Q=
446
446
  RETURN;
447
447
  END;
448
448
  $$ LANGUAGE plpgsql;
449
- `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/06-function-message-defer.ts",F={name:E(__filename),sql:(e)=>{return[s`
449
+ `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/06-function-message-defer.ts",F={name:E(__filename),sql:(e)=>{return[s`
450
450
  CREATE FUNCTION ${n(e.schema)}."message_defer" (
451
451
  p_id UUID,
452
452
  p_num_attempts BIGINT,
@@ -542,7 +542,7 @@ var{defineProperty:T,getOwnPropertyNames:P,getOwnPropertyDescriptor:w}=Object,Q=
542
542
  RETURN;
543
543
  END;
544
544
  $$ LANGUAGE plpgsql;
545
- `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/08-function-channel-policy-clear.ts",b={name:E(__filename),sql:(e)=>{return[s`
545
+ `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/08-function-channel-policy-clear.ts",b={name:E(__filename),sql:(e)=>{return[s`
546
546
  CREATE FUNCTION ${n(e.schema)}."channel_policy_clear" (
547
547
  p_name TEXT
548
548
  ) RETURNS VOID AS $$
@@ -571,7 +571,7 @@ var{defineProperty:T,getOwnPropertyNames:P,getOwnPropertyDescriptor:w}=Object,Q=
571
571
  END IF;
572
572
  END;
573
573
  $$ LANGUAGE plpgsql;
574
- `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/09-function-channel-policy-set.ts",B={name:E(__filename),sql:(e)=>{return[s`
574
+ `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/09-function-channel-policy-set.ts",B={name:E(__filename),sql:(e)=>{return[s`
575
575
  CREATE FUNCTION ${n(e.schema)}."channel_policy_set" (
576
576
  p_name TEXT,
577
577
  p_max_concurrency INTEGER,
@@ -602,4 +602,4 @@ var{defineProperty:T,getOwnPropertyNames:P,getOwnPropertyDescriptor:w}=Object,Q=
602
602
  WHERE "name" = p_name;
603
603
  END;
604
604
  $$ LANGUAGE plpgsql;
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;message;adaptor;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))}}
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;message;adaptor;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})}install(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))}}
package/dist/index.d.ts CHANGED
@@ -251,7 +251,7 @@ export declare class Queue<T = DatabaseClient> {
251
251
  databaseClient: T;
252
252
  }): Promise<MessageDequeueResult<T>>;
253
253
  channel(channelName: string): QueueChannelModule<T>;
254
- migrations(params?: {
254
+ install(params?: {
255
255
  eventChannel?: string;
256
256
  }): string[];
257
257
  }
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- var D=(e)=>{return e*1000};var l=D(0);var $=(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 _=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),F=(e)=>({nodeType:"RAW",value:e}),b=(e)=>{return`'${e.replace(/'/g,"''")}'`},B=(e)=>{if(e===null)return"NULL";else if(typeof e==="string")return b(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}`)},k=(e)=>{return`"${e.replace(/"/g,'""')}"`},P=(e)=>{if(e.nodeType==="VALUE")return B(e.value);else if(e.nodeType==="REF")return k(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 r=0;r<e.length;r+=1)if(a.push(e[r]),r<t.length)a.push(P(t[r]));return F(a.join(""))};class o{schema;channelName;createdAt;constructor(e){this.schema=e.schema,this.channelName=e.channelName,this.createdAt=new Date}async execute(e){await e.query(s`
1
+ var D=(e)=>{return e*1000};var l=D(0);var $=(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 _=(e)=>({nodeType:"VALUE",value:e}),n=(e)=>({nodeType:"REF",value:e}),F=(e)=>({nodeType:"RAW",value:e}),b=(e)=>{return`'${e.replace(/'/g,"''")}'`},B=(e)=>{if(e===null)return"NULL";else if(typeof e==="string")return b(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}`)},k=(e)=>{return`"${e.replace(/"/g,'""')}"`},w=(e)=>{if(e.nodeType==="VALUE")return B(e.value);else if(e.nodeType==="REF")return k(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 r=0;r<e.length;r+=1)if(a.push(e[r]),r<t.length)a.push(w(t[r]));return F(a.join(""))};class o{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
2
  SELECT 1 FROM ${n(this.schema)}."channel_policy_clear"(
3
3
  $1
4
4
  )
@@ -8,7 +8,7 @@ var D=(e)=>{return e*1000};var l=D(0);var $=(e)=>{let t=JSON.parse(e);if(t.type=
8
8
  $2::INTEGER,
9
9
  $3::INTEGER
10
10
  )
11
- `.value,[this.channelName,this.maxConcurrency,this.releaseIntervalMs])}}import{randomBytes as w}from"crypto";var g=()=>{return w(16).toString("base64url")};import{randomUUID as Q}from"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?l:e.delayMs;this.id=Q(),this.schema=e.schema,this.channelName=e.channelName??g(),this.content=e.content,this.lockMs=t,this.delayMs=a,this.createdAt=new Date}async execute(e){await e.query(s`
11
+ `.value,[this.channelName,this.maxConcurrency,this.releaseIntervalMs])}}import{randomBytes as P}from"crypto";var g=()=>{return P(16).toString("base64url")};import{randomUUID as Q}from"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?l:e.delayMs;this.id=Q(),this.schema=e.schema,this.channelName=e.channelName??g(),this.content=e.content,this.lockMs=t,this.delayMs=a,this.createdAt=new Date}async execute(e){await e.query(s`
12
12
  SELECT 1 FROM ${n(this.schema)}."message_create"(
13
13
  $1,
14
14
  $2,
@@ -37,7 +37,7 @@ var D=(e)=>{return e*1000};var l=D(0);var $=(e)=>{let t=JSON.parse(e);if(t.type=
37
37
  )
38
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 p=(e)=>{let t=e.split(`
39
39
  `),a=Number.MAX_SAFE_INTEGER;for(let r of t){if(r.trim().length===0)continue;let G=r.search(/\S/);a=Math.min(a,G)}return t.map((r)=>r.slice(a)).join(`
40
- `).trim()};import{dirname as y}from"path";var __filename="/home/runner/work/lonnymq/lonnymq/src/core/path.ts",Y=y(y(__filename)),z=new RegExp(`^${Y}/`),E=(e)=>{return e.replace(z,"")};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/00-table-channel-policy.ts",v={name:E(__filename),sql:(e)=>{return[s`
40
+ `).trim()};import{dirname as y}from"path";var __filename="/home/runner/work/lonnymq/lonnymq/src/core/path.ts",Y=y(y(__filename)),z=new RegExp(`^${Y}/`),E=(e)=>{return e.replace(z,"")};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/00-table-channel-policy.ts",v={name:E(__filename),sql:(e)=>{return[s`
41
41
  CREATE TABLE ${n(e.schema)}."channel_policy" (
42
42
  "id" UUID NOT NULL DEFAULT GEN_RANDOM_UUID(),
43
43
  "name" TEXT NOT NULL,
@@ -49,7 +49,7 @@ var D=(e)=>{return e*1000};var l=D(0);var $=(e)=>{let t=JSON.parse(e);if(t.type=
49
49
  `,s`
50
50
  CREATE UNIQUE INDEX "channel_policy_name_ux"
51
51
  ON ${n(e.schema)}."channel_policy" ("name");
52
- `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/01-table-channel-state.ts",M={name:E(__filename),sql:(e)=>{return[s`
52
+ `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/01-table-channel-state.ts",M={name:E(__filename),sql:(e)=>{return[s`
53
53
  CREATE TABLE ${n(e.schema)}."channel_state" (
54
54
  "id" UUID NOT NULL DEFAULT GEN_RANDOM_UUID(),
55
55
  "name" TEXT NOT NULL,
@@ -74,7 +74,7 @@ var D=(e)=>{return e*1000};var l=D(0);var $=(e)=>{let t=JSON.parse(e);if(t.type=
74
74
  "active_next_at" ASC
75
75
  ) WHERE "message_id" IS NOT NULL
76
76
  AND ("max_concurrency" IS NULL OR "current_concurrency" < "max_concurrency");
77
- `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/02-table-message.ts",I={name:E(__filename),sql:(e)=>{return[s`
77
+ `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/02-table-message.ts",I={name:E(__filename),sql:(e)=>{return[s`
78
78
  CREATE TABLE ${n(e.schema)}."message" (
79
79
  "id" UUID NOT NULL,
80
80
  "channel_name" TEXT NOT NULL,
@@ -101,7 +101,7 @@ var D=(e)=>{return e*1000};var l=D(0);var $=(e)=>{let t=JSON.parse(e);if(t.type=
101
101
  ON ${n(e.schema)}."message" (
102
102
  "unlock_at" ASC
103
103
  ) WHERE "is_locked";
104
- `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/03-function-message-create.ts",L={name:E(__filename),sql:(e)=>{return[s`
104
+ `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/03-function-message-create.ts",L={name:E(__filename),sql:(e)=>{return[s`
105
105
  CREATE FUNCTION ${n(e.schema)}."message_create" (
106
106
  p_id UUID,
107
107
  p_channel_name TEXT,
@@ -212,7 +212,7 @@ var D=(e)=>{return e*1000};var l=D(0);var $=(e)=>{let t=JSON.parse(e);if(t.type=
212
212
  END IF;
213
213
  END;
214
214
  $$ LANGUAGE plpgsql;
215
- `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/04-function-message-dequeue.ts",X=(e)=>s`
215
+ `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/04-function-message-dequeue.ts",X=(e)=>s`
216
216
  SELECT
217
217
  "message"."id",
218
218
  "message"."state",
@@ -369,7 +369,7 @@ var D=(e)=>{return e*1000};var l=D(0);var $=(e)=>{let t=JSON.parse(e);if(t.type=
369
369
  RETURN;
370
370
  END;
371
371
  $$ LANGUAGE plpgsql;
372
- `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/05-function-message-delete.ts",O={name:E(__filename),sql:(e)=>{return[s`
372
+ `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/05-function-message-delete.ts",O={name:E(__filename),sql:(e)=>{return[s`
373
373
  CREATE FUNCTION ${n(e.schema)}."message_delete" (
374
374
  p_id UUID,
375
375
  p_num_attempts BIGINT
@@ -446,7 +446,7 @@ var D=(e)=>{return e*1000};var l=D(0);var $=(e)=>{let t=JSON.parse(e);if(t.type=
446
446
  RETURN;
447
447
  END;
448
448
  $$ LANGUAGE plpgsql;
449
- `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/06-function-message-defer.ts",C={name:E(__filename),sql:(e)=>{return[s`
449
+ `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/06-function-message-defer.ts",C={name:E(__filename),sql:(e)=>{return[s`
450
450
  CREATE FUNCTION ${n(e.schema)}."message_defer" (
451
451
  p_id UUID,
452
452
  p_num_attempts BIGINT,
@@ -542,7 +542,7 @@ var D=(e)=>{return e*1000};var l=D(0);var $=(e)=>{let t=JSON.parse(e);if(t.type=
542
542
  RETURN;
543
543
  END;
544
544
  $$ LANGUAGE plpgsql;
545
- `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/08-function-channel-policy-clear.ts",f={name:E(__filename),sql:(e)=>{return[s`
545
+ `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/08-function-channel-policy-clear.ts",f={name:E(__filename),sql:(e)=>{return[s`
546
546
  CREATE FUNCTION ${n(e.schema)}."channel_policy_clear" (
547
547
  p_name TEXT
548
548
  ) RETURNS VOID AS $$
@@ -571,7 +571,7 @@ var D=(e)=>{return e*1000};var l=D(0);var $=(e)=>{let t=JSON.parse(e);if(t.type=
571
571
  END IF;
572
572
  END;
573
573
  $$ LANGUAGE plpgsql;
574
- `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/migration/09-function-channel-policy-set.ts",q={name:E(__filename),sql:(e)=>{return[s`
574
+ `]}};var __filename="/home/runner/work/lonnymq/lonnymq/src/install/09-function-channel-policy-set.ts",q={name:E(__filename),sql:(e)=>{return[s`
575
575
  CREATE FUNCTION ${n(e.schema)}."channel_policy_set" (
576
576
  p_name TEXT,
577
577
  p_max_concurrency INTEGER,
@@ -602,4 +602,4 @@ var D=(e)=>{return e*1000};var l=D(0);var $=(e)=>{let t=JSON.parse(e);if(t.type=
602
602
  WHERE "name" = p_name;
603
603
  END;
604
604
  $$ LANGUAGE plpgsql;
605
- `]}};class h{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 N{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 m({schema:this.schema,channelName:this.channelName,maxConcurrency:e.maxConcurrency,releaseIntervalMs:e.releaseIntervalMs}).execute(t)}clear(e){let t=this.adaptor(e.databaseClient);return new o({schema:this.schema,channelName:this.channelName}).execute(t)}}class S{policy;message;constructor(e){this.message=new h({schema:e.schema,adaptor:e.adaptor,channelName:e.channelName}),this.policy=new N({schema:e.schema,adaptor:e.adaptor,channelName:e.channelName})}}class R{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 d({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 u({schema:this.schema,numAttempts:this.numAttempts,id:this.id}).execute(t)}}class A{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 x{schema;message;adaptor;constructor(e){this.schema=e.schema,this.adaptor=e.adaptor?e.adaptor:(t)=>t,this.message=new A({schema:this.schema,adaptor:this.adaptor})}async dequeue(e){let t=new i({schema:this.schema}),a=this.adaptor(e.databaseClient),r=await t.execute(a);if(r.resultType==="MESSAGE_DEQUEUED")return{resultType:"MESSAGE_DEQUEUED",message:new R({schema:this.schema,adaptor:this.adaptor,id:r.message.id,channelName:r.message.channelName,isUnlocked:r.message.isUnlocked,content:r.message.content,state:r.message.state,numAttempts:r.message.numAttempts})};else return r}channel(e){return new S({adaptor:this.adaptor,schema:this.schema,channelName:e})}migrations(e={}){return[v,M,I,L,U,O,C,q,f].sort((t,a)=>t.name.localeCompare(a.name)).flatMap((t)=>t.sql({schema:this.schema,eventChannel:e.eventChannel??null})).map((t)=>p(t.value))}}export{$ as queueEventDecode,x as Queue,i as MessageDequeueCommand,u as MessageDeleteCommand,d as MessageDeferCommand,c as MessageCreateCommand,m as ChannelPolicySetCommand,o as ChannelPolicyClearCommand};
605
+ `]}};class h{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 N{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 m({schema:this.schema,channelName:this.channelName,maxConcurrency:e.maxConcurrency,releaseIntervalMs:e.releaseIntervalMs}).execute(t)}clear(e){let t=this.adaptor(e.databaseClient);return new o({schema:this.schema,channelName:this.channelName}).execute(t)}}class S{policy;message;constructor(e){this.message=new h({schema:e.schema,adaptor:e.adaptor,channelName:e.channelName}),this.policy=new N({schema:e.schema,adaptor:e.adaptor,channelName:e.channelName})}}class R{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 d({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 u({schema:this.schema,numAttempts:this.numAttempts,id:this.id}).execute(t)}}class A{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 x{schema;message;adaptor;constructor(e){this.schema=e.schema,this.adaptor=e.adaptor?e.adaptor:(t)=>t,this.message=new A({schema:this.schema,adaptor:this.adaptor})}async dequeue(e){let t=new i({schema:this.schema}),a=this.adaptor(e.databaseClient),r=await t.execute(a);if(r.resultType==="MESSAGE_DEQUEUED")return{resultType:"MESSAGE_DEQUEUED",message:new R({schema:this.schema,adaptor:this.adaptor,id:r.message.id,channelName:r.message.channelName,isUnlocked:r.message.isUnlocked,content:r.message.content,state:r.message.state,numAttempts:r.message.numAttempts})};else return r}channel(e){return new S({adaptor:this.adaptor,schema:this.schema,channelName:e})}install(e={}){return[v,M,I,L,U,O,C,q,f].sort((t,a)=>t.name.localeCompare(a.name)).flatMap((t)=>t.sql({schema:this.schema,eventChannel:e.eventChannel??null})).map((t)=>p(t.value))}}export{$ as queueEventDecode,x as Queue,i as MessageDequeueCommand,u as MessageDeleteCommand,d as MessageDeferCommand,c as MessageCreateCommand,m as ChannelPolicySetCommand,o as ChannelPolicyClearCommand};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lonnymq",
3
- "version": "0.0.22",
3
+ "version": "0.0.23",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {