@moltzap/client 2026.503.4 → 2026.504.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.
- package/dist/channel-core.d.ts +1 -4
- package/dist/channel-core.d.ts.map +1 -1
- package/dist/channel-core.js +0 -9
- package/dist/channel-core.js.map +1 -1
- package/dist/channel-core.test.js +90 -71
- package/dist/channel-core.test.js.map +1 -1
- package/dist/cli/commands/agents.js +2 -2
- package/dist/cli/commands/agents.js.map +1 -1
- package/dist/cli/commands/apps.d.ts +2 -24
- package/dist/cli/commands/apps.d.ts.map +1 -1
- package/dist/cli/commands/apps.js +22 -47
- package/dist/cli/commands/apps.js.map +1 -1
- package/dist/cli/commands/apps.test.js +59 -72
- package/dist/cli/commands/apps.test.js.map +1 -1
- package/dist/cli/commands/contacts.d.ts +1 -5
- package/dist/cli/commands/contacts.d.ts.map +1 -1
- package/dist/cli/commands/contacts.js +11 -26
- package/dist/cli/commands/contacts.js.map +1 -1
- package/dist/cli/commands/conversations-v2.test.js +30 -26
- package/dist/cli/commands/conversations-v2.test.js.map +1 -1
- package/dist/cli/commands/conversations.d.ts.map +1 -1
- package/dist/cli/commands/conversations.js +48 -33
- package/dist/cli/commands/conversations.js.map +1 -1
- package/dist/cli/commands/messages.d.ts.map +1 -1
- package/dist/cli/commands/messages.js +11 -8
- package/dist/cli/commands/messages.js.map +1 -1
- package/dist/cli/commands/messages.test.js +28 -30
- package/dist/cli/commands/messages.test.js.map +1 -1
- package/dist/cli/commands/presence.d.ts.map +1 -1
- package/dist/cli/commands/presence.js +5 -4
- package/dist/cli/commands/presence.js.map +1 -1
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +20 -11
- package/dist/cli/commands/send.js.map +1 -1
- package/dist/cli/commands/send.test.js +11 -9
- package/dist/cli/commands/send.test.js.map +1 -1
- package/dist/cli/commands/status.js +2 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/test-transport.d.ts +10 -0
- package/dist/cli/commands/test-transport.d.ts.map +1 -0
- package/dist/cli/commands/test-transport.js +29 -0
- package/dist/cli/commands/test-transport.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +0 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/socket-client.d.ts +9 -4
- package/dist/cli/socket-client.d.ts.map +1 -1
- package/dist/cli/socket-client.js +27 -12
- package/dist/cli/socket-client.js.map +1 -1
- package/dist/cli/transport.d.ts +3 -2
- package/dist/cli/transport.d.ts.map +1 -1
- package/dist/cli/transport.js +6 -6
- package/dist/cli/transport.js.map +1 -1
- package/dist/cli/transport.test.js +4 -4
- package/dist/cli/transport.test.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/__tests__/app-callback-partition-key.test.d.ts +2 -0
- package/dist/internal/__tests__/app-callback-partition-key.test.d.ts.map +1 -0
- package/dist/internal/__tests__/app-callback-partition-key.test.js +33 -0
- package/dist/internal/__tests__/app-callback-partition-key.test.js.map +1 -0
- package/dist/internal/__tests__/app-callback-partition-worker.test.d.ts +2 -0
- package/dist/internal/__tests__/app-callback-partition-worker.test.d.ts.map +1 -0
- package/dist/internal/__tests__/{s2c-partition-worker.test.js → app-callback-partition-worker.test.js} +6 -9
- package/dist/internal/__tests__/app-callback-partition-worker.test.js.map +1 -0
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher-real-ws.test.d.ts +2 -0
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher-real-ws.test.d.ts.map +1 -0
- package/dist/internal/__tests__/{s2c-partitioned-dispatcher-real-ws.test.js → app-callback-partitioned-dispatcher-real-ws.test.js} +69 -94
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher-real-ws.test.js.map +1 -0
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.d.ts +2 -0
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.d.ts.map +1 -0
- package/dist/internal/__tests__/{s2c-partitioned-dispatcher.test.js → app-callback-partitioned-dispatcher.test.js} +35 -69
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.js.map +1 -0
- package/dist/internal/__tests__/app-callback-test-requests.d.ts +58 -0
- package/dist/internal/__tests__/app-callback-test-requests.d.ts.map +1 -0
- package/dist/internal/__tests__/app-callback-test-requests.js +124 -0
- package/dist/internal/__tests__/app-callback-test-requests.js.map +1 -0
- package/dist/internal/{s2c-dispatcher-errors.d.ts → app-callback-dispatcher-errors.d.ts} +5 -21
- package/dist/internal/app-callback-dispatcher-errors.d.ts.map +1 -0
- package/dist/internal/{s2c-dispatcher-errors.js → app-callback-dispatcher-errors.js} +3 -13
- package/dist/internal/app-callback-dispatcher-errors.js.map +1 -0
- package/dist/internal/app-callback-partition-key.d.ts +68 -0
- package/dist/internal/app-callback-partition-key.d.ts.map +1 -0
- package/dist/internal/app-callback-partition-key.js +90 -0
- package/dist/internal/app-callback-partition-key.js.map +1 -0
- package/dist/internal/{s2c-partition-worker.d.ts → app-callback-partition-worker.d.ts} +5 -5
- package/dist/internal/app-callback-partition-worker.d.ts.map +1 -0
- package/dist/internal/{s2c-partition-worker.js → app-callback-partition-worker.js} +5 -5
- package/dist/internal/app-callback-partition-worker.js.map +1 -0
- package/dist/internal/{s2c-partitioned-dispatcher.d.ts → app-callback-partitioned-dispatcher.d.ts} +9 -10
- package/dist/internal/app-callback-partitioned-dispatcher.d.ts.map +1 -0
- package/dist/internal/{s2c-partitioned-dispatcher.js → app-callback-partitioned-dispatcher.js} +12 -19
- package/dist/internal/app-callback-partitioned-dispatcher.js.map +1 -0
- package/dist/runtime/errors.d.ts +2 -28
- package/dist/runtime/errors.d.ts.map +1 -1
- package/dist/runtime/errors.js +0 -9
- package/dist/runtime/errors.js.map +1 -1
- package/dist/runtime/errors.test.js +2 -2
- package/dist/runtime/errors.test.js.map +1 -1
- package/dist/runtime/frame.d.ts +17 -18
- package/dist/runtime/frame.d.ts.map +1 -1
- package/dist/runtime/frame.js +86 -31
- package/dist/runtime/frame.js.map +1 -1
- package/dist/runtime/frame.test.js +15 -11
- package/dist/runtime/frame.test.js.map +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/local-service-commands.d.ts +7 -0
- package/dist/runtime/local-service-commands.d.ts.map +1 -0
- package/dist/runtime/local-service-commands.js +6 -0
- package/dist/runtime/local-service-commands.js.map +1 -0
- package/dist/runtime/runtime.test.js +1 -2
- package/dist/runtime/runtime.test.js.map +1 -1
- package/dist/runtime/subscribers.d.ts +34 -29
- package/dist/runtime/subscribers.d.ts.map +1 -1
- package/dist/runtime/subscribers.js +19 -19
- package/dist/runtime/subscribers.js.map +1 -1
- package/dist/runtime/subscribers.test.js +50 -31
- package/dist/runtime/subscribers.test.js.map +1 -1
- package/dist/service.d.ts +24 -39
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +165 -161
- package/dist/service.js.map +1 -1
- package/dist/service.test.js +111 -170
- package/dist/service.test.js.map +1 -1
- package/dist/test-utils/channel-service-fixture.d.ts +1 -2
- package/dist/test-utils/channel-service-fixture.d.ts.map +1 -1
- package/dist/test-utils/channel-service-fixture.js +28 -20
- package/dist/test-utils/channel-service-fixture.js.map +1 -1
- package/dist/test-utils/conformance-adapter.d.ts +2 -2
- package/dist/test-utils/conformance-adapter.d.ts.map +1 -1
- package/dist/test-utils/conformance-adapter.js +33 -26
- package/dist/test-utils/conformance-adapter.js.map +1 -1
- package/dist/test-utils/fake-service.d.ts +14 -39
- package/dist/test-utils/fake-service.d.ts.map +1 -1
- package/dist/test-utils/fake-service.js +33 -39
- package/dist/test-utils/fake-service.js.map +1 -1
- package/dist/test-utils/ids.d.ts +9 -0
- package/dist/test-utils/ids.d.ts.map +1 -0
- package/dist/test-utils/ids.js +52 -0
- package/dist/test-utils/ids.js.map +1 -0
- package/dist/test-utils/index.d.ts +10 -2
- package/dist/test-utils/index.d.ts.map +1 -1
- package/dist/test-utils/index.js +12 -5
- package/dist/test-utils/index.js.map +1 -1
- package/dist/ws-client.d.ts +58 -64
- package/dist/ws-client.d.ts.map +1 -1
- package/dist/ws-client.js +151 -133
- package/dist/ws-client.js.map +1 -1
- package/dist/ws-client.test.js +157 -167
- package/dist/ws-client.test.js.map +1 -1
- package/package.json +3 -3
- package/dist/cli/commands/permissions.d.ts +0 -70
- package/dist/cli/commands/permissions.d.ts.map +0 -1
- package/dist/cli/commands/permissions.js +0 -100
- package/dist/cli/commands/permissions.js.map +0 -1
- package/dist/cli/commands/permissions.test.d.ts +0 -2
- package/dist/cli/commands/permissions.test.d.ts.map +0 -1
- package/dist/cli/commands/permissions.test.js +0 -127
- package/dist/cli/commands/permissions.test.js.map +0 -1
- package/dist/internal/__tests__/s2c-partition-key.test.d.ts +0 -2
- package/dist/internal/__tests__/s2c-partition-key.test.d.ts.map +0 -1
- package/dist/internal/__tests__/s2c-partition-key.test.js +0 -231
- package/dist/internal/__tests__/s2c-partition-key.test.js.map +0 -1
- package/dist/internal/__tests__/s2c-partition-worker.test.d.ts +0 -2
- package/dist/internal/__tests__/s2c-partition-worker.test.d.ts.map +0 -1
- package/dist/internal/__tests__/s2c-partition-worker.test.js.map +0 -1
- package/dist/internal/__tests__/s2c-partitioned-dispatcher-real-ws.test.d.ts +0 -2
- package/dist/internal/__tests__/s2c-partitioned-dispatcher-real-ws.test.d.ts.map +0 -1
- package/dist/internal/__tests__/s2c-partitioned-dispatcher-real-ws.test.js.map +0 -1
- package/dist/internal/__tests__/s2c-partitioned-dispatcher.test.d.ts +0 -2
- package/dist/internal/__tests__/s2c-partitioned-dispatcher.test.d.ts.map +0 -1
- package/dist/internal/__tests__/s2c-partitioned-dispatcher.test.js.map +0 -1
- package/dist/internal/s2c-dispatcher-errors.d.ts.map +0 -1
- package/dist/internal/s2c-dispatcher-errors.js.map +0 -1
- package/dist/internal/s2c-partition-key.d.ts +0 -79
- package/dist/internal/s2c-partition-key.d.ts.map +0 -1
- package/dist/internal/s2c-partition-key.js +0 -146
- package/dist/internal/s2c-partition-key.js.map +0 -1
- package/dist/internal/s2c-partition-worker.d.ts.map +0 -1
- package/dist/internal/s2c-partition-worker.js.map +0 -1
- package/dist/internal/s2c-partitioned-dispatcher.d.ts.map +0 -1
- package/dist/internal/s2c-partitioned-dispatcher.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-callback-partitioned-dispatcher-real-ws.test.d.ts","sourceRoot":"","sources":["../../../src/internal/__tests__/app-callback-partitioned-dispatcher-real-ws.test.ts"],"names":[],"mappings":""}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* tests; see PR body "Deviations" for the rationale).
|
|
9
9
|
*
|
|
10
10
|
* Boots an in-process `@effect/platform-node` WebSocket server,
|
|
11
|
-
* connects a real `MoltZapWsClient`, registers two competing
|
|
11
|
+
* connects a real `MoltZapWsClient`, registers two competing appCallback
|
|
12
12
|
* handlers (`before_dispatch` parks on a Deferred;
|
|
13
13
|
* `before_message_delivery` resolves it), and asserts both replies
|
|
14
14
|
* round-trip back to the server. Pre-#356 this hangs; post-#356 it
|
|
@@ -20,12 +20,28 @@
|
|
|
20
20
|
import * as NodeSocketServer from "@effect/platform-node/NodeSocketServer";
|
|
21
21
|
import { Deferred, Effect, Scope } from "effect";
|
|
22
22
|
import { describe, expect, it } from "vitest";
|
|
23
|
-
import { PROTOCOL_VERSION } from "@moltzap/protocol";
|
|
24
23
|
import { MoltZapWsClient } from "../../ws-client.js";
|
|
25
|
-
import { AppsOnBeforeDispatch, AppsOnBeforeMessageDelivery, Connect, } from "@moltzap/protocol";
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
const
|
|
24
|
+
import { AppsOnBeforeDispatch, AppsOnBeforeMessageDelivery, Connect, PROTOCOL_VERSION, jsonRpcStringId, requestFrame, responseFrame, validators, } from "@moltzap/protocol";
|
|
25
|
+
import { beforeDispatchParams, beforeMessageDeliveryParams, CONV_X, SESSION_A, SESSION_B, } from "./app-callback-test-requests.js";
|
|
26
|
+
const TEST_AGENT_ID = "11111111-1111-4111-8111-111111111111";
|
|
27
|
+
const TEST_POLICY = {
|
|
28
|
+
maxMessageBytes: 1_000_000,
|
|
29
|
+
maxPartsPerMessage: 10,
|
|
30
|
+
maxTextLength: 32_768,
|
|
31
|
+
maxGroupParticipants: 100,
|
|
32
|
+
heartbeatIntervalMs: 30_000,
|
|
33
|
+
rateLimits: {
|
|
34
|
+
messagesPerMinute: 60,
|
|
35
|
+
requestsPerMinute: 120,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
const helloOk = () => ({
|
|
39
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
40
|
+
agentId: TEST_AGENT_ID,
|
|
41
|
+
conversations: [],
|
|
42
|
+
unreadCounts: {},
|
|
43
|
+
policy: TEST_POLICY,
|
|
44
|
+
});
|
|
29
45
|
/**
|
|
30
46
|
* Spin up an in-process WS server on 127.0.0.1:0. Caller owns the
|
|
31
47
|
* provided scope; when it closes the server shuts down.
|
|
@@ -71,7 +87,20 @@ async function connect(client) {
|
|
|
71
87
|
async function close(client) {
|
|
72
88
|
await Effect.runPromise(client.close());
|
|
73
89
|
}
|
|
74
|
-
|
|
90
|
+
function responseIds(rawFrames) {
|
|
91
|
+
return rawFrames.flatMap((raw) => {
|
|
92
|
+
try {
|
|
93
|
+
const parsed = JSON.parse(raw);
|
|
94
|
+
return validators.responseFrame(parsed) && typeof parsed.id === "string"
|
|
95
|
+
? [parsed.id]
|
|
96
|
+
: [];
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
describe("integration: AppHost + partitioned appCallback dispatcher", () => {
|
|
75
104
|
it("two competing handlers (before_dispatch + before_message_delivery) for the " +
|
|
76
105
|
"same conversation: parked before_dispatch resumes after sibling " +
|
|
77
106
|
"before_message_delivery completes — both replies ship to the server", async () => {
|
|
@@ -82,37 +111,20 @@ describe("integration: AppHost + partitioned s2c dispatcher", () => {
|
|
|
82
111
|
// fires from the sibling, and both replies ship.
|
|
83
112
|
const result = await Effect.runPromise(Effect.scoped(Effect.gen(function* () {
|
|
84
113
|
const server = yield* startWsServer((conn, raw) => Effect.gen(function* () {
|
|
85
|
-
const
|
|
86
|
-
if (
|
|
87
|
-
yield*
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
result:
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
},
|
|
96
|
-
}));
|
|
97
|
-
// Fire BOTH s2c requests for the SAME (S, C). With
|
|
114
|
+
const parsed = JSON.parse(raw);
|
|
115
|
+
if (!validators.requestFrame(parsed)) {
|
|
116
|
+
return yield* Effect.die("expected JSON-RPC request frame");
|
|
117
|
+
}
|
|
118
|
+
const frame = parsed;
|
|
119
|
+
if (frame.method === Connect.name) {
|
|
120
|
+
yield* conn.send(JSON.stringify(responseFrame(frame.id, {
|
|
121
|
+
result: helloOk(),
|
|
122
|
+
})));
|
|
123
|
+
// Fire BOTH appCallback requests for the SAME (S, C). With
|
|
98
124
|
// pre-#356 dispatching they queue on one fiber and
|
|
99
125
|
// deadlock; with #356 they run concurrently.
|
|
100
|
-
yield* conn.send(JSON.stringify(
|
|
101
|
-
|
|
102
|
-
type: "request",
|
|
103
|
-
direction: "s2c",
|
|
104
|
-
id: "rpc-bd-1",
|
|
105
|
-
method: AppsOnBeforeDispatch.name,
|
|
106
|
-
params: { sessionId: SESSION_A, conversationId: CONV_X },
|
|
107
|
-
}));
|
|
108
|
-
yield* conn.send(JSON.stringify({
|
|
109
|
-
jsonrpc: "2.0",
|
|
110
|
-
type: "request",
|
|
111
|
-
direction: "s2c",
|
|
112
|
-
id: "rpc-bmd-1",
|
|
113
|
-
method: AppsOnBeforeMessageDelivery.name,
|
|
114
|
-
params: { sessionId: SESSION_A, conversationId: CONV_X },
|
|
115
|
-
}));
|
|
126
|
+
yield* conn.send(JSON.stringify(requestFrame(jsonRpcStringId("rpc-bd-1"), AppsOnBeforeDispatch, beforeDispatchParams(SESSION_A, CONV_X))));
|
|
127
|
+
yield* conn.send(JSON.stringify(requestFrame(jsonRpcStringId("rpc-bmd-1"), AppsOnBeforeMessageDelivery, beforeMessageDeliveryParams(SESSION_A, CONV_X))));
|
|
116
128
|
}
|
|
117
129
|
}));
|
|
118
130
|
const client = new MoltZapWsClient({
|
|
@@ -128,13 +140,13 @@ describe("integration: AppHost + partitioned s2c dispatcher", () => {
|
|
|
128
140
|
// the parking Deferred — pre-#356 this would never run
|
|
129
141
|
// because both queue on a single dispatch fiber.
|
|
130
142
|
const release = yield* Deferred.make();
|
|
131
|
-
yield* client.handleServerRpc(AppsOnBeforeDispatch
|
|
143
|
+
yield* client.handleServerRpc(AppsOnBeforeDispatch, () => Effect.gen(function* () {
|
|
132
144
|
yield* Deferred.await(release);
|
|
133
|
-
return { admission: "
|
|
145
|
+
return { admission: { decision: "grant" } };
|
|
134
146
|
}));
|
|
135
|
-
yield* client.handleServerRpc(AppsOnBeforeMessageDelivery
|
|
147
|
+
yield* client.handleServerRpc(AppsOnBeforeMessageDelivery, () => Effect.gen(function* () {
|
|
136
148
|
yield* Deferred.succeed(release, undefined);
|
|
137
|
-
return {
|
|
149
|
+
return { block: false };
|
|
138
150
|
}));
|
|
139
151
|
yield* Effect.promise(() => connect(client));
|
|
140
152
|
// Wait for both replies to land at the server.
|
|
@@ -143,17 +155,7 @@ describe("integration: AppHost + partitioned s2c dispatcher", () => {
|
|
|
143
155
|
while (Date.now() < deadline) {
|
|
144
156
|
const conn = server.conns[0];
|
|
145
157
|
if (conn) {
|
|
146
|
-
const replyIds = conn.received
|
|
147
|
-
.map((r) => {
|
|
148
|
-
try {
|
|
149
|
-
const f = JSON.parse(r);
|
|
150
|
-
return f.id ?? null;
|
|
151
|
-
}
|
|
152
|
-
catch {
|
|
153
|
-
return null;
|
|
154
|
-
}
|
|
155
|
-
})
|
|
156
|
-
.filter((x) => x !== null);
|
|
158
|
+
const replyIds = responseIds(conn.received);
|
|
157
159
|
if (replyIds.includes("rpc-bd-1") &&
|
|
158
160
|
replyIds.includes("rpc-bmd-1")) {
|
|
159
161
|
bothReplied = true;
|
|
@@ -171,36 +173,19 @@ describe("integration: AppHost + partitioned s2c dispatcher", () => {
|
|
|
171
173
|
"(slow handler in session A does not delay session B)", async () => {
|
|
172
174
|
const result = await Effect.runPromise(Effect.scoped(Effect.gen(function* () {
|
|
173
175
|
const server = yield* startWsServer((conn, raw) => Effect.gen(function* () {
|
|
174
|
-
const
|
|
175
|
-
if (
|
|
176
|
-
yield*
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
result:
|
|
182
|
-
|
|
183
|
-
protocol: PROTOCOL_VERSION,
|
|
184
|
-
},
|
|
185
|
-
}));
|
|
176
|
+
const parsed = JSON.parse(raw);
|
|
177
|
+
if (!validators.requestFrame(parsed)) {
|
|
178
|
+
return yield* Effect.die("expected JSON-RPC request frame");
|
|
179
|
+
}
|
|
180
|
+
const frame = parsed;
|
|
181
|
+
if (frame.method === Connect.name) {
|
|
182
|
+
yield* conn.send(JSON.stringify(responseFrame(frame.id, {
|
|
183
|
+
result: helloOk(),
|
|
184
|
+
})));
|
|
186
185
|
// Session A: park forever (until release).
|
|
187
|
-
yield* conn.send(JSON.stringify(
|
|
188
|
-
jsonrpc: "2.0",
|
|
189
|
-
type: "request",
|
|
190
|
-
direction: "s2c",
|
|
191
|
-
id: "rpc-A",
|
|
192
|
-
method: AppsOnBeforeDispatch.name,
|
|
193
|
-
params: { sessionId: SESSION_A, conversationId: CONV_X },
|
|
194
|
-
}));
|
|
186
|
+
yield* conn.send(JSON.stringify(requestFrame(jsonRpcStringId("rpc-A"), AppsOnBeforeDispatch, beforeDispatchParams(SESSION_A, CONV_X))));
|
|
195
187
|
// Session B: must complete despite A being parked.
|
|
196
|
-
yield* conn.send(JSON.stringify(
|
|
197
|
-
jsonrpc: "2.0",
|
|
198
|
-
type: "request",
|
|
199
|
-
direction: "s2c",
|
|
200
|
-
id: "rpc-B",
|
|
201
|
-
method: AppsOnBeforeDispatch.name,
|
|
202
|
-
params: { sessionId: SESSION_B, conversationId: CONV_X },
|
|
203
|
-
}));
|
|
188
|
+
yield* conn.send(JSON.stringify(requestFrame(jsonRpcStringId("rpc-B"), AppsOnBeforeDispatch, beforeDispatchParams(SESSION_B, CONV_X))));
|
|
204
189
|
}
|
|
205
190
|
}));
|
|
206
191
|
const release = yield* Deferred.make();
|
|
@@ -213,12 +198,11 @@ describe("integration: AppHost + partitioned s2c dispatcher", () => {
|
|
|
213
198
|
error: () => { },
|
|
214
199
|
},
|
|
215
200
|
});
|
|
216
|
-
yield* client.handleServerRpc(AppsOnBeforeDispatch
|
|
217
|
-
|
|
218
|
-
if (sid === SESSION_A) {
|
|
201
|
+
yield* client.handleServerRpc(AppsOnBeforeDispatch, (params) => Effect.gen(function* () {
|
|
202
|
+
if (params.sessionId === SESSION_A) {
|
|
219
203
|
yield* Deferred.await(release);
|
|
220
204
|
}
|
|
221
|
-
return { admission: "
|
|
205
|
+
return { admission: { decision: "grant" } };
|
|
222
206
|
}));
|
|
223
207
|
yield* Effect.promise(() => connect(client));
|
|
224
208
|
const deadline = Date.now() + 4000;
|
|
@@ -226,16 +210,7 @@ describe("integration: AppHost + partitioned s2c dispatcher", () => {
|
|
|
226
210
|
while (Date.now() < deadline) {
|
|
227
211
|
const conn = server.conns[0];
|
|
228
212
|
if (conn) {
|
|
229
|
-
const replyIds = conn.received
|
|
230
|
-
.map((r) => {
|
|
231
|
-
try {
|
|
232
|
-
return JSON.parse(r).id ?? null;
|
|
233
|
-
}
|
|
234
|
-
catch {
|
|
235
|
-
return null;
|
|
236
|
-
}
|
|
237
|
-
})
|
|
238
|
-
.filter((x) => x !== null);
|
|
213
|
+
const replyIds = responseIds(conn.received);
|
|
239
214
|
if (replyIds.includes("rpc-B")) {
|
|
240
215
|
bRan = true;
|
|
241
216
|
break;
|
|
@@ -252,4 +227,4 @@ describe("integration: AppHost + partitioned s2c dispatcher", () => {
|
|
|
252
227
|
expect(result).toBe(true);
|
|
253
228
|
}, /* per-test timeout */ 6000);
|
|
254
229
|
});
|
|
255
|
-
//# sourceMappingURL=
|
|
230
|
+
//# sourceMappingURL=app-callback-partitioned-dispatcher-real-ws.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-callback-partitioned-dispatcher-real-ws.test.js","sourceRoot":"","sources":["../../../src/internal/__tests__/app-callback-partitioned-dispatcher-real-ws.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
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,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Unit tests for the partitioned
|
|
2
|
+
* Unit tests for the partitioned appCallback dispatcher.
|
|
3
3
|
*
|
|
4
4
|
* Spec: moltzap#356 §8 (test plan, file 3).
|
|
5
5
|
*
|
|
@@ -9,26 +9,9 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { describe, it, expect } from "vitest";
|
|
11
11
|
import { Deferred, Effect, Exit, Ref, Scope } from "effect";
|
|
12
|
-
import { DEFAULT_PARTITIONED_DISPATCHER_CONFIG, makePartitionedDispatcher, } from "../
|
|
13
|
-
import { AppsOnBeforeDispatch, AppsOnBeforeMessageDelivery,
|
|
14
|
-
|
|
15
|
-
const CONV_X = "conv-X";
|
|
16
|
-
const CONV_Y = "conv-Y";
|
|
17
|
-
const reqBeforeDispatch = (id, sessionId = SESSION_A, conv = CONV_X) => ({
|
|
18
|
-
id,
|
|
19
|
-
method: AppsOnBeforeDispatch.name,
|
|
20
|
-
params: { sessionId, conversationId: conv },
|
|
21
|
-
});
|
|
22
|
-
const reqBeforeMessageDelivery = (id, sessionId = SESSION_A, conv = CONV_X) => ({
|
|
23
|
-
id,
|
|
24
|
-
method: AppsOnBeforeMessageDelivery.name,
|
|
25
|
-
params: { sessionId, conversationId: conv },
|
|
26
|
-
});
|
|
27
|
-
const reqLifecycle = (id, method = AppsOnJoin.name, sessionId = SESSION_A) => ({
|
|
28
|
-
id,
|
|
29
|
-
method,
|
|
30
|
-
params: { sessionId },
|
|
31
|
-
});
|
|
12
|
+
import { DEFAULT_PARTITIONED_DISPATCHER_CONFIG, makePartitionedDispatcher, } from "../app-callback-partitioned-dispatcher.js";
|
|
13
|
+
import { AppsOnBeforeDispatch, AppsOnBeforeMessageDelivery, } from "@moltzap/protocol";
|
|
14
|
+
import { beforeDispatch, beforeMessageDelivery, conversationIdForIndex, CONV_X, CONV_Y, CONV_Z, onJoin, SESSION_A, } from "./app-callback-test-requests.js";
|
|
32
15
|
/** Drive a body under a fresh CloseableScope; close on exit. */
|
|
33
16
|
function withScope(body) {
|
|
34
17
|
return Effect.gen(function* () {
|
|
@@ -53,9 +36,9 @@ describe("makePartitionedDispatcher — routing", () => {
|
|
|
53
36
|
}),
|
|
54
37
|
scope,
|
|
55
38
|
});
|
|
56
|
-
yield* dispatcher.offer(
|
|
57
|
-
yield* dispatcher.offer(
|
|
58
|
-
yield* dispatcher.offer(
|
|
39
|
+
yield* dispatcher.offer(beforeDispatch("rpc-1"));
|
|
40
|
+
yield* dispatcher.offer(beforeDispatch("rpc-2"));
|
|
41
|
+
yield* dispatcher.offer(beforeDispatch("rpc-3"));
|
|
59
42
|
yield* Deferred.await(allDone);
|
|
60
43
|
return yield* Ref.get(order);
|
|
61
44
|
})));
|
|
@@ -81,8 +64,8 @@ describe("makePartitionedDispatcher — routing", () => {
|
|
|
81
64
|
handle,
|
|
82
65
|
scope,
|
|
83
66
|
});
|
|
84
|
-
yield* dispatcher.offer(
|
|
85
|
-
yield* dispatcher.offer(
|
|
67
|
+
yield* dispatcher.offer(beforeDispatch("rpc-A-park", SESSION_A, CONV_X));
|
|
68
|
+
yield* dispatcher.offer(beforeDispatch("rpc-B-go", SESSION_A, CONV_Y));
|
|
86
69
|
// bDone fires only if rpc-B ran without being blocked by
|
|
87
70
|
// rpc-A's parked Deferred.
|
|
88
71
|
yield* Deferred.await(bDone);
|
|
@@ -93,23 +76,6 @@ describe("makePartitionedDispatcher — routing", () => {
|
|
|
93
76
|
})));
|
|
94
77
|
expect(result).toBe("concurrent");
|
|
95
78
|
});
|
|
96
|
-
it("offer with malformed params returns MalformedPartitionKeyError", async () => {
|
|
97
|
-
const verdict = await Effect.runPromise(withScope((scope) => Effect.gen(function* () {
|
|
98
|
-
const dispatcher = yield* makePartitionedDispatcher({
|
|
99
|
-
handle: () => Effect.void,
|
|
100
|
-
scope,
|
|
101
|
-
});
|
|
102
|
-
return yield* Effect.either(dispatcher.offer({
|
|
103
|
-
id: "rpc-x",
|
|
104
|
-
method: AppsOnBeforeDispatch.name,
|
|
105
|
-
params: { /* sessionId missing */ conversationId: CONV_X },
|
|
106
|
-
}));
|
|
107
|
-
})));
|
|
108
|
-
expect(verdict._tag).toBe("Left");
|
|
109
|
-
if (verdict._tag === "Left") {
|
|
110
|
-
expect(verdict.left._tag).toBe("MalformedPartitionKeyError");
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
79
|
});
|
|
114
80
|
describe("makePartitionedDispatcher — soft cap", () => {
|
|
115
81
|
it("allocates up to maxPartitions partitions", async () => {
|
|
@@ -123,7 +89,7 @@ describe("makePartitionedDispatcher — soft cap", () => {
|
|
|
123
89
|
// Distinct conversationIds → distinct keys → distinct
|
|
124
90
|
// partitions, all parked on `release`.
|
|
125
91
|
for (let i = 0; i < 4; i++) {
|
|
126
|
-
yield* dispatcher.offer(
|
|
92
|
+
yield* dispatcher.offer(beforeDispatch(`rpc-${i}`, SESSION_A, conversationIdForIndex(i)));
|
|
127
93
|
}
|
|
128
94
|
const stats = yield* dispatcher.stats;
|
|
129
95
|
yield* Deferred.succeed(release, undefined);
|
|
@@ -139,10 +105,10 @@ describe("makePartitionedDispatcher — soft cap", () => {
|
|
|
139
105
|
scope,
|
|
140
106
|
config: { maxPartitions: 2 },
|
|
141
107
|
});
|
|
142
|
-
yield* dispatcher.offer(
|
|
143
|
-
yield* dispatcher.offer(
|
|
108
|
+
yield* dispatcher.offer(beforeDispatch("rpc-1", SESSION_A, CONV_X));
|
|
109
|
+
yield* dispatcher.offer(beforeDispatch("rpc-2", SESSION_A, CONV_Y));
|
|
144
110
|
// Third distinct key → should fail with PartitionLimitError.
|
|
145
|
-
const overflow = yield* Effect.either(dispatcher.offer(
|
|
111
|
+
const overflow = yield* Effect.either(dispatcher.offer(beforeDispatch("rpc-3", SESSION_A, CONV_Z)));
|
|
146
112
|
yield* Deferred.succeed(release, undefined);
|
|
147
113
|
return overflow;
|
|
148
114
|
})));
|
|
@@ -161,7 +127,7 @@ describe("makePartitionedDispatcher — backpressure", () => {
|
|
|
161
127
|
const bDone = yield* Deferred.make();
|
|
162
128
|
const dispatcher = yield* makePartitionedDispatcher({
|
|
163
129
|
handle: (req) => Effect.gen(function* () {
|
|
164
|
-
if (req.
|
|
130
|
+
if (req.definition.name === AppsOnBeforeDispatch.name) {
|
|
165
131
|
yield* Deferred.await(releaseA);
|
|
166
132
|
}
|
|
167
133
|
else if (req.id === "rpc-B-go") {
|
|
@@ -172,7 +138,7 @@ describe("makePartitionedDispatcher — backpressure", () => {
|
|
|
172
138
|
config: { partitionQueueCapacity: 1 },
|
|
173
139
|
});
|
|
174
140
|
// Start partition A; first offer goes into the handler.
|
|
175
|
-
yield* dispatcher.offer(
|
|
141
|
+
yield* dispatcher.offer(beforeDispatch("rpc-A-1", SESSION_A, CONV_X));
|
|
176
142
|
// Wait until the handler has actually taken rpc-A-1 off the
|
|
177
143
|
// queue (queue size 0). Then fill the queue with rpc-A-2 so
|
|
178
144
|
// a third offer to A would fail.
|
|
@@ -183,11 +149,11 @@ describe("makePartitionedDispatcher — backpressure", () => {
|
|
|
183
149
|
break;
|
|
184
150
|
yield* Effect.yieldNow();
|
|
185
151
|
}
|
|
186
|
-
yield* dispatcher.offer(
|
|
152
|
+
yield* dispatcher.offer(beforeDispatch("rpc-A-2", SESSION_A, CONV_X));
|
|
187
153
|
// Partition A is now at capacity. A third offer to A would
|
|
188
154
|
// fail. Meanwhile a different-key offer (partition B) must
|
|
189
155
|
// still run.
|
|
190
|
-
yield* dispatcher.offer(
|
|
156
|
+
yield* dispatcher.offer(beforeMessageDelivery("rpc-B-go", SESSION_A, CONV_X));
|
|
191
157
|
yield* Deferred.await(bDone);
|
|
192
158
|
yield* Deferred.succeed(releaseA, undefined);
|
|
193
159
|
return "B-ran";
|
|
@@ -204,7 +170,7 @@ describe("makePartitionedDispatcher — backpressure", () => {
|
|
|
204
170
|
scope,
|
|
205
171
|
config: { partitionQueueCapacity: 1 },
|
|
206
172
|
});
|
|
207
|
-
yield* dispatcher.offer(
|
|
173
|
+
yield* dispatcher.offer(beforeDispatch("rpc-1", SESSION_A, CONV_X));
|
|
208
174
|
// Wait for the handler to take rpc-1 off the queue.
|
|
209
175
|
for (let i = 0; i < 200; i++) {
|
|
210
176
|
const stats = yield* dispatcher.stats;
|
|
@@ -213,8 +179,8 @@ describe("makePartitionedDispatcher — backpressure", () => {
|
|
|
213
179
|
break;
|
|
214
180
|
yield* Effect.yieldNow();
|
|
215
181
|
}
|
|
216
|
-
yield* dispatcher.offer(
|
|
217
|
-
const overflow = yield* Effect.either(dispatcher.offer(
|
|
182
|
+
yield* dispatcher.offer(beforeDispatch("rpc-2", SESSION_A, CONV_X));
|
|
183
|
+
const overflow = yield* Effect.either(dispatcher.offer(beforeDispatch("rpc-3", SESSION_A, CONV_X)));
|
|
218
184
|
yield* Deferred.succeed(release, undefined);
|
|
219
185
|
return overflow;
|
|
220
186
|
})));
|
|
@@ -246,12 +212,12 @@ describe("makePartitionedDispatcher — deadlock fix (D10 reproducer at dispatch
|
|
|
246
212
|
const deliveryDone = yield* Deferred.make();
|
|
247
213
|
const dispatcher = yield* makePartitionedDispatcher({
|
|
248
214
|
handle: (req) => Effect.gen(function* () {
|
|
249
|
-
if (req.
|
|
215
|
+
if (req.definition.name === AppsOnBeforeDispatch.name) {
|
|
250
216
|
// Park.
|
|
251
217
|
yield* Deferred.await(releaseDispatch);
|
|
252
218
|
yield* Deferred.succeed(dispatchDone, undefined);
|
|
253
219
|
}
|
|
254
|
-
else if (req.
|
|
220
|
+
else if (req.definition.name === AppsOnBeforeMessageDelivery.name) {
|
|
255
221
|
// The lease-release hook in arena's pattern. Run
|
|
256
222
|
// to completion and signal the dispatch path to
|
|
257
223
|
// resume.
|
|
@@ -262,9 +228,9 @@ describe("makePartitionedDispatcher — deadlock fix (D10 reproducer at dispatch
|
|
|
262
228
|
scope,
|
|
263
229
|
});
|
|
264
230
|
// Step 1: park dispatch handler.
|
|
265
|
-
yield* dispatcher.offer(
|
|
231
|
+
yield* dispatcher.offer(beforeDispatch("rpc-dispatch-1", SESSION_A, CONV_X));
|
|
266
232
|
// Step 2: send delivery handler for the SAME conversation.
|
|
267
|
-
yield* dispatcher.offer(
|
|
233
|
+
yield* dispatcher.offer(beforeMessageDelivery("rpc-delivery-1", SESSION_A, CONV_X));
|
|
268
234
|
// Both must complete. With pre-#356 single-fiber
|
|
269
235
|
// dispatch, this hangs forever (the test's `runPromise`
|
|
270
236
|
// would never resolve — vitest's `testTimeout` would
|
|
@@ -291,7 +257,7 @@ describe("makePartitionedDispatcher — idle reaper", () => {
|
|
|
291
257
|
idleReaperIntervalMs: 10,
|
|
292
258
|
},
|
|
293
259
|
});
|
|
294
|
-
yield* dispatcher.offer(
|
|
260
|
+
yield* dispatcher.offer(beforeDispatch("rpc-1", SESSION_A, CONV_X));
|
|
295
261
|
// Wait for the handler to finish so the partition becomes
|
|
296
262
|
// Idle.
|
|
297
263
|
for (let i = 0; i < 200; i++) {
|
|
@@ -333,7 +299,7 @@ describe("makePartitionedDispatcher — idle reaper", () => {
|
|
|
333
299
|
idleReaperIntervalMs: 10,
|
|
334
300
|
},
|
|
335
301
|
});
|
|
336
|
-
yield* dispatcher.offer(
|
|
302
|
+
yield* dispatcher.offer(beforeDispatch("rpc-busy", SESSION_A, CONV_X));
|
|
337
303
|
// Bump clock past TTL while handler is still parked. Reaper
|
|
338
304
|
// sees `idleSince._tag === "Busy"` and skips reclamation.
|
|
339
305
|
yield* Ref.set(fakeNow, 10_000);
|
|
@@ -355,9 +321,9 @@ describe("makePartitionedDispatcher — scope teardown", () => {
|
|
|
355
321
|
handle: () => Deferred.await(release),
|
|
356
322
|
scope,
|
|
357
323
|
});
|
|
358
|
-
yield* dispatcher.offer(
|
|
359
|
-
yield* dispatcher.offer(
|
|
360
|
-
yield* dispatcher.offer(
|
|
324
|
+
yield* dispatcher.offer(beforeDispatch("rpc-1"));
|
|
325
|
+
yield* dispatcher.offer(beforeMessageDelivery("rpc-2"));
|
|
326
|
+
yield* dispatcher.offer(onJoin("rpc-3"));
|
|
361
327
|
// Close while every handler is parked. Must not hang.
|
|
362
328
|
yield* Scope.close(scope, Exit.void);
|
|
363
329
|
// Release any awaiters (no-op if scope close already
|
|
@@ -392,7 +358,7 @@ describe("makePartitionedDispatcher — reaper releases per-worker scopes", () =
|
|
|
392
358
|
// the count would still be 2N (the lingering fiber never
|
|
393
359
|
// gets new items because the map points to a fresh worker)
|
|
394
360
|
// — so this is not a perfect distinguisher of leaked-vs-not,
|
|
395
|
-
// but combined with `
|
|
361
|
+
// but combined with `app-callback-partition-worker.test.ts > "offer
|
|
396
362
|
// after Scope close fails with PartitionQueueFullError"`,
|
|
397
363
|
// we cover both the per-worker-scope contract and the
|
|
398
364
|
// reaper's use of it.
|
|
@@ -419,7 +385,7 @@ describe("makePartitionedDispatcher — reaper releases per-worker scopes", () =
|
|
|
419
385
|
});
|
|
420
386
|
// Spawn N partitions across N distinct conv keys.
|
|
421
387
|
for (let i = 0; i < N; i++) {
|
|
422
|
-
yield* dispatcher.offer(
|
|
388
|
+
yield* dispatcher.offer(beforeDispatch(`rpc-${i}`, SESSION_A, conversationIdForIndex(i)));
|
|
423
389
|
}
|
|
424
390
|
// Wait until every worker is Idle (handler returned).
|
|
425
391
|
for (let attempt = 0; attempt < 200; attempt++) {
|
|
@@ -450,7 +416,7 @@ describe("makePartitionedDispatcher — reaper releases per-worker scopes", () =
|
|
|
450
416
|
// is processing — not a stale reference returning an
|
|
451
417
|
// already-shutdown queue).
|
|
452
418
|
for (let i = 0; i < N; i++) {
|
|
453
|
-
yield* dispatcher.offer(
|
|
419
|
+
yield* dispatcher.offer(beforeDispatch(`rpc-fresh-${i}`, SESSION_A, conversationIdForIndex(i + N)));
|
|
454
420
|
}
|
|
455
421
|
// Wait for the fresh handlers to all run.
|
|
456
422
|
for (let attempt = 0; attempt < 200; attempt++) {
|
|
@@ -507,7 +473,7 @@ describe("makePartitionedDispatcher — reaper releases per-worker scopes", () =
|
|
|
507
473
|
const outcomes = [];
|
|
508
474
|
for (let i = 0; i < cycles; i++) {
|
|
509
475
|
yield* Ref.set(fakeNow, 1000 * i);
|
|
510
|
-
const result = yield* Effect.either(dispatcher.offer(
|
|
476
|
+
const result = yield* Effect.either(dispatcher.offer(beforeDispatch(`rpc-cycle-${i}`, SESSION_A, CONV_Z)));
|
|
511
477
|
outcomes.push(result._tag === "Right" ? "ok" : "rejected");
|
|
512
478
|
// Yield so the reaper has a chance to run between cycles.
|
|
513
479
|
yield* Effect.yieldNow();
|
|
@@ -552,7 +518,7 @@ describe("makePartitionedDispatcher — runSync(close()) contract (regression of
|
|
|
552
518
|
handle: () => Effect.void,
|
|
553
519
|
scope,
|
|
554
520
|
});
|
|
555
|
-
yield* dispatcher.offer(
|
|
521
|
+
yield* dispatcher.offer(beforeDispatch("rpc-1"));
|
|
556
522
|
// Use Effect.runFork-equivalent via Effect.forkDaemon — a
|
|
557
523
|
// runSync caller wraps `Scope.close(...)` similarly.
|
|
558
524
|
const fiber = yield* Effect.forkDaemon(Scope.close(scope, Exit.void));
|
|
@@ -569,4 +535,4 @@ describe("makePartitionedDispatcher — defaults", () => {
|
|
|
569
535
|
expect(DEFAULT_PARTITIONED_DISPATCHER_CONFIG.idleReaperIntervalMs).toBe(5_000);
|
|
570
536
|
});
|
|
571
537
|
});
|
|
572
|
-
//# sourceMappingURL=
|
|
538
|
+
//# sourceMappingURL=app-callback-partitioned-dispatcher.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|