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.
Files changed (78) hide show
  1. package/README.md +283 -0
  2. package/dist/client/advanced.d.ts +174 -0
  3. package/dist/client/advanced.d.ts.map +1 -0
  4. package/dist/client/advanced.js +248 -0
  5. package/dist/client/advanced.js.map +1 -0
  6. package/dist/client/connection.d.ts +103 -0
  7. package/dist/client/connection.d.ts.map +1 -0
  8. package/dist/client/connection.js +570 -0
  9. package/dist/client/connection.js.map +1 -0
  10. package/dist/client/core.d.ts +119 -0
  11. package/dist/client/core.d.ts.map +1 -0
  12. package/dist/client/core.js +257 -0
  13. package/dist/client/core.js.map +1 -0
  14. package/dist/client/cron.d.ts +59 -0
  15. package/dist/client/cron.d.ts.map +1 -0
  16. package/dist/client/cron.js +82 -0
  17. package/dist/client/cron.js.map +1 -0
  18. package/dist/client/dlq.d.ts +52 -0
  19. package/dist/client/dlq.d.ts.map +1 -0
  20. package/dist/client/dlq.js +73 -0
  21. package/dist/client/dlq.js.map +1 -0
  22. package/dist/client/flows.d.ts +49 -0
  23. package/dist/client/flows.d.ts.map +1 -0
  24. package/dist/client/flows.js +67 -0
  25. package/dist/client/flows.js.map +1 -0
  26. package/dist/client/index.d.ts +644 -0
  27. package/dist/client/index.d.ts.map +1 -0
  28. package/dist/client/index.js +829 -0
  29. package/dist/client/index.js.map +1 -0
  30. package/dist/client/jobs.d.ts +183 -0
  31. package/dist/client/jobs.d.ts.map +1 -0
  32. package/dist/client/jobs.js +272 -0
  33. package/dist/client/jobs.js.map +1 -0
  34. package/dist/client/kv.d.ts +63 -0
  35. package/dist/client/kv.d.ts.map +1 -0
  36. package/dist/client/kv.js +131 -0
  37. package/dist/client/kv.js.map +1 -0
  38. package/dist/client/metrics.d.ts +34 -0
  39. package/dist/client/metrics.d.ts.map +1 -0
  40. package/dist/client/metrics.js +49 -0
  41. package/dist/client/metrics.js.map +1 -0
  42. package/dist/client/pubsub.d.ts +42 -0
  43. package/dist/client/pubsub.d.ts.map +1 -0
  44. package/dist/client/pubsub.js +92 -0
  45. package/dist/client/pubsub.js.map +1 -0
  46. package/dist/client/queue.d.ts +111 -0
  47. package/dist/client/queue.d.ts.map +1 -0
  48. package/dist/client/queue.js +160 -0
  49. package/dist/client/queue.js.map +1 -0
  50. package/dist/client/types.d.ts +23 -0
  51. package/dist/client/types.d.ts.map +1 -0
  52. package/dist/client/types.js +3 -0
  53. package/dist/client/types.js.map +1 -0
  54. package/dist/client.d.ts +17 -0
  55. package/dist/client.d.ts.map +1 -0
  56. package/dist/client.js +23 -0
  57. package/dist/client.js.map +1 -0
  58. package/dist/events.d.ts +184 -0
  59. package/dist/events.d.ts.map +1 -0
  60. package/dist/events.js +340 -0
  61. package/dist/events.js.map +1 -0
  62. package/dist/index.d.ts +30 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +43 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/queue.d.ts +104 -0
  67. package/dist/queue.d.ts.map +1 -0
  68. package/dist/queue.js +139 -0
  69. package/dist/queue.js.map +1 -0
  70. package/dist/types.d.ts +185 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +6 -0
  73. package/dist/types.js.map +1 -0
  74. package/dist/worker.d.ts +88 -0
  75. package/dist/worker.d.ts.map +1 -0
  76. package/dist/worker.js +296 -0
  77. package/dist/worker.js.map +1 -0
  78. 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