glide-mq 0.1.0
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 +190 -0
- package/dist/connection.d.ts +36 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +100 -0
- package/dist/connection.js.map +1 -0
- package/dist/errors.d.ts +10 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +25 -0
- package/dist/errors.js.map +1 -0
- package/dist/flow-producer.d.ts +36 -0
- package/dist/flow-producer.d.ts.map +1 -0
- package/dist/flow-producer.js +185 -0
- package/dist/flow-producer.js.map +1 -0
- package/dist/functions/index.d.ts +136 -0
- package/dist/functions/index.d.ts.map +1 -0
- package/dist/functions/index.js +1062 -0
- package/dist/functions/index.js.map +1 -0
- package/dist/graceful-shutdown.d.ts +17 -0
- package/dist/graceful-shutdown.d.ts.map +1 -0
- package/dist/graceful-shutdown.js +27 -0
- package/dist/graceful-shutdown.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/job.d.ts +106 -0
- package/dist/job.d.ts.map +1 -0
- package/dist/job.js +252 -0
- package/dist/job.js.map +1 -0
- package/dist/queue-events.d.ts +33 -0
- package/dist/queue-events.d.ts.map +1 -0
- package/dist/queue-events.js +138 -0
- package/dist/queue-events.js.map +1 -0
- package/dist/queue.d.ts +140 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +483 -0
- package/dist/queue.js.map +1 -0
- package/dist/scheduler.d.ts +48 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +140 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/telemetry.d.ts +29 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +90 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/types.d.ts +125 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +65 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +217 -0
- package/dist/utils.js.map +1 -0
- package/dist/worker.d.ts +138 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +574 -0
- package/dist/worker.js.map +1 -0
- package/dist/workflows.d.ts +34 -0
- package/dist/workflows.d.ts.map +1 -0
- package/dist/workflows.js +117 -0
- package/dist/workflows.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.chain = chain;
|
|
4
|
+
exports.group = group;
|
|
5
|
+
exports.chord = chord;
|
|
6
|
+
const flow_producer_1 = require("./flow-producer");
|
|
7
|
+
/**
|
|
8
|
+
* Chain: execute jobs sequentially. Each step becomes a child of the next,
|
|
9
|
+
* so step N+1 only runs after step N completes. The last job in the array
|
|
10
|
+
* runs first; the first job in the array runs last and is the top-level parent.
|
|
11
|
+
*
|
|
12
|
+
* Returns the JobNode tree. The top-level job (jobs[0]) is the root.
|
|
13
|
+
* When the chain completes, the root's processor can call getChildrenValues()
|
|
14
|
+
* to access results from children.
|
|
15
|
+
*/
|
|
16
|
+
async function chain(queueName, jobs, connection, prefix) {
|
|
17
|
+
if (jobs.length === 0) {
|
|
18
|
+
throw new Error('chain() requires at least one job');
|
|
19
|
+
}
|
|
20
|
+
const flow = new flow_producer_1.FlowProducer({ connection, prefix });
|
|
21
|
+
try {
|
|
22
|
+
if (jobs.length === 1) {
|
|
23
|
+
// Single job - just add it directly
|
|
24
|
+
return await flow.add({
|
|
25
|
+
name: jobs[0].name,
|
|
26
|
+
queueName,
|
|
27
|
+
data: jobs[0].data,
|
|
28
|
+
opts: jobs[0].opts,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
// Build a nested flow: jobs[0] is the root parent, jobs[1] is its child,
|
|
32
|
+
// jobs[1] is parent of jobs[2], etc.
|
|
33
|
+
// The deepest job (last in array) runs first.
|
|
34
|
+
// Build bottom-up: start from the last job and wrap each as parent.
|
|
35
|
+
let flowJob = {
|
|
36
|
+
name: jobs[jobs.length - 1].name,
|
|
37
|
+
queueName,
|
|
38
|
+
data: jobs[jobs.length - 1].data,
|
|
39
|
+
opts: jobs[jobs.length - 1].opts,
|
|
40
|
+
};
|
|
41
|
+
for (let i = jobs.length - 2; i >= 0; i--) {
|
|
42
|
+
flowJob = {
|
|
43
|
+
name: jobs[i].name,
|
|
44
|
+
queueName,
|
|
45
|
+
data: jobs[i].data,
|
|
46
|
+
opts: jobs[i].opts,
|
|
47
|
+
children: [flowJob],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return await flow.add(flowJob);
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
await flow.close();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Group: execute jobs in parallel. All jobs run concurrently.
|
|
58
|
+
* A synthetic parent job (name: '__group__') waits for all children.
|
|
59
|
+
* When complete, the parent's processor receives all children's results
|
|
60
|
+
* via getChildrenValues().
|
|
61
|
+
*
|
|
62
|
+
* Returns the JobNode tree. The root is the group parent.
|
|
63
|
+
*/
|
|
64
|
+
async function group(queueName, jobs, connection, prefix) {
|
|
65
|
+
if (jobs.length === 0) {
|
|
66
|
+
throw new Error('group() requires at least one job');
|
|
67
|
+
}
|
|
68
|
+
const flow = new flow_producer_1.FlowProducer({ connection, prefix });
|
|
69
|
+
try {
|
|
70
|
+
const children = jobs.map((j) => ({
|
|
71
|
+
name: j.name,
|
|
72
|
+
queueName,
|
|
73
|
+
data: j.data,
|
|
74
|
+
opts: j.opts,
|
|
75
|
+
}));
|
|
76
|
+
return await flow.add({
|
|
77
|
+
name: '__group__',
|
|
78
|
+
queueName,
|
|
79
|
+
data: {},
|
|
80
|
+
children,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
await flow.close();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Chord: run a group of jobs in parallel, then execute a callback job
|
|
89
|
+
* with the results. The callback is the parent, the group members are children.
|
|
90
|
+
*
|
|
91
|
+
* Returns the JobNode tree. The root is the callback job.
|
|
92
|
+
*/
|
|
93
|
+
async function chord(queueName, groupJobs, callback, connection, prefix) {
|
|
94
|
+
if (groupJobs.length === 0) {
|
|
95
|
+
throw new Error('chord() requires at least one group job');
|
|
96
|
+
}
|
|
97
|
+
const flow = new flow_producer_1.FlowProducer({ connection, prefix });
|
|
98
|
+
try {
|
|
99
|
+
const children = groupJobs.map((j) => ({
|
|
100
|
+
name: j.name,
|
|
101
|
+
queueName,
|
|
102
|
+
data: j.data,
|
|
103
|
+
opts: j.opts,
|
|
104
|
+
}));
|
|
105
|
+
return await flow.add({
|
|
106
|
+
name: callback.name,
|
|
107
|
+
queueName,
|
|
108
|
+
data: callback.data,
|
|
109
|
+
opts: callback.opts,
|
|
110
|
+
children,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
await flow.close();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=workflows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../src/workflows.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "glide-mq",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "High-performance message queue for Node.js built on Valkey/Redis with native NAPI bindings",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"type": "commonjs",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "tsc",
|
|
10
|
+
"test": "vitest run",
|
|
11
|
+
"test:watch": "vitest",
|
|
12
|
+
"lint": "eslint src/ tests/",
|
|
13
|
+
"clean": "rm -rf dist",
|
|
14
|
+
"bench": "npx tsx benchmarks/run.ts all",
|
|
15
|
+
"bench:throughput": "npx tsx benchmarks/run.ts throughput",
|
|
16
|
+
"bench:latency": "npx tsx benchmarks/run.ts latency",
|
|
17
|
+
"bench:memory": "npx tsx benchmarks/run.ts memory"
|
|
18
|
+
},
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=20"
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/avifenesh/glide-mq.git"
|
|
25
|
+
},
|
|
26
|
+
"license": "Apache-2.0",
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@glidemq/speedkey": "^0.2.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^22",
|
|
32
|
+
"bullmq": "^5.69.2",
|
|
33
|
+
"ioredis": "^5.9.3",
|
|
34
|
+
"tsx": "^4.21.0",
|
|
35
|
+
"typescript": "^5",
|
|
36
|
+
"vitest": "^3"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"@opentelemetry/api": "^1.0.0"
|
|
40
|
+
},
|
|
41
|
+
"peerDependenciesMeta": {
|
|
42
|
+
"@opentelemetry/api": {
|
|
43
|
+
"optional": true
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"keywords": [
|
|
47
|
+
"queue",
|
|
48
|
+
"job",
|
|
49
|
+
"message",
|
|
50
|
+
"valkey",
|
|
51
|
+
"redis",
|
|
52
|
+
"streams",
|
|
53
|
+
"worker",
|
|
54
|
+
"task"
|
|
55
|
+
]
|
|
56
|
+
}
|