flashq 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 +283 -0
- package/dist/client/advanced.d.ts +174 -0
- package/dist/client/advanced.d.ts.map +1 -0
- package/dist/client/advanced.js +248 -0
- package/dist/client/advanced.js.map +1 -0
- package/dist/client/connection.d.ts +103 -0
- package/dist/client/connection.d.ts.map +1 -0
- package/dist/client/connection.js +570 -0
- package/dist/client/connection.js.map +1 -0
- package/dist/client/core.d.ts +119 -0
- package/dist/client/core.d.ts.map +1 -0
- package/dist/client/core.js +257 -0
- package/dist/client/core.js.map +1 -0
- package/dist/client/cron.d.ts +59 -0
- package/dist/client/cron.d.ts.map +1 -0
- package/dist/client/cron.js +82 -0
- package/dist/client/cron.js.map +1 -0
- package/dist/client/dlq.d.ts +52 -0
- package/dist/client/dlq.d.ts.map +1 -0
- package/dist/client/dlq.js +73 -0
- package/dist/client/dlq.js.map +1 -0
- package/dist/client/flows.d.ts +49 -0
- package/dist/client/flows.d.ts.map +1 -0
- package/dist/client/flows.js +67 -0
- package/dist/client/flows.js.map +1 -0
- package/dist/client/index.d.ts +644 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +829 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/jobs.d.ts +183 -0
- package/dist/client/jobs.d.ts.map +1 -0
- package/dist/client/jobs.js +272 -0
- package/dist/client/jobs.js.map +1 -0
- package/dist/client/kv.d.ts +63 -0
- package/dist/client/kv.d.ts.map +1 -0
- package/dist/client/kv.js +131 -0
- package/dist/client/kv.js.map +1 -0
- package/dist/client/metrics.d.ts +34 -0
- package/dist/client/metrics.d.ts.map +1 -0
- package/dist/client/metrics.js +49 -0
- package/dist/client/metrics.js.map +1 -0
- package/dist/client/pubsub.d.ts +42 -0
- package/dist/client/pubsub.d.ts.map +1 -0
- package/dist/client/pubsub.js +92 -0
- package/dist/client/pubsub.js.map +1 -0
- package/dist/client/queue.d.ts +111 -0
- package/dist/client/queue.d.ts.map +1 -0
- package/dist/client/queue.js +160 -0
- package/dist/client/queue.js.map +1 -0
- package/dist/client/types.d.ts +23 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +3 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client.d.ts +17 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +23 -0
- package/dist/client.js.map +1 -0
- package/dist/events.d.ts +184 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +340 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/queue.d.ts +104 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +139 -0
- package/dist/queue.js.map +1 -0
- package/dist/types.d.ts +185 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +88 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +296 -0
- package/dist/worker.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,829 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.FlashQ = void 0;
|
|
37
|
+
/**
|
|
38
|
+
* FlashQ Client - High-performance job queue client
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* import { FlashQ } from 'flashq';
|
|
43
|
+
*
|
|
44
|
+
* const client = new FlashQ();
|
|
45
|
+
*
|
|
46
|
+
* // Add a job (auto-connects!)
|
|
47
|
+
* const job = await client.add('emails', { to: 'user@example.com' });
|
|
48
|
+
*
|
|
49
|
+
* // That's it! No connect() needed.
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* // With options
|
|
55
|
+
* const client = new FlashQ({
|
|
56
|
+
* host: 'localhost',
|
|
57
|
+
* port: 6789,
|
|
58
|
+
* token: 'secret'
|
|
59
|
+
* });
|
|
60
|
+
*
|
|
61
|
+
* // Add with job options
|
|
62
|
+
* await client.add('emails', { to: 'user@example.com' }, {
|
|
63
|
+
* priority: 10,
|
|
64
|
+
* delay: 5000,
|
|
65
|
+
* max_attempts: 3
|
|
66
|
+
* });
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
const connection_1 = require("./connection");
|
|
70
|
+
const core = __importStar(require("./core"));
|
|
71
|
+
const jobs = __importStar(require("./jobs"));
|
|
72
|
+
const queue = __importStar(require("./queue"));
|
|
73
|
+
const dlq = __importStar(require("./dlq"));
|
|
74
|
+
const cron = __importStar(require("./cron"));
|
|
75
|
+
const metrics = __importStar(require("./metrics"));
|
|
76
|
+
const flows = __importStar(require("./flows"));
|
|
77
|
+
const advanced = __importStar(require("./advanced"));
|
|
78
|
+
const kv = __importStar(require("./kv"));
|
|
79
|
+
const pubsub = __importStar(require("./pubsub"));
|
|
80
|
+
/**
|
|
81
|
+
* FlashQ Client - High-performance job queue client with auto-connect.
|
|
82
|
+
*/
|
|
83
|
+
class FlashQ extends connection_1.FlashQConnection {
|
|
84
|
+
// ============== Core Operations ==============
|
|
85
|
+
/**
|
|
86
|
+
* Push a job to a queue.
|
|
87
|
+
*
|
|
88
|
+
* @param queue - Queue name
|
|
89
|
+
* @param data - Job data payload
|
|
90
|
+
* @param options - Push options (priority, delay, ttl, etc.)
|
|
91
|
+
* @returns Created job
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* const job = await client.push('emails', { to: 'user@example.com' });
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
push(queueName, data, options = {}) {
|
|
99
|
+
return core.push(this, queueName, data, options);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Add a job to a queue (alias for push).
|
|
103
|
+
*
|
|
104
|
+
* @param queue - Queue name
|
|
105
|
+
* @param data - Job data payload
|
|
106
|
+
* @param options - Push options
|
|
107
|
+
* @returns Created job
|
|
108
|
+
*/
|
|
109
|
+
add(queueName, data, options = {}) {
|
|
110
|
+
return this.push(queueName, data, options);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Push multiple jobs to a queue in a single batch.
|
|
114
|
+
*
|
|
115
|
+
* @param queue - Queue name
|
|
116
|
+
* @param jobs - Array of jobs with data and options
|
|
117
|
+
* @returns Array of created job IDs
|
|
118
|
+
*/
|
|
119
|
+
pushBatch(queueName, jobList) {
|
|
120
|
+
return core.pushBatch(this, queueName, jobList);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Add multiple jobs to a queue (alias for pushBatch).
|
|
124
|
+
*/
|
|
125
|
+
addBulk(queueName, jobList) {
|
|
126
|
+
return this.pushBatch(queueName, jobList);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Pull a job from a queue (blocking with server-side timeout).
|
|
130
|
+
*
|
|
131
|
+
* @param queue - Queue name
|
|
132
|
+
* @param timeout - Server-side timeout in ms (default: 60s)
|
|
133
|
+
* @returns Job or null if timeout
|
|
134
|
+
*/
|
|
135
|
+
pull(queueName, timeout) {
|
|
136
|
+
return core.pull(this, queueName, timeout);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Pull multiple jobs from a queue.
|
|
140
|
+
*
|
|
141
|
+
* @param queue - Queue name
|
|
142
|
+
* @param count - Number of jobs to pull
|
|
143
|
+
* @param timeout - Server-side timeout in ms (default: 60s)
|
|
144
|
+
* @returns Array of jobs
|
|
145
|
+
*/
|
|
146
|
+
pullBatch(queueName, count, timeout) {
|
|
147
|
+
return core.pullBatch(this, queueName, count, timeout);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Acknowledge a job as completed.
|
|
151
|
+
*
|
|
152
|
+
* @param jobId - Job ID
|
|
153
|
+
* @param result - Optional result data
|
|
154
|
+
*/
|
|
155
|
+
ack(jobId, result) {
|
|
156
|
+
return core.ack(this, jobId, result);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Acknowledge multiple jobs at once.
|
|
160
|
+
*
|
|
161
|
+
* @param jobIds - Array of job IDs
|
|
162
|
+
* @returns Number of jobs acknowledged
|
|
163
|
+
*/
|
|
164
|
+
ackBatch(jobIds) {
|
|
165
|
+
return core.ackBatch(this, jobIds);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Fail a job (will retry or move to DLQ).
|
|
169
|
+
*
|
|
170
|
+
* @param jobId - Job ID
|
|
171
|
+
* @param error - Optional error message
|
|
172
|
+
*/
|
|
173
|
+
fail(jobId, error) {
|
|
174
|
+
return core.fail(this, jobId, error);
|
|
175
|
+
}
|
|
176
|
+
// ============== Job Management ==============
|
|
177
|
+
/**
|
|
178
|
+
* Get a job with its current state.
|
|
179
|
+
*
|
|
180
|
+
* @param jobId - Job ID
|
|
181
|
+
* @returns Job with state, or null if not found
|
|
182
|
+
*/
|
|
183
|
+
getJob(jobId) {
|
|
184
|
+
return jobs.getJob(this, jobId);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get job state only.
|
|
188
|
+
*
|
|
189
|
+
* @param jobId - Job ID
|
|
190
|
+
* @returns Job state or null if not found
|
|
191
|
+
*/
|
|
192
|
+
getState(jobId) {
|
|
193
|
+
return jobs.getState(this, jobId);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get job result.
|
|
197
|
+
*
|
|
198
|
+
* @param jobId - Job ID
|
|
199
|
+
* @returns Job result or null
|
|
200
|
+
*/
|
|
201
|
+
getResult(jobId) {
|
|
202
|
+
return jobs.getResult(this, jobId);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Wait for a job to complete and return its result.
|
|
206
|
+
*
|
|
207
|
+
* @param jobId - Job ID
|
|
208
|
+
* @param timeout - Timeout in ms (default: 30000)
|
|
209
|
+
* @returns Job result or null
|
|
210
|
+
* @throws Error if job fails or times out
|
|
211
|
+
*/
|
|
212
|
+
finished(jobId, timeout) {
|
|
213
|
+
return jobs.finished(this, jobId, timeout);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Get a job by its custom ID.
|
|
217
|
+
*
|
|
218
|
+
* @param customId - Custom job ID
|
|
219
|
+
* @returns Job with state or null
|
|
220
|
+
*/
|
|
221
|
+
getJobByCustomId(customId) {
|
|
222
|
+
return jobs.getJobByCustomId(this, customId);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get multiple jobs by their IDs in a single call.
|
|
226
|
+
*
|
|
227
|
+
* @param jobIds - Array of job IDs
|
|
228
|
+
* @returns Array of jobs with states
|
|
229
|
+
*/
|
|
230
|
+
getJobsBatch(jobIds) {
|
|
231
|
+
return jobs.getJobsBatch(this, jobIds);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Cancel a pending job.
|
|
235
|
+
*
|
|
236
|
+
* @param jobId - Job ID
|
|
237
|
+
*/
|
|
238
|
+
cancel(jobId) {
|
|
239
|
+
return jobs.cancel(this, jobId);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Update job progress.
|
|
243
|
+
*
|
|
244
|
+
* @param jobId - Job ID
|
|
245
|
+
* @param progress - Progress value (0-100)
|
|
246
|
+
* @param message - Optional progress message
|
|
247
|
+
*/
|
|
248
|
+
progress(jobId, progressValue, message) {
|
|
249
|
+
return jobs.progress(this, jobId, progressValue, message);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get job progress.
|
|
253
|
+
*
|
|
254
|
+
* @param jobId - Job ID
|
|
255
|
+
* @returns Progress value and message
|
|
256
|
+
*/
|
|
257
|
+
getProgress(jobId) {
|
|
258
|
+
return jobs.getProgress(this, jobId);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Add a log entry to a job.
|
|
262
|
+
*
|
|
263
|
+
* @param jobId - Job ID
|
|
264
|
+
* @param message - Log message
|
|
265
|
+
* @param level - Log level (info, warn, error)
|
|
266
|
+
*/
|
|
267
|
+
log(jobId, message, level = 'info') {
|
|
268
|
+
return jobs.log(this, jobId, message, level);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Get log entries for a job.
|
|
272
|
+
*
|
|
273
|
+
* @param jobId - Job ID
|
|
274
|
+
* @returns Array of log entries
|
|
275
|
+
*/
|
|
276
|
+
getLogs(jobId) {
|
|
277
|
+
return jobs.getLogs(this, jobId);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Send a heartbeat for a long-running job.
|
|
281
|
+
*
|
|
282
|
+
* @param jobId - Job ID
|
|
283
|
+
*/
|
|
284
|
+
heartbeat(jobId) {
|
|
285
|
+
return jobs.heartbeat(this, jobId);
|
|
286
|
+
}
|
|
287
|
+
// ============== Queue Control ==============
|
|
288
|
+
/**
|
|
289
|
+
* Pause a queue.
|
|
290
|
+
*
|
|
291
|
+
* @param queue - Queue name
|
|
292
|
+
*/
|
|
293
|
+
pause(queueName) {
|
|
294
|
+
return queue.pause(this, queueName);
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Resume a paused queue.
|
|
298
|
+
*
|
|
299
|
+
* @param queue - Queue name
|
|
300
|
+
*/
|
|
301
|
+
resume(queueName) {
|
|
302
|
+
return queue.resume(this, queueName);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Check if a queue is paused.
|
|
306
|
+
*
|
|
307
|
+
* @param queue - Queue name
|
|
308
|
+
* @returns true if paused
|
|
309
|
+
*/
|
|
310
|
+
isPaused(queueName) {
|
|
311
|
+
return queue.isPaused(this, queueName);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Set rate limit for a queue (jobs per second).
|
|
315
|
+
*
|
|
316
|
+
* @param queue - Queue name
|
|
317
|
+
* @param limit - Jobs per second
|
|
318
|
+
*/
|
|
319
|
+
setRateLimit(queueName, limit) {
|
|
320
|
+
return queue.setRateLimit(this, queueName, limit);
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Clear rate limit for a queue.
|
|
324
|
+
*
|
|
325
|
+
* @param queue - Queue name
|
|
326
|
+
*/
|
|
327
|
+
clearRateLimit(queueName) {
|
|
328
|
+
return queue.clearRateLimit(this, queueName);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Set concurrency limit for a queue.
|
|
332
|
+
*
|
|
333
|
+
* @param queue - Queue name
|
|
334
|
+
* @param limit - Max concurrent jobs
|
|
335
|
+
*/
|
|
336
|
+
setConcurrency(queueName, limit) {
|
|
337
|
+
return queue.setConcurrency(this, queueName, limit);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Clear concurrency limit for a queue.
|
|
341
|
+
*
|
|
342
|
+
* @param queue - Queue name
|
|
343
|
+
*/
|
|
344
|
+
clearConcurrency(queueName) {
|
|
345
|
+
return queue.clearConcurrency(this, queueName);
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* List all queues.
|
|
349
|
+
*
|
|
350
|
+
* @returns Array of queue info
|
|
351
|
+
*/
|
|
352
|
+
listQueues() {
|
|
353
|
+
return queue.listQueues(this);
|
|
354
|
+
}
|
|
355
|
+
// ============== Dead Letter Queue ==============
|
|
356
|
+
/**
|
|
357
|
+
* Get jobs from the dead letter queue.
|
|
358
|
+
*
|
|
359
|
+
* @param queue - Queue name
|
|
360
|
+
* @param count - Max jobs to return (default: 100)
|
|
361
|
+
* @returns Array of failed jobs
|
|
362
|
+
*/
|
|
363
|
+
getDlq(queueName, count = 100) {
|
|
364
|
+
return dlq.getDlq(this, queueName, count);
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Retry jobs from the dead letter queue.
|
|
368
|
+
*
|
|
369
|
+
* @param queue - Queue name
|
|
370
|
+
* @param jobId - Optional specific job ID to retry
|
|
371
|
+
* @returns Number of jobs retried
|
|
372
|
+
*/
|
|
373
|
+
retryDlq(queueName, jobId) {
|
|
374
|
+
return dlq.retryDlq(this, queueName, jobId);
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Purge all jobs from the dead letter queue.
|
|
378
|
+
*
|
|
379
|
+
* @param queue - Queue name
|
|
380
|
+
* @returns Number of jobs purged
|
|
381
|
+
*/
|
|
382
|
+
purgeDlq(queueName) {
|
|
383
|
+
return dlq.purgeDlq(this, queueName);
|
|
384
|
+
}
|
|
385
|
+
// ============== Cron Jobs ==============
|
|
386
|
+
/**
|
|
387
|
+
* Add a cron job for scheduled recurring tasks.
|
|
388
|
+
*
|
|
389
|
+
* @param name - Unique cron job name
|
|
390
|
+
* @param options - Cron options
|
|
391
|
+
*/
|
|
392
|
+
addCron(name, options) {
|
|
393
|
+
return cron.addCron(this, name, options);
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Delete a cron job.
|
|
397
|
+
*
|
|
398
|
+
* @param name - Cron job name
|
|
399
|
+
* @returns true if deleted
|
|
400
|
+
*/
|
|
401
|
+
deleteCron(name) {
|
|
402
|
+
return cron.deleteCron(this, name);
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* List all cron jobs.
|
|
406
|
+
*
|
|
407
|
+
* @returns Array of cron jobs
|
|
408
|
+
*/
|
|
409
|
+
listCrons() {
|
|
410
|
+
return cron.listCrons(this);
|
|
411
|
+
}
|
|
412
|
+
// ============== Stats & Metrics ==============
|
|
413
|
+
/**
|
|
414
|
+
* Get queue statistics.
|
|
415
|
+
*
|
|
416
|
+
* @returns Queue stats
|
|
417
|
+
*/
|
|
418
|
+
stats() {
|
|
419
|
+
return metrics.stats(this);
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Get detailed metrics.
|
|
423
|
+
*
|
|
424
|
+
* @returns Detailed metrics object
|
|
425
|
+
*/
|
|
426
|
+
metrics() {
|
|
427
|
+
return metrics.metrics(this);
|
|
428
|
+
}
|
|
429
|
+
// ============== Flows ==============
|
|
430
|
+
/**
|
|
431
|
+
* Push a flow (parent job with children).
|
|
432
|
+
*
|
|
433
|
+
* @param queue - Parent queue name
|
|
434
|
+
* @param parentData - Parent job data
|
|
435
|
+
* @param children - Array of child jobs
|
|
436
|
+
* @param options - Flow options
|
|
437
|
+
* @returns Parent and children IDs
|
|
438
|
+
*/
|
|
439
|
+
pushFlow(queueName, parentData, children, options = {}) {
|
|
440
|
+
return flows.pushFlow(this, queueName, parentData, children, options);
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Get children job IDs for a parent job in a flow.
|
|
444
|
+
*
|
|
445
|
+
* @param jobId - Parent job ID
|
|
446
|
+
* @returns Array of children job IDs
|
|
447
|
+
*/
|
|
448
|
+
getChildren(jobId) {
|
|
449
|
+
return flows.getChildren(this, jobId);
|
|
450
|
+
}
|
|
451
|
+
// ============== BullMQ Advanced Features ==============
|
|
452
|
+
/**
|
|
453
|
+
* Get jobs filtered by queue and/or state with pagination.
|
|
454
|
+
*
|
|
455
|
+
* @param options - Filter options
|
|
456
|
+
* @returns Jobs and total count
|
|
457
|
+
*/
|
|
458
|
+
getJobs(options = {}) {
|
|
459
|
+
return advanced.getJobs(this, options);
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Get job counts by state for a queue.
|
|
463
|
+
*
|
|
464
|
+
* @param queue - Queue name
|
|
465
|
+
* @returns Counts by state
|
|
466
|
+
*/
|
|
467
|
+
getJobCounts(queueName) {
|
|
468
|
+
return advanced.getJobCounts(this, queueName);
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Get total count of jobs in a queue (waiting + delayed).
|
|
472
|
+
*
|
|
473
|
+
* @param queue - Queue name
|
|
474
|
+
* @returns Total job count
|
|
475
|
+
*/
|
|
476
|
+
count(queueName) {
|
|
477
|
+
return advanced.count(this, queueName);
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* Clean jobs older than grace period by state.
|
|
481
|
+
*
|
|
482
|
+
* @param queue - Queue name
|
|
483
|
+
* @param grace - Grace period in ms
|
|
484
|
+
* @param state - Job state to clean
|
|
485
|
+
* @param limit - Optional max jobs to clean
|
|
486
|
+
* @returns Number of jobs cleaned
|
|
487
|
+
*/
|
|
488
|
+
clean(queueName, grace, state, limit) {
|
|
489
|
+
return advanced.clean(this, queueName, grace, state, limit);
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Drain all waiting jobs from a queue.
|
|
493
|
+
*
|
|
494
|
+
* @param queue - Queue name
|
|
495
|
+
* @returns Number of jobs drained
|
|
496
|
+
*/
|
|
497
|
+
drain(queueName) {
|
|
498
|
+
return advanced.drain(this, queueName);
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Remove ALL data for a queue.
|
|
502
|
+
*
|
|
503
|
+
* @param queue - Queue name
|
|
504
|
+
* @returns Total items removed
|
|
505
|
+
*/
|
|
506
|
+
obliterate(queueName) {
|
|
507
|
+
return advanced.obliterate(this, queueName);
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Change job priority.
|
|
511
|
+
*
|
|
512
|
+
* @param jobId - Job ID
|
|
513
|
+
* @param priority - New priority
|
|
514
|
+
*/
|
|
515
|
+
changePriority(jobId, priority) {
|
|
516
|
+
return advanced.changePriority(this, jobId, priority);
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Move job from processing back to delayed.
|
|
520
|
+
*
|
|
521
|
+
* @param jobId - Job ID
|
|
522
|
+
* @param delay - Delay in ms
|
|
523
|
+
*/
|
|
524
|
+
moveToDelayed(jobId, delay) {
|
|
525
|
+
return advanced.moveToDelayed(this, jobId, delay);
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Promote delayed job to waiting immediately.
|
|
529
|
+
*
|
|
530
|
+
* @param jobId - Job ID
|
|
531
|
+
*/
|
|
532
|
+
promote(jobId) {
|
|
533
|
+
return advanced.promote(this, jobId);
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Update job data.
|
|
537
|
+
*
|
|
538
|
+
* @param jobId - Job ID
|
|
539
|
+
* @param data - New data payload
|
|
540
|
+
*/
|
|
541
|
+
update(jobId, data) {
|
|
542
|
+
return advanced.update(this, jobId, data);
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Discard job - move directly to DLQ.
|
|
546
|
+
*
|
|
547
|
+
* @param jobId - Job ID
|
|
548
|
+
*/
|
|
549
|
+
discard(jobId) {
|
|
550
|
+
return advanced.discard(this, jobId);
|
|
551
|
+
}
|
|
552
|
+
// ============== Event Subscriptions ==============
|
|
553
|
+
/**
|
|
554
|
+
* Subscribe to real-time events via SSE.
|
|
555
|
+
*
|
|
556
|
+
* @param queue - Optional queue to filter events
|
|
557
|
+
* @returns EventSubscriber instance
|
|
558
|
+
*
|
|
559
|
+
* @example
|
|
560
|
+
* ```typescript
|
|
561
|
+
* const events = client.subscribe();
|
|
562
|
+
* events.on('completed', (e) => console.log(`Job ${e.jobId} completed`));
|
|
563
|
+
* await events.connect();
|
|
564
|
+
* ```
|
|
565
|
+
*/
|
|
566
|
+
subscribe(queueName) {
|
|
567
|
+
const { EventSubscriber } = require('../events');
|
|
568
|
+
return new EventSubscriber({
|
|
569
|
+
host: this.options.host,
|
|
570
|
+
httpPort: this.options.httpPort,
|
|
571
|
+
token: this.options.token,
|
|
572
|
+
queue: queueName,
|
|
573
|
+
type: 'sse',
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
/**
|
|
577
|
+
* Subscribe to real-time events via WebSocket.
|
|
578
|
+
*
|
|
579
|
+
* @param queue - Optional queue to filter events
|
|
580
|
+
* @returns EventSubscriber instance
|
|
581
|
+
*/
|
|
582
|
+
subscribeWs(queueName) {
|
|
583
|
+
const { EventSubscriber } = require('../events');
|
|
584
|
+
return new EventSubscriber({
|
|
585
|
+
host: this.options.host,
|
|
586
|
+
httpPort: this.options.httpPort,
|
|
587
|
+
token: this.options.token,
|
|
588
|
+
queue: queueName,
|
|
589
|
+
type: 'websocket',
|
|
590
|
+
});
|
|
591
|
+
}
|
|
592
|
+
// ============== Key-Value Storage (Redis-like) ==============
|
|
593
|
+
/**
|
|
594
|
+
* Set a key-value pair.
|
|
595
|
+
*
|
|
596
|
+
* @param key - Key name
|
|
597
|
+
* @param value - Value (any JSON-serializable data)
|
|
598
|
+
* @param options - Optional TTL settings
|
|
599
|
+
*
|
|
600
|
+
* @example
|
|
601
|
+
* ```typescript
|
|
602
|
+
* await client.kvSet('user:123', { name: 'John' });
|
|
603
|
+
* await client.kvSet('session:abc', { token: 'xyz' }, { ttl: 3600000 }); // 1 hour TTL
|
|
604
|
+
* ```
|
|
605
|
+
*/
|
|
606
|
+
kvSet(key, value, options = {}) {
|
|
607
|
+
return kv.set(this, key, value, options);
|
|
608
|
+
}
|
|
609
|
+
/**
|
|
610
|
+
* Get a value by key.
|
|
611
|
+
*
|
|
612
|
+
* @param key - Key name
|
|
613
|
+
* @returns Value or null if not found/expired
|
|
614
|
+
*
|
|
615
|
+
* @example
|
|
616
|
+
* ```typescript
|
|
617
|
+
* const user = await client.kvGet<User>('user:123');
|
|
618
|
+
* ```
|
|
619
|
+
*/
|
|
620
|
+
kvGet(key) {
|
|
621
|
+
return kv.get(this, key);
|
|
622
|
+
}
|
|
623
|
+
/**
|
|
624
|
+
* Delete a key.
|
|
625
|
+
*
|
|
626
|
+
* @param key - Key name
|
|
627
|
+
* @returns true if key existed
|
|
628
|
+
*/
|
|
629
|
+
kvDel(key) {
|
|
630
|
+
return kv.del(this, key);
|
|
631
|
+
}
|
|
632
|
+
/**
|
|
633
|
+
* Check if a key exists.
|
|
634
|
+
*
|
|
635
|
+
* @param key - Key name
|
|
636
|
+
* @returns true if key exists and not expired
|
|
637
|
+
*/
|
|
638
|
+
kvExists(key) {
|
|
639
|
+
return kv.exists(this, key);
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* Set TTL on an existing key.
|
|
643
|
+
*
|
|
644
|
+
* @param key - Key name
|
|
645
|
+
* @param ttl - Time-to-live in milliseconds
|
|
646
|
+
* @returns true if key existed
|
|
647
|
+
*/
|
|
648
|
+
kvExpire(key, ttl) {
|
|
649
|
+
return kv.expire(this, key, ttl);
|
|
650
|
+
}
|
|
651
|
+
/**
|
|
652
|
+
* Get remaining TTL for a key.
|
|
653
|
+
*
|
|
654
|
+
* @param key - Key name
|
|
655
|
+
* @returns ms remaining, -1 if no TTL, -2 if key doesn't exist
|
|
656
|
+
*/
|
|
657
|
+
kvTtl(key) {
|
|
658
|
+
return kv.ttl(this, key);
|
|
659
|
+
}
|
|
660
|
+
/**
|
|
661
|
+
* Get multiple values by keys (batch operation).
|
|
662
|
+
*
|
|
663
|
+
* @param keys - Array of keys
|
|
664
|
+
* @returns Array of values (null for missing keys)
|
|
665
|
+
*
|
|
666
|
+
* @example
|
|
667
|
+
* ```typescript
|
|
668
|
+
* const [user1, user2, user3] = await client.kvMget<User>(['user:1', 'user:2', 'user:3']);
|
|
669
|
+
* ```
|
|
670
|
+
*/
|
|
671
|
+
kvMget(keys) {
|
|
672
|
+
return kv.mget(this, keys);
|
|
673
|
+
}
|
|
674
|
+
/**
|
|
675
|
+
* Set multiple key-value pairs (batch operation).
|
|
676
|
+
*
|
|
677
|
+
* @param entries - Array of {key, value, ttl?}
|
|
678
|
+
* @returns Number of keys set
|
|
679
|
+
*
|
|
680
|
+
* @example
|
|
681
|
+
* ```typescript
|
|
682
|
+
* await client.kvMset([
|
|
683
|
+
* { key: 'user:1', value: { name: 'Alice' } },
|
|
684
|
+
* { key: 'user:2', value: { name: 'Bob' }, ttl: 60000 },
|
|
685
|
+
* ]);
|
|
686
|
+
* ```
|
|
687
|
+
*/
|
|
688
|
+
kvMset(entries) {
|
|
689
|
+
return kv.mset(this, entries);
|
|
690
|
+
}
|
|
691
|
+
/**
|
|
692
|
+
* List keys matching a pattern.
|
|
693
|
+
*
|
|
694
|
+
* @param pattern - Glob pattern (* = any, ? = one char)
|
|
695
|
+
* @returns Array of matching keys
|
|
696
|
+
*
|
|
697
|
+
* @example
|
|
698
|
+
* ```typescript
|
|
699
|
+
* const userKeys = await client.kvKeys('user:*');
|
|
700
|
+
* const sessionKeys = await client.kvKeys('session:???');
|
|
701
|
+
* ```
|
|
702
|
+
*/
|
|
703
|
+
kvKeys(pattern) {
|
|
704
|
+
return kv.keys(this, pattern);
|
|
705
|
+
}
|
|
706
|
+
/**
|
|
707
|
+
* Increment a numeric value atomically.
|
|
708
|
+
*
|
|
709
|
+
* @param key - Key name
|
|
710
|
+
* @param by - Amount to increment (default: 1)
|
|
711
|
+
* @returns New value
|
|
712
|
+
*
|
|
713
|
+
* @example
|
|
714
|
+
* ```typescript
|
|
715
|
+
* const views = await client.kvIncr('page:views');
|
|
716
|
+
* const score = await client.kvIncr('user:123:score', 10);
|
|
717
|
+
* ```
|
|
718
|
+
*/
|
|
719
|
+
kvIncr(key, by = 1) {
|
|
720
|
+
return kv.incr(this, key, by);
|
|
721
|
+
}
|
|
722
|
+
/**
|
|
723
|
+
* Decrement a numeric value atomically.
|
|
724
|
+
*
|
|
725
|
+
* @param key - Key name
|
|
726
|
+
* @param by - Amount to decrement (default: 1)
|
|
727
|
+
* @returns New value
|
|
728
|
+
*/
|
|
729
|
+
kvDecr(key, by = 1) {
|
|
730
|
+
return kv.decr(this, key, by);
|
|
731
|
+
}
|
|
732
|
+
// ============== Pub/Sub (Redis-like) ==============
|
|
733
|
+
/**
|
|
734
|
+
* Publish a message to a channel.
|
|
735
|
+
*
|
|
736
|
+
* @param channel - Channel name
|
|
737
|
+
* @param message - Message data (any JSON-serializable data)
|
|
738
|
+
* @returns Number of subscribers that received the message
|
|
739
|
+
*
|
|
740
|
+
* @example
|
|
741
|
+
* ```typescript
|
|
742
|
+
* const receivers = await client.publish('notifications', { type: 'alert', text: 'Hello!' });
|
|
743
|
+
* console.log(`Message sent to ${receivers} subscribers`);
|
|
744
|
+
* ```
|
|
745
|
+
*/
|
|
746
|
+
publish(channel, message) {
|
|
747
|
+
return pubsub.publish(this, channel, message);
|
|
748
|
+
}
|
|
749
|
+
/**
|
|
750
|
+
* Subscribe to channels.
|
|
751
|
+
* Note: For real-time message delivery, use WebSocket/SSE connections.
|
|
752
|
+
*
|
|
753
|
+
* @param channels - Array of channel names
|
|
754
|
+
* @returns List of subscribed channels
|
|
755
|
+
*
|
|
756
|
+
* @example
|
|
757
|
+
* ```typescript
|
|
758
|
+
* await client.pubsubSubscribe(['notifications', 'alerts']);
|
|
759
|
+
* ```
|
|
760
|
+
*/
|
|
761
|
+
pubsubSubscribe(channels) {
|
|
762
|
+
return pubsub.subscribe(this, channels);
|
|
763
|
+
}
|
|
764
|
+
/**
|
|
765
|
+
* Subscribe to channels matching patterns (e.g., "events:*").
|
|
766
|
+
*
|
|
767
|
+
* @param patterns - Array of glob patterns
|
|
768
|
+
* @returns List of subscribed patterns
|
|
769
|
+
*
|
|
770
|
+
* @example
|
|
771
|
+
* ```typescript
|
|
772
|
+
* await client.pubsubPsubscribe(['events:*', 'logs:*']);
|
|
773
|
+
* ```
|
|
774
|
+
*/
|
|
775
|
+
pubsubPsubscribe(patterns) {
|
|
776
|
+
return pubsub.psubscribe(this, patterns);
|
|
777
|
+
}
|
|
778
|
+
/**
|
|
779
|
+
* Unsubscribe from channels.
|
|
780
|
+
*
|
|
781
|
+
* @param channels - Array of channel names
|
|
782
|
+
* @returns List of unsubscribed channels
|
|
783
|
+
*/
|
|
784
|
+
pubsubUnsubscribe(channels) {
|
|
785
|
+
return pubsub.unsubscribe(this, channels);
|
|
786
|
+
}
|
|
787
|
+
/**
|
|
788
|
+
* Unsubscribe from patterns.
|
|
789
|
+
*
|
|
790
|
+
* @param patterns - Array of patterns
|
|
791
|
+
* @returns List of unsubscribed patterns
|
|
792
|
+
*/
|
|
793
|
+
pubsubPunsubscribe(patterns) {
|
|
794
|
+
return pubsub.punsubscribe(this, patterns);
|
|
795
|
+
}
|
|
796
|
+
/**
|
|
797
|
+
* List active channels (optionally matching a pattern).
|
|
798
|
+
*
|
|
799
|
+
* @param pattern - Optional glob pattern
|
|
800
|
+
* @returns Array of active channel names
|
|
801
|
+
*
|
|
802
|
+
* @example
|
|
803
|
+
* ```typescript
|
|
804
|
+
* const allChannels = await client.pubsubChannels();
|
|
805
|
+
* const eventChannels = await client.pubsubChannels('events:*');
|
|
806
|
+
* ```
|
|
807
|
+
*/
|
|
808
|
+
pubsubChannels(pattern) {
|
|
809
|
+
return pubsub.channels(this, pattern);
|
|
810
|
+
}
|
|
811
|
+
/**
|
|
812
|
+
* Get subscriber counts for channels.
|
|
813
|
+
*
|
|
814
|
+
* @param channels - Array of channel names
|
|
815
|
+
* @returns Array of [channel, count] tuples
|
|
816
|
+
*
|
|
817
|
+
* @example
|
|
818
|
+
* ```typescript
|
|
819
|
+
* const counts = await client.pubsubNumsub(['notifications', 'alerts']);
|
|
820
|
+
* // [['notifications', 5], ['alerts', 2]]
|
|
821
|
+
* ```
|
|
822
|
+
*/
|
|
823
|
+
pubsubNumsub(channels) {
|
|
824
|
+
return pubsub.numsub(this, channels);
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
exports.FlashQ = FlashQ;
|
|
828
|
+
exports.default = FlashQ;
|
|
829
|
+
//# sourceMappingURL=index.js.map
|