@moltzap/client 2026.508.0 → 2026.508.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/channel-core.d.ts +118 -2
  2. package/dist/channel-core.d.ts.map +1 -1
  3. package/dist/channel-core.js +195 -27
  4. package/dist/channel-core.js.map +1 -1
  5. package/dist/channel-core.test.js +117 -26
  6. package/dist/channel-core.test.js.map +1 -1
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/runtime/frame.d.ts +6 -10
  11. package/dist/runtime/frame.d.ts.map +1 -1
  12. package/dist/runtime/frame.js +4 -28
  13. package/dist/runtime/frame.js.map +1 -1
  14. package/dist/service.d.ts +18 -3
  15. package/dist/service.d.ts.map +1 -1
  16. package/dist/service.js +28 -50
  17. package/dist/service.js.map +1 -1
  18. package/dist/service.test.js +27 -25
  19. package/dist/service.test.js.map +1 -1
  20. package/dist/test-utils/channel-service-fixture.d.ts +2 -1
  21. package/dist/test-utils/channel-service-fixture.d.ts.map +1 -1
  22. package/dist/test-utils/channel-service-fixture.js +8 -0
  23. package/dist/test-utils/channel-service-fixture.js.map +1 -1
  24. package/dist/ws-client.d.ts +5 -26
  25. package/dist/ws-client.d.ts.map +1 -1
  26. package/dist/ws-client.js +71 -97
  27. package/dist/ws-client.js.map +1 -1
  28. package/dist/ws-client.test.js +40 -12
  29. package/dist/ws-client.test.js.map +1 -1
  30. package/package.json +3 -3
  31. package/dist/internal/__tests__/app-callback-partition-key.test.d.ts +0 -2
  32. package/dist/internal/__tests__/app-callback-partition-key.test.d.ts.map +0 -1
  33. package/dist/internal/__tests__/app-callback-partition-key.test.js +0 -20
  34. package/dist/internal/__tests__/app-callback-partition-key.test.js.map +0 -1
  35. package/dist/internal/__tests__/app-callback-partition-worker.test.d.ts +0 -2
  36. package/dist/internal/__tests__/app-callback-partition-worker.test.d.ts.map +0 -1
  37. package/dist/internal/__tests__/app-callback-partition-worker.test.js +0 -265
  38. package/dist/internal/__tests__/app-callback-partition-worker.test.js.map +0 -1
  39. package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.d.ts +0 -2
  40. package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.d.ts.map +0 -1
  41. package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.js +0 -228
  42. package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.js.map +0 -1
  43. package/dist/internal/__tests__/app-callback-test-requests.d.ts +0 -22
  44. package/dist/internal/__tests__/app-callback-test-requests.d.ts.map +0 -1
  45. package/dist/internal/__tests__/app-callback-test-requests.js +0 -45
  46. package/dist/internal/__tests__/app-callback-test-requests.js.map +0 -1
  47. package/dist/internal/app-callback-dispatcher-errors.d.ts +0 -50
  48. package/dist/internal/app-callback-dispatcher-errors.d.ts.map +0 -1
  49. package/dist/internal/app-callback-dispatcher-errors.js +0 -36
  50. package/dist/internal/app-callback-dispatcher-errors.js.map +0 -1
  51. package/dist/internal/app-callback-partition-key.d.ts +0 -58
  52. package/dist/internal/app-callback-partition-key.d.ts.map +0 -1
  53. package/dist/internal/app-callback-partition-key.js +0 -80
  54. package/dist/internal/app-callback-partition-key.js.map +0 -1
  55. package/dist/internal/app-callback-partition-worker.d.ts +0 -160
  56. package/dist/internal/app-callback-partition-worker.d.ts.map +0 -1
  57. package/dist/internal/app-callback-partition-worker.js +0 -141
  58. package/dist/internal/app-callback-partition-worker.js.map +0 -1
  59. package/dist/internal/app-callback-partitioned-dispatcher.d.ts +0 -180
  60. package/dist/internal/app-callback-partitioned-dispatcher.d.ts.map +0 -1
  61. package/dist/internal/app-callback-partitioned-dispatcher.js +0 -282
  62. package/dist/internal/app-callback-partitioned-dispatcher.js.map +0 -1
@@ -1,265 +0,0 @@
1
- /**
2
- * Unit tests for the per-partition worker.
3
- *
4
- * Spec: moltzap#356 §8 (test plan, file 2).
5
- *
6
- * Tests run the worker in isolation against a synthetic handler. Drive
7
- * via `Effect.runPromise` with a dedicated `Scope`; assert ordering,
8
- * non-blocking offer, idle-since transitions, and scope-anchored
9
- * teardown.
10
- */
11
- import { describe, it, expect } from "vitest";
12
- import { Deferred, Effect, Exit, Fiber, MutableRef, Ref, Scope } from "effect";
13
- import { makePartitionWorker } from "../app-callback-partition-worker.js";
14
- import { extractPartitionKey, } from "../app-callback-partition-key.js";
15
- import { authorizeDispatch } from "./app-callback-test-requests.js";
16
- const KEY = extractPartitionKey(authorizeDispatch("rpc-key"));
17
- const REQ = authorizeDispatch;
18
- /**
19
- * Drive a scoped Effect under a fresh Scope. Returns the Effect's
20
- * value plus the Scope so the caller can close it explicitly to
21
- * exercise scope-anchored teardown.
22
- */
23
- function withScope(body) {
24
- return Effect.gen(function* () {
25
- const scope = yield* Scope.make();
26
- const result = yield* body(scope);
27
- yield* Scope.close(scope, Exit.void);
28
- return result;
29
- });
30
- }
31
- /**
32
- * Spin until the worker's queue is drained (size === 0). Used to
33
- * synchronize with the worker fiber having actually taken an item
34
- * off the queue and started running its handler.
35
- */
36
- function waitUntilQueueDrained(worker) {
37
- return Effect.gen(function* () {
38
- for (let i = 0; i < 1000; i++) {
39
- const size = yield* worker.queueSize;
40
- if (size === 0)
41
- return;
42
- yield* Effect.yieldNow();
43
- }
44
- });
45
- }
46
- describe("makePartitionWorker — ordering", () => {
47
- it("preserves FIFO order across N offers to the same worker", async () => {
48
- const result = await Effect.runPromise(withScope((scope) => Effect.gen(function* () {
49
- const seen = yield* Ref.make([]);
50
- const allDone = yield* Deferred.make();
51
- const handle = (req) => Effect.gen(function* () {
52
- yield* Ref.update(seen, (xs) => [...xs, req.id]);
53
- const xs = yield* Ref.get(seen);
54
- if (xs.length === 5) {
55
- yield* Deferred.succeed(allDone, undefined);
56
- }
57
- });
58
- const worker = yield* makePartitionWorker({
59
- key: KEY,
60
- capacity: 16,
61
- handle,
62
- scope,
63
- });
64
- for (let i = 0; i < 5; i++) {
65
- yield* worker.offer(REQ(`rpc-${i}`));
66
- }
67
- yield* Deferred.await(allDone);
68
- return yield* Ref.get(seen);
69
- })));
70
- expect(result).toEqual(["rpc-0", "rpc-1", "rpc-2", "rpc-3", "rpc-4"]);
71
- });
72
- it("handler defects are caught and logged; subsequent offers still run", async () => {
73
- const result = await Effect.runPromise(withScope((scope) => Effect.gen(function* () {
74
- const seen = yield* Ref.make([]);
75
- const second = yield* Deferred.make();
76
- const handle = (req) => Effect.gen(function* () {
77
- yield* Ref.update(seen, (xs) => [...xs, req.id]);
78
- if (req.id === "rpc-bad") {
79
- return yield* Effect.die("synthetic defect");
80
- }
81
- if (req.id === "rpc-good") {
82
- yield* Deferred.succeed(second, undefined);
83
- }
84
- });
85
- const worker = yield* makePartitionWorker({
86
- key: KEY,
87
- capacity: 16,
88
- handle,
89
- logger: { info: () => { }, warn: () => { }, error: () => { } },
90
- scope,
91
- });
92
- yield* worker.offer(REQ("rpc-bad"));
93
- yield* worker.offer(REQ("rpc-good"));
94
- yield* Deferred.await(second);
95
- return yield* Ref.get(seen);
96
- })));
97
- expect(result).toEqual(["rpc-bad", "rpc-good"]);
98
- });
99
- });
100
- describe("makePartitionWorker — backpressure", () => {
101
- it("offer to full bounded queue fails-fast with PartitionQueueFullError (does NOT suspend)", async () => {
102
- const verdict = await Effect.runPromise(withScope((scope) => Effect.gen(function* () {
103
- // Park every handler on a Deferred so the queue fills.
104
- const release = yield* Deferred.make();
105
- const handle = () => Deferred.await(release);
106
- const capacity = 2;
107
- const worker = yield* makePartitionWorker({
108
- key: KEY,
109
- capacity,
110
- handle,
111
- scope,
112
- });
113
- // First offer goes to the handler; yield so the worker
114
- // fiber consumes it and parks on `release`. Then the queue
115
- // is empty. Fill it: capacity offers land, the (capacity+1)th
116
- // must fail fast.
117
- yield* worker.offer(REQ("rpc-1"));
118
- // Spin until the worker fiber has drained rpc-1 off the
119
- // queue and parked the handler on `release`. We assert on
120
- // queueSize === 0 (not idleSince) because `worker.offer`
121
- // flips idleSince to Busy synchronously, before the worker
122
- // fiber takes the item.
123
- yield* waitUntilQueueDrained(worker);
124
- yield* worker.offer(REQ("rpc-2"));
125
- yield* worker.offer(REQ("rpc-3"));
126
- const overflow = yield* Effect.either(worker.offer(REQ("rpc-4")));
127
- yield* Deferred.succeed(release, undefined);
128
- return overflow;
129
- })));
130
- expect(verdict._tag).toBe("Left");
131
- if (verdict._tag === "Left") {
132
- expect(verdict.left._tag).toBe("PartitionQueueFullError");
133
- }
134
- });
135
- it("offer after Scope close fails with PartitionQueueFullError (queue shut down)", async () => {
136
- const verdict = await Effect.runPromise(Effect.gen(function* () {
137
- const scope = yield* Scope.make();
138
- const handle = () => Effect.void;
139
- const worker = yield* makePartitionWorker({
140
- key: KEY,
141
- capacity: 4,
142
- handle,
143
- scope,
144
- });
145
- yield* Scope.close(scope, Exit.void);
146
- // Give the finalizer a chance to run.
147
- yield* Effect.yieldNow();
148
- return yield* Effect.either(worker.offer(REQ("rpc-late")));
149
- }));
150
- expect(verdict._tag).toBe("Left");
151
- if (verdict._tag === "Left") {
152
- expect(verdict.left._tag).toBe("PartitionQueueFullError");
153
- }
154
- });
155
- });
156
- describe("makePartitionWorker — idle-since clock", () => {
157
- it("idleSince is Busy while a request is queued or in-flight", async () => {
158
- const verdict = await Effect.runPromise(withScope((scope) => Effect.gen(function* () {
159
- const release = yield* Deferred.make();
160
- const handle = () => Deferred.await(release);
161
- const worker = yield* makePartitionWorker({
162
- key: KEY,
163
- capacity: 4,
164
- handle,
165
- scope,
166
- });
167
- yield* worker.offer(REQ("rpc-1"));
168
- // Yield so the worker fiber transitions to Busy.
169
- yield* Effect.yieldNow();
170
- yield* Effect.yieldNow();
171
- const state = MutableRef.get(worker.idleSince);
172
- yield* Deferred.succeed(release, undefined);
173
- return state._tag;
174
- })));
175
- expect(verdict).toBe("Busy");
176
- });
177
- it("idleSince transitions to Idle{sinceMs} after the queue drains and the handler returns", async () => {
178
- const verdict = await Effect.runPromise(withScope((scope) => Effect.gen(function* () {
179
- const done = yield* Deferred.make();
180
- const handle = (_req) => Deferred.succeed(done, undefined).pipe(Effect.asVoid);
181
- const fakeNow = yield* Ref.make(1000);
182
- const clock = () => Effect.runSync(Ref.get(fakeNow));
183
- const worker = yield* makePartitionWorker({
184
- key: KEY,
185
- capacity: 4,
186
- handle,
187
- clock,
188
- scope,
189
- });
190
- // Bump clock so the post-drain Idle.sinceMs is observably new.
191
- yield* Ref.set(fakeNow, 5000);
192
- yield* worker.offer(REQ("rpc-1"));
193
- yield* Deferred.await(done);
194
- // Yield so the worker's post-handler `MutableRef.set(Idle, …)`
195
- // commits before we observe.
196
- yield* Effect.yieldNow();
197
- yield* Effect.yieldNow();
198
- return MutableRef.get(worker.idleSince);
199
- })));
200
- expect(verdict._tag).toBe("Idle");
201
- if (verdict._tag === "Idle") {
202
- expect(verdict.sinceMs).toBe(5000);
203
- }
204
- });
205
- it("idleSince resets to Busy when a new request is offered", async () => {
206
- const verdict = await Effect.runPromise(withScope((scope) => Effect.gen(function* () {
207
- const release = yield* Deferred.make();
208
- const handle = () => Deferred.await(release);
209
- const worker = yield* makePartitionWorker({
210
- key: KEY,
211
- capacity: 4,
212
- handle,
213
- scope,
214
- });
215
- yield* worker.offer(REQ("rpc-1"));
216
- yield* Effect.yieldNow();
217
- const busyState = MutableRef.get(worker.idleSince);
218
- yield* Deferred.succeed(release, undefined);
219
- return busyState._tag;
220
- })));
221
- expect(verdict).toBe("Busy");
222
- });
223
- });
224
- describe("makePartitionWorker — scope teardown", () => {
225
- it("Scope.close interrupts the worker fiber and shuts the queue (no hang)", async () => {
226
- const fiberDone = await Effect.runPromise(Effect.gen(function* () {
227
- const scope = yield* Scope.make();
228
- const handle = () => Effect.void;
229
- const worker = yield* makePartitionWorker({
230
- key: KEY,
231
- capacity: 4,
232
- handle,
233
- scope,
234
- });
235
- yield* Scope.close(scope, Exit.void);
236
- // Wait for the fiber to settle. `Fiber.await` returns when the
237
- // fiber exits — for a healthy teardown this is immediate.
238
- const exit = yield* Fiber.await(worker.fiber);
239
- return Exit.isInterrupted(exit) || Exit.isSuccess(exit);
240
- }));
241
- expect(fiberDone).toBe(true);
242
- });
243
- it("Scope.close while handler is suspended on Deferred.await interrupts cleanly", async () => {
244
- const fiberDone = await Effect.runPromise(Effect.gen(function* () {
245
- const scope = yield* Scope.make();
246
- const release = yield* Deferred.make();
247
- const handle = () => Deferred.await(release);
248
- const worker = yield* makePartitionWorker({
249
- key: KEY,
250
- capacity: 4,
251
- handle,
252
- scope,
253
- });
254
- yield* worker.offer(REQ("rpc-suspended"));
255
- yield* Effect.yieldNow();
256
- // Close while the handler is parked on Deferred.await. The
257
- // worker fiber must interrupt cleanly without hanging.
258
- yield* Scope.close(scope, Exit.void);
259
- const exit = yield* Fiber.await(worker.fiber);
260
- return Exit.isInterrupted(exit) || Exit.isSuccess(exit);
261
- }));
262
- expect(fiberDone).toBe(true);
263
- });
264
- });
265
- //# sourceMappingURL=app-callback-partition-worker.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-callback-partition-worker.test.js","sourceRoot":"","sources":["../../../src/internal/__tests__/app-callback-partition-worker.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=app-callback-partitioned-dispatcher.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-callback-partitioned-dispatcher.test.d.ts","sourceRoot":"","sources":["../../../src/internal/__tests__/app-callback-partitioned-dispatcher.test.ts"],"names":[],"mappings":""}
@@ -1,228 +0,0 @@
1
- /**
2
- * Unit tests for the partitioned task-callback dispatcher.
3
- *
4
- * Spec: moltzap#356 §8 (test plan, file 3).
5
- *
6
- * Phase 9b consumer-migration (sub-issue #460): the legacy `appCallback`
7
- * group retired. Only `task/authorizeDispatch` survives as the
8
- * server→client awaitable RPC, so cross-method partitioning scenarios
9
- * (the pre-Phase-9b deadlock-fix reproducer that pitted
10
- * `apps/onBeforeDispatch` against `apps/onBeforeMessageDelivery`)
11
- * dropped: every request now flows through one descriptor segment, so
12
- * partitioning is by `(taskId, conversationId)` alone. The surviving
13
- * coverage — FIFO, cross-partition independence, soft-cap, idle reaper,
14
- * scope-anchored teardown — still validates the dispatcher contract.
15
- */
16
- import { describe, it, expect } from "vitest";
17
- import { Deferred, Effect, Exit, Ref, Scope } from "effect";
18
- import { DEFAULT_PARTITIONED_DISPATCHER_CONFIG, makePartitionedDispatcher, } from "../app-callback-partitioned-dispatcher.js";
19
- import { authorizeDispatch, conversationIdForIndex, CONV_X, CONV_Y, CONV_Z, SESSION_A, } from "./app-callback-test-requests.js";
20
- /** Drive a body under a fresh CloseableScope; close on exit. */
21
- function withScope(body) {
22
- return Effect.gen(function* () {
23
- const scope = yield* Scope.make();
24
- const result = yield* body(scope);
25
- yield* Scope.close(scope, Exit.void);
26
- return result;
27
- });
28
- }
29
- describe("makePartitionedDispatcher — routing", () => {
30
- it("two offers with the same key land on the same worker (FIFO preserved)", async () => {
31
- const seen = await Effect.runPromise(withScope((scope) => Effect.gen(function* () {
32
- const order = yield* Ref.make([]);
33
- const allDone = yield* Deferred.make();
34
- const dispatcher = yield* makePartitionedDispatcher({
35
- handle: (req) => Effect.gen(function* () {
36
- yield* Ref.update(order, (xs) => [...xs, req.id]);
37
- const xs = yield* Ref.get(order);
38
- if (xs.length === 3) {
39
- yield* Deferred.succeed(allDone, undefined);
40
- }
41
- }),
42
- scope,
43
- });
44
- yield* dispatcher.offer(authorizeDispatch("rpc-1"));
45
- yield* dispatcher.offer(authorizeDispatch("rpc-2"));
46
- yield* dispatcher.offer(authorizeDispatch("rpc-3"));
47
- yield* Deferred.await(allDone);
48
- return yield* Ref.get(order);
49
- })));
50
- expect(seen).toEqual(["rpc-1", "rpc-2", "rpc-3"]);
51
- });
52
- it("offers to different (taskId, conversationId) keys run in parallel (no head-of-line blocking)", async () => {
53
- // Park partition X (CONV_X). Partition Y (CONV_Y) must still run.
54
- const result = await Effect.runPromise(withScope((scope) => Effect.gen(function* () {
55
- const releaseX = yield* Deferred.make();
56
- const yDone = yield* Deferred.make();
57
- const dispatcher = yield* makePartitionedDispatcher({
58
- handle: (req) => Effect.gen(function* () {
59
- if (req.partition.conversationId === CONV_X) {
60
- yield* Deferred.await(releaseX);
61
- }
62
- else if (req.id === "rpc-Y-go") {
63
- yield* Deferred.succeed(yDone, undefined);
64
- }
65
- }),
66
- scope,
67
- });
68
- yield* dispatcher.offer(authorizeDispatch("rpc-X-park", SESSION_A, CONV_X));
69
- yield* dispatcher.offer(authorizeDispatch("rpc-Y-go", SESSION_A, CONV_Y));
70
- yield* Deferred.await(yDone);
71
- yield* Deferred.succeed(releaseX, undefined);
72
- return "Y-ran";
73
- })));
74
- expect(result).toBe("Y-ran");
75
- });
76
- it("partitions are bounded by maxPartitions (config cap)", async () => {
77
- const cap = 4;
78
- const offers = await Effect.runPromise(withScope((scope) => Effect.gen(function* () {
79
- const release = yield* Deferred.make();
80
- const dispatcher = yield* makePartitionedDispatcher({
81
- handle: () => Deferred.await(release),
82
- scope,
83
- config: { maxPartitions: cap },
84
- });
85
- let succeeded = 0;
86
- for (let i = 0; i < 10; i++) {
87
- const outcome = yield* Effect.either(dispatcher.offer(authorizeDispatch(`rpc-${i}`, SESSION_A, conversationIdForIndex(i))));
88
- if (outcome._tag === "Right")
89
- succeeded += 1;
90
- }
91
- yield* Deferred.succeed(release, undefined);
92
- return succeeded;
93
- })));
94
- expect(offers).toBeLessThanOrEqual(DEFAULT_PARTITIONED_DISPATCHER_CONFIG.maxPartitions);
95
- });
96
- });
97
- describe("makePartitionedDispatcher — backpressure", () => {
98
- it("partitionQueueFull on partition A does not block partition B (independent fibers)", async () => {
99
- // Park partition A's handler so its queue fills; offer to
100
- // partition B must still succeed and run.
101
- const result = await Effect.runPromise(withScope((scope) => Effect.gen(function* () {
102
- const releaseA = yield* Deferred.make();
103
- const bDone = yield* Deferred.make();
104
- const dispatcher = yield* makePartitionedDispatcher({
105
- handle: (req) => Effect.gen(function* () {
106
- if (req.partition.conversationId === CONV_X) {
107
- yield* Deferred.await(releaseA);
108
- }
109
- else if (req.id === "rpc-B-go") {
110
- yield* Deferred.succeed(bDone, undefined);
111
- }
112
- }),
113
- scope,
114
- config: { partitionQueueCapacity: 1 },
115
- });
116
- // Start partition A; first offer goes into the handler.
117
- yield* dispatcher.offer(authorizeDispatch("rpc-A-1", SESSION_A, CONV_X));
118
- // Wait until the handler has actually taken rpc-A-1 off the
119
- // queue (queue size 0). Then fill the queue with rpc-A-2 so
120
- // a third offer to A would fail.
121
- for (let i = 0; i < 200; i++) {
122
- const stats = yield* dispatcher.stats;
123
- const partA = stats.partitions.find((p) => p.queueSize >= 0);
124
- if (partA && partA.queueSize === 0)
125
- break;
126
- yield* Effect.yieldNow();
127
- }
128
- yield* dispatcher.offer(authorizeDispatch("rpc-A-2", SESSION_A, CONV_X));
129
- // Partition A is now at capacity. A different-key offer
130
- // (partition B / CONV_Y) must still run.
131
- yield* dispatcher.offer(authorizeDispatch("rpc-B-go", SESSION_A, CONV_Y));
132
- yield* Deferred.await(bDone);
133
- yield* Deferred.succeed(releaseA, undefined);
134
- return "B-ran";
135
- })));
136
- expect(result).toBe("B-ran");
137
- });
138
- it("PartitionQueueFullError is returned when one partition fills, leaving sibling partitions unaffected", async () => {
139
- // Verify the exact failure tag. Park A's handler, fill the queue,
140
- // then push one more — it should fail with PartitionQueueFullError.
141
- const verdict = await Effect.runPromise(withScope((scope) => Effect.gen(function* () {
142
- const release = yield* Deferred.make();
143
- const dispatcher = yield* makePartitionedDispatcher({
144
- handle: () => Deferred.await(release),
145
- scope,
146
- config: { partitionQueueCapacity: 1 },
147
- });
148
- yield* dispatcher.offer(authorizeDispatch("rpc-1", SESSION_A, CONV_X));
149
- // Wait for the handler to take rpc-1 off the queue.
150
- for (let i = 0; i < 200; i++) {
151
- const stats = yield* dispatcher.stats;
152
- const part = stats.partitions[0];
153
- if (part && part.queueSize === 0)
154
- break;
155
- yield* Effect.yieldNow();
156
- }
157
- yield* dispatcher.offer(authorizeDispatch("rpc-2", SESSION_A, CONV_X));
158
- const overflow = yield* Effect.either(dispatcher.offer(authorizeDispatch("rpc-3", SESSION_A, CONV_X)));
159
- yield* Deferred.succeed(release, undefined);
160
- return overflow;
161
- })));
162
- expect(verdict._tag).toBe("Left");
163
- if (verdict._tag === "Left") {
164
- expect(verdict.left._tag).toBe("PartitionQueueFullError");
165
- }
166
- });
167
- });
168
- describe("makePartitionedDispatcher — idle reaper", () => {
169
- it("idle reaper tick reclaims drained partitions when the configured TTL elapses", async () => {
170
- // Drives the live reaper with a tight TTL/tick. The reaper runs
171
- // on the dispatcher's scope-anchored fiber; the test polls
172
- // `stats.activePartitions` until it observes the reclaim. No
173
- // virtual-clock injection — that surface is private.
174
- const verdict = await Effect.runPromise(withScope((scope) => Effect.gen(function* () {
175
- const dispatcher = yield* makePartitionedDispatcher({
176
- handle: () => Effect.void,
177
- scope,
178
- config: {
179
- idlePartitionTtlMs: 50,
180
- idleReaperIntervalMs: 25,
181
- },
182
- });
183
- yield* dispatcher.offer(authorizeDispatch("rpc-1", SESSION_A, CONV_Z));
184
- // Drain — the worker accepts and completes immediately.
185
- for (let i = 0; i < 200; i++) {
186
- const stats = yield* dispatcher.stats;
187
- if (stats.activePartitions === 0 ||
188
- stats.partitions.every((p) => p.idle && p.queueSize === 0)) {
189
- break;
190
- }
191
- yield* Effect.sleep("10 millis");
192
- }
193
- // Wait for the reaper to fire at least once past the TTL.
194
- for (let i = 0; i < 200; i++) {
195
- const stats = yield* dispatcher.stats;
196
- if (stats.activePartitions === 0)
197
- return 0;
198
- yield* Effect.sleep("10 millis");
199
- }
200
- const stats = yield* dispatcher.stats;
201
- return stats.activePartitions;
202
- })));
203
- expect(verdict).toBe(0);
204
- });
205
- });
206
- describe("makePartitionedDispatcher — scope teardown", () => {
207
- it("closing the scope finalizes every partition worker (no leaked fibers)", async () => {
208
- const result = await Effect.runPromise(Effect.gen(function* () {
209
- const scope = yield* Scope.make();
210
- const releaseAll = yield* Deferred.make();
211
- const dispatcher = yield* makePartitionedDispatcher({
212
- handle: () => Deferred.await(releaseAll),
213
- scope,
214
- });
215
- yield* dispatcher.offer(authorizeDispatch("rpc-1"));
216
- // Close the scope — finalizers fire; the parked handlers are
217
- // interrupted. Without scope-anchored teardown, this would
218
- // hang forever.
219
- yield* Scope.close(scope, Exit.void);
220
- // The Deferred is now garbage; succeeding it post-close is a
221
- // safe no-op (Deferred semantics allow late settle).
222
- yield* Deferred.succeed(releaseAll, undefined);
223
- return "scope-closed";
224
- }));
225
- expect(result).toBe("scope-closed");
226
- });
227
- });
228
- //# sourceMappingURL=app-callback-partitioned-dispatcher.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-callback-partitioned-dispatcher.test.js","sourceRoot":"","sources":["../../../src/internal/__tests__/app-callback-partitioned-dispatcher.test.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- import { TaskAuthorizeDispatch, type ParamsOf } from "@moltzap/protocol";
2
- import { type PartitionableRequest } from "../app-callback-partition-key.js";
3
- export declare const SESSION_A: string & import("effect/Brand").Brand<"TaskId">;
4
- export declare const SESSION_B: string & import("effect/Brand").Brand<"TaskId">;
5
- export declare const CONV_X: string & import("effect/Brand").Brand<"ConversationId">;
6
- export declare const CONV_Y: string & import("effect/Brand").Brand<"ConversationId">;
7
- export declare const CONV_Z: string & import("effect/Brand").Brand<"ConversationId">;
8
- export declare const AGENT_A: string & import("effect/Brand").Brand<"AgentId">;
9
- export declare const MESSAGE_A: string & import("effect/Brand").Brand<"MessageId">;
10
- export declare const conversationIdForIndex: (index: number) => string & import("effect/Brand").Brand<"ConversationId">;
11
- /**
12
- * Phase 9b consumer-migration (sub-issue #460): the client-test fixtures
13
- * for the deleted appCallback verbs (`apps/onBeforeMessageDelivery`,
14
- * `apps/onSessionActive`, `apps/onClose`) retired. Only
15
- * `task/authorizeDispatch` (renamed from `apps/onBeforeDispatch`) remains;
16
- * its fixture keeps the same shape — the verdict union, the recipient
17
- * envelope, the params layout — because werewolf's dispatch state
18
- * machine consumes it unchanged.
19
- */
20
- export declare function authorizeDispatchParams(taskId?: string & import("effect/Brand").Brand<"TaskId">, conv?: string & import("effect/Brand").Brand<"ConversationId">): ParamsOf<typeof TaskAuthorizeDispatch>;
21
- export declare function authorizeDispatch(id: string, taskId?: string & import("effect/Brand").Brand<"TaskId">, conv?: string & import("effect/Brand").Brand<"ConversationId">): PartitionableRequest;
22
- //# sourceMappingURL=app-callback-test-requests.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-callback-test-requests.d.ts","sourceRoot":"","sources":["../../../src/internal/__tests__/app-callback-test-requests.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAErB,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAC;AAO3B,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAE7E,eAAO,MAAM,SAAS,iDAAqD,CAAC;AAC5E,eAAO,MAAM,SAAS,iDAAqD,CAAC;AAC5E,eAAO,MAAM,MAAM,yDAAyD,CAAC;AAC7E,eAAO,MAAM,MAAM,yDAAyD,CAAC;AAC7E,eAAO,MAAM,MAAM,yDAAyD,CAAC;AAC7E,eAAO,MAAM,OAAO,kDAAkD,CAAC;AACvE,eAAO,MAAM,SAAS,oDAAoD,CAAC;AAG3E,eAAO,MAAM,sBAAsB,GAAI,OAAO,MAAM,4DAGjD,CAAC;AAEJ;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,kDAAY,EAClB,IAAI,0DAAS,GACZ,QAAQ,CAAC,OAAO,qBAAqB,CAAC,CAaxC;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,MAAM,EACV,MAAM,kDAAY,EAClB,IAAI,0DAAS,GACZ,oBAAoB,CAQtB"}
@@ -1,45 +0,0 @@
1
- import { TaskAuthorizeDispatch, } from "@moltzap/protocol";
2
- import { agentId, conversationId, messageId, taskId as makeTaskId, } from "@moltzap/protocol/testing";
3
- import {} from "../app-callback-partition-key.js";
4
- export const SESSION_A = makeTaskId("11111111-1111-4111-8111-111111111111");
5
- export const SESSION_B = makeTaskId("22222222-2222-4222-8222-222222222222");
6
- export const CONV_X = conversationId("33333333-3333-4333-8333-333333333333");
7
- export const CONV_Y = conversationId("44444444-4444-4444-8444-444444444444");
8
- export const CONV_Z = conversationId("77777777-7777-4777-8777-777777777777");
9
- export const AGENT_A = agentId("55555555-5555-4555-8555-555555555555");
10
- export const MESSAGE_A = messageId("66666666-6666-4666-8666-666666666666");
11
- const UUID_SUFFIX_WIDTH = 12;
12
- export const conversationIdForIndex = (index) => conversationId(`33333333-3333-4333-8333-${index.toString().padStart(UUID_SUFFIX_WIDTH, "0")}`);
13
- /**
14
- * Phase 9b consumer-migration (sub-issue #460): the client-test fixtures
15
- * for the deleted appCallback verbs (`apps/onBeforeMessageDelivery`,
16
- * `apps/onSessionActive`, `apps/onClose`) retired. Only
17
- * `task/authorizeDispatch` (renamed from `apps/onBeforeDispatch`) remains;
18
- * its fixture keeps the same shape — the verdict union, the recipient
19
- * envelope, the params layout — because werewolf's dispatch state
20
- * machine consumes it unchanged.
21
- */
22
- export function authorizeDispatchParams(taskId = SESSION_A, conv = CONV_X) {
23
- return {
24
- taskId,
25
- appId: "test-app",
26
- conversationId: conv,
27
- recipient: { agentId: AGENT_A, ownerId: "owner-a" },
28
- message: {
29
- id: MESSAGE_A,
30
- senderAgentId: AGENT_A,
31
- parts: [{ type: "text", text: "hello" }],
32
- },
33
- attempt: 0,
34
- };
35
- }
36
- export function authorizeDispatch(id, taskId = SESSION_A, conv = CONV_X) {
37
- const params = authorizeDispatchParams(taskId, conv);
38
- return {
39
- id: id,
40
- definition: TaskAuthorizeDispatch,
41
- params,
42
- partition: { taskId, conversationId: conv },
43
- };
44
- }
45
- //# sourceMappingURL=app-callback-test-requests.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-callback-test-requests.js","sourceRoot":"","sources":["../../../src/internal/__tests__/app-callback-test-requests.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GAGtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,OAAO,EACP,cAAc,EACd,SAAS,EACT,MAAM,IAAI,UAAU,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAA6B,MAAM,kCAAkC,CAAC;AAE7E,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC,sCAAsC,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC,sCAAsC,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,MAAM,GAAG,cAAc,CAAC,sCAAsC,CAAC,CAAC;AAC7E,MAAM,CAAC,MAAM,MAAM,GAAG,cAAc,CAAC,sCAAsC,CAAC,CAAC;AAC7E,MAAM,CAAC,MAAM,MAAM,GAAG,cAAc,CAAC,sCAAsC,CAAC,CAAC;AAC7E,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,sCAAsC,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,CAAC,sCAAsC,CAAC,CAAC;AAC3E,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAa,EAAE,EAAE,CACtD,cAAc,CACZ,2BAA2B,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,CAAC,EAAE,CAC/E,CAAC;AAEJ;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAM,GAAG,SAAS,EAClB,IAAI,GAAG,MAAM;IAEb,OAAO;QACL,MAAM;QACN,KAAK,EAAE,UAAU;QACjB,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE;QACnD,OAAO,EAAE;YACP,EAAE,EAAE,SAAS;YACb,aAAa,EAAE,OAAO;YACtB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;SACzC;QACD,OAAO,EAAE,CAAC;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,EAAU,EACV,MAAM,GAAG,SAAS,EAClB,IAAI,GAAG,MAAM;IAEb,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACrD,OAAO;QACL,EAAE,EAAE,EAAe;QACnB,UAAU,EAAE,qBAAqB;QACjC,MAAM;QACN,SAAS,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE;KAC5C,CAAC;AACJ,CAAC"}