bunqueue 2.6.90 → 2.6.92

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 (48) hide show
  1. package/dist/client/bunqueue/aging.d.ts +16 -0
  2. package/dist/client/bunqueue/aging.d.ts.map +1 -0
  3. package/dist/client/bunqueue/aging.js +53 -0
  4. package/dist/client/bunqueue/aging.js.map +1 -0
  5. package/dist/client/bunqueue/batch.d.ts +17 -0
  6. package/dist/client/bunqueue/batch.d.ts.map +1 -0
  7. package/dist/client/bunqueue/batch.js +60 -0
  8. package/dist/client/bunqueue/batch.js.map +1 -0
  9. package/dist/client/bunqueue/cancellation.d.ts +20 -0
  10. package/dist/client/bunqueue/cancellation.d.ts.map +1 -0
  11. package/dist/client/bunqueue/cancellation.js +48 -0
  12. package/dist/client/bunqueue/cancellation.js.map +1 -0
  13. package/dist/client/bunqueue/circuitBreaker.d.ts +21 -0
  14. package/dist/client/bunqueue/circuitBreaker.d.ts.map +1 -0
  15. package/dist/client/bunqueue/circuitBreaker.js +68 -0
  16. package/dist/client/bunqueue/circuitBreaker.js.map +1 -0
  17. package/dist/client/bunqueue/dedupDebounce.d.ts +13 -0
  18. package/dist/client/bunqueue/dedupDebounce.d.ts.map +1 -0
  19. package/dist/client/bunqueue/dedupDebounce.js +36 -0
  20. package/dist/client/bunqueue/dedupDebounce.js.map +1 -0
  21. package/dist/client/bunqueue/dlqRateLimit.d.ts +19 -0
  22. package/dist/client/bunqueue/dlqRateLimit.d.ts.map +1 -0
  23. package/dist/client/bunqueue/dlqRateLimit.js +37 -0
  24. package/dist/client/bunqueue/dlqRateLimit.js.map +1 -0
  25. package/dist/client/bunqueue/retry.d.ts +9 -0
  26. package/dist/client/bunqueue/retry.d.ts.map +1 -0
  27. package/dist/client/bunqueue/retry.js +55 -0
  28. package/dist/client/bunqueue/retry.js.map +1 -0
  29. package/dist/client/bunqueue/triggers.d.ts +18 -0
  30. package/dist/client/bunqueue/triggers.d.ts.map +1 -0
  31. package/dist/client/bunqueue/triggers.js +42 -0
  32. package/dist/client/bunqueue/triggers.js.map +1 -0
  33. package/dist/client/bunqueue/ttl.d.ts +18 -0
  34. package/dist/client/bunqueue/ttl.d.ts.map +1 -0
  35. package/dist/client/bunqueue/ttl.js +31 -0
  36. package/dist/client/bunqueue/ttl.js.map +1 -0
  37. package/dist/client/bunqueue/types.d.ts +141 -0
  38. package/dist/client/bunqueue/types.d.ts.map +1 -0
  39. package/dist/client/bunqueue/types.js +5 -0
  40. package/dist/client/bunqueue/types.js.map +1 -0
  41. package/dist/client/bunqueue.d.ts +37 -78
  42. package/dist/client/bunqueue.d.ts.map +1 -1
  43. package/dist/client/bunqueue.js +168 -105
  44. package/dist/client/bunqueue.js.map +1 -1
  45. package/dist/client/index.d.ts +1 -1
  46. package/dist/client/index.d.ts.map +1 -1
  47. package/dist/client/index.js.map +1 -1
  48. package/package.json +1 -1
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Bunqueue — Priority Aging
3
+ * Automatically boosts priority of old waiting jobs.
4
+ */
5
+ import type { Queue } from '../queue/queue';
6
+ import type { PriorityAgingConfig } from './types';
7
+ export declare class PriorityAger<T = unknown> {
8
+ private timer;
9
+ private readonly config;
10
+ private readonly queue;
11
+ constructor(config: PriorityAgingConfig, queue: Queue<T>);
12
+ start(): void;
13
+ private tick;
14
+ destroy(): void;
15
+ }
16
+ //# sourceMappingURL=aging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aging.d.ts","sourceRoot":"","sources":["../../../src/client/bunqueue/aging.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,qBAAa,YAAY,CAAC,CAAC,GAAG,OAAO;IACnC,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;gBAErB,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAKxD,KAAK,IAAI,IAAI;YAOC,IAAI;IA6BlB,OAAO,IAAI,IAAI;CAMhB"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Bunqueue — Priority Aging
3
+ * Automatically boosts priority of old waiting jobs.
4
+ */
5
+ export class PriorityAger {
6
+ timer = null;
7
+ config;
8
+ queue;
9
+ constructor(config, queue) {
10
+ this.config = config;
11
+ this.queue = queue;
12
+ }
13
+ start() {
14
+ const interval = this.config.interval ?? 60000;
15
+ this.timer = setInterval(() => {
16
+ void this.tick();
17
+ }, interval);
18
+ }
19
+ async tick() {
20
+ const minAge = this.config.minAge ?? 60000;
21
+ const boost = this.config.boost ?? 1;
22
+ const maxPriority = this.config.maxPriority ?? 100;
23
+ const maxScan = this.config.maxScan ?? 100;
24
+ // Get both waiting and prioritized jobs (jobs with priority > 0 are "prioritized")
25
+ const [waiting, prioritized] = await Promise.all([
26
+ this.queue.getWaitingAsync(0, maxScan),
27
+ this.queue.getJobsAsync({ state: 'prioritized', start: 0, end: maxScan }),
28
+ ]);
29
+ const jobs = [...waiting, ...prioritized];
30
+ const now = Date.now();
31
+ for (const job of jobs) {
32
+ const age = now - job.timestamp;
33
+ if (age >= minAge && job.priority < maxPriority) {
34
+ const newPriority = Math.min(job.priority + boost, maxPriority);
35
+ try {
36
+ await this.queue.changeJobPriority(job.id, {
37
+ priority: newPriority,
38
+ });
39
+ }
40
+ catch {
41
+ // Best-effort — job may have been processed
42
+ }
43
+ }
44
+ }
45
+ }
46
+ destroy() {
47
+ if (this.timer) {
48
+ clearInterval(this.timer);
49
+ this.timer = null;
50
+ }
51
+ }
52
+ }
53
+ //# sourceMappingURL=aging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aging.js","sourceRoot":"","sources":["../../../src/client/bunqueue/aging.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,OAAO,YAAY;IACf,KAAK,GAA0C,IAAI,CAAC;IAC3C,MAAM,CAAsB;IAC5B,KAAK,CAAW;IAEjC,YAAY,MAA2B,EAAE,KAAe;QACtD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC;QAC/C,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC5B,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC,EAAE,QAAQ,CAAC,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC;QAE3C,mFAAmF;QACnF,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC/C,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,EAAE,OAAO,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;SAC1E,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,WAAW,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC;YAChC,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,CAAC,QAAQ,GAAG,WAAW,EAAE,CAAC;gBAChD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,EAAE,WAAW,CAAC,CAAC;gBAChE,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE;wBACzC,QAAQ,EAAE,WAAW;qBACtB,CAAC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACP,4CAA4C;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Bunqueue — Batch Processing
3
+ * Accumulates jobs and processes them in groups.
4
+ */
5
+ import type { Processor } from '../types';
6
+ import type { BatchConfig } from './types';
7
+ export declare class BatchAccumulator<T = unknown, R = unknown> {
8
+ private readonly buffer;
9
+ private timer;
10
+ private readonly config;
11
+ constructor(config: BatchConfig<T, R>);
12
+ /** Build a Processor that buffers jobs into batches */
13
+ buildProcessor(): Processor<T, R>;
14
+ flush(): void;
15
+ destroy(): void;
16
+ }
17
+ //# sourceMappingURL=batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../../src/client/bunqueue/batch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAoB,SAAS,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAQ3C,qBAAa,gBAAgB,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;gBAE/B,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;IAIrC,uDAAuD;IACvD,cAAc,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;IAiBjC,KAAK,IAAI,IAAI;IAyBb,OAAO,IAAI,IAAI;CAUhB"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Bunqueue — Batch Processing
3
+ * Accumulates jobs and processes them in groups.
4
+ */
5
+ export class BatchAccumulator {
6
+ buffer = [];
7
+ timer = null;
8
+ config;
9
+ constructor(config) {
10
+ this.config = config;
11
+ }
12
+ /** Build a Processor that buffers jobs into batches */
13
+ buildProcessor() {
14
+ return ((job) => {
15
+ return new Promise((resolve, reject) => {
16
+ this.buffer.push({ job, resolve, reject });
17
+ if (this.buffer.length >= this.config.size) {
18
+ this.flush();
19
+ }
20
+ else if (!this.timer) {
21
+ const timeout = this.config.timeout ?? 5000;
22
+ this.timer = setTimeout(() => {
23
+ this.flush();
24
+ }, timeout);
25
+ }
26
+ });
27
+ });
28
+ }
29
+ flush() {
30
+ if (this.timer) {
31
+ clearTimeout(this.timer);
32
+ this.timer = null;
33
+ }
34
+ const batch = this.buffer.splice(0);
35
+ if (batch.length === 0)
36
+ return;
37
+ const jobs = batch.map((b) => b.job);
38
+ this.config.processor(jobs).then((results) => {
39
+ for (let i = 0; i < batch.length; i++) {
40
+ batch[i].resolve(results[i] ?? undefined);
41
+ }
42
+ }, (err) => {
43
+ const error = err instanceof Error ? err : new Error(String(err));
44
+ for (const b of batch) {
45
+ b.reject(error);
46
+ }
47
+ });
48
+ }
49
+ destroy() {
50
+ if (this.timer) {
51
+ clearTimeout(this.timer);
52
+ this.timer = null;
53
+ }
54
+ // Flush remaining
55
+ if (this.buffer.length > 0) {
56
+ this.flush();
57
+ }
58
+ }
59
+ }
60
+ //# sourceMappingURL=batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../../src/client/bunqueue/batch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,OAAO,gBAAgB;IACV,MAAM,GAAwB,EAAE,CAAC;IAC1C,KAAK,GAAyC,IAAI,CAAC;IAC1C,MAAM,CAAoB;IAE3C,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,uDAAuD;IACvD,cAAc;QACZ,OAAO,CAAC,CAAC,GAAyB,EAAc,EAAE;YAChD,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBAE3C,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,CAAC;qBAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACvB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC;oBAC5C,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;wBAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;oBACf,CAAC,EAAE,OAAO,CAAC,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAoB,CAAC;IACxB,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE/B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAwB,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAC9B,CAAC,OAAO,EAAE,EAAE;YACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAK,SAA0B,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC,EACD,CAAC,GAAY,EAAE,EAAE;YACf,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,kBAAkB;QAClB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Bunqueue — Graceful Job Cancellation
3
+ * AbortController-based cancellation with optional grace period.
4
+ */
5
+ export declare class CancellationManager {
6
+ private readonly controllers;
7
+ /** Register a new AbortController for a job */
8
+ register(jobId: string): AbortController;
9
+ /** Remove a job's controller (on completion) */
10
+ unregister(jobId: string): void;
11
+ /** Cancel a job with optional grace period */
12
+ cancel(jobId: string, gracePeriodMs?: number): void;
13
+ /** Check if a job is cancelled */
14
+ isCancelled(jobId: string): boolean;
15
+ /** Get the AbortSignal for a job */
16
+ getSignal(jobId: string): AbortSignal | null;
17
+ /** Cancel all and clear */
18
+ destroyAll(): void;
19
+ }
20
+ //# sourceMappingURL=cancellation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellation.d.ts","sourceRoot":"","sources":["../../../src/client/bunqueue/cancellation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAElE,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe;IAMxC,gDAAgD;IAChD,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI/B,8CAA8C;IAC9C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,SAAI,GAAG,IAAI;IAa9C,kCAAkC;IAClC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKnC,oCAAoC;IACpC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAI5C,2BAA2B;IAC3B,UAAU,IAAI,IAAI;CAMnB"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Bunqueue — Graceful Job Cancellation
3
+ * AbortController-based cancellation with optional grace period.
4
+ */
5
+ export class CancellationManager {
6
+ controllers = new Map();
7
+ /** Register a new AbortController for a job */
8
+ register(jobId) {
9
+ const ac = new AbortController();
10
+ this.controllers.set(jobId, ac);
11
+ return ac;
12
+ }
13
+ /** Remove a job's controller (on completion) */
14
+ unregister(jobId) {
15
+ this.controllers.delete(jobId);
16
+ }
17
+ /** Cancel a job with optional grace period */
18
+ cancel(jobId, gracePeriodMs = 0) {
19
+ const ac = this.controllers.get(jobId);
20
+ if (!ac)
21
+ return;
22
+ if (gracePeriodMs > 0) {
23
+ setTimeout(() => {
24
+ ac.abort();
25
+ }, gracePeriodMs);
26
+ }
27
+ else {
28
+ ac.abort();
29
+ }
30
+ }
31
+ /** Check if a job is cancelled */
32
+ isCancelled(jobId) {
33
+ const ac = this.controllers.get(jobId);
34
+ return ac ? ac.signal.aborted : false;
35
+ }
36
+ /** Get the AbortSignal for a job */
37
+ getSignal(jobId) {
38
+ return this.controllers.get(jobId)?.signal ?? null;
39
+ }
40
+ /** Cancel all and clear */
41
+ destroyAll() {
42
+ for (const ac of this.controllers.values()) {
43
+ ac.abort();
44
+ }
45
+ this.controllers.clear();
46
+ }
47
+ }
48
+ //# sourceMappingURL=cancellation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellation.js","sourceRoot":"","sources":["../../../src/client/bunqueue/cancellation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,mBAAmB;IACb,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;IAElE,+CAA+C;IAC/C,QAAQ,CAAC,KAAa;QACpB,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;QACjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,gDAAgD;IAChD,UAAU,CAAC,KAAa;QACtB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,8CAA8C;IAC9C,MAAM,CAAC,KAAa,EAAE,aAAa,GAAG,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE;YAAE,OAAO;QAEhB,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,UAAU,CAAC,GAAG,EAAE;gBACd,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC,EAAE,aAAa,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,WAAW,CAAC,KAAa;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IACxC,CAAC;IAED,oCAAoC;IACpC,SAAS,CAAC,KAAa;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC;IACrD,CAAC;IAED,2BAA2B;IAC3B,UAAU;QACR,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Bunqueue — Circuit Breaker for worker protection
3
+ */
4
+ import type { Worker } from '../worker/worker';
5
+ import type { CircuitBreakerConfig, CircuitState } from './types';
6
+ export declare class WorkerCircuitBreaker {
7
+ private state;
8
+ private failures;
9
+ private timer;
10
+ private readonly config;
11
+ private readonly worker;
12
+ constructor(config: CircuitBreakerConfig, worker: Worker);
13
+ get currentState(): CircuitState;
14
+ isOpen(): boolean;
15
+ onSuccess(): void;
16
+ onFailure(): void;
17
+ private open;
18
+ reset(): void;
19
+ destroy(): void;
20
+ }
21
+ //# sourceMappingURL=circuitBreaker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuitBreaker.d.ts","sourceRoot":"","sources":["../../../src/client/bunqueue/circuitBreaker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAElE,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM;IAKxD,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED,MAAM,IAAI,OAAO;IAIjB,SAAS,IAAI,IAAI;IAUjB,SAAS,IAAI,IAAI;IASjB,OAAO,CAAC,IAAI;IAcZ,KAAK,IAAI,IAAI;IAYb,OAAO,IAAI,IAAI;CAMhB"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Bunqueue — Circuit Breaker for worker protection
3
+ */
4
+ export class WorkerCircuitBreaker {
5
+ state = 'closed';
6
+ failures = 0;
7
+ timer = null;
8
+ config;
9
+ worker;
10
+ constructor(config, worker) {
11
+ this.config = config;
12
+ this.worker = worker;
13
+ }
14
+ get currentState() {
15
+ return this.state;
16
+ }
17
+ isOpen() {
18
+ return this.state === 'open';
19
+ }
20
+ onSuccess() {
21
+ if (this.state === 'half-open') {
22
+ this.state = 'closed';
23
+ this.failures = 0;
24
+ this.config.onClose?.();
25
+ }
26
+ else if (this.state === 'closed') {
27
+ this.failures = 0;
28
+ }
29
+ }
30
+ onFailure() {
31
+ this.failures++;
32
+ const threshold = this.config.threshold ?? 5;
33
+ if (this.state === 'half-open' || this.failures >= threshold) {
34
+ this.open();
35
+ }
36
+ }
37
+ open() {
38
+ this.state = 'open';
39
+ this.config.onOpen?.(this.failures);
40
+ this.worker.pause();
41
+ const resetTimeout = this.config.resetTimeout ?? 30000;
42
+ if (this.timer)
43
+ clearTimeout(this.timer);
44
+ this.timer = setTimeout(() => {
45
+ this.state = 'half-open';
46
+ this.config.onHalfOpen?.();
47
+ this.worker.resume();
48
+ }, resetTimeout);
49
+ }
50
+ reset() {
51
+ this.state = 'closed';
52
+ this.failures = 0;
53
+ if (this.timer) {
54
+ clearTimeout(this.timer);
55
+ this.timer = null;
56
+ }
57
+ if (this.worker.isPaused()) {
58
+ this.worker.resume();
59
+ }
60
+ }
61
+ destroy() {
62
+ if (this.timer) {
63
+ clearTimeout(this.timer);
64
+ this.timer = null;
65
+ }
66
+ }
67
+ }
68
+ //# sourceMappingURL=circuitBreaker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuitBreaker.js","sourceRoot":"","sources":["../../../src/client/bunqueue/circuitBreaker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,OAAO,oBAAoB;IACvB,KAAK,GAAiB,QAAQ,CAAC;IAC/B,QAAQ,GAAG,CAAC,CAAC;IACb,KAAK,GAAyC,IAAI,CAAC;IAC1C,MAAM,CAAuB;IAC7B,MAAM,CAAS;IAEhC,YAAY,MAA4B,EAAE,MAAc;QACtD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC;IAC/B,CAAC;IAED,SAAS;QACP,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;YACtB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1B,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,SAAS;QACP,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;QAE7C,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAC;YAC7D,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAEO,IAAI;QACV,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAEpB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,KAAK,CAAC;QACvD,IAAI,IAAI,CAAC,KAAK;YAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3B,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC,EAAE,YAAY,CAAC,CAAC;IACnB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Bunqueue — Deduplication & Debounce defaults merger
3
+ */
4
+ import type { JobOptions } from '../types';
5
+ import type { BunqueueDeduplicationConfig, BunqueueDebounceConfig } from './types';
6
+ export declare class DedupDebounceMerger {
7
+ private readonly dedup;
8
+ private readonly debounce;
9
+ constructor(dedup: BunqueueDeduplicationConfig | null, debounce: BunqueueDebounceConfig | null);
10
+ get active(): boolean;
11
+ merge(name: string, opts?: JobOptions, data?: unknown): JobOptions | undefined;
12
+ }
13
+ //# sourceMappingURL=dedupDebounce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedupDebounce.d.ts","sourceRoot":"","sources":["../../../src/client/bunqueue/dedupDebounce.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEnF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;gBAE7C,KAAK,EAAE,2BAA2B,GAAG,IAAI,EAAE,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAK9F,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS;CAoB/E"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Bunqueue — Deduplication & Debounce defaults merger
3
+ */
4
+ export class DedupDebounceMerger {
5
+ dedup;
6
+ debounce;
7
+ constructor(dedup, debounce) {
8
+ this.dedup = dedup;
9
+ this.debounce = debounce;
10
+ }
11
+ get active() {
12
+ return this.dedup !== null || this.debounce !== null;
13
+ }
14
+ merge(name, opts, data) {
15
+ if (!this.active)
16
+ return opts;
17
+ const merged = { ...opts };
18
+ if (this.dedup && !merged.deduplication) {
19
+ const dataKey = data !== undefined ? JSON.stringify(data) : '';
20
+ merged.deduplication = {
21
+ id: `${name}:${dataKey}`,
22
+ ttl: this.dedup.ttl ?? 3600000,
23
+ extend: this.dedup.extend,
24
+ replace: this.dedup.replace,
25
+ };
26
+ }
27
+ if (this.debounce && !merged.debounce) {
28
+ merged.debounce = {
29
+ id: name,
30
+ ttl: this.debounce.ttl,
31
+ };
32
+ }
33
+ return merged;
34
+ }
35
+ }
36
+ //# sourceMappingURL=dedupDebounce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedupDebounce.js","sourceRoot":"","sources":["../../../src/client/bunqueue/dedupDebounce.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,OAAO,mBAAmB;IACb,KAAK,CAAqC;IAC1C,QAAQ,CAAgC;IAEzD,YAAY,KAAyC,EAAE,QAAuC;QAC5F,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,IAAY,EAAE,IAAiB,EAAE,IAAc;QACnD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,MAAM,GAAe,EAAE,GAAG,IAAI,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,aAAa,GAAG;gBACrB,EAAE,EAAE,GAAG,IAAI,IAAI,OAAO,EAAE;gBACxB,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO;gBAC9B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;gBACzB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;aAC5B,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,MAAM,CAAC,QAAQ,GAAG;gBAChB,EAAE,EAAE,IAAI;gBACR,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG;aACvB,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Bunqueue — DLQ & Rate Limit helpers
3
+ * Mixin-style functions that delegate to Queue methods.
4
+ */
5
+ import type { Queue } from '../queue/queue';
6
+ import type { DlqConfig, DlqEntry, DlqStats, DlqFilter } from '../types';
7
+ export declare class DlqRateLimitManager<T = unknown> {
8
+ private readonly queue;
9
+ constructor(queue: Queue<T>);
10
+ setDlqConfig(config: Partial<DlqConfig>): void;
11
+ getDlqConfig(): DlqConfig;
12
+ getDlq(filter?: DlqFilter): DlqEntry<T>[];
13
+ getDlqStats(): DlqStats;
14
+ retryDlq(id?: string): number;
15
+ purgeDlq(): number;
16
+ setGlobalRateLimit(max: number, duration?: number): void;
17
+ removeGlobalRateLimit(): void;
18
+ }
19
+ //# sourceMappingURL=dlqRateLimit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dlqRateLimit.d.ts","sourceRoot":"","sources":["../../../src/client/bunqueue/dlqRateLimit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEzE,qBAAa,mBAAmB,CAAC,CAAC,GAAG,OAAO;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAI5C,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;IAG9C,YAAY,IAAI,SAAS;IAGzB,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE;IAGzC,WAAW,IAAI,QAAQ;IAGvB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM;IAGpB,QAAQ;IAMR,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAGxD,qBAAqB,IAAI,IAAI;CAG9B"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Bunqueue — DLQ & Rate Limit helpers
3
+ * Mixin-style functions that delegate to Queue methods.
4
+ */
5
+ export class DlqRateLimitManager {
6
+ queue;
7
+ constructor(queue) {
8
+ this.queue = queue;
9
+ }
10
+ // ── DLQ ──
11
+ setDlqConfig(config) {
12
+ this.queue.setDlqConfig(config);
13
+ }
14
+ getDlqConfig() {
15
+ return this.queue.getDlqConfig();
16
+ }
17
+ getDlq(filter) {
18
+ return this.queue.getDlq(filter);
19
+ }
20
+ getDlqStats() {
21
+ return this.queue.getDlqStats();
22
+ }
23
+ retryDlq(id) {
24
+ return this.queue.retryDlq(id);
25
+ }
26
+ purgeDlq() {
27
+ return this.queue.purgeDlq();
28
+ }
29
+ // ── Rate Limiting ──
30
+ setGlobalRateLimit(max, duration) {
31
+ this.queue.setGlobalRateLimit(max, duration);
32
+ }
33
+ removeGlobalRateLimit() {
34
+ this.queue.removeGlobalRateLimit();
35
+ }
36
+ }
37
+ //# sourceMappingURL=dlqRateLimit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dlqRateLimit.js","sourceRoot":"","sources":["../../../src/client/bunqueue/dlqRateLimit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,KAAe;QAAf,UAAK,GAAL,KAAK,CAAU;IAAG,CAAC;IAEhD,YAAY;IAEZ,YAAY,CAAC,MAA0B;QACrC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IACD,YAAY;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;IACnC,CAAC;IACD,MAAM,CAAC,MAAkB;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IACD,WAAW;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,CAAC;IACD,QAAQ,CAAC,EAAW;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IACD,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAED,sBAAsB;IAEtB,kBAAkB,CAAC,GAAW,EAAE,QAAiB;QAC/C,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IACD,qBAAqB;QACnB,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Bunqueue — Advanced Retry with backoff strategies
3
+ */
4
+ import type { RetryConfig, RetryStrategy } from './types';
5
+ /** Calculate backoff delay based on strategy */
6
+ export declare function calculateBackoff(strategy: RetryStrategy, attempt: number, baseDelay: number, error: Error, config: RetryConfig): number;
7
+ /** Execute a function with retry logic */
8
+ export declare function executeWithRetry<R>(fn: () => Promise<R>, config: RetryConfig): Promise<R>;
9
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/client/bunqueue/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE1D,gDAAgD;AAChD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,WAAW,GAClB,MAAM,CAiCR;AAED,0CAA0C;AAC1C,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAqBzF"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Bunqueue — Advanced Retry with backoff strategies
3
+ */
4
+ /** Calculate backoff delay based on strategy */
5
+ export function calculateBackoff(strategy, attempt, baseDelay, error, config) {
6
+ switch (strategy) {
7
+ case 'fixed':
8
+ return baseDelay;
9
+ case 'exponential':
10
+ return baseDelay * Math.pow(2, attempt - 1);
11
+ case 'jitter': {
12
+ const exp = baseDelay * Math.pow(2, attempt - 1);
13
+ return Math.floor(exp * (0.5 + Math.random()));
14
+ }
15
+ case 'fibonacci': {
16
+ let a = 1, b = 1;
17
+ for (let i = 0; i < attempt - 1; i++) {
18
+ const next = a + b;
19
+ a = b;
20
+ b = next;
21
+ }
22
+ return baseDelay * b;
23
+ }
24
+ case 'custom':
25
+ if (config.customBackoff) {
26
+ return config.customBackoff(attempt, error);
27
+ }
28
+ return baseDelay;
29
+ default:
30
+ return baseDelay;
31
+ }
32
+ }
33
+ /** Execute a function with retry logic */
34
+ export function executeWithRetry(fn, config) {
35
+ const maxAttempts = config.maxAttempts ?? 3;
36
+ const baseDelay = config.delay ?? 1000;
37
+ const strategy = config.strategy ?? 'exponential';
38
+ const attempt = (n) => {
39
+ return fn().catch((err) => {
40
+ const error = err instanceof Error ? err : new Error(String(err));
41
+ if (n >= maxAttempts)
42
+ throw error;
43
+ if (config.retryIf && !config.retryIf(error, n))
44
+ throw error;
45
+ const delay = calculateBackoff(strategy, n, baseDelay, error, config);
46
+ return new Promise((resolve) => {
47
+ setTimeout(() => {
48
+ resolve(attempt(n + 1));
49
+ }, delay);
50
+ });
51
+ });
52
+ };
53
+ return attempt(1);
54
+ }
55
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/client/bunqueue/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,gDAAgD;AAChD,MAAM,UAAU,gBAAgB,CAC9B,QAAuB,EACvB,OAAe,EACf,SAAiB,EACjB,KAAY,EACZ,MAAmB;IAEnB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,SAAS,CAAC;QAEnB,KAAK,aAAa;YAChB,OAAO,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;QAE9C,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,GAAG,CAAC,EACP,CAAC,GAAG,CAAC,CAAC;YACR,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC,GAAG,CAAC,CAAC;gBACN,CAAC,GAAG,IAAI,CAAC;YACX,CAAC;YACD,OAAO,SAAS,GAAG,CAAC,CAAC;QACvB,CAAC;QAED,KAAK,QAAQ;YACX,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBACzB,OAAO,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO,SAAS,CAAC;QAEnB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,gBAAgB,CAAI,EAAoB,EAAE,MAAmB;IAC3E,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,aAAa,CAAC;IAElD,MAAM,OAAO,GAAG,CAAC,CAAS,EAAc,EAAE;QACxC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACjC,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,IAAI,CAAC,IAAI,WAAW;gBAAE,MAAM,KAAK,CAAC;YAClC,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;gBAAE,MAAM,KAAK,CAAC;YAE7D,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACtE,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,EAAE;gBAChC,UAAU,CAAC,GAAG,EAAE;oBACd,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC1B,CAAC,EAAE,KAAK,CAAC,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Bunqueue — Event Triggers
3
+ * When a job completes/fails, automatically create another job.
4
+ */
5
+ import type { Queue } from '../queue/queue';
6
+ import type { Worker } from '../worker/worker';
7
+ import type { TriggerRule } from './types';
8
+ export declare class TriggerManager<T = unknown, R = unknown> {
9
+ private readonly rules;
10
+ private active;
11
+ private readonly queue;
12
+ private readonly worker;
13
+ constructor(queue: Queue<T>, worker: Worker<T, R>);
14
+ add(rule: TriggerRule<T>): void;
15
+ private ensureActive;
16
+ private fire;
17
+ }
18
+ //# sourceMappingURL=triggers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../../src/client/bunqueue/triggers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,qBAAa,cAAc,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAC9C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAKjD,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAK/B,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,IAAI;CAUb"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Bunqueue — Event Triggers
3
+ * When a job completes/fails, automatically create another job.
4
+ */
5
+ export class TriggerManager {
6
+ rules = [];
7
+ active = false;
8
+ queue;
9
+ worker;
10
+ constructor(queue, worker) {
11
+ this.queue = queue;
12
+ this.worker = worker;
13
+ }
14
+ add(rule) {
15
+ this.rules.push(rule);
16
+ this.ensureActive();
17
+ }
18
+ ensureActive() {
19
+ if (this.active)
20
+ return;
21
+ this.active = true;
22
+ this.worker.on('completed', (job, result) => {
23
+ this.fire('completed', job, result);
24
+ });
25
+ this.worker.on('failed', (job, error) => {
26
+ this.fire('failed', job, error);
27
+ });
28
+ }
29
+ fire(event, job, resultOrError) {
30
+ for (const rule of this.rules) {
31
+ if (rule.on !== job.name)
32
+ continue;
33
+ if ((rule.event ?? 'completed') !== event)
34
+ continue;
35
+ if (rule.condition && !rule.condition(resultOrError, job))
36
+ continue;
37
+ const data = rule.data(resultOrError, job);
38
+ void this.queue.add(rule.create, data, rule.opts);
39
+ }
40
+ }
41
+ }
42
+ //# sourceMappingURL=triggers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triggers.js","sourceRoot":"","sources":["../../../src/client/bunqueue/triggers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,OAAO,cAAc;IACR,KAAK,GAAqB,EAAE,CAAC;IACtC,MAAM,GAAG,KAAK,CAAC;IACN,KAAK,CAAW;IAChB,MAAM,CAAe;IAEtC,YAAY,KAAe,EAAE,MAAoB;QAC/C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,GAAG,CAAC,IAAoB;QACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,GAAW,EAAE,MAAS,EAAE,EAAE;YACrD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAW,EAAE,KAAY,EAAE,EAAE;YACrD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,IAAI,CAAC,KAA6B,EAAE,GAAW,EAAE,aAAsB;QAC7E,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI;gBAAE,SAAS;YACnC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,KAAK;gBAAE,SAAS;YACpD,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,GAAG,CAAC;gBAAE,SAAS;YAEpE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YAC3C,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Bunqueue — Job TTL (Time To Live)
3
+ * Expire unprocessed jobs based on configurable TTL.
4
+ */
5
+ import type { JobTtlConfig } from './types';
6
+ export declare class TtlChecker {
7
+ private readonly config;
8
+ constructor(config: JobTtlConfig);
9
+ /** Get TTL for a specific job name */
10
+ getTtl(jobName: string): number;
11
+ /** Check if a job has expired */
12
+ isExpired(jobName: string, jobTimestamp: number): boolean;
13
+ /** Set default TTL */
14
+ setDefaultTtl(ttlMs: number): void;
15
+ /** Set TTL for a specific job name */
16
+ setNameTtl(jobName: string, ttlMs: number): void;
17
+ }
18
+ //# sourceMappingURL=ttl.d.ts.map