@zmdb/jobs 1.0.0-beta.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.
@@ -0,0 +1,527 @@
1
+ const DEFAULT_TIMEOUT_MS = 30_000;
2
+ const DEFAULT_RETRIES = {
3
+ attempts: 5,
4
+ backoff: { kind: 'exponential', baseMs: 1000, ceilingMs: 300_000 },
5
+ };
6
+ const DEFAULT_BATCH = 100;
7
+ const DEFAULT_IDLE_MS = 1000;
8
+ const DEFAULT_MAX_IDLE_MS = 30_000;
9
+ function emptyReport() {
10
+ return { claimed: 0, done: 0, retried: 0, dead: 0, skipped: 0 };
11
+ }
12
+ function addReport(target, source) {
13
+ target.claimed += source.claimed;
14
+ target.done += source.done;
15
+ target.retried += source.retried;
16
+ target.dead += source.dead;
17
+ target.skipped += source.skipped;
18
+ }
19
+ function integer(name, value, minimum) {
20
+ if (!Number.isSafeInteger(value) || value < minimum) {
21
+ throw new RangeError(`${name} must be a safe integer greater than or equal to ${minimum}`);
22
+ }
23
+ }
24
+ function duration(name, value, allowZero = false) {
25
+ if (!Number.isFinite(value) || (allowZero ? value < 0 : value <= 0)) {
26
+ throw new RangeError(`${name} must be ${allowZero ? 'non-negative' : 'positive'} and finite`);
27
+ }
28
+ }
29
+ function validateRetryPolicy(name, policy) {
30
+ integer(`${name}.attempts`, policy.attempts, 1);
31
+ if (policy.backoff.kind === 'fixed') {
32
+ duration(`${name}.backoff.delayMs`, policy.backoff.delayMs);
33
+ return;
34
+ }
35
+ duration(`${name}.backoff.baseMs`, policy.backoff.baseMs);
36
+ duration(`${name}.backoff.ceilingMs`, policy.backoff.ceilingMs);
37
+ if (policy.backoff.ceilingMs < policy.backoff.baseMs) {
38
+ throw new RangeError(`${name}.backoff.ceilingMs must be greater than or equal to baseMs`);
39
+ }
40
+ }
41
+ function runtimeHandler(handler) {
42
+ // A mapped-union member is safe to widen internally: its validator and method
43
+ // came from the same member before this startup-built dispatch entry existed.
44
+ const broad = handler;
45
+ const runtime = {
46
+ name: broad.name,
47
+ prepare(raw) {
48
+ const payload = broad.validate(raw);
49
+ return ctx => broad.handle(payload, ctx);
50
+ },
51
+ };
52
+ if (broad.concurrency !== undefined)
53
+ Object.assign(runtime, { concurrency: broad.concurrency });
54
+ if (broad.timeoutMs !== undefined)
55
+ Object.assign(runtime, { timeoutMs: broad.timeoutMs });
56
+ if (broad.retries !== undefined)
57
+ Object.assign(runtime, { retries: broad.retries });
58
+ return runtime;
59
+ }
60
+ function errorDetail(error) {
61
+ return error instanceof Error ? error.message : String(error);
62
+ }
63
+ function parsePayload(payload) {
64
+ return JSON.parse(payload);
65
+ }
66
+ function jitter(policy, attempt) {
67
+ const nominal = policy.backoff.kind === 'fixed'
68
+ ? policy.backoff.delayMs
69
+ : Math.min(policy.backoff.ceilingMs, policy.backoff.baseMs * 2 ** (attempt - 1));
70
+ return nominal * (0.75 + Math.random() * 0.5);
71
+ }
72
+ async function wait(clock, ms, signal) {
73
+ try {
74
+ await clock.sleep(ms, signal);
75
+ return 'elapsed';
76
+ }
77
+ catch (error) {
78
+ if (signal.aborted)
79
+ return 'aborted';
80
+ throw error;
81
+ }
82
+ }
83
+ class JobWorker {
84
+ #handlers = new Map();
85
+ #activeByHandler = new Map();
86
+ #active = new Map();
87
+ #inFlight = new Map();
88
+ #claims = new Set();
89
+ #claimRequeues = new Set();
90
+ #keyTails = new Map();
91
+ #store;
92
+ #clock;
93
+ #concurrency;
94
+ #graceMs;
95
+ #leaseMs;
96
+ #onDead;
97
+ #onHandlerError;
98
+ #timeoutMs;
99
+ #retries;
100
+ #batch;
101
+ #idleMs;
102
+ #maxIdleMs;
103
+ #stopping = false;
104
+ #started = false;
105
+ #idleAbort;
106
+ #pass;
107
+ #shutdown;
108
+ constructor(opts) {
109
+ integer('concurrency', opts.concurrency, 1);
110
+ duration('graceMs', opts.graceMs, true);
111
+ duration('leaseMs', opts.leaseMs);
112
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
113
+ const retries = opts.retries ?? DEFAULT_RETRIES;
114
+ const batch = opts.batch ?? DEFAULT_BATCH;
115
+ const idleMs = opts.idleMs ?? DEFAULT_IDLE_MS;
116
+ const maxIdleMs = opts.maxIdleMs ?? DEFAULT_MAX_IDLE_MS;
117
+ duration('timeoutMs', timeoutMs);
118
+ if (opts.leaseMs <= timeoutMs) {
119
+ throw new RangeError('leaseMs must be greater than timeoutMs');
120
+ }
121
+ validateRetryPolicy('retries', retries);
122
+ integer('batch', batch, 1);
123
+ duration('idleMs', idleMs);
124
+ duration('maxIdleMs', maxIdleMs);
125
+ if (maxIdleMs < idleMs)
126
+ throw new RangeError('maxIdleMs must be greater than or equal to idleMs');
127
+ this.#store = opts.store;
128
+ this.#clock = opts.clock;
129
+ this.#concurrency = opts.concurrency;
130
+ this.#graceMs = opts.graceMs;
131
+ this.#leaseMs = opts.leaseMs;
132
+ this.#onDead = opts.onDead;
133
+ this.#onHandlerError = opts.onHandlerError;
134
+ this.#timeoutMs = timeoutMs;
135
+ this.#retries = retries;
136
+ this.#batch = batch;
137
+ this.#idleMs = idleMs;
138
+ this.#maxIdleMs = maxIdleMs;
139
+ for (const declared of opts.handlers) {
140
+ const handler = runtimeHandler(declared);
141
+ if (this.#handlers.has(handler.name))
142
+ throw new Error(`duplicate queue handler: ${handler.name}`);
143
+ if (handler.concurrency !== undefined) {
144
+ integer(`${handler.name}.concurrency`, handler.concurrency, 1);
145
+ if (handler.concurrency > this.#concurrency) {
146
+ throw new RangeError(`${handler.name}.concurrency cannot exceed worker concurrency`);
147
+ }
148
+ }
149
+ if (handler.timeoutMs !== undefined) {
150
+ duration(`${handler.name}.timeoutMs`, handler.timeoutMs);
151
+ if (opts.leaseMs <= handler.timeoutMs) {
152
+ throw new RangeError(`leaseMs must be greater than ${handler.name}.timeoutMs`);
153
+ }
154
+ }
155
+ if (handler.retries !== undefined)
156
+ validateRetryPolicy(`${handler.name}.retries`, handler.retries);
157
+ this.#handlers.set(handler.name, handler);
158
+ }
159
+ }
160
+ async runOnce() {
161
+ if (this.#pass !== undefined)
162
+ return this.#pass;
163
+ const pass = this.#runPass();
164
+ this.#pass = pass;
165
+ try {
166
+ return await pass;
167
+ }
168
+ finally {
169
+ if (this.#pass === pass)
170
+ this.#pass = undefined;
171
+ }
172
+ }
173
+ async #runPass() {
174
+ if (this.#stopping)
175
+ return emptyReport();
176
+ const capacity = this.#concurrency - this.#inFlight.size;
177
+ if (capacity <= 0)
178
+ return emptyReport();
179
+ const claim = this.#claim(Math.min(this.#batch, capacity));
180
+ this.#claims.add(claim);
181
+ let rows;
182
+ try {
183
+ rows = await claim;
184
+ }
185
+ finally {
186
+ this.#claims.delete(claim);
187
+ }
188
+ if (this.#stopping) {
189
+ const requeue = Promise.allSettled(rows.map(row => this.#requeueClaim(row))).then(() => undefined);
190
+ this.#claimRequeues.add(requeue);
191
+ try {
192
+ await requeue;
193
+ }
194
+ finally {
195
+ this.#claimRequeues.delete(requeue);
196
+ }
197
+ return { ...emptyReport(), claimed: rows.length };
198
+ }
199
+ const report = emptyReport();
200
+ report.claimed = rows.length;
201
+ const settled = await Promise.all(rows.map(row => this.#startClaimed(row)));
202
+ for (const outcome of settled)
203
+ addReport(report, outcome);
204
+ return report;
205
+ }
206
+ start() {
207
+ if (this.#started || this.#stopping)
208
+ return;
209
+ this.#started = true;
210
+ void this.#loop().catch(() => {
211
+ this.#stopping = true;
212
+ });
213
+ }
214
+ onShutdown(options) {
215
+ if (this.#shutdown !== undefined)
216
+ return this.#shutdown;
217
+ const cap = options?.graceMs;
218
+ if (cap !== undefined)
219
+ duration('graceMs', cap, true);
220
+ const graceMs = Math.min(this.#graceMs, cap ?? this.#graceMs);
221
+ this.#shutdown = this.#drain(graceMs);
222
+ return this.#shutdown;
223
+ }
224
+ async listDead(opts) {
225
+ return this.#store.listDead(opts);
226
+ }
227
+ async replay(jobId) {
228
+ return this.#store.replay(jobId, new Date(this.#clock.now()));
229
+ }
230
+ async #loop() {
231
+ let idleMs = this.#idleMs;
232
+ while (!this.#stopping) {
233
+ const report = await this.runOnce();
234
+ if (this.#stopping)
235
+ return;
236
+ if (report.claimed > 0) {
237
+ idleMs = this.#idleMs;
238
+ continue;
239
+ }
240
+ const controller = new AbortController();
241
+ this.#idleAbort = controller;
242
+ await wait(this.#clock, idleMs, controller.signal);
243
+ if (this.#idleAbort === controller)
244
+ this.#idleAbort = undefined;
245
+ idleMs = Math.min(this.#maxIdleMs, idleMs * 2);
246
+ }
247
+ }
248
+ async #drain(graceMs) {
249
+ this.#stopping = true;
250
+ this.#idleAbort?.abort();
251
+ const current = [this.#pass, ...this.#claims, ...this.#claimRequeues, ...this.#inFlight.values()];
252
+ const graceAbort = new AbortController();
253
+ const settled = Promise.allSettled(current).then(() => 'settled');
254
+ const grace = graceMs === 0 ? Promise.resolve('elapsed') : wait(this.#clock, graceMs, graceAbort.signal);
255
+ const outcome = await Promise.race([settled, grace]);
256
+ graceAbort.abort();
257
+ if (outcome === 'settled')
258
+ return;
259
+ const unfinished = [...this.#active.values()];
260
+ for (const active of unfinished) {
261
+ active.abandoned = true;
262
+ active.controller.abort();
263
+ }
264
+ // Release is observed even when a provider cannot finish before this deadline.
265
+ void Promise.allSettled(unfinished.map(active => this.#requeueClaim(active.row)));
266
+ }
267
+ async #claim(limit) {
268
+ const now = new Date(this.#clock.now());
269
+ // A capped handler must not hide other names behind its queued candidates.
270
+ const scanLimit = [...this.#handlers.values()].some(handler => handler.concurrency !== undefined)
271
+ ? this.#batch
272
+ : limit;
273
+ const candidates = await this.#store.candidates({ now, limit: scanLimit });
274
+ const selected = this.#selectCandidates(candidates, limit);
275
+ if (selected.length === 0)
276
+ return [];
277
+ return this.#store.claim({
278
+ ids: selected.map(candidate => candidate.id),
279
+ holder: globalThis.crypto.randomUUID(),
280
+ now,
281
+ leaseUntil: new Date(now.getTime() + this.#leaseMs),
282
+ });
283
+ }
284
+ #selectCandidates(rows, limit) {
285
+ const selected = [];
286
+ const reserved = new Map();
287
+ for (const row of rows) {
288
+ if (selected.length >= limit)
289
+ break;
290
+ const { id, name } = row;
291
+ if (this.#active.has(id))
292
+ continue;
293
+ const handler = this.#handlers.get(name);
294
+ if (handler?.concurrency !== undefined) {
295
+ const used = (this.#activeByHandler.get(name) ?? 0) + (reserved.get(name) ?? 0);
296
+ if (used >= handler.concurrency)
297
+ continue;
298
+ reserved.set(name, (reserved.get(name) ?? 0) + 1);
299
+ }
300
+ selected.push(row);
301
+ }
302
+ return selected;
303
+ }
304
+ #startClaimed(row) {
305
+ const handler = this.#handlers.get(row.name);
306
+ const active = { row, controller: new AbortController(), abandoned: false };
307
+ this.#active.set(row.id, active);
308
+ if (handler !== undefined) {
309
+ this.#activeByHandler.set(row.name, (this.#activeByHandler.get(row.name) ?? 0) + 1);
310
+ }
311
+ const work = this.#process(active, handler).finally(() => {
312
+ this.#active.delete(row.id);
313
+ this.#inFlight.delete(row.id);
314
+ if (handler !== undefined) {
315
+ const remaining = (this.#activeByHandler.get(row.name) ?? 1) - 1;
316
+ if (remaining === 0)
317
+ this.#activeByHandler.delete(row.name);
318
+ else
319
+ this.#activeByHandler.set(row.name, remaining);
320
+ }
321
+ });
322
+ this.#inFlight.set(row.id, work);
323
+ return work;
324
+ }
325
+ async #process(active, handler) {
326
+ const key = active.row.dedupeKey ?? active.row.id;
327
+ const release = await this.#lockKey(key);
328
+ try {
329
+ if (active.abandoned)
330
+ return emptyReport();
331
+ const completed = await this.#markerExists(key);
332
+ if (active.abandoned)
333
+ return emptyReport();
334
+ if (completed) {
335
+ const done = await this.#markDone(active);
336
+ return { ...emptyReport(), done: done ? 1 : 0, skipped: 1 };
337
+ }
338
+ let raw;
339
+ try {
340
+ raw = parsePayload(active.row.payload);
341
+ }
342
+ catch (error) {
343
+ return this.#markDead(active, 'invalid-payload', `${errorDetail(error)}: ${active.row.payload.slice(0, 200)}`);
344
+ }
345
+ if (handler === undefined) {
346
+ return this.#settleFailure(active, this.#retries, `no handler registered for ${active.row.name}`, 'unknown-name');
347
+ }
348
+ let prepared;
349
+ try {
350
+ prepared = handler.prepare(raw);
351
+ }
352
+ catch (error) {
353
+ return this.#markDead(active, 'invalid-payload', errorDetail(error));
354
+ }
355
+ const ctx = {
356
+ jobId: active.row.id,
357
+ name: active.row.name,
358
+ attempt: active.row.attempts + 1,
359
+ enqueuedAt: active.row.enqueuedAt,
360
+ idempotencyKey: key,
361
+ signal: active.controller.signal,
362
+ };
363
+ const timeoutMs = handler.timeoutMs ?? this.#timeoutMs;
364
+ const policy = handler.retries ?? this.#retries;
365
+ return this.#runHandler(active, prepared, ctx, timeoutMs, policy);
366
+ }
367
+ finally {
368
+ release();
369
+ }
370
+ }
371
+ async #runHandler(active, prepared, ctx, timeoutMs, policy) {
372
+ const timerAbort = new AbortController();
373
+ const handler = Promise.resolve()
374
+ .then(() => (active.abandoned ? undefined : prepared(ctx)))
375
+ .then(() => ({ kind: 'resolved' }), (error) => ({ kind: 'rejected', error }));
376
+ const timeout = wait(this.#clock, timeoutMs, timerAbort.signal).then(result => result === 'elapsed' ? { kind: 'timeout' } : { kind: 'cancelled' });
377
+ const first = await Promise.race([handler, timeout]);
378
+ if (first.kind === 'timeout') {
379
+ active.controller.abort();
380
+ const error = new Error(`job ${ctx.name} timed out after ${timeoutMs}ms`);
381
+ this.#reportHandlerError(ctx, error);
382
+ const outcome = await this.#settleFailure(active, policy, error.message);
383
+ await handler;
384
+ return outcome;
385
+ }
386
+ timerAbort.abort();
387
+ if (active.abandoned)
388
+ return emptyReport();
389
+ if (first.kind === 'rejected') {
390
+ this.#reportHandlerError(ctx, first.error);
391
+ return this.#settleFailure(active, policy, errorDetail(first.error));
392
+ }
393
+ const done = await this.#markDone(active);
394
+ return { ...emptyReport(), done: done ? 1 : 0, skipped: done ? 0 : 1 };
395
+ }
396
+ #reportHandlerError(ctx, error) {
397
+ try {
398
+ this.#onHandlerError(ctx, error);
399
+ }
400
+ catch {
401
+ // The error sink is observational; it cannot change queue settlement.
402
+ }
403
+ }
404
+ async #settleFailure(active, policy, detail, terminalReason = 'attempts-exhausted') {
405
+ const attempt = active.row.attempts + 1;
406
+ if (attempt >= policy.attempts)
407
+ return this.#markDead(active, terminalReason, detail);
408
+ if (active.abandoned)
409
+ return emptyReport();
410
+ const settled = await this.#store.settle({
411
+ kind: 'retry',
412
+ jobId: active.row.id,
413
+ holder: active.row.holder,
414
+ attempts: attempt,
415
+ availableAt: new Date(this.#clock.now() + jitter(policy, attempt)),
416
+ detail,
417
+ });
418
+ return { ...emptyReport(), retried: settled ? 1 : 0, skipped: settled ? 0 : 1 };
419
+ }
420
+ async #markDone(active) {
421
+ if (active.abandoned)
422
+ return false;
423
+ return this.#store.settle({
424
+ kind: 'done',
425
+ jobId: active.row.id,
426
+ holder: active.row.holder,
427
+ idempotencyKey: active.row.dedupeKey ?? active.row.id,
428
+ completedAt: new Date(this.#clock.now()),
429
+ });
430
+ }
431
+ async #markDead(active, reason, detail) {
432
+ if (active.abandoned)
433
+ return emptyReport();
434
+ const deadAt = new Date(this.#clock.now());
435
+ const attempts = active.row.attempts + 1;
436
+ const settled = await this.#store.settle({
437
+ kind: 'dead',
438
+ jobId: active.row.id,
439
+ holder: active.row.holder,
440
+ attempts,
441
+ reason,
442
+ detail,
443
+ deadAt,
444
+ });
445
+ if (!settled)
446
+ return { ...emptyReport(), skipped: 1 };
447
+ await this.#onDead({
448
+ jobId: active.row.id,
449
+ name: active.row.name,
450
+ payload: active.row.payload,
451
+ attempts,
452
+ reason,
453
+ detail,
454
+ enqueuedAt: active.row.enqueuedAt,
455
+ deadAt,
456
+ });
457
+ return { ...emptyReport(), dead: 1 };
458
+ }
459
+ async #markerExists(key) {
460
+ return this.#store.completed(key);
461
+ }
462
+ async #lockKey(key) {
463
+ let release = () => undefined;
464
+ const current = new Promise(resolve => {
465
+ release = resolve;
466
+ });
467
+ const previous = this.#keyTails.get(key);
468
+ this.#keyTails.set(key, current);
469
+ if (previous !== undefined)
470
+ await previous;
471
+ return () => {
472
+ release();
473
+ if (this.#keyTails.get(key) === current)
474
+ this.#keyTails.delete(key);
475
+ };
476
+ }
477
+ async #requeueClaim(row) {
478
+ await this.#store.settle({
479
+ kind: 'release',
480
+ jobId: row.id,
481
+ holder: row.holder,
482
+ availableAt: new Date(this.#clock.now()),
483
+ });
484
+ }
485
+ }
486
+ class JobQueue {
487
+ #store;
488
+ #clock;
489
+ constructor(opts) {
490
+ this.#store = opts.store;
491
+ this.#clock = opts.clock;
492
+ }
493
+ enqueue(name, payload, opts) {
494
+ return this.#enqueue(this.#store, name, payload, opts);
495
+ }
496
+ enqueueInTransaction(tx, name, payload, opts) {
497
+ return this.#enqueue(tx, name, payload, opts);
498
+ }
499
+ async #enqueue(store, name, payload, opts) {
500
+ const delayMs = opts?.delayMs ?? 0;
501
+ duration('delayMs', delayMs, true);
502
+ const encoded = JSON.stringify(payload);
503
+ if (encoded === undefined)
504
+ throw new TypeError(`job ${name} payload is not JSON-serializable`);
505
+ const now = this.#clock.now();
506
+ const result = await store.enqueue({
507
+ id: globalThis.crypto.randomUUID(),
508
+ name,
509
+ payload: encoded,
510
+ enqueuedAt: new Date(now),
511
+ availableAt: new Date(now + delayMs),
512
+ ...(opts?.dedupeKey === undefined ? {} : { dedupeKey: opts.dedupeKey }),
513
+ });
514
+ return result.jobId;
515
+ }
516
+ }
517
+ export function createQueue(opts) {
518
+ if (opts?.store === undefined)
519
+ throw new TypeError('@zmdb/jobs: a store is required');
520
+ return new JobQueue(opts);
521
+ }
522
+ export function createWorker(opts) {
523
+ if (opts?.store === undefined)
524
+ throw new TypeError('@zmdb/jobs: a store is required');
525
+ return new JobWorker(opts);
526
+ }
527
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/queues/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** A parsed cron expression bound to one explicit time zone. */
2
+ export interface CronPlan {
3
+ nextAtOrAfter(instant: number): number;
4
+ nextAfter(instant: number): number;
5
+ }
6
+ /** Parse once and return the two next-instant operations the scheduler needs. */
7
+ export declare function createCronPlan(expression: string, timeZone: string, taskName: string): CronPlan;
8
+ //# sourceMappingURL=cron.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../src/schedule/cron.ts"],"names":[],"mappings":"AA4FA,gEAAgE;AAChE,MAAM,WAAW,QAAQ;IACvB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACvC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CACpC;AASD,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAmC/F"}