@c9up/bay 0.1.13 → 0.2.1

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 (100) hide show
  1. package/README.md +122 -16
  2. package/dist/BayProvider.d.ts +51 -11
  3. package/dist/BayProvider.d.ts.map +1 -1
  4. package/dist/BayProvider.js +36 -13
  5. package/dist/BayProvider.js.map +1 -1
  6. package/dist/Job.d.ts +99 -0
  7. package/dist/Job.d.ts.map +1 -0
  8. package/dist/Job.js +78 -0
  9. package/dist/Job.js.map +1 -0
  10. package/dist/QueueManager.d.ts +140 -21
  11. package/dist/QueueManager.d.ts.map +1 -1
  12. package/dist/QueueManager.js +247 -53
  13. package/dist/QueueManager.js.map +1 -1
  14. package/dist/adapters.d.ts +68 -0
  15. package/dist/adapters.d.ts.map +1 -0
  16. package/dist/adapters.js +56 -0
  17. package/dist/adapters.js.map +1 -0
  18. package/dist/augmentations.d.ts +28 -0
  19. package/dist/augmentations.d.ts.map +1 -0
  20. package/dist/augmentations.js +17 -0
  21. package/dist/augmentations.js.map +1 -0
  22. package/dist/configure.d.ts +1 -0
  23. package/dist/configure.d.ts.map +1 -1
  24. package/dist/configure.js +24 -7
  25. package/dist/configure.js.map +1 -1
  26. package/dist/console/contract.d.ts +60 -0
  27. package/dist/console/contract.d.ts.map +1 -0
  28. package/dist/console/contract.js +36 -0
  29. package/dist/console/contract.js.map +1 -0
  30. package/dist/console/index.d.ts +29 -0
  31. package/dist/console/index.d.ts.map +1 -0
  32. package/dist/console/index.js +45 -0
  33. package/dist/console/index.js.map +1 -0
  34. package/dist/console/makeJob.d.ts +32 -0
  35. package/dist/console/makeJob.d.ts.map +1 -0
  36. package/dist/console/makeJob.js +118 -0
  37. package/dist/console/makeJob.js.map +1 -0
  38. package/dist/console/queueWork.d.ts +18 -0
  39. package/dist/console/queueWork.d.ts.map +1 -0
  40. package/dist/console/queueWork.js +58 -0
  41. package/dist/console/queueWork.js.map +1 -0
  42. package/dist/drivers/MemoryDriver.d.ts +14 -8
  43. package/dist/drivers/MemoryDriver.d.ts.map +1 -1
  44. package/dist/drivers/MemoryDriver.js +61 -7
  45. package/dist/drivers/MemoryDriver.js.map +1 -1
  46. package/dist/drivers/RedisDriver.d.ts +60 -8
  47. package/dist/drivers/RedisDriver.d.ts.map +1 -1
  48. package/dist/drivers/RedisDriver.js +214 -30
  49. package/dist/drivers/RedisDriver.js.map +1 -1
  50. package/dist/index.d.ts +10 -6
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +8 -4
  53. package/dist/index.js.map +1 -1
  54. package/dist/jobs.d.ts +55 -0
  55. package/dist/jobs.d.ts.map +1 -0
  56. package/dist/jobs.js +135 -0
  57. package/dist/jobs.js.map +1 -0
  58. package/dist/quasar.d.ts +6 -9
  59. package/dist/quasar.d.ts.map +1 -1
  60. package/dist/quasar.js +27 -55
  61. package/dist/quasar.js.map +1 -1
  62. package/dist/testing/FakeQueue.d.ts +15 -9
  63. package/dist/testing/FakeQueue.d.ts.map +1 -1
  64. package/dist/testing/FakeQueue.js +13 -3
  65. package/dist/testing/FakeQueue.js.map +1 -1
  66. package/dist/vendor/nodeEnv.d.ts +5 -0
  67. package/dist/vendor/nodeEnv.d.ts.map +1 -0
  68. package/dist/{nodeEnv.js → vendor/nodeEnv.js} +13 -7
  69. package/dist/vendor/nodeEnv.js.map +1 -0
  70. package/dist/vendor/quasarConnection.d.ts +35 -0
  71. package/dist/vendor/quasarConnection.d.ts.map +1 -0
  72. package/dist/vendor/quasarConnection.js +62 -0
  73. package/dist/vendor/quasarConnection.js.map +1 -0
  74. package/package.json +5 -3
  75. package/src/BayProvider.ts +92 -26
  76. package/src/Job.ts +137 -0
  77. package/src/QueueManager.ts +411 -56
  78. package/src/adapters.ts +75 -0
  79. package/src/augmentations.ts +31 -0
  80. package/src/configure.ts +25 -7
  81. package/src/console/contract.ts +94 -0
  82. package/src/console/index.ts +68 -0
  83. package/src/console/makeJob.ts +139 -0
  84. package/src/console/queueWork.ts +70 -0
  85. package/src/drivers/MemoryDriver.ts +66 -14
  86. package/src/drivers/RedisDriver.ts +303 -43
  87. package/src/index.ts +35 -6
  88. package/src/jobs.ts +144 -0
  89. package/src/quasar.ts +28 -72
  90. package/src/testing/FakeQueue.ts +25 -15
  91. package/src/{nodeEnv.ts → vendor/nodeEnv.ts} +14 -7
  92. package/src/vendor/quasarConnection.ts +129 -0
  93. package/dist/nodeEnv.d.ts +0 -16
  94. package/dist/nodeEnv.d.ts.map +0 -1
  95. package/dist/nodeEnv.js.map +0 -1
  96. package/dist/stores.d.ts +0 -41
  97. package/dist/stores.d.ts.map +0 -1
  98. package/dist/stores.js +0 -46
  99. package/dist/stores.js.map +0 -1
  100. package/src/stores.ts +0 -59
@@ -1,3 +1,4 @@
1
+ import { type JobClass, type JobOptions } from "./Job.js";
1
2
  /**
2
3
  * QueueManager — dispatch and process background jobs.
3
4
  *
@@ -6,7 +7,7 @@
6
7
  * await queue.dispatch('send-email', { to: 'user@example.com' })
7
8
  * queue.work()
8
9
  */
9
- export interface Job {
10
+ export interface JobRecord {
10
11
  id: string;
11
12
  name: string;
12
13
  payload: unknown;
@@ -16,17 +17,84 @@ export interface Job {
16
17
  error?: string;
17
18
  createdAt: number;
18
19
  processedAt?: number;
20
+ /**
21
+ * How many times this job has been recovered from a stalled worker.
22
+ *
23
+ * Separate from `attempts`, which counts times a handler RAN. A worker that
24
+ * dies mid-job never reaches the failure path, so `attempts` cannot see it —
25
+ * upstream carries the same two counters side by side for the same reason
26
+ * (`JobData.stalledCount` in `@boringnode/queue`).
27
+ */
28
+ stalledCount?: number;
29
+ /**
30
+ * Named queue this job waits in. A worker is told which queues to serve, so
31
+ * a slow queue cannot starve a fast one sharing the same process.
32
+ *
33
+ * Optional on the wire: a job written by a version that had no queues
34
+ * parses without it and reads as `default`.
35
+ */
36
+ queue?: string;
37
+ /** Epoch ms before which no worker may take the job (`delay`). */
38
+ runAt?: number;
39
+ /** Milliseconds the handler gets before the attempt counts as failed. */
40
+ timeout?: number;
19
41
  }
42
+ /** The queue a record belongs to, for a record written before named queues. */
43
+ export declare function queueOf(job: JobRecord): string;
20
44
  export interface JobHandler {
21
45
  handle(payload: unknown): Promise<void>;
22
46
  }
47
+ /**
48
+ * What a worker is told before it starts, by upstream's names for it
49
+ * (`WorkerConfig.idleDelay`, `WorkerConfig.stalledInterval`).
50
+ */
51
+ export interface WorkerOptions {
52
+ /** Milliseconds to wait after finding nothing to do. Default `2000`. */
53
+ idleDelay?: number;
54
+ /** Milliseconds between stalled-job sweeps. Default `30_000`. */
55
+ stalledInterval?: number;
56
+ /**
57
+ * How many jobs this worker runs at once. Default `1`.
58
+ *
59
+ * One job at a time is the safe default and a poor one for anything that
60
+ * waits on the network: a worker sending mail spends nearly all of its time
61
+ * idle with a queue behind it.
62
+ */
63
+ concurrency?: number;
64
+ /**
65
+ * Which named queues to serve, in order. Default: the `default` queue.
66
+ *
67
+ * Naming them is how a slow queue is kept from starving a fast one — run
68
+ * one worker for `emails` and another for `default`, rather than one worker
69
+ * taking whatever comes.
70
+ */
71
+ queues?: readonly string[];
72
+ }
73
+ /**
74
+ * What a single `dispatch` may override.
75
+ *
76
+ * Everything a job class declares, plus `maxAttempts` — the name this method
77
+ * took before job classes existed, kept because it is what every existing call
78
+ * site passes. `maxRetries` is the class's name for the same number.
79
+ */
80
+ export interface DispatchOptions extends JobOptions {
81
+ /** The older spelling of `maxRetries`. Wins when both are given. */
82
+ maxAttempts?: number;
83
+ }
23
84
  export interface QueueDriver {
24
- push(job: Job): Promise<void>;
25
- pop(): Promise<Job | null>;
26
- fail(job: Job, error: string): Promise<void>;
27
- complete(job: Job): Promise<void>;
28
- retry(job: Job): Promise<void>;
29
- failed(): Promise<Job[]>;
85
+ push(job: JobRecord): Promise<void>;
86
+ /**
87
+ * Take the next job from one of `queues`, or from the default queue when
88
+ * the caller names none.
89
+ *
90
+ * A driver written before named queues takes no argument and keeps working:
91
+ * it serves the one queue it has, which is the default one.
92
+ */
93
+ pop(queues?: readonly string[]): Promise<JobRecord | null>;
94
+ fail(job: JobRecord, error: string): Promise<void>;
95
+ complete(job: JobRecord): Promise<void>;
96
+ retry(job: JobRecord): Promise<void>;
97
+ failed(): Promise<JobRecord[]>;
30
98
  size(): Promise<number>;
31
99
  /**
32
100
  * Optional crash recovery: move jobs orphaned in the driver's 'processing'
@@ -34,25 +102,76 @@ export interface QueueDriver {
34
102
  * recovered. In-memory drivers omit this — their jobs don't survive a crash.
35
103
  */
36
104
  recoverStale?(): Promise<number>;
105
+ /**
106
+ * Optional lease renewal: tell the driver this job is still being worked on,
107
+ * answering `false` when the claim is gone (already recovered, or now held
108
+ * by another worker). Drivers with no lease omit it.
109
+ */
110
+ renew?(job: JobRecord): Promise<boolean>;
111
+ /**
112
+ * How often the worker should call `renew` while a handler runs. The driver
113
+ * sets the cadence because the driver owns the deadline. Absent means no
114
+ * renewal.
115
+ */
116
+ readonly renewIntervalMs?: number;
37
117
  }
38
118
  export declare class QueueManager {
39
119
  #private;
40
- constructor(driver: QueueDriver);
41
- /** Register a job handler. */
120
+ constructor(driver: QueueDriver, workerDefaults?: WorkerOptions);
121
+ /** Register a job handler under a name. */
42
122
  register(name: string, handler: JobHandler | (new () => JobHandler)): void;
43
- /** Dispatch a job to the queue. */
44
- dispatch(name: string, payload: unknown, options?: {
45
- maxAttempts?: number;
46
- }): Promise<string>;
47
- /** Process the next job in the queue. */
48
- processOne(): Promise<boolean>;
123
+ /**
124
+ * Register a job class under its own name, so a worker in another process
125
+ * can find it from what the record carries.
126
+ *
127
+ * `dispatch(SomeJob, …)` does this on its own; call it directly when the
128
+ * worker never dispatches — which is the ordinary case, since a worker
129
+ * process runs jobs and an HTTP process queues them.
130
+ */
131
+ registerJob(job: JobClass): void;
132
+ /** Every job class this manager knows, by name. */
133
+ registeredJobs(): ReadonlyMap<string, JobClass>;
134
+ /**
135
+ * Queue a job.
136
+ *
137
+ * Takes a job class — the payload is then typed by the class's own
138
+ * parameter, so a field the handler reads cannot be one the dispatcher
139
+ * never sent:
140
+ *
141
+ * await queue.dispatch(SendEmail, { to: 'user@example.com' })
142
+ *
143
+ * A registered name still works, and is what a job whose name is computed
144
+ * at runtime needs:
145
+ *
146
+ * await queue.dispatch('send-email', { to: '…' })
147
+ */
148
+ dispatch<Payload>(job: JobClass<Payload>, payload: Payload, options?: DispatchOptions): Promise<string>;
149
+ dispatch(name: string, payload: unknown, options?: DispatchOptions): Promise<string>;
150
+ /**
151
+ * Process the next job, from `queues` when the caller names any.
152
+ *
153
+ * Returns whether there was one — the loop uses that to decide between
154
+ * asking again and sleeping.
155
+ */
156
+ processOne(queues?: readonly string[]): Promise<boolean>;
49
157
  /**
50
158
  * Start processing jobs continuously. Reclaims crash-orphaned jobs at
51
- * startup and every `recoverStaleMs` thereafter (no-op for in-memory drivers
52
- * without recoverStale) — otherwise a job left in 'processing' by a crashed
53
- * worker would sit there forever.
159
+ * startup and every `stalledInterval` thereafter (no-op for in-memory
160
+ * drivers without recoverStale) — otherwise a job left in 'processing' by a
161
+ * crashed worker would sit there forever.
162
+ *
163
+ * The options are upstream's `worker` block, by the names it gives them:
164
+ *
165
+ * queue.work({ idleDelay: 2000, stalledInterval: 30_000 })
166
+ *
167
+ * `idleDelay` defaults to 2 s, which is upstream's default too — a worker
168
+ * that finds nothing waits before asking again, and asking every second was
169
+ * bay's own number rather than the framework's.
170
+ *
171
+ * The positional form is the one this method had before it took the
172
+ * framework's names, and still works: `work(idleDelay, stalledInterval)`.
54
173
  */
55
- work(pollIntervalMs?: number, recoverStaleMs?: number): Promise<void>;
174
+ work(options?: WorkerOptions | number, stalledIntervalArg?: number): Promise<void>;
56
175
  /**
57
176
  * Reclaim jobs orphaned by a crashed worker — moves entries stuck in the
58
177
  * driver's 'processing' state (expired lease) back to pending and returns
@@ -60,7 +179,7 @@ export declare class QueueManager {
60
179
  * Called automatically by work(); also safe to schedule manually.
61
180
  */
62
181
  recoverStale(): Promise<number>;
63
- /** Await the currently in-flight processOne, if any. */
182
+ /** Await every in-flight attempt, if any. */
64
183
  drain(): Promise<void>;
65
184
  /**
66
185
  * Stop the worker and wait for it to actually be gone.
@@ -71,7 +190,7 @@ export declare class QueueManager {
71
190
  */
72
191
  stop(): Promise<void>;
73
192
  /** Get failed jobs. */
74
- failedJobs(): Promise<Job[]>;
193
+ failedJobs(): Promise<JobRecord[]>;
75
194
  /** Get queue size. */
76
195
  size(): Promise<number>;
77
196
  }
@@ -1 +1 @@
1
- {"version":3,"file":"QueueManager.d.ts","sourceRoot":"","sources":["../src/QueueManager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,GAAG;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IAC1B,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,WAAW;IAC3B,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,GAAG,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC;AAED,qBAAa,YAAY;;gBAUZ,MAAM,EAAE,WAAW;IAI/B,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,CAAC,UAAU,UAAU,CAAC,GAAG,IAAI;IAI1E,mCAAmC;IAC7B,QAAQ,CACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAChC,OAAO,CAAC,MAAM,CAAC;IAkBlB,yCAAyC;IACnC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IA2CpC;;;;;OAKG;IACG,IAAI,CAAC,cAAc,SAAO,EAAE,cAAc,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA6EzE;;;;;OAKG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAIrC,wDAAwD;IAClD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B;;;;;;OAMG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,uBAAuB;IACjB,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAIlC,sBAAsB;IAChB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAG7B"}
1
+ {"version":3,"file":"QueueManager.d.ts","sourceRoot":"","sources":["../src/QueueManager.ts"],"names":[],"mappings":"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"}
@@ -1,69 +1,146 @@
1
+ import { DEFAULT_QUEUE, isJobClass, toMilliseconds, } from "./Job.js";
2
+ /** The queue a record belongs to, for a record written before named queues. */
3
+ export function queueOf(job) {
4
+ return job.queue ?? DEFAULT_QUEUE;
5
+ }
1
6
  /**
2
- * QueueManager dispatch and process background jobs.
7
+ * Reject once `ms` has passed, without touching the work.
3
8
  *
4
- * Usage:
5
- * queue.register('send-email', new SendEmailHandler())
6
- * await queue.dispatch('send-email', { to: 'user@example.com' })
7
- * queue.work()
9
+ * Nothing in Node can interrupt a running promise, so a job that ignores its
10
+ * timeout goes on burning CPU. What this buys is that the WORKER stops waiting
11
+ * for it — otherwise one stuck job costs the whole worker, which never picks
12
+ * anything up again.
8
13
  */
14
+ function withTimeout(work, ms, name) {
15
+ const settled = Promise.resolve(work);
16
+ if (ms === undefined || ms <= 0)
17
+ return settled;
18
+ return new Promise((resolve, reject) => {
19
+ const timer = setTimeout(() => {
20
+ reject(new Error(`Job '${name}' exceeded its ${ms}ms timeout`));
21
+ }, ms);
22
+ // Unreffed: a pending timeout must not be the reason the process stays up.
23
+ timer.unref();
24
+ settled.then((value) => {
25
+ clearTimeout(timer);
26
+ resolve(value);
27
+ }, (err) => {
28
+ clearTimeout(timer);
29
+ reject(err);
30
+ });
31
+ });
32
+ }
9
33
  export class QueueManager {
10
34
  #driver;
11
35
  #handlers = new Map();
36
+ #jobs = new Map();
12
37
  #running = false;
13
38
  /** The running loop, so `stop()` can wait for it to finish. */
14
39
  #loopPromise;
15
40
  /** Cuts the sleep between polls short. */
16
41
  #wake;
17
- #inflightPromise = null;
18
- constructor(driver) {
42
+ /** Every attempt currently in flight, so `drain()` can wait for all of them. */
43
+ #inflight = new Set();
44
+ /** Defaults for `work()`, from the config's `worker` block. */
45
+ #workerDefaults;
46
+ constructor(driver, workerDefaults) {
19
47
  this.#driver = driver;
48
+ this.#workerDefaults = workerDefaults ?? {};
20
49
  }
21
- /** Register a job handler. */
50
+ /** Register a job handler under a name. */
22
51
  register(name, handler) {
23
52
  this.#handlers.set(name, handler);
24
53
  }
25
- /** Dispatch a job to the queue. */
26
- async dispatch(name, payload, options) {
27
- if (options?.maxAttempts !== undefined && options.maxAttempts < 1) {
54
+ /**
55
+ * Register a job class under its own name, so a worker in another process
56
+ * can find it from what the record carries.
57
+ *
58
+ * `dispatch(SomeJob, …)` does this on its own; call it directly when the
59
+ * worker never dispatches — which is the ordinary case, since a worker
60
+ * process runs jobs and an HTTP process queues them.
61
+ */
62
+ registerJob(job) {
63
+ this.#jobs.set(job.name, job);
64
+ }
65
+ /** Every job class this manager knows, by name. */
66
+ registeredJobs() {
67
+ return this.#jobs;
68
+ }
69
+ async dispatch(job, payload, options = {}) {
70
+ let name;
71
+ let declared = {};
72
+ if (isJobClass(job)) {
73
+ name = job.name;
74
+ declared = job.options ?? {};
75
+ // So a worker that never dispatches still resolves it by name.
76
+ this.#jobs.set(name, job);
77
+ }
78
+ else {
79
+ name = job;
80
+ }
81
+ // The call site wins over the class, and the class over the defaults —
82
+ // the same order `work()` reads its own options in.
83
+ const maxAttempts = options.maxAttempts ?? options.maxRetries ?? declared.maxRetries ?? 3;
84
+ if (maxAttempts < 1) {
28
85
  throw new Error("maxAttempts must be >= 1");
29
86
  }
87
+ const delay = options.delay ?? declared.delay;
88
+ const delayMs = delay === undefined ? 0 : toMilliseconds(delay, "delay");
89
+ const timeout = options.timeout ?? declared.timeout;
30
90
  const id = `job_${crypto.randomUUID()}`;
31
- const job = {
91
+ const record = {
32
92
  id,
33
93
  name,
34
94
  payload,
35
95
  attempts: 0,
36
- maxAttempts: options?.maxAttempts ?? 3,
96
+ maxAttempts,
37
97
  status: "pending",
38
98
  createdAt: Date.now(),
99
+ queue: options.queue ?? declared.queue ?? DEFAULT_QUEUE,
39
100
  };
40
- await this.#driver.push(job);
101
+ if (delayMs > 0)
102
+ record.runAt = Date.now() + delayMs;
103
+ if (timeout !== undefined) {
104
+ record.timeout = toMilliseconds(timeout, "timeout");
105
+ }
106
+ await this.#driver.push(record);
41
107
  return id;
42
108
  }
43
- /** Process the next job in the queue. */
44
- async processOne() {
45
- const job = await this.#driver.pop();
109
+ /**
110
+ * Process the next job, from `queues` when the caller names any.
111
+ *
112
+ * Returns whether there was one — the loop uses that to decide between
113
+ * asking again and sleeping.
114
+ */
115
+ async processOne(queues) {
116
+ const job = await this.#driver.pop(queues);
46
117
  if (!job)
47
118
  return false;
48
- const handlerOrClass = this.#handlers.get(job.name);
49
- if (!handlerOrClass) {
119
+ const run = this.#resolveRunner(job.name);
120
+ if (!run) {
50
121
  process.stderr.write(`QueueManager: no handler registered for job '${job.name}'\n`);
51
122
  await this.#driver.fail(job, `No handler registered for job: ${job.name}`);
52
123
  return true;
53
124
  }
54
- const handler = typeof handlerOrClass === "function"
55
- ? new handlerOrClass()
56
- : handlerOrClass;
125
+ const handler = run;
57
126
  job.attempts++;
58
127
  job.status = "processing";
59
128
  job.processedAt = Date.now();
129
+ // The lease a driver takes at pop() has a deadline, and a handler slower
130
+ // than that deadline was being recovered and re-delivered WHILE IT WAS
131
+ // STILL RUNNING — a second worker picked the job up, and the first one's
132
+ // completion then removed an entry the second one owned. Upstream calls
133
+ // the same mechanism a heartbeat (`Adapter.renewJobs`); a driver without
134
+ // a lease supplies no cadence and nothing is scheduled.
135
+ const stopRenewing = this.#startRenewing(job);
136
+ let handled = false;
60
137
  try {
61
- await handler.handle(job.payload);
62
- job.status = "completed";
63
- await this.#driver.complete(job);
138
+ await withTimeout(handler.run(job.payload), job.timeout, job.name);
139
+ handled = true;
64
140
  }
65
141
  catch (err) {
66
- const errorMsg = err instanceof Error ? err.message : String(err);
142
+ const error = err instanceof Error ? err : new Error(String(err));
143
+ const errorMsg = error.message;
67
144
  if (job.attempts < job.maxAttempts) {
68
145
  job.status = "pending";
69
146
  await this.#driver.retry(job);
@@ -72,28 +149,135 @@ export class QueueManager {
72
149
  job.status = "failed";
73
150
  job.error = errorMsg;
74
151
  await this.#driver.fail(job, errorMsg);
152
+ // After the last attempt, not after each one. A throw here is
153
+ // reported and swallowed: the job has already failed, and
154
+ // failing to say so must not be read as a second failure.
155
+ try {
156
+ await handler.onFailed?.(error);
157
+ }
158
+ catch (hookErr) {
159
+ process.stderr.write(`QueueManager: failed() hook of '${job.name}' threw: ${hookErr instanceof Error ? hookErr.message : String(hookErr)}\n`);
160
+ }
75
161
  }
76
162
  }
163
+ finally {
164
+ stopRenewing();
165
+ }
166
+ // Outside the catch, and deliberately. Marking the job done is a write to
167
+ // the driver, and a write can fail on its own — a Redis blip, a closed
168
+ // connection. Inside, that failure was read as the HANDLER having failed:
169
+ // the job went round again and the handler ran a second time, and once
170
+ // `attempts` ran out the job was filed as failed with the driver's error
171
+ // on it. A job that succeeded, in the failed list. The completion is
172
+ // allowed to throw now; the job keeps its lease, and the ordinary stall
173
+ // recovery is what re-delivers it.
174
+ if (handled) {
175
+ job.status = "completed";
176
+ await this.#driver.complete(job);
177
+ }
77
178
  return true;
78
179
  }
180
+ /**
181
+ * The runner for `name`: a registered handler, or a job class.
182
+ *
183
+ * A handler registered under the name wins — an application that registers
184
+ * one deliberately is overriding whatever else answers to it.
185
+ */
186
+ #resolveRunner(name) {
187
+ const handlerOrClass = this.#handlers.get(name);
188
+ if (handlerOrClass !== undefined) {
189
+ const handler = typeof handlerOrClass === "function"
190
+ ? new handlerOrClass()
191
+ : handlerOrClass;
192
+ return { run: (payload) => handler.handle(payload) };
193
+ }
194
+ const JobConstructor = this.#jobs.get(name);
195
+ if (JobConstructor === undefined)
196
+ return undefined;
197
+ const instance = new JobConstructor();
198
+ return {
199
+ run: (payload) => {
200
+ // `payload` is declared readonly on the class so a handler cannot
201
+ // rewrite what it was sent; it is assigned once, here.
202
+ Object.defineProperty(instance, "payload", {
203
+ value: payload,
204
+ configurable: true,
205
+ enumerable: true,
206
+ });
207
+ return instance.execute();
208
+ },
209
+ onFailed: instance.failed?.bind(instance),
210
+ };
211
+ }
212
+ /**
213
+ * Keep the driver's claim on `job` alive for as long as the handler runs.
214
+ * Returns the function that stops it — always called, including when the
215
+ * handler throws, so a finished job never keeps extending a lease.
216
+ */
217
+ #startRenewing(job) {
218
+ const driver = this.#driver;
219
+ const every = driver.renewIntervalMs;
220
+ if (!driver.renew || every === undefined || every <= 0) {
221
+ return () => { };
222
+ }
223
+ const timer = setInterval(() => {
224
+ // A renewal that fails is not a reason to interrupt the handler: the
225
+ // job may already have been recovered, and the handler finishing is
226
+ // still the best outcome available.
227
+ void driver.renew?.(job).catch(() => { });
228
+ }, every);
229
+ // Unreffed: the handler's own promise is what holds the process open.
230
+ timer.unref();
231
+ return () => {
232
+ clearInterval(timer);
233
+ };
234
+ }
79
235
  /**
80
236
  * Start processing jobs continuously. Reclaims crash-orphaned jobs at
81
- * startup and every `recoverStaleMs` thereafter (no-op for in-memory drivers
82
- * without recoverStale) — otherwise a job left in 'processing' by a crashed
83
- * worker would sit there forever.
237
+ * startup and every `stalledInterval` thereafter (no-op for in-memory
238
+ * drivers without recoverStale) — otherwise a job left in 'processing' by a
239
+ * crashed worker would sit there forever.
240
+ *
241
+ * The options are upstream's `worker` block, by the names it gives them:
242
+ *
243
+ * queue.work({ idleDelay: 2000, stalledInterval: 30_000 })
244
+ *
245
+ * `idleDelay` defaults to 2 s, which is upstream's default too — a worker
246
+ * that finds nothing waits before asking again, and asking every second was
247
+ * bay's own number rather than the framework's.
248
+ *
249
+ * The positional form is the one this method had before it took the
250
+ * framework's names, and still works: `work(idleDelay, stalledInterval)`.
84
251
  */
85
- async work(pollIntervalMs = 1000, recoverStaleMs = 30_000) {
86
- if (pollIntervalMs <= 0) {
87
- throw new Error("pollIntervalMs must be positive");
252
+ async work(options, stalledIntervalArg = 30_000) {
253
+ const asOptions = typeof options === "number" ? undefined : options;
254
+ // An argument beats the config's `worker` block, which beats the
255
+ // framework's own defaults.
256
+ const defaults = this.#workerDefaults;
257
+ const idleDelay = typeof options === "number"
258
+ ? options
259
+ : (options?.idleDelay ?? defaults.idleDelay ?? 2000);
260
+ const stalledInterval = typeof options === "number"
261
+ ? stalledIntervalArg
262
+ : (options?.stalledInterval ??
263
+ defaults.stalledInterval ??
264
+ stalledIntervalArg);
265
+ if (idleDelay <= 0) {
266
+ throw new Error("idleDelay must be positive");
267
+ }
268
+ if (stalledInterval <= 0) {
269
+ throw new Error("stalledInterval must be positive");
88
270
  }
89
- if (recoverStaleMs <= 0) {
90
- throw new Error("recoverStaleMs must be positive");
271
+ const concurrency = asOptions?.concurrency ?? this.#workerDefaults.concurrency ?? 1;
272
+ if (!Number.isInteger(concurrency) || concurrency < 1) {
273
+ throw new Error("concurrency must be a whole number >= 1");
91
274
  }
275
+ const queues = asOptions?.queues ?? this.#workerDefaults.queues;
92
276
  if (this.#running) {
93
277
  throw new Error("QueueManager is already running");
94
278
  }
95
279
  this.#running = true;
96
- const loop = this.#loop(pollIntervalMs, recoverStaleMs);
280
+ const loop = this.#loop(idleDelay, stalledInterval, concurrency, queues);
97
281
  this.#loopPromise = loop;
98
282
  try {
99
283
  await loop;
@@ -110,24 +294,34 @@ export class QueueManager {
110
294
  * while the loop was still pending — up to a full poll interval of a worker
111
295
  * that was supposed to be gone, and a timer holding the process open.
112
296
  */
113
- async #loop(pollIntervalMs, recoverStaleMs) {
297
+ async #loop(idleDelay, stalledInterval, concurrency, queues) {
114
298
  await this.#tryRecoverStale();
115
299
  let lastRecover = Date.now();
116
300
  while (this.#running) {
117
- try {
118
- this.#inflightPromise = this.processOne();
119
- const processed = await this.#inflightPromise;
120
- if (!processed)
121
- await this.#sleep(pollIntervalMs);
122
- }
123
- catch (err) {
124
- process.stderr.write(`QueueManager processOne error: ${err instanceof Error ? err.message : String(err)}\n`);
125
- await this.#sleep(pollIntervalMs);
301
+ // One round of up to `concurrency` jobs. `allSettled`, not `all`: a
302
+ // driver that throws for one job must not abandon the others
303
+ // mid-flight, and each attempt already reports its own failure.
304
+ const round = Array.from({ length: concurrency }, () => this.processOne(queues));
305
+ for (const attempt of round)
306
+ this.#inflight.add(attempt);
307
+ const outcomes = await Promise.allSettled(round);
308
+ for (const attempt of round)
309
+ this.#inflight.delete(attempt);
310
+ let processed = false;
311
+ for (const outcome of outcomes) {
312
+ if (outcome.status === "fulfilled") {
313
+ processed = processed || outcome.value;
314
+ }
315
+ else {
316
+ const err = outcome.reason;
317
+ process.stderr.write(`QueueManager processOne error: ${err instanceof Error ? err.message : String(err)}\n`);
318
+ }
126
319
  }
127
- finally {
128
- this.#inflightPromise = null;
129
- }
130
- if (this.#running && Date.now() - lastRecover >= recoverStaleMs) {
320
+ // Nothing anywhere means the queues are empty; anything at all means
321
+ // there may be more behind it, so ask again without waiting.
322
+ if (!processed)
323
+ await this.#sleep(idleDelay);
324
+ if (this.#running && Date.now() - lastRecover >= stalledInterval) {
131
325
  await this.#tryRecoverStale();
132
326
  lastRecover = Date.now();
133
327
  }
@@ -165,11 +359,11 @@ export class QueueManager {
165
359
  async recoverStale() {
166
360
  return (await this.#driver.recoverStale?.()) ?? 0;
167
361
  }
168
- /** Await the currently in-flight processOne, if any. */
362
+ /** Await every in-flight attempt, if any. */
169
363
  async drain() {
170
- if (this.#inflightPromise) {
171
- await this.#inflightPromise.catch(() => { });
172
- }
364
+ if (this.#inflight.size === 0)
365
+ return;
366
+ await Promise.allSettled([...this.#inflight]);
173
367
  }
174
368
  /**
175
369
  * Stop the worker and wait for it to actually be gone.
@@ -1 +1 @@
1
- {"version":3,"file":"QueueManager.js","sourceRoot":"","sources":["../src/QueueManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QueueManager.js","sourceRoot":"","sources":["../src/QueueManager.ts"],"names":[],"mappings":"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"}