@livestore/webmesh 0.0.0-snapshot-1d99fea7d2ce2c7a5d9ed0a3752f8a7bda6bc3db

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 (54) hide show
  1. package/README.md +5 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/channel/message-channel.d.ts +20 -0
  4. package/dist/channel/message-channel.d.ts.map +1 -0
  5. package/dist/channel/message-channel.js +183 -0
  6. package/dist/channel/message-channel.js.map +1 -0
  7. package/dist/channel/proxy-channel.d.ts +19 -0
  8. package/dist/channel/proxy-channel.d.ts.map +1 -0
  9. package/dist/channel/proxy-channel.js +179 -0
  10. package/dist/channel/proxy-channel.js.map +1 -0
  11. package/dist/common.d.ts +83 -0
  12. package/dist/common.d.ts.map +1 -0
  13. package/dist/common.js +13 -0
  14. package/dist/common.js.map +1 -0
  15. package/dist/mesh-schema.d.ts +104 -0
  16. package/dist/mesh-schema.d.ts.map +1 -0
  17. package/dist/mesh-schema.js +77 -0
  18. package/dist/mesh-schema.js.map +1 -0
  19. package/dist/mod.d.ts +5 -0
  20. package/dist/mod.d.ts.map +1 -0
  21. package/dist/mod.js +5 -0
  22. package/dist/mod.js.map +1 -0
  23. package/dist/node.d.ts +65 -0
  24. package/dist/node.d.ts.map +1 -0
  25. package/dist/node.js +216 -0
  26. package/dist/node.js.map +1 -0
  27. package/dist/node.test.d.ts +2 -0
  28. package/dist/node.test.d.ts.map +1 -0
  29. package/dist/node.test.js +351 -0
  30. package/dist/node.test.js.map +1 -0
  31. package/dist/utils.d.ts +19 -0
  32. package/dist/utils.d.ts.map +1 -0
  33. package/dist/utils.js +41 -0
  34. package/dist/utils.js.map +1 -0
  35. package/dist/websocket-connection.d.ts +51 -0
  36. package/dist/websocket-connection.d.ts.map +1 -0
  37. package/dist/websocket-connection.js +74 -0
  38. package/dist/websocket-connection.js.map +1 -0
  39. package/dist/websocket-server.d.ts +7 -0
  40. package/dist/websocket-server.d.ts.map +1 -0
  41. package/dist/websocket-server.js +24 -0
  42. package/dist/websocket-server.js.map +1 -0
  43. package/package.json +32 -0
  44. package/src/channel/message-channel.ts +354 -0
  45. package/src/channel/proxy-channel.ts +332 -0
  46. package/src/common.ts +36 -0
  47. package/src/mesh-schema.ts +94 -0
  48. package/src/mod.ts +4 -0
  49. package/src/node.test.ts +533 -0
  50. package/src/node.ts +408 -0
  51. package/src/utils.ts +47 -0
  52. package/src/websocket-connection.ts +158 -0
  53. package/src/websocket-server.ts +40 -0
  54. package/tsconfig.json +11 -0
@@ -0,0 +1,20 @@
1
+ import type { PubSub, Schema, Scope } from '@livestore/utils/effect';
2
+ import { Effect, Queue, WebChannel } from '@livestore/utils/effect';
3
+ import { type ChannelName, type MeshNodeName, type MessageQueueItem } from '../common.js';
4
+ import * as MeshSchema from '../mesh-schema.js';
5
+ interface MakeMessageChannelArgs {
6
+ nodeName: MeshNodeName;
7
+ queue: Queue.Queue<MessageQueueItem>;
8
+ newConnectionAvailablePubSub: PubSub.PubSub<MeshNodeName>;
9
+ channelName: ChannelName;
10
+ target: MeshNodeName;
11
+ sendPacket: (packet: typeof MeshSchema.MessageChannelPacket.Type) => Effect.Effect<void>;
12
+ checkTransferableConnections: (packet: typeof MeshSchema.MessageChannelPacket.Type) => typeof MeshSchema.MessageChannelResponseNoTransferables.Type | undefined;
13
+ schema: {
14
+ send: Schema.Schema<any, any>;
15
+ listen: Schema.Schema<any, any>;
16
+ };
17
+ }
18
+ export declare const makeMessageChannel: ({ nodeName, queue, newConnectionAvailablePubSub, target, checkTransferableConnections, channelName, schema, sendPacket, }: MakeMessageChannelArgs) => Effect.Effect<WebChannel.WebChannel<any, any, never>, never, Scope.Scope>;
19
+ export {};
20
+ //# sourceMappingURL=message-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-channel.d.ts","sourceRoot":"","sources":["../../src/channel/message-channel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAEL,MAAM,EAIN,KAAK,EAIL,UAAU,EACX,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAA0B,MAAM,cAAc,CAAA;AACjH,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAE/C,UAAU,sBAAsB;IAC9B,QAAQ,EAAE,YAAY,CAAA;IACtB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;IACpC,4BAA4B,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IACzD,WAAW,EAAE,WAAW,CAAA;IACxB,MAAM,EAAE,YAAY,CAAA;IACpB,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,UAAU,CAAC,oBAAoB,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACxF,4BAA4B,EAAE,CAC5B,MAAM,EAAE,OAAO,UAAU,CAAC,oBAAoB,CAAC,IAAI,KAChD,OAAO,UAAU,CAAC,qCAAqC,CAAC,IAAI,GAAG,SAAS,CAAA;IAC7E,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;KAChC,CAAA;CACF;AAED,eAAO,MAAM,kBAAkB,8HAS5B,sBAAsB,8EAsT6B,CAAA"}
@@ -0,0 +1,183 @@
1
+ import { casesHandled, shouldNeverHappen } from '@livestore/utils';
2
+ import { Deferred, Effect, Either, Fiber, FiberHandle, Queue, Schedule, Stream, SubscriptionRef, WebChannel, } from '@livestore/utils/effect';
3
+ import { packetAsOtelAttributes } from '../common.js';
4
+ import * as MeshSchema from '../mesh-schema.js';
5
+ export const makeMessageChannel = ({ nodeName, queue, newConnectionAvailablePubSub, target, checkTransferableConnections, channelName, schema, sendPacket, }) => Effect.gen(function* () {
6
+ const reconnectTriggerQueue = yield* Queue.unbounded();
7
+ const reconnect = Queue.offer(reconnectTriggerQueue, void 0);
8
+ const makeInitialState = Effect.gen(function* () {
9
+ const deferred = yield* Deferred.make();
10
+ return { _tag: 'Initial', deferred };
11
+ });
12
+ const channelStateRef = { current: yield* makeInitialState };
13
+ const makeMessageChannelInternal = Effect.gen(function* () {
14
+ const processMessagePacket = ({ packet, respondToSender }) => Effect.gen(function* () {
15
+ const channelState = channelStateRef.current;
16
+ // yield* Effect.log(`${nodeName}:processing packet ${packet._tag}, channel state: ${channelState._tag}`)
17
+ switch (packet._tag) {
18
+ // Since there can be concurrent MessageChannel responses from both sides,
19
+ // we need to decide which side's port we want to use and which side's port we want to ignore.
20
+ // This is only relevant in the case where both sides already sent their responses.
21
+ // In this case we're using the target name as a "tie breaker" to decide which side's port to use.
22
+ // We do this by sorting the target names lexicographically and use the first one as the winner.
23
+ case 'MessageChannelResponseSuccess': {
24
+ if (channelState._tag === 'Initial') {
25
+ return shouldNeverHappen(`Expected to find message channel request from ${target}, but was in ${channelState._tag} state`);
26
+ }
27
+ if (channelState._tag === 'Established') {
28
+ const deferred = yield* Deferred.make();
29
+ channelStateRef.current = { _tag: 'RequestSent', deferred };
30
+ yield* reconnect;
31
+ return;
32
+ }
33
+ const thisSideAlsoResponded = channelState._tag === 'ResponseSent';
34
+ const usePortFromThisSide = thisSideAlsoResponded && nodeName > target;
35
+ yield* Effect.annotateCurrentSpan({ usePortFromThisSide });
36
+ const winnerPort = usePortFromThisSide ? channelState.locallyCreatedPort : packet.port;
37
+ yield* Deferred.succeed(channelState.deferred, winnerPort);
38
+ return;
39
+ }
40
+ case 'MessageChannelResponseNoTransferables': {
41
+ if (channelState._tag === 'Established')
42
+ return;
43
+ yield* Deferred.fail(channelState.deferred, packet);
44
+ channelStateRef.current = yield* makeInitialState;
45
+ return;
46
+ }
47
+ case 'MessageChannelRequest': {
48
+ const mc = new MessageChannel();
49
+ const shouldReconnect = channelState._tag === 'Established';
50
+ const deferred = channelState._tag === 'Established'
51
+ ? yield* Deferred.make()
52
+ : channelState.deferred;
53
+ channelStateRef.current = { _tag: 'ResponseSent', locallyCreatedPort: mc.port1, deferred };
54
+ yield* respondToSender(MeshSchema.MessageChannelResponseSuccess.make({
55
+ reqId: packet.id,
56
+ target,
57
+ source: nodeName,
58
+ channelName: packet.channelName,
59
+ hops: [],
60
+ remainingHops: packet.hops,
61
+ port: mc.port2,
62
+ }));
63
+ // If there's an established channel, we use the new request as a signal
64
+ // to drop the old channel and use the new one
65
+ if (shouldReconnect) {
66
+ yield* reconnect;
67
+ }
68
+ break;
69
+ }
70
+ default: {
71
+ return casesHandled(packet);
72
+ }
73
+ }
74
+ }).pipe(Effect.withSpan(`handleMessagePacket:${packet._tag}:${packet.source}→${packet.target}`, {
75
+ attributes: packetAsOtelAttributes(packet),
76
+ }));
77
+ yield* Stream.fromQueue(queue).pipe(Stream.tap(processMessagePacket), Stream.runDrain, Effect.tapCauseLogPretty, Effect.forkScoped);
78
+ const channelFromPort = (port) => Effect.gen(function* () {
79
+ channelStateRef.current = { _tag: 'Established' };
80
+ // NOTE to support re-connects we need to ack each message
81
+ const channel = yield* WebChannel.messagePortChannelWithAck({ port, schema });
82
+ return channel;
83
+ });
84
+ const channelState = channelStateRef.current;
85
+ if (channelState._tag === 'Initial' || channelState._tag === 'RequestSent') {
86
+ // Important to make a new deferred here as the old one might have been used already
87
+ // TODO model this better
88
+ const deferred = channelState._tag === 'RequestSent'
89
+ ? yield* Deferred.make()
90
+ : channelState.deferred;
91
+ channelStateRef.current = { _tag: 'RequestSent', deferred };
92
+ const connectionRequest = Effect.gen(function* () {
93
+ const packet = MeshSchema.MessageChannelRequest.make({ source: nodeName, target, channelName, hops: [] });
94
+ const noTransferableResponse = checkTransferableConnections(packet);
95
+ if (noTransferableResponse !== undefined) {
96
+ yield* Effect.spanEvent(`No transferable connections found for ${packet.source}→${packet.target}`);
97
+ yield* Deferred.fail(deferred, noTransferableResponse);
98
+ return;
99
+ }
100
+ yield* sendPacket(packet);
101
+ });
102
+ yield* connectionRequest;
103
+ const retryOnNewConnectionFiber = yield* Stream.fromPubSub(newConnectionAvailablePubSub).pipe(Stream.tap(() => Effect.spanEvent(`RetryOnNewConnection`)), Stream.tap(() => connectionRequest), Stream.runDrain, Effect.forkScoped);
104
+ const portResult = yield* deferred.pipe(Effect.either);
105
+ yield* Fiber.interrupt(retryOnNewConnectionFiber);
106
+ if (portResult._tag === 'Right') {
107
+ return yield* channelFromPort(portResult.right);
108
+ }
109
+ else {
110
+ // We'll keep retrying with a new connection
111
+ yield* Stream.fromPubSub(newConnectionAvailablePubSub).pipe(Stream.take(1), Stream.runDrain);
112
+ yield* reconnect;
113
+ return yield* Effect.interrupt;
114
+ }
115
+ }
116
+ else {
117
+ // In this case we've already received a request from the other side (before we had a chance to send our request),
118
+ // so we already created a MessageChannel,responded with one port
119
+ // and are now using the other port to create the channel.
120
+ if (channelState._tag === 'ResponseSent') {
121
+ return yield* channelFromPort(channelState.locallyCreatedPort);
122
+ }
123
+ else {
124
+ return shouldNeverHappen(`Expected pending message channel to be in ResponseSent state, but was in ${channelState._tag} state`);
125
+ }
126
+ }
127
+ });
128
+ const internalChannelSref = yield* SubscriptionRef.make(false);
129
+ const listenQueue = yield* Queue.unbounded();
130
+ let connectCounter = 0;
131
+ const connect = Effect.gen(function* () {
132
+ const connectCount = ++connectCounter;
133
+ yield* Effect.spanEvent(`Connecting#${connectCount}`);
134
+ yield* SubscriptionRef.set(internalChannelSref, false);
135
+ yield* Effect.addFinalizer(() => Effect.spanEvent(`Disconnected#${connectCount}`));
136
+ const internalChannel = yield* makeMessageChannelInternal;
137
+ yield* SubscriptionRef.set(internalChannelSref, internalChannel);
138
+ yield* Effect.spanEvent(`Connected#${connectCount}`);
139
+ yield* internalChannel.listen.pipe(Stream.flatten(), Stream.tap((msg) => Queue.offer(listenQueue, msg)), Stream.runDrain, Effect.tapCauseLogPretty, Effect.forkScoped);
140
+ yield* Effect.never;
141
+ }).pipe(Effect.scoped);
142
+ const fiberHandle = yield* FiberHandle.make();
143
+ const runConnect = Effect.gen(function* () {
144
+ // Cleanly shutdown the previous connection first
145
+ // Otherwise the old and new connection will "overlap"
146
+ yield* FiberHandle.clear(fiberHandle);
147
+ yield* FiberHandle.run(fiberHandle, connect);
148
+ });
149
+ yield* runConnect;
150
+ // Then listen for reconnects
151
+ yield* Stream.fromQueue(reconnectTriggerQueue).pipe(Stream.tap(() => runConnect), Stream.runDrain, Effect.tapCauseLogPretty, Effect.forkScoped);
152
+ // Wait for the initial connection to be established or for an error to occur
153
+ yield* Effect.raceFirst(SubscriptionRef.waitUntil(internalChannelSref, (channel) => channel !== false), FiberHandle.join(fiberHandle));
154
+ const parentSpan = yield* Effect.currentSpan.pipe(Effect.orDie);
155
+ const send = (message) => Effect.gen(function* () {
156
+ const sendFiberHandle = yield* FiberHandle.make();
157
+ const sentDeferred = yield* Deferred.make();
158
+ const trySend = Effect.gen(function* () {
159
+ const channel = (yield* SubscriptionRef.waitUntil(internalChannelSref, (channel) => channel !== false));
160
+ const innerSend = Effect.gen(function* () {
161
+ yield* channel.send(message);
162
+ yield* Deferred.succeed(sentDeferred, void 0);
163
+ });
164
+ yield* innerSend.pipe(Effect.timeout(100), Effect.retry(Schedule.exponential(100)), Effect.orDie);
165
+ }).pipe(Effect.tapErrorCause(Effect.logError));
166
+ const rerunOnNewChannelFiber = yield* internalChannelSref.changes.pipe(Stream.filter((_) => _ === false), Stream.tap(() => FiberHandle.run(sendFiberHandle, trySend)), Stream.runDrain, Effect.fork);
167
+ yield* FiberHandle.run(sendFiberHandle, trySend);
168
+ yield* sentDeferred;
169
+ yield* Fiber.interrupt(rerunOnNewChannelFiber);
170
+ }).pipe(Effect.scoped, Effect.withParentSpan(parentSpan));
171
+ const listen = Stream.fromQueue(listenQueue).pipe(Stream.map(Either.right));
172
+ const closedDeferred = yield* Deferred.make();
173
+ const webChannel = {
174
+ [WebChannel.WebChannelSymbol]: WebChannel.WebChannelSymbol,
175
+ send,
176
+ listen,
177
+ closedDeferred,
178
+ supportsTransferables: true,
179
+ schema,
180
+ };
181
+ return webChannel;
182
+ }).pipe(Effect.withSpanScoped('makeMessageChannel'));
183
+ //# sourceMappingURL=message-channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-channel.js","sourceRoot":"","sources":["../../src/channel/message-channel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { PubSub } from '@livestore/utils/effect';
2
+ import { Effect, Queue, Schema, WebChannel } from '@livestore/utils/effect';
3
+ import { type ChannelName, type MeshNodeName, type ProxyQueueItem } from '../common.js';
4
+ import * as MeshSchema from '../mesh-schema.js';
5
+ interface MakeProxyChannelArgs {
6
+ queue: Queue.Queue<ProxyQueueItem>;
7
+ nodeName: MeshNodeName;
8
+ newConnectionAvailablePubSub: PubSub.PubSub<MeshNodeName>;
9
+ sendPacket: (packet: typeof MeshSchema.ProxyChannelPacket.Type) => Effect.Effect<void>;
10
+ channelName: ChannelName;
11
+ target: MeshNodeName;
12
+ schema: {
13
+ send: Schema.Schema<any, any>;
14
+ listen: Schema.Schema<any, any>;
15
+ };
16
+ }
17
+ export declare const makeProxyChannel: ({ queue, nodeName, newConnectionAvailablePubSub, sendPacket, target, channelName, schema, }: MakeProxyChannelArgs) => Effect.Effect<WebChannel.WebChannel<any, any, never>, never, import("effect/Scope").Scope>;
18
+ export {};
19
+ //# sourceMappingURL=proxy-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-channel.d.ts","sourceRoot":"","sources":["../../src/channel/proxy-channel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAEL,MAAM,EAIN,KAAK,EAEL,MAAM,EAGN,UAAU,EACX,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,YAAY,EAEjB,KAAK,cAAc,EACpB,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAE/C,UAAU,oBAAoB;IAC5B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;IAClC,QAAQ,EAAE,YAAY,CAAA;IACtB,4BAA4B,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IACzD,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,UAAU,CAAC,kBAAkB,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACtF,WAAW,EAAE,WAAW,CAAA;IACxB,MAAM,EAAE,YAAY,CAAA;IACpB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;KAChC,CAAA;CACF;AAED,eAAO,MAAM,gBAAgB,gGAQ1B,oBAAoB,+FA4R6B,CAAA"}
@@ -0,0 +1,179 @@
1
+ import { casesHandled, shouldNeverHappen } from '@livestore/utils';
2
+ import { Deferred, Effect, Either, Fiber, FiberHandle, Queue, Schedule, Schema, Stream, SubscriptionRef, WebChannel, } from '@livestore/utils/effect';
3
+ import { nanoid } from '@livestore/utils/nanoid';
4
+ import { packetAsOtelAttributes, } from '../common.js';
5
+ import * as MeshSchema from '../mesh-schema.js';
6
+ export const makeProxyChannel = ({ queue, nodeName, newConnectionAvailablePubSub, sendPacket, target, channelName, schema, }) => Effect.gen(function* () {
7
+ const channelStateRef = { current: { _tag: 'Initial' } };
8
+ /**
9
+ * We need to unique identify a channel as multiple channels might exist between the same two nodes.
10
+ * We do this by letting each channel end generate a unique id and then combining them in a deterministic way.
11
+ */
12
+ const channelIdCandidate = nanoid(5);
13
+ yield* Effect.annotateCurrentSpan({ channelIdCandidate });
14
+ const channelSpan = yield* Effect.currentSpan.pipe(Effect.orDie);
15
+ const connectedStateRef = yield* SubscriptionRef.make(false);
16
+ const waitForEstablished = Effect.gen(function* () {
17
+ const state = yield* SubscriptionRef.waitUntil(connectedStateRef, (state) => state !== false);
18
+ return state;
19
+ });
20
+ const setStateToEstablished = (channelId) => Effect.gen(function* () {
21
+ // TODO avoid "double" `Connected` events (we might call `setStateToEstablished` twice during initial connection)
22
+ yield* Effect.spanEvent(`Connected (${channelId})`).pipe(Effect.withParentSpan(channelSpan));
23
+ channelStateRef.current = {
24
+ _tag: 'Established',
25
+ listenSchema: schema.listen,
26
+ listenQueue,
27
+ ackMap,
28
+ combinedChannelId: channelId,
29
+ };
30
+ yield* SubscriptionRef.set(connectedStateRef, channelStateRef.current);
31
+ });
32
+ const connectionRequest = Effect.suspend(() => sendPacket(MeshSchema.ProxyChannelRequest.make({ channelName, hops: [], source: nodeName, target, channelIdCandidate })));
33
+ const getCombinedChannelId = (otherSideChannelIdCandidate) => [channelIdCandidate, otherSideChannelIdCandidate].sort().join('_');
34
+ const processProxyPacket = ({ packet, respondToSender }) => Effect.gen(function* () {
35
+ // yield* Effect.log(`${nodeName}:processing packet ${packet._tag} from ${packet.source}`)
36
+ const otherSideName = packet.source;
37
+ const channelKey = `${otherSideName}-${packet.channelName}`;
38
+ const channelState = channelStateRef.current;
39
+ switch (packet._tag) {
40
+ case 'ProxyChannelRequest': {
41
+ const combinedChannelId = getCombinedChannelId(packet.channelIdCandidate);
42
+ if (channelState._tag === 'Initial' || channelState._tag === 'Established') {
43
+ yield* SubscriptionRef.set(connectedStateRef, false);
44
+ channelStateRef.current = { _tag: 'Pending', initiatedVia: 'incoming-request' };
45
+ yield* Effect.spanEvent(`Reconnecting`).pipe(Effect.withParentSpan(channelSpan));
46
+ // If we're already connected, we need to re-establish the connection
47
+ if (channelState._tag === 'Established' && channelState.combinedChannelId !== combinedChannelId) {
48
+ yield* connectionRequest;
49
+ }
50
+ }
51
+ yield* respondToSender(MeshSchema.ProxyChannelResponseSuccess.make({
52
+ reqId: packet.id,
53
+ remainingHops: packet.hops,
54
+ hops: [],
55
+ target,
56
+ source: nodeName,
57
+ channelName,
58
+ combinedChannelId,
59
+ channelIdCandidate,
60
+ }));
61
+ return;
62
+ }
63
+ case 'ProxyChannelResponseSuccess': {
64
+ if (channelState._tag !== 'Pending') {
65
+ // return shouldNeverHappen(`Expected proxy channel to be pending but got ${channelState._tag}`)
66
+ if (channelState._tag === 'Established' && channelState.combinedChannelId !== packet.combinedChannelId) {
67
+ return shouldNeverHappen(`Expected proxy channel to have the same combinedChannelId as the packet:\n${channelState.combinedChannelId} (channel) === ${packet.combinedChannelId} (packet)`);
68
+ }
69
+ else {
70
+ // for now just ignore it but should be looked into (there seems to be some kind of race condition/inefficiency)
71
+ }
72
+ }
73
+ const combinedChannelId = getCombinedChannelId(packet.channelIdCandidate);
74
+ if (combinedChannelId !== packet.combinedChannelId) {
75
+ return yield* Effect.die(`Expected proxy channel to have the same combinedChannelId as the packet:\n${combinedChannelId} (channel) === ${packet.combinedChannelId} (packet)`);
76
+ }
77
+ yield* setStateToEstablished(packet.combinedChannelId);
78
+ return;
79
+ }
80
+ case 'ProxyChannelPayload': {
81
+ if (channelState._tag !== 'Established') {
82
+ // return yield* Effect.die(`Not yet connected to ${target}. dropping message`)
83
+ yield* Effect.spanEvent(`Not yet connected to ${target}. dropping message`, { packet });
84
+ return;
85
+ }
86
+ if (channelState.combinedChannelId !== packet.combinedChannelId) {
87
+ return yield* Effect.die(`Expected proxy channel to have the same combinedChannelId as the packet:\n${channelState.combinedChannelId} (channel) === ${packet.combinedChannelId} (packet)`);
88
+ }
89
+ yield* respondToSender(MeshSchema.ProxyChannelPayloadAck.make({
90
+ reqId: packet.id,
91
+ remainingHops: packet.hops,
92
+ hops: [],
93
+ target,
94
+ source: nodeName,
95
+ channelName,
96
+ combinedChannelId: channelState.combinedChannelId,
97
+ }));
98
+ const decodedMessage = yield* Schema.decodeUnknown(channelState.listenSchema)(packet.payload);
99
+ yield* channelState.listenQueue.pipe(Queue.offer(decodedMessage));
100
+ return;
101
+ }
102
+ case 'ProxyChannelPayloadAck': {
103
+ if (channelState._tag !== 'Established') {
104
+ yield* Effect.spanEvent(`Not yet connected to ${target}. dropping message`);
105
+ return;
106
+ }
107
+ const ack = channelState.ackMap.get(packet.reqId) ??
108
+ shouldNeverHappen(`Expected ack for ${packet.reqId} in proxy channel ${channelKey}`);
109
+ yield* Deferred.succeed(ack, void 0);
110
+ channelState.ackMap.delete(packet.reqId);
111
+ return;
112
+ }
113
+ default: {
114
+ return casesHandled(packet);
115
+ }
116
+ }
117
+ }).pipe(Effect.withSpan(`handleProxyPacket:${packet._tag}:${packet.source}->${packet.target}`, {
118
+ attributes: packetAsOtelAttributes(packet),
119
+ }));
120
+ yield* Stream.fromQueue(queue).pipe(Stream.tap(processProxyPacket), Stream.runDrain, Effect.tapCauseLogPretty, Effect.forkScoped);
121
+ const listenQueue = yield* Queue.unbounded();
122
+ yield* Effect.spanEvent(`Connecting`);
123
+ const ackMap = new Map();
124
+ // check if already established via incoming `ProxyChannelRequest` from other side
125
+ // which indicates we already have a connection to the target node
126
+ // const channelState = channelStateRef.current
127
+ {
128
+ if (channelStateRef.current._tag !== 'Initial') {
129
+ return shouldNeverHappen('Expected proxy channel to be Initial');
130
+ }
131
+ channelStateRef.current = { _tag: 'Pending', initiatedVia: 'outgoing-request' };
132
+ yield* connectionRequest;
133
+ const retryOnNewConnectionFiber = yield* Stream.fromPubSub(newConnectionAvailablePubSub).pipe(Stream.tap(() => connectionRequest), Stream.runDrain, Effect.forkScoped);
134
+ const { combinedChannelId: channelId } = yield* waitForEstablished;
135
+ yield* Fiber.interrupt(retryOnNewConnectionFiber);
136
+ yield* setStateToEstablished(channelId);
137
+ }
138
+ const send = (message) => Effect.gen(function* () {
139
+ const payload = yield* Schema.encodeUnknown(schema.send)(message);
140
+ const sendFiberHandle = yield* FiberHandle.make();
141
+ const sentDeferred = yield* Deferred.make();
142
+ const trySend = Effect.gen(function* () {
143
+ const { combinedChannelId } = (yield* SubscriptionRef.waitUntil(connectedStateRef, (channel) => channel !== false));
144
+ const innerSend = Effect.gen(function* () {
145
+ // Note we're re-creating new packets every time otherwise they will be skipped because of `handledIds`
146
+ const ack = yield* Deferred.make();
147
+ const packet = MeshSchema.ProxyChannelPayload.make({
148
+ channelName,
149
+ payload,
150
+ hops: [],
151
+ source: nodeName,
152
+ target,
153
+ combinedChannelId,
154
+ });
155
+ ackMap.set(packet.id, ack);
156
+ yield* sendPacket(packet);
157
+ yield* ack;
158
+ yield* Deferred.succeed(sentDeferred, void 0);
159
+ });
160
+ yield* innerSend.pipe(Effect.timeout(100), Effect.retry(Schedule.exponential(100)), Effect.orDie);
161
+ }).pipe(Effect.tapErrorCause(Effect.logError));
162
+ const rerunOnNewChannelFiber = yield* connectedStateRef.changes.pipe(Stream.filter((_) => _ === false), Stream.tap(() => FiberHandle.run(sendFiberHandle, trySend)), Stream.runDrain, Effect.fork);
163
+ yield* FiberHandle.run(sendFiberHandle, trySend);
164
+ yield* sentDeferred;
165
+ yield* Fiber.interrupt(rerunOnNewChannelFiber);
166
+ }).pipe(Effect.scoped, Effect.withSpan(`sendAckWithRetry:ProxyChannelPayload`), Effect.withParentSpan(channelSpan));
167
+ const listen = Stream.fromQueue(listenQueue).pipe(Stream.map(Either.right));
168
+ const closedDeferred = yield* Deferred.make();
169
+ const webChannel = {
170
+ [WebChannel.WebChannelSymbol]: WebChannel.WebChannelSymbol,
171
+ send,
172
+ listen,
173
+ closedDeferred,
174
+ supportsTransferables: true,
175
+ schema,
176
+ };
177
+ return webChannel;
178
+ }).pipe(Effect.withSpanScoped('makeProxyChannel'));
179
+ //# sourceMappingURL=proxy-channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-channel.js","sourceRoot":"","sources":["../../src/channel/proxy-channel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { type Effect, Schema } from '@livestore/utils/effect';
2
+ import type { MessageChannelPacket, Packet, ProxyChannelPacket } from './mesh-schema.js';
3
+ export type ProxyQueueItem = {
4
+ packet: typeof ProxyChannelPacket.Type;
5
+ respondToSender: (msg: typeof ProxyChannelPacket.Type) => Effect.Effect<void>;
6
+ };
7
+ export type MessageQueueItem = {
8
+ packet: typeof MessageChannelPacket.Type;
9
+ respondToSender: (msg: typeof MessageChannelPacket.Type) => Effect.Effect<void>;
10
+ };
11
+ export type MeshNodeName = string;
12
+ export type ChannelName = string;
13
+ export type ChannelKey = `${MeshNodeName}-${ChannelName}`;
14
+ declare const NoConnectionRouteSignal_base: Schema.TaggedErrorClass<NoConnectionRouteSignal, "NoConnectionRouteSignal", {
15
+ readonly _tag: Schema.tag<"NoConnectionRouteSignal">;
16
+ }>;
17
+ export declare class NoConnectionRouteSignal extends NoConnectionRouteSignal_base {
18
+ }
19
+ declare const ConnectionAlreadyExistsError_base: Schema.TaggedErrorClass<ConnectionAlreadyExistsError, "ConnectionAlreadyExistsError", {
20
+ readonly _tag: Schema.tag<"ConnectionAlreadyExistsError">;
21
+ } & {
22
+ target: typeof Schema.String;
23
+ }>;
24
+ export declare class ConnectionAlreadyExistsError extends ConnectionAlreadyExistsError_base {
25
+ }
26
+ export declare const packetAsOtelAttributes: (packet: typeof Packet.Type) => {
27
+ packet?: {
28
+ readonly remainingHops?: undefined;
29
+ readonly id: string;
30
+ readonly target: string;
31
+ readonly source: string;
32
+ readonly channelName: string;
33
+ readonly hops: readonly string[];
34
+ readonly _tag: "MessageChannelRequest";
35
+ } | {
36
+ readonly remainingHops: readonly string[];
37
+ readonly id: string;
38
+ readonly target: string;
39
+ readonly source: string;
40
+ readonly channelName: string;
41
+ readonly hops: readonly string[];
42
+ readonly _tag: "MessageChannelResponseNoTransferables";
43
+ readonly reqId: string;
44
+ } | {
45
+ readonly remainingHops?: undefined;
46
+ readonly id: string;
47
+ readonly target: string;
48
+ readonly source: string;
49
+ readonly channelName: string;
50
+ readonly hops: readonly string[];
51
+ readonly _tag: "ProxyChannelRequest";
52
+ readonly channelIdCandidate: string;
53
+ } | {
54
+ readonly remainingHops: readonly string[];
55
+ readonly id: string;
56
+ readonly target: string;
57
+ readonly source: string;
58
+ readonly channelName: string;
59
+ readonly hops: readonly string[];
60
+ readonly _tag: "ProxyChannelResponseSuccess";
61
+ readonly reqId: string;
62
+ readonly channelIdCandidate: string;
63
+ readonly combinedChannelId: string;
64
+ } | {
65
+ readonly remainingHops: readonly string[];
66
+ readonly id: string;
67
+ readonly target: string;
68
+ readonly source: string;
69
+ readonly channelName: string;
70
+ readonly hops: readonly string[];
71
+ readonly _tag: "ProxyChannelPayloadAck";
72
+ readonly reqId: string;
73
+ readonly combinedChannelId: string;
74
+ } | {
75
+ readonly id: string;
76
+ readonly target: string;
77
+ readonly source: string;
78
+ readonly _tag: "NetworkConnectionAdded";
79
+ } | undefined;
80
+ packetId: string;
81
+ };
82
+ export {};
83
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAE7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAExF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,OAAO,kBAAkB,CAAC,IAAI,CAAA;IACtC,eAAe,EAAE,CAAC,GAAG,EAAE,OAAO,kBAAkB,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;CAC9E,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,OAAO,oBAAoB,CAAC,IAAI,CAAA;IACxC,eAAe,EAAE,CAAC,GAAG,EAAE,OAAO,oBAAoB,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;CAChF,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAA;AAEjC,MAAM,MAAM,WAAW,GAAG,MAAM,CAAA;AAChC,MAAM,MAAM,UAAU,GAAG,GAAG,YAAY,IAAI,WAAW,EAAE,CAAA;;;;AAGzD,qBAAa,uBAAwB,SAAQ,4BAG5C;CAAG;;;;;;AAEJ,qBAAa,4BAA6B,SAAQ,iCAKjD;CAAG;AAEJ,eAAO,MAAM,sBAAsB,WAAY,OAAO,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAG/D,CAAA"}
package/dist/common.js ADDED
@@ -0,0 +1,13 @@
1
+ import { Schema } from '@livestore/utils/effect';
2
+ // TODO actually use this to avoid timeouts in certain cases
3
+ export class NoConnectionRouteSignal extends Schema.TaggedError()('NoConnectionRouteSignal', {}) {
4
+ }
5
+ export class ConnectionAlreadyExistsError extends Schema.TaggedError()('ConnectionAlreadyExistsError', {
6
+ target: Schema.String,
7
+ }) {
8
+ }
9
+ export const packetAsOtelAttributes = (packet) => ({
10
+ packetId: packet.id,
11
+ ...(packet._tag !== 'MessageChannelResponseSuccess' && packet._tag !== 'ProxyChannelPayload' ? { packet } : {}),
12
+ });
13
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAmB7D,4DAA4D;AAC5D,MAAM,OAAO,uBAAwB,SAAQ,MAAM,CAAC,WAAW,EAA2B,CACxF,yBAAyB,EACzB,EAAE,CACH;CAAG;AAEJ,MAAM,OAAO,4BAA6B,SAAQ,MAAM,CAAC,WAAW,EAAgC,CAClG,8BAA8B,EAC9B;IACE,MAAM,EAAE,MAAM,CAAC,MAAM;CACtB,CACF;CAAG;AAEJ,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,MAA0B,EAAE,EAAE,CAAC,CAAC;IACrE,QAAQ,EAAE,MAAM,CAAC,EAAE;IACnB,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,+BAA+B,IAAI,MAAM,CAAC,IAAI,KAAK,qBAAqB,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CAChH,CAAC,CAAA"}