@livestore/webmesh 0.3.0-dev.4 → 0.3.0-dev.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +42 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/channel/direct-channel-internal.d.ts +26 -0
  4. package/dist/channel/direct-channel-internal.d.ts.map +1 -0
  5. package/dist/channel/direct-channel-internal.js +217 -0
  6. package/dist/channel/direct-channel-internal.js.map +1 -0
  7. package/dist/channel/direct-channel.d.ts +22 -0
  8. package/dist/channel/direct-channel.d.ts.map +1 -0
  9. package/dist/channel/direct-channel.js +153 -0
  10. package/dist/channel/direct-channel.js.map +1 -0
  11. package/dist/channel/proxy-channel.d.ts +3 -3
  12. package/dist/channel/proxy-channel.d.ts.map +1 -1
  13. package/dist/channel/proxy-channel.js +119 -37
  14. package/dist/channel/proxy-channel.js.map +1 -1
  15. package/dist/common.d.ts +47 -19
  16. package/dist/common.d.ts.map +1 -1
  17. package/dist/common.js +13 -5
  18. package/dist/common.js.map +1 -1
  19. package/dist/mesh-schema.d.ts +79 -13
  20. package/dist/mesh-schema.d.ts.map +1 -1
  21. package/dist/mesh-schema.js +59 -10
  22. package/dist/mesh-schema.js.map +1 -1
  23. package/dist/mod.d.ts +2 -2
  24. package/dist/mod.d.ts.map +1 -1
  25. package/dist/mod.js +2 -2
  26. package/dist/mod.js.map +1 -1
  27. package/dist/node.d.ts +51 -24
  28. package/dist/node.d.ts.map +1 -1
  29. package/dist/node.js +322 -111
  30. package/dist/node.js.map +1 -1
  31. package/dist/node.test.d.ts +1 -1
  32. package/dist/node.test.d.ts.map +1 -1
  33. package/dist/node.test.js +489 -157
  34. package/dist/node.test.js.map +1 -1
  35. package/dist/utils.d.ts +4 -4
  36. package/dist/utils.d.ts.map +1 -1
  37. package/dist/utils.js +7 -1
  38. package/dist/utils.js.map +1 -1
  39. package/dist/websocket-edge.d.ts +53 -0
  40. package/dist/websocket-edge.d.ts.map +1 -0
  41. package/dist/websocket-edge.js +89 -0
  42. package/dist/websocket-edge.js.map +1 -0
  43. package/package.json +10 -6
  44. package/src/channel/direct-channel-internal.ts +356 -0
  45. package/src/channel/direct-channel.ts +234 -0
  46. package/src/channel/proxy-channel.ts +344 -234
  47. package/src/common.ts +24 -17
  48. package/src/mesh-schema.ts +73 -20
  49. package/src/mod.ts +2 -2
  50. package/src/node.test.ts +723 -190
  51. package/src/node.ts +497 -152
  52. package/src/utils.ts +13 -2
  53. package/src/websocket-edge.ts +183 -0
  54. package/dist/channel/message-channel.d.ts +0 -20
  55. package/dist/channel/message-channel.d.ts.map +0 -1
  56. package/dist/channel/message-channel.js +0 -183
  57. package/dist/channel/message-channel.js.map +0 -1
  58. package/dist/websocket-connection.d.ts +0 -51
  59. package/dist/websocket-connection.d.ts.map +0 -1
  60. package/dist/websocket-connection.js +0 -74
  61. package/dist/websocket-connection.js.map +0 -1
  62. package/dist/websocket-server.d.ts +0 -7
  63. package/dist/websocket-server.d.ts.map +0 -1
  64. package/dist/websocket-server.js +0 -24
  65. package/dist/websocket-server.js.map +0 -1
  66. package/src/channel/message-channel.ts +0 -354
  67. package/src/websocket-connection.ts +0 -158
  68. package/src/websocket-server.ts +0 -40
  69. package/tsconfig.json +0 -11
package/dist/node.js CHANGED
@@ -1,35 +1,37 @@
1
- import { LS_DEV, shouldNeverHappen } from '@livestore/utils';
2
- import { Cause, Duration, Effect, Fiber, Option, PubSub, Queue, Schema, Stream, WebChannel, } from '@livestore/utils/effect';
3
- import { makeMessageChannel } from './channel/message-channel.js';
1
+ import { indent, LS_DEV, shouldNeverHappen } from '@livestore/utils';
2
+ import { Cause, Deferred, Duration, Effect, Exit, Fiber, Option, PubSub, Queue, Schema, Scope, Stream, WebChannel, } from '@livestore/utils/effect';
3
+ import { makeDirectChannel } from './channel/direct-channel.js';
4
4
  import { makeProxyChannel } from './channel/proxy-channel.js';
5
- import { ConnectionAlreadyExistsError, packetAsOtelAttributes } from './common.js';
6
- import * as MeshSchema from './mesh-schema.js';
5
+ import { EdgeAlreadyExistsError, packetAsOtelAttributes } from './common.js';
6
+ import * as WebmeshSchema from './mesh-schema.js';
7
7
  import { TimeoutSet } from './utils.js';
8
8
  export const makeMeshNode = (nodeName) => Effect.gen(function* () {
9
- const connectionChannels = new Map();
9
+ const edgeChannels = new Map();
10
10
  // To avoid unbounded memory growth, we automatically forget about packet ids after a while
11
- const handledPacketIds = new TimeoutSet({ timeout: Duration.minutes(1) });
12
- const newConnectionAvailablePubSub = yield* PubSub.unbounded().pipe(Effect.acquireRelease(PubSub.shutdown));
11
+ const handledPacketIds = yield* TimeoutSet.make(Duration.minutes(1));
12
+ const newEdgeAvailablePubSub = yield* PubSub.unbounded().pipe(Effect.acquireRelease(PubSub.shutdown));
13
13
  // const proxyPacketsToProcess = yield* Queue.unbounded<ProxyQueueItem>().pipe(Effect.acquireRelease(Queue.shutdown))
14
14
  // const messagePacketsToProcess = yield* Queue.unbounded<MessageQueueItem>().pipe(
15
15
  // Effect.acquireRelease(Queue.shutdown),
16
16
  // )
17
17
  const channelMap = new Map();
18
- const checkTransferableConnections = (packet) => {
19
- if ((packet._tag === 'MessageChannelRequest' &&
20
- (connectionChannels.size === 0 ||
21
- // Either if direct connection does not support transferables ...
22
- connectionChannels.get(packet.target)?.channel.supportsTransferables === false)) ||
23
- // ... or if no forward-connections support transferables
24
- ![...connectionChannels.values()].some((c) => c.channel.supportsTransferables === true)) {
25
- return MeshSchema.MessageChannelResponseNoTransferables.make({
18
+ const channelRequestsQueue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
19
+ const topologyRequestsMap = new Map();
20
+ const broadcastChannelListenQueueMap = new Map();
21
+ const checkTransferableEdges = (packet) => {
22
+ if ((packet._tag === 'DirectChannelRequest' &&
23
+ (edgeChannels.size === 0 ||
24
+ // Either if direct edge does not support transferables ...
25
+ edgeChannels.get(packet.target)?.channel.supportsTransferables === false)) ||
26
+ // ... or if no forward-edges support transferables
27
+ ![...edgeChannels.values()].some((c) => c.channel.supportsTransferables === true)) {
28
+ return WebmeshSchema.DirectChannelResponseNoTransferables.make({
26
29
  reqId: packet.id,
27
30
  channelName: packet.channelName,
28
31
  // NOTE for now we're "pretending" that the message is coming from the target node
29
32
  // even though we're already handling it here.
30
33
  // TODO we should clean this up at some point
31
34
  source: packet.target,
32
- // source: nodeName,
33
35
  target: packet.source,
34
36
  remainingHops: packet.hops,
35
37
  hops: [],
@@ -37,171 +39,380 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
37
39
  }
38
40
  };
39
41
  const sendPacket = (packet) => Effect.gen(function* () {
40
- if (Schema.is(MeshSchema.NetworkConnectionAdded)(packet)) {
41
- yield* Effect.spanEvent('NetworkConnectionAdded', { packet, nodeName });
42
- yield* PubSub.publish(newConnectionAvailablePubSub, packet.target);
43
- const connectionsToForwardTo = Array.from(connectionChannels)
42
+ // yield* Effect.log(`${nodeName}: sendPacket:${packet._tag} [${packet.id}]`)
43
+ if (Schema.is(WebmeshSchema.NetworkEdgeAdded)(packet)) {
44
+ yield* Effect.spanEvent('NetworkEdgeAdded', { packet, nodeName });
45
+ yield* PubSub.publish(newEdgeAvailablePubSub, packet.target);
46
+ const edgesToForwardTo = Array.from(edgeChannels)
44
47
  .filter(([name]) => name !== packet.source)
45
48
  .map(([_, con]) => con.channel);
46
- yield* Effect.forEach(connectionsToForwardTo, (con) => con.send(packet), { concurrency: 'unbounded' });
49
+ yield* Effect.forEach(edgesToForwardTo, (con) => con.send(packet), { concurrency: 'unbounded' });
47
50
  return;
48
51
  }
49
- // We have a direct connection to the target node
50
- if (connectionChannels.has(packet.target)) {
51
- const connectionChannel = connectionChannels.get(packet.target).channel;
52
+ if (Schema.is(WebmeshSchema.BroadcastChannelPacket)(packet)) {
53
+ const edgesToForwardTo = Array.from(edgeChannels)
54
+ .filter(([name]) => !packet.hops.includes(name))
55
+ .map(([_, con]) => con.channel);
56
+ const adjustedPacket = {
57
+ ...packet,
58
+ hops: [...packet.hops, nodeName],
59
+ };
60
+ yield* Effect.forEach(edgesToForwardTo, (con) => con.send(adjustedPacket), { concurrency: 'unbounded' });
61
+ // Don't emit the packet to the own node listen queue
62
+ if (packet.source === nodeName) {
63
+ return;
64
+ }
65
+ const queue = broadcastChannelListenQueueMap.get(packet.channelName);
66
+ // In case this node is listening to this channel, add the packet to the listen queue
67
+ if (queue !== undefined) {
68
+ yield* Queue.offer(queue, packet);
69
+ }
70
+ return;
71
+ }
72
+ if (Schema.is(WebmeshSchema.NetworkTopologyRequest)(packet)) {
73
+ if (packet.source !== nodeName) {
74
+ const backEdgeName = packet.hops.at(-1) ?? shouldNeverHappen(`${nodeName}: Expected hops for packet`, packet);
75
+ const backEdgeChannel = edgeChannels.get(backEdgeName).channel;
76
+ // Respond with own edge info
77
+ const response = WebmeshSchema.NetworkTopologyResponse.make({
78
+ reqId: packet.id,
79
+ source: packet.source,
80
+ target: packet.target,
81
+ remainingHops: packet.hops.slice(0, -1),
82
+ nodeName,
83
+ edges: Array.from(edgeChannels.keys()),
84
+ });
85
+ yield* backEdgeChannel.send(response);
86
+ }
87
+ // Forward the packet to all edges except the already visited ones
88
+ const edgesToForwardTo = Array.from(edgeChannels)
89
+ .filter(([name]) => !packet.hops.includes(name))
90
+ .map(([_, con]) => con.channel);
91
+ const adjustedPacket = {
92
+ ...packet,
93
+ hops: [...packet.hops, nodeName],
94
+ };
95
+ yield* Effect.forEach(edgesToForwardTo, (con) => con.send(adjustedPacket), { concurrency: 'unbounded' });
96
+ return;
97
+ }
98
+ if (Schema.is(WebmeshSchema.NetworkTopologyResponse)(packet)) {
99
+ if (packet.source === nodeName) {
100
+ const topologyRequestItem = topologyRequestsMap.get(packet.reqId);
101
+ topologyRequestItem.set(packet.nodeName, new Set(packet.edges));
102
+ }
103
+ else {
104
+ const remainingHops = packet.remainingHops;
105
+ // Forwarding the response to the original sender via the route back
106
+ const routeBack = remainingHops.at(-1) ?? shouldNeverHappen(`${nodeName}: Expected remaining hops for packet`, packet);
107
+ const edgeChannel = edgeChannels.get(routeBack)?.channel ??
108
+ shouldNeverHappen(`${nodeName}: Expected edge channel (${routeBack}) for packet`, packet, 'Available edges:', Array.from(edgeChannels.keys()));
109
+ yield* edgeChannel.send({ ...packet, remainingHops: packet.remainingHops.slice(0, -1) });
110
+ }
111
+ return;
112
+ }
113
+ // We have a direct edge to the target node
114
+ if (edgeChannels.has(packet.target)) {
115
+ const edgeChannel = edgeChannels.get(packet.target).channel;
52
116
  const hops = packet.source === nodeName ? [] : [...packet.hops, nodeName];
53
- yield* connectionChannel.send({ ...packet, hops });
117
+ yield* Effect.annotateCurrentSpan({ hasDirectEdge: true });
118
+ yield* edgeChannel.send({ ...packet, hops });
54
119
  }
55
120
  // In this case we have an expected route back we should follow
56
121
  // eslint-disable-next-line unicorn/no-negated-condition
57
122
  else if (packet.remainingHops !== undefined) {
58
- const hopTarget = packet.remainingHops[0] ?? shouldNeverHappen(`${nodeName}: Expected remaining hops for packet`, packet);
59
- const connectionChannel = connectionChannels.get(hopTarget)?.channel;
60
- if (connectionChannel === undefined) {
61
- yield* Effect.logWarning(`${nodeName}: Expected to find hop target ${hopTarget} in connections. Dropping packet.`, packet);
123
+ const hopTarget = packet.remainingHops.at(-1) ?? shouldNeverHappen(`${nodeName}: Expected remaining hops for packet`, packet);
124
+ const edgeChannel = edgeChannels.get(hopTarget)?.channel;
125
+ if (edgeChannel === undefined) {
126
+ yield* Effect.logWarning(`${nodeName}: Expected to find hop target ${hopTarget} in edges. Dropping packet.`, packet);
62
127
  return;
63
128
  }
64
- yield* connectionChannel.send({
129
+ yield* edgeChannel.send({
65
130
  ...packet,
66
- remainingHops: packet.remainingHops.slice(1),
131
+ remainingHops: packet.remainingHops.slice(0, -1),
67
132
  hops: [...packet.hops, nodeName],
68
133
  });
69
134
  }
70
- // No route found, forward to all connections
135
+ // No route found, forward to all edges
71
136
  else {
72
137
  const hops = packet.source === nodeName ? [] : [...packet.hops, nodeName];
73
- // Optimization: filter out connection where packet just came from
74
- const connectionsToForwardTo = Array.from(connectionChannels)
138
+ // Optimization: filter out edge where packet just came from
139
+ const edgesToForwardTo = Array.from(edgeChannels)
75
140
  .filter(([name]) => name !== packet.source)
76
- .map(([_, con]) => con.channel);
141
+ .map(([name, con]) => ({ name, channel: con.channel }));
77
142
  // TODO if hops-depth=0, we should fail right away with no route found
78
- if (hops.length === 0 && connectionsToForwardTo.length === 0 && LS_DEV) {
79
- console.log(nodeName, 'no route found', packet._tag, 'TODO handle better');
143
+ if (hops.length === 0 && edgesToForwardTo.length === 0 && LS_DEV) {
144
+ yield* Effect.logWarning(nodeName, 'no route found to', packet.target, packet._tag, 'TODO handle better');
80
145
  // TODO return a expected failure
81
146
  }
82
147
  const packetToSend = { ...packet, hops };
83
- yield* Effect.forEach(connectionsToForwardTo, (con) => con.send(packetToSend), { concurrency: 'unbounded' });
148
+ // console.debug(nodeName, 'sendPacket:forwarding', packetToSend)
149
+ yield* Effect.annotateCurrentSpan({ edgesToForwardTo: edgesToForwardTo.map(({ name }) => name) });
150
+ yield* Effect.forEach(edgesToForwardTo, ({ channel }) => channel.send(packetToSend), {
151
+ concurrency: 'unbounded',
152
+ });
84
153
  }
85
154
  }).pipe(Effect.withSpan(`sendPacket:${packet._tag}:${packet.source}→${packet.target}`, {
86
155
  attributes: packetAsOtelAttributes(packet),
87
156
  }), Effect.orDie);
88
- const addConnection = ({ target: targetNodeName, connectionChannel, replaceIfExists = false, }) => Effect.gen(function* () {
89
- if (connectionChannels.has(targetNodeName)) {
157
+ const addEdge = ({ target: targetNodeName, edgeChannel, replaceIfExists = false }) => Effect.gen(function* () {
158
+ if (edgeChannels.has(targetNodeName)) {
90
159
  if (replaceIfExists) {
91
- yield* removeConnection(targetNodeName).pipe(Effect.orDie);
92
- // console.log('interrupting', targetNodeName)
93
- // yield* Fiber.interrupt(connectionChannels.get(targetNodeName)!.listenFiber)
160
+ yield* removeEdge(targetNodeName).pipe(Effect.orDie);
94
161
  }
95
162
  else {
96
- return yield* new ConnectionAlreadyExistsError({ target: targetNodeName });
163
+ return yield* new EdgeAlreadyExistsError({ target: targetNodeName });
97
164
  }
98
165
  }
99
- // TODO use a priority queue instead to prioritize network-changes/connection-requests over payloads
100
- const listenFiber = yield* connectionChannel.listen.pipe(Stream.flatten(), Stream.tap((message) => Effect.gen(function* () {
101
- const packet = yield* Schema.decodeUnknown(MeshSchema.Packet)(message);
102
- // console.debug(nodeName, 'received', packet._tag, packet.source, packet.target)
166
+ // TODO use a priority queue instead to prioritize network-changes/edge-requests over payloads
167
+ const listenFiber = yield* edgeChannel.listen.pipe(Stream.flatten(), Stream.tap((message) => Effect.gen(function* () {
168
+ const packet = yield* Schema.decodeUnknown(WebmeshSchema.Packet)(message);
169
+ // console.debug(nodeName, 'recv', packet._tag, packet.source, packet.target)
103
170
  if (handledPacketIds.has(packet.id))
104
171
  return;
105
172
  handledPacketIds.add(packet.id);
106
- if (packet._tag === 'NetworkConnectionAdded') {
107
- yield* sendPacket(packet);
108
- }
109
- else if (packet.target === nodeName) {
110
- const channelKey = `${packet.source}-${packet.channelName}`;
111
- if (!channelMap.has(channelKey)) {
112
- const queue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
113
- channelMap.set(channelKey, { queue });
173
+ switch (packet._tag) {
174
+ case 'NetworkEdgeAdded':
175
+ case 'NetworkTopologyRequest':
176
+ case 'NetworkTopologyResponse': {
177
+ yield* sendPacket(packet);
178
+ break;
114
179
  }
115
- const queue = channelMap.get(channelKey).queue;
116
- const respondToSender = (outgoingPacket) => connectionChannel
117
- .send(outgoingPacket)
118
- .pipe(Effect.withSpan(`respondToSender:${outgoingPacket._tag}:${outgoingPacket.source}→${outgoingPacket.target}`, { attributes: packetAsOtelAttributes(outgoingPacket) }), Effect.orDie);
119
- if (Schema.is(MeshSchema.ProxyChannelPacket)(packet)) {
120
- yield* Queue.offer(queue, { packet, respondToSender });
121
- }
122
- else if (Schema.is(MeshSchema.MessageChannelPacket)(packet)) {
123
- yield* Queue.offer(queue, { packet, respondToSender });
124
- }
125
- }
126
- else {
127
- if (Schema.is(MeshSchema.MessageChannelPacket)(packet)) {
128
- const noTransferableResponse = checkTransferableConnections(packet);
129
- if (noTransferableResponse !== undefined) {
130
- yield* Effect.spanEvent(`No transferable connections found for ${packet.source}→${packet.target}`);
131
- return yield* connectionChannel.send(noTransferableResponse).pipe(Effect.withSpan(`sendNoTransferableResponse:${packet.source}→${packet.target}`, {
132
- attributes: packetAsOtelAttributes(noTransferableResponse),
133
- }));
180
+ default: {
181
+ if (packet.target === nodeName) {
182
+ const channelKey = `target:${packet.source}, channelName:${packet.channelName}`;
183
+ if (!channelMap.has(channelKey)) {
184
+ const channelQueue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
185
+ channelMap.set(channelKey, { queue: channelQueue, debugInfo: undefined });
186
+ }
187
+ const channelQueue = channelMap.get(channelKey).queue;
188
+ const respondToSender = (outgoingPacket) => edgeChannel
189
+ .send(outgoingPacket)
190
+ .pipe(Effect.withSpan(`respondToSender:${outgoingPacket._tag}:${outgoingPacket.source}→${outgoingPacket.target}`, { attributes: packetAsOtelAttributes(outgoingPacket) }), Effect.orDie);
191
+ if (Schema.is(WebmeshSchema.ProxyChannelPacket)(packet)) {
192
+ yield* Queue.offer(channelQueue, { packet, respondToSender });
193
+ }
194
+ else if (Schema.is(WebmeshSchema.DirectChannelPacket)(packet)) {
195
+ yield* Queue.offer(channelQueue, { packet, respondToSender });
196
+ }
197
+ if (packet._tag === 'ProxyChannelRequest' || packet._tag === 'DirectChannelRequest') {
198
+ yield* Queue.offer(channelRequestsQueue, {
199
+ channelName: packet.channelName,
200
+ source: packet.source,
201
+ mode: packet._tag === 'ProxyChannelRequest' ? 'proxy' : 'direct',
202
+ });
203
+ }
204
+ }
205
+ else {
206
+ if (Schema.is(WebmeshSchema.DirectChannelPacket)(packet)) {
207
+ const noTransferableResponse = checkTransferableEdges(packet);
208
+ if (noTransferableResponse !== undefined) {
209
+ yield* Effect.spanEvent(`No transferable edges found for ${packet.source}→${packet.target}`);
210
+ return yield* edgeChannel.send(noTransferableResponse).pipe(Effect.withSpan(`sendNoTransferableResponse:${packet.source}→${packet.target}`, {
211
+ attributes: packetAsOtelAttributes(noTransferableResponse),
212
+ }));
213
+ }
214
+ }
215
+ yield* sendPacket(packet);
134
216
  }
135
217
  }
136
- yield* sendPacket(packet);
137
218
  }
138
- })), Stream.runDrain, Effect.orDie, Effect.tapCauseLogPretty, Effect.forkScoped);
139
- connectionChannels.set(targetNodeName, { channel: connectionChannel, listenFiber });
140
- const connectionAddedPacket = MeshSchema.NetworkConnectionAdded.make({
219
+ })), Stream.runDrain, Effect.interruptible, Effect.orDie, Effect.tapCauseLogPretty, Effect.forkScoped);
220
+ edgeChannels.set(targetNodeName, { channel: edgeChannel, listenFiber });
221
+ const edgeAddedPacket = WebmeshSchema.NetworkEdgeAdded.make({
141
222
  source: nodeName,
142
223
  target: targetNodeName,
143
224
  });
144
- yield* sendPacket(connectionAddedPacket).pipe(Effect.ignoreLogged);
145
- }).pipe(Effect.withSpan(`addConnection:${nodeName}→${targetNodeName}`, {
146
- attributes: { supportsTransferables: connectionChannel.supportsTransferables },
225
+ yield* sendPacket(edgeAddedPacket).pipe(Effect.orDie);
226
+ }).pipe(Effect.annotateLogs({ 'addEdge:target': targetNodeName, nodeName }), Effect.withSpan(`addEdge:${nodeName}→${targetNodeName}`, {
227
+ attributes: { supportsTransferables: edgeChannel.supportsTransferables },
147
228
  })); // any-cast needed for error/never overload
148
- const removeConnection = (targetNodeName) => Effect.gen(function* () {
149
- if (!connectionChannels.has(targetNodeName)) {
150
- yield* new Cause.NoSuchElementException(`No connection found for ${targetNodeName}`);
229
+ const removeEdge = (targetNodeName) => Effect.gen(function* () {
230
+ if (!edgeChannels.has(targetNodeName)) {
231
+ yield* new Cause.NoSuchElementException(`No edge found for ${targetNodeName}`);
151
232
  }
152
- yield* Fiber.interrupt(connectionChannels.get(targetNodeName).listenFiber);
153
- connectionChannels.delete(targetNodeName);
233
+ yield* Fiber.interrupt(edgeChannels.get(targetNodeName).listenFiber);
234
+ edgeChannels.delete(targetNodeName);
154
235
  });
155
- // TODO add heartbeat to detect dead connections (for both e2e and proxying)
236
+ const hasChannel = ({ target, channelName }) => Effect.sync(() => channelMap.has(`target:${target}, channelName:${channelName}`));
237
+ // TODO add heartbeat to detect dead edges (for both e2e and proxying)
156
238
  // TODO when a channel is established in the same origin, we can use a weblock to detect disconnects
157
239
  const makeChannel = ({ target, channelName, schema: inputSchema,
158
- // TODO in the future we could have a mode that prefers messagechannels and then falls back to proxies if needed
240
+ // TODO in the future we could have a mode that prefers directs and then falls back to proxies if needed
159
241
  mode, timeout = Duration.seconds(1), }) => Effect.gen(function* () {
160
242
  const schema = WebChannel.mapSchema(inputSchema);
161
- const channelKey = `${target}-${channelName}`;
162
- if (!channelMap.has(channelKey)) {
163
- const queue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
164
- channelMap.set(channelKey, { queue });
243
+ const channelKey = `target:${target}, channelName:${channelName}`;
244
+ if (channelMap.has(channelKey)) {
245
+ const existingChannel = channelMap.get(channelKey).debugInfo?.channel;
246
+ if (existingChannel) {
247
+ shouldNeverHappen(`Channel ${channelKey} already exists`, existingChannel);
248
+ }
165
249
  }
166
- const queue = channelMap.get(channelKey).queue;
250
+ else {
251
+ const channelQueue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
252
+ channelMap.set(channelKey, { queue: channelQueue, debugInfo: undefined });
253
+ }
254
+ const channelQueue = channelMap.get(channelKey).queue;
167
255
  yield* Effect.addFinalizer(() => Effect.sync(() => channelMap.delete(channelKey)));
168
- if (mode === 'messagechannel') {
169
- // console.debug(nodeName, 'message mode', modeRef.current)
256
+ if (mode === 'direct') {
257
+ const incomingPacketsQueue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
258
+ // We're we're draining the queue into another new queue.
259
+ // It's a bit of a mystery why this is needed, since the unit tests also work without it.
260
+ // But for the LiveStore devtools to actually work, we need to do this.
261
+ // We should figure out some day why this is needed and further simplify if possible.
262
+ yield* Queue.takeBetween(channelQueue, 1, 10).pipe(Effect.tap((_) => Queue.offerAll(incomingPacketsQueue, _)), Effect.forever, Effect.interruptible, Effect.tapCauseLogPretty, Effect.forkScoped);
170
263
  // NOTE already retries internally when transferables are required
171
- return yield* makeMessageChannel({
264
+ const { webChannel, initialEdgeDeferred } = yield* makeDirectChannel({
172
265
  nodeName,
173
- queue,
174
- newConnectionAvailablePubSub,
266
+ incomingPacketsQueue,
267
+ newEdgeAvailablePubSub,
175
268
  target,
176
269
  channelName,
177
270
  schema,
178
271
  sendPacket,
179
- checkTransferableConnections,
272
+ checkTransferableEdges,
180
273
  });
274
+ channelMap.set(channelKey, { queue: channelQueue, debugInfo: { channel: webChannel, target } });
275
+ yield* initialEdgeDeferred;
276
+ return webChannel;
181
277
  }
182
278
  else {
183
- return yield* makeProxyChannel({
279
+ const channel = yield* makeProxyChannel({
184
280
  nodeName,
185
- newConnectionAvailablePubSub,
281
+ newEdgeAvailablePubSub,
186
282
  target,
187
283
  channelName,
188
284
  schema,
189
- queue,
285
+ queue: channelQueue,
190
286
  sendPacket,
191
287
  });
288
+ channelMap.set(channelKey, { queue: channelQueue, debugInfo: { channel, target } });
289
+ return channel;
192
290
  }
193
- }).pipe(Effect.withSpanScoped(`makeChannel:${nodeName}→${target}(${channelName})`, {
291
+ }).pipe(
292
+ // Effect.timeout(timeout),
293
+ Effect.withSpanScoped(`makeChannel:${nodeName}→${target}(${channelName})`, {
194
294
  attributes: { target, channelName, mode, timeout },
195
- }), Effect.annotateLogs({ nodeName }));
196
- const connectionKeys = Effect.sync(() => new Set(connectionChannels.keys()));
295
+ }), Effect.annotateLogs({ nodeName, target, channelName }));
296
+ // TODO consider supporting multiple listeners
297
+ // TODO also provide a way to allow for reconnects
298
+ let listenAlreadyStarted = false;
299
+ const listenForChannel = Stream.suspend(() => {
300
+ if (listenAlreadyStarted) {
301
+ return shouldNeverHappen('listenForChannel already started');
302
+ }
303
+ listenAlreadyStarted = true;
304
+ const hash = (res) => `${res.channelName}:${res.source}:${res.mode}`;
305
+ const seen = new Set();
306
+ return Stream.fromQueue(channelRequestsQueue).pipe(Stream.filter((res) => {
307
+ const hashed = hash(res);
308
+ if (seen.has(hashed)) {
309
+ return false;
310
+ }
311
+ seen.add(hashed);
312
+ return true;
313
+ }));
314
+ });
315
+ const makeBroadcastChannel = ({ channelName, schema }) => Effect.scopeWithCloseable((scope) => Effect.gen(function* () {
316
+ if (broadcastChannelListenQueueMap.has(channelName)) {
317
+ return shouldNeverHappen(`Broadcast channel ${channelName} already exists`, broadcastChannelListenQueueMap.get(channelName));
318
+ }
319
+ const debugInfo = {};
320
+ const queue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
321
+ broadcastChannelListenQueueMap.set(channelName, queue);
322
+ const send = (message) => Effect.gen(function* () {
323
+ const payload = yield* Schema.encode(schema)(message);
324
+ const packet = WebmeshSchema.BroadcastChannelPacket.make({
325
+ channelName,
326
+ payload,
327
+ source: nodeName,
328
+ target: '-',
329
+ hops: [],
330
+ });
331
+ yield* sendPacket(packet);
332
+ });
333
+ const listen = Stream.fromQueue(queue).pipe(Stream.filter(Schema.is(WebmeshSchema.BroadcastChannelPacket)), Stream.map((_) => Schema.decodeEither(schema)(_.payload)));
334
+ const closedDeferred = yield* Deferred.make().pipe(Effect.acquireRelease(Deferred.done(Exit.void)));
335
+ return {
336
+ [WebChannel.WebChannelSymbol]: WebChannel.WebChannelSymbol,
337
+ send,
338
+ listen,
339
+ closedDeferred,
340
+ supportsTransferables: false,
341
+ schema: { listen: schema, send: schema },
342
+ shutdown: Scope.close(scope, Exit.void),
343
+ debugInfo,
344
+ };
345
+ }));
346
+ const edgeKeys = Effect.sync(() => new Set(edgeChannels.keys()));
347
+ const runtime = yield* Effect.runtime();
197
348
  const debug = {
198
- printChannelQueues: () => {
349
+ print: () => {
350
+ console.log('Webmesh debug info for node:', nodeName);
351
+ console.log('Edges:', edgeChannels.size);
352
+ for (const [key, value] of edgeChannels) {
353
+ console.log(` ${key}: supportsTransferables=${value.channel.supportsTransferables}`);
354
+ }
199
355
  console.log('Channels:', channelMap.size);
200
356
  for (const [key, value] of channelMap) {
201
- console.log(`${key}: ${value.queue.unsafeSize().pipe(Option.getOrUndefined)}`, value.queue);
357
+ console.log(indent(key, 2), '\n', Object.entries({
358
+ target: value.debugInfo?.target,
359
+ supportsTransferables: value.debugInfo?.channel.supportsTransferables,
360
+ ...value.debugInfo?.channel.debugInfo,
361
+ })
362
+ .map(([key, value]) => indent(`${key}=${value}`, 4))
363
+ .join('\n'), ' ', value.debugInfo?.channel, '\n', indent(`Queue: ${value.queue.unsafeSize().pipe(Option.getOrUndefined)}`, 4), value.queue);
364
+ }
365
+ console.log('Broadcast channels:', broadcastChannelListenQueueMap.size);
366
+ for (const [key, _value] of broadcastChannelListenQueueMap) {
367
+ console.log(indent(key, 2));
202
368
  }
203
369
  },
370
+ ping: (payload) => {
371
+ Effect.gen(function* () {
372
+ const msg = (via) => WebChannel.DebugPingMessage.make({ message: `ping from ${nodeName} via ${via}`, payload });
373
+ for (const [channelName, con] of edgeChannels) {
374
+ yield* Effect.logDebug(`sending ping via edge ${channelName}`);
375
+ yield* con.channel.send(msg(`edge ${channelName}`));
376
+ }
377
+ for (const [channelKey, channel] of channelMap) {
378
+ if (channel.debugInfo === undefined) {
379
+ yield* Effect.logDebug(`channel ${channelKey} has no debug info`);
380
+ continue;
381
+ }
382
+ // if (channel.debugInfo === undefined) continue
383
+ yield* Effect.logDebug(`sending ping via channel ${channelKey}`);
384
+ yield* channel.debugInfo.channel.send(msg(`channel ${channelKey}`));
385
+ }
386
+ }).pipe(Effect.provide(runtime), Effect.tapCauseLogPretty, Effect.runFork);
387
+ },
388
+ requestTopology: (timeoutMs = 1000) => Effect.gen(function* () {
389
+ const packet = WebmeshSchema.NetworkTopologyRequest.make({
390
+ source: nodeName,
391
+ target: '-',
392
+ hops: [],
393
+ });
394
+ const item = new Map();
395
+ item.set(nodeName, new Set(edgeChannels.keys()));
396
+ topologyRequestsMap.set(packet.id, item);
397
+ yield* sendPacket(packet);
398
+ yield* Effect.logDebug(`Waiting ${timeoutMs}ms for topology response`);
399
+ yield* Effect.sleep(timeoutMs);
400
+ yield* Effect.logDebug(`Topology response (from ${nodeName}):`);
401
+ for (const [key, value] of item) {
402
+ yield* Effect.logDebug(` node '${key}' has edge to: ${Array.from(value.values()).join(', ')}`);
403
+ }
404
+ }).pipe(Effect.provide(runtime), Effect.tapCauseLogPretty, Effect.runPromise),
405
+ };
406
+ return {
407
+ nodeName,
408
+ addEdge,
409
+ removeEdge,
410
+ hasChannel,
411
+ makeChannel,
412
+ listenForChannel,
413
+ makeBroadcastChannel,
414
+ edgeKeys,
415
+ debug,
204
416
  };
205
- return { nodeName, addConnection, removeConnection, makeChannel, connectionKeys, debug };
206
- }).pipe(Effect.withSpan(`makeMeshNode:${nodeName}`));
417
+ }).pipe(Effect.withSpan(`makeMeshNode:${nodeName}`), Effect.annotateLogs({ 'makeMeshNode.nodeName': nodeName }));
207
418
  //# sourceMappingURL=node.js.map
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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"}
@@ -1,2 +1,2 @@
1
- export {};
1
+ import '@livestore/utils-dev/node-vitest-polyfill';
2
2
  //# sourceMappingURL=node.test.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.test.d.ts","sourceRoot":"","sources":["../src/node.test.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"node.test.d.ts","sourceRoot":"","sources":["../src/node.test.ts"],"names":[],"mappings":"AAAA,OAAO,2CAA2C,CAAA"}