@nwire/queue 0.8.0 → 0.8.17

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,8 @@
1
+ /**
2
+ * Queue worker cancellation — `worker.stop()` flips an internal
3
+ * AbortController so in-flight handlers observing `ctx.signal` can
4
+ * bail before drain finishes. The combine path covers a transport
5
+ * that supplies its own per-job signal (BullMQ lock expiry, etc.).
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=cancellation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cancellation.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Queue worker cancellation — `worker.stop()` flips an internal
3
+ * AbortController so in-flight handlers observing `ctx.signal` can
4
+ * bail before drain finishes. The combine path covers a transport
5
+ * that supplies its own per-job signal (BullMQ lock expiry, etc.).
6
+ */
7
+ import { describe, it, expect } from "vitest";
8
+ import { z } from "zod";
9
+ import { defineEvent } from "@nwire/messages";
10
+ import * as forge from "@nwire/forge";
11
+ import { seedEnvelope } from "@nwire/envelope";
12
+ import { InMemoryQueueTransport, createQueueWorker } from "../queue.js";
13
+ const { defineAction, defineActor, defineHandler, defineModule, eventFactory, createApp } = forge;
14
+ const SlowedEventDef = defineEvent({
15
+ name: "demo.slowed",
16
+ schema: z.object({ id: z.string() }),
17
+ });
18
+ const Slowed = eventFactory(SlowedEventDef);
19
+ const SlowActor = defineActor("slow", {
20
+ schema: z.object({ id: z.string(), count: z.number().optional() }),
21
+ key: "id",
22
+ initial: "idle",
23
+ states: {
24
+ idle: {
25
+ on: {
26
+ [SlowedEventDef.name]: {
27
+ assign: (ctx, event) => {
28
+ const c = ctx;
29
+ const e = event;
30
+ return { id: e.id, count: (c.count ?? 0) + 1 };
31
+ },
32
+ },
33
+ },
34
+ },
35
+ },
36
+ });
37
+ const slow = defineAction({
38
+ name: "demo.slow",
39
+ schema: z.object({ id: z.string(), ms: z.number() }),
40
+ });
41
+ describe("queue worker — cancellation via worker.stop()", () => {
42
+ it("aborts ctx.signal of in-flight handlers when worker.stop() is called", async () => {
43
+ let observedAbort = false;
44
+ let handlerStarted = false;
45
+ let resolveStarted = () => { };
46
+ const started = new Promise((r) => {
47
+ resolveStarted = r;
48
+ });
49
+ const slowHandler = defineHandler(slow, async (input, ctx) => {
50
+ handlerStarted = true;
51
+ resolveStarted();
52
+ await new Promise((resolve, reject) => {
53
+ const t = setTimeout(resolve, input.ms);
54
+ ctx.signal.addEventListener("abort", () => {
55
+ clearTimeout(t);
56
+ observedAbort = true;
57
+ reject(new Error("aborted"));
58
+ }, { once: true });
59
+ });
60
+ return Slowed({ id: input.id });
61
+ });
62
+ const demoModule = defineModule("demo", {
63
+ actions: [slow],
64
+ actors: [SlowActor],
65
+ handlers: [slowHandler],
66
+ events: [SlowedEventDef],
67
+ });
68
+ const app = createApp({ modules: [demoModule] });
69
+ const transport = new InMemoryQueueTransport();
70
+ const worker = createQueueWorker(app, transport, {
71
+ subscribe: [{ queue: "demo.slow", action: slow }],
72
+ });
73
+ await app.start();
74
+ await worker.start();
75
+ // Fire-and-forget the enqueue — the in-memory transport awaits its
76
+ // consumer, but the consumer awaits the handler which awaits the
77
+ // signal. We don't await this; we'll abort it via worker.stop().
78
+ const enqueued = transport
79
+ .enqueue("demo.slow", {
80
+ input: { id: "s-1", ms: 5000 },
81
+ envelope: seedEnvelope({}),
82
+ })
83
+ .catch(() => undefined);
84
+ await started;
85
+ expect(handlerStarted).toBe(true);
86
+ await worker.stop();
87
+ await enqueued;
88
+ expect(observedAbort).toBe(true);
89
+ });
90
+ it("combines worker-stop signal with a transport-supplied job signal (BullMQ shape)", async () => {
91
+ // Hand-rolled transport that supplies its own per-job signal — this
92
+ // mirrors what a BullMQ adapter does when wiring the job lock.
93
+ let observedAbort = false;
94
+ let resolveStarted = () => { };
95
+ const started = new Promise((r) => {
96
+ resolveStarted = r;
97
+ });
98
+ const jobController = new AbortController();
99
+ const fakeTransport = {
100
+ enqueue: async () => undefined,
101
+ stop: async () => undefined,
102
+ subscribe(_queue, consumer) {
103
+ // Simulate transport delivering one message with its own signal.
104
+ const msg = {
105
+ queue: "demo.slow",
106
+ input: { id: "j-1", ms: 5000 },
107
+ envelope: seedEnvelope({}),
108
+ };
109
+ // Don't await — we want to abort it mid-flight via jobController.
110
+ // The error is swallowed by the transport in real life; we mirror that.
111
+ void consumer(msg, jobController.signal).catch(() => undefined);
112
+ },
113
+ };
114
+ const slowHandler = defineHandler(slow, async (input, ctx) => {
115
+ resolveStarted();
116
+ await new Promise((resolve, reject) => {
117
+ const t = setTimeout(resolve, input.ms);
118
+ ctx.signal.addEventListener("abort", () => {
119
+ clearTimeout(t);
120
+ observedAbort = true;
121
+ reject(new Error("aborted"));
122
+ }, { once: true });
123
+ });
124
+ return Slowed({ id: input.id });
125
+ });
126
+ const demoModule = defineModule("demo", {
127
+ actions: [slow],
128
+ actors: [SlowActor],
129
+ handlers: [slowHandler],
130
+ events: [SlowedEventDef],
131
+ });
132
+ const app = createApp({ modules: [demoModule] });
133
+ const worker = createQueueWorker(app, fakeTransport, {
134
+ subscribe: [{ queue: "demo.slow", action: slow }],
135
+ });
136
+ await app.start();
137
+ await worker.start();
138
+ await started;
139
+ // Fire the job-side signal (lock expired / job removed). Worker is
140
+ // still running.
141
+ jobController.abort();
142
+ await new Promise((r) => setTimeout(r, 30));
143
+ expect(observedAbort).toBe(true);
144
+ await worker.stop();
145
+ });
146
+ });
147
+ //# sourceMappingURL=cancellation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellation.test.js","sourceRoot":"","sources":["../../src/__tests__/cancellation.test.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ import { z } from "zod";
10
10
  import { defineEvent } from "@nwire/messages";
11
11
  import * as forge from "@nwire/forge";
12
12
  import { seedEnvelope } from "@nwire/envelope";
13
- import { InMemoryQueueTransport, createQueueWorker, subscription } from "../queue";
13
+ import { InMemoryQueueTransport, createQueueWorker, subscription } from "../queue.js";
14
14
  const { defineAction, defineActor, defineHandler, defineModule, eventFactory, createApp } = forge;
15
15
  const PingedEventDef = defineEvent({
16
16
  name: "demo.pinged",
@@ -30,7 +30,23 @@ export interface QueueMessage<TInput = unknown> {
30
30
  /** Stable id for at-least-once dedup (idempotency). Optional. */
31
31
  readonly messageId?: string;
32
32
  }
33
- export type QueueConsumer<TInput = unknown> = (msg: QueueMessage<TInput>) => Promise<void>;
33
+ /**
34
+ * A consumer receives a message plus an optional cancellation signal.
35
+ *
36
+ * Transports may pass a `signal` derived from their own semantics:
37
+ *
38
+ * - **BullMQ** — the per-job lock expiry. The worker aborts the signal
39
+ * when the lock would expire, letting in-flight dispatches bail
40
+ * before the same job is handed to another worker.
41
+ * - **Worker shutdown** — `createQueueWorker.stop()` aborts an
42
+ * internal controller so in-flight jobs see the signal flip and can
43
+ * short-circuit retries before the worker drains.
44
+ *
45
+ * Consumers are not required to observe the signal — handlers that do
46
+ * `ctx.signal.throwIfAborted()` (or pass signal into `runtime.dispatch`)
47
+ * benefit; legacy handlers continue to run to completion.
48
+ */
49
+ export type QueueConsumer<TInput = unknown> = (msg: QueueMessage<TInput>, signal?: AbortSignal) => Promise<void>;
34
50
  export interface QueueTransport {
35
51
  enqueue<TInput>(queue: string, message: Omit<QueueMessage<TInput>, "queue">): Promise<void>;
36
52
  subscribe<TInput>(queue: string, consumer: QueueConsumer<TInput>): void;
@@ -1 +1 @@
1
- {"version":3,"file":"queue-transport.d.ts","sourceRoot":"","sources":["../src/queue-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,WAAW,YAAY,CAAC,MAAM,GAAG,OAAO;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,aAAa,CAAC,MAAM,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3F,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACxE,+CAA+C;IAC/C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;;;;;GAMG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,OAAO,CAAS;IAElB,OAAO,CAAC,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,GAC3C,OAAO,CAAC,IAAI,CAAC;IAiChB,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI;IAMjE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,gEAAgE;IAC1D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
1
+ {"version":3,"file":"queue-transport.d.ts","sourceRoot":"","sources":["../src/queue-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,WAAW,YAAY,CAAC,MAAM,GAAG,OAAO;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,aAAa,CAAC,MAAM,GAAG,OAAO,IAAI,CAC5C,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC,EACzB,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACxE,+CAA+C;IAC/C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;;;;;GAMG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,OAAO,CAAS;IAElB,OAAO,CAAC,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,GAC3C,OAAO,CAAC,IAAI,CAAC;IAiChB,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI;IAMjE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,gEAAgE;IAC1D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"queue-transport.js","sourceRoot":"","sources":["../src/queue-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AA0BH;;;;;;GAMG;AACH,MAAM,OAAO,sBAAsB;IAChB,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;IACjD,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpC,QAAQ,GAAoB,EAAE,CAAC;IACxC,OAAO,GAAG,KAAK,CAAC;IAExB,KAAK,CAAC,OAAO,CACX,KAAa,EACb,OAA4C;QAE5C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,IAAI,GAAyB,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC;QACzD,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE;YACrB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACpD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC3C,sDAAsD;oBACtD,oCAAoC;oBACpC,sCAAsC;oBACtC,OAAO,CAAC,KAAK,CAAC,wCAAwC,KAAK,UAAU,EAAE,GAAG,CAAC,CAAC;gBAC9E,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC5B,MAAM,OAAO,CAAC;YAChB,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC3B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5B,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACjB,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU;gBAAE,KAAK,CAAC,KAAK,EAAE,CAAC;YACrD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,8DAA8D;YAC9D,8BAA8B;YAC9B,MAAM,GAAG,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,SAAS,CAAS,KAAa,EAAE,QAA+B;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,QAAyB,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO;YAAE,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,CAAC;CACF"}
1
+ {"version":3,"file":"queue-transport.js","sourceRoot":"","sources":["../src/queue-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AA6CH;;;;;;GAMG;AACH,MAAM,OAAO,sBAAsB;IAChB,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;IACjD,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpC,QAAQ,GAAoB,EAAE,CAAC;IACxC,OAAO,GAAG,KAAK,CAAC;IAExB,KAAK,CAAC,OAAO,CACX,KAAa,EACb,OAA4C;QAE5C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,IAAI,GAAyB,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC;QACzD,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE;YACrB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACpD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC3C,sDAAsD;oBACtD,oCAAoC;oBACpC,sCAAsC;oBACtC,OAAO,CAAC,KAAK,CAAC,wCAAwC,KAAK,UAAU,EAAE,GAAG,CAAC,CAAC;gBAC9E,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC5B,MAAM,OAAO,CAAC;YAChB,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC3B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5B,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACjB,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU;gBAAE,KAAK,CAAC,KAAK,EAAE,CAAC;YACrD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,8DAA8D;YAC9D,8BAA8B;YAC9B,MAAM,GAAG,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,SAAS,CAAS,KAAa,EAAE,QAA+B;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,QAAyB,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO;YAAE,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,CAAC;CACF"}
@@ -25,7 +25,7 @@
25
25
  * The framework decides where dispatch happens; the handler is unchanged.
26
26
  */
27
27
  import type * as forge from "@nwire/forge";
28
- import type { QueueTransport } from "./queue-transport";
28
+ import type { QueueTransport } from "./queue-transport.js";
29
29
  type App = forge.App;
30
30
  type ActionDefinition = forge.ActionDefinition;
31
31
  export interface QueueSubscription {
@@ -1 +1 @@
1
- {"version":3,"file":"queue-worker.d.ts","sourceRoot":"","sources":["../src/queue-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,mBAAmB,CAAC;AAEtE,KAAK,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;AACrB,KAAK,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yFAAyF;IACzF,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAAC;CAC1C;AAED,uEAAuE;AACvE,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,uBAAuB,CAAC;CAC/C;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,uBAAuB,CAa1B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAClD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB;;;;OAIG;IACH,iBAAiB,IAAI,aAAa,CAAC;QACjC,QAAQ,CAAC,KAAK,EAAG,MAAM,CAAC;QACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC,CAAC;CACJ;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,wBAAwB,GAChC,WAAW,CA0Bb"}
1
+ {"version":3,"file":"queue-worker.d.ts","sourceRoot":"","sources":["../src/queue-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,mBAAmB,CAAC;AAEtE,KAAK,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;AACrB,KAAK,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yFAAyF;IACzF,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAAC;CAC1C;AAED,uEAAuE;AACvE,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,uBAAuB,CAAC;CAC/C;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,uBAAuB,CAa1B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAClD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB;;;;OAIG;IACH,iBAAiB,IAAI,aAAa,CAAC;QACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC,CAAC;CACJ;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,wBAAwB,GAChC,WAAW,CAyCb"}
@@ -48,6 +48,12 @@ export function subscription(opts) {
48
48
  }
49
49
  export function createQueueWorker(app, transport, options) {
50
50
  let started = false;
51
+ // Worker-level cancellation: stop() flips this so any in-flight
52
+ // dispatch observing `ctx.signal` can bail before drain finishes.
53
+ // Per-job cancellation (e.g. BullMQ lock expiry) is layered ON TOP
54
+ // by chaining the transport's optional signal — that's the
55
+ // `combined` controller per message below.
56
+ const workerController = new AbortController();
51
57
  return {
52
58
  app,
53
59
  transport,
@@ -56,12 +62,18 @@ export function createQueueWorker(app, transport, options) {
56
62
  return;
57
63
  started = true;
58
64
  for (const subscription of options.subscribe) {
59
- transport.subscribe(subscription.queue, async (msg) => {
60
- await app.runtime.dispatch(subscription.action, msg.input, msg.envelope);
65
+ transport.subscribe(subscription.queue, async (msg, jobSignal) => {
66
+ // Combine worker-stop + per-job signals so the handler
67
+ // sees an abort if EITHER source fires.
68
+ const combined = combineSignals(workerController.signal, jobSignal);
69
+ await app.runtime.dispatch(subscription.action, msg.input, msg.envelope, {
70
+ signal: combined,
71
+ });
61
72
  });
62
73
  }
63
74
  },
64
75
  async stop() {
76
+ workerController.abort();
65
77
  await transport.stop();
66
78
  },
67
79
  listSubscriptions() {
@@ -73,4 +85,26 @@ export function createQueueWorker(app, transport, options) {
73
85
  },
74
86
  };
75
87
  }
88
+ /**
89
+ * Combine two AbortSignals into one that fires if either source fires.
90
+ *
91
+ * Uses `AbortSignal.any` when available (Node 20.3+ / 22+). Falls back
92
+ * to a manual controller for older runtimes — kept defensively because
93
+ * publishing as a library means we don't control the consumer's Node
94
+ * version.
95
+ */
96
+ function combineSignals(a, b) {
97
+ if (!b)
98
+ return a;
99
+ if (typeof AbortSignal.any === "function") {
100
+ return AbortSignal.any([a, b]);
101
+ }
102
+ const controller = new AbortController();
103
+ const onAbort = () => controller.abort();
104
+ if (a.aborted || b.aborted)
105
+ controller.abort();
106
+ a.addEventListener("abort", onAbort, { once: true });
107
+ b.addEventListener("abort", onAbort, { once: true });
108
+ return controller.signal;
109
+ }
76
110
  //# sourceMappingURL=queue-worker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"queue-worker.js","sourceRoot":"","sources":["../src/queue-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAiCH;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,IAI5B;IACC,MAAM,GAAG,GAAG;QACV,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnC,CAAC;IAC7B,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE;QACjC,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAChE,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAuBD,MAAM,UAAU,iBAAiB,CAC/B,GAAQ,EACR,SAAyB,EACzB,OAAiC;IAEjC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,OAAO;QACL,GAAG;QACH,SAAS;QACT,KAAK,CAAC,KAAK;YACT,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,MAAM,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC7C,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,GAAiB,EAAE,EAAE;oBAClE,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC3E,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI;YACR,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;QACD,iBAAiB;YACf,OAAO,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnC,KAAK,EAAG,CAAC,CAAC,KAAK;gBACf,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;gBACrB,MAAM,EAAE,CAAC,CAAC,MAAM;aACjB,CAAC,CAAC,CAAC;QACN,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"queue-worker.js","sourceRoot":"","sources":["../src/queue-worker.ts"],"names":[],"mappings":"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"}
package/dist/queue.d.ts CHANGED
@@ -8,6 +8,6 @@
8
8
  * Production deployments use a persistent adapter like `@nwire/queue-bullmq`
9
9
  * (Redis) or `@nwire/queue-sqs` (AWS). Same interface; swap by config.
10
10
  */
11
- export { InMemoryQueueTransport, type QueueTransport, type QueueMessage, type QueueConsumer, } from "./queue-transport";
12
- export { createQueueWorker, subscription, type QueueWorker, type QueueSubscription, type FluentQueueSubscription, type CreateQueueWorkerOptions, } from "./queue-worker";
11
+ export { InMemoryQueueTransport, type QueueTransport, type QueueMessage, type QueueConsumer, } from "./queue-transport.js";
12
+ export { createQueueWorker, subscription, type QueueWorker, type QueueSubscription, type FluentQueueSubscription, type CreateQueueWorkerOptions, } from "./queue-worker.js";
13
13
  //# sourceMappingURL=queue.d.ts.map
package/dist/queue.js CHANGED
@@ -8,6 +8,6 @@
8
8
  * Production deployments use a persistent adapter like `@nwire/queue-bullmq`
9
9
  * (Redis) or `@nwire/queue-sqs` (AWS). Same interface; swap by config.
10
10
  */
11
- export { InMemoryQueueTransport, } from "./queue-transport";
12
- export { createQueueWorker, subscription, } from "./queue-worker";
11
+ export { InMemoryQueueTransport, } from "./queue-transport.js";
12
+ export { createQueueWorker, subscription, } from "./queue-worker.js";
13
13
  //# sourceMappingURL=queue.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nwire/queue",
3
- "version": "0.8.0",
3
+ "version": "0.8.17",
4
4
  "description": "Nwire — queue transport contract + InMemory default + createQueueWorker. Production adapters land as @nwire/queue-bullmq, @nwire/queue-sqs, @nwire/queue-pgboss.",
5
5
  "keywords": [
6
6
  "bus",
@@ -28,18 +28,18 @@
28
28
  "access": "public"
29
29
  },
30
30
  "dependencies": {
31
- "@nwire/envelope": "0.8.0",
32
- "@nwire/forge": "0.8.0"
31
+ "@nwire/envelope": "0.8.17",
32
+ "@nwire/forge": "0.8.17"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/node": "^22.19.9",
36
36
  "typescript": "^5.9.3",
37
37
  "vitest": "^4.0.18",
38
38
  "zod": "^4.0.0",
39
- "@nwire/messages": "0.8.0"
39
+ "@nwire/messages": "0.8.17"
40
40
  },
41
41
  "scripts": {
42
- "build": "tsc",
42
+ "build": "tsc && node ../../scripts/fix-dist-extensions.mjs dist",
43
43
  "dev": "tsc --watch",
44
44
  "typecheck": "tsc --noEmit"
45
45
  }