@livestore/webmesh 0.3.0-dev.3 → 0.3.0-dev.31

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 (64) hide show
  1. package/README.md +26 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/channel/message-channel-internal.d.ts +26 -0
  4. package/dist/channel/message-channel-internal.d.ts.map +1 -0
  5. package/dist/channel/message-channel-internal.js +217 -0
  6. package/dist/channel/message-channel-internal.js.map +1 -0
  7. package/dist/channel/message-channel.d.ts +21 -19
  8. package/dist/channel/message-channel.d.ts.map +1 -1
  9. package/dist/channel/message-channel.js +132 -162
  10. package/dist/channel/message-channel.js.map +1 -1
  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 +38 -19
  14. package/dist/channel/proxy-channel.js.map +1 -1
  15. package/dist/common.d.ts +36 -14
  16. package/dist/common.d.ts.map +1 -1
  17. package/dist/common.js +7 -4
  18. package/dist/common.js.map +1 -1
  19. package/dist/mesh-schema.d.ts +71 -5
  20. package/dist/mesh-schema.d.ts.map +1 -1
  21. package/dist/mesh-schema.js +55 -6
  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 +43 -21
  28. package/dist/node.d.ts.map +1 -1
  29. package/dist/node.js +273 -100
  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 +391 -156
  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 +52 -0
  40. package/dist/websocket-edge.d.ts.map +1 -0
  41. package/dist/websocket-edge.js +85 -0
  42. package/dist/websocket-edge.js.map +1 -0
  43. package/package.json +5 -6
  44. package/src/channel/message-channel-internal.ts +356 -0
  45. package/src/channel/message-channel.ts +190 -310
  46. package/src/channel/proxy-channel.ts +259 -231
  47. package/src/common.ts +12 -13
  48. package/src/mesh-schema.ts +62 -6
  49. package/src/mod.ts +2 -2
  50. package/src/node.test.ts +554 -189
  51. package/src/node.ts +421 -138
  52. package/src/utils.ts +13 -2
  53. package/src/websocket-edge.ts +177 -0
  54. package/tmp/pack.tgz +0 -0
  55. package/dist/websocket-connection.d.ts +0 -51
  56. package/dist/websocket-connection.d.ts.map +0 -1
  57. package/dist/websocket-connection.js +0 -74
  58. package/dist/websocket-connection.js.map +0 -1
  59. package/dist/websocket-server.d.ts +0 -7
  60. package/dist/websocket-server.d.ts.map +0 -1
  61. package/dist/websocket-server.js +0 -24
  62. package/dist/websocket-server.js.map +0 -1
  63. package/src/websocket-connection.ts +0 -158
  64. package/src/websocket-server.ts +0 -40
package/dist/node.js CHANGED
@@ -1,35 +1,36 @@
1
- import { LS_DEV, shouldNeverHappen } from '@livestore/utils';
2
- import { Cause, Duration, Effect, Fiber, Option, PubSub, Queue, Schema, Stream, WebChannel, } from '@livestore/utils/effect';
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
3
  import { makeMessageChannel } from './channel/message-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) => {
18
+ const topologyRequestsMap = new Map();
19
+ const broadcastChannelListenQueueMap = new Map();
20
+ const checkTransferableEdges = (packet) => {
19
21
  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({
22
+ (edgeChannels.size === 0 ||
23
+ // Either if direct edge does not support transferables ...
24
+ edgeChannels.get(packet.target)?.channel.supportsTransferables === false)) ||
25
+ // ... or if no forward-edges support transferables
26
+ ![...edgeChannels.values()].some((c) => c.channel.supportsTransferables === true)) {
27
+ return WebmeshSchema.MessageChannelResponseNoTransferables.make({
26
28
  reqId: packet.id,
27
29
  channelName: packet.channelName,
28
30
  // NOTE for now we're "pretending" that the message is coming from the target node
29
31
  // even though we're already handling it here.
30
32
  // TODO we should clean this up at some point
31
33
  source: packet.target,
32
- // source: nodeName,
33
34
  target: packet.source,
34
35
  remainingHops: packet.hops,
35
36
  hops: [],
@@ -37,171 +38,343 @@ export const makeMeshNode = (nodeName) => Effect.gen(function* () {
37
38
  }
38
39
  };
39
40
  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)
41
+ // yield* Effect.log(`${nodeName}: sendPacket:${packet._tag} [${packet.id}]`)
42
+ if (Schema.is(WebmeshSchema.NetworkEdgeAdded)(packet)) {
43
+ yield* Effect.spanEvent('NetworkEdgeAdded', { packet, nodeName });
44
+ yield* PubSub.publish(newEdgeAvailablePubSub, packet.target);
45
+ const edgesToForwardTo = Array.from(edgeChannels)
44
46
  .filter(([name]) => name !== packet.source)
45
47
  .map(([_, con]) => con.channel);
46
- yield* Effect.forEach(connectionsToForwardTo, (con) => con.send(packet), { concurrency: 'unbounded' });
48
+ yield* Effect.forEach(edgesToForwardTo, (con) => con.send(packet), { concurrency: 'unbounded' });
47
49
  return;
48
50
  }
49
- // We have a direct connection to the target node
50
- if (connectionChannels.has(packet.target)) {
51
- const connectionChannel = connectionChannels.get(packet.target).channel;
51
+ if (Schema.is(WebmeshSchema.BroadcastChannelPacket)(packet)) {
52
+ const edgesToForwardTo = Array.from(edgeChannels)
53
+ .filter(([name]) => !packet.hops.includes(name))
54
+ .map(([_, con]) => con.channel);
55
+ const adjustedPacket = {
56
+ ...packet,
57
+ hops: [...packet.hops, nodeName],
58
+ };
59
+ yield* Effect.forEach(edgesToForwardTo, (con) => con.send(adjustedPacket), { concurrency: 'unbounded' });
60
+ // Don't emit the packet to the own node listen queue
61
+ if (packet.source === nodeName) {
62
+ return;
63
+ }
64
+ const queue = broadcastChannelListenQueueMap.get(packet.channelName);
65
+ // In case this node is listening to this channel, add the packet to the listen queue
66
+ if (queue !== undefined) {
67
+ yield* Queue.offer(queue, packet);
68
+ }
69
+ return;
70
+ }
71
+ if (Schema.is(WebmeshSchema.NetworkTopologyRequest)(packet)) {
72
+ if (packet.source !== nodeName) {
73
+ const backEdgeName = packet.hops.at(-1) ?? shouldNeverHappen(`${nodeName}: Expected hops for packet`, packet);
74
+ const backEdgeChannel = edgeChannels.get(backEdgeName).channel;
75
+ // Respond with own edge info
76
+ const response = WebmeshSchema.NetworkTopologyResponse.make({
77
+ reqId: packet.id,
78
+ source: packet.source,
79
+ target: packet.target,
80
+ remainingHops: packet.hops.slice(0, -1),
81
+ nodeName,
82
+ edges: Array.from(edgeChannels.keys()),
83
+ });
84
+ yield* backEdgeChannel.send(response);
85
+ }
86
+ // Forward the packet to all edges except the already visited ones
87
+ const edgesToForwardTo = Array.from(edgeChannels)
88
+ .filter(([name]) => !packet.hops.includes(name))
89
+ .map(([_, con]) => con.channel);
90
+ const adjustedPacket = {
91
+ ...packet,
92
+ hops: [...packet.hops, nodeName],
93
+ };
94
+ yield* Effect.forEach(edgesToForwardTo, (con) => con.send(adjustedPacket), { concurrency: 'unbounded' });
95
+ return;
96
+ }
97
+ if (Schema.is(WebmeshSchema.NetworkTopologyResponse)(packet)) {
98
+ if (packet.source === nodeName) {
99
+ const topologyRequestItem = topologyRequestsMap.get(packet.reqId);
100
+ topologyRequestItem.set(packet.nodeName, new Set(packet.edges));
101
+ }
102
+ else {
103
+ const remainingHops = packet.remainingHops;
104
+ // Forwarding the response to the original sender via the route back
105
+ const routeBack = remainingHops.at(-1) ?? shouldNeverHappen(`${nodeName}: Expected remaining hops for packet`, packet);
106
+ const edgeChannel = edgeChannels.get(routeBack)?.channel ??
107
+ shouldNeverHappen(`${nodeName}: Expected edge channel (${routeBack}) for packet`, packet, 'Available edges:', Array.from(edgeChannels.keys()));
108
+ yield* edgeChannel.send({ ...packet, remainingHops: packet.remainingHops.slice(0, -1) });
109
+ }
110
+ return;
111
+ }
112
+ // We have a direct edge to the target node
113
+ if (edgeChannels.has(packet.target)) {
114
+ const edgeChannel = edgeChannels.get(packet.target).channel;
52
115
  const hops = packet.source === nodeName ? [] : [...packet.hops, nodeName];
53
- yield* connectionChannel.send({ ...packet, hops });
116
+ yield* edgeChannel.send({ ...packet, hops });
54
117
  }
55
118
  // In this case we have an expected route back we should follow
56
119
  // eslint-disable-next-line unicorn/no-negated-condition
57
120
  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);
121
+ const hopTarget = packet.remainingHops.at(-1) ?? shouldNeverHappen(`${nodeName}: Expected remaining hops for packet`, packet);
122
+ const edgeChannel = edgeChannels.get(hopTarget)?.channel;
123
+ if (edgeChannel === undefined) {
124
+ yield* Effect.logWarning(`${nodeName}: Expected to find hop target ${hopTarget} in edges. Dropping packet.`, packet);
62
125
  return;
63
126
  }
64
- yield* connectionChannel.send({
127
+ yield* edgeChannel.send({
65
128
  ...packet,
66
- remainingHops: packet.remainingHops.slice(1),
129
+ remainingHops: packet.remainingHops.slice(0, -1),
67
130
  hops: [...packet.hops, nodeName],
68
131
  });
69
132
  }
70
- // No route found, forward to all connections
133
+ // No route found, forward to all edges
71
134
  else {
72
135
  const hops = packet.source === nodeName ? [] : [...packet.hops, nodeName];
73
- // Optimization: filter out connection where packet just came from
74
- const connectionsToForwardTo = Array.from(connectionChannels)
136
+ // Optimization: filter out edge where packet just came from
137
+ const edgesToForwardTo = Array.from(edgeChannels)
75
138
  .filter(([name]) => name !== packet.source)
76
139
  .map(([_, con]) => con.channel);
77
140
  // TODO if hops-depth=0, we should fail right away with no route found
78
- if (hops.length === 0 && connectionsToForwardTo.length === 0 && LS_DEV) {
141
+ if (hops.length === 0 && edgesToForwardTo.length === 0 && LS_DEV) {
79
142
  console.log(nodeName, 'no route found', packet._tag, 'TODO handle better');
80
143
  // TODO return a expected failure
81
144
  }
82
145
  const packetToSend = { ...packet, hops };
83
- yield* Effect.forEach(connectionsToForwardTo, (con) => con.send(packetToSend), { concurrency: 'unbounded' });
146
+ // console.debug(nodeName, 'sendPacket:forwarding', packetToSend)
147
+ yield* Effect.forEach(edgesToForwardTo, (con) => con.send(packetToSend), { concurrency: 'unbounded' });
84
148
  }
85
149
  }).pipe(Effect.withSpan(`sendPacket:${packet._tag}:${packet.source}→${packet.target}`, {
86
150
  attributes: packetAsOtelAttributes(packet),
87
151
  }), Effect.orDie);
88
- const addConnection = ({ target: targetNodeName, connectionChannel, replaceIfExists = false, }) => Effect.gen(function* () {
89
- if (connectionChannels.has(targetNodeName)) {
152
+ const addEdge = ({ target: targetNodeName, edgeChannel, replaceIfExists = false }) => Effect.gen(function* () {
153
+ if (edgeChannels.has(targetNodeName)) {
90
154
  if (replaceIfExists) {
91
- yield* removeConnection(targetNodeName).pipe(Effect.orDie);
92
- // console.log('interrupting', targetNodeName)
93
- // yield* Fiber.interrupt(connectionChannels.get(targetNodeName)!.listenFiber)
155
+ yield* removeEdge(targetNodeName).pipe(Effect.orDie);
94
156
  }
95
157
  else {
96
- return yield* new ConnectionAlreadyExistsError({ target: targetNodeName });
158
+ return yield* new EdgeAlreadyExistsError({ target: targetNodeName });
97
159
  }
98
160
  }
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);
161
+ // TODO use a priority queue instead to prioritize network-changes/edge-requests over payloads
162
+ const listenFiber = yield* edgeChannel.listen.pipe(Stream.flatten(), Stream.tap((message) => Effect.gen(function* () {
163
+ const packet = yield* Schema.decodeUnknown(WebmeshSchema.Packet)(message);
102
164
  // console.debug(nodeName, 'received', packet._tag, packet.source, packet.target)
103
165
  if (handledPacketIds.has(packet.id))
104
166
  return;
105
167
  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 });
114
- }
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 });
168
+ switch (packet._tag) {
169
+ case 'NetworkEdgeAdded':
170
+ case 'NetworkTopologyRequest':
171
+ case 'NetworkTopologyResponse': {
172
+ yield* sendPacket(packet);
173
+ break;
124
174
  }
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
- }));
175
+ default: {
176
+ if (packet.target === nodeName) {
177
+ const channelKey = `target:${packet.source}, channelName:${packet.channelName}`;
178
+ if (!channelMap.has(channelKey)) {
179
+ const queue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
180
+ channelMap.set(channelKey, { queue, debugInfo: undefined });
181
+ }
182
+ const queue = channelMap.get(channelKey).queue;
183
+ const respondToSender = (outgoingPacket) => edgeChannel
184
+ .send(outgoingPacket)
185
+ .pipe(Effect.withSpan(`respondToSender:${outgoingPacket._tag}:${outgoingPacket.source}→${outgoingPacket.target}`, { attributes: packetAsOtelAttributes(outgoingPacket) }), Effect.orDie);
186
+ if (Schema.is(WebmeshSchema.ProxyChannelPacket)(packet)) {
187
+ yield* Queue.offer(queue, { packet, respondToSender });
188
+ }
189
+ else if (Schema.is(WebmeshSchema.MessageChannelPacket)(packet)) {
190
+ yield* Queue.offer(queue, { packet, respondToSender });
191
+ }
192
+ }
193
+ else {
194
+ if (Schema.is(WebmeshSchema.MessageChannelPacket)(packet)) {
195
+ const noTransferableResponse = checkTransferableEdges(packet);
196
+ if (noTransferableResponse !== undefined) {
197
+ yield* Effect.spanEvent(`No transferable edges found for ${packet.source}→${packet.target}`);
198
+ return yield* edgeChannel.send(noTransferableResponse).pipe(Effect.withSpan(`sendNoTransferableResponse:${packet.source}→${packet.target}`, {
199
+ attributes: packetAsOtelAttributes(noTransferableResponse),
200
+ }));
201
+ }
202
+ }
203
+ yield* sendPacket(packet);
134
204
  }
135
205
  }
136
- yield* sendPacket(packet);
137
206
  }
138
- })), Stream.runDrain, Effect.orDie, Effect.tapCauseLogPretty, Effect.forkScoped);
139
- connectionChannels.set(targetNodeName, { channel: connectionChannel, listenFiber });
140
- const connectionAddedPacket = MeshSchema.NetworkConnectionAdded.make({
207
+ })), Stream.runDrain, Effect.interruptible, Effect.orDie, Effect.tapCauseLogPretty, Effect.forkScoped);
208
+ edgeChannels.set(targetNodeName, { channel: edgeChannel, listenFiber });
209
+ const edgeAddedPacket = WebmeshSchema.NetworkEdgeAdded.make({
141
210
  source: nodeName,
142
211
  target: targetNodeName,
143
212
  });
144
- yield* sendPacket(connectionAddedPacket).pipe(Effect.ignoreLogged);
145
- }).pipe(Effect.withSpan(`addConnection:${nodeName}→${targetNodeName}`, {
146
- attributes: { supportsTransferables: connectionChannel.supportsTransferables },
213
+ yield* sendPacket(edgeAddedPacket).pipe(Effect.orDie);
214
+ }).pipe(Effect.annotateLogs({ 'addEdge:target': targetNodeName }), Effect.withSpan(`addEdge:${nodeName}→${targetNodeName}`, {
215
+ attributes: { supportsTransferables: edgeChannel.supportsTransferables },
147
216
  })); // 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}`);
217
+ const removeEdge = (targetNodeName) => Effect.gen(function* () {
218
+ if (!edgeChannels.has(targetNodeName)) {
219
+ yield* new Cause.NoSuchElementException(`No edge found for ${targetNodeName}`);
151
220
  }
152
- yield* Fiber.interrupt(connectionChannels.get(targetNodeName).listenFiber);
153
- connectionChannels.delete(targetNodeName);
221
+ yield* Fiber.interrupt(edgeChannels.get(targetNodeName).listenFiber);
222
+ edgeChannels.delete(targetNodeName);
154
223
  });
155
- // TODO add heartbeat to detect dead connections (for both e2e and proxying)
224
+ // TODO add heartbeat to detect dead edges (for both e2e and proxying)
156
225
  // TODO when a channel is established in the same origin, we can use a weblock to detect disconnects
157
226
  const makeChannel = ({ target, channelName, schema: inputSchema,
158
227
  // TODO in the future we could have a mode that prefers messagechannels and then falls back to proxies if needed
159
228
  mode, timeout = Duration.seconds(1), }) => Effect.gen(function* () {
160
229
  const schema = WebChannel.mapSchema(inputSchema);
161
- const channelKey = `${target}-${channelName}`;
162
- if (!channelMap.has(channelKey)) {
230
+ const channelKey = `target:${target}, channelName:${channelName}`;
231
+ if (channelMap.has(channelKey)) {
232
+ const existingChannel = channelMap.get(channelKey).debugInfo?.channel;
233
+ if (existingChannel) {
234
+ shouldNeverHappen(`Channel ${channelKey} already exists`, existingChannel);
235
+ }
236
+ }
237
+ else {
163
238
  const queue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
164
- channelMap.set(channelKey, { queue });
239
+ channelMap.set(channelKey, { queue, debugInfo: undefined });
165
240
  }
166
241
  const queue = channelMap.get(channelKey).queue;
167
242
  yield* Effect.addFinalizer(() => Effect.sync(() => channelMap.delete(channelKey)));
168
243
  if (mode === 'messagechannel') {
169
- // console.debug(nodeName, 'message mode', modeRef.current)
244
+ const incomingPacketsQueue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
245
+ // We're we're draining the queue into another new queue.
246
+ // It's a bit of a mystery why this is needed, since the unit tests also work without it.
247
+ // But for the LiveStore devtools to actually work, we need to do this.
248
+ // We should figure out some day why this is needed and further simplify if possible.
249
+ yield* Queue.takeBetween(queue, 1, 10).pipe(Effect.tap((_) => Queue.offerAll(incomingPacketsQueue, _)), Effect.forever, Effect.interruptible, Effect.tapCauseLogPretty, Effect.forkScoped);
170
250
  // NOTE already retries internally when transferables are required
171
- return yield* makeMessageChannel({
251
+ const { webChannel, initialEdgeDeferred } = yield* makeMessageChannel({
172
252
  nodeName,
173
- queue,
174
- newConnectionAvailablePubSub,
253
+ incomingPacketsQueue,
254
+ newEdgeAvailablePubSub,
175
255
  target,
176
256
  channelName,
177
257
  schema,
178
258
  sendPacket,
179
- checkTransferableConnections,
259
+ checkTransferableEdges,
180
260
  });
261
+ channelMap.set(channelKey, { queue, debugInfo: { channel: webChannel, target } });
262
+ yield* initialEdgeDeferred;
263
+ return webChannel;
181
264
  }
182
265
  else {
183
- return yield* makeProxyChannel({
266
+ const channel = yield* makeProxyChannel({
184
267
  nodeName,
185
- newConnectionAvailablePubSub,
268
+ newEdgeAvailablePubSub,
186
269
  target,
187
270
  channelName,
188
271
  schema,
189
272
  queue,
190
273
  sendPacket,
191
274
  });
275
+ channelMap.set(channelKey, { queue, debugInfo: { channel, target } });
276
+ return channel;
192
277
  }
193
- }).pipe(Effect.withSpanScoped(`makeChannel:${nodeName}→${target}(${channelName})`, {
278
+ }).pipe(
279
+ // Effect.timeout(timeout),
280
+ Effect.withSpanScoped(`makeChannel:${nodeName}→${target}(${channelName})`, {
194
281
  attributes: { target, channelName, mode, timeout },
195
282
  }), Effect.annotateLogs({ nodeName }));
196
- const connectionKeys = Effect.sync(() => new Set(connectionChannels.keys()));
283
+ const makeBroadcastChannel = ({ channelName, schema }) => Effect.scopeWithCloseable((scope) => Effect.gen(function* () {
284
+ if (broadcastChannelListenQueueMap.has(channelName)) {
285
+ return shouldNeverHappen(`Broadcast channel ${channelName} already exists`, broadcastChannelListenQueueMap.get(channelName));
286
+ }
287
+ const debugInfo = {};
288
+ const queue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
289
+ broadcastChannelListenQueueMap.set(channelName, queue);
290
+ const send = (message) => Effect.gen(function* () {
291
+ const payload = yield* Schema.encode(schema)(message);
292
+ const packet = WebmeshSchema.BroadcastChannelPacket.make({
293
+ channelName,
294
+ payload,
295
+ source: nodeName,
296
+ target: '-',
297
+ hops: [],
298
+ });
299
+ yield* sendPacket(packet);
300
+ });
301
+ const listen = Stream.fromQueue(queue).pipe(Stream.filter(Schema.is(WebmeshSchema.BroadcastChannelPacket)), Stream.map((_) => Schema.decodeEither(schema)(_.payload)));
302
+ const closedDeferred = yield* Deferred.make().pipe(Effect.acquireRelease(Deferred.done(Exit.void)));
303
+ return {
304
+ [WebChannel.WebChannelSymbol]: WebChannel.WebChannelSymbol,
305
+ send,
306
+ listen,
307
+ closedDeferred,
308
+ supportsTransferables: true,
309
+ schema: { listen: schema, send: schema },
310
+ shutdown: Scope.close(scope, Exit.void),
311
+ debugInfo,
312
+ };
313
+ }));
314
+ const edgeKeys = Effect.sync(() => new Set(edgeChannels.keys()));
315
+ const runtime = yield* Effect.runtime();
197
316
  const debug = {
198
- printChannelQueues: () => {
317
+ print: () => {
318
+ console.log('Webmesh debug info for node:', nodeName);
319
+ console.log('Edges:', edgeChannels.size);
320
+ for (const [key, value] of edgeChannels) {
321
+ console.log(` ${key}: supportsTransferables=${value.channel.supportsTransferables}`);
322
+ }
199
323
  console.log('Channels:', channelMap.size);
200
324
  for (const [key, value] of channelMap) {
201
- console.log(`${key}: ${value.queue.unsafeSize().pipe(Option.getOrUndefined)}`, value.queue);
325
+ console.log(indent(key, 2), '\n', Object.entries({
326
+ target: value.debugInfo?.target,
327
+ supportsTransferables: value.debugInfo?.channel.supportsTransferables,
328
+ ...value.debugInfo?.channel.debugInfo,
329
+ })
330
+ .map(([key, value]) => indent(`${key}=${value}`, 4))
331
+ .join('\n'), ' ', value.debugInfo?.channel, '\n', indent(`Queue: ${value.queue.unsafeSize().pipe(Option.getOrUndefined)}`, 4), value.queue);
332
+ }
333
+ console.log('Broadcast channels:', broadcastChannelListenQueueMap.size);
334
+ for (const [key, _value] of broadcastChannelListenQueueMap) {
335
+ console.log(indent(key, 2));
202
336
  }
203
337
  },
338
+ ping: (payload) => {
339
+ Effect.gen(function* () {
340
+ const msg = (via) => WebChannel.DebugPingMessage.make({ message: `ping from ${nodeName} via edge ${via}`, payload });
341
+ for (const [channelName, con] of edgeChannels) {
342
+ yield* Effect.logDebug(`sending ping via edge ${channelName}`);
343
+ yield* con.channel.send(msg(`edge ${channelName}`));
344
+ }
345
+ for (const [channelKey, channel] of channelMap) {
346
+ if (channel.debugInfo === undefined)
347
+ continue;
348
+ yield* Effect.logDebug(`sending ping via channel ${channelKey}`);
349
+ yield* channel.debugInfo.channel.send(msg(`channel ${channelKey}`));
350
+ }
351
+ }).pipe(Effect.provide(runtime), Effect.tapCauseLogPretty, Effect.runFork);
352
+ },
353
+ requestTopology: (timeoutMs = 1000) => Effect.gen(function* () {
354
+ const packet = WebmeshSchema.NetworkTopologyRequest.make({
355
+ source: nodeName,
356
+ target: '-',
357
+ hops: [],
358
+ });
359
+ const item = new Map();
360
+ item.set(nodeName, new Set(edgeChannels.keys()));
361
+ topologyRequestsMap.set(packet.id, item);
362
+ yield* sendPacket(packet);
363
+ yield* Effect.logDebug(`Waiting ${timeoutMs}ms for topology response`);
364
+ yield* Effect.sleep(timeoutMs);
365
+ for (const [key, value] of item) {
366
+ yield* Effect.logDebug(`node '${key}' is connected to: ${Array.from(value.values()).join(', ')}`);
367
+ }
368
+ }).pipe(Effect.provide(runtime), Effect.tapCauseLogPretty, Effect.runPromise),
369
+ };
370
+ return {
371
+ nodeName,
372
+ addEdge,
373
+ removeEdge,
374
+ makeChannel,
375
+ makeBroadcastChannel,
376
+ edgeKeys,
377
+ debug,
204
378
  };
205
- return { nodeName, addConnection, removeConnection, makeChannel, connectionKeys, debug };
206
- }).pipe(Effect.withSpan(`makeMeshNode:${nodeName}`));
379
+ }).pipe(Effect.withSpan(`makeMeshNode:${nodeName}`), Effect.annotateLogs({ 'makeMeshNode.nodeName': nodeName }));
207
380
  //# 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":"AAAA,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAE5D,OAAO,EACL,KAAK,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,MAAM,EACN,MAAM,EACN,KAAK,EACL,MAAM,EACN,MAAM,EACN,UAAU,GACX,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAE7D,OAAO,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAClF,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAoEvC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAsB,EAA+C,EAAE,CAClG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAG/B,CAAA;IAEH,2FAA2F;IAC3F,MAAM,gBAAgB,GAAG,IAAI,UAAU,CAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAEjF,MAAM,4BAA4B,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,EAAgB,CAAC,IAAI,CAC/E,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CACvC,CAAA;IAED,qHAAqH;IACrH,mFAAmF;IACnF,2CAA2C;IAC3C,IAAI;IAEJ,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyE,CAAA;IAEnG,MAAM,4BAA4B,GAAG,CAAC,MAAmD,EAAE,EAAE;QAC3F,IACE,CAAC,MAAM,CAAC,IAAI,KAAK,uBAAuB;YACtC,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC;gBAC5B,iEAAiE;gBACjE,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,KAAK,KAAK,CAAC,CAAC;YACpF,yDAAyD;YACzD,CAAC,CAAC,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,KAAK,IAAI,CAAC,EACvF,CAAC;YACD,OAAO,UAAU,CAAC,qCAAqC,CAAC,IAAI,CAAC;gBAC3D,KAAK,EAAE,MAAM,CAAC,EAAE;gBAChB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,kFAAkF;gBAClF,8CAA8C;gBAC9C,6CAA6C;gBAC7C,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,oBAAoB;gBACpB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,aAAa,EAAE,MAAM,CAAC,IAAI;gBAC1B,IAAI,EAAE,EAAE;aACT,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,CAAC,MAAqC,EAAE,EAAE,CAC3D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YACzD,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,wBAAwB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;YACvE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,4BAA4B,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;YAElE,MAAM,sBAAsB,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC;iBAC1D,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC;iBAC1C,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAEjC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAA;YACtG,OAAM;QACR,CAAC;QAED,iDAAiD;QACjD,IAAI,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1C,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAE,CAAC,OAAO,CAAA;YACxE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YACzE,KAAK,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QACpD,CAAC;QACD,+DAA+D;QAC/D,wDAAwD;aACnD,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YAC5C,MAAM,SAAS,GACb,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,GAAG,QAAQ,sCAAsC,EAAE,MAAM,CAAC,CAAA;YACzG,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;YAEpE,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBACpC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CACtB,GAAG,QAAQ,iCAAiC,SAAS,mCAAmC,EACxF,MAAM,CACP,CAAA;gBACD,OAAM;YACR,CAAC;YAED,KAAK,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC;gBAC5B,GAAG,MAAM;gBACT,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5C,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC;aACjC,CAAC,CAAA;QACJ,CAAC;QACD,6CAA6C;aACxC,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YAEzE,kEAAkE;YAClE,MAAM,sBAAsB,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC;iBAC1D,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC;iBAC1C,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAEjC,sEAAsE;YACtE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,sBAAsB,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAA;gBAC1E,iCAAiC;YACnC,CAAC;YAED,MAAM,YAAY,GAAG,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAA;YAExC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAA;QAC9G,CAAC;IACH,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,cAAc,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE;QAC7E,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC;KAC3C,CAAC,EACF,MAAM,CAAC,KAAK,CACb,CAAA;IAEH,MAAM,aAAa,GAA8B,CAAC,EAChD,MAAM,EAAE,cAAc,EACtB,iBAAiB,EACjB,eAAe,GAAG,KAAK,GACxB,EAAE,EAAE,CACH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,IAAI,kBAAkB,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAC3C,IAAI,eAAe,EAAE,CAAC;gBACpB,KAAK,CAAC,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBAC1D,8CAA8C;gBAC9C,8EAA8E;YAChF,CAAC;iBAAM,CAAC;gBACN,OAAO,KAAK,CAAC,CAAC,IAAI,4BAA4B,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAA;YAC5E,CAAC;QACH,CAAC;QAED,oGAAoG;QACpG,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CACtD,MAAM,CAAC,OAAO,EAAE,EAChB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACrB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAA;YAEtE,iFAAiF;YAEjF,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAE,OAAM;YAC3C,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YAE/B,IAAI,MAAM,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;gBAC7C,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;YAC3B,CAAC;iBAAM,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,UAAU,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,EAAuB,CAAA;gBAEhF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;oBAChC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,SAAS,EAAqC,CAAC,IAAI,CAC5E,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CACtC,CAAA;oBACD,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;gBACvC,CAAC;gBAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,KAAK,CAAA;gBAE/C,MAAM,eAAe,GAAG,CAAC,cAA6C,EAAE,EAAE,CACxE,iBAAiB;qBACd,IAAI,CAAC,cAAc,CAAC;qBACpB,IAAI,CACH,MAAM,CAAC,QAAQ,CACb,mBAAmB,cAAc,CAAC,IAAI,IAAI,cAAc,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,EAC1F,EAAE,UAAU,EAAE,sBAAsB,CAAC,cAAc,CAAC,EAAE,CACvD,EACD,MAAM,CAAC,KAAK,CACb,CAAA;gBAEL,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;oBACrD,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAA;gBACxD,CAAC;qBAAM,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC9D,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAA;gBACxD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;oBACvD,MAAM,sBAAsB,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAA;oBACnE,IAAI,sBAAsB,KAAK,SAAS,EAAE,CAAC;wBACzC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,yCAAyC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;wBAClG,OAAO,KAAK,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAC/D,MAAM,CAAC,QAAQ,CAAC,8BAA8B,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE;4BAC9E,UAAU,EAAE,sBAAsB,CAAC,sBAAsB,CAAC;yBAC3D,CAAC,CACH,CAAA;oBACH,CAAC;gBACH,CAAC;gBAED,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;YAC3B,CAAC;QACH,CAAC,CAAC,CACH,EACD,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,iBAAiB,EACxB,MAAM,CAAC,UAAU,CAClB,CAAA;QAED,kBAAkB,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC,CAAA;QAEnF,MAAM,qBAAqB,GAAG,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC;YACnE,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,cAAc;SACvB,CAAC,CAAA;QACF,KAAK,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IACpE,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,iBAAiB,QAAQ,IAAI,cAAc,EAAE,EAAE;QAC7D,UAAU,EAAE,EAAE,qBAAqB,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;KAC/E,CAAC,CACI,CAAA,CAAC,2CAA2C;IAEtD,MAAM,gBAAgB,GAAiC,CAAC,cAAc,EAAE,EAAE,CACxE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAC5C,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,2BAA2B,cAAc,EAAE,CAAC,CAAA;QACtF,CAAC;QAED,KAAK,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,kBAAkB,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC,WAAW,CAAC,CAAA;QAE3E,kBAAkB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEJ,4EAA4E;IAC5E,oGAAoG;IACpG,MAAM,WAAW,GAA4B,CAAC,EAC5C,MAAM,EACN,WAAW,EACX,MAAM,EAAE,WAAW;IACnB,gHAAgH;IAChH,IAAI,EACJ,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAC9B,EAAE,EAAE,CACH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QAChD,MAAM,UAAU,GAAG,GAAG,MAAM,IAAI,WAAW,EAAuB,CAAA;QAElE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,SAAS,EAAqC,CAAC,IAAI,CAC5E,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CACtC,CAAA;YACD,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QACvC,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,KAAyB,CAAA;QAEnE,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAElF,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAC9B,2DAA2D;YAE3D,kEAAkE;YAClE,OAAO,KAAK,CAAC,CAAC,kBAAkB,CAAC;gBAC/B,QAAQ;gBACR,KAAK;gBACL,4BAA4B;gBAC5B,MAAM;gBACN,WAAW;gBACX,MAAM;gBACN,UAAU;gBACV,4BAA4B;aAC7B,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,CAAC,CAAC,gBAAgB,CAAC;gBAC7B,QAAQ;gBACR,4BAA4B;gBAC5B,MAAM;gBACN,WAAW;gBACX,MAAM;gBACN,KAAK;gBACL,UAAU;aACX,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,cAAc,CAAC,eAAe,QAAQ,IAAI,MAAM,IAAI,WAAW,GAAG,EAAE;QACzE,UAAU,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE;KACnD,CAAC,EACF,MAAM,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,CAClC,CAAA;IAEH,MAAM,cAAc,GAA+B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAExG,MAAM,KAAK,GAAsB;QAC/B,kBAAkB,EAAE,GAAG,EAAE;YACvB,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;YACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;YAC7F,CAAC;QACH,CAAC;KACF,CAAA;IAED,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,EAAqB,CAAA;AAC7G,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,QAAQ,EAAE,CAAC,CAAC,CAAA"}
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/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,uCAAuC,CAAA"}