@ddd-ts-kit/scheduling 0.9.0 → 0.11.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 (145) hide show
  1. package/README.md +73 -7
  2. package/dist/index.d.ts +25 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +13 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/job-runner.d.ts.map +1 -1
  7. package/dist/job-runner.js +1 -13
  8. package/dist/job-runner.js.map +1 -1
  9. package/dist/metric-names.d.ts +2 -0
  10. package/dist/metric-names.d.ts.map +1 -1
  11. package/dist/metric-names.js +2 -0
  12. package/dist/metric-names.js.map +1 -1
  13. package/dist/process/no-timeout-job-error.d.ts +6 -0
  14. package/dist/process/no-timeout-job-error.d.ts.map +1 -0
  15. package/dist/process/no-timeout-job-error.js +9 -0
  16. package/dist/process/no-timeout-job-error.js.map +1 -0
  17. package/dist/process/stored-process-runner.d.ts +24 -0
  18. package/dist/process/stored-process-runner.d.ts.map +1 -0
  19. package/dist/process/stored-process-runner.js +89 -0
  20. package/dist/process/stored-process-runner.js.map +1 -0
  21. package/dist/queue/background-job-definition.d.ts +9 -0
  22. package/dist/queue/background-job-definition.d.ts.map +1 -0
  23. package/dist/queue/background-job-definition.js +2 -0
  24. package/dist/queue/background-job-definition.js.map +1 -0
  25. package/dist/queue/background-job-observer.d.ts +4 -0
  26. package/dist/queue/background-job-observer.d.ts.map +1 -0
  27. package/dist/queue/background-job-observer.js +2 -0
  28. package/dist/queue/background-job-observer.js.map +1 -0
  29. package/dist/queue/background-job-outcome.d.ts +9 -0
  30. package/dist/queue/background-job-outcome.d.ts.map +1 -0
  31. package/dist/queue/background-job-outcome.js +2 -0
  32. package/dist/queue/background-job-outcome.js.map +1 -0
  33. package/dist/queue/background-job-recorder.d.ts +19 -0
  34. package/dist/queue/background-job-recorder.d.ts.map +1 -0
  35. package/dist/queue/background-job-recorder.js +87 -0
  36. package/dist/queue/background-job-recorder.js.map +1 -0
  37. package/dist/queue/background-job-run.d.ts +15 -0
  38. package/dist/queue/background-job-run.d.ts.map +1 -0
  39. package/dist/queue/background-job-run.js +2 -0
  40. package/dist/queue/background-job-run.js.map +1 -0
  41. package/dist/queue/claimed-job-runner.d.ts +44 -0
  42. package/dist/queue/claimed-job-runner.d.ts.map +1 -0
  43. package/dist/queue/claimed-job-runner.js +178 -0
  44. package/dist/queue/claimed-job-runner.js.map +1 -0
  45. package/dist/queue/errors/attempts-exhausted-error.d.ts +6 -0
  46. package/dist/queue/errors/attempts-exhausted-error.d.ts.map +1 -0
  47. package/dist/queue/errors/attempts-exhausted-error.js +9 -0
  48. package/dist/queue/errors/attempts-exhausted-error.js.map +1 -0
  49. package/dist/queue/errors/invalid-enqueue-error.d.ts +8 -0
  50. package/dist/queue/errors/invalid-enqueue-error.d.ts.map +1 -0
  51. package/dist/queue/errors/invalid-enqueue-error.js +15 -0
  52. package/dist/queue/errors/invalid-enqueue-error.js.map +1 -0
  53. package/dist/queue/errors/job-interrupted-error.d.ts +6 -0
  54. package/dist/queue/errors/job-interrupted-error.d.ts.map +1 -0
  55. package/dist/queue/errors/job-interrupted-error.js +9 -0
  56. package/dist/queue/errors/job-interrupted-error.js.map +1 -0
  57. package/dist/queue/errors/unknown-background-job-error.d.ts +6 -0
  58. package/dist/queue/errors/unknown-background-job-error.d.ts.map +1 -0
  59. package/dist/queue/errors/unknown-background-job-error.js +9 -0
  60. package/dist/queue/errors/unknown-background-job-error.js.map +1 -0
  61. package/dist/queue/queue-state.d.ts +12 -0
  62. package/dist/queue/queue-state.d.ts.map +1 -0
  63. package/dist/queue/queue-state.js +2 -0
  64. package/dist/queue/queue-state.js.map +1 -0
  65. package/dist/queue/queue-worker-options.d.ts +29 -0
  66. package/dist/queue/queue-worker-options.d.ts.map +1 -0
  67. package/dist/queue/queue-worker-options.js +2 -0
  68. package/dist/queue/queue-worker-options.js.map +1 -0
  69. package/dist/queue/queue-worker.d.ts +52 -0
  70. package/dist/queue/queue-worker.d.ts.map +1 -0
  71. package/dist/queue/queue-worker.js +194 -0
  72. package/dist/queue/queue-worker.js.map +1 -0
  73. package/dist/queue/registered-background-job.d.ts +11 -0
  74. package/dist/queue/registered-background-job.d.ts.map +1 -0
  75. package/dist/queue/registered-background-job.js +17 -0
  76. package/dist/queue/registered-background-job.js.map +1 -0
  77. package/dist/queue/report-failed-background-jobs.d.ts +11 -0
  78. package/dist/queue/report-failed-background-jobs.d.ts.map +1 -0
  79. package/dist/queue/report-failed-background-jobs.js +22 -0
  80. package/dist/queue/report-failed-background-jobs.js.map +1 -0
  81. package/dist/queue/running-job.d.ts +14 -0
  82. package/dist/queue/running-job.d.ts.map +1 -0
  83. package/dist/queue/running-job.js +2 -0
  84. package/dist/queue/running-job.js.map +1 -0
  85. package/dist/queue/store/claim-request.d.ts +8 -0
  86. package/dist/queue/store/claim-request.d.ts.map +1 -0
  87. package/dist/queue/store/claim-request.js +2 -0
  88. package/dist/queue/store/claim-request.js.map +1 -0
  89. package/dist/queue/store/claimed-job.d.ts +15 -0
  90. package/dist/queue/store/claimed-job.d.ts.map +1 -0
  91. package/dist/queue/store/claimed-job.js +2 -0
  92. package/dist/queue/store/claimed-job.js.map +1 -0
  93. package/dist/queue/store/in-memory-job-store.d.ts +40 -0
  94. package/dist/queue/store/in-memory-job-store.d.ts.map +1 -0
  95. package/dist/queue/store/in-memory-job-store.js +185 -0
  96. package/dist/queue/store/in-memory-job-store.js.map +1 -0
  97. package/dist/queue/store/job-failure.d.ts +8 -0
  98. package/dist/queue/store/job-failure.d.ts.map +1 -0
  99. package/dist/queue/store/job-failure.js +2 -0
  100. package/dist/queue/store/job-failure.js.map +1 -0
  101. package/dist/queue/store/job-lease.d.ts +9 -0
  102. package/dist/queue/store/job-lease.d.ts.map +1 -0
  103. package/dist/queue/store/job-lease.js +2 -0
  104. package/dist/queue/store/job-lease.js.map +1 -0
  105. package/dist/queue/store/job-store-stats.d.ts +7 -0
  106. package/dist/queue/store/job-store-stats.d.ts.map +1 -0
  107. package/dist/queue/store/job-store-stats.js +2 -0
  108. package/dist/queue/store/job-store-stats.js.map +1 -0
  109. package/dist/queue/store/job-store.d.ts +53 -0
  110. package/dist/queue/store/job-store.d.ts.map +1 -0
  111. package/dist/queue/store/job-store.js +12 -0
  112. package/dist/queue/store/job-store.js.map +1 -0
  113. package/dist/queue/store/job-update.d.ts +7 -0
  114. package/dist/queue/store/job-update.d.ts.map +1 -0
  115. package/dist/queue/store/job-update.js +2 -0
  116. package/dist/queue/store/job-update.js.map +1 -0
  117. package/dist/queue/store/new-job.d.ts +17 -0
  118. package/dist/queue/store/new-job.d.ts.map +1 -0
  119. package/dist/queue/store/new-job.js +2 -0
  120. package/dist/queue/store/new-job.js.map +1 -0
  121. package/dist/queue/store/plain-json.d.ts +3 -0
  122. package/dist/queue/store/plain-json.d.ts.map +1 -0
  123. package/dist/queue/store/plain-json.js +5 -0
  124. package/dist/queue/store/plain-json.js.map +1 -0
  125. package/dist/queue/store/queued-job-of.d.ts +5 -0
  126. package/dist/queue/store/queued-job-of.d.ts.map +1 -0
  127. package/dist/queue/store/queued-job-of.js +18 -0
  128. package/dist/queue/store/queued-job-of.js.map +1 -0
  129. package/dist/queue/store/stored-job.d.ts +22 -0
  130. package/dist/queue/store/stored-job.d.ts.map +1 -0
  131. package/dist/queue/store/stored-job.js +2 -0
  132. package/dist/queue/store/stored-job.js.map +1 -0
  133. package/dist/queue/store/tenant-key-of.d.ts +8 -0
  134. package/dist/queue/store/tenant-key-of.d.ts.map +1 -0
  135. package/dist/queue/store/tenant-key-of.js +9 -0
  136. package/dist/queue/store/tenant-key-of.js.map +1 -0
  137. package/dist/queue/stored-job-queue.d.ts +27 -0
  138. package/dist/queue/stored-job-queue.d.ts.map +1 -0
  139. package/dist/queue/stored-job-queue.js +78 -0
  140. package/dist/queue/stored-job-queue.js.map +1 -0
  141. package/dist/unless-aborted.d.ts +3 -0
  142. package/dist/unless-aborted.d.ts.map +1 -0
  143. package/dist/unless-aborted.js +14 -0
  144. package/dist/unless-aborted.js.map +1 -0
  145. package/package.json +3 -3
@@ -0,0 +1,194 @@
1
+ import { DuplicateJobError, NoopLogger, NoopMetrics } from '@ddd-ts-kit/kernel';
2
+ import { systemJobTimers } from '../system-job-timers.js';
3
+ import { BackgroundJobRecorder } from './background-job-recorder.js';
4
+ import { ClaimedJobRunner } from './claimed-job-runner.js';
5
+ import { AttemptsExhaustedError } from './errors/attempts-exhausted-error.js';
6
+ import { UnknownBackgroundJobError } from './errors/unknown-background-job-error.js';
7
+ import { RegisteredBackgroundJob } from './registered-background-job.js';
8
+ /**
9
+ * Runs the background jobs of the queues it has jobs for, in this process: each queue is the
10
+ * context of its jobs, so a worker given the modules of some contexts consumes their queues and
11
+ * no other. Delivery is at least once: a job whose worker died comes back when its lease ends.
12
+ */
13
+ export class QueueWorker {
14
+ options;
15
+ jobs = new Map();
16
+ queues = new Map();
17
+ recorder;
18
+ runner;
19
+ stopping = new AbortController();
20
+ running = false;
21
+ constructor(options) {
22
+ this.options = options;
23
+ const { logger = new NoopLogger(), metrics = new NoopMetrics(), onRun } = options;
24
+ const { store, clock, scope, timers = systemJobTimers } = options;
25
+ this.recorder = new BackgroundJobRecorder({ logger, metrics, ...(onRun === undefined ? {} : { onRun }) });
26
+ this.runner = new ClaimedJobRunner({ store, clock, scope, timers }, this.recorder);
27
+ }
28
+ /** Throws `DuplicateJobError` for a name already registered, `InvalidJobScheduleError` for options it cannot read. */
29
+ register(definition) {
30
+ if (this.jobs.has(definition.name)) {
31
+ throw new DuplicateJobError(definition.name);
32
+ }
33
+ const job = new RegisteredBackgroundJob(definition);
34
+ this.jobs.set(job.name, job);
35
+ this.followed(job.queue);
36
+ }
37
+ /** The names of the queues this worker consumes. */
38
+ queueNames() {
39
+ return [...this.queues.keys()];
40
+ }
41
+ /** Starts claiming. Starting twice does nothing. */
42
+ async start() {
43
+ if (this.running) {
44
+ return;
45
+ }
46
+ this.running = true;
47
+ this.stopping = new AbortController();
48
+ await Promise.all([...this.queues.values()].map((queue) => this.pump(queue)));
49
+ }
50
+ /**
51
+ * Stops claiming, waits for the attempts in progress up to the grace period, then aborts them:
52
+ * an aborted attempt gives its job back, uncounted, for the next worker. A claim in flight
53
+ * when it is called gives its jobs back the same way. Stopping is cooperative: a job that
54
+ * ignores its signal goes on behind, and is claimed again once its lease ends.
55
+ */
56
+ async stop() {
57
+ this.running = false;
58
+ for (const queue of this.queues.values()) {
59
+ queue.cancelSleep?.();
60
+ }
61
+ const timers = this.options.timers ?? systemJobTimers;
62
+ const cancelAbort = timers.schedule(this.options.graceMs ?? 30_000, () => {
63
+ this.stopping.abort();
64
+ });
65
+ const queues = [...this.queues.values()];
66
+ await Promise.all(queues.flatMap((queue) => (queue.filling === undefined ? [] : [queue.filling])));
67
+ await Promise.all(queues.flatMap((queue) => [...queue.active]));
68
+ cancelAbort();
69
+ }
70
+ /**
71
+ * Claims and runs every job due now, queue after queue, until none is left, and answers the
72
+ * attempts: for a test, or a command run once. Not while the worker runs.
73
+ */
74
+ async runDue() {
75
+ const runs = [];
76
+ for (const queue of this.queues.values()) {
77
+ for (let batch = await this.claimed(queue); batch.length > 0; batch = await this.claimed(queue)) {
78
+ runs.push(...(await Promise.all(batch.map((job) => this.attempt(job)))));
79
+ }
80
+ }
81
+ return runs;
82
+ }
83
+ followed(name) {
84
+ if (this.queues.has(name)) {
85
+ return;
86
+ }
87
+ this.queues.set(name, {
88
+ name,
89
+ concurrency: this.concurrencyOf(name),
90
+ active: new Set(),
91
+ filling: undefined,
92
+ cancelSleep: undefined,
93
+ });
94
+ }
95
+ concurrencyOf(queue) {
96
+ const { concurrency = 1 } = this.options;
97
+ if (typeof concurrency === 'number') {
98
+ return concurrency;
99
+ }
100
+ return concurrency[queue] ?? concurrency['default'] ?? 1;
101
+ }
102
+ /** Claims while there is room and work; an idle queue sleeps, a full one waits for an attempt to end. */
103
+ async pump(queue) {
104
+ if (queue.filling !== undefined || !this.running) {
105
+ return;
106
+ }
107
+ queue.filling = this.fillOrSleep(queue);
108
+ await queue.filling;
109
+ }
110
+ /** Never rejects: a fault of the store is recorded, and the queue asks again after a poll. */
111
+ async fillOrSleep(queue) {
112
+ try {
113
+ await this.fill(queue);
114
+ }
115
+ catch (error) {
116
+ this.recorder.fault(queue.name, error);
117
+ this.sleep(queue);
118
+ }
119
+ finally {
120
+ queue.filling = undefined;
121
+ }
122
+ }
123
+ async fill(queue) {
124
+ while (this.running) {
125
+ const room = queue.concurrency - queue.active.size;
126
+ if (room <= 0) {
127
+ return;
128
+ }
129
+ const claimed = await this.claimed(queue, room);
130
+ if (this.stopped()) {
131
+ await this.giveBack(claimed);
132
+ return;
133
+ }
134
+ for (const job of claimed) {
135
+ this.launch(queue, job);
136
+ }
137
+ if (claimed.length < room) {
138
+ this.sleep(queue);
139
+ return;
140
+ }
141
+ }
142
+ }
143
+ claimed(queue, limit = queue.concurrency) {
144
+ const leases = [...this.jobs.values()].filter((job) => job.queue === queue.name).map((job) => job.policy.leaseMs);
145
+ return this.options.store.claim({
146
+ queue: queue.name,
147
+ limit,
148
+ now: this.options.clock.now(),
149
+ leaseMs: Math.max(...leases),
150
+ });
151
+ }
152
+ /** Read anew after an await: `stop()` may have been called while it waited. */
153
+ stopped() {
154
+ return !this.running;
155
+ }
156
+ /** Jobs claimed while the worker stopped go back to the store, their attempt not counted. */
157
+ async giveBack(claimed) {
158
+ const now = this.options.clock.now();
159
+ await Promise.all(claimed.map((job) => this.options.store.release({ id: job.id, attempt: job.attempt }, now)));
160
+ }
161
+ launch(queue, job) {
162
+ const active = this.attempt(job).finally(() => {
163
+ queue.active.delete(active);
164
+ void this.pump(queue);
165
+ });
166
+ queue.active.add(active);
167
+ }
168
+ attempt(job) {
169
+ const registered = this.jobs.get(job.name);
170
+ if (registered === undefined) {
171
+ const stranger = new RegisteredBackgroundJob({ name: job.name, run: () => Promise.resolve() });
172
+ return this.runner.refuse(job, stranger, { error: new UnknownBackgroundJobError(job.name), retry: true });
173
+ }
174
+ const { maxAttempts } = registered.policy;
175
+ if (job.attempt > maxAttempts) {
176
+ return this.runner.refuse(job, registered, {
177
+ error: new AttemptsExhaustedError(job.name, maxAttempts),
178
+ retry: false,
179
+ });
180
+ }
181
+ return this.runner.run(job, registered, this.stopping.signal);
182
+ }
183
+ sleep(queue) {
184
+ if (!this.running) {
185
+ return;
186
+ }
187
+ const timers = this.options.timers ?? systemJobTimers;
188
+ queue.cancelSleep?.();
189
+ queue.cancelSleep = timers.schedule(this.options.pollIntervalMs ?? 1_000, () => {
190
+ void this.pump(queue);
191
+ });
192
+ }
193
+ }
194
+ //# sourceMappingURL=queue-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-worker.js","sourceRoot":"","sources":["../../src/queue/queue-worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type BackgroundJobPolicy } from '@ddd-ts-kit/kernel';
2
+ import type { BackgroundJobDefinition } from './background-job-definition.js';
3
+ /** A background job a worker knows, its options read once. */
4
+ export declare class RegisteredBackgroundJob {
5
+ readonly definition: BackgroundJobDefinition;
6
+ readonly policy: BackgroundJobPolicy;
7
+ constructor(definition: BackgroundJobDefinition);
8
+ get name(): string;
9
+ get queue(): string;
10
+ }
11
+ //# sourceMappingURL=registered-background-job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registered-background-job.d.ts","sourceRoot":"","sources":["../../src/queue/registered-background-job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAE9E,8DAA8D;AAC9D,qBAAa,uBAAuB;IAGtB,QAAQ,CAAC,UAAU,EAAE,uBAAuB;IAFxD,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAErC,YAAqB,UAAU,EAAE,uBAAuB,EAEvD;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;CACF"}
@@ -0,0 +1,17 @@
1
+ import { backgroundJobPolicy } from '@ddd-ts-kit/kernel';
2
+ /** A background job a worker knows, its options read once. */
3
+ export class RegisteredBackgroundJob {
4
+ definition;
5
+ policy;
6
+ constructor(definition) {
7
+ this.definition = definition;
8
+ this.policy = backgroundJobPolicy(definition.options);
9
+ }
10
+ get name() {
11
+ return this.definition.name;
12
+ }
13
+ get queue() {
14
+ return this.definition.name.split('.', 1).join('');
15
+ }
16
+ }
17
+ //# sourceMappingURL=registered-background-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registered-background-job.js","sourceRoot":"","sources":["../../src/queue/registered-background-job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAA4B,MAAM,oBAAoB,CAAC;AAGnF,8DAA8D;AAC9D,MAAM,OAAO,uBAAuB;IAGb,UAAU;IAFtB,MAAM,CAAsB;IAErC,YAAqB,UAAmC;0BAAnC,UAAU;QAC7B,IAAI,CAAC,MAAM,GAAG,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IAC9B,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import { type ErrorReporter } from '@ddd-ts-kit/kernel';
2
+ import type { BackgroundJobObserver } from './background-job-observer.js';
3
+ /**
4
+ * The observer that reports every attempt that failed with something else than a `DomainError`:
5
+ * a timeout, a fault of the job, a job no module registered. An attempt that a bus middleware
6
+ * already reported is left alone, and one that was released or interrupted is no failure.
7
+ *
8
+ * new QueueWorker({ ..., onRun: reportFailedBackgroundJobs(errors) });
9
+ */
10
+ export declare function reportFailedBackgroundJobs(reporter: ErrorReporter): BackgroundJobObserver;
11
+ //# sourceMappingURL=report-failed-background-jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-failed-background-jobs.d.ts","sourceRoot":"","sources":["../../src/queue/report-failed-background-jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACtG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAE1E;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,aAAa,GAAG,qBAAqB,CAiBzF"}
@@ -0,0 +1,22 @@
1
+ import { errorReportOf, isUnexpectedError, reportOnce } from '@ddd-ts-kit/kernel';
2
+ /**
3
+ * The observer that reports every attempt that failed with something else than a `DomainError`:
4
+ * a timeout, a fault of the job, a job no module registered. An attempt that a bus middleware
5
+ * already reported is left alone, and one that was released or interrupted is no failure.
6
+ *
7
+ * new QueueWorker({ ..., onRun: reportFailedBackgroundJobs(errors) });
8
+ */
9
+ export function reportFailedBackgroundJobs(reporter) {
10
+ return (run, error) => {
11
+ if ((run.outcome !== 'retried' && run.outcome !== 'dead') || !isUnexpectedError(error)) {
12
+ return;
13
+ }
14
+ reportOnce(reporter, error, errorReportOf(error, {
15
+ origin: 'queue',
16
+ operation: run.job,
17
+ context: run.job.split('.', 1).join(''),
18
+ correlationId: run.correlationId,
19
+ }));
20
+ };
21
+ }
22
+ //# sourceMappingURL=report-failed-background-jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-failed-background-jobs.js","sourceRoot":"","sources":["../../src/queue/report-failed-background-jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAsB,MAAM,oBAAoB,CAAC;AAGtG;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CAAC,QAAuB;IAChE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACpB,IAAI,CAAC,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YACvF,OAAO;QACT,CAAC;QAED,UAAU,CACR,QAAQ,EACR,KAAK,EACL,aAAa,CAAC,KAAK,EAAE;YACnB,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,GAAG,CAAC,GAAG;YAClB,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,aAAa,EAAE,GAAG,CAAC,aAAa;SACjC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { JobLease } from './store/job-lease.js';
2
+ import type { ClaimedJob } from './store/claimed-job.js';
3
+ import type { RegisteredBackgroundJob } from './registered-background-job.js';
4
+ /** One attempt in progress: what it runs, what it holds, and how to stop it. */
5
+ export interface RunningJob {
6
+ readonly job: ClaimedJob;
7
+ readonly registered: RegisteredBackgroundJob;
8
+ readonly lease: JobLease;
9
+ readonly controller: AbortController;
10
+ readonly startedAt: Date;
11
+ /** Cancels the next heartbeat. */
12
+ stopBeating: () => void;
13
+ }
14
+ //# sourceMappingURL=running-job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"running-job.d.ts","sourceRoot":"","sources":["../../src/queue/running-job.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAE9E,gFAAgF;AAChF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,kCAAkC;IAClC,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=running-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"running-job.js","sourceRoot":"","sources":["../../src/queue/running-job.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ export interface ClaimRequest {
2
+ readonly queue: string;
3
+ readonly limit: number;
4
+ readonly now: Date;
5
+ /** How long the claimed jobs stay invisible to other claims. */
6
+ readonly leaseMs: number;
7
+ }
8
+ //# sourceMappingURL=claim-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim-request.d.ts","sourceRoot":"","sources":["../../../src/queue/store/claim-request.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=claim-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim-request.js","sourceRoot":"","sources":["../../../src/queue/store/claim-request.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { EnqueuedBy } from '@ddd-ts-kit/kernel';
2
+ /** A job handed to a worker, with what its run needs. */
3
+ export interface ClaimedJob {
4
+ readonly id: string;
5
+ readonly name: string;
6
+ readonly queue: string;
7
+ readonly payload: unknown;
8
+ readonly enqueuedBy: EnqueuedBy;
9
+ readonly enqueuedAt: Date;
10
+ /** This claim: 1 the first time, counted at each claim. */
11
+ readonly attempt: number;
12
+ /** What an earlier attempt saved, absent on a fresh start. */
13
+ readonly checkpoint?: unknown;
14
+ }
15
+ //# sourceMappingURL=claimed-job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claimed-job.d.ts","sourceRoot":"","sources":["../../../src/queue/store/claimed-job.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,yDAAyD;AACzD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=claimed-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claimed-job.js","sourceRoot":"","sources":["../../../src/queue/store/claimed-job.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import { type EnqueuedJob, type QueuedJob } from '@ddd-ts-kit/kernel';
2
+ import type { ClaimRequest } from './claim-request.js';
3
+ import type { ClaimedJob } from './claimed-job.js';
4
+ import type { JobFailure } from './job-failure.js';
5
+ import type { JobLease } from './job-lease.js';
6
+ import type { JobStoreStats } from './job-store-stats.js';
7
+ import type { JobStore } from './job-store.js';
8
+ import type { JobUpdate } from './job-update.js';
9
+ import type { NewJob } from './new-job.js';
10
+ /**
11
+ * The queue in the memory of the process, for tests and a single process without a database.
12
+ * Called inside a unit of work, `add`, `cancel` and `retryDead` answer from what the store holds
13
+ * and write once it committed (`whenCommitted`): a command that rolls back leaves no job and
14
+ * cancels none. Payloads and checkpoints go through JSON, as in every other store.
15
+ */
16
+ export declare class InMemoryJobStore implements JobStore {
17
+ private readonly jobs;
18
+ private sequence;
19
+ add(job: NewJob): Promise<EnqueuedJob>;
20
+ claim({ queue, limit, now, leaseMs }: ClaimRequest): Promise<ClaimedJob[]>;
21
+ heartbeat(lease: JobLease, leaseUntil: Date): Promise<boolean>;
22
+ update(lease: JobLease, update: JobUpdate, leaseUntil: Date): Promise<boolean>;
23
+ complete(lease: JobLease, at: Date): Promise<boolean>;
24
+ fail(lease: JobLease, { errorCode, retryAt, at }: JobFailure): Promise<boolean>;
25
+ release(lease: JobLease, runAt: Date): Promise<boolean>;
26
+ cancel(id: string, at: Date): Promise<boolean>;
27
+ find(id: string): Promise<QueuedJob | undefined>;
28
+ retryDead(ids: readonly string[], now: Date): Promise<number>;
29
+ purgeFinished(before: Date): Promise<number>;
30
+ stats(queue: string): Promise<JobStoreStats>;
31
+ /** Every job in the order it was added, as the queue shows it: for assertions. */
32
+ list(): QueuedJob[];
33
+ private dead;
34
+ /** The key is scoped by the tenant: two tenants never share one. */
35
+ private withKey;
36
+ /** A job of the same key may have committed while this one waited for its own commit. */
37
+ private store;
38
+ private holding;
39
+ }
40
+ //# sourceMappingURL=in-memory-job-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-job-store.d.ts","sourceRoot":"","sources":["../../../src/queue/store/in-memory-job-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAO3C;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgC;IAErD,OAAO,CAAC,QAAQ,CAAK;IAEf,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAY3C;IAEK,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAa/E;IAEK,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAInE;IAEK,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAMnF;IAEK,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAI1D;IAEK,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAYpF;IAEK,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAO5D;IAEK,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAcnD;IAEK,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAIrD;IAEK,SAAS,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAUlE;IAEK,aAAa,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAUjD;IAEK,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAKjD;IAED,kFAAkF;IAClF,IAAI,IAAI,SAAS,EAAE,CAElB;IAED,OAAO,CAAC,IAAI;IAQZ,oEAAoE;IACpE,OAAO,CAAC,OAAO;IAWf,yFAAyF;IACzF,OAAO,CAAC,KAAK;IAwBb,OAAO,CAAC,OAAO;CAWhB"}
@@ -0,0 +1,185 @@
1
+ import { whenCommitted } from '@ddd-ts-kit/kernel';
2
+ import { plainJson } from './plain-json.js';
3
+ import { queuedJobOf } from './queued-job-of.js';
4
+ const FINISHED = ['succeeded', 'cancelled'];
5
+ /**
6
+ * The queue in the memory of the process, for tests and a single process without a database.
7
+ * Called inside a unit of work, `add`, `cancel` and `retryDead` answer from what the store holds
8
+ * and write once it committed (`whenCommitted`): a command that rolls back leaves no job and
9
+ * cancels none. Payloads and checkpoints go through JSON, as in every other store.
10
+ */
11
+ export class InMemoryJobStore {
12
+ jobs = new Map();
13
+ sequence = 0;
14
+ async add(job) {
15
+ const existing = this.withKey(job);
16
+ if (existing !== undefined) {
17
+ return { id: existing.id, duplicate: true };
18
+ }
19
+ await whenCommitted(async () => {
20
+ this.store(job);
21
+ });
22
+ return { id: job.id, duplicate: false };
23
+ }
24
+ async claim({ queue, limit, now, leaseMs }) {
25
+ const due = [...this.jobs.values()]
26
+ .filter((job) => job.queue === queue && isDue(job, now))
27
+ .sort((left, right) => left.runAt.getTime() - right.runAt.getTime() || left.sequence - right.sequence)
28
+ .slice(0, Math.max(0, limit));
29
+ for (const job of due) {
30
+ job.status = 'running';
31
+ job.attempts += 1;
32
+ job.leaseUntil = new Date(now.getTime() + leaseMs);
33
+ }
34
+ return due.map(claimedOf);
35
+ }
36
+ async heartbeat(lease, leaseUntil) {
37
+ return this.holding(lease, (job) => {
38
+ job.leaseUntil = leaseUntil;
39
+ });
40
+ }
41
+ async update(lease, update, leaseUntil) {
42
+ return this.holding(lease, (job) => {
43
+ job.leaseUntil = leaseUntil;
44
+ job.progress = update.progress ?? job.progress;
45
+ job.checkpoint = 'checkpoint' in update ? plainJson(update.checkpoint) : job.checkpoint;
46
+ });
47
+ }
48
+ async complete(lease, at) {
49
+ return this.holding(lease, (job) => {
50
+ finish(job, 'succeeded', at);
51
+ });
52
+ }
53
+ async fail(lease, { errorCode, retryAt, at }) {
54
+ return this.holding(lease, (job) => {
55
+ job.lastErrorCode = errorCode;
56
+ if (retryAt === null) {
57
+ finish(job, 'dead', at);
58
+ }
59
+ else {
60
+ job.status = 'waiting';
61
+ job.runAt = retryAt;
62
+ job.leaseUntil = undefined;
63
+ }
64
+ });
65
+ }
66
+ async release(lease, runAt) {
67
+ return this.holding(lease, (job) => {
68
+ job.status = 'waiting';
69
+ job.attempts -= 1;
70
+ job.runAt = runAt;
71
+ job.leaseUntil = undefined;
72
+ });
73
+ }
74
+ async cancel(id, at) {
75
+ if (!isCancellable(this.jobs.get(id))) {
76
+ return false;
77
+ }
78
+ await whenCommitted(async () => {
79
+ const job = this.jobs.get(id);
80
+ if (isCancellable(job)) {
81
+ finish(job, 'cancelled', at);
82
+ }
83
+ });
84
+ return true;
85
+ }
86
+ async find(id) {
87
+ const job = this.jobs.get(id);
88
+ return job === undefined ? undefined : queuedJobOf(job);
89
+ }
90
+ async retryDead(ids, now) {
91
+ const dead = this.dead(ids);
92
+ await whenCommitted(async () => {
93
+ for (const job of this.dead(ids)) {
94
+ Object.assign(job, { status: 'waiting', attempts: 0, runAt: now, finishedAt: undefined });
95
+ }
96
+ });
97
+ return dead.length;
98
+ }
99
+ async purgeFinished(before) {
100
+ const purged = [...this.jobs.values()].filter((job) => FINISHED.includes(job.status) && job.finishedAt !== undefined && job.finishedAt < before);
101
+ for (const job of purged) {
102
+ this.jobs.delete(job.id);
103
+ }
104
+ return purged.length;
105
+ }
106
+ async stats(queue) {
107
+ const jobs = [...this.jobs.values()].filter((job) => job.queue === queue);
108
+ const counted = (status) => jobs.filter((job) => job.status === status).length;
109
+ return { waiting: counted('waiting'), running: counted('running'), dead: counted('dead') };
110
+ }
111
+ /** Every job in the order it was added, as the queue shows it: for assertions. */
112
+ list() {
113
+ return [...this.jobs.values()].map(queuedJobOf);
114
+ }
115
+ dead(ids) {
116
+ return ids.flatMap((id) => {
117
+ const job = this.jobs.get(id);
118
+ return job?.status === 'dead' ? [job] : [];
119
+ });
120
+ }
121
+ /** The key is scoped by the tenant: two tenants never share one. */
122
+ withKey({ name, idempotencyKey, enqueuedBy }) {
123
+ if (idempotencyKey === undefined) {
124
+ return undefined;
125
+ }
126
+ return [...this.jobs.values()].find((job) => job.name === name && job.idempotencyKey === idempotencyKey && job.enqueuedBy.tenantId === enqueuedBy.tenantId);
127
+ }
128
+ /** A job of the same key may have committed while this one waited for its own commit. */
129
+ store(job) {
130
+ if (this.withKey(job) !== undefined) {
131
+ return;
132
+ }
133
+ this.sequence += 1;
134
+ this.jobs.set(job.id, {
135
+ ...job,
136
+ payload: plainJson(job.payload),
137
+ enqueuedBy: structuredClone(job.enqueuedBy),
138
+ idempotencyKey: job.idempotencyKey,
139
+ subject: job.subject,
140
+ sequence: this.sequence,
141
+ status: 'waiting',
142
+ attempts: 0,
143
+ leaseUntil: undefined,
144
+ progress: undefined,
145
+ checkpoint: undefined,
146
+ lastErrorCode: undefined,
147
+ finishedAt: undefined,
148
+ });
149
+ }
150
+ holding(lease, change) {
151
+ const job = this.jobs.get(lease.id);
152
+ if (job?.status !== 'running' || job.attempts !== lease.attempt) {
153
+ return false;
154
+ }
155
+ change(job);
156
+ return true;
157
+ }
158
+ }
159
+ function isCancellable(job) {
160
+ return job?.status === 'waiting' || job?.status === 'running';
161
+ }
162
+ function isDue(job, now) {
163
+ if (job.status === 'waiting') {
164
+ return job.runAt <= now;
165
+ }
166
+ return job.status === 'running' && job.leaseUntil !== undefined && job.leaseUntil <= now;
167
+ }
168
+ function finish(job, status, at) {
169
+ job.status = status;
170
+ job.finishedAt = at;
171
+ job.leaseUntil = undefined;
172
+ }
173
+ function claimedOf(job) {
174
+ return {
175
+ id: job.id,
176
+ name: job.name,
177
+ queue: job.queue,
178
+ payload: plainJson(job.payload),
179
+ enqueuedBy: structuredClone(job.enqueuedBy),
180
+ enqueuedAt: job.enqueuedAt,
181
+ attempt: job.attempts,
182
+ ...(job.checkpoint === undefined ? {} : { checkpoint: plainJson(job.checkpoint) }),
183
+ };
184
+ }
185
+ //# sourceMappingURL=in-memory-job-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-job-store.js","sourceRoot":"","sources":["../../../src/queue/store/in-memory-job-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface JobFailure {
2
+ /** The `code` of what the run threw, never a message. */
3
+ readonly errorCode: string;
4
+ /** When to try again, or `null` to declare the job dead. */
5
+ readonly retryAt: Date | null;
6
+ readonly at: Date;
7
+ }
8
+ //# sourceMappingURL=job-failure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-failure.d.ts","sourceRoot":"","sources":["../../../src/queue/store/job-failure.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,yDAAyD;IACzD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;CACnB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=job-failure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-failure.js","sourceRoot":"","sources":["../../../src/queue/store/job-failure.ts"],"names":[],"mappings":""}