@livestore/webmesh 0.3.0-dev.46 → 0.3.0-dev.48

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.
@@ -42,9 +42,12 @@ export declare const connectViaWebSocket: ({ node, url, openTimeout, }: {
42
42
  url: string;
43
43
  openTimeout?: number;
44
44
  }) => Effect.Effect<void, never, Scope.Scope | HttpClient.HttpClient>;
45
- export declare const makeWebSocketEdge: ({ socket, socketType, }: {
45
+ export declare const makeWebSocketEdge: ({ socket, socketType, debug: debugInfo, }: {
46
46
  socket: Socket.Socket;
47
47
  socketType: SocketType;
48
+ debug?: {
49
+ id?: string;
50
+ };
48
51
  }) => Effect.Effect<{
49
52
  webChannel: WebChannel.WebChannel<typeof WebmeshSchema.Packet.Type, typeof WebmeshSchema.Packet.Type>;
50
53
  from: string;
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-edge.d.ts","sourceRoot":"","sources":["../src/websocket-edge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAEL,MAAM,EAMN,MAAM,EACN,KAAK,EACL,MAAM,EAEN,UAAU,EACX,MAAM,yBAAyB,CAAA;AAEhC,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;;;;AAEzC,qBAAa,UAAW,SAAQ,eAE9B;CAAG;;;;;AAEL,qBAAa,aAAc,SAAQ,kBAGjC;CAAG;;AAEL,qBAAa,aAAc,SAAQ,kBAAuC;CAAG;AAE7E,eAAO,MAAM,cAAc;;;;;;;;;;;;;;UAAgC,CAAA;AAE3D,MAAM,MAAM,UAAU,GAClB;IACE,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,GACD;IACE,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAEL,eAAO,MAAM,mBAAmB,GAAI,6BAIjC;IACD,IAAI,EAAE,QAAQ,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CAgB6C,CAAA;AAQ/G,eAAO,MAAM,iBAAiB,GAAI,yBAG/B;IACD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAA;IACrB,UAAU,EAAE,UAAU,CAAA;CACvB,KAAG,MAAM,CAAC,MAAM,CACf;IACE,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACrG,IAAI,EAAE,MAAM,CAAA;CACb,EACD,KAAK,EACL,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CAiGlC,CAAA"}
1
+ {"version":3,"file":"websocket-edge.d.ts","sourceRoot":"","sources":["../src/websocket-edge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAEL,MAAM,EAMN,MAAM,EACN,KAAK,EACL,MAAM,EAEN,UAAU,EACX,MAAM,yBAAyB,CAAA;AAEhC,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;;;;AAEzC,qBAAa,UAAW,SAAQ,eAE9B;CAAG;;;;;AAEL,qBAAa,aAAc,SAAQ,kBAGjC;CAAG;;AAEL,qBAAa,aAAc,SAAQ,kBAAuC;CAAG;AAE7E,eAAO,MAAM,cAAc;;;;;;;;;;;;;;UAAgC,CAAA;AAE3D,MAAM,MAAM,UAAU,GAClB;IACE,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,GACD;IACE,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAEL,eAAO,MAAM,mBAAmB,GAAI,6BAIjC;IACD,IAAI,EAAE,QAAQ,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CAe6C,CAAA;AAQ/G,eAAO,MAAM,iBAAiB,GAAI,2CAI/B;IACD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAA;IACrB,UAAU,EAAE,UAAU,CAAA;IACtB,KAAK,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACxB,KAAG,MAAM,CAAC,MAAM,CACf;IACE,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACrG,IAAI,EAAE,MAAM,CAAA;CACb,EACD,KAAK,EACL,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CAwGlC,CAAA"}
@@ -13,36 +13,36 @@ export class WSEdgeMessage extends Schema.Union(WSEdgeInit, WSEdgePayload) {
13
13
  }
14
14
  export const MessageMsgPack = Schema.MsgPack(WSEdgeMessage);
15
15
  export const connectViaWebSocket = ({ node, url, openTimeout, }) => Effect.gen(function* () {
16
- const disconnected = yield* Deferred.make();
17
16
  const socket = yield* Socket.makeWebSocket(url, { openTimeout });
18
17
  const edgeChannel = yield* makeWebSocketEdge({
19
18
  socket,
20
19
  socketType: { _tag: 'leaf', from: node.nodeName },
20
+ debug: { id: `node:${node.nodeName}` },
21
21
  });
22
22
  yield* node
23
23
  .addEdge({ target: 'ws', edgeChannel: edgeChannel.webChannel, replaceIfExists: true })
24
24
  .pipe(Effect.acquireRelease(() => node.removeEdge('ws').pipe(Effect.orDie)));
25
- yield* disconnected;
25
+ yield* edgeChannel.webChannel.closedDeferred;
26
26
  }).pipe(Effect.scoped, Effect.forever, Effect.interruptible, Effect.provide(binaryWebSocketConstructorLayer));
27
27
  const binaryWebSocketConstructorLayer = Layer.succeed(Socket.WebSocketConstructor, (url, protocols) => {
28
28
  const socket = new globalThis.WebSocket(url, protocols);
29
29
  socket.binaryType = 'arraybuffer';
30
30
  return socket;
31
31
  });
32
- export const makeWebSocketEdge = ({ socket, socketType, }) => Effect.scopeWithCloseable((scope) => Effect.gen(function* () {
32
+ export const makeWebSocketEdge = ({ socket, socketType, debug: debugInfo, }) => Effect.scopeWithCloseable((scope) => Effect.gen(function* () {
33
33
  const fromDeferred = yield* Deferred.make();
34
34
  const listenQueue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
35
35
  const schema = WebChannel.mapSchema(WebmeshSchema.Packet);
36
36
  const isConnectedLatch = yield* Effect.makeLatch(true);
37
37
  const closedDeferred = yield* Deferred.make().pipe(Effect.acquireRelease(Deferred.done(Exit.void)));
38
- const retryOpenTimeoutSchedule = Schedule.exponential(100).pipe(Schedule.whileInput((_) => _.reason === 'OpenTimeout' || _.reason === 'Open'));
39
- yield* Stream.never.pipe(Stream.pipeThroughChannel(Socket.toChannel(socket)), Stream.catchTag('SocketError', Effect.fn(function* (error) {
40
- // yield* Effect.logError(`[websocket-edge] Socket error`, error)
38
+ const retryOpenTimeoutSchedule = Schedule.union(Schedule.exponential(100), Schedule.spaced(5000)).pipe(Schedule.whileInput((_) => _.reason === 'OpenTimeout' || _.reason === 'Open'));
39
+ yield* Stream.never.pipe(Stream.pipeThroughChannel(Socket.toChannel(socket)), Stream.catchTag('SocketError', Effect.fnUntraced(function* (error) {
40
+ // yield* Effect.logError(`[websocket-edge] Socket error`, error, { socketType, debugId: debugInfo?.id })
41
41
  // In the case of the socket being closed, we're interrupting the stream
42
42
  // and close the WebChannel (which can be observed from the outside)
43
43
  if (error.reason === 'Close') {
44
- yield* isConnectedLatch.close;
45
44
  yield* Deferred.succeed(closedDeferred, undefined);
45
+ yield* isConnectedLatch.close;
46
46
  return yield* Effect.interrupt;
47
47
  }
48
48
  else {
@@ -58,7 +58,10 @@ export const makeWebSocketEdge = ({ socket, socketType, }) => Effect.scopeWithCl
58
58
  // yield* Effect.logDebug(`[websocket-edge] recv from ${msg.from}: ${decodedPayload._tag}`, decodedPayload)
59
59
  yield* Queue.offer(listenQueue, decodedPayload);
60
60
  }
61
- })), Stream.runDrain, Effect.interruptible, Effect.withSpan('makeWebSocketEdge:listen'), Effect.tapCauseLogPretty, Effect.forkScoped);
61
+ })), Stream.runDrain, Effect.tap(Effect.fnUntraced(function* () {
62
+ yield* Deferred.succeed(closedDeferred, undefined);
63
+ yield* isConnectedLatch.close;
64
+ })), Effect.interruptible, Effect.withSpan('makeWebSocketEdge:listen'), Effect.tapCauseLogPretty, Effect.forkScoped);
62
65
  const sendToSocket = yield* socket.writer;
63
66
  const initHandshake = (from) => sendToSocket(Schema.encodeSync(MessageMsgPack)({ _tag: 'WSEdgeInit', from }));
64
67
  if (socketType._tag === 'leaf') {
@@ -83,6 +86,7 @@ export const makeWebSocketEdge = ({ socket, socketType, }) => Effect.scopeWithCl
83
86
  schema,
84
87
  supportsTransferables: false,
85
88
  shutdown: Scope.close(scope, Exit.void),
89
+ debugInfo,
86
90
  };
87
91
  return { webChannel, from };
88
92
  }).pipe(Effect.withSpanScoped('makeWebSocketEdge'), Effect.orDie));
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-edge.js","sourceRoot":"","sources":["../src/websocket-edge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"websocket-edge.js","sourceRoot":"","sources":["../src/websocket-edge.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EACR,MAAM,EACN,MAAM,EACN,IAAI,EACJ,KAAK,EACL,KAAK,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,MAAM,EACN,MAAM,EACN,UAAU,GACX,MAAM,yBAAyB,CAAA;AAEhC,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAA;AAGjD,MAAM,OAAO,UAAW,SAAQ,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE;IAChE,IAAI,EAAE,MAAM,CAAC,MAAM;CACpB,CAAC;CAAG;AAEL,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE;IACtE,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,OAAO,EAAE,MAAM,CAAC,GAAG;CACpB,CAAC;CAAG;AAEL,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,aAAa,CAAC;CAAG;AAE7E,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;AAW3D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAClC,IAAI,EACJ,GAAG,EACH,WAAW,GAKZ,EAAmE,EAAE,CACpE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;IAEhE,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC;QAC3C,MAAM;QACN,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;QACjD,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,IAAI,CAAC,QAAQ,EAAE,EAAE;KACvC,CAAC,CAAA;IAEF,KAAK,CAAC,CAAC,IAAI;SACR,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,UAAU,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;SACrF,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAE9E,KAAK,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,cAAc,CAAA;AAC9C,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAA;AAE/G,MAAM,+BAA+B,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE;IACpG,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;IACvD,MAAM,CAAC,UAAU,GAAG,aAAa,CAAA;IACjC,OAAO,MAAM,CAAA;AACf,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAChC,MAAM,EACN,UAAU,EACV,KAAK,EAAE,SAAS,GAKjB,EAOC,EAAE,CACF,MAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,EAAE,CAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAU,CAAA;IAEnD,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,SAAS,EAAoC,CAAC,IAAI,CACjF,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CACtC,CAAA;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;IAEzD,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IAEtD,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAEzG,MAAM,wBAAwB,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CACpG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAqB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAClG,CAAA;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CACtB,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EACnD,MAAM,CAAC,QAAQ,CACb,aAAa,EACb,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK;QAChC,yGAAyG;QACzG,wEAAwE;QACxE,oEAAoE;QACpE,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC7B,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,SAAS,CAAC,CAAA;YAClD,KAAK,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAA;YAC7B,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAA;QAChC,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,CAAC;IACH,CAAC,CAAC,CACH,EACD,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,EACtC,MAAM,CAAC,GAAG,CACR,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK;QACxB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;QACvE,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC9B,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;QACjD,CAAC;aAAM,CAAC;YACN,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACvE,2GAA2G;YAC3G,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,cAAc,CAAC,CAAA;QACjD,CAAC;IACH,CAAC,CAAC,CACH,EACD,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,GAAG,CACR,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;QACzB,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,SAAS,CAAC,CAAA;QAClD,KAAK,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAA;IAC/B,CAAC,CAAC,CACH,EACD,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAC3C,MAAM,CAAC,iBAAiB,EACxB,MAAM,CAAC,UAAU,CAClB,CAAA;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA;IAEzC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE,CACrC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAE/E,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC/B,KAAK,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,YAAY,CAAA;IAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAA;IAE1E,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAChC,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,OAAyC,EAAE,EAAE,CACzD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,KAAK,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAA;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAA;QAC1D,KAAK,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAClG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAEvB,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAC/C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EACxB,UAAU,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAC/C,CAAA;IAED,MAAM,UAAU,GAAG;QACjB,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,gBAAgB;QAC1D,IAAI;QACJ,MAAM;QACN,cAAc;QACd,MAAM;QACN,qBAAqB,EAAE,KAAK;QAC5B,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;QACvC,SAAS;KAC0F,CAAA;IAErG,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;AAC7B,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAClE,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@livestore/webmesh",
3
- "version": "0.3.0-dev.46",
3
+ "version": "0.3.0-dev.48",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": {
@@ -15,11 +15,11 @@
15
15
  },
16
16
  "types": "./dist/mod.d.ts",
17
17
  "dependencies": {
18
- "@livestore/utils": "0.3.0-dev.46"
18
+ "@livestore/utils": "0.3.0-dev.48"
19
19
  },
20
20
  "devDependencies": {
21
21
  "vitest": "^3.1.2",
22
- "@livestore/utils-dev": "0.3.0-dev.46"
22
+ "@livestore/utils-dev": "0.3.0-dev.48"
23
23
  },
24
24
  "files": [
25
25
  "package.json",
@@ -49,20 +49,19 @@ export const connectViaWebSocket = ({
49
49
  openTimeout?: number
50
50
  }): Effect.Effect<void, never, Scope.Scope | HttpClient.HttpClient> =>
51
51
  Effect.gen(function* () {
52
- const disconnected = yield* Deferred.make<void>()
53
-
54
52
  const socket = yield* Socket.makeWebSocket(url, { openTimeout })
55
53
 
56
54
  const edgeChannel = yield* makeWebSocketEdge({
57
55
  socket,
58
56
  socketType: { _tag: 'leaf', from: node.nodeName },
57
+ debug: { id: `node:${node.nodeName}` },
59
58
  })
60
59
 
61
60
  yield* node
62
61
  .addEdge({ target: 'ws', edgeChannel: edgeChannel.webChannel, replaceIfExists: true })
63
62
  .pipe(Effect.acquireRelease(() => node.removeEdge('ws').pipe(Effect.orDie)))
64
63
 
65
- yield* disconnected
64
+ yield* edgeChannel.webChannel.closedDeferred
66
65
  }).pipe(Effect.scoped, Effect.forever, Effect.interruptible, Effect.provide(binaryWebSocketConstructorLayer))
67
66
 
68
67
  const binaryWebSocketConstructorLayer = Layer.succeed(Socket.WebSocketConstructor, (url, protocols) => {
@@ -74,9 +73,11 @@ const binaryWebSocketConstructorLayer = Layer.succeed(Socket.WebSocketConstructo
74
73
  export const makeWebSocketEdge = ({
75
74
  socket,
76
75
  socketType,
76
+ debug: debugInfo,
77
77
  }: {
78
78
  socket: Socket.Socket
79
79
  socketType: SocketType
80
+ debug?: { id?: string }
80
81
  }): Effect.Effect<
81
82
  {
82
83
  webChannel: WebChannel.WebChannel<typeof WebmeshSchema.Packet.Type, typeof WebmeshSchema.Packet.Type>
@@ -99,7 +100,7 @@ export const makeWebSocketEdge = ({
99
100
 
100
101
  const closedDeferred = yield* Deferred.make<void>().pipe(Effect.acquireRelease(Deferred.done(Exit.void)))
101
102
 
102
- const retryOpenTimeoutSchedule = Schedule.exponential(100).pipe(
103
+ const retryOpenTimeoutSchedule = Schedule.union(Schedule.exponential(100), Schedule.spaced(5000)).pipe(
103
104
  Schedule.whileInput((_: Socket.SocketError) => _.reason === 'OpenTimeout' || _.reason === 'Open'),
104
105
  )
105
106
 
@@ -107,13 +108,13 @@ export const makeWebSocketEdge = ({
107
108
  Stream.pipeThroughChannel(Socket.toChannel(socket)),
108
109
  Stream.catchTag(
109
110
  'SocketError',
110
- Effect.fn(function* (error) {
111
- // yield* Effect.logError(`[websocket-edge] Socket error`, error)
111
+ Effect.fnUntraced(function* (error) {
112
+ // yield* Effect.logError(`[websocket-edge] Socket error`, error, { socketType, debugId: debugInfo?.id })
112
113
  // In the case of the socket being closed, we're interrupting the stream
113
114
  // and close the WebChannel (which can be observed from the outside)
114
115
  if (error.reason === 'Close') {
115
- yield* isConnectedLatch.close
116
116
  yield* Deferred.succeed(closedDeferred, undefined)
117
+ yield* isConnectedLatch.close
117
118
  return yield* Effect.interrupt
118
119
  } else {
119
120
  return yield* Effect.fail(error)
@@ -134,6 +135,12 @@ export const makeWebSocketEdge = ({
134
135
  }),
135
136
  ),
136
137
  Stream.runDrain,
138
+ Effect.tap(
139
+ Effect.fnUntraced(function* () {
140
+ yield* Deferred.succeed(closedDeferred, undefined)
141
+ yield* isConnectedLatch.close
142
+ }),
143
+ ),
137
144
  Effect.interruptible,
138
145
  Effect.withSpan('makeWebSocketEdge:listen'),
139
146
  Effect.tapCauseLogPretty,
@@ -176,6 +183,7 @@ export const makeWebSocketEdge = ({
176
183
  schema,
177
184
  supportsTransferables: false,
178
185
  shutdown: Scope.close(scope, Exit.void),
186
+ debugInfo,
179
187
  } satisfies WebChannel.WebChannel<typeof WebmeshSchema.Packet.Type, typeof WebmeshSchema.Packet.Type>
180
188
 
181
189
  return { webChannel, from }