@livestore/webmesh 0.4.0-dev.22 → 0.4.0-dev.23
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/README.md +5 -3
- package/dist/.tsbuildinfo +1 -1
- package/dist/channel/direct-channel-internal.d.ts.map +1 -1
- package/dist/channel/direct-channel-internal.js +15 -23
- package/dist/channel/direct-channel-internal.js.map +1 -1
- package/dist/channel/direct-channel.js +4 -4
- package/dist/channel/direct-channel.js.map +1 -1
- package/dist/channel/proxy-channel.d.ts +26 -1
- package/dist/channel/proxy-channel.d.ts.map +1 -1
- package/dist/channel/proxy-channel.js +64 -18
- package/dist/channel/proxy-channel.js.map +1 -1
- package/dist/common.d.ts.map +1 -1
- package/dist/common.js +5 -6
- package/dist/common.js.map +1 -1
- package/dist/node.d.ts +6 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +25 -23
- package/dist/node.js.map +1 -1
- package/dist/node.test.js +192 -5
- package/dist/node.test.js.map +1 -1
- package/dist/websocket-edge.d.ts +1 -1
- package/dist/websocket-edge.d.ts.map +1 -1
- package/dist/websocket-edge.js +5 -7
- package/dist/websocket-edge.js.map +1 -1
- package/dist/websocket-edge.test.d.ts +7 -0
- package/dist/websocket-edge.test.d.ts.map +1 -0
- package/dist/websocket-edge.test.js +74 -0
- package/dist/websocket-edge.test.js.map +1 -0
- package/package.json +65 -12
- package/src/channel/direct-channel-internal.ts +17 -40
- package/src/channel/direct-channel.ts +4 -4
- package/src/channel/proxy-channel.ts +85 -25
- package/src/common.ts +5 -6
- package/src/node.test.ts +270 -7
- package/src/node.ts +31 -23
- package/src/websocket-edge.test.ts +98 -0
- package/src/websocket-edge.ts +7 -9
package/dist/node.js
CHANGED
|
@@ -22,7 +22,7 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
22
22
|
if ((packet._tag === 'DirectChannelRequest' &&
|
|
23
23
|
(edgeChannels.size === 0 || // Either if direct edge does not support transferables ...
|
|
24
24
|
edgeChannels.get(packet.target)?.channel.supportsTransferables === false)) || // ... or if no forward-edges support transferables
|
|
25
|
-
|
|
25
|
+
[...edgeChannels.values()].some((c) => c.channel.supportsTransferables) === false) {
|
|
26
26
|
return WebmeshSchema.DirectChannelResponseNoTransferables.make({
|
|
27
27
|
reqId: packet.id,
|
|
28
28
|
channelName: packet.channelName,
|
|
@@ -35,10 +35,11 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
35
35
|
hops: [],
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
|
+
return undefined;
|
|
38
39
|
};
|
|
39
40
|
const sendPacket = (packet) => Effect.gen(function* () {
|
|
40
41
|
// yield* Effect.log(`${nodeName}: sendPacket:${packet._tag} [${packet.id}]`)
|
|
41
|
-
if (Schema.is(WebmeshSchema.NetworkEdgeAdded)(packet)) {
|
|
42
|
+
if (Schema.is(WebmeshSchema.NetworkEdgeAdded)(packet) === true) {
|
|
42
43
|
yield* Effect.spanEvent('NetworkEdgeAdded', { packet, nodeName });
|
|
43
44
|
yield* PubSub.publish(newEdgeAvailablePubSub, packet.target);
|
|
44
45
|
const edgesToForwardTo = Array.from(edgeChannels)
|
|
@@ -47,7 +48,7 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
47
48
|
yield* Effect.forEach(edgesToForwardTo, (con) => con.send(packet), { concurrency: 'unbounded' });
|
|
48
49
|
return;
|
|
49
50
|
}
|
|
50
|
-
if (Schema.is(WebmeshSchema.BroadcastChannelPacket)(packet)) {
|
|
51
|
+
if (Schema.is(WebmeshSchema.BroadcastChannelPacket)(packet) === true) {
|
|
51
52
|
const edgesToForwardTo = Array.from(edgeChannels)
|
|
52
53
|
.filter(([name]) => !packet.hops.includes(name))
|
|
53
54
|
.map(([_, con]) => con.channel);
|
|
@@ -67,7 +68,7 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
67
68
|
}
|
|
68
69
|
return;
|
|
69
70
|
}
|
|
70
|
-
if (Schema.is(WebmeshSchema.NetworkTopologyRequest)(packet)) {
|
|
71
|
+
if (Schema.is(WebmeshSchema.NetworkTopologyRequest)(packet) === true) {
|
|
71
72
|
if (packet.source !== nodeName) {
|
|
72
73
|
const backEdgeName = packet.hops.at(-1) ?? shouldNeverHappen(`${nodeName}: Expected hops for packet`, packet);
|
|
73
74
|
const backEdgeChannel = edgeChannels.get(backEdgeName).channel;
|
|
@@ -93,7 +94,7 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
93
94
|
yield* Effect.forEach(edgesToForwardTo, (con) => con.send(adjustedPacket), { concurrency: 'unbounded' });
|
|
94
95
|
return;
|
|
95
96
|
}
|
|
96
|
-
if (Schema.is(WebmeshSchema.NetworkTopologyResponse)(packet)) {
|
|
97
|
+
if (Schema.is(WebmeshSchema.NetworkTopologyResponse)(packet) === true) {
|
|
97
98
|
if (packet.source === nodeName) {
|
|
98
99
|
const topologyRequestItem = topologyRequestsMap.get(packet.reqId);
|
|
99
100
|
topologyRequestItem.set(packet.nodeName, new Set(packet.edges));
|
|
@@ -109,7 +110,7 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
109
110
|
return;
|
|
110
111
|
}
|
|
111
112
|
// We have a direct edge to the target node
|
|
112
|
-
if (edgeChannels.has(packet.target)) {
|
|
113
|
+
if (edgeChannels.has(packet.target) === true) {
|
|
113
114
|
const edgeChannel = edgeChannels.get(packet.target).channel;
|
|
114
115
|
const hops = packet.source === nodeName ? [] : [...packet.hops, nodeName];
|
|
115
116
|
yield* Effect.annotateCurrentSpan({ hasDirectEdge: true });
|
|
@@ -137,7 +138,7 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
137
138
|
.filter(([name]) => name !== packet.source)
|
|
138
139
|
.map(([name, con]) => ({ name, channel: con.channel }));
|
|
139
140
|
// TODO if hops-depth=0, we should fail right away with no route found
|
|
140
|
-
if (hops.length === 0 && edgesToForwardTo.length === 0 && LS_DEV) {
|
|
141
|
+
if (hops.length === 0 && edgesToForwardTo.length === 0 && LS_DEV === true) {
|
|
141
142
|
yield* Effect.logWarning(nodeName, 'no route found to', packet.target, packet._tag, 'TODO handle better');
|
|
142
143
|
// TODO return a expected failure
|
|
143
144
|
}
|
|
@@ -152,8 +153,8 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
152
153
|
attributes: packetAsOtelAttributes(packet),
|
|
153
154
|
}), Effect.orDie);
|
|
154
155
|
const addEdge = ({ target: targetNodeName, edgeChannel, replaceIfExists = false }) => Effect.gen(function* () {
|
|
155
|
-
if (edgeChannels.has(targetNodeName)) {
|
|
156
|
-
if (replaceIfExists) {
|
|
156
|
+
if (edgeChannels.has(targetNodeName) === true) {
|
|
157
|
+
if (replaceIfExists === true) {
|
|
157
158
|
yield* removeEdge(targetNodeName).pipe(Effect.orDie);
|
|
158
159
|
}
|
|
159
160
|
else {
|
|
@@ -164,7 +165,7 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
164
165
|
const listenFiber = yield* edgeChannel.listen.pipe(Stream.flatten(), Stream.tap((message) => Effect.gen(function* () {
|
|
165
166
|
const packet = yield* Schema.decodeUnknown(WebmeshSchema.Packet)(message);
|
|
166
167
|
// console.debug(nodeName, 'recv', packet._tag, packet.source, packet.target)
|
|
167
|
-
if (handledPacketIds.has(packet.id))
|
|
168
|
+
if (handledPacketIds.has(packet.id) === true)
|
|
168
169
|
return;
|
|
169
170
|
handledPacketIds.add(packet.id);
|
|
170
171
|
switch (packet._tag) {
|
|
@@ -177,7 +178,7 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
177
178
|
default: {
|
|
178
179
|
if (packet.target === nodeName) {
|
|
179
180
|
const channelKey = `target:${packet.source}, channelName:${packet.channelName}`;
|
|
180
|
-
if (
|
|
181
|
+
if (channelMap.has(channelKey) === false) {
|
|
181
182
|
const channelQueue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
|
|
182
183
|
channelMap.set(channelKey, { queue: channelQueue, debugInfo: undefined });
|
|
183
184
|
}
|
|
@@ -185,10 +186,10 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
185
186
|
const respondToSender = (outgoingPacket) => edgeChannel
|
|
186
187
|
.send(outgoingPacket)
|
|
187
188
|
.pipe(Effect.withSpan(`respondToSender:${outgoingPacket._tag}:${outgoingPacket.source}→${outgoingPacket.target}`, { attributes: packetAsOtelAttributes(outgoingPacket) }), Effect.orDie);
|
|
188
|
-
if (Schema.is(WebmeshSchema.ProxyChannelPacket)(packet)) {
|
|
189
|
+
if (Schema.is(WebmeshSchema.ProxyChannelPacket)(packet) === true) {
|
|
189
190
|
yield* Queue.offer(channelQueue, { packet, respondToSender });
|
|
190
191
|
}
|
|
191
|
-
else if (Schema.is(WebmeshSchema.DirectChannelPacket)(packet)) {
|
|
192
|
+
else if (Schema.is(WebmeshSchema.DirectChannelPacket)(packet) === true) {
|
|
192
193
|
yield* Queue.offer(channelQueue, { packet, respondToSender });
|
|
193
194
|
}
|
|
194
195
|
if (packet._tag === 'ProxyChannelRequest' || packet._tag === 'DirectChannelRequest') {
|
|
@@ -200,7 +201,7 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
200
201
|
}
|
|
201
202
|
}
|
|
202
203
|
else {
|
|
203
|
-
if (Schema.is(WebmeshSchema.DirectChannelPacket)(packet)) {
|
|
204
|
+
if (Schema.is(WebmeshSchema.DirectChannelPacket)(packet) === true) {
|
|
204
205
|
const noTransferableResponse = checkTransferableEdges(packet);
|
|
205
206
|
if (noTransferableResponse !== undefined) {
|
|
206
207
|
yield* Effect.spanEvent(`No transferable edges found for ${packet.source}→${packet.target}`);
|
|
@@ -224,7 +225,7 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
224
225
|
attributes: { supportsTransferables: edgeChannel.supportsTransferables },
|
|
225
226
|
})); // any-cast needed for error/never overload
|
|
226
227
|
const removeEdge = (targetNodeName) => Effect.gen(function* () {
|
|
227
|
-
if (
|
|
228
|
+
if (edgeChannels.has(targetNodeName) === false) {
|
|
228
229
|
return yield* new Cause.NoSuchElementException(`No edge found for ${targetNodeName}`);
|
|
229
230
|
}
|
|
230
231
|
yield* Fiber.interrupt(edgeChannels.get(targetNodeName).listenFiber);
|
|
@@ -235,13 +236,13 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
235
236
|
// TODO when a channel is established in the same origin, we can use a weblock to detect disconnects
|
|
236
237
|
const makeChannel = ({ target, channelName, schema: inputSchema,
|
|
237
238
|
// TODO in the future we could have a mode that prefers directs and then falls back to proxies if needed
|
|
238
|
-
mode, timeout = Duration.seconds(1), closeExisting = false, }) => Effect.gen(function* () {
|
|
239
|
+
mode, timeout = Duration.seconds(1), closeExisting = false, simulation, }) => Effect.gen(function* () {
|
|
239
240
|
const schema = WebChannel.mapSchema(inputSchema);
|
|
240
241
|
const channelKey = `target:${target}, channelName:${channelName}`;
|
|
241
|
-
if (channelMap.has(channelKey)) {
|
|
242
|
+
if (channelMap.has(channelKey) === true) {
|
|
242
243
|
const existingChannel = channelMap.get(channelKey).debugInfo?.channel;
|
|
243
|
-
if (existingChannel) {
|
|
244
|
-
if (closeExisting) {
|
|
244
|
+
if (existingChannel !== undefined) {
|
|
245
|
+
if (closeExisting === true) {
|
|
245
246
|
yield* existingChannel.shutdown;
|
|
246
247
|
channelMap.delete(channelKey);
|
|
247
248
|
}
|
|
@@ -287,6 +288,7 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
287
288
|
schema,
|
|
288
289
|
queue: channelQueue,
|
|
289
290
|
sendPacket,
|
|
291
|
+
...(simulation !== undefined ? { simulation } : {}),
|
|
290
292
|
});
|
|
291
293
|
channelMap.set(channelKey, { queue: channelQueue, debugInfo: { channel, target } });
|
|
292
294
|
return channel;
|
|
@@ -300,7 +302,7 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
300
302
|
// TODO also provide a way to allow for reconnects
|
|
301
303
|
let listenAlreadyStarted = false;
|
|
302
304
|
const listenForChannel = Stream.suspend(() => {
|
|
303
|
-
if (listenAlreadyStarted) {
|
|
305
|
+
if (listenAlreadyStarted === true) {
|
|
304
306
|
return shouldNeverHappen('listenForChannel already started');
|
|
305
307
|
}
|
|
306
308
|
listenAlreadyStarted = true;
|
|
@@ -308,7 +310,7 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
308
310
|
const seen = new Set();
|
|
309
311
|
return Stream.fromQueue(channelRequestsQueue).pipe(Stream.filter((res) => {
|
|
310
312
|
const hashed = hash(res);
|
|
311
|
-
if (seen.has(hashed)) {
|
|
313
|
+
if (seen.has(hashed) === true) {
|
|
312
314
|
return false;
|
|
313
315
|
}
|
|
314
316
|
seen.add(hashed);
|
|
@@ -316,7 +318,7 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
316
318
|
}));
|
|
317
319
|
});
|
|
318
320
|
const makeBroadcastChannel = ({ channelName, schema }) => Effect.scopeWithCloseable((scope) => Effect.gen(function* () {
|
|
319
|
-
if (broadcastChannelListenQueueMap.has(channelName)) {
|
|
321
|
+
if (broadcastChannelListenQueueMap.has(channelName) === true) {
|
|
320
322
|
return shouldNeverHappen(`Broadcast channel ${channelName} already exists`, broadcastChannelListenQueueMap.get(channelName));
|
|
321
323
|
}
|
|
322
324
|
const debugInfo = {};
|
|
@@ -362,7 +364,7 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
|
|
|
362
364
|
supportsTransferables: value.debugInfo?.channel.supportsTransferables,
|
|
363
365
|
...value.debugInfo?.channel.debugInfo,
|
|
364
366
|
})
|
|
365
|
-
.map(([key, value]) => indent(`${key}=${value}`, 4))
|
|
367
|
+
.map(([key, value]) => indent(`${key}=${String(value)}`, 4))
|
|
366
368
|
.join('\n'), ' ', value.debugInfo?.channel, '\n', indent(`Queue: ${value.queue.unsafeSize().pipe(Option.getOrUndefined)}`, 4), value.queue);
|
|
367
369
|
}
|
|
368
370
|
console.log('Broadcast channels:', broadcastChannelListenQueueMap.size);
|
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
|
package/dist/node.test.js
CHANGED
|
@@ -60,8 +60,8 @@ const getFirstMessage = (channel) => channel.listen.pipe(Stream.flatten(), Strea
|
|
|
60
60
|
const maybeDelay = (delay, label) => (effect) => delay === undefined
|
|
61
61
|
? effect
|
|
62
62
|
: Effect.sleep(delay).pipe(Effect.withSpan(`${label}:delay(${delay})`), Effect.andThen(effect));
|
|
63
|
-
const testTimeout = IS_CI ? 30_000 : 1000;
|
|
64
|
-
const propTestTimeout = IS_CI ? 60_000 : 20_000;
|
|
63
|
+
const testTimeout = IS_CI === true ? 30_000 : 1000;
|
|
64
|
+
const propTestTimeout = IS_CI === true ? 60_000 : 20_000;
|
|
65
65
|
// TODO also make work without `Vitest.scopedLive` (i.e. with `Vitest.scoped`)
|
|
66
66
|
// probably requires controlling the clocks
|
|
67
67
|
Vitest.describe('webmesh node', { timeout: testTimeout }, () => {
|
|
@@ -136,7 +136,7 @@ Vitest.describe('webmesh node', { timeout: testTimeout }, () => {
|
|
|
136
136
|
});
|
|
137
137
|
yield* Effect.promise(() => nodeX.debug.requestTopology(100));
|
|
138
138
|
}).pipe(Vitest.withTestCtx(test, {
|
|
139
|
-
suffix: `delayX=${delayX} delayY=${delayY} connectDelay=${connectDelay} channelType=${channelType} nodeNames=${nodeNames}`,
|
|
139
|
+
suffix: `delayX=${delayX} delayY=${delayY} connectDelay=${connectDelay} channelType=${channelType} nodeNames=${nodeNames.join(',')}`,
|
|
140
140
|
})));
|
|
141
141
|
// const waitForOfflineDelay = undefined
|
|
142
142
|
// const sleepDelay = 0
|
|
@@ -267,7 +267,7 @@ Vitest.describe('webmesh node', { timeout: testTimeout }, () => {
|
|
|
267
267
|
});
|
|
268
268
|
yield* Effect.all([nodeXCode, nodeYCode], { concurrency: 'unbounded' });
|
|
269
269
|
}).pipe(Vitest.withTestCtx(test, {
|
|
270
|
-
suffix: `channelType=${channelType} nodeNames=${nodeNames}`,
|
|
270
|
+
suffix: `channelType=${channelType} nodeNames=${nodeNames.join(',')}`,
|
|
271
271
|
})), { fastCheck: { numRuns: 10 } });
|
|
272
272
|
Vitest.describe('TODO improve latency', () => {
|
|
273
273
|
// TODO we need to improve latency when sending messages concurrently
|
|
@@ -411,6 +411,193 @@ Vitest.describe('webmesh node', { timeout: testTimeout }, () => {
|
|
|
411
411
|
});
|
|
412
412
|
yield* Effect.all([nodeACode, nodeCCode], { concurrency: 'unbounded' });
|
|
413
413
|
}).pipe(Vitest.withTestCtx(test)));
|
|
414
|
+
/**
|
|
415
|
+
* Pattern test: ACK sending must not block message processing.
|
|
416
|
+
*
|
|
417
|
+
* This test documents the pattern where ACKs are sent fire-and-forget using `Effect.forkScoped`
|
|
418
|
+
* to avoid blocking the message processing loop.
|
|
419
|
+
*
|
|
420
|
+
* Background: Before the fix, ACKs were sent with `await` which blocked message processing.
|
|
421
|
+
* This caused heartbeat timeouts in devtools after ~30 seconds ("Connection to app lost").
|
|
422
|
+
*
|
|
423
|
+
* Note: This unit test passes both with and without the fix because in-memory channels
|
|
424
|
+
* complete ACK sends instantly. The actual regression test is the Playwright test
|
|
425
|
+
* `node-adapter-timeout.play.ts` which uses real network conditions.
|
|
426
|
+
*
|
|
427
|
+
* This test exists to:
|
|
428
|
+
* 1. Document the expected pattern (high message throughput via proxy channels)
|
|
429
|
+
* 2. Verify the pattern works correctly with forked ACKs
|
|
430
|
+
* 3. Serve as a reference for the fix in proxy-channel.ts
|
|
431
|
+
*/
|
|
432
|
+
Vitest.scopedLive('ACK sending should not block message processing', (test) => Effect.gen(function* () {
|
|
433
|
+
const nodeA = yield* makeMeshNode('A');
|
|
434
|
+
const nodeB = yield* makeMeshNode('B');
|
|
435
|
+
const nodeC = yield* makeMeshNode('C');
|
|
436
|
+
yield* connectNodesViaBroadcastChannel(nodeA, nodeB);
|
|
437
|
+
yield* connectNodesViaBroadcastChannel(nodeB, nodeC);
|
|
438
|
+
// Send many messages to stress the ACK handling
|
|
439
|
+
const messageCount = 10;
|
|
440
|
+
const nodeACode = Effect.gen(function* () {
|
|
441
|
+
const channelAToC = yield* createChannel(nodeA, 'C', { mode: 'proxy' });
|
|
442
|
+
// Send multiple messages concurrently
|
|
443
|
+
yield* Effect.forEach(Chunk.makeBy(messageCount, (i) => ({ message: `A${i}` })), channelAToC.send, { concurrency: 'unbounded' });
|
|
444
|
+
// Receive responses
|
|
445
|
+
const responses = yield* channelAToC.listen.pipe(Stream.flatten(), Stream.take(messageCount), Stream.runCollect);
|
|
446
|
+
expect(Chunk.size(responses)).toBe(messageCount);
|
|
447
|
+
});
|
|
448
|
+
const nodeCCode = Effect.gen(function* () {
|
|
449
|
+
const channelCToA = yield* createChannel(nodeC, 'A', { mode: 'proxy' });
|
|
450
|
+
// Send multiple messages concurrently
|
|
451
|
+
yield* Effect.forEach(Chunk.makeBy(messageCount, (i) => ({ message: `C${i}` })), channelCToA.send, { concurrency: 'unbounded' });
|
|
452
|
+
// Receive responses
|
|
453
|
+
const responses = yield* channelCToA.listen.pipe(Stream.flatten(), Stream.take(messageCount), Stream.runCollect);
|
|
454
|
+
expect(Chunk.size(responses)).toBe(messageCount);
|
|
455
|
+
});
|
|
456
|
+
yield* Effect.all([nodeACode, nodeCCode], { concurrency: 'unbounded' });
|
|
457
|
+
}).pipe(Vitest.withTestCtx(test)));
|
|
458
|
+
Vitest.describe('ACK forkScoped regression tests', { timeout: 10_000 }, () => {
|
|
459
|
+
/**
|
|
460
|
+
* REGRESSION TEST: ACK sends must be forked (non-blocking) to allow message processing to continue.
|
|
461
|
+
*
|
|
462
|
+
* This test uses simulation parameters to inject a delay BEFORE the ACK send.
|
|
463
|
+
* It then measures when messages arrive at the receiver's listen queue.
|
|
464
|
+
*
|
|
465
|
+
* With the fix (Effect.forkScoped):
|
|
466
|
+
* - ACK send is forked in the background
|
|
467
|
+
* - Message is added to listen queue IMMEDIATELY (before ACK send completes)
|
|
468
|
+
* - Multiple messages arrive close together regardless of ACK delay
|
|
469
|
+
*
|
|
470
|
+
* Without the fix (blocking yield*):
|
|
471
|
+
* - ACK send blocks the processing loop
|
|
472
|
+
* - Message is added to listen queue AFTER ACK send completes
|
|
473
|
+
* - Messages arrive spread out by the ACK delay
|
|
474
|
+
*
|
|
475
|
+
* To verify this test catches the regression:
|
|
476
|
+
* 1. Temporarily change `Effect.forkScoped` to `yield*` in proxy-channel.ts:319
|
|
477
|
+
* 2. Run this test - it should FAIL because messages arrive too slowly
|
|
478
|
+
* 3. Revert the change - test should PASS
|
|
479
|
+
*/
|
|
480
|
+
/**
|
|
481
|
+
* This test verifies the fix works: messages should arrive at the listen queue
|
|
482
|
+
* without being blocked by slow ACK sends. We measure how long it takes to receive
|
|
483
|
+
* all messages - with forked ACKs it should be fast, with blocking ACKs it would be slow.
|
|
484
|
+
*/
|
|
485
|
+
Vitest.scopedLive('messages arrive in listen queue without waiting for ACK send', (test) => Effect.gen(function* () {
|
|
486
|
+
const ACK_DELAY_MS = 50;
|
|
487
|
+
const MESSAGE_COUNT = 5;
|
|
488
|
+
const nodeA = yield* makeMeshNode('A');
|
|
489
|
+
const nodeB = yield* makeMeshNode('B');
|
|
490
|
+
yield* connectNodesViaMessageChannel(nodeA, nodeB);
|
|
491
|
+
const receivedMessages = [];
|
|
492
|
+
const senderCode = Effect.gen(function* () {
|
|
493
|
+
const channelAToB = yield* nodeA.makeChannel({
|
|
494
|
+
target: 'B',
|
|
495
|
+
channelName: 'test-ack-timing',
|
|
496
|
+
schema: ExampleSchema,
|
|
497
|
+
mode: 'proxy',
|
|
498
|
+
timeout: 3000,
|
|
499
|
+
});
|
|
500
|
+
// Send all messages concurrently - this is key!
|
|
501
|
+
// With forked ACKs, all messages get processed immediately at receiver
|
|
502
|
+
// With blocking ACKs, messages would be processed one at a time with delays
|
|
503
|
+
yield* Effect.forEach(Chunk.makeBy(MESSAGE_COUNT, (i) => ({ message: `msg${i}` })), channelAToB.send, { concurrency: 'unbounded' });
|
|
504
|
+
});
|
|
505
|
+
const receiverCode = Effect.gen(function* () {
|
|
506
|
+
const channelBToA = yield* nodeB.makeChannel({
|
|
507
|
+
target: 'A',
|
|
508
|
+
channelName: 'test-ack-timing',
|
|
509
|
+
schema: ExampleSchema,
|
|
510
|
+
mode: 'proxy',
|
|
511
|
+
timeout: 3000,
|
|
512
|
+
// KEY: Inject delay BEFORE ACK send
|
|
513
|
+
// With forkScoped: message arrives in queue immediately, then ACK is sent in background
|
|
514
|
+
// Without forkScoped: message waits for ACK delay before being added to queue
|
|
515
|
+
simulation: {
|
|
516
|
+
onPayload: {
|
|
517
|
+
beforeAckSend: ACK_DELAY_MS,
|
|
518
|
+
afterAckFork: 0,
|
|
519
|
+
afterListenQueueOffer: 0,
|
|
520
|
+
},
|
|
521
|
+
},
|
|
522
|
+
});
|
|
523
|
+
yield* channelBToA.listen.pipe(Stream.flatten(), Stream.tap((msg) => Effect.sync(() => {
|
|
524
|
+
receivedMessages.push(msg.message);
|
|
525
|
+
})), Stream.take(MESSAGE_COUNT), Stream.runDrain);
|
|
526
|
+
});
|
|
527
|
+
const startTime = Date.now();
|
|
528
|
+
yield* Effect.all([senderCode, receiverCode], { concurrency: 'unbounded' });
|
|
529
|
+
const elapsed = Date.now() - startTime;
|
|
530
|
+
console.log(`[regression-test-1] Received ${receivedMessages.length} messages in ${elapsed}ms`);
|
|
531
|
+
console.log(`[regression-test-1] Messages: ${receivedMessages.join(', ')}`);
|
|
532
|
+
expect(receivedMessages.length).toBe(MESSAGE_COUNT);
|
|
533
|
+
// With forked ACKs, elapsed time should be much less than MESSAGE_COUNT * ACK_DELAY_MS
|
|
534
|
+
// because ACKs don't block message processing
|
|
535
|
+
const blockingTime = MESSAGE_COUNT * ACK_DELAY_MS;
|
|
536
|
+
console.log(`[regression-test-1] Elapsed: ${elapsed}ms, Blocking estimate: ${blockingTime}ms`);
|
|
537
|
+
// The test passes if messages arrive faster than they would with blocking ACKs
|
|
538
|
+
// Allow some margin for test overhead (2x faster than blocking)
|
|
539
|
+
if (elapsed > blockingTime / 2) {
|
|
540
|
+
throw new Error(`REGRESSION DETECTED: Processing took ${elapsed}ms, blocking estimate: ${blockingTime}ms. ` +
|
|
541
|
+
`With forked ACKs, processing should be much faster. ` +
|
|
542
|
+
`Check that proxy-channel.ts uses Effect.forkScoped for ACK sends.`);
|
|
543
|
+
}
|
|
544
|
+
}).pipe(Vitest.withTestCtx(test)));
|
|
545
|
+
/**
|
|
546
|
+
* Additional test: Verify message processing continues during slow ACK sends.
|
|
547
|
+
*
|
|
548
|
+
* This test sends multiple messages concurrently and verifies they're all
|
|
549
|
+
* processed even when ACK sends are slow.
|
|
550
|
+
*/
|
|
551
|
+
Vitest.scopedLive('concurrent messages processed despite slow ACK sends', (test) => Effect.gen(function* () {
|
|
552
|
+
const ACK_DELAY_MS = 50;
|
|
553
|
+
const MESSAGE_COUNT = 5;
|
|
554
|
+
const nodeA = yield* makeMeshNode('A');
|
|
555
|
+
const nodeB = yield* makeMeshNode('B');
|
|
556
|
+
yield* connectNodesViaMessageChannel(nodeA, nodeB);
|
|
557
|
+
const receivedMessages = [];
|
|
558
|
+
const senderCode = Effect.gen(function* () {
|
|
559
|
+
const channelAToB = yield* nodeA.makeChannel({
|
|
560
|
+
target: 'B',
|
|
561
|
+
channelName: 'test-concurrent',
|
|
562
|
+
schema: ExampleSchema,
|
|
563
|
+
mode: 'proxy',
|
|
564
|
+
timeout: 3000,
|
|
565
|
+
});
|
|
566
|
+
// Send all messages concurrently
|
|
567
|
+
yield* Effect.forEach(Chunk.makeBy(MESSAGE_COUNT, (i) => ({ message: `msg${i}` })), channelAToB.send, { concurrency: 'unbounded' });
|
|
568
|
+
});
|
|
569
|
+
const receiverCode = Effect.gen(function* () {
|
|
570
|
+
const channelBToA = yield* nodeB.makeChannel({
|
|
571
|
+
target: 'A',
|
|
572
|
+
channelName: 'test-concurrent',
|
|
573
|
+
schema: ExampleSchema,
|
|
574
|
+
mode: 'proxy',
|
|
575
|
+
timeout: 3000,
|
|
576
|
+
simulation: {
|
|
577
|
+
onPayload: {
|
|
578
|
+
beforeAckSend: ACK_DELAY_MS,
|
|
579
|
+
afterAckFork: 0,
|
|
580
|
+
afterListenQueueOffer: 0,
|
|
581
|
+
},
|
|
582
|
+
},
|
|
583
|
+
});
|
|
584
|
+
yield* channelBToA.listen.pipe(Stream.flatten(), Stream.tap((msg) => Effect.sync(() => {
|
|
585
|
+
receivedMessages.push(msg.message);
|
|
586
|
+
})), Stream.take(MESSAGE_COUNT), Stream.runDrain);
|
|
587
|
+
});
|
|
588
|
+
const startTime = Date.now();
|
|
589
|
+
yield* Effect.all([senderCode, receiverCode], { concurrency: 'unbounded' });
|
|
590
|
+
const elapsed = Date.now() - startTime;
|
|
591
|
+
console.log(`[regression-test] Received ${receivedMessages.length} messages in ${elapsed}ms`);
|
|
592
|
+
console.log(`[regression-test] Messages: ${receivedMessages.join(', ')}`);
|
|
593
|
+
// All messages should be received
|
|
594
|
+
expect(receivedMessages.length).toBe(MESSAGE_COUNT);
|
|
595
|
+
// With forked ACKs, elapsed time should be much less than MESSAGE_COUNT * ACK_DELAY_MS
|
|
596
|
+
// because ACKs don't block message processing
|
|
597
|
+
const blockingTime = MESSAGE_COUNT * ACK_DELAY_MS;
|
|
598
|
+
console.log(`[regression-test] Elapsed: ${elapsed}ms, Blocking estimate: ${blockingTime}ms`);
|
|
599
|
+
}).pipe(Vitest.withTestCtx(test)));
|
|
600
|
+
});
|
|
414
601
|
Vitest.scopedLive('should fail with timeout due to missing edge', (test) => Effect.gen(function* () {
|
|
415
602
|
const nodeA = yield* makeMeshNode('A');
|
|
416
603
|
const nodeB = yield* makeMeshNode('B');
|
|
@@ -625,7 +812,7 @@ Vitest.describe('webmesh node', { timeout: testTimeout }, () => {
|
|
|
625
812
|
const nodeA = yield* makeMeshNode('A');
|
|
626
813
|
const nodeB = yield* makeMeshNode('B');
|
|
627
814
|
const nodeC = yield* makeMeshNode('C');
|
|
628
|
-
const mode = channelType.includes('proxy') ? 'proxy' : 'direct';
|
|
815
|
+
const mode = channelType.includes('proxy') === true ? 'proxy' : 'direct';
|
|
629
816
|
const connect = channelType === 'direct' ? connectNodesViaMessageChannel : connectNodesViaBroadcastChannel;
|
|
630
817
|
yield* connect(nodeA, nodeB).pipe(maybeDelay(delayConnectAB, 'delayConnectAB'));
|
|
631
818
|
yield* connect(nodeB, nodeC).pipe(maybeDelay(delayConnectBC, 'delayConnectBC'));
|