@furystack/redis-task-runner 1.0.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 (47) hide show
  1. package/README.md +128 -0
  2. package/esm/cross-process-smoke.spec.d.ts +2 -0
  3. package/esm/cross-process-smoke.spec.d.ts.map +1 -0
  4. package/esm/cross-process-smoke.spec.js +463 -0
  5. package/esm/cross-process-smoke.spec.js.map +1 -0
  6. package/esm/define-redis-task-runner.d.ts +38 -0
  7. package/esm/define-redis-task-runner.d.ts.map +1 -0
  8. package/esm/define-redis-task-runner.js +60 -0
  9. package/esm/define-redis-task-runner.js.map +1 -0
  10. package/esm/index.d.ts +7 -0
  11. package/esm/index.d.ts.map +1 -0
  12. package/esm/index.js +4 -0
  13. package/esm/index.js.map +1 -0
  14. package/esm/multi-service-smoke.spec.d.ts +2 -0
  15. package/esm/multi-service-smoke.spec.d.ts.map +1 -0
  16. package/esm/multi-service-smoke.spec.js +468 -0
  17. package/esm/multi-service-smoke.spec.js.map +1 -0
  18. package/esm/redis-queue-adapter.d.ts +125 -0
  19. package/esm/redis-queue-adapter.d.ts.map +1 -0
  20. package/esm/redis-queue-adapter.js +566 -0
  21. package/esm/redis-queue-adapter.js.map +1 -0
  22. package/esm/redis-queue-adapter.unit.spec.d.ts +2 -0
  23. package/esm/redis-queue-adapter.unit.spec.d.ts.map +1 -0
  24. package/esm/redis-queue-adapter.unit.spec.js +860 -0
  25. package/esm/redis-queue-adapter.unit.spec.js.map +1 -0
  26. package/esm/redis-task-runner.d.ts +33 -0
  27. package/esm/redis-task-runner.d.ts.map +1 -0
  28. package/esm/redis-task-runner.integration.spec.d.ts +2 -0
  29. package/esm/redis-task-runner.integration.spec.d.ts.map +1 -0
  30. package/esm/redis-task-runner.integration.spec.js +536 -0
  31. package/esm/redis-task-runner.integration.spec.js.map +1 -0
  32. package/esm/redis-task-runner.js +43 -0
  33. package/esm/redis-task-runner.js.map +1 -0
  34. package/esm/redis-task-runner.unit.spec.d.ts +2 -0
  35. package/esm/redis-task-runner.unit.spec.d.ts.map +1 -0
  36. package/esm/redis-task-runner.unit.spec.js +97 -0
  37. package/esm/redis-task-runner.unit.spec.js.map +1 -0
  38. package/package.json +63 -0
  39. package/src/cross-process-smoke.spec.ts +459 -0
  40. package/src/define-redis-task-runner.ts +91 -0
  41. package/src/index.ts +8 -0
  42. package/src/multi-service-smoke.spec.ts +511 -0
  43. package/src/redis-queue-adapter.ts +733 -0
  44. package/src/redis-queue-adapter.unit.spec.ts +613 -0
  45. package/src/redis-task-runner.integration.spec.ts +440 -0
  46. package/src/redis-task-runner.ts +67 -0
  47. package/src/redis-task-runner.unit.spec.ts +110 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-queue-adapter.unit.spec.js","sourceRoot":"","sources":["../src/redis-queue-adapter.unit.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { BlobStore } from '@furystack/blob-store';
2
+ import type { CrossNodeBus } from '@furystack/cross-node-bus';
3
+ import type { Injector } from '@furystack/inject';
4
+ import type { DataSet } from '@furystack/repository';
5
+ import type { Task, TaskReplayLogEntry } from '@furystack/task-runner';
6
+ import { TaskRunnerCore, type TaskRunnerCoreOptions } from '@furystack/task-runner';
7
+ import type { TaskRunnerTelemetry } from '@furystack/task-runner';
8
+ import { type RedisQueueAdapterOptions } from './redis-queue-adapter.js';
9
+ export type RedisTaskRunnerOptions = TaskRunnerCoreOptions;
10
+ export type RedisTaskRunnerDeps = Omit<RedisQueueAdapterOptions, 'client' | 'serviceName'> & {
11
+ injector: Injector;
12
+ bus: CrossNodeBus;
13
+ blobStore: BlobStore;
14
+ taskDs: DataSet<Task, 'id'>;
15
+ replayDs: DataSet<TaskReplayLogEntry, 'id'>;
16
+ telemetry: TaskRunnerTelemetry;
17
+ client: RedisQueueAdapterOptions['client'];
18
+ serviceName: string;
19
+ };
20
+ /**
21
+ * Redis-Streams-backed {@link TaskRunnerCore}. Uses
22
+ * `@furystack/redis-task-runner` consumer-group claim plumbing while
23
+ * inheriting all task lifecycle, replay, retry, cancel-cascade, and
24
+ * telemetry behavior from the core class. Apps bind it via
25
+ * {@link defineRedisTaskRunner} so the adapter shares lifetime with
26
+ * the surrounding injector scope.
27
+ */
28
+ export declare class RedisTaskRunner extends TaskRunnerCore {
29
+ #private;
30
+ constructor(deps: RedisTaskRunnerDeps, options?: RedisTaskRunnerOptions);
31
+ [Symbol.dispose](): void;
32
+ }
33
+ //# sourceMappingURL=redis-task-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-task-runner.d.ts","sourceRoot":"","sources":["../src/redis-task-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AACtE,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AACnF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAqB,KAAK,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AAE3F,MAAM,MAAM,sBAAsB,GAAG,qBAAqB,CAAA;AAE1D,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,wBAAwB,EAAE,QAAQ,GAAG,aAAa,CAAC,GAAG;IAC3F,QAAQ,EAAE,QAAQ,CAAA;IAClB,GAAG,EAAE,YAAY,CAAA;IACjB,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAC3B,QAAQ,EAAE,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAA;IAC3C,SAAS,EAAE,mBAAmB,CAAA;IAC9B,MAAM,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAA;IAC1C,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED;;;;;;;GAOG;AACH,qBAAa,eAAgB,SAAQ,cAAc;;gBAGrC,IAAI,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,sBAAsB;IA6BvD,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAIzC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=redis-task-runner.integration.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-task-runner.integration.spec.d.ts","sourceRoot":"","sources":["../src/redis-task-runner.integration.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,536 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
53
+ import { randomUUID } from 'node:crypto';
54
+ import { BlobStore, InMemoryBlobStore } from '@furystack/blob-store';
55
+ import { CrossNodeBus, defineInProcessCrossNodeBus } from '@furystack/cross-node-bus';
56
+ import { createInjector } from '@furystack/inject';
57
+ import { defineTaskHandler, TaskRunner, } from '@furystack/task-runner';
58
+ import { runTaskToCompletion } from '@furystack/task-runner/testing';
59
+ import { createClient } from 'redis';
60
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
61
+ import { defineRedisTaskRunner } from './define-redis-task-runner.js';
62
+ const REDIS_URL = process.env.REDIS_URL ?? 'redis://localhost:6379';
63
+ const buildHarness = async (options) => {
64
+ const client = createClient({ url: REDIS_URL });
65
+ await client.connect();
66
+ const injector = createInjector();
67
+ injector.bind(BlobStore, ({ onDispose }) => {
68
+ const store = new InMemoryBlobStore({ name: 'integration-blobs' });
69
+ // eslint-disable-next-line furystack/prefer-using-wrapper -- delegated to onDispose
70
+ onDispose(() => store[Symbol.dispose]());
71
+ return store;
72
+ });
73
+ injector.bind(CrossNodeBus, defineInProcessCrossNodeBus());
74
+ injector.bind(TaskRunner, defineRedisTaskRunner({
75
+ client,
76
+ serviceName: 'integration',
77
+ topicPrefix: options.prefix,
78
+ visibilityTimeoutMs: options.visibilityTimeoutMs ?? 60_000,
79
+ blockTimeoutMs: 50,
80
+ retryBackoffMs: 50,
81
+ schedulerIntervalMs: options.schedulerIntervalMs ?? 50,
82
+ reconcilerIntervalMs: 200,
83
+ sweepIntervalMs: 100,
84
+ concurrencyLimits: options.concurrencyLimits,
85
+ }));
86
+ const runner = injector.get(TaskRunner);
87
+ const workers = [];
88
+ for (let i = 0; i < options.workerCount; i++) {
89
+ workers.push(runner.registerWorker({
90
+ name: `worker-${i}`,
91
+ handlers: options.handlers,
92
+ concurrency: options.workerConcurrency ?? 2,
93
+ tags: [],
94
+ compatibleVersions: {},
95
+ }));
96
+ }
97
+ return {
98
+ injector,
99
+ runner,
100
+ workers,
101
+ prefix: options.prefix,
102
+ client,
103
+ async [Symbol.asyncDispose]() {
104
+ for (const w of workers)
105
+ w[Symbol.dispose]();
106
+ await injector[Symbol.asyncDispose]();
107
+ if (client.isOpen)
108
+ await client.quit();
109
+ },
110
+ };
111
+ };
112
+ const cleanupStreams = async (prefix) => {
113
+ const client = createClient({ url: REDIS_URL });
114
+ try {
115
+ await client.connect();
116
+ const keys = await client.keys(`${prefix}*`);
117
+ if (keys.length > 0)
118
+ await client.del(keys);
119
+ }
120
+ catch {
121
+ // Redis unreachable; setup will fail loudly in a per-test path.
122
+ }
123
+ finally {
124
+ if (client.isOpen)
125
+ await client.quit();
126
+ }
127
+ };
128
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
129
+ describe('RedisTaskRunner (integration)', () => {
130
+ let prefix;
131
+ beforeEach(() => {
132
+ prefix = `rtr-${randomUUID().slice(0, 8)}/`;
133
+ });
134
+ afterEach(async () => {
135
+ await cleanupStreams(prefix);
136
+ });
137
+ it('declares persistent + delayedDispatch=true capabilities', async () => {
138
+ const env_1 = { stack: [], error: void 0, hasError: false };
139
+ try {
140
+ const harness = __addDisposableResource(env_1, await buildHarness({ prefix, workerCount: 0, handlers: [] }), true);
141
+ const caps = harness.runner.capabilities;
142
+ expect(caps.persistent).toBe(true);
143
+ expect(caps.delayedDispatch).toBe(true);
144
+ expect(caps.fleetCapEnforcement).toBe(true);
145
+ }
146
+ catch (e_1) {
147
+ env_1.error = e_1;
148
+ env_1.hasError = true;
149
+ }
150
+ finally {
151
+ const result_1 = __disposeResources(env_1);
152
+ if (result_1)
153
+ await result_1;
154
+ }
155
+ });
156
+ it('honors notBefore by parking the task in the scheduler ZSET until it is due', async () => {
157
+ const env_2 = { stack: [], error: void 0, hasError: false };
158
+ try {
159
+ const ranAt = [];
160
+ const stamper = defineTaskHandler({
161
+ type: 'stamp',
162
+ version: 1,
163
+ handler: async (ctx) => {
164
+ ranAt.push(ctx.now().getTime());
165
+ },
166
+ });
167
+ const harness = __addDisposableResource(env_2, await buildHarness({ prefix, workerCount: 1, handlers: [stamper] }), true);
168
+ const submittedAt = Date.now();
169
+ const dueAt = submittedAt + 400;
170
+ const task = await harness.runner.submit({
171
+ type: 'stamp',
172
+ payload: {},
173
+ handlerVersion: 1,
174
+ notBefore: new Date(dueAt),
175
+ });
176
+ // Task should still be 'pending' shortly after submit and the
177
+ // queue stream should be empty — payload is parked in the
178
+ // scheduler ZSET. Allow a small tolerance for clock drift.
179
+ await sleep(120);
180
+ const streamLen = await harness.client.xLen(`${prefix}tasks:queue:stamp:v1`).catch(() => 0);
181
+ expect(streamLen).toBe(0);
182
+ const schedSize = await harness.client.zCard(`${prefix}tasks:scheduler`).catch(() => 0);
183
+ expect(schedSize).toBe(1);
184
+ const completed = await runTaskToCompletion({ runner: harness.runner, taskId: task.id, timeoutMs: 5000 });
185
+ expect(completed.status).toBe('succeeded');
186
+ expect(ranAt).toHaveLength(1);
187
+ // First and only run should not have started before the due time.
188
+ expect(ranAt[0]).toBeGreaterThanOrEqual(dueAt - 50);
189
+ }
190
+ catch (e_2) {
191
+ env_2.error = e_2;
192
+ env_2.hasError = true;
193
+ }
194
+ finally {
195
+ const result_2 = __disposeResources(env_2);
196
+ if (result_2)
197
+ await result_2;
198
+ }
199
+ }, 15_000);
200
+ it('submit → claim → handler runs → terminal succeeded (happy path)', async () => {
201
+ const env_3 = { stack: [], error: void 0, hasError: false };
202
+ try {
203
+ const echo = defineTaskHandler({
204
+ type: 'echo',
205
+ version: 1,
206
+ handler: async (_ctx, payload) => ({ echoed: payload.value }),
207
+ });
208
+ const harness = __addDisposableResource(env_3, await buildHarness({ prefix, workerCount: 1, handlers: [echo] }), true);
209
+ const task = await harness.runner.submit({
210
+ type: 'echo',
211
+ payload: { value: 'hello' },
212
+ handlerVersion: 1,
213
+ });
214
+ const completed = await runTaskToCompletion({ runner: harness.runner, taskId: task.id, timeoutMs: 5000 });
215
+ expect(completed.status).toBe('succeeded');
216
+ expect(completed.result).toEqual({ echoed: 'hello' });
217
+ }
218
+ catch (e_3) {
219
+ env_3.error = e_3;
220
+ env_3.hasError = true;
221
+ }
222
+ finally {
223
+ const result_3 = __disposeResources(env_3);
224
+ if (result_3)
225
+ await result_3;
226
+ }
227
+ }, 15_000);
228
+ it('two workers do not double-execute the same task across the fleet', async () => {
229
+ const env_4 = { stack: [], error: void 0, hasError: false };
230
+ try {
231
+ const runs = new Set();
232
+ const counter = defineTaskHandler({
233
+ type: 'count-once',
234
+ version: 1,
235
+ handler: async (ctx) => {
236
+ if (runs.has(ctx.taskId)) {
237
+ throw new Error(`Task ${ctx.taskId} ran twice`);
238
+ }
239
+ runs.add(ctx.taskId);
240
+ return { ran: true };
241
+ },
242
+ });
243
+ const harness = __addDisposableResource(env_4, await buildHarness({ prefix, workerCount: 2, handlers: [counter] }), true);
244
+ const tasks = await Promise.all(Array.from({ length: 8 }, (_, i) => harness.runner.submit({ type: 'count-once', payload: { n: i }, handlerVersion: 1 })));
245
+ for (const task of tasks) {
246
+ const completed = await runTaskToCompletion({ runner: harness.runner, taskId: task.id, timeoutMs: 8000 });
247
+ expect(completed.status).toBe('succeeded');
248
+ }
249
+ expect(runs.size).toBe(8);
250
+ }
251
+ catch (e_4) {
252
+ env_4.error = e_4;
253
+ env_4.hasError = true;
254
+ }
255
+ finally {
256
+ const result_4 = __disposeResources(env_4);
257
+ if (result_4)
258
+ await result_4;
259
+ }
260
+ }, 30_000);
261
+ it('reclaims a stalled handler via XAUTOCLAIM and runs it on another consumer', async () => {
262
+ const env_5 = { stack: [], error: void 0, hasError: false };
263
+ try {
264
+ const seenAttempts = [];
265
+ const flaky = defineTaskHandler({
266
+ type: 'flaky-handler',
267
+ version: 1,
268
+ visibilityTimeoutMs: 250,
269
+ retryPolicy: { maxAttempts: 1, backoff: 'none', baseDelayMs: 0, jitter: 0 },
270
+ handler: async (ctx) => {
271
+ seenAttempts.push(ctx.attempt);
272
+ if (ctx.attempt === 1) {
273
+ // Stall until our cancellation signal fires (the runner core
274
+ // aborts the prior AC when the broker-side reclaim hands the
275
+ // task to a fresh consumer). The throw lets the runner core
276
+ // unwind cleanly and recognise the AC was replaced.
277
+ await new Promise((_, reject) => {
278
+ ctx.cancellationSignal.addEventListener('abort', () => reject(new Error('reclaimed')), { once: true });
279
+ });
280
+ }
281
+ return { ok: true };
282
+ },
283
+ });
284
+ const harness = __addDisposableResource(env_5, await buildHarness({
285
+ prefix,
286
+ workerCount: 2,
287
+ handlers: [flaky],
288
+ visibilityTimeoutMs: 250,
289
+ }), true);
290
+ const task = await harness.runner.submit({
291
+ type: 'flaky-handler',
292
+ payload: {},
293
+ handlerVersion: 1,
294
+ });
295
+ const deadline = Date.now() + 10_000;
296
+ while (Date.now() < deadline) {
297
+ const t = await harness.runner.get(task.id);
298
+ if (t?.status === 'succeeded')
299
+ break;
300
+ await sleep(100);
301
+ }
302
+ const final = await harness.runner.get(task.id);
303
+ expect(final?.status).toBe('succeeded');
304
+ expect(seenAttempts.length).toBeGreaterThanOrEqual(2);
305
+ expect(seenAttempts[0]).toBe(1);
306
+ }
307
+ catch (e_5) {
308
+ env_5.error = e_5;
309
+ env_5.hasError = true;
310
+ }
311
+ finally {
312
+ const result_5 = __disposeResources(env_5);
313
+ if (result_5)
314
+ await result_5;
315
+ }
316
+ }, 30_000);
317
+ it('draft does not enqueue; start releases to the queue', async () => {
318
+ const env_6 = { stack: [], error: void 0, hasError: false };
319
+ try {
320
+ let observed = 0;
321
+ const observe = defineTaskHandler({
322
+ type: 'observe',
323
+ version: 1,
324
+ handler: async () => {
325
+ observed += 1;
326
+ },
327
+ });
328
+ const harness = __addDisposableResource(env_6, await buildHarness({ prefix, workerCount: 1, handlers: [observe] }), true);
329
+ const drafted = await harness.runner.draft({ type: 'observe', payload: {}, handlerVersion: 1 });
330
+ expect(drafted.status).toBe('draft');
331
+ // Stream should not exist (or have zero entries) before start.
332
+ const streamKey = `${prefix}tasks:queue:observe:v1`;
333
+ const lenBefore = await harness.client.xLen(streamKey).catch(() => 0);
334
+ expect(lenBefore).toBe(0);
335
+ expect(observed).toBe(0);
336
+ await harness.runner.start(drafted.id);
337
+ const completed = await runTaskToCompletion({ runner: harness.runner, taskId: drafted.id, timeoutMs: 5000 });
338
+ expect(completed.status).toBe('succeeded');
339
+ expect(observed).toBe(1);
340
+ }
341
+ catch (e_6) {
342
+ env_6.error = e_6;
343
+ env_6.hasError = true;
344
+ }
345
+ finally {
346
+ const result_6 = __disposeResources(env_6);
347
+ if (result_6)
348
+ await result_6;
349
+ }
350
+ }, 15_000);
351
+ it('cancel aborts a running handler via the bus broadcast', async () => {
352
+ const env_7 = { stack: [], error: void 0, hasError: false };
353
+ try {
354
+ let aborted = false;
355
+ const long = defineTaskHandler({
356
+ type: 'long-running',
357
+ version: 1,
358
+ handler: async (ctx) => {
359
+ try {
360
+ await ctx.sleep(60_000);
361
+ }
362
+ catch {
363
+ aborted = true;
364
+ throw ctx.cancellationSignal.reason instanceof Error ? ctx.cancellationSignal.reason : new Error('cancelled');
365
+ }
366
+ },
367
+ });
368
+ const harness = __addDisposableResource(env_7, await buildHarness({ prefix, workerCount: 1, handlers: [long] }), true);
369
+ const task = await harness.runner.submit({ type: 'long-running', payload: {}, handlerVersion: 1 });
370
+ await sleep(300);
371
+ await harness.runner.cancel(task.id, 'integration test');
372
+ const deadline = Date.now() + 5000;
373
+ while (Date.now() < deadline) {
374
+ const t = await harness.runner.get(task.id);
375
+ if (t?.status === 'cancelled')
376
+ break;
377
+ await sleep(50);
378
+ }
379
+ const final = await harness.runner.get(task.id);
380
+ expect(final?.status).toBe('cancelled');
381
+ expect(aborted).toBe(true);
382
+ }
383
+ catch (e_7) {
384
+ env_7.error = e_7;
385
+ env_7.hasError = true;
386
+ }
387
+ finally {
388
+ const result_7 = __disposeResources(env_7);
389
+ if (result_7)
390
+ await result_7;
391
+ }
392
+ }, 15_000);
393
+ it('enforces a fleet-wide concurrency cap across two workers', async () => {
394
+ const env_8 = { stack: [], error: void 0, hasError: false };
395
+ try {
396
+ let live = 0;
397
+ let maxLive = 0;
398
+ const capped = defineTaskHandler({
399
+ type: 'capped',
400
+ version: 1,
401
+ handler: async (ctx) => {
402
+ live += 1;
403
+ maxLive = Math.max(maxLive, live);
404
+ try {
405
+ await ctx.sleep(300);
406
+ }
407
+ finally {
408
+ live -= 1;
409
+ }
410
+ },
411
+ });
412
+ // 2 workers × concurrency 2 = 4 fleet slots, but the cap is 2 — so at
413
+ // most two `capped` handlers may run at once across the whole fleet.
414
+ const harness = __addDisposableResource(env_8, await buildHarness({
415
+ prefix,
416
+ workerCount: 2,
417
+ workerConcurrency: 2,
418
+ handlers: [capped],
419
+ concurrencyLimits: { capped: 2 },
420
+ }), true);
421
+ const tasks = await Promise.all(Array.from({ length: 6 }, () => harness.runner.submit({ type: 'capped', payload: {}, handlerVersion: 1 })));
422
+ for (const task of tasks) {
423
+ const completed = await runTaskToCompletion({ runner: harness.runner, taskId: task.id, timeoutMs: 15_000 });
424
+ expect(completed.status).toBe('succeeded');
425
+ }
426
+ // Cap holds (never exceeded) and is actually exercised (parallelism
427
+ // reached the cap rather than serializing).
428
+ expect(maxLive).toBeLessThanOrEqual(2);
429
+ expect(maxLive).toBe(2);
430
+ }
431
+ catch (e_8) {
432
+ env_8.error = e_8;
433
+ env_8.hasError = true;
434
+ }
435
+ finally {
436
+ const result_8 = __disposeResources(env_8);
437
+ if (result_8)
438
+ await result_8;
439
+ }
440
+ }, 30_000);
441
+ it('drains a worker: in-flight task finishes, no new tasks are claimed', async () => {
442
+ const env_9 = { stack: [], error: void 0, hasError: false };
443
+ try {
444
+ let started = 0;
445
+ let finished = 0;
446
+ let resolveStarted = () => { };
447
+ const startedSignal = new Promise((resolve) => {
448
+ resolveStarted = resolve;
449
+ });
450
+ const slow = defineTaskHandler({
451
+ type: 'drainable',
452
+ version: 1,
453
+ handler: async (ctx) => {
454
+ started += 1;
455
+ resolveStarted();
456
+ await ctx.sleep(600);
457
+ finished += 1;
458
+ },
459
+ });
460
+ const harness = __addDisposableResource(env_9, await buildHarness({
461
+ prefix,
462
+ workerCount: 1,
463
+ workerConcurrency: 1,
464
+ handlers: [slow],
465
+ }), true);
466
+ const inFlight = await harness.runner.submit({ type: 'drainable', payload: {}, handlerVersion: 1 });
467
+ await startedSignal;
468
+ // Begin draining while the first task is mid-handler, then submit a
469
+ // second task that the draining worker must not pick up.
470
+ const drainPromise = harness.workers[0]?.drain({ timeoutMs: 5000 }) ?? Promise.resolve();
471
+ const queued = await harness.runner.submit({ type: 'drainable', payload: {}, handlerVersion: 1 });
472
+ await drainPromise;
473
+ // The in-flight task completed despite the drain.
474
+ const inFlightFinal = await harness.runner.get(inFlight.id);
475
+ expect(inFlightFinal?.status).toBe('succeeded');
476
+ expect(finished).toBe(1);
477
+ // The second task was never claimed by the drained worker.
478
+ await sleep(400);
479
+ const queuedFinal = await harness.runner.get(queued.id);
480
+ expect(queuedFinal?.status).toBe('pending');
481
+ expect(started).toBe(1);
482
+ }
483
+ catch (e_9) {
484
+ env_9.error = e_9;
485
+ env_9.hasError = true;
486
+ }
487
+ finally {
488
+ const result_9 = __disposeResources(env_9);
489
+ if (result_9)
490
+ await result_9;
491
+ }
492
+ }, 20_000);
493
+ it('reaps a child spawned-without-await when the parent succeeds (orphan reaping)', async () => {
494
+ const env_10 = { stack: [], error: void 0, hasError: false };
495
+ try {
496
+ const blocker = defineTaskHandler({
497
+ type: 'reap-blocker',
498
+ version: 1,
499
+ handler: async (ctx) => {
500
+ await ctx.sleep(60_000);
501
+ },
502
+ });
503
+ const spawnAndForget = defineTaskHandler({
504
+ type: 'reap-parent',
505
+ version: 1,
506
+ handler: async (ctx) => {
507
+ await ctx.spawnChild('reap-blocker', {});
508
+ return { done: true };
509
+ },
510
+ });
511
+ const harness = __addDisposableResource(env_10, await buildHarness({
512
+ prefix,
513
+ workerCount: 1,
514
+ workerConcurrency: 2,
515
+ handlers: [blocker, spawnAndForget],
516
+ }), true);
517
+ const task = await harness.runner.submit({ type: 'reap-parent', payload: {}, handlerVersion: 1 });
518
+ const parent = await runTaskToCompletion({ runner: harness.runner, taskId: task.id, timeoutMs: 8000 });
519
+ expect(parent.status).toBe('succeeded');
520
+ const childId = parent.childTaskIds[0];
521
+ expect(childId).toBeTruthy();
522
+ const child = await runTaskToCompletion({ runner: harness.runner, taskId: childId, timeoutMs: 8000 });
523
+ expect(child.status).toBe('cancelled');
524
+ }
525
+ catch (e_10) {
526
+ env_10.error = e_10;
527
+ env_10.hasError = true;
528
+ }
529
+ finally {
530
+ const result_10 = __disposeResources(env_10);
531
+ if (result_10)
532
+ await result_10;
533
+ }
534
+ }, 30_000);
535
+ });
536
+ //# sourceMappingURL=redis-task-runner.integration.spec.js.map