lonnymq 0.0.21 → 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 +6 -25
- package/dist/index.cjs +11 -11
- package/dist/index.d.ts +3 -3
- package/dist/index.js +12 -12
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -26,9 +26,9 @@ databaseClient satisfies DatabaseClient
|
|
|
26
26
|
|
|
27
27
|
const queue = new Queue({ schema: "lonny" })
|
|
28
28
|
|
|
29
|
-
//
|
|
30
|
-
for (const
|
|
31
|
-
await databaseClient.query(
|
|
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,
|
|
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
|
|
178
|
+
To enable this feature, ensure the optional `eventChannel` is defined when generating the installation SQL.
|
|
198
179
|
|
|
199
180
|
```typescript
|
|
200
|
-
const
|
|
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:
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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;adaptor;
|
|
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
|
@@ -243,15 +243,15 @@ export type QueueParams<T> = T extends DatabaseClient ? {
|
|
|
243
243
|
adaptor: DatabaseClientAdaptor<T>;
|
|
244
244
|
};
|
|
245
245
|
export declare class Queue<T = DatabaseClient> {
|
|
246
|
-
|
|
247
|
-
private readonly adaptor;
|
|
246
|
+
readonly schema: string;
|
|
248
247
|
readonly message: QueueMessageModule<T>;
|
|
248
|
+
private readonly adaptor;
|
|
249
249
|
constructor(params: QueueParams<T>);
|
|
250
250
|
dequeue(params: {
|
|
251
251
|
databaseClient: T;
|
|
252
252
|
}): Promise<MessageDequeueResult<T>>;
|
|
253
253
|
channel(channelName: string): QueueChannelModule<T>;
|
|
254
|
-
|
|
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,'""')}"`},
|
|
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
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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;adaptor;
|
|
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};
|