@dxos/network-manager 0.6.12-main.ed7cda7 → 0.6.12-staging.0b4bb48
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/lib/browser/{chunk-YOKKEU6T.mjs → chunk-XYSYUN63.mjs} +998 -1192
- package/dist/lib/browser/chunk-XYSYUN63.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +19 -10
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +27 -18
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/node/{chunk-7ZWQLO5T.cjs → chunk-4YAYC7WN.cjs} +1166 -1233
- package/dist/lib/node/chunk-4YAYC7WN.cjs.map +7 -0
- package/dist/lib/node/index.cjs +37 -27
- package/dist/lib/node/index.cjs.map +2 -2
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +29 -20
- package/dist/lib/node/testing/index.cjs.map +3 -3
- package/dist/types/src/signal/integration.test.d.ts +2 -0
- package/dist/types/src/signal/integration.test.d.ts.map +1 -0
- package/dist/types/src/signal/swarm-messenger.test.d.ts +2 -0
- package/dist/types/src/signal/swarm-messenger.test.d.ts.map +1 -0
- package/dist/types/src/swarm/connection.d.ts.map +1 -1
- package/dist/types/src/swarm/swarm.d.ts +1 -1
- package/dist/types/src/testing/test-builder.d.ts +2 -2
- package/dist/types/src/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/tests/basic-test-suite.d.ts.map +1 -1
- package/dist/types/src/tests/property-test-suite.d.ts.map +1 -1
- package/dist/types/src/tests/tcp-transport.test.d.ts +2 -0
- package/dist/types/src/tests/tcp-transport.test.d.ts.map +1 -0
- package/dist/types/src/tests/utils.d.ts.map +1 -1
- package/dist/types/src/transport/index.d.ts +5 -1
- package/dist/types/src/transport/index.d.ts.map +1 -1
- package/dist/types/src/transport/libdatachannel-transport.d.ts +42 -0
- package/dist/types/src/transport/libdatachannel-transport.d.ts.map +1 -0
- package/dist/types/src/transport/libdatachannel-transport.test.d.ts +2 -0
- package/dist/types/src/transport/libdatachannel-transport.test.d.ts.map +1 -0
- package/dist/types/src/transport/memory-transport.d.ts +2 -2
- package/dist/types/src/transport/memory-transport.d.ts.map +1 -1
- package/dist/types/src/transport/memory-transport.test.d.ts +2 -0
- package/dist/types/src/transport/memory-transport.test.d.ts.map +1 -0
- package/dist/types/src/transport/simplepeer-simple-peer.d.ts +2 -0
- package/dist/types/src/transport/simplepeer-simple-peer.d.ts.map +1 -0
- package/dist/types/src/transport/simplepeer-transport-proxy-test.d.ts +2 -0
- package/dist/types/src/transport/simplepeer-transport-proxy-test.d.ts.map +1 -0
- package/dist/types/src/transport/{webrtc/rtc-transport-proxy.d.ts → simplepeer-transport-proxy.d.ts} +12 -10
- package/dist/types/src/transport/simplepeer-transport-proxy.d.ts.map +1 -0
- package/dist/types/src/transport/{webrtc/rtc-transport-service.d.ts → simplepeer-transport-service.d.ts} +7 -9
- package/dist/types/src/transport/simplepeer-transport-service.d.ts.map +1 -0
- package/dist/types/src/transport/simplepeer-transport.d.ts +36 -0
- package/dist/types/src/transport/simplepeer-transport.d.ts.map +1 -0
- package/dist/types/src/transport/simplepeer-transport.test.d.ts +2 -0
- package/dist/types/src/transport/simplepeer-transport.test.d.ts.map +1 -0
- package/dist/types/src/transport/{tcp/tcp-transport.browser.d.ts → tcp-transport.browser.d.ts} +3 -3
- package/dist/types/src/transport/tcp-transport.browser.d.ts.map +1 -0
- package/dist/types/src/transport/{tcp/tcp-transport.d.ts → tcp-transport.d.ts} +3 -3
- package/dist/types/src/transport/tcp-transport.d.ts.map +1 -0
- package/dist/types/src/transport/transport.d.ts +6 -7
- package/dist/types/src/transport/transport.d.ts.map +1 -1
- package/dist/types/src/transport/webrtc.d.ts +6 -0
- package/dist/types/src/transport/webrtc.d.ts.map +1 -0
- package/package.json +30 -53
- package/src/globals.d.ts +7 -0
- package/src/signal/ice.test.ts +3 -1
- package/src/signal/{integration.node.test.ts → integration.test.ts} +15 -9
- package/src/signal/{swarm-messenger.node.test.ts → swarm-messenger.test.ts} +23 -13
- package/src/swarm/connection-limiter.test.ts +6 -3
- package/src/swarm/connection.test.ts +38 -63
- package/src/swarm/connection.ts +5 -5
- package/src/swarm/swarm.test.ts +11 -9
- package/src/swarm/swarm.ts +1 -1
- package/src/testing/test-builder.ts +28 -12
- package/src/tests/basic-test-suite.ts +33 -34
- package/src/tests/memory-transport.test.ts +42 -40
- package/src/tests/property-test-suite.ts +22 -21
- package/src/tests/tcp-transport.test.ts +67 -0
- package/src/tests/utils.ts +2 -3
- package/src/tests/webrtc-transport.test.ts +9 -9
- package/src/transport/index.ts +5 -1
- package/src/transport/libdatachannel-transport.test.ts +100 -0
- package/src/transport/libdatachannel-transport.ts +376 -0
- package/src/transport/memory-transport.test.ts +74 -0
- package/src/transport/memory-transport.ts +0 -2
- package/src/transport/simplepeer-simple-peer.ts +26 -0
- package/src/transport/simplepeer-transport-proxy-test.ts +181 -0
- package/src/transport/simplepeer-transport-proxy.ts +246 -0
- package/src/transport/simplepeer-transport-service.ts +160 -0
- package/src/transport/simplepeer-transport.test.ts +61 -0
- package/src/transport/simplepeer-transport.ts +250 -0
- package/src/transport/{tcp/tcp-transport.browser.ts → tcp-transport.browser.ts} +3 -7
- package/src/transport/{tcp/tcp-transport.ts → tcp-transport.ts} +1 -3
- package/src/transport/transport.ts +7 -8
- package/src/transport/webrtc.ts +15 -0
- package/src/typings.d.ts +2 -8
- package/dist/lib/browser/chunk-GW3YM55A.mjs +0 -14
- package/dist/lib/browser/chunk-GW3YM55A.mjs.map +0 -7
- package/dist/lib/browser/chunk-YOKKEU6T.mjs.map +0 -7
- package/dist/lib/browser/transport/tcp/index.mjs +0 -39
- package/dist/lib/browser/transport/tcp/index.mjs.map +0 -7
- package/dist/lib/node/chunk-7ZWQLO5T.cjs.map +0 -7
- package/dist/lib/node/transport/tcp/index.cjs +0 -191
- package/dist/lib/node/transport/tcp/index.cjs.map +0 -7
- package/dist/lib/node-esm/chunk-4VO725JT.mjs +0 -4383
- package/dist/lib/node-esm/chunk-4VO725JT.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -50
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/testing/index.mjs +0 -280
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/transport/tcp/index.mjs +0 -159
- package/dist/lib/node-esm/transport/tcp/index.mjs.map +0 -7
- package/dist/types/src/signal/integration.node.test.d.ts +0 -2
- package/dist/types/src/signal/integration.node.test.d.ts.map +0 -1
- package/dist/types/src/signal/swarm-messenger.node.test.d.ts +0 -2
- package/dist/types/src/signal/swarm-messenger.node.test.d.ts.map +0 -1
- package/dist/types/src/tests/tcp-transport.node.test.d.ts +0 -2
- package/dist/types/src/tests/tcp-transport.node.test.d.ts.map +0 -1
- package/dist/types/src/transport/tcp/index.d.ts +0 -2
- package/dist/types/src/transport/tcp/index.d.ts.map +0 -1
- package/dist/types/src/transport/tcp/tcp-transport.browser.d.ts.map +0 -1
- package/dist/types/src/transport/tcp/tcp-transport.d.ts.map +0 -1
- package/dist/types/src/transport/webrtc/index.d.ts +0 -4
- package/dist/types/src/transport/webrtc/index.d.ts.map +0 -1
- package/dist/types/src/transport/webrtc/rtc-connection-factory.d.ts +0 -14
- package/dist/types/src/transport/webrtc/rtc-connection-factory.d.ts.map +0 -1
- package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts +0 -68
- package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts.map +0 -1
- package/dist/types/src/transport/webrtc/rtc-transport-channel.d.ts +0 -33
- package/dist/types/src/transport/webrtc/rtc-transport-channel.d.ts.map +0 -1
- package/dist/types/src/transport/webrtc/rtc-transport-channel.test.d.ts +0 -2
- package/dist/types/src/transport/webrtc/rtc-transport-channel.test.d.ts.map +0 -1
- package/dist/types/src/transport/webrtc/rtc-transport-factory.d.ts +0 -4
- package/dist/types/src/transport/webrtc/rtc-transport-factory.d.ts.map +0 -1
- package/dist/types/src/transport/webrtc/rtc-transport-proxy.d.ts.map +0 -1
- package/dist/types/src/transport/webrtc/rtc-transport-proxy.test.d.ts +0 -2
- package/dist/types/src/transport/webrtc/rtc-transport-proxy.test.d.ts.map +0 -1
- package/dist/types/src/transport/webrtc/rtc-transport-service.d.ts.map +0 -1
- package/dist/types/src/transport/webrtc/rtc-transport-stats.d.ts +0 -4
- package/dist/types/src/transport/webrtc/rtc-transport-stats.d.ts.map +0 -1
- package/dist/types/src/transport/webrtc/rtc-transport.test.d.ts +0 -2
- package/dist/types/src/transport/webrtc/rtc-transport.test.d.ts.map +0 -1
- package/dist/types/src/transport/webrtc/test-utils.d.ts +0 -5
- package/dist/types/src/transport/webrtc/test-utils.d.ts.map +0 -1
- package/dist/types/src/transport/webrtc/utils.d.ts +0 -3
- package/dist/types/src/transport/webrtc/utils.d.ts.map +0 -1
- package/src/tests/tcp-transport.node.test.ts +0 -65
- package/src/transport/tcp/index.ts +0 -5
- package/src/transport/webrtc/index.ts +0 -7
- package/src/transport/webrtc/rtc-connection-factory.ts +0 -82
- package/src/transport/webrtc/rtc-peer-connection.ts +0 -472
- package/src/transport/webrtc/rtc-transport-channel.test.ts +0 -176
- package/src/transport/webrtc/rtc-transport-channel.ts +0 -195
- package/src/transport/webrtc/rtc-transport-factory.ts +0 -28
- package/src/transport/webrtc/rtc-transport-proxy.test.ts +0 -413
- package/src/transport/webrtc/rtc-transport-proxy.ts +0 -264
- package/src/transport/webrtc/rtc-transport-service.ts +0 -192
- package/src/transport/webrtc/rtc-transport-stats.ts +0 -67
- package/src/transport/webrtc/rtc-transport.test.ts +0 -198
- package/src/transport/webrtc/test-utils.ts +0 -22
- package/src/transport/webrtc/utils.ts +0 -36
|
@@ -26,32 +26,37 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
mod
|
|
27
27
|
));
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
var
|
|
30
|
-
__export(
|
|
29
|
+
var chunk_4YAYC7WN_exports = {};
|
|
30
|
+
__export(chunk_4YAYC7WN_exports, {
|
|
31
31
|
Connection: () => Connection,
|
|
32
32
|
ConnectionLimiter: () => ConnectionLimiter,
|
|
33
33
|
ConnectionLog: () => ConnectionLog,
|
|
34
34
|
ConnectionState: () => ConnectionState,
|
|
35
35
|
EventType: () => EventType,
|
|
36
36
|
FullyConnectedTopology: () => FullyConnectedTopology,
|
|
37
|
+
LibDataChannelTransport: () => LibDataChannelTransport,
|
|
37
38
|
MAX_CONCURRENT_INITIATING_CONNECTIONS: () => MAX_CONCURRENT_INITIATING_CONNECTIONS,
|
|
38
39
|
MMSTTopology: () => MMSTTopology,
|
|
39
40
|
MemoryTransport: () => MemoryTransport,
|
|
40
41
|
MemoryTransportFactory: () => MemoryTransportFactory,
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
SimplePeerTransport: () => SimplePeerTransport,
|
|
43
|
+
SimplePeerTransportProxy: () => SimplePeerTransportProxy,
|
|
44
|
+
SimplePeerTransportProxyFactory: () => SimplePeerTransportProxyFactory,
|
|
45
|
+
SimplePeerTransportService: () => SimplePeerTransportService,
|
|
44
46
|
StarTopology: () => StarTopology,
|
|
45
47
|
Swarm: () => Swarm,
|
|
46
48
|
SwarmMapper: () => SwarmMapper,
|
|
47
49
|
SwarmMessenger: () => SwarmMessenger,
|
|
48
50
|
SwarmNetworkManager: () => SwarmNetworkManager,
|
|
51
|
+
TcpTransport: () => TcpTransport,
|
|
52
|
+
TcpTransportFactory: () => TcpTransportFactory,
|
|
49
53
|
TransportKind: () => TransportKind,
|
|
50
54
|
createIceProvider: () => createIceProvider,
|
|
51
|
-
|
|
55
|
+
createLibDataChannelTransportFactory: () => createLibDataChannelTransportFactory,
|
|
56
|
+
createSimplePeerTransportFactory: () => createSimplePeerTransportFactory,
|
|
52
57
|
createTeleportProtocolFactory: () => createTeleportProtocolFactory
|
|
53
58
|
});
|
|
54
|
-
module.exports = __toCommonJS(
|
|
59
|
+
module.exports = __toCommonJS(chunk_4YAYC7WN_exports);
|
|
55
60
|
var import_async = require("@dxos/async");
|
|
56
61
|
var import_context = require("@dxos/context");
|
|
57
62
|
var import_debug = require("@dxos/debug");
|
|
@@ -120,37 +125,46 @@ var import_invariant10 = require("@dxos/invariant");
|
|
|
120
125
|
var import_keys9 = require("@dxos/keys");
|
|
121
126
|
var import_log11 = require("@dxos/log");
|
|
122
127
|
var import_util8 = require("@dxos/util");
|
|
128
|
+
var import_simple_peer = __toESM(require("simple-peer"));
|
|
129
|
+
var import_tiny_invariant = __toESM(require("tiny-invariant"));
|
|
123
130
|
var import_async10 = require("@dxos/async");
|
|
124
|
-
var
|
|
125
|
-
var
|
|
131
|
+
var import_debug5 = require("@dxos/debug");
|
|
132
|
+
var import_keys10 = require("@dxos/keys");
|
|
126
133
|
var import_log12 = require("@dxos/log");
|
|
127
134
|
var import_protocols7 = require("@dxos/protocols");
|
|
128
|
-
var import_tracing = require("@dxos/tracing");
|
|
129
135
|
var import_node_stream2 = require("node:stream");
|
|
130
|
-
var
|
|
131
|
-
var
|
|
132
|
-
var
|
|
133
|
-
var import_invariant12 = require("@dxos/invariant");
|
|
136
|
+
var import_codec_protobuf = require("@dxos/codec-protobuf");
|
|
137
|
+
var import_invariant11 = require("@dxos/invariant");
|
|
138
|
+
var import_keys11 = require("@dxos/keys");
|
|
134
139
|
var import_log13 = require("@dxos/log");
|
|
135
|
-
var
|
|
140
|
+
var import_bridge = require("@dxos/protocols/proto/dxos/mesh/bridge");
|
|
141
|
+
var import_util9 = require("@dxos/util");
|
|
136
142
|
var import_node_stream3 = require("node:stream");
|
|
137
|
-
var
|
|
138
|
-
var
|
|
143
|
+
var import_async11 = require("@dxos/async");
|
|
144
|
+
var import_context6 = require("@dxos/context");
|
|
139
145
|
var import_debug6 = require("@dxos/debug");
|
|
140
|
-
var
|
|
141
|
-
var
|
|
146
|
+
var import_invariant12 = require("@dxos/invariant");
|
|
147
|
+
var import_keys12 = require("@dxos/keys");
|
|
142
148
|
var import_log14 = require("@dxos/log");
|
|
143
|
-
var
|
|
144
|
-
var import_bridge = require("@dxos/protocols/proto/dxos/mesh/bridge");
|
|
145
|
-
var import_util9 = require("@dxos/util");
|
|
146
|
-
var import_node_stream4 = require("node:stream");
|
|
147
|
-
var import_codec_protobuf = require("@dxos/codec-protobuf");
|
|
148
|
-
var import_invariant14 = require("@dxos/invariant");
|
|
149
|
-
var import_keys11 = require("@dxos/keys");
|
|
150
|
-
var import_log15 = require("@dxos/log");
|
|
149
|
+
var import_protocols8 = require("@dxos/protocols");
|
|
151
150
|
var import_bridge2 = require("@dxos/protocols/proto/dxos/mesh/bridge");
|
|
152
151
|
var import_util10 = require("@dxos/util");
|
|
152
|
+
var import_stream = require("stream");
|
|
153
|
+
var import_async12 = require("@dxos/async");
|
|
154
|
+
var import_debug7 = require("@dxos/debug");
|
|
155
|
+
var import_invariant13 = require("@dxos/invariant");
|
|
156
|
+
var import_log15 = require("@dxos/log");
|
|
157
|
+
var import_node_net = require("node:net");
|
|
158
|
+
var import_async13 = require("@dxos/async");
|
|
159
|
+
var import_debug8 = require("@dxos/debug");
|
|
160
|
+
var import_log16 = require("@dxos/log");
|
|
153
161
|
var import_teleport = require("@dxos/teleport");
|
|
162
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
163
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
164
|
+
}) : x)(function(x) {
|
|
165
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
166
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
167
|
+
});
|
|
154
168
|
function _ts_decorate(decorators, target, key, desc) {
|
|
155
169
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
156
170
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -186,11 +200,11 @@ var Connection = class {
|
|
|
186
200
|
this._callbacks = _callbacks;
|
|
187
201
|
this._ctx = new import_context.Context(void 0, {
|
|
188
202
|
F: __dxlog_file,
|
|
189
|
-
L:
|
|
203
|
+
L: 101
|
|
190
204
|
});
|
|
191
205
|
this.connectedTimeoutContext = new import_context.Context(void 0, {
|
|
192
206
|
F: __dxlog_file,
|
|
193
|
-
L:
|
|
207
|
+
L: 102
|
|
194
208
|
});
|
|
195
209
|
this._protocolClosed = new import_async.Trigger();
|
|
196
210
|
this._transportClosed = new import_async.Trigger();
|
|
@@ -213,7 +227,7 @@ var Connection = class {
|
|
|
213
227
|
initiator: this.initiator
|
|
214
228
|
}, {
|
|
215
229
|
F: __dxlog_file,
|
|
216
|
-
L:
|
|
230
|
+
L: 138,
|
|
217
231
|
S: this,
|
|
218
232
|
C: (f, a) => f(...a)
|
|
219
233
|
});
|
|
@@ -236,7 +250,7 @@ var Connection = class {
|
|
|
236
250
|
async openConnection() {
|
|
237
251
|
(0, import_invariant.invariant)(this._state === "INITIAL", "Invalid state.", {
|
|
238
252
|
F: __dxlog_file,
|
|
239
|
-
L:
|
|
253
|
+
L: 168,
|
|
240
254
|
S: this,
|
|
241
255
|
A: [
|
|
242
256
|
"this._state === ConnectionState.INITIAL",
|
|
@@ -247,7 +261,7 @@ var Connection = class {
|
|
|
247
261
|
id: this._instanceId
|
|
248
262
|
}), {
|
|
249
263
|
F: __dxlog_file,
|
|
250
|
-
L:
|
|
264
|
+
L: 169,
|
|
251
265
|
S: this,
|
|
252
266
|
C: (f, a) => f(...a)
|
|
253
267
|
});
|
|
@@ -259,7 +273,7 @@ var Connection = class {
|
|
|
259
273
|
initiator: this.initiator
|
|
260
274
|
}, {
|
|
261
275
|
F: __dxlog_file,
|
|
262
|
-
L:
|
|
276
|
+
L: 170,
|
|
263
277
|
S: this,
|
|
264
278
|
C: (f, a) => f(...a)
|
|
265
279
|
});
|
|
@@ -270,7 +284,7 @@ var Connection = class {
|
|
|
270
284
|
this._protocol.stream.on("close", () => {
|
|
271
285
|
(0, import_log.log)("protocol stream closed", void 0, {
|
|
272
286
|
F: __dxlog_file,
|
|
273
|
-
L:
|
|
287
|
+
L: 187,
|
|
274
288
|
S: this,
|
|
275
289
|
C: (f, a) => f(...a)
|
|
276
290
|
});
|
|
@@ -280,7 +294,7 @@ var Connection = class {
|
|
|
280
294
|
(0, import_async.scheduleTask)(this.connectedTimeoutContext, async () => {
|
|
281
295
|
import_log.log.info(`timeout waiting ${TRANSPORT_CONNECTION_TIMEOUT / 1e3}s for transport to connect, aborting`, void 0, {
|
|
282
296
|
F: __dxlog_file,
|
|
283
|
-
L:
|
|
297
|
+
L: 195,
|
|
284
298
|
S: this,
|
|
285
299
|
C: (f, a) => f(...a)
|
|
286
300
|
});
|
|
@@ -288,7 +302,7 @@ var Connection = class {
|
|
|
288
302
|
}, TRANSPORT_CONNECTION_TIMEOUT);
|
|
289
303
|
(0, import_invariant.invariant)(!this._transport, void 0, {
|
|
290
304
|
F: __dxlog_file,
|
|
291
|
-
L:
|
|
305
|
+
L: 203,
|
|
292
306
|
S: this,
|
|
293
307
|
A: [
|
|
294
308
|
"!this._transport",
|
|
@@ -296,14 +310,12 @@ var Connection = class {
|
|
|
296
310
|
]
|
|
297
311
|
});
|
|
298
312
|
this._transport = this._transportFactory.createTransport({
|
|
299
|
-
ownPeerKey: this.localInfo.peerKey,
|
|
300
|
-
remotePeerKey: this.remoteInfo.peerKey,
|
|
301
|
-
topic: this.topic.toHex(),
|
|
302
313
|
initiator: this.initiator,
|
|
303
314
|
stream: this._protocol.stream,
|
|
304
315
|
sendSignal: async (signal) => this._sendSignal(signal),
|
|
305
316
|
sessionId: this.sessionId
|
|
306
317
|
});
|
|
318
|
+
await this._transport.open();
|
|
307
319
|
this._transport.connected.once(async () => {
|
|
308
320
|
this._changeState("CONNECTED");
|
|
309
321
|
await this.connectedTimeoutContext.dispose();
|
|
@@ -349,13 +361,21 @@ var Connection = class {
|
|
|
349
361
|
C: (f, a) => f(...a)
|
|
350
362
|
});
|
|
351
363
|
this.abort().catch((err2) => this.errors.raise(err2));
|
|
364
|
+
} else if (err instanceof import_protocols.UnknownProtocolError) {
|
|
365
|
+
import_log.log.warn("unsure what to do with UnknownProtocolError, will keep on truckin", {
|
|
366
|
+
err
|
|
367
|
+
}, {
|
|
368
|
+
F: __dxlog_file,
|
|
369
|
+
L: 242,
|
|
370
|
+
S: this,
|
|
371
|
+
C: (f, a) => f(...a)
|
|
372
|
+
});
|
|
352
373
|
}
|
|
353
374
|
if (this._state !== "CLOSED" && this._state !== "CLOSING") {
|
|
354
375
|
await this.connectedTimeoutContext.dispose();
|
|
355
376
|
this.errors.raise(err);
|
|
356
377
|
}
|
|
357
378
|
});
|
|
358
|
-
await this._transport.open();
|
|
359
379
|
for (const signal of this._incomingSignalBuffer) {
|
|
360
380
|
void this._transport.onSignal(signal);
|
|
361
381
|
}
|
|
@@ -2892,12 +2912,11 @@ var MemoryTransport = class _MemoryTransport {
|
|
|
2892
2912
|
this.errors.raise(err);
|
|
2893
2913
|
});
|
|
2894
2914
|
}
|
|
2895
|
-
return this;
|
|
2896
2915
|
}
|
|
2897
2916
|
async close() {
|
|
2898
2917
|
(0, import_log11.log)("closing...", void 0, {
|
|
2899
2918
|
F: __dxlog_file12,
|
|
2900
|
-
L:
|
|
2919
|
+
L: 129,
|
|
2901
2920
|
S: this,
|
|
2902
2921
|
C: (f, a) => f(...a)
|
|
2903
2922
|
});
|
|
@@ -2918,18 +2937,17 @@ var MemoryTransport = class _MemoryTransport {
|
|
|
2918
2937
|
this.closed.emit();
|
|
2919
2938
|
(0, import_log11.log)("closed", void 0, {
|
|
2920
2939
|
F: __dxlog_file12,
|
|
2921
|
-
L:
|
|
2940
|
+
L: 157,
|
|
2922
2941
|
S: this,
|
|
2923
2942
|
C: (f, a) => f(...a)
|
|
2924
2943
|
});
|
|
2925
|
-
return this;
|
|
2926
2944
|
}
|
|
2927
2945
|
async onSignal({ payload }) {
|
|
2928
2946
|
(0, import_log11.log)("received signal", {
|
|
2929
2947
|
payload
|
|
2930
2948
|
}, {
|
|
2931
2949
|
F: __dxlog_file12,
|
|
2932
|
-
L:
|
|
2950
|
+
L: 161,
|
|
2933
2951
|
S: this,
|
|
2934
2952
|
C: (f, a) => f(...a)
|
|
2935
2953
|
});
|
|
@@ -2963,1367 +2981,1277 @@ _ts_decorate5([
|
|
|
2963
2981
|
var toError = (err) => err instanceof Error ? err : new Error(String(err));
|
|
2964
2982
|
var TransportKind;
|
|
2965
2983
|
(function(TransportKind2) {
|
|
2966
|
-
TransportKind2["
|
|
2967
|
-
TransportKind2["
|
|
2984
|
+
TransportKind2["SIMPLE_PEER"] = "SIMPLE_PEER";
|
|
2985
|
+
TransportKind2["SIMPLE_PEER_PROXY"] = "SIMPLE_PEER_PROXY";
|
|
2986
|
+
TransportKind2["LIBDATACHANNEL"] = "LIBDATACHANNEL";
|
|
2968
2987
|
TransportKind2["MEMORY"] = "MEMORY";
|
|
2969
2988
|
TransportKind2["TCP"] = "TCP";
|
|
2970
2989
|
})(TransportKind || (TransportKind = {}));
|
|
2971
|
-
var
|
|
2972
|
-
|
|
2973
|
-
|
|
2974
|
-
|
|
2975
|
-
|
|
2976
|
-
|
|
2977
|
-
|
|
2978
|
-
|
|
2979
|
-
|
|
2980
|
-
|
|
2981
|
-
}
|
|
2982
|
-
var
|
|
2983
|
-
|
|
2984
|
-
|
|
2985
|
-
|
|
2986
|
-
|
|
2987
|
-
|
|
2988
|
-
}
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
|
|
2992
|
-
|
|
2993
|
-
}
|
|
2994
|
-
async onConnectionDestroyed() {
|
|
2995
|
-
return _NodeRtcConnectionFactory._cleanupMutex.executeSynchronized(async () => {
|
|
2996
|
-
if (--_NodeRtcConnectionFactory._createdConnections === 0) {
|
|
2997
|
-
(await import("#node-datachannel")).cleanup();
|
|
2998
|
-
}
|
|
2999
|
-
});
|
|
2990
|
+
var wrtc = null;
|
|
2991
|
+
try {
|
|
2992
|
+
wrtc = __require("@koush/wrtc");
|
|
2993
|
+
} catch {
|
|
2994
|
+
}
|
|
2995
|
+
function _ts_decorate6(decorators, target, key, desc) {
|
|
2996
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
2997
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
2998
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
2999
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
3000
|
+
}
|
|
3001
|
+
var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/simplepeer-transport.ts";
|
|
3002
|
+
var createSimplePeerTransportFactory = (webrtcConfig, iceProvider) => ({
|
|
3003
|
+
createTransport: (options) => new SimplePeerTransport({
|
|
3004
|
+
...options,
|
|
3005
|
+
webrtcConfig,
|
|
3006
|
+
iceProvider
|
|
3007
|
+
})
|
|
3008
|
+
});
|
|
3009
|
+
var SimplePeerTransport = class {
|
|
3010
|
+
get isOpen() {
|
|
3011
|
+
return this._piped && !this._closed;
|
|
3000
3012
|
}
|
|
3001
|
-
|
|
3002
|
-
|
|
3003
|
-
|
|
3004
|
-
|
|
3005
|
-
|
|
3006
|
-
|
|
3013
|
+
/**
|
|
3014
|
+
* @params opts.config formatted as per https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/RTCPeerConnection
|
|
3015
|
+
*/
|
|
3016
|
+
constructor(_params) {
|
|
3017
|
+
this._params = _params;
|
|
3018
|
+
this._peer = void 0;
|
|
3019
|
+
this._closed = false;
|
|
3020
|
+
this._piped = false;
|
|
3021
|
+
this.closed = new import_async10.Event();
|
|
3022
|
+
this.connected = new import_async10.Event();
|
|
3023
|
+
this.errors = new import_debug5.ErrorStream();
|
|
3024
|
+
this._instanceId = import_keys10.PublicKey.random().toHex();
|
|
3007
3025
|
}
|
|
3008
|
-
async
|
|
3009
|
-
|
|
3010
|
-
|
|
3026
|
+
async getStats() {
|
|
3027
|
+
const stats = await this._getStats();
|
|
3028
|
+
if (!stats) {
|
|
3029
|
+
return {
|
|
3030
|
+
bytesSent: 0,
|
|
3031
|
+
bytesReceived: 0,
|
|
3032
|
+
packetsSent: 0,
|
|
3033
|
+
packetsReceived: 0,
|
|
3034
|
+
rawStats: {}
|
|
3035
|
+
};
|
|
3011
3036
|
}
|
|
3012
|
-
}
|
|
3013
|
-
};
|
|
3014
|
-
var getRtcConnectionFactory = () => {
|
|
3015
|
-
return typeof globalThis.RTCPeerConnection === "undefined" ? new NodeRtcConnectionFactory() : new BrowserRtcConnectionFactory();
|
|
3016
|
-
};
|
|
3017
|
-
var describeSelectedRemoteCandidate = async (connection) => {
|
|
3018
|
-
const stats = connection && await getRtcConnectionStats(connection);
|
|
3019
|
-
const rc = stats?.remoteCandidate;
|
|
3020
|
-
if (!rc) {
|
|
3021
|
-
return "unavailable";
|
|
3022
|
-
}
|
|
3023
|
-
if (rc.candidateType === "relay") {
|
|
3024
|
-
return `${rc.ip}:${rc.port} relay for ${rc.relatedAddress}:${rc.relatedPort}`;
|
|
3025
|
-
}
|
|
3026
|
-
return `${rc.ip}:${rc.port} ${rc.candidateType}`;
|
|
3027
|
-
};
|
|
3028
|
-
var createRtcTransportStats = async (connection, topic) => {
|
|
3029
|
-
const stats = connection && await getRtcConnectionStats(connection, topic);
|
|
3030
|
-
if (!stats) {
|
|
3031
3037
|
return {
|
|
3032
|
-
bytesSent:
|
|
3033
|
-
bytesReceived:
|
|
3034
|
-
packetsSent:
|
|
3035
|
-
packetsReceived:
|
|
3036
|
-
rawStats:
|
|
3038
|
+
bytesSent: stats.transport.bytesSent,
|
|
3039
|
+
bytesReceived: stats.transport.bytesReceived,
|
|
3040
|
+
packetsSent: stats.transport.packetsSent,
|
|
3041
|
+
packetsReceived: stats.transport.packetsReceived,
|
|
3042
|
+
rawStats: stats.raw
|
|
3037
3043
|
};
|
|
3038
3044
|
}
|
|
3039
|
-
|
|
3040
|
-
|
|
3041
|
-
|
|
3042
|
-
|
|
3043
|
-
|
|
3044
|
-
|
|
3045
|
-
|
|
3046
|
-
|
|
3047
|
-
|
|
3048
|
-
|
|
3049
|
-
|
|
3050
|
-
|
|
3051
|
-
|
|
3052
|
-
|
|
3053
|
-
|
|
3054
|
-
|
|
3055
|
-
|
|
3056
|
-
|
|
3057
|
-
|
|
3058
|
-
|
|
3059
|
-
|
|
3060
|
-
|
|
3061
|
-
};
|
|
3062
|
-
var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/webrtc/rtc-transport-channel.ts";
|
|
3063
|
-
var MAX_MESSAGE_SIZE = 64 * 1024;
|
|
3064
|
-
var MAX_BUFFERED_AMOUNT = 64 * 1024;
|
|
3065
|
-
var RtcTransportChannel = class extends import_context6.Resource {
|
|
3066
|
-
constructor(_connection, _options) {
|
|
3067
|
-
super();
|
|
3068
|
-
this._connection = _connection;
|
|
3069
|
-
this._options = _options;
|
|
3070
|
-
this.closed = new import_async12.Event();
|
|
3071
|
-
this.connected = new import_async12.Event();
|
|
3072
|
-
this.errors = new import_debug5.ErrorStream();
|
|
3073
|
-
this._streamDataFlushedCallback = null;
|
|
3074
|
-
this._isChannelCreationInProgress = false;
|
|
3075
|
-
}
|
|
3076
|
-
get isRtcChannelCreationInProgress() {
|
|
3077
|
-
return this._isChannelCreationInProgress;
|
|
3045
|
+
async _getStats() {
|
|
3046
|
+
if (typeof this._peer?._pc?.getStats !== "function") {
|
|
3047
|
+
return null;
|
|
3048
|
+
}
|
|
3049
|
+
return await this._peer._pc.getStats().then((stats) => {
|
|
3050
|
+
const statsEntries = Array.from(stats.entries());
|
|
3051
|
+
const transport = statsEntries.filter((s) => s[1].type === "transport")[0][1];
|
|
3052
|
+
const candidatePair = statsEntries.filter((s) => s[0] === transport.selectedCandidatePairId);
|
|
3053
|
+
let selectedCandidatePair;
|
|
3054
|
+
let remoteCandidate;
|
|
3055
|
+
if (candidatePair.length > 0) {
|
|
3056
|
+
selectedCandidatePair = candidatePair[0][1];
|
|
3057
|
+
remoteCandidate = statsEntries.filter((s) => s[0] === selectedCandidatePair.remoteCandidateId)[0][1];
|
|
3058
|
+
}
|
|
3059
|
+
return {
|
|
3060
|
+
datachannel: statsEntries.filter((s) => s[1].type === "data-channel")[0][1],
|
|
3061
|
+
transport,
|
|
3062
|
+
selectedCandidatePair,
|
|
3063
|
+
remoteCandidate,
|
|
3064
|
+
raw: Object.fromEntries(stats.entries())
|
|
3065
|
+
};
|
|
3066
|
+
});
|
|
3078
3067
|
}
|
|
3079
|
-
|
|
3080
|
-
|
|
3081
|
-
|
|
3068
|
+
async getDetails() {
|
|
3069
|
+
const stats = await this._getStats();
|
|
3070
|
+
const rc = stats?.remoteCandidate;
|
|
3071
|
+
if (!rc) {
|
|
3072
|
+
return "unavailable";
|
|
3082
3073
|
}
|
|
3074
|
+
if (rc.candidateType === "relay") {
|
|
3075
|
+
return `${rc.ip}:${rc.port}/${rc.protocol} relay for ${rc.relatedAddress}:${rc.relatedPort}`;
|
|
3076
|
+
}
|
|
3077
|
+
return `${rc.ip}:${rc.port}/${rc.protocol} ${rc.candidateType}`;
|
|
3083
3078
|
}
|
|
3084
|
-
async
|
|
3085
|
-
(
|
|
3079
|
+
async open() {
|
|
3080
|
+
import_log12.log.trace("dxos.mesh.webrtc-transport.open", import_protocols7.trace.begin({
|
|
3081
|
+
id: this._instanceId
|
|
3082
|
+
}), {
|
|
3086
3083
|
F: __dxlog_file13,
|
|
3087
|
-
L:
|
|
3084
|
+
L: 122,
|
|
3088
3085
|
S: this,
|
|
3089
|
-
|
|
3090
|
-
"!this._isChannelCreationInProgress",
|
|
3091
|
-
""
|
|
3092
|
-
]
|
|
3093
|
-
});
|
|
3094
|
-
this._isChannelCreationInProgress = true;
|
|
3095
|
-
this._connection.createDataChannel(this._options.topic).then((channel) => {
|
|
3096
|
-
if (this.isOpen) {
|
|
3097
|
-
this._channel = channel;
|
|
3098
|
-
this._initChannel(this._channel);
|
|
3099
|
-
} else {
|
|
3100
|
-
this._safeCloseChannel(channel);
|
|
3101
|
-
}
|
|
3102
|
-
}).catch((err) => {
|
|
3103
|
-
if (this.isOpen) {
|
|
3104
|
-
this.errors.raise(new import_protocols8.ConnectivityError(`Failed to create a channel: ${err?.message ?? "unknown reason."}`));
|
|
3105
|
-
}
|
|
3106
|
-
}).finally(() => {
|
|
3107
|
-
this._isChannelCreationInProgress = false;
|
|
3086
|
+
C: (f, a) => f(...a)
|
|
3108
3087
|
});
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
|
|
3112
|
-
this._safeCloseChannel(this._channel);
|
|
3113
|
-
this._channel = void 0;
|
|
3114
|
-
this._stream = void 0;
|
|
3115
|
-
}
|
|
3116
|
-
this.closed.emit();
|
|
3117
|
-
(0, import_log13.log)("closed", void 0, {
|
|
3088
|
+
(0, import_log12.log)("created connection", {
|
|
3089
|
+
params: this._params
|
|
3090
|
+
}, {
|
|
3118
3091
|
F: __dxlog_file13,
|
|
3119
|
-
L:
|
|
3092
|
+
L: 123,
|
|
3120
3093
|
S: this,
|
|
3121
3094
|
C: (f, a) => f(...a)
|
|
3122
3095
|
});
|
|
3123
|
-
|
|
3124
|
-
|
|
3125
|
-
|
|
3126
|
-
|
|
3127
|
-
|
|
3128
|
-
|
|
3129
|
-
|
|
3096
|
+
const providedIceServers = await this._params.iceProvider?.getIceServers();
|
|
3097
|
+
if (!this._params.webrtcConfig) {
|
|
3098
|
+
this._params.webrtcConfig = {};
|
|
3099
|
+
}
|
|
3100
|
+
this._params.webrtcConfig.iceServers = [
|
|
3101
|
+
...this._params.webrtcConfig.iceServers ?? [],
|
|
3102
|
+
...providedIceServers ?? []
|
|
3103
|
+
];
|
|
3104
|
+
this._peer = new import_simple_peer.default({
|
|
3105
|
+
channelName: "dxos.mesh.transport",
|
|
3106
|
+
initiator: this._params.initiator,
|
|
3107
|
+
wrtc: import_simple_peer.default.WEBRTC_SUPPORT ? void 0 : wrtc ?? (0, import_debug5.raise)(new Error("wrtc not available")),
|
|
3108
|
+
config: this._params.webrtcConfig
|
|
3109
|
+
});
|
|
3110
|
+
this._peer.on("signal", async (data) => {
|
|
3111
|
+
(0, import_log12.log)("signal", data, {
|
|
3112
|
+
F: __dxlog_file13,
|
|
3113
|
+
L: 142,
|
|
3114
|
+
S: this,
|
|
3115
|
+
C: (f, a) => f(...a)
|
|
3116
|
+
});
|
|
3117
|
+
await this._params.sendSignal({
|
|
3118
|
+
payload: {
|
|
3119
|
+
data
|
|
3120
|
+
}
|
|
3121
|
+
});
|
|
3122
|
+
});
|
|
3123
|
+
this._peer.on("connect", () => {
|
|
3124
|
+
(0, import_log12.log)("connected", void 0, {
|
|
3125
|
+
F: __dxlog_file13,
|
|
3126
|
+
L: 147,
|
|
3127
|
+
S: this,
|
|
3128
|
+
C: (f, a) => f(...a)
|
|
3129
|
+
});
|
|
3130
|
+
this._params.stream.pipe(this._peer).pipe(this._params.stream);
|
|
3131
|
+
this._piped = true;
|
|
3132
|
+
this.connected.emit();
|
|
3133
|
+
});
|
|
3134
|
+
this._peer.on("close", async () => {
|
|
3135
|
+
(0, import_log12.log)("closed", void 0, {
|
|
3136
|
+
F: __dxlog_file13,
|
|
3137
|
+
L: 154,
|
|
3138
|
+
S: this,
|
|
3139
|
+
C: (f, a) => f(...a)
|
|
3140
|
+
});
|
|
3141
|
+
await this.close();
|
|
3142
|
+
});
|
|
3143
|
+
this._peer.on("error", async (err) => {
|
|
3144
|
+
if (typeof RTCError !== "undefined" && err instanceof RTCError) {
|
|
3145
|
+
if (err.errorDetail === "sctp-failure") {
|
|
3146
|
+
this.errors.raise(new import_protocols7.ConnectionResetError("sctp-failure from RTCError", err));
|
|
3147
|
+
} else {
|
|
3148
|
+
import_log12.log.info("unknown RTCError", {
|
|
3149
|
+
err
|
|
3130
3150
|
}, {
|
|
3131
3151
|
F: __dxlog_file13,
|
|
3132
|
-
L:
|
|
3152
|
+
L: 165,
|
|
3133
3153
|
S: this,
|
|
3134
3154
|
C: (f, a) => f(...a)
|
|
3135
3155
|
});
|
|
3136
|
-
this.
|
|
3137
|
-
return;
|
|
3156
|
+
this.errors.raise(new import_protocols7.UnknownProtocolError("unknown RTCError", err));
|
|
3138
3157
|
}
|
|
3139
|
-
|
|
3158
|
+
} else if ("code" in err) {
|
|
3159
|
+
import_log12.log.info("simple-peer error", err, {
|
|
3140
3160
|
F: __dxlog_file13,
|
|
3141
|
-
L:
|
|
3161
|
+
L: 170,
|
|
3142
3162
|
S: this,
|
|
3143
3163
|
C: (f, a) => f(...a)
|
|
3144
3164
|
});
|
|
3145
|
-
|
|
3146
|
-
|
|
3147
|
-
|
|
3148
|
-
|
|
3149
|
-
|
|
3150
|
-
|
|
3151
|
-
|
|
3152
|
-
|
|
3153
|
-
|
|
3154
|
-
|
|
3155
|
-
|
|
3156
|
-
|
|
3157
|
-
|
|
3165
|
+
switch (err.code) {
|
|
3166
|
+
case "ERR_WEBRTC_SUPPORT":
|
|
3167
|
+
this.errors.raise(new import_protocols7.ProtocolError("WebRTC not supported", err));
|
|
3168
|
+
break;
|
|
3169
|
+
case "ERR_SIGNALING":
|
|
3170
|
+
this.errors.raise(new import_protocols7.ConnectivityError("signaling failure", err));
|
|
3171
|
+
break;
|
|
3172
|
+
case "ERR_ICE_CONNECTION_FAILURE":
|
|
3173
|
+
case "ERR_DATA_CHANNEL":
|
|
3174
|
+
case "ERR_CONNECTION_FAILURE":
|
|
3175
|
+
this.errors.raise(new import_protocols7.ConnectivityError("unknown communication failure", err));
|
|
3176
|
+
break;
|
|
3177
|
+
// errors due to library issues or improper API usage
|
|
3178
|
+
case "ERR_CREATE_OFFER":
|
|
3179
|
+
case "ERR_CREATE_ANSWER":
|
|
3180
|
+
case "ERR_SET_LOCAL_DESCRIPTION":
|
|
3181
|
+
case "ERR_SET_REMOTE_DESCRIPTION":
|
|
3182
|
+
case "ERR_ADD_ICE_CANDIDATE":
|
|
3183
|
+
this.errors.raise(new import_protocols7.UnknownProtocolError("unknown simple-peer library failure", err));
|
|
3184
|
+
break;
|
|
3185
|
+
default:
|
|
3186
|
+
this.errors.raise(new Error("unknown simple-peer error"));
|
|
3187
|
+
break;
|
|
3188
|
+
}
|
|
3189
|
+
} else {
|
|
3190
|
+
import_log12.log.info("unknown peer connection error", err, {
|
|
3158
3191
|
F: __dxlog_file13,
|
|
3159
|
-
L:
|
|
3192
|
+
L: 196,
|
|
3160
3193
|
S: this,
|
|
3161
3194
|
C: (f, a) => f(...a)
|
|
3162
3195
|
});
|
|
3163
|
-
|
|
3164
|
-
}
|
|
3165
|
-
|
|
3166
|
-
if (
|
|
3167
|
-
|
|
3168
|
-
|
|
3169
|
-
|
|
3170
|
-
|
|
3171
|
-
|
|
3196
|
+
this.errors.raise(err);
|
|
3197
|
+
}
|
|
3198
|
+
try {
|
|
3199
|
+
if (typeof this._peer?._pc?.getStats === "function") {
|
|
3200
|
+
this._peer._pc.getStats().then((stats) => {
|
|
3201
|
+
import_log12.log.info("report after webrtc error", {
|
|
3202
|
+
config: this._params.webrtcConfig,
|
|
3203
|
+
stats: Object.fromEntries(stats.entries())
|
|
3204
|
+
}, {
|
|
3205
|
+
F: __dxlog_file13,
|
|
3206
|
+
L: 204,
|
|
3207
|
+
S: this,
|
|
3208
|
+
C: (f, a) => f(...a)
|
|
3209
|
+
});
|
|
3172
3210
|
});
|
|
3173
|
-
return;
|
|
3174
|
-
}
|
|
3175
|
-
let data = event.data;
|
|
3176
|
-
if (data instanceof ArrayBuffer) {
|
|
3177
|
-
data = Buffer.from(data);
|
|
3178
|
-
}
|
|
3179
|
-
this._stream.push(data);
|
|
3180
|
-
},
|
|
3181
|
-
onerror: (event) => {
|
|
3182
|
-
if (this.isOpen) {
|
|
3183
|
-
const err = event.error instanceof Error ? event.error : new Error(`Datachannel error: ${event.type}.`);
|
|
3184
|
-
this.errors.raise(err);
|
|
3185
3211
|
}
|
|
3186
|
-
}
|
|
3187
|
-
|
|
3188
|
-
const cb = this._streamDataFlushedCallback;
|
|
3189
|
-
this._streamDataFlushedCallback = null;
|
|
3190
|
-
cb?.();
|
|
3191
|
-
}
|
|
3192
|
-
});
|
|
3193
|
-
}
|
|
3194
|
-
async _handleChannelWrite(chunk, callback) {
|
|
3195
|
-
if (!this._channel) {
|
|
3196
|
-
import_log13.log.warn("writing to a channel after a connection was closed", void 0, {
|
|
3197
|
-
F: __dxlog_file13,
|
|
3198
|
-
L: 145,
|
|
3199
|
-
S: this,
|
|
3200
|
-
C: (f, a) => f(...a)
|
|
3201
|
-
});
|
|
3202
|
-
return;
|
|
3203
|
-
}
|
|
3204
|
-
if (chunk.length > MAX_MESSAGE_SIZE) {
|
|
3205
|
-
const error = new Error(`Message too large: ${chunk.length} > ${MAX_MESSAGE_SIZE}.`);
|
|
3206
|
-
this.errors.raise(error);
|
|
3207
|
-
callback();
|
|
3208
|
-
return;
|
|
3209
|
-
}
|
|
3210
|
-
try {
|
|
3211
|
-
this._channel.send(chunk);
|
|
3212
|
-
} catch (err) {
|
|
3213
|
-
this.errors.raise(err);
|
|
3214
|
-
callback();
|
|
3215
|
-
return;
|
|
3216
|
-
}
|
|
3217
|
-
if (this._channel.bufferedAmount > MAX_BUFFERED_AMOUNT) {
|
|
3218
|
-
if (this._streamDataFlushedCallback !== null) {
|
|
3219
|
-
import_log13.log.error("consumer trying to write before we are ready for more data", void 0, {
|
|
3212
|
+
} catch (err2) {
|
|
3213
|
+
import_log12.log.catch(err2, void 0, {
|
|
3220
3214
|
F: __dxlog_file13,
|
|
3221
|
-
L:
|
|
3215
|
+
L: 211,
|
|
3222
3216
|
S: this,
|
|
3223
3217
|
C: (f, a) => f(...a)
|
|
3224
3218
|
});
|
|
3225
3219
|
}
|
|
3226
|
-
this.
|
|
3227
|
-
}
|
|
3228
|
-
|
|
3229
|
-
|
|
3220
|
+
await this.close();
|
|
3221
|
+
});
|
|
3222
|
+
import_log12.log.trace("dxos.mesh.webrtc-transport.open", import_protocols7.trace.end({
|
|
3223
|
+
id: this._instanceId
|
|
3224
|
+
}), {
|
|
3225
|
+
F: __dxlog_file13,
|
|
3226
|
+
L: 217,
|
|
3227
|
+
S: this,
|
|
3228
|
+
C: (f, a) => f(...a)
|
|
3229
|
+
});
|
|
3230
3230
|
}
|
|
3231
|
-
|
|
3232
|
-
|
|
3233
|
-
|
|
3234
|
-
|
|
3235
|
-
|
|
3236
|
-
|
|
3237
|
-
|
|
3238
|
-
|
|
3239
|
-
|
|
3240
|
-
});
|
|
3231
|
+
async close() {
|
|
3232
|
+
(0, import_log12.log)("closing...", void 0, {
|
|
3233
|
+
F: __dxlog_file13,
|
|
3234
|
+
L: 222,
|
|
3235
|
+
S: this,
|
|
3236
|
+
C: (f, a) => f(...a)
|
|
3237
|
+
});
|
|
3238
|
+
if (this._closed) {
|
|
3239
|
+
return;
|
|
3241
3240
|
}
|
|
3241
|
+
this._disconnectStreams();
|
|
3242
|
+
this._peer.destroy();
|
|
3243
|
+
this._closed = true;
|
|
3244
|
+
this.closed.emit();
|
|
3245
|
+
(0, import_log12.log)("closed", void 0, {
|
|
3246
|
+
F: __dxlog_file13,
|
|
3247
|
+
L: 230,
|
|
3248
|
+
S: this,
|
|
3249
|
+
C: (f, a) => f(...a)
|
|
3250
|
+
});
|
|
3242
3251
|
}
|
|
3243
|
-
onSignal(signal) {
|
|
3244
|
-
|
|
3245
|
-
|
|
3246
|
-
async getDetails() {
|
|
3247
|
-
return describeSelectedRemoteCandidate(this._connection.currentConnection);
|
|
3248
|
-
}
|
|
3249
|
-
async getStats() {
|
|
3250
|
-
return createRtcTransportStats(this._connection.currentConnection, this._options.topic);
|
|
3251
|
-
}
|
|
3252
|
-
};
|
|
3253
|
-
var chooseInitiatorPeer = (peer1Key, peer2Key) => peer1Key < peer2Key ? peer1Key : peer2Key;
|
|
3254
|
-
var areSdpEqual = (sdp1, sdp2) => {
|
|
3255
|
-
const sdp1Lines = deduplicatedSdpLines(sdp1);
|
|
3256
|
-
const sdp2Lines = deduplicatedSdpLines(sdp2);
|
|
3257
|
-
if (sdp1Lines.length !== sdp2Lines.length) {
|
|
3258
|
-
return false;
|
|
3259
|
-
}
|
|
3260
|
-
return sdp1Lines.every((line, idx) => line === sdp2Lines[idx]);
|
|
3261
|
-
};
|
|
3262
|
-
var deduplicatedSdpLines = (sdp) => {
|
|
3263
|
-
const deduplicatedLines = [];
|
|
3264
|
-
const seenLines = [];
|
|
3265
|
-
for (const line of sdp.split("\r\n")) {
|
|
3266
|
-
if (line.startsWith("m")) {
|
|
3267
|
-
seenLines.length = 0;
|
|
3268
|
-
}
|
|
3269
|
-
if (seenLines.includes(line)) {
|
|
3270
|
-
continue;
|
|
3252
|
+
async onSignal(signal) {
|
|
3253
|
+
if (this._closed) {
|
|
3254
|
+
return;
|
|
3271
3255
|
}
|
|
3272
|
-
|
|
3273
|
-
|
|
3256
|
+
(0, import_tiny_invariant.default)(signal.payload.data, "Signal message must contain signal data.");
|
|
3257
|
+
(0, import_tiny_invariant.default)(this._peer, "Peer must be initialized before receiving signals.");
|
|
3258
|
+
this._peer.signal(signal.payload.data);
|
|
3274
3259
|
}
|
|
3275
|
-
|
|
3276
|
-
|
|
3277
|
-
|
|
3278
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3279
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
3280
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
3281
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
3282
|
-
}
|
|
3283
|
-
var __dxlog_file14 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/webrtc/rtc-peer-connection.ts";
|
|
3284
|
-
var RtcPeerConnection = class {
|
|
3285
|
-
constructor(_factory, _options) {
|
|
3286
|
-
this._factory = _factory;
|
|
3287
|
-
this._options = _options;
|
|
3288
|
-
this._channelCreatedCallbacks = /* @__PURE__ */ new Map();
|
|
3289
|
-
this._transportChannels = /* @__PURE__ */ new Map();
|
|
3290
|
-
this._dataChannels = /* @__PURE__ */ new Map();
|
|
3291
|
-
this._readyForCandidates = new import_async11.Trigger();
|
|
3292
|
-
this._offerProcessingMutex = new import_async11.Mutex();
|
|
3293
|
-
this._initiator = chooseInitiatorPeer(_options.ownPeerKey, _options.remotePeerKey) === _options.ownPeerKey;
|
|
3294
|
-
}
|
|
3295
|
-
get transportChannelCount() {
|
|
3296
|
-
return this._transportChannels.size;
|
|
3297
|
-
}
|
|
3298
|
-
get currentConnection() {
|
|
3299
|
-
return this._connection;
|
|
3300
|
-
}
|
|
3301
|
-
async createDataChannel(topic) {
|
|
3302
|
-
const connection = await this._openConnection();
|
|
3303
|
-
if (!this._transportChannels.has(topic)) {
|
|
3304
|
-
if (!this._transportChannels.size) {
|
|
3305
|
-
this._lockAndCloseConnection();
|
|
3306
|
-
}
|
|
3307
|
-
throw new Error("Transport closed while connection was being open");
|
|
3308
|
-
}
|
|
3309
|
-
if (this._initiator) {
|
|
3310
|
-
const channel = connection.createDataChannel(topic);
|
|
3311
|
-
this._dataChannels.set(topic, channel);
|
|
3312
|
-
return channel;
|
|
3313
|
-
} else {
|
|
3314
|
-
const existingChannel = this._dataChannels.get(topic);
|
|
3315
|
-
if (existingChannel) {
|
|
3316
|
-
return existingChannel;
|
|
3317
|
-
}
|
|
3318
|
-
(0, import_log12.log)("waiting for initiator-peer to open a data channel", void 0, {
|
|
3319
|
-
F: __dxlog_file14,
|
|
3320
|
-
L: 90,
|
|
3321
|
-
S: this,
|
|
3322
|
-
C: (f, a) => f(...a)
|
|
3323
|
-
});
|
|
3324
|
-
return new Promise((resolve, reject) => {
|
|
3325
|
-
this._channelCreatedCallbacks.set(topic, {
|
|
3326
|
-
resolve,
|
|
3327
|
-
reject
|
|
3328
|
-
});
|
|
3329
|
-
});
|
|
3260
|
+
_disconnectStreams() {
|
|
3261
|
+
if (this._piped) {
|
|
3262
|
+
this._params.stream.unpipe?.(this._peer)?.unpipe?.(this._params.stream);
|
|
3330
3263
|
}
|
|
3331
3264
|
}
|
|
3332
|
-
|
|
3333
|
-
|
|
3334
|
-
|
|
3335
|
-
|
|
3336
|
-
|
|
3337
|
-
|
|
3338
|
-
|
|
3339
|
-
|
|
3340
|
-
|
|
3341
|
-
|
|
3265
|
+
};
|
|
3266
|
+
_ts_decorate6([
|
|
3267
|
+
import_async10.synchronized
|
|
3268
|
+
], SimplePeerTransport.prototype, "open", null);
|
|
3269
|
+
_ts_decorate6([
|
|
3270
|
+
import_async10.synchronized
|
|
3271
|
+
], SimplePeerTransport.prototype, "close", null);
|
|
3272
|
+
_ts_decorate6([
|
|
3273
|
+
import_async10.synchronized
|
|
3274
|
+
], SimplePeerTransport.prototype, "onSignal", null);
|
|
3275
|
+
var __dxlog_file14 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/simplepeer-transport-service.ts";
|
|
3276
|
+
var SimplePeerTransportService = class {
|
|
3277
|
+
constructor(_webrtcConfig, _iceProvider) {
|
|
3278
|
+
this._webrtcConfig = _webrtcConfig;
|
|
3279
|
+
this._iceProvider = _iceProvider;
|
|
3280
|
+
this.transports = new import_util9.ComplexMap(import_keys11.PublicKey.hash);
|
|
3342
3281
|
}
|
|
3343
|
-
|
|
3344
|
-
|
|
3345
|
-
|
|
3346
|
-
|
|
3347
|
-
|
|
3348
|
-
|
|
3349
|
-
|
|
3350
|
-
|
|
3351
|
-
|
|
3352
|
-
|
|
3353
|
-
|
|
3354
|
-
|
|
3355
|
-
|
|
3356
|
-
|
|
3357
|
-
|
|
3358
|
-
|
|
3359
|
-
|
|
3360
|
-
(0, import_invariant11.invariant)(this._initiator, void 0, {
|
|
3361
|
-
F: __dxlog_file14,
|
|
3362
|
-
L: 130,
|
|
3363
|
-
S: this,
|
|
3364
|
-
A: [
|
|
3365
|
-
"this._initiator",
|
|
3366
|
-
""
|
|
3367
|
-
]
|
|
3368
|
-
});
|
|
3369
|
-
if (connection !== this._connection) {
|
|
3370
|
-
this._onConnectionCallbackAfterClose("onnegotiationneeded", connection);
|
|
3371
|
-
return;
|
|
3372
|
-
}
|
|
3373
|
-
(0, import_log12.log)("onnegotiationneeded", void 0, {
|
|
3374
|
-
F: __dxlog_file14,
|
|
3375
|
-
L: 137,
|
|
3376
|
-
S: this,
|
|
3377
|
-
C: (f, a) => f(...a)
|
|
3378
|
-
});
|
|
3379
|
-
try {
|
|
3380
|
-
const offer = await connection.createOffer();
|
|
3381
|
-
await connection.setLocalDescription(offer);
|
|
3382
|
-
await this._sendDescription(connection, offer);
|
|
3383
|
-
} catch (err) {
|
|
3384
|
-
this._lockAndAbort(connection, err);
|
|
3385
|
-
}
|
|
3386
|
-
},
|
|
3387
|
-
// When ICE candidate identified (should be sent to remote peer) and when ICE gathering finalized.
|
|
3388
|
-
// https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/icecandidate_event
|
|
3389
|
-
onicecandidate: async (event) => {
|
|
3390
|
-
if (connection !== this._connection) {
|
|
3391
|
-
this._onConnectionCallbackAfterClose("onicecandidate", connection);
|
|
3392
|
-
return;
|
|
3393
|
-
}
|
|
3394
|
-
if (event.candidate) {
|
|
3395
|
-
(0, import_log12.log)("onicecandidate", {
|
|
3396
|
-
candidate: event.candidate.candidate
|
|
3397
|
-
}, {
|
|
3398
|
-
F: __dxlog_file14,
|
|
3399
|
-
L: 156,
|
|
3400
|
-
S: this,
|
|
3401
|
-
C: (f, a) => f(...a)
|
|
3402
|
-
});
|
|
3403
|
-
await this._sendIceCandidate(event.candidate);
|
|
3404
|
-
} else {
|
|
3405
|
-
(0, import_log12.log)("onicecandidate gathering complete", void 0, {
|
|
3406
|
-
F: __dxlog_file14,
|
|
3407
|
-
L: 159,
|
|
3408
|
-
S: this,
|
|
3409
|
-
C: (f, a) => f(...a)
|
|
3282
|
+
open(request) {
|
|
3283
|
+
const rpcStream = new import_codec_protobuf.Stream(({ ready, next, close }) => {
|
|
3284
|
+
const duplex = new import_node_stream2.Duplex({
|
|
3285
|
+
read: () => {
|
|
3286
|
+
const callbacks = [
|
|
3287
|
+
...transportState.writeCallbacks
|
|
3288
|
+
];
|
|
3289
|
+
transportState.writeCallbacks.length = 0;
|
|
3290
|
+
for (const cb of callbacks) {
|
|
3291
|
+
cb();
|
|
3292
|
+
}
|
|
3293
|
+
},
|
|
3294
|
+
write: function(chunk, _, callback) {
|
|
3295
|
+
next({
|
|
3296
|
+
data: {
|
|
3297
|
+
payload: chunk
|
|
3298
|
+
}
|
|
3410
3299
|
});
|
|
3300
|
+
callback();
|
|
3411
3301
|
}
|
|
3412
|
-
}
|
|
3413
|
-
|
|
3414
|
-
|
|
3415
|
-
|
|
3416
|
-
|
|
3417
|
-
|
|
3418
|
-
|
|
3419
|
-
|
|
3420
|
-
|
|
3421
|
-
|
|
3422
|
-
|
|
3423
|
-
|
|
3424
|
-
|
|
3425
|
-
|
|
3426
|
-
|
|
3427
|
-
|
|
3428
|
-
|
|
3429
|
-
|
|
3430
|
-
}
|
|
3431
|
-
(0, import_log12.log)("oniceconnectionstatechange", {
|
|
3432
|
-
state: connection.iceConnectionState
|
|
3433
|
-
}, {
|
|
3434
|
-
F: __dxlog_file14,
|
|
3435
|
-
L: 179,
|
|
3436
|
-
S: this,
|
|
3437
|
-
C: (f, a) => f(...a)
|
|
3438
|
-
});
|
|
3439
|
-
if (connection.iceConnectionState === "failed") {
|
|
3440
|
-
this._lockAndAbort(connection, createIceFailureError(iceCandidateErrors));
|
|
3302
|
+
});
|
|
3303
|
+
const transport = new SimplePeerTransport({
|
|
3304
|
+
initiator: request.initiator,
|
|
3305
|
+
stream: duplex,
|
|
3306
|
+
webrtcConfig: this._webrtcConfig,
|
|
3307
|
+
sendSignal: async (signal) => {
|
|
3308
|
+
next({
|
|
3309
|
+
signal: {
|
|
3310
|
+
payload: signal
|
|
3311
|
+
}
|
|
3312
|
+
});
|
|
3313
|
+
},
|
|
3314
|
+
iceProvider: this._iceProvider
|
|
3315
|
+
});
|
|
3316
|
+
void transport.open();
|
|
3317
|
+
next({
|
|
3318
|
+
connection: {
|
|
3319
|
+
state: import_bridge.ConnectionState.CONNECTING
|
|
3441
3320
|
}
|
|
3442
|
-
}
|
|
3443
|
-
|
|
3444
|
-
|
|
3445
|
-
|
|
3446
|
-
|
|
3447
|
-
if (connection !== this._connection) {
|
|
3448
|
-
if (connection.connectionState !== "closed" && connection.connectionState !== "failed") {
|
|
3449
|
-
this._onConnectionCallbackAfterClose("onconnectionstatechange", connection);
|
|
3321
|
+
});
|
|
3322
|
+
transport.connected.on(() => {
|
|
3323
|
+
next({
|
|
3324
|
+
connection: {
|
|
3325
|
+
state: import_bridge.ConnectionState.CONNECTED
|
|
3450
3326
|
}
|
|
3451
|
-
return;
|
|
3452
|
-
}
|
|
3453
|
-
(0, import_log12.log)("onconnectionstatechange", {
|
|
3454
|
-
state: connection.connectionState
|
|
3455
|
-
}, {
|
|
3456
|
-
F: __dxlog_file14,
|
|
3457
|
-
L: 196,
|
|
3458
|
-
S: this,
|
|
3459
|
-
C: (f, a) => f(...a)
|
|
3460
|
-
});
|
|
3461
|
-
if (connection.connectionState === "failed") {
|
|
3462
|
-
this._lockAndAbort(connection, new Error("Connection failed."));
|
|
3463
|
-
}
|
|
3464
|
-
},
|
|
3465
|
-
onsignalingstatechange: () => {
|
|
3466
|
-
(0, import_log12.log)("onsignalingstatechange", {
|
|
3467
|
-
state: connection.signalingState
|
|
3468
|
-
}, {
|
|
3469
|
-
F: __dxlog_file14,
|
|
3470
|
-
L: 203,
|
|
3471
|
-
S: this,
|
|
3472
|
-
C: (f, a) => f(...a)
|
|
3473
3327
|
});
|
|
3474
|
-
}
|
|
3475
|
-
|
|
3476
|
-
|
|
3477
|
-
|
|
3478
|
-
|
|
3479
|
-
|
|
3480
|
-
|
|
3481
|
-
S: this,
|
|
3482
|
-
A: [
|
|
3483
|
-
"!this._initiator",
|
|
3484
|
-
"'Initiator is expected to create data channels.'"
|
|
3485
|
-
]
|
|
3328
|
+
});
|
|
3329
|
+
transport.errors.handle((err) => {
|
|
3330
|
+
next({
|
|
3331
|
+
connection: {
|
|
3332
|
+
state: import_bridge.ConnectionState.CLOSED,
|
|
3333
|
+
error: err.toString()
|
|
3334
|
+
}
|
|
3486
3335
|
});
|
|
3487
|
-
|
|
3488
|
-
|
|
3489
|
-
|
|
3490
|
-
|
|
3491
|
-
|
|
3492
|
-
|
|
3493
|
-
|
|
3494
|
-
F: __dxlog_file14,
|
|
3495
|
-
L: 216,
|
|
3496
|
-
S: this,
|
|
3497
|
-
C: (f, a) => f(...a)
|
|
3336
|
+
close(err);
|
|
3337
|
+
});
|
|
3338
|
+
transport.closed.on(() => {
|
|
3339
|
+
next({
|
|
3340
|
+
connection: {
|
|
3341
|
+
state: import_bridge.ConnectionState.CLOSED
|
|
3342
|
+
}
|
|
3498
3343
|
});
|
|
3499
|
-
|
|
3500
|
-
|
|
3501
|
-
|
|
3502
|
-
|
|
3503
|
-
|
|
3504
|
-
|
|
3505
|
-
|
|
3506
|
-
|
|
3507
|
-
|
|
3508
|
-
|
|
3509
|
-
await this._factory.initConnection(connection, {
|
|
3510
|
-
initiator: this._initiator
|
|
3344
|
+
close();
|
|
3345
|
+
});
|
|
3346
|
+
const transportState = {
|
|
3347
|
+
transport,
|
|
3348
|
+
stream: duplex,
|
|
3349
|
+
writeCallbacks: [],
|
|
3350
|
+
state: "OPEN"
|
|
3351
|
+
};
|
|
3352
|
+
ready();
|
|
3353
|
+
this.transports.set(request.proxyId, transportState);
|
|
3511
3354
|
});
|
|
3512
|
-
return
|
|
3355
|
+
return rpcStream;
|
|
3513
3356
|
}
|
|
3514
|
-
|
|
3515
|
-
this.
|
|
3357
|
+
async sendSignal({ proxyId, signal }) {
|
|
3358
|
+
(0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
|
|
3359
|
+
F: __dxlog_file14,
|
|
3360
|
+
L: 124,
|
|
3361
|
+
S: this,
|
|
3362
|
+
A: [
|
|
3363
|
+
"this.transports.has(proxyId)",
|
|
3364
|
+
""
|
|
3365
|
+
]
|
|
3366
|
+
});
|
|
3367
|
+
await this.transports.get(proxyId).transport.onSignal(signal);
|
|
3516
3368
|
}
|
|
3517
|
-
|
|
3518
|
-
|
|
3519
|
-
import_log12.log.error("attempted to abort an inactive connection", {
|
|
3520
|
-
error
|
|
3521
|
-
}, {
|
|
3522
|
-
F: __dxlog_file14,
|
|
3523
|
-
L: 241,
|
|
3524
|
-
S: this,
|
|
3525
|
-
C: (f, a) => f(...a)
|
|
3526
|
-
});
|
|
3527
|
-
this._safeCloseConnection(connection);
|
|
3528
|
-
return;
|
|
3529
|
-
}
|
|
3530
|
-
for (const [topic, pendingCallback] of this._channelCreatedCallbacks.entries()) {
|
|
3531
|
-
pendingCallback.reject(error);
|
|
3532
|
-
this._transportChannels.delete(topic);
|
|
3533
|
-
}
|
|
3534
|
-
this._channelCreatedCallbacks.clear();
|
|
3535
|
-
for (const channel of this._transportChannels.values()) {
|
|
3536
|
-
channel.onConnectionError(error);
|
|
3537
|
-
}
|
|
3538
|
-
this._transportChannels.clear();
|
|
3539
|
-
this._safeCloseConnection();
|
|
3540
|
-
(0, import_log12.log)("connection aborted", {
|
|
3541
|
-
reason: error.message
|
|
3542
|
-
}, {
|
|
3369
|
+
async getDetails({ proxyId }) {
|
|
3370
|
+
(0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
|
|
3543
3371
|
F: __dxlog_file14,
|
|
3544
|
-
L:
|
|
3372
|
+
L: 129,
|
|
3545
3373
|
S: this,
|
|
3546
|
-
|
|
3374
|
+
A: [
|
|
3375
|
+
"this.transports.has(proxyId)",
|
|
3376
|
+
""
|
|
3377
|
+
]
|
|
3547
3378
|
});
|
|
3379
|
+
return {
|
|
3380
|
+
details: await this.transports.get(proxyId).transport.getDetails()
|
|
3381
|
+
};
|
|
3548
3382
|
}
|
|
3549
|
-
|
|
3550
|
-
(0, import_invariant11.invariant)(this.
|
|
3383
|
+
async getStats({ proxyId }) {
|
|
3384
|
+
(0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
|
|
3551
3385
|
F: __dxlog_file14,
|
|
3552
|
-
L:
|
|
3386
|
+
L: 134,
|
|
3553
3387
|
S: this,
|
|
3554
3388
|
A: [
|
|
3555
|
-
"this.
|
|
3389
|
+
"this.transports.has(proxyId)",
|
|
3556
3390
|
""
|
|
3557
3391
|
]
|
|
3558
3392
|
});
|
|
3559
|
-
|
|
3560
|
-
this.
|
|
3561
|
-
|
|
3562
|
-
F: __dxlog_file14,
|
|
3563
|
-
L: 263,
|
|
3564
|
-
S: this,
|
|
3565
|
-
C: (f, a) => f(...a)
|
|
3566
|
-
});
|
|
3567
|
-
}
|
|
3393
|
+
return {
|
|
3394
|
+
stats: await this.transports.get(proxyId).transport.getStats()
|
|
3395
|
+
};
|
|
3568
3396
|
}
|
|
3569
|
-
async
|
|
3570
|
-
|
|
3571
|
-
|
|
3572
|
-
import_log12.log.warn("a signal ignored because the connection was closed", {
|
|
3573
|
-
type: signal.payload.data.type
|
|
3574
|
-
}, {
|
|
3397
|
+
async sendData({ proxyId, payload }) {
|
|
3398
|
+
if (this.transports.get(proxyId)?.state !== "OPEN") {
|
|
3399
|
+
import_log13.log.debug("transport is closed", void 0, {
|
|
3575
3400
|
F: __dxlog_file14,
|
|
3576
|
-
L:
|
|
3401
|
+
L: 140,
|
|
3577
3402
|
S: this,
|
|
3578
3403
|
C: (f, a) => f(...a)
|
|
3579
3404
|
});
|
|
3580
|
-
return;
|
|
3581
|
-
}
|
|
3582
|
-
const data = signal.payload.data;
|
|
3583
|
-
switch (data.type) {
|
|
3584
|
-
case "offer": {
|
|
3585
|
-
await this._offerProcessingMutex.executeSynchronized(async () => {
|
|
3586
|
-
if (isRemoteDescriptionSet(connection, data)) {
|
|
3587
|
-
return;
|
|
3588
|
-
}
|
|
3589
|
-
if (connection.connectionState !== "new") {
|
|
3590
|
-
this._abortConnection(connection, new Error(`Received an offer in ${connection.connectionState}.`));
|
|
3591
|
-
return;
|
|
3592
|
-
}
|
|
3593
|
-
try {
|
|
3594
|
-
await connection.setRemoteDescription({
|
|
3595
|
-
type: data.type,
|
|
3596
|
-
sdp: data.sdp
|
|
3597
|
-
});
|
|
3598
|
-
const answer = await connection.createAnswer();
|
|
3599
|
-
await connection.setLocalDescription(answer);
|
|
3600
|
-
await this._sendDescription(connection, answer);
|
|
3601
|
-
this._onSessionNegotiated(connection);
|
|
3602
|
-
} catch (err) {
|
|
3603
|
-
this._abortConnection(connection, new Error("Error handling a remote offer.", {
|
|
3604
|
-
cause: err
|
|
3605
|
-
}));
|
|
3606
|
-
}
|
|
3607
|
-
});
|
|
3608
|
-
break;
|
|
3609
|
-
}
|
|
3610
|
-
case "answer":
|
|
3611
|
-
await this._offerProcessingMutex.executeSynchronized(async () => {
|
|
3612
|
-
try {
|
|
3613
|
-
if (isRemoteDescriptionSet(connection, data)) {
|
|
3614
|
-
return;
|
|
3615
|
-
}
|
|
3616
|
-
if (connection.signalingState !== "have-local-offer") {
|
|
3617
|
-
this._abortConnection(connection, new Error(`Unexpected answer from remote peer, signalingState was ${connection.signalingState}.`));
|
|
3618
|
-
return;
|
|
3619
|
-
}
|
|
3620
|
-
await connection.setRemoteDescription({
|
|
3621
|
-
type: data.type,
|
|
3622
|
-
sdp: data.sdp
|
|
3623
|
-
});
|
|
3624
|
-
this._onSessionNegotiated(connection);
|
|
3625
|
-
} catch (err) {
|
|
3626
|
-
this._abortConnection(connection, new Error("Error handling a remote answer.", {
|
|
3627
|
-
cause: err
|
|
3628
|
-
}));
|
|
3629
|
-
}
|
|
3630
|
-
});
|
|
3631
|
-
break;
|
|
3632
|
-
case "candidate":
|
|
3633
|
-
void this._processIceCandidate(connection, data.candidate);
|
|
3634
|
-
break;
|
|
3635
|
-
default:
|
|
3636
|
-
this._abortConnection(connection, new Error(`Unknown signal type ${data.type}.`));
|
|
3637
|
-
break;
|
|
3638
3405
|
}
|
|
3639
|
-
(0,
|
|
3406
|
+
(0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
|
|
3640
3407
|
F: __dxlog_file14,
|
|
3641
|
-
L:
|
|
3408
|
+
L: 142,
|
|
3642
3409
|
S: this,
|
|
3643
|
-
|
|
3410
|
+
A: [
|
|
3411
|
+
"this.transports.has(proxyId)",
|
|
3412
|
+
""
|
|
3413
|
+
]
|
|
3644
3414
|
});
|
|
3645
|
-
|
|
3646
|
-
|
|
3647
|
-
|
|
3648
|
-
await
|
|
3649
|
-
|
|
3650
|
-
(0, import_log12.log)("adding ice candidate", {
|
|
3651
|
-
candidate
|
|
3652
|
-
}, {
|
|
3653
|
-
F: __dxlog_file14,
|
|
3654
|
-
L: 338,
|
|
3655
|
-
S: this,
|
|
3656
|
-
C: (f, a) => f(...a)
|
|
3657
|
-
});
|
|
3658
|
-
await connection.addIceCandidate(candidate);
|
|
3659
|
-
}
|
|
3660
|
-
} catch (err) {
|
|
3661
|
-
import_log12.log.catch(err, void 0, {
|
|
3662
|
-
F: __dxlog_file14,
|
|
3663
|
-
L: 342,
|
|
3664
|
-
S: this,
|
|
3665
|
-
C: (f, a) => f(...a)
|
|
3415
|
+
const state = this.transports.get(proxyId);
|
|
3416
|
+
const bufferHasSpace = state.stream.push(payload);
|
|
3417
|
+
if (!bufferHasSpace) {
|
|
3418
|
+
await new Promise((resolve) => {
|
|
3419
|
+
state.writeCallbacks.push(resolve);
|
|
3666
3420
|
});
|
|
3667
3421
|
}
|
|
3668
3422
|
}
|
|
3669
|
-
|
|
3670
|
-
|
|
3671
|
-
|
|
3672
|
-
|
|
3673
|
-
|
|
3674
|
-
S: this,
|
|
3675
|
-
C: (f, a) => f(...a)
|
|
3676
|
-
});
|
|
3677
|
-
this._readyForCandidates.wake();
|
|
3678
|
-
} else {
|
|
3679
|
-
import_log12.log.warn("session was negotiated after connection became inactive", void 0, {
|
|
3680
|
-
F: __dxlog_file14,
|
|
3681
|
-
L: 351,
|
|
3682
|
-
S: this,
|
|
3683
|
-
C: (f, a) => f(...a)
|
|
3684
|
-
});
|
|
3423
|
+
async close({ proxyId }) {
|
|
3424
|
+
await this.transports.get(proxyId)?.transport.close();
|
|
3425
|
+
await this.transports.get(proxyId)?.stream.end();
|
|
3426
|
+
if (this.transports.get(proxyId)) {
|
|
3427
|
+
this.transports.get(proxyId).state = "CLOSED";
|
|
3685
3428
|
}
|
|
3686
|
-
|
|
3687
|
-
_onConnectionCallbackAfterClose(callback, connection) {
|
|
3688
|
-
import_log12.log.warn("callback invoked after a connection was destroyed, this is probably a bug", {
|
|
3689
|
-
callback,
|
|
3690
|
-
state: connection.connectionState
|
|
3691
|
-
}, {
|
|
3429
|
+
(0, import_log13.log)("Closed.", void 0, {
|
|
3692
3430
|
F: __dxlog_file14,
|
|
3693
|
-
L:
|
|
3431
|
+
L: 158,
|
|
3694
3432
|
S: this,
|
|
3695
3433
|
C: (f, a) => f(...a)
|
|
3696
3434
|
});
|
|
3697
|
-
this._safeCloseConnection(connection);
|
|
3698
3435
|
}
|
|
3699
|
-
|
|
3700
|
-
|
|
3701
|
-
|
|
3702
|
-
|
|
3703
|
-
|
|
3704
|
-
|
|
3705
|
-
|
|
3706
|
-
|
|
3707
|
-
|
|
3708
|
-
|
|
3709
|
-
|
|
3710
|
-
|
|
3711
|
-
|
|
3712
|
-
|
|
3713
|
-
|
|
3714
|
-
|
|
3715
|
-
|
|
3716
|
-
|
|
3717
|
-
L: 374,
|
|
3718
|
-
S: this,
|
|
3719
|
-
C: (f, a) => f(...a)
|
|
3720
|
-
}));
|
|
3721
|
-
for (const [_, pendingCallback] of this._channelCreatedCallbacks.entries()) {
|
|
3722
|
-
pendingCallback.reject("Connection closed.");
|
|
3723
|
-
}
|
|
3724
|
-
this._channelCreatedCallbacks.clear();
|
|
3725
|
-
}
|
|
3436
|
+
};
|
|
3437
|
+
var __dxlog_file15 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/simplepeer-transport-proxy.ts";
|
|
3438
|
+
var RPC_TIMEOUT = 1e4;
|
|
3439
|
+
var RESP_MIN_THRESHOLD = 500;
|
|
3440
|
+
var TIMEOUT_THRESHOLD = 10;
|
|
3441
|
+
var SimplePeerTransportProxy = class {
|
|
3442
|
+
constructor(_options) {
|
|
3443
|
+
this._options = _options;
|
|
3444
|
+
this._proxyId = import_keys12.PublicKey.random();
|
|
3445
|
+
this._ctx = new import_context6.Context(void 0, {
|
|
3446
|
+
F: __dxlog_file15,
|
|
3447
|
+
L: 37
|
|
3448
|
+
});
|
|
3449
|
+
this._timeoutCount = 0;
|
|
3450
|
+
this.closed = new import_async11.Event();
|
|
3451
|
+
this.connected = new import_async11.Event();
|
|
3452
|
+
this.errors = new import_debug6.ErrorStream();
|
|
3453
|
+
this._closed = false;
|
|
3726
3454
|
}
|
|
3727
|
-
|
|
3728
|
-
|
|
3729
|
-
...this._options.webrtcConfig
|
|
3730
|
-
};
|
|
3731
|
-
try {
|
|
3732
|
-
const providedIceServers = await this._options.iceProvider?.getIceServers() ?? [];
|
|
3733
|
-
if (providedIceServers.length > 0) {
|
|
3734
|
-
config.iceServers = [
|
|
3735
|
-
...config.iceServers ?? [],
|
|
3736
|
-
...providedIceServers
|
|
3737
|
-
];
|
|
3738
|
-
}
|
|
3739
|
-
} catch (error) {
|
|
3740
|
-
import_log12.log.catch(error, void 0, {
|
|
3741
|
-
F: __dxlog_file14,
|
|
3742
|
-
L: 390,
|
|
3743
|
-
S: this,
|
|
3744
|
-
C: (f, a) => f(...a)
|
|
3745
|
-
});
|
|
3746
|
-
}
|
|
3747
|
-
return config;
|
|
3455
|
+
get isOpen() {
|
|
3456
|
+
return !this._closed;
|
|
3748
3457
|
}
|
|
3749
|
-
async
|
|
3750
|
-
|
|
3751
|
-
|
|
3752
|
-
|
|
3753
|
-
|
|
3754
|
-
|
|
3755
|
-
|
|
3756
|
-
|
|
3757
|
-
|
|
3758
|
-
|
|
3759
|
-
|
|
3760
|
-
|
|
3761
|
-
|
|
3458
|
+
async open() {
|
|
3459
|
+
this._serviceStream = this._options.bridgeService.open({
|
|
3460
|
+
proxyId: this._proxyId,
|
|
3461
|
+
initiator: this._options.initiator
|
|
3462
|
+
}, {
|
|
3463
|
+
timeout: RPC_TIMEOUT
|
|
3464
|
+
});
|
|
3465
|
+
this._serviceStream.waitUntilReady().then(() => {
|
|
3466
|
+
this._serviceStream.subscribe(async (event) => {
|
|
3467
|
+
(0, import_log14.log)("SimplePeerTransportProxy: event", event, {
|
|
3468
|
+
F: __dxlog_file15,
|
|
3469
|
+
L: 66,
|
|
3470
|
+
S: this,
|
|
3471
|
+
C: (f, a) => f(...a)
|
|
3472
|
+
});
|
|
3473
|
+
if (event.connection) {
|
|
3474
|
+
await this._handleConnection(event.connection);
|
|
3475
|
+
} else if (event.data) {
|
|
3476
|
+
this._handleData(event.data);
|
|
3477
|
+
} else if (event.signal) {
|
|
3478
|
+
await this._handleSignal(event.signal);
|
|
3762
3479
|
}
|
|
3763
3480
|
});
|
|
3764
|
-
|
|
3765
|
-
|
|
3766
|
-
|
|
3767
|
-
|
|
3768
|
-
|
|
3769
|
-
|
|
3481
|
+
const proxyStream = new import_node_stream3.Writable({
|
|
3482
|
+
write: (chunk, _, callback) => {
|
|
3483
|
+
const then = performance.now();
|
|
3484
|
+
this._options.bridgeService.sendData({
|
|
3485
|
+
proxyId: this._proxyId,
|
|
3486
|
+
payload: chunk
|
|
3487
|
+
}, {
|
|
3488
|
+
timeout: RPC_TIMEOUT
|
|
3489
|
+
}).then(() => {
|
|
3490
|
+
if (performance.now() - then > RESP_MIN_THRESHOLD) {
|
|
3491
|
+
(0, import_log14.log)("slow response, delaying callback", void 0, {
|
|
3492
|
+
F: __dxlog_file15,
|
|
3493
|
+
L: 90,
|
|
3494
|
+
S: this,
|
|
3495
|
+
C: (f, a) => f(...a)
|
|
3496
|
+
});
|
|
3497
|
+
(0, import_async11.scheduleTask)(this._ctx, () => callback(), RESP_MIN_THRESHOLD);
|
|
3498
|
+
} else {
|
|
3499
|
+
callback();
|
|
3500
|
+
}
|
|
3501
|
+
this._timeoutCount = 0;
|
|
3502
|
+
}, (err) => {
|
|
3503
|
+
if (err instanceof import_protocols8.TimeoutError || err.constructor.name === "TimeoutError") {
|
|
3504
|
+
if (this._timeoutCount++ > TIMEOUT_THRESHOLD) {
|
|
3505
|
+
throw new import_protocols8.TimeoutError(`too many timeouts (${this._timeoutCount} > ${TIMEOUT_THRESHOLD}`);
|
|
3506
|
+
} else {
|
|
3507
|
+
(0, import_log14.log)("timeout error, but still invoking callback", void 0, {
|
|
3508
|
+
F: __dxlog_file15,
|
|
3509
|
+
L: 102,
|
|
3510
|
+
S: this,
|
|
3511
|
+
C: (f, a) => f(...a)
|
|
3512
|
+
});
|
|
3513
|
+
callback();
|
|
3514
|
+
}
|
|
3515
|
+
} else {
|
|
3516
|
+
import_log14.log.catch(err, void 0, {
|
|
3517
|
+
F: __dxlog_file15,
|
|
3518
|
+
L: 106,
|
|
3519
|
+
S: this,
|
|
3520
|
+
C: (f, a) => f(...a)
|
|
3521
|
+
});
|
|
3522
|
+
}
|
|
3523
|
+
});
|
|
3524
|
+
}
|
|
3525
|
+
});
|
|
3526
|
+
proxyStream.on("error", (err) => {
|
|
3527
|
+
(0, import_log14.log)("proxystream error", {
|
|
3528
|
+
err
|
|
3529
|
+
}, {
|
|
3530
|
+
F: __dxlog_file15,
|
|
3531
|
+
L: 114,
|
|
3532
|
+
S: this,
|
|
3533
|
+
C: (f, a) => f(...a)
|
|
3534
|
+
});
|
|
3535
|
+
});
|
|
3536
|
+
this._options.stream.pipe(proxyStream);
|
|
3537
|
+
}, (error) => import_log14.log.catch(error, void 0, {
|
|
3538
|
+
F: __dxlog_file15,
|
|
3539
|
+
L: 119,
|
|
3540
|
+
S: this,
|
|
3541
|
+
C: (f, a) => f(...a)
|
|
3542
|
+
}));
|
|
3543
|
+
}
|
|
3544
|
+
async close() {
|
|
3545
|
+
await this._ctx.dispose();
|
|
3546
|
+
if (this._closed) {
|
|
3547
|
+
return;
|
|
3548
|
+
}
|
|
3549
|
+
await this._serviceStream.close();
|
|
3550
|
+
try {
|
|
3551
|
+
await this._options.bridgeService.close({
|
|
3552
|
+
proxyId: this._proxyId
|
|
3553
|
+
}, {
|
|
3554
|
+
timeout: RPC_TIMEOUT
|
|
3555
|
+
});
|
|
3556
|
+
} catch (err) {
|
|
3557
|
+
import_log14.log.catch(err, void 0, {
|
|
3558
|
+
F: __dxlog_file15,
|
|
3559
|
+
L: 134,
|
|
3770
3560
|
S: this,
|
|
3771
3561
|
C: (f, a) => f(...a)
|
|
3772
3562
|
});
|
|
3773
3563
|
}
|
|
3564
|
+
this.closed.emit();
|
|
3565
|
+
this._closed = true;
|
|
3774
3566
|
}
|
|
3775
|
-
async
|
|
3776
|
-
|
|
3777
|
-
|
|
3567
|
+
async onSignal(signal) {
|
|
3568
|
+
this._options.bridgeService.sendSignal({
|
|
3569
|
+
proxyId: this._proxyId,
|
|
3570
|
+
signal
|
|
3571
|
+
}, {
|
|
3572
|
+
timeout: RPC_TIMEOUT
|
|
3573
|
+
}).catch((err) => this.errors.raise(decodeError(err)));
|
|
3574
|
+
}
|
|
3575
|
+
async _handleConnection(connectionEvent) {
|
|
3576
|
+
if (connectionEvent.error) {
|
|
3577
|
+
this.errors.raise(decodeError(connectionEvent.error));
|
|
3778
3578
|
}
|
|
3779
|
-
|
|
3780
|
-
|
|
3781
|
-
|
|
3782
|
-
|
|
3783
|
-
await this._options.sendSignal({
|
|
3784
|
-
payload: {
|
|
3785
|
-
data
|
|
3579
|
+
switch (connectionEvent.state) {
|
|
3580
|
+
case import_bridge2.ConnectionState.CONNECTED: {
|
|
3581
|
+
this.connected.emit();
|
|
3582
|
+
break;
|
|
3786
3583
|
}
|
|
3787
|
-
|
|
3584
|
+
case import_bridge2.ConnectionState.CLOSED: {
|
|
3585
|
+
await this.close();
|
|
3586
|
+
break;
|
|
3587
|
+
}
|
|
3588
|
+
}
|
|
3788
3589
|
}
|
|
3789
|
-
|
|
3790
|
-
|
|
3791
|
-
connectionState: this._connection.connectionState,
|
|
3792
|
-
iceConnectionState: this._connection.iceConnectionState,
|
|
3793
|
-
iceGatheringState: this._connection.iceGatheringState,
|
|
3794
|
-
signalingState: this._connection.signalingState,
|
|
3795
|
-
remoteDescription: this._connection.remoteDescription,
|
|
3796
|
-
localDescription: this._connection.localDescription
|
|
3797
|
-
};
|
|
3798
|
-
return {
|
|
3799
|
-
...connectionInfo,
|
|
3800
|
-
ts: Date.now(),
|
|
3801
|
-
remotePeerKey: this._options.remotePeerKey,
|
|
3802
|
-
channels: [
|
|
3803
|
-
...this._transportChannels.keys()
|
|
3804
|
-
].map((topic) => topic),
|
|
3805
|
-
config: this._connection?.getConfiguration()
|
|
3806
|
-
};
|
|
3590
|
+
_handleData(dataEvent) {
|
|
3591
|
+
this._options.stream.write((0, import_util10.arrayToBuffer)(dataEvent.payload));
|
|
3807
3592
|
}
|
|
3808
|
-
|
|
3809
|
-
|
|
3810
|
-
|
|
3811
|
-
|
|
3812
|
-
|
|
3813
|
-
|
|
3814
|
-
}
|
|
3593
|
+
async _handleSignal(signalEvent) {
|
|
3594
|
+
await this._options.sendSignal(signalEvent.payload);
|
|
3595
|
+
}
|
|
3596
|
+
async getDetails() {
|
|
3597
|
+
return (await this._options.bridgeService.getDetails({
|
|
3598
|
+
proxyId: this._proxyId
|
|
3599
|
+
}, {
|
|
3600
|
+
timeout: RPC_TIMEOUT
|
|
3601
|
+
})).details;
|
|
3602
|
+
}
|
|
3603
|
+
async getStats() {
|
|
3604
|
+
return (await this._options.bridgeService.getStats({
|
|
3605
|
+
proxyId: this._proxyId
|
|
3606
|
+
}, {
|
|
3607
|
+
timeout: RPC_TIMEOUT
|
|
3608
|
+
})).stats;
|
|
3609
|
+
}
|
|
3610
|
+
/**
|
|
3611
|
+
* Called when underlying proxy service becomes unavailable.
|
|
3612
|
+
*/
|
|
3613
|
+
// TODO(burdon): Option on close method.
|
|
3614
|
+
forceClose() {
|
|
3615
|
+
void this._serviceStream.close();
|
|
3616
|
+
this.closed.emit();
|
|
3617
|
+
this._closed = true;
|
|
3815
3618
|
}
|
|
3816
3619
|
};
|
|
3817
|
-
|
|
3818
|
-
|
|
3819
|
-
|
|
3820
|
-
|
|
3821
|
-
|
|
3822
|
-
|
|
3823
|
-
|
|
3824
|
-
|
|
3825
|
-
|
|
3826
|
-
|
|
3827
|
-
|
|
3828
|
-
|
|
3829
|
-
|
|
3830
|
-
|
|
3831
|
-
|
|
3832
|
-
|
|
3833
|
-
|
|
3834
|
-
|
|
3835
|
-
|
|
3836
|
-
|
|
3837
|
-
|
|
3838
|
-
|
|
3839
|
-
|
|
3840
|
-
|
|
3841
|
-
|
|
3842
|
-
|
|
3620
|
+
var SimplePeerTransportProxyFactory = class {
|
|
3621
|
+
constructor() {
|
|
3622
|
+
this._connections = /* @__PURE__ */ new Set();
|
|
3623
|
+
}
|
|
3624
|
+
/**
|
|
3625
|
+
* Sets the current BridgeService to be used to open connections.
|
|
3626
|
+
* Calling this method will close any existing connections.
|
|
3627
|
+
*/
|
|
3628
|
+
setBridgeService(bridgeService) {
|
|
3629
|
+
this._bridgeService = bridgeService;
|
|
3630
|
+
for (const connection of this._connections) {
|
|
3631
|
+
connection.forceClose();
|
|
3632
|
+
}
|
|
3633
|
+
return this;
|
|
3634
|
+
}
|
|
3635
|
+
createTransport(options) {
|
|
3636
|
+
(0, import_invariant12.invariant)(this._bridgeService, "SimplePeerTransportProxyFactory is not ready to open connections", {
|
|
3637
|
+
F: __dxlog_file15,
|
|
3638
|
+
L: 218,
|
|
3639
|
+
S: this,
|
|
3640
|
+
A: [
|
|
3641
|
+
"this._bridgeService",
|
|
3642
|
+
"'SimplePeerTransportProxyFactory is not ready to open connections'"
|
|
3643
|
+
]
|
|
3644
|
+
});
|
|
3645
|
+
const transport = new SimplePeerTransportProxy({
|
|
3646
|
+
...options,
|
|
3647
|
+
bridgeService: this._bridgeService
|
|
3648
|
+
});
|
|
3649
|
+
this._connections.add(transport);
|
|
3650
|
+
transport.closed.on(() => this._connections.delete(transport));
|
|
3651
|
+
return transport;
|
|
3652
|
+
}
|
|
3843
3653
|
};
|
|
3844
|
-
var
|
|
3845
|
-
const
|
|
3846
|
-
|
|
3847
|
-
|
|
3654
|
+
var decodeError = (err) => {
|
|
3655
|
+
const message = typeof err === "string" ? err : err.message;
|
|
3656
|
+
if (message.includes("CONNECTION_RESET")) {
|
|
3657
|
+
return new import_protocols8.ConnectionResetError(message);
|
|
3658
|
+
} else if (message.includes("TIMEOUT")) {
|
|
3659
|
+
return new import_protocols8.TimeoutError(message);
|
|
3660
|
+
} else if (message.includes("PROTOCOL_ERROR")) {
|
|
3661
|
+
return new import_protocols8.ProtocolError(message);
|
|
3662
|
+
} else if (message.includes("CONNECTIVITY_ERROR")) {
|
|
3663
|
+
return new import_protocols8.ConnectivityError(message);
|
|
3664
|
+
} else if (message.includes("UNKNOWN_PROTOCOL_ERROR")) {
|
|
3665
|
+
return new import_protocols8.UnknownProtocolError(message);
|
|
3666
|
+
} else {
|
|
3667
|
+
return typeof err === "string" ? new Error(err) : err;
|
|
3668
|
+
}
|
|
3848
3669
|
};
|
|
3849
|
-
|
|
3850
|
-
|
|
3670
|
+
function _ts_decorate7(decorators, target, key, desc) {
|
|
3671
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3672
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
3673
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
3674
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
3675
|
+
}
|
|
3676
|
+
var __dxlog_file16 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/libdatachannel-transport.ts";
|
|
3677
|
+
var DATACHANNEL_LABEL = "dxos.mesh.transport";
|
|
3678
|
+
var MAX_BUFFERED_AMOUNT = 64 * 1024;
|
|
3679
|
+
var MAX_MESSAGE_SIZE = 64 * 1024;
|
|
3680
|
+
var createLibDataChannelTransportFactory = (webrtcConfig, iceProvider) => {
|
|
3851
3681
|
return {
|
|
3852
|
-
createTransport: (options) => {
|
|
3853
|
-
|
|
3854
|
-
|
|
3855
|
-
|
|
3856
|
-
|
|
3857
|
-
webrtcConfig,
|
|
3858
|
-
iceProvider
|
|
3859
|
-
});
|
|
3860
|
-
return connection.createTransportChannel(options);
|
|
3861
|
-
}
|
|
3682
|
+
createTransport: (options) => new LibDataChannelTransport({
|
|
3683
|
+
...options,
|
|
3684
|
+
webrtcConfig,
|
|
3685
|
+
iceProvider
|
|
3686
|
+
})
|
|
3862
3687
|
};
|
|
3863
3688
|
};
|
|
3864
|
-
var
|
|
3865
|
-
|
|
3866
|
-
|
|
3867
|
-
|
|
3868
|
-
var RtcTransportProxy = class extends import_context7.Resource {
|
|
3689
|
+
var LibDataChannelTransport = class _LibDataChannelTransport {
|
|
3690
|
+
static {
|
|
3691
|
+
this._instanceCount = 0;
|
|
3692
|
+
}
|
|
3869
3693
|
constructor(_options) {
|
|
3870
|
-
super();
|
|
3871
3694
|
this._options = _options;
|
|
3872
|
-
this.
|
|
3873
|
-
this.
|
|
3874
|
-
this.
|
|
3875
|
-
this.
|
|
3695
|
+
this._closed = false;
|
|
3696
|
+
this._connected = false;
|
|
3697
|
+
this._writeCallback = null;
|
|
3698
|
+
this._readyForCandidates = new import_async12.Trigger();
|
|
3699
|
+
this.closed = new import_async12.Event();
|
|
3700
|
+
this.connected = new import_async12.Event();
|
|
3701
|
+
this.errors = new import_debug7.ErrorStream();
|
|
3876
3702
|
}
|
|
3877
|
-
|
|
3878
|
-
|
|
3879
|
-
|
|
3880
|
-
|
|
3881
|
-
|
|
3882
|
-
|
|
3883
|
-
|
|
3884
|
-
|
|
3885
|
-
|
|
3703
|
+
get isOpen() {
|
|
3704
|
+
return !!this._peer && !this._closed;
|
|
3705
|
+
}
|
|
3706
|
+
async open() {
|
|
3707
|
+
if (this._closed) {
|
|
3708
|
+
this.errors.raise(new Error("connection already closed"));
|
|
3709
|
+
}
|
|
3710
|
+
const { RTCPeerConnection } = (await importESM("node-datachannel/polyfill")).default;
|
|
3711
|
+
const providedIceServers = await this._options.iceProvider?.getIceServers();
|
|
3712
|
+
if (!this._options.webrtcConfig) {
|
|
3713
|
+
this._options.webrtcConfig = {};
|
|
3714
|
+
}
|
|
3715
|
+
this._options.webrtcConfig.iceServers = [
|
|
3716
|
+
...this._options.webrtcConfig.iceServers ?? [],
|
|
3717
|
+
...providedIceServers ?? []
|
|
3718
|
+
];
|
|
3719
|
+
this._peer = new RTCPeerConnection(this._options.webrtcConfig);
|
|
3720
|
+
this._peer.onicecandidateerror = (event) => {
|
|
3721
|
+
import_log15.log.error("peer.onicecandidateerror", {
|
|
3722
|
+
event
|
|
3886
3723
|
}, {
|
|
3887
|
-
|
|
3724
|
+
F: __dxlog_file16,
|
|
3725
|
+
L: 93,
|
|
3726
|
+
S: this,
|
|
3727
|
+
C: (f, a) => f(...a)
|
|
3888
3728
|
});
|
|
3889
|
-
}
|
|
3890
|
-
|
|
3891
|
-
|
|
3892
|
-
|
|
3893
|
-
|
|
3894
|
-
|
|
3895
|
-
|
|
3896
|
-
|
|
3897
|
-
|
|
3898
|
-
|
|
3729
|
+
};
|
|
3730
|
+
this._peer.onconnectionstatechange = (event) => {
|
|
3731
|
+
import_log15.log.debug("peer.onconnectionstatechange", {
|
|
3732
|
+
event,
|
|
3733
|
+
peerConnectionState: this._peer?.connectionState,
|
|
3734
|
+
transportConnectionState: this._connected
|
|
3735
|
+
}, {
|
|
3736
|
+
F: __dxlog_file16,
|
|
3737
|
+
L: 97,
|
|
3738
|
+
S: this,
|
|
3739
|
+
C: (f, a) => f(...a)
|
|
3740
|
+
});
|
|
3741
|
+
};
|
|
3742
|
+
this._peer.onicecandidate = async (event) => {
|
|
3743
|
+
import_log15.log.debug("peer.onicecandidate", {
|
|
3744
|
+
event
|
|
3745
|
+
}, {
|
|
3746
|
+
F: __dxlog_file16,
|
|
3747
|
+
L: 107,
|
|
3748
|
+
S: this,
|
|
3749
|
+
C: (f, a) => f(...a)
|
|
3750
|
+
});
|
|
3751
|
+
if (event.candidate) {
|
|
3752
|
+
try {
|
|
3753
|
+
await this._options.sendSignal({
|
|
3754
|
+
payload: {
|
|
3755
|
+
data: {
|
|
3756
|
+
type: "candidate",
|
|
3757
|
+
candidate: {
|
|
3758
|
+
candidate: event.candidate.candidate,
|
|
3759
|
+
// These fields never seem to be not null, but connecting to Chrome doesn't work if they are.
|
|
3760
|
+
sdpMLineIndex: event.candidate.sdpMLineIndex ?? 0,
|
|
3761
|
+
sdpMid: event.candidate.sdpMid ?? 0
|
|
3762
|
+
}
|
|
3763
|
+
}
|
|
3764
|
+
}
|
|
3765
|
+
});
|
|
3766
|
+
} catch (err) {
|
|
3767
|
+
import_log15.log.info("signaling error", {
|
|
3768
|
+
err
|
|
3769
|
+
}, {
|
|
3770
|
+
F: __dxlog_file16,
|
|
3771
|
+
L: 124,
|
|
3772
|
+
S: this,
|
|
3773
|
+
C: (f, a) => f(...a)
|
|
3774
|
+
});
|
|
3775
|
+
}
|
|
3776
|
+
}
|
|
3777
|
+
};
|
|
3778
|
+
if (this._options.initiator) {
|
|
3779
|
+
(0, import_invariant13.invariant)(this._peer, "not open", {
|
|
3780
|
+
F: __dxlog_file16,
|
|
3781
|
+
L: 130,
|
|
3782
|
+
S: this,
|
|
3783
|
+
A: [
|
|
3784
|
+
"this._peer",
|
|
3785
|
+
"'not open'"
|
|
3786
|
+
]
|
|
3787
|
+
});
|
|
3788
|
+
this._peer.createOffer().then(async (offer) => {
|
|
3789
|
+
if (this._closed) {
|
|
3790
|
+
return;
|
|
3791
|
+
}
|
|
3792
|
+
if (this._peer?.connectionState !== "connecting") {
|
|
3793
|
+
import_log15.log.error("peer not connecting", {
|
|
3794
|
+
peer: this._peer
|
|
3795
|
+
}, {
|
|
3796
|
+
F: __dxlog_file16,
|
|
3797
|
+
L: 141,
|
|
3798
|
+
S: this,
|
|
3799
|
+
C: (f, a) => f(...a)
|
|
3800
|
+
});
|
|
3801
|
+
this.errors.raise(new Error("invalid state: peer is initiator, but other peer not in state connecting"));
|
|
3802
|
+
}
|
|
3803
|
+
import_log15.log.debug("creating offer", {
|
|
3804
|
+
peer: this._peer,
|
|
3805
|
+
offer
|
|
3806
|
+
}, {
|
|
3807
|
+
F: __dxlog_file16,
|
|
3808
|
+
L: 145,
|
|
3899
3809
|
S: this,
|
|
3900
3810
|
C: (f, a) => f(...a)
|
|
3901
3811
|
});
|
|
3902
|
-
|
|
3903
|
-
|
|
3904
|
-
|
|
3905
|
-
|
|
3906
|
-
|
|
3907
|
-
|
|
3908
|
-
|
|
3909
|
-
|
|
3910
|
-
|
|
3911
|
-
|
|
3812
|
+
await this._peer.setLocalDescription(offer);
|
|
3813
|
+
await this._options.sendSignal({
|
|
3814
|
+
payload: {
|
|
3815
|
+
data: {
|
|
3816
|
+
type: offer.type,
|
|
3817
|
+
sdp: offer.sdp
|
|
3818
|
+
}
|
|
3819
|
+
}
|
|
3820
|
+
});
|
|
3821
|
+
}).catch((err) => {
|
|
3822
|
+
this.errors.raise(err);
|
|
3823
|
+
});
|
|
3824
|
+
this._handleChannel(this._peer.createDataChannel(DATACHANNEL_LABEL));
|
|
3825
|
+
import_log15.log.debug("created data channel", void 0, {
|
|
3826
|
+
F: __dxlog_file16,
|
|
3827
|
+
L: 155,
|
|
3828
|
+
S: this,
|
|
3829
|
+
C: (f, a) => f(...a)
|
|
3830
|
+
});
|
|
3831
|
+
this._peer.ondatachannel = () => {
|
|
3832
|
+
this.errors.raise(new Error("unexpected ondatachannel event for initiator"));
|
|
3833
|
+
};
|
|
3834
|
+
} else {
|
|
3835
|
+
this._peer.ondatachannel = (event) => {
|
|
3836
|
+
import_log15.log.debug("peer.ondatachannel (non-initiator)", {
|
|
3837
|
+
event
|
|
3912
3838
|
}, {
|
|
3913
|
-
F:
|
|
3914
|
-
L:
|
|
3839
|
+
F: __dxlog_file16,
|
|
3840
|
+
L: 161,
|
|
3915
3841
|
S: this,
|
|
3916
3842
|
C: (f, a) => f(...a)
|
|
3917
3843
|
});
|
|
3918
|
-
if (
|
|
3919
|
-
this.
|
|
3920
|
-
} else {
|
|
3921
|
-
void this.close();
|
|
3844
|
+
if (event.channel.label !== DATACHANNEL_LABEL) {
|
|
3845
|
+
this.errors.raise(new Error(`unexpected channel label ${event.channel.label}`));
|
|
3922
3846
|
}
|
|
3847
|
+
this._handleChannel(event.channel);
|
|
3848
|
+
};
|
|
3849
|
+
}
|
|
3850
|
+
_LibDataChannelTransport._instanceCount++;
|
|
3851
|
+
}
|
|
3852
|
+
async close() {
|
|
3853
|
+
await this._close();
|
|
3854
|
+
if (--_LibDataChannelTransport._instanceCount === 0) {
|
|
3855
|
+
(await importESM("node-datachannel")).cleanup();
|
|
3856
|
+
}
|
|
3857
|
+
}
|
|
3858
|
+
async _close() {
|
|
3859
|
+
if (this._closed) {
|
|
3860
|
+
return;
|
|
3861
|
+
}
|
|
3862
|
+
await this._disconnectStreams();
|
|
3863
|
+
try {
|
|
3864
|
+
this._peer?.close();
|
|
3865
|
+
} catch (err) {
|
|
3866
|
+
this.errors.raise(err);
|
|
3867
|
+
}
|
|
3868
|
+
this._peer = void 0;
|
|
3869
|
+
this._closed = true;
|
|
3870
|
+
this.closed.emit();
|
|
3871
|
+
}
|
|
3872
|
+
/**
|
|
3873
|
+
* Handle data channel events.
|
|
3874
|
+
*/
|
|
3875
|
+
_handleChannel(dataChannel) {
|
|
3876
|
+
this._channel = dataChannel;
|
|
3877
|
+
this._channel.onopen = () => {
|
|
3878
|
+
import_log15.log.debug("channel.onopen", void 0, {
|
|
3879
|
+
F: __dxlog_file16,
|
|
3880
|
+
L: 206,
|
|
3881
|
+
S: this,
|
|
3882
|
+
C: (f, a) => f(...a)
|
|
3923
3883
|
});
|
|
3924
|
-
const
|
|
3925
|
-
|
|
3926
|
-
|
|
3927
|
-
|
|
3928
|
-
|
|
3929
|
-
|
|
3930
|
-
}
|
|
3931
|
-
|
|
3932
|
-
|
|
3933
|
-
|
|
3934
|
-
|
|
3935
|
-
|
|
3936
|
-
|
|
3884
|
+
const duplex = new import_stream.Duplex({
|
|
3885
|
+
read: () => {
|
|
3886
|
+
},
|
|
3887
|
+
write: async (chunk, encoding, callback) => {
|
|
3888
|
+
if (chunk.length > MAX_MESSAGE_SIZE) {
|
|
3889
|
+
this.errors.raise(new Error(`message too large: ${chunk.length} > ${MAX_MESSAGE_SIZE}`));
|
|
3890
|
+
}
|
|
3891
|
+
try {
|
|
3892
|
+
dataChannel.send(chunk);
|
|
3893
|
+
} catch (err) {
|
|
3894
|
+
this.errors.raise(err);
|
|
3895
|
+
await this._close();
|
|
3896
|
+
}
|
|
3897
|
+
if (this._channel.bufferedAmount > MAX_BUFFERED_AMOUNT) {
|
|
3898
|
+
if (this._writeCallback !== null) {
|
|
3899
|
+
import_log15.log.error("consumer trying to write before we are ready for more data", void 0, {
|
|
3900
|
+
F: __dxlog_file16,
|
|
3901
|
+
L: 223,
|
|
3937
3902
|
S: this,
|
|
3938
3903
|
C: (f, a) => f(...a)
|
|
3939
3904
|
});
|
|
3940
|
-
(0, import_async13.scheduleTask)(this._ctx, () => callback(), RESP_MIN_THRESHOLD);
|
|
3941
|
-
} else {
|
|
3942
|
-
callback();
|
|
3943
3905
|
}
|
|
3944
|
-
|
|
3906
|
+
this._writeCallback = callback;
|
|
3907
|
+
} else {
|
|
3945
3908
|
callback();
|
|
3946
|
-
|
|
3947
|
-
});
|
|
3909
|
+
}
|
|
3948
3910
|
}
|
|
3949
3911
|
});
|
|
3950
|
-
|
|
3951
|
-
|
|
3912
|
+
duplex.pipe(this._options.stream).pipe(duplex);
|
|
3913
|
+
this._stream = duplex;
|
|
3914
|
+
this._connected = true;
|
|
3915
|
+
this.connected.emit();
|
|
3916
|
+
};
|
|
3917
|
+
this._channel.onclose = async (err) => {
|
|
3918
|
+
import_log15.log.info("channel.onclose", {
|
|
3919
|
+
err
|
|
3920
|
+
}, {
|
|
3921
|
+
F: __dxlog_file16,
|
|
3922
|
+
L: 239,
|
|
3923
|
+
S: this,
|
|
3924
|
+
C: (f, a) => f(...a)
|
|
3952
3925
|
});
|
|
3953
|
-
this.
|
|
3954
|
-
}
|
|
3955
|
-
|
|
3956
|
-
|
|
3957
|
-
|
|
3958
|
-
|
|
3926
|
+
await this._close();
|
|
3927
|
+
};
|
|
3928
|
+
this._channel.onerror = async (err) => {
|
|
3929
|
+
this.errors.raise(new Error("channel error: " + err.toString()));
|
|
3930
|
+
await this._close();
|
|
3931
|
+
};
|
|
3932
|
+
this._channel.onbufferedamountlow = () => {
|
|
3933
|
+
const cb = this._writeCallback;
|
|
3934
|
+
this._writeCallback = null;
|
|
3935
|
+
cb?.();
|
|
3936
|
+
};
|
|
3937
|
+
this._channel.onmessage = (event) => {
|
|
3938
|
+
let data = event.data;
|
|
3939
|
+
if (data instanceof ArrayBuffer) {
|
|
3940
|
+
data = Buffer.from(data);
|
|
3941
|
+
}
|
|
3942
|
+
this._stream.push(data);
|
|
3943
|
+
};
|
|
3944
|
+
}
|
|
3945
|
+
async onSignal(signal) {
|
|
3946
|
+
(0, import_invariant13.invariant)(this._peer, "not open", {
|
|
3947
|
+
F: __dxlog_file16,
|
|
3948
|
+
L: 265,
|
|
3949
|
+
S: this,
|
|
3950
|
+
A: [
|
|
3951
|
+
"this._peer",
|
|
3952
|
+
"'not open'"
|
|
3953
|
+
]
|
|
3954
|
+
});
|
|
3955
|
+
try {
|
|
3956
|
+
const data = signal.payload.data;
|
|
3957
|
+
switch (data.type) {
|
|
3958
|
+
case "offer": {
|
|
3959
|
+
if (this._peer.connectionState !== "new") {
|
|
3960
|
+
import_log15.log.error("received offer but peer not in state new", {
|
|
3961
|
+
peer: this._peer
|
|
3962
|
+
}, {
|
|
3963
|
+
F: __dxlog_file16,
|
|
3964
|
+
L: 272,
|
|
3965
|
+
S: this,
|
|
3966
|
+
C: (f, a) => f(...a)
|
|
3967
|
+
});
|
|
3968
|
+
this.errors.raise(new Error("invalid signalling state: received offer when peer is not in state new"));
|
|
3969
|
+
break;
|
|
3970
|
+
}
|
|
3971
|
+
try {
|
|
3972
|
+
await this._peer.setRemoteDescription({
|
|
3973
|
+
type: data.type,
|
|
3974
|
+
sdp: data.sdp
|
|
3975
|
+
});
|
|
3976
|
+
const answer = await this._peer.createAnswer();
|
|
3977
|
+
await this._peer.setLocalDescription(answer);
|
|
3978
|
+
await this._options.sendSignal({
|
|
3979
|
+
payload: {
|
|
3980
|
+
data: {
|
|
3981
|
+
type: answer.type,
|
|
3982
|
+
sdp: answer.sdp
|
|
3983
|
+
}
|
|
3984
|
+
}
|
|
3985
|
+
});
|
|
3986
|
+
this._readyForCandidates.wake();
|
|
3987
|
+
} catch (err) {
|
|
3988
|
+
import_log15.log.error("cannot handle offer from signalling server", {
|
|
3989
|
+
err
|
|
3990
|
+
}, {
|
|
3991
|
+
F: __dxlog_file16,
|
|
3992
|
+
L: 284,
|
|
3993
|
+
S: this,
|
|
3994
|
+
C: (f, a) => f(...a)
|
|
3995
|
+
});
|
|
3996
|
+
this.errors.raise(new Error("error handling offer"));
|
|
3997
|
+
}
|
|
3998
|
+
break;
|
|
3999
|
+
}
|
|
4000
|
+
case "answer":
|
|
4001
|
+
try {
|
|
4002
|
+
await this._peer.setRemoteDescription({
|
|
4003
|
+
type: data.type,
|
|
4004
|
+
sdp: data.sdp
|
|
4005
|
+
});
|
|
4006
|
+
this._readyForCandidates.wake();
|
|
4007
|
+
} catch (err) {
|
|
4008
|
+
import_log15.log.error("cannot handle answer from signalling server", {
|
|
4009
|
+
err
|
|
4010
|
+
}, {
|
|
4011
|
+
F: __dxlog_file16,
|
|
4012
|
+
L: 295,
|
|
4013
|
+
S: this,
|
|
4014
|
+
C: (f, a) => f(...a)
|
|
4015
|
+
});
|
|
4016
|
+
this.errors.raise(new Error("error handling answer"));
|
|
4017
|
+
}
|
|
4018
|
+
break;
|
|
4019
|
+
case "candidate":
|
|
4020
|
+
await this._readyForCandidates.wait();
|
|
4021
|
+
await this._peer.addIceCandidate({
|
|
4022
|
+
candidate: data.candidate.candidate
|
|
4023
|
+
});
|
|
4024
|
+
break;
|
|
4025
|
+
default:
|
|
4026
|
+
import_log15.log.error("unhandled signal type", {
|
|
4027
|
+
type: data.type,
|
|
4028
|
+
signal
|
|
4029
|
+
}, {
|
|
4030
|
+
F: __dxlog_file16,
|
|
4031
|
+
L: 306,
|
|
4032
|
+
S: this,
|
|
4033
|
+
C: (f, a) => f(...a)
|
|
4034
|
+
});
|
|
4035
|
+
this.errors.raise(new Error(`unhandled signal type ${data.type}`));
|
|
3959
4036
|
}
|
|
3960
|
-
});
|
|
3961
|
-
}
|
|
3962
|
-
async _close() {
|
|
3963
|
-
try {
|
|
3964
|
-
await this._serviceStream?.close();
|
|
3965
|
-
this._serviceStream = void 0;
|
|
3966
|
-
} catch (err) {
|
|
3967
|
-
import_log14.log.catch(err, void 0, {
|
|
3968
|
-
F: __dxlog_file15,
|
|
3969
|
-
L: 128,
|
|
3970
|
-
S: this,
|
|
3971
|
-
C: (f, a) => f(...a)
|
|
3972
|
-
});
|
|
3973
|
-
}
|
|
3974
|
-
try {
|
|
3975
|
-
await this._options.bridgeService.close({
|
|
3976
|
-
proxyId: this._proxyId
|
|
3977
|
-
}, {
|
|
3978
|
-
timeout: CLOSE_RPC_TIMEOUT
|
|
3979
|
-
});
|
|
3980
4037
|
} catch (err) {
|
|
3981
|
-
|
|
3982
|
-
F:
|
|
3983
|
-
L:
|
|
4038
|
+
import_log15.log.catch(err, void 0, {
|
|
4039
|
+
F: __dxlog_file16,
|
|
4040
|
+
L: 310,
|
|
3984
4041
|
S: this,
|
|
3985
4042
|
C: (f, a) => f(...a)
|
|
3986
4043
|
});
|
|
3987
4044
|
}
|
|
3988
|
-
this.closed.emit();
|
|
3989
|
-
}
|
|
3990
|
-
async onSignal(signal) {
|
|
3991
|
-
this._options.bridgeService.sendSignal({
|
|
3992
|
-
proxyId: this._proxyId,
|
|
3993
|
-
signal
|
|
3994
|
-
}, {
|
|
3995
|
-
timeout: RPC_TIMEOUT
|
|
3996
|
-
}).catch((err) => this._raiseIfOpen(decodeError(err)));
|
|
3997
|
-
}
|
|
3998
|
-
async _handleConnection(connectionEvent) {
|
|
3999
|
-
if (connectionEvent.error) {
|
|
4000
|
-
this.errors.raise(decodeError(connectionEvent.error));
|
|
4001
|
-
return;
|
|
4002
|
-
}
|
|
4003
|
-
switch (connectionEvent.state) {
|
|
4004
|
-
case import_bridge.ConnectionState.CONNECTED: {
|
|
4005
|
-
this.connected.emit();
|
|
4006
|
-
break;
|
|
4007
|
-
}
|
|
4008
|
-
case import_bridge.ConnectionState.CLOSED: {
|
|
4009
|
-
await this.close();
|
|
4010
|
-
break;
|
|
4011
|
-
}
|
|
4012
|
-
}
|
|
4013
|
-
}
|
|
4014
|
-
_handleData(dataEvent) {
|
|
4015
|
-
try {
|
|
4016
|
-
this._options.stream.write((0, import_util9.arrayToBuffer)(dataEvent.payload));
|
|
4017
|
-
} catch (error) {
|
|
4018
|
-
this._raiseIfOpen(error);
|
|
4019
|
-
}
|
|
4020
|
-
}
|
|
4021
|
-
async _handleSignal(signalEvent) {
|
|
4022
|
-
try {
|
|
4023
|
-
await this._options.sendSignal(signalEvent.payload);
|
|
4024
|
-
} catch (error) {
|
|
4025
|
-
const type = signalEvent.payload.payload.data?.type;
|
|
4026
|
-
if (type === "offer" || type === "answer") {
|
|
4027
|
-
this._raiseIfOpen(new import_protocols9.ConnectivityError(`Session establishment failed: ${type} couldn't be sent.`));
|
|
4028
|
-
}
|
|
4029
|
-
}
|
|
4030
4045
|
}
|
|
4031
4046
|
async getDetails() {
|
|
4032
|
-
|
|
4033
|
-
|
|
4034
|
-
|
|
4035
|
-
|
|
4036
|
-
|
|
4037
|
-
|
|
4038
|
-
return
|
|
4039
|
-
} catch (err) {
|
|
4040
|
-
return "bridge-svc unreachable";
|
|
4047
|
+
const stats = await this._getStats();
|
|
4048
|
+
const rc = stats?.remoteCandidate;
|
|
4049
|
+
if (!rc) {
|
|
4050
|
+
return "unavailable";
|
|
4051
|
+
}
|
|
4052
|
+
if (rc.candidateType === "relay") {
|
|
4053
|
+
return `${rc.ip}:${rc.port} relay for ${rc.relatedAddress}:${rc.relatedPort}`;
|
|
4041
4054
|
}
|
|
4055
|
+
return `${rc.ip}:${rc.port} ${rc.candidateType}`;
|
|
4042
4056
|
}
|
|
4043
4057
|
async getStats() {
|
|
4044
|
-
|
|
4045
|
-
|
|
4046
|
-
proxyId: this._proxyId
|
|
4047
|
-
}, {
|
|
4048
|
-
timeout: RPC_TIMEOUT
|
|
4049
|
-
});
|
|
4050
|
-
return response.stats;
|
|
4051
|
-
} catch (err) {
|
|
4058
|
+
const stats = await this._getStats();
|
|
4059
|
+
if (!stats) {
|
|
4052
4060
|
return {
|
|
4053
4061
|
bytesSent: 0,
|
|
4054
4062
|
bytesReceived: 0,
|
|
4055
4063
|
packetsSent: 0,
|
|
4056
4064
|
packetsReceived: 0,
|
|
4057
|
-
rawStats:
|
|
4065
|
+
rawStats: {}
|
|
4058
4066
|
};
|
|
4059
4067
|
}
|
|
4068
|
+
return {
|
|
4069
|
+
bytesSent: stats.transport.bytesSent,
|
|
4070
|
+
bytesReceived: stats.transport.bytesReceived,
|
|
4071
|
+
packetsSent: 0,
|
|
4072
|
+
packetsReceived: 0,
|
|
4073
|
+
rawStats: stats.raw
|
|
4074
|
+
};
|
|
4060
4075
|
}
|
|
4061
|
-
|
|
4062
|
-
|
|
4063
|
-
|
|
4064
|
-
|
|
4065
|
-
import_log14.log.info("error swallowed because transport was closed", {
|
|
4066
|
-
message: error.message
|
|
4067
|
-
}, {
|
|
4068
|
-
F: __dxlog_file15,
|
|
4069
|
-
L: 215,
|
|
4070
|
-
S: this,
|
|
4071
|
-
C: (f, a) => f(...a)
|
|
4072
|
-
});
|
|
4073
|
-
}
|
|
4074
|
-
}
|
|
4075
|
-
/**
|
|
4076
|
-
* Called when underlying proxy service becomes unavailable.
|
|
4077
|
-
*/
|
|
4078
|
-
forceClose() {
|
|
4079
|
-
void this._serviceStream?.close();
|
|
4080
|
-
this.closed.emit();
|
|
4081
|
-
}
|
|
4082
|
-
};
|
|
4083
|
-
var RtcTransportProxyFactory = class {
|
|
4084
|
-
constructor() {
|
|
4085
|
-
this._connections = /* @__PURE__ */ new Set();
|
|
4086
|
-
}
|
|
4087
|
-
/**
|
|
4088
|
-
* Sets the current BridgeService to be used to open connections.
|
|
4089
|
-
* Calling this method will close any existing connections.
|
|
4090
|
-
*/
|
|
4091
|
-
setBridgeService(bridgeService) {
|
|
4092
|
-
this._bridgeService = bridgeService;
|
|
4093
|
-
for (const connection of this._connections) {
|
|
4094
|
-
connection.forceClose();
|
|
4095
|
-
}
|
|
4096
|
-
return this;
|
|
4097
|
-
}
|
|
4098
|
-
createTransport(options) {
|
|
4099
|
-
(0, import_invariant13.invariant)(this._bridgeService, "RtcTransportProxyFactory is not ready to open connections", {
|
|
4100
|
-
F: __dxlog_file15,
|
|
4101
|
-
L: 245,
|
|
4076
|
+
async _getStats() {
|
|
4077
|
+
(0, import_invariant13.invariant)(this._peer, "not open", {
|
|
4078
|
+
F: __dxlog_file16,
|
|
4079
|
+
L: 350,
|
|
4102
4080
|
S: this,
|
|
4103
4081
|
A: [
|
|
4104
|
-
"this.
|
|
4105
|
-
"'
|
|
4082
|
+
"this._peer",
|
|
4083
|
+
"'not open'"
|
|
4106
4084
|
]
|
|
4107
4085
|
});
|
|
4108
|
-
const
|
|
4109
|
-
|
|
4110
|
-
|
|
4111
|
-
|
|
4112
|
-
|
|
4113
|
-
|
|
4114
|
-
|
|
4086
|
+
const stats = await this._peer.getStats();
|
|
4087
|
+
const statsEntries = Array.from(stats.entries());
|
|
4088
|
+
const transport = statsEntries.filter((s) => s[1].type === "transport")[0][1];
|
|
4089
|
+
const candidatePair = statsEntries.filter((s) => s[0] === transport.selectedCandidatePairId);
|
|
4090
|
+
let selectedCandidatePair;
|
|
4091
|
+
let remoteCandidate;
|
|
4092
|
+
if (candidatePair.length > 0) {
|
|
4093
|
+
selectedCandidatePair = candidatePair[0][1];
|
|
4094
|
+
remoteCandidate = statsEntries.filter((s) => s[0] === selectedCandidatePair.remoteCandidateId)[0][1];
|
|
4095
|
+
}
|
|
4096
|
+
return {
|
|
4097
|
+
transport,
|
|
4098
|
+
selectedCandidatePair,
|
|
4099
|
+
remoteCandidate,
|
|
4100
|
+
raw: Object.fromEntries(stats)
|
|
4101
|
+
};
|
|
4115
4102
|
}
|
|
4116
|
-
|
|
4117
|
-
|
|
4118
|
-
const message = typeof err === "string" ? err : err.message;
|
|
4119
|
-
if (message.includes("CONNECTION_RESET")) {
|
|
4120
|
-
return new import_protocols9.ConnectionResetError(message);
|
|
4121
|
-
} else if (message.includes("TIMEOUT")) {
|
|
4122
|
-
return new import_protocols9.TimeoutError(message);
|
|
4123
|
-
} else if (message.includes("CONNECTIVITY_ERROR")) {
|
|
4124
|
-
return new import_protocols9.ConnectivityError(message);
|
|
4125
|
-
} else {
|
|
4126
|
-
return typeof err === "string" ? new Error(err) : err;
|
|
4103
|
+
async _disconnectStreams() {
|
|
4104
|
+
this._options.stream.unpipe?.(this._stream)?.unpipe?.(this._options.stream);
|
|
4127
4105
|
}
|
|
4128
4106
|
};
|
|
4129
|
-
|
|
4130
|
-
|
|
4131
|
-
|
|
4132
|
-
|
|
4133
|
-
|
|
4107
|
+
_ts_decorate7([
|
|
4108
|
+
import_async12.synchronized
|
|
4109
|
+
], LibDataChannelTransport.prototype, "_close", null);
|
|
4110
|
+
var importESM = Function("path", "return import(path)");
|
|
4111
|
+
var __dxlog_file17 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/tcp-transport.ts";
|
|
4112
|
+
var TcpTransportFactory = {
|
|
4113
|
+
createTransport: (options) => new TcpTransport(options)
|
|
4114
|
+
};
|
|
4115
|
+
var TcpTransport = class {
|
|
4116
|
+
constructor(options) {
|
|
4117
|
+
this.options = options;
|
|
4118
|
+
this._server = void 0;
|
|
4119
|
+
this._socket = void 0;
|
|
4120
|
+
this._connected = false;
|
|
4121
|
+
this._closed = false;
|
|
4122
|
+
this.closed = new import_async13.Event();
|
|
4123
|
+
this.connected = new import_async13.Event();
|
|
4124
|
+
this.errors = new import_debug8.ErrorStream();
|
|
4134
4125
|
}
|
|
4135
|
-
|
|
4136
|
-
return this.
|
|
4126
|
+
get isOpen() {
|
|
4127
|
+
return this._connected && !this._closed;
|
|
4137
4128
|
}
|
|
4138
|
-
open(
|
|
4139
|
-
|
|
4140
|
-
|
|
4141
|
-
|
|
4142
|
-
|
|
4143
|
-
|
|
4144
|
-
|
|
4145
|
-
|
|
4146
|
-
|
|
4147
|
-
|
|
4148
|
-
|
|
4149
|
-
|
|
4150
|
-
|
|
4151
|
-
|
|
4152
|
-
|
|
4153
|
-
|
|
4154
|
-
const callbacks = [
|
|
4155
|
-
...transportState.writeProcessedCallbacks
|
|
4156
|
-
];
|
|
4157
|
-
transportState.writeProcessedCallbacks.length = 0;
|
|
4158
|
-
callbacks.forEach((cb) => cb());
|
|
4159
|
-
},
|
|
4160
|
-
write: function(chunk, _, callback) {
|
|
4161
|
-
next({
|
|
4162
|
-
data: {
|
|
4163
|
-
payload: chunk
|
|
4164
|
-
}
|
|
4129
|
+
async open() {
|
|
4130
|
+
(0, import_log16.log)("opening", void 0, {
|
|
4131
|
+
F: __dxlog_file17,
|
|
4132
|
+
L: 39,
|
|
4133
|
+
S: this,
|
|
4134
|
+
C: (f, a) => f(...a)
|
|
4135
|
+
});
|
|
4136
|
+
if (this.options.initiator) {
|
|
4137
|
+
setTimeout(async () => {
|
|
4138
|
+
const { Server } = await import("node:net");
|
|
4139
|
+
this._server = new Server((socket) => {
|
|
4140
|
+
(0, import_log16.log)("new connection", void 0, {
|
|
4141
|
+
F: __dxlog_file17,
|
|
4142
|
+
L: 47,
|
|
4143
|
+
S: this,
|
|
4144
|
+
C: (f, a) => f(...a)
|
|
4165
4145
|
});
|
|
4166
|
-
|
|
4167
|
-
|
|
4168
|
-
|
|
4169
|
-
|
|
4170
|
-
|
|
4171
|
-
|
|
4172
|
-
|
|
4173
|
-
|
|
4174
|
-
|
|
4175
|
-
|
|
4176
|
-
|
|
4177
|
-
|
|
4178
|
-
|
|
4146
|
+
if (this._connected) {
|
|
4147
|
+
socket.destroy();
|
|
4148
|
+
}
|
|
4149
|
+
this._handleSocket(socket);
|
|
4150
|
+
});
|
|
4151
|
+
this._server.on("listening", () => {
|
|
4152
|
+
const { port } = this._server.address();
|
|
4153
|
+
(0, import_log16.log)("listening", {
|
|
4154
|
+
port
|
|
4155
|
+
}, {
|
|
4156
|
+
F: __dxlog_file17,
|
|
4157
|
+
L: 56,
|
|
4158
|
+
S: this,
|
|
4159
|
+
C: (f, a) => f(...a)
|
|
4160
|
+
});
|
|
4161
|
+
void this.options.sendSignal({
|
|
4162
|
+
payload: {
|
|
4163
|
+
port
|
|
4164
|
+
}
|
|
4165
|
+
}).catch((err) => {
|
|
4166
|
+
if (!this._closed) {
|
|
4167
|
+
this.errors.raise(err);
|
|
4179
4168
|
}
|
|
4180
4169
|
});
|
|
4181
|
-
}
|
|
4182
|
-
|
|
4183
|
-
|
|
4184
|
-
|
|
4185
|
-
|
|
4186
|
-
connectorStream: transportStream,
|
|
4187
|
-
writeProcessedCallbacks: []
|
|
4188
|
-
};
|
|
4189
|
-
pushNewState(import_bridge2.ConnectionState.CONNECTING);
|
|
4190
|
-
transport.connected.on(() => pushNewState(import_bridge2.ConnectionState.CONNECTED));
|
|
4191
|
-
transport.errors.handle(async (err) => {
|
|
4192
|
-
pushNewState(import_bridge2.ConnectionState.CLOSED, err);
|
|
4193
|
-
void this._safeCloseTransport(transportState);
|
|
4194
|
-
close(err);
|
|
4195
|
-
});
|
|
4196
|
-
transport.closed.on(async () => {
|
|
4197
|
-
pushNewState(import_bridge2.ConnectionState.CLOSED);
|
|
4198
|
-
void this._safeCloseTransport(transportState);
|
|
4199
|
-
close();
|
|
4200
|
-
});
|
|
4201
|
-
this._openTransports.set(request.proxyId, transportState);
|
|
4202
|
-
transport.open().catch(async (err) => {
|
|
4203
|
-
pushNewState(import_bridge2.ConnectionState.CLOSED, err);
|
|
4204
|
-
void this._safeCloseTransport(transportState);
|
|
4205
|
-
close(err);
|
|
4170
|
+
});
|
|
4171
|
+
this._server.on("error", (err) => {
|
|
4172
|
+
this.errors.raise(err);
|
|
4173
|
+
});
|
|
4174
|
+
this._server.listen(0);
|
|
4206
4175
|
});
|
|
4207
|
-
|
|
4208
|
-
});
|
|
4176
|
+
}
|
|
4209
4177
|
}
|
|
4210
|
-
async
|
|
4211
|
-
|
|
4212
|
-
|
|
4213
|
-
|
|
4214
|
-
L: 121,
|
|
4178
|
+
async close() {
|
|
4179
|
+
(0, import_log16.log)("closing", void 0, {
|
|
4180
|
+
F: __dxlog_file17,
|
|
4181
|
+
L: 78,
|
|
4215
4182
|
S: this,
|
|
4216
|
-
|
|
4217
|
-
"transport",
|
|
4218
|
-
""
|
|
4219
|
-
]
|
|
4183
|
+
C: (f, a) => f(...a)
|
|
4220
4184
|
});
|
|
4221
|
-
|
|
4185
|
+
this._socket?.destroy();
|
|
4186
|
+
this._server?.close();
|
|
4187
|
+
this._closed = true;
|
|
4222
4188
|
}
|
|
4223
|
-
async
|
|
4224
|
-
|
|
4225
|
-
|
|
4226
|
-
|
|
4227
|
-
|
|
4189
|
+
async onSignal({ payload }) {
|
|
4190
|
+
(0, import_log16.log)("received signal", {
|
|
4191
|
+
payload
|
|
4192
|
+
}, {
|
|
4193
|
+
F: __dxlog_file17,
|
|
4194
|
+
L: 85,
|
|
4228
4195
|
S: this,
|
|
4229
|
-
|
|
4230
|
-
"transport",
|
|
4231
|
-
""
|
|
4232
|
-
]
|
|
4196
|
+
C: (f, a) => f(...a)
|
|
4233
4197
|
});
|
|
4234
|
-
|
|
4235
|
-
|
|
4236
|
-
}
|
|
4237
|
-
|
|
4238
|
-
|
|
4239
|
-
|
|
4240
|
-
|
|
4241
|
-
|
|
4242
|
-
L: 135,
|
|
4243
|
-
S: this,
|
|
4244
|
-
A: [
|
|
4245
|
-
"transport",
|
|
4246
|
-
""
|
|
4247
|
-
]
|
|
4198
|
+
if (this.options.initiator || this._connected) {
|
|
4199
|
+
return;
|
|
4200
|
+
}
|
|
4201
|
+
const socket = new import_node_net.Socket();
|
|
4202
|
+
this._handleSocket(socket);
|
|
4203
|
+
socket.connect({
|
|
4204
|
+
port: payload.port,
|
|
4205
|
+
host: "localhost"
|
|
4248
4206
|
});
|
|
4207
|
+
}
|
|
4208
|
+
async getDetails() {
|
|
4209
|
+
if (this.options.initiator) {
|
|
4210
|
+
const { port: port2, address: address2 } = this._server?.address();
|
|
4211
|
+
return `LISTEN ${address2}:${port2}`;
|
|
4212
|
+
}
|
|
4213
|
+
const { port, address } = this._socket?.address();
|
|
4214
|
+
return `ACCEPT ${address}:${port}`;
|
|
4215
|
+
}
|
|
4216
|
+
async getStats() {
|
|
4249
4217
|
return {
|
|
4250
|
-
|
|
4218
|
+
bytesSent: 0,
|
|
4219
|
+
bytesReceived: 0,
|
|
4220
|
+
packetsSent: 0,
|
|
4221
|
+
packetsReceived: 0
|
|
4251
4222
|
};
|
|
4252
4223
|
}
|
|
4253
|
-
|
|
4254
|
-
|
|
4255
|
-
|
|
4256
|
-
|
|
4257
|
-
|
|
4224
|
+
_handleSocket(socket) {
|
|
4225
|
+
(0, import_log16.log)("handling socket", {
|
|
4226
|
+
remotePort: socket.remotePort,
|
|
4227
|
+
localPort: socket.localPort
|
|
4228
|
+
}, {
|
|
4229
|
+
F: __dxlog_file17,
|
|
4230
|
+
L: 115,
|
|
4258
4231
|
S: this,
|
|
4259
|
-
|
|
4260
|
-
"transport",
|
|
4261
|
-
""
|
|
4262
|
-
]
|
|
4232
|
+
C: (f, a) => f(...a)
|
|
4263
4233
|
});
|
|
4264
|
-
|
|
4265
|
-
|
|
4266
|
-
|
|
4267
|
-
|
|
4268
|
-
});
|
|
4269
|
-
}
|
|
4270
|
-
}
|
|
4271
|
-
async close({ proxyId }) {
|
|
4272
|
-
const transport = this._openTransports.get(proxyId);
|
|
4273
|
-
if (!transport) {
|
|
4274
|
-
return;
|
|
4275
|
-
}
|
|
4276
|
-
this._openTransports.delete(proxyId);
|
|
4277
|
-
await this._safeCloseTransport(transport);
|
|
4278
|
-
}
|
|
4279
|
-
async _safeCloseTransport(transport) {
|
|
4280
|
-
if (this._openTransports.get(transport.proxyId) === transport) {
|
|
4281
|
-
this._openTransports.delete(transport.proxyId);
|
|
4282
|
-
}
|
|
4283
|
-
transport.writeProcessedCallbacks.forEach((cb) => cb());
|
|
4284
|
-
try {
|
|
4285
|
-
await transport.transport.close();
|
|
4286
|
-
} catch (error) {
|
|
4287
|
-
import_log15.log.warn("transport close error", {
|
|
4288
|
-
message: error?.message
|
|
4289
|
-
}, {
|
|
4290
|
-
F: __dxlog_file16,
|
|
4291
|
-
L: 172,
|
|
4292
|
-
S: this,
|
|
4293
|
-
C: (f, a) => f(...a)
|
|
4294
|
-
});
|
|
4295
|
-
}
|
|
4296
|
-
try {
|
|
4297
|
-
transport.connectorStream.end();
|
|
4298
|
-
} catch (error) {
|
|
4299
|
-
import_log15.log.warn("connectorStream close error", {
|
|
4300
|
-
message: error?.message
|
|
4234
|
+
this._socket = socket;
|
|
4235
|
+
this._socket.on("connect", () => {
|
|
4236
|
+
(0, import_log16.log)("connected to", {
|
|
4237
|
+
port: this._socket?.remotePort
|
|
4301
4238
|
}, {
|
|
4302
|
-
F:
|
|
4303
|
-
L:
|
|
4239
|
+
F: __dxlog_file17,
|
|
4240
|
+
L: 119,
|
|
4304
4241
|
S: this,
|
|
4305
4242
|
C: (f, a) => f(...a)
|
|
4306
4243
|
});
|
|
4307
|
-
|
|
4308
|
-
(0, import_log15.log)("closed", void 0, {
|
|
4309
|
-
F: __dxlog_file16,
|
|
4310
|
-
L: 179,
|
|
4311
|
-
S: this,
|
|
4312
|
-
C: (f, a) => f(...a)
|
|
4244
|
+
this._connected = true;
|
|
4313
4245
|
});
|
|
4314
|
-
|
|
4315
|
-
|
|
4316
|
-
var createStateUpdater = (next) => {
|
|
4317
|
-
return (state, err) => {
|
|
4318
|
-
next({
|
|
4319
|
-
connection: {
|
|
4320
|
-
state,
|
|
4321
|
-
...err ? {
|
|
4322
|
-
error: err.message
|
|
4323
|
-
} : void 0
|
|
4324
|
-
}
|
|
4246
|
+
this._socket.on("error", (err) => {
|
|
4247
|
+
this.errors.raise(err);
|
|
4325
4248
|
});
|
|
4326
|
-
|
|
4249
|
+
this._socket.on("close", () => {
|
|
4250
|
+
this.closed.emit();
|
|
4251
|
+
});
|
|
4252
|
+
this.connected.emit();
|
|
4253
|
+
this.options.stream.pipe(this._socket).pipe(this.options.stream);
|
|
4254
|
+
}
|
|
4327
4255
|
};
|
|
4328
4256
|
var createTeleportProtocolFactory = (onConnection, defaultParams) => {
|
|
4329
4257
|
return (params) => {
|
|
@@ -4354,21 +4282,26 @@ var createTeleportProtocolFactory = (onConnection, defaultParams) => {
|
|
|
4354
4282
|
ConnectionState,
|
|
4355
4283
|
EventType,
|
|
4356
4284
|
FullyConnectedTopology,
|
|
4285
|
+
LibDataChannelTransport,
|
|
4357
4286
|
MAX_CONCURRENT_INITIATING_CONNECTIONS,
|
|
4358
4287
|
MMSTTopology,
|
|
4359
4288
|
MemoryTransport,
|
|
4360
4289
|
MemoryTransportFactory,
|
|
4361
|
-
|
|
4362
|
-
|
|
4363
|
-
|
|
4290
|
+
SimplePeerTransport,
|
|
4291
|
+
SimplePeerTransportProxy,
|
|
4292
|
+
SimplePeerTransportProxyFactory,
|
|
4293
|
+
SimplePeerTransportService,
|
|
4364
4294
|
StarTopology,
|
|
4365
4295
|
Swarm,
|
|
4366
4296
|
SwarmMapper,
|
|
4367
4297
|
SwarmMessenger,
|
|
4368
4298
|
SwarmNetworkManager,
|
|
4299
|
+
TcpTransport,
|
|
4300
|
+
TcpTransportFactory,
|
|
4369
4301
|
TransportKind,
|
|
4370
4302
|
createIceProvider,
|
|
4371
|
-
|
|
4303
|
+
createLibDataChannelTransportFactory,
|
|
4304
|
+
createSimplePeerTransportFactory,
|
|
4372
4305
|
createTeleportProtocolFactory
|
|
4373
4306
|
});
|
|
4374
|
-
//# sourceMappingURL=chunk-
|
|
4307
|
+
//# sourceMappingURL=chunk-4YAYC7WN.cjs.map
|