@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.
package/dist/websocket-edge.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/websocket-edge.js
CHANGED
|
@@ -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*
|
|
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.
|
|
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.
|
|
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":"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,
|
|
1
|
+
{"version":3,"file":"websocket-edge.js","sourceRoot":"","sources":["../src/websocket-edge.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/webmesh",
|
|
3
|
-
"version": "0.3.0-dev.
|
|
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.
|
|
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.
|
|
22
|
+
"@livestore/utils-dev": "0.3.0-dev.48"
|
|
23
23
|
},
|
|
24
24
|
"files": [
|
|
25
25
|
"package.json",
|
package/src/websocket-edge.ts
CHANGED
|
@@ -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*
|
|
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.
|
|
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 }
|