@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.
- package/dist/channel-core.d.ts +118 -2
- package/dist/channel-core.d.ts.map +1 -1
- package/dist/channel-core.js +195 -27
- package/dist/channel-core.js.map +1 -1
- package/dist/channel-core.test.js +117 -26
- package/dist/channel-core.test.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime/frame.d.ts +6 -10
- package/dist/runtime/frame.d.ts.map +1 -1
- package/dist/runtime/frame.js +4 -28
- package/dist/runtime/frame.js.map +1 -1
- package/dist/service.d.ts +18 -3
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +28 -50
- package/dist/service.js.map +1 -1
- package/dist/service.test.js +27 -25
- package/dist/service.test.js.map +1 -1
- package/dist/test-utils/channel-service-fixture.d.ts +2 -1
- package/dist/test-utils/channel-service-fixture.d.ts.map +1 -1
- package/dist/test-utils/channel-service-fixture.js +8 -0
- package/dist/test-utils/channel-service-fixture.js.map +1 -1
- package/dist/ws-client.d.ts +5 -26
- package/dist/ws-client.d.ts.map +1 -1
- package/dist/ws-client.js +71 -97
- package/dist/ws-client.js.map +1 -1
- package/dist/ws-client.test.js +40 -12
- package/dist/ws-client.test.js.map +1 -1
- package/package.json +3 -3
- package/dist/internal/__tests__/app-callback-partition-key.test.d.ts +0 -2
- package/dist/internal/__tests__/app-callback-partition-key.test.d.ts.map +0 -1
- package/dist/internal/__tests__/app-callback-partition-key.test.js +0 -20
- package/dist/internal/__tests__/app-callback-partition-key.test.js.map +0 -1
- package/dist/internal/__tests__/app-callback-partition-worker.test.d.ts +0 -2
- package/dist/internal/__tests__/app-callback-partition-worker.test.d.ts.map +0 -1
- package/dist/internal/__tests__/app-callback-partition-worker.test.js +0 -265
- package/dist/internal/__tests__/app-callback-partition-worker.test.js.map +0 -1
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.d.ts +0 -2
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.d.ts.map +0 -1
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.js +0 -228
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.js.map +0 -1
- package/dist/internal/__tests__/app-callback-test-requests.d.ts +0 -22
- package/dist/internal/__tests__/app-callback-test-requests.d.ts.map +0 -1
- package/dist/internal/__tests__/app-callback-test-requests.js +0 -45
- package/dist/internal/__tests__/app-callback-test-requests.js.map +0 -1
- package/dist/internal/app-callback-dispatcher-errors.d.ts +0 -50
- package/dist/internal/app-callback-dispatcher-errors.d.ts.map +0 -1
- package/dist/internal/app-callback-dispatcher-errors.js +0 -36
- package/dist/internal/app-callback-dispatcher-errors.js.map +0 -1
- package/dist/internal/app-callback-partition-key.d.ts +0 -58
- package/dist/internal/app-callback-partition-key.d.ts.map +0 -1
- package/dist/internal/app-callback-partition-key.js +0 -80
- package/dist/internal/app-callback-partition-key.js.map +0 -1
- package/dist/internal/app-callback-partition-worker.d.ts +0 -160
- package/dist/internal/app-callback-partition-worker.d.ts.map +0 -1
- package/dist/internal/app-callback-partition-worker.js +0 -141
- package/dist/internal/app-callback-partition-worker.js.map +0 -1
- package/dist/internal/app-callback-partitioned-dispatcher.d.ts +0 -180
- package/dist/internal/app-callback-partitioned-dispatcher.d.ts.map +0 -1
- package/dist/internal/app-callback-partitioned-dispatcher.js +0 -282
- 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 +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"}
|