@dxos/network-manager 0.6.12-staging.e11e696 → 0.6.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/dist/lib/browser/{chunk-YOKKEU6T.mjs → chunk-XYSYUN63.mjs} +998 -1192
  2. package/dist/lib/browser/chunk-XYSYUN63.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +19 -10
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/browser/testing/index.mjs +27 -18
  6. package/dist/lib/browser/testing/index.mjs.map +3 -3
  7. package/dist/lib/node/{chunk-7ZWQLO5T.cjs → chunk-4YAYC7WN.cjs} +1166 -1233
  8. package/dist/lib/node/chunk-4YAYC7WN.cjs.map +7 -0
  9. package/dist/lib/node/index.cjs +37 -27
  10. package/dist/lib/node/index.cjs.map +2 -2
  11. package/dist/lib/node/meta.json +1 -1
  12. package/dist/lib/node/testing/index.cjs +29 -20
  13. package/dist/lib/node/testing/index.cjs.map +3 -3
  14. package/dist/types/src/signal/integration.test.d.ts +2 -0
  15. package/dist/types/src/signal/integration.test.d.ts.map +1 -0
  16. package/dist/types/src/signal/swarm-messenger.test.d.ts +2 -0
  17. package/dist/types/src/signal/swarm-messenger.test.d.ts.map +1 -0
  18. package/dist/types/src/swarm/connection.d.ts.map +1 -1
  19. package/dist/types/src/swarm/swarm.d.ts +1 -1
  20. package/dist/types/src/testing/test-builder.d.ts +2 -2
  21. package/dist/types/src/testing/test-builder.d.ts.map +1 -1
  22. package/dist/types/src/tests/basic-test-suite.d.ts.map +1 -1
  23. package/dist/types/src/tests/property-test-suite.d.ts.map +1 -1
  24. package/dist/types/src/tests/tcp-transport.test.d.ts +2 -0
  25. package/dist/types/src/tests/tcp-transport.test.d.ts.map +1 -0
  26. package/dist/types/src/tests/utils.d.ts.map +1 -1
  27. package/dist/types/src/transport/index.d.ts +5 -1
  28. package/dist/types/src/transport/index.d.ts.map +1 -1
  29. package/dist/types/src/transport/libdatachannel-transport.d.ts +42 -0
  30. package/dist/types/src/transport/libdatachannel-transport.d.ts.map +1 -0
  31. package/dist/types/src/transport/libdatachannel-transport.test.d.ts +2 -0
  32. package/dist/types/src/transport/libdatachannel-transport.test.d.ts.map +1 -0
  33. package/dist/types/src/transport/memory-transport.d.ts +2 -2
  34. package/dist/types/src/transport/memory-transport.d.ts.map +1 -1
  35. package/dist/types/src/transport/memory-transport.test.d.ts +2 -0
  36. package/dist/types/src/transport/memory-transport.test.d.ts.map +1 -0
  37. package/dist/types/src/transport/simplepeer-simple-peer.d.ts +2 -0
  38. package/dist/types/src/transport/simplepeer-simple-peer.d.ts.map +1 -0
  39. package/dist/types/src/transport/simplepeer-transport-proxy-test.d.ts +2 -0
  40. package/dist/types/src/transport/simplepeer-transport-proxy-test.d.ts.map +1 -0
  41. package/dist/types/src/transport/{webrtc/rtc-transport-proxy.d.ts → simplepeer-transport-proxy.d.ts} +12 -10
  42. package/dist/types/src/transport/simplepeer-transport-proxy.d.ts.map +1 -0
  43. package/dist/types/src/transport/{webrtc/rtc-transport-service.d.ts → simplepeer-transport-service.d.ts} +7 -9
  44. package/dist/types/src/transport/simplepeer-transport-service.d.ts.map +1 -0
  45. package/dist/types/src/transport/simplepeer-transport.d.ts +36 -0
  46. package/dist/types/src/transport/simplepeer-transport.d.ts.map +1 -0
  47. package/dist/types/src/transport/simplepeer-transport.test.d.ts +2 -0
  48. package/dist/types/src/transport/simplepeer-transport.test.d.ts.map +1 -0
  49. package/dist/types/src/transport/{tcp/tcp-transport.browser.d.ts → tcp-transport.browser.d.ts} +3 -3
  50. package/dist/types/src/transport/tcp-transport.browser.d.ts.map +1 -0
  51. package/dist/types/src/transport/{tcp/tcp-transport.d.ts → tcp-transport.d.ts} +3 -3
  52. package/dist/types/src/transport/tcp-transport.d.ts.map +1 -0
  53. package/dist/types/src/transport/transport.d.ts +6 -7
  54. package/dist/types/src/transport/transport.d.ts.map +1 -1
  55. package/dist/types/src/transport/webrtc.d.ts +6 -0
  56. package/dist/types/src/transport/webrtc.d.ts.map +1 -0
  57. package/package.json +30 -53
  58. package/src/globals.d.ts +7 -0
  59. package/src/signal/ice.test.ts +3 -1
  60. package/src/signal/{integration.node.test.ts → integration.test.ts} +15 -9
  61. package/src/signal/{swarm-messenger.node.test.ts → swarm-messenger.test.ts} +23 -13
  62. package/src/swarm/connection-limiter.test.ts +6 -3
  63. package/src/swarm/connection.test.ts +38 -63
  64. package/src/swarm/connection.ts +5 -5
  65. package/src/swarm/swarm.test.ts +11 -9
  66. package/src/swarm/swarm.ts +1 -1
  67. package/src/testing/test-builder.ts +28 -12
  68. package/src/tests/basic-test-suite.ts +33 -34
  69. package/src/tests/memory-transport.test.ts +42 -40
  70. package/src/tests/property-test-suite.ts +22 -21
  71. package/src/tests/tcp-transport.test.ts +67 -0
  72. package/src/tests/utils.ts +2 -3
  73. package/src/tests/webrtc-transport.test.ts +9 -9
  74. package/src/transport/index.ts +5 -1
  75. package/src/transport/libdatachannel-transport.test.ts +100 -0
  76. package/src/transport/libdatachannel-transport.ts +376 -0
  77. package/src/transport/memory-transport.test.ts +74 -0
  78. package/src/transport/memory-transport.ts +0 -2
  79. package/src/transport/simplepeer-simple-peer.ts +26 -0
  80. package/src/transport/simplepeer-transport-proxy-test.ts +181 -0
  81. package/src/transport/simplepeer-transport-proxy.ts +246 -0
  82. package/src/transport/simplepeer-transport-service.ts +160 -0
  83. package/src/transport/simplepeer-transport.test.ts +61 -0
  84. package/src/transport/simplepeer-transport.ts +250 -0
  85. package/src/transport/{tcp/tcp-transport.browser.ts → tcp-transport.browser.ts} +3 -7
  86. package/src/transport/{tcp/tcp-transport.ts → tcp-transport.ts} +1 -3
  87. package/src/transport/transport.ts +7 -8
  88. package/src/transport/webrtc.ts +15 -0
  89. package/src/typings.d.ts +2 -8
  90. package/dist/lib/browser/chunk-GW3YM55A.mjs +0 -14
  91. package/dist/lib/browser/chunk-GW3YM55A.mjs.map +0 -7
  92. package/dist/lib/browser/chunk-YOKKEU6T.mjs.map +0 -7
  93. package/dist/lib/browser/transport/tcp/index.mjs +0 -39
  94. package/dist/lib/browser/transport/tcp/index.mjs.map +0 -7
  95. package/dist/lib/node/chunk-7ZWQLO5T.cjs.map +0 -7
  96. package/dist/lib/node/transport/tcp/index.cjs +0 -191
  97. package/dist/lib/node/transport/tcp/index.cjs.map +0 -7
  98. package/dist/lib/node-esm/chunk-4VO725JT.mjs +0 -4383
  99. package/dist/lib/node-esm/chunk-4VO725JT.mjs.map +0 -7
  100. package/dist/lib/node-esm/index.mjs +0 -50
  101. package/dist/lib/node-esm/index.mjs.map +0 -7
  102. package/dist/lib/node-esm/meta.json +0 -1
  103. package/dist/lib/node-esm/testing/index.mjs +0 -280
  104. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  105. package/dist/lib/node-esm/transport/tcp/index.mjs +0 -159
  106. package/dist/lib/node-esm/transport/tcp/index.mjs.map +0 -7
  107. package/dist/types/src/signal/integration.node.test.d.ts +0 -2
  108. package/dist/types/src/signal/integration.node.test.d.ts.map +0 -1
  109. package/dist/types/src/signal/swarm-messenger.node.test.d.ts +0 -2
  110. package/dist/types/src/signal/swarm-messenger.node.test.d.ts.map +0 -1
  111. package/dist/types/src/tests/tcp-transport.node.test.d.ts +0 -2
  112. package/dist/types/src/tests/tcp-transport.node.test.d.ts.map +0 -1
  113. package/dist/types/src/transport/tcp/index.d.ts +0 -2
  114. package/dist/types/src/transport/tcp/index.d.ts.map +0 -1
  115. package/dist/types/src/transport/tcp/tcp-transport.browser.d.ts.map +0 -1
  116. package/dist/types/src/transport/tcp/tcp-transport.d.ts.map +0 -1
  117. package/dist/types/src/transport/webrtc/index.d.ts +0 -4
  118. package/dist/types/src/transport/webrtc/index.d.ts.map +0 -1
  119. package/dist/types/src/transport/webrtc/rtc-connection-factory.d.ts +0 -14
  120. package/dist/types/src/transport/webrtc/rtc-connection-factory.d.ts.map +0 -1
  121. package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts +0 -68
  122. package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts.map +0 -1
  123. package/dist/types/src/transport/webrtc/rtc-transport-channel.d.ts +0 -33
  124. package/dist/types/src/transport/webrtc/rtc-transport-channel.d.ts.map +0 -1
  125. package/dist/types/src/transport/webrtc/rtc-transport-channel.test.d.ts +0 -2
  126. package/dist/types/src/transport/webrtc/rtc-transport-channel.test.d.ts.map +0 -1
  127. package/dist/types/src/transport/webrtc/rtc-transport-factory.d.ts +0 -4
  128. package/dist/types/src/transport/webrtc/rtc-transport-factory.d.ts.map +0 -1
  129. package/dist/types/src/transport/webrtc/rtc-transport-proxy.d.ts.map +0 -1
  130. package/dist/types/src/transport/webrtc/rtc-transport-proxy.test.d.ts +0 -2
  131. package/dist/types/src/transport/webrtc/rtc-transport-proxy.test.d.ts.map +0 -1
  132. package/dist/types/src/transport/webrtc/rtc-transport-service.d.ts.map +0 -1
  133. package/dist/types/src/transport/webrtc/rtc-transport-stats.d.ts +0 -4
  134. package/dist/types/src/transport/webrtc/rtc-transport-stats.d.ts.map +0 -1
  135. package/dist/types/src/transport/webrtc/rtc-transport.test.d.ts +0 -2
  136. package/dist/types/src/transport/webrtc/rtc-transport.test.d.ts.map +0 -1
  137. package/dist/types/src/transport/webrtc/test-utils.d.ts +0 -5
  138. package/dist/types/src/transport/webrtc/test-utils.d.ts.map +0 -1
  139. package/dist/types/src/transport/webrtc/utils.d.ts +0 -3
  140. package/dist/types/src/transport/webrtc/utils.d.ts.map +0 -1
  141. package/src/tests/tcp-transport.node.test.ts +0 -65
  142. package/src/transport/tcp/index.ts +0 -5
  143. package/src/transport/webrtc/index.ts +0 -7
  144. package/src/transport/webrtc/rtc-connection-factory.ts +0 -82
  145. package/src/transport/webrtc/rtc-peer-connection.ts +0 -472
  146. package/src/transport/webrtc/rtc-transport-channel.test.ts +0 -176
  147. package/src/transport/webrtc/rtc-transport-channel.ts +0 -195
  148. package/src/transport/webrtc/rtc-transport-factory.ts +0 -28
  149. package/src/transport/webrtc/rtc-transport-proxy.test.ts +0 -413
  150. package/src/transport/webrtc/rtc-transport-proxy.ts +0 -264
  151. package/src/transport/webrtc/rtc-transport-service.ts +0 -192
  152. package/src/transport/webrtc/rtc-transport-stats.ts +0 -67
  153. package/src/transport/webrtc/rtc-transport.test.ts +0 -198
  154. package/src/transport/webrtc/test-utils.ts +0 -22
  155. 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 chunk_7ZWQLO5T_exports = {};
30
- __export(chunk_7ZWQLO5T_exports, {
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
- RtcTransportProxy: () => RtcTransportProxy,
42
- RtcTransportProxyFactory: () => RtcTransportProxyFactory,
43
- RtcTransportService: () => RtcTransportService,
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
- createRtcTransportFactory: () => createRtcTransportFactory,
55
+ createLibDataChannelTransportFactory: () => createLibDataChannelTransportFactory,
56
+ createSimplePeerTransportFactory: () => createSimplePeerTransportFactory,
52
57
  createTeleportProtocolFactory: () => createTeleportProtocolFactory
53
58
  });
54
- module.exports = __toCommonJS(chunk_7ZWQLO5T_exports);
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 import_async11 = require("@dxos/async");
125
- var import_invariant11 = require("@dxos/invariant");
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 import_async12 = require("@dxos/async");
131
- var import_context6 = require("@dxos/context");
132
- var import_debug5 = require("@dxos/debug");
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 import_protocols8 = require("@dxos/protocols");
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 import_async13 = require("@dxos/async");
138
- var import_context7 = require("@dxos/context");
143
+ var import_async11 = require("@dxos/async");
144
+ var import_context6 = require("@dxos/context");
139
145
  var import_debug6 = require("@dxos/debug");
140
- var import_invariant13 = require("@dxos/invariant");
141
- var import_keys10 = require("@dxos/keys");
146
+ var import_invariant12 = require("@dxos/invariant");
147
+ var import_keys12 = require("@dxos/keys");
142
148
  var import_log14 = require("@dxos/log");
143
- var import_protocols9 = require("@dxos/protocols");
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: 100
203
+ L: 101
190
204
  });
191
205
  this.connectedTimeoutContext = new import_context.Context(void 0, {
192
206
  F: __dxlog_file,
193
- L: 101
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: 137,
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: 167,
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: 168,
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: 169,
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: 186,
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: 194,
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: 202,
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: 130,
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: 158,
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: 163,
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["WEB_RTC"] = "WEB-RTC";
2967
- TransportKind2["WEB_RTC_PROXY"] = "WEB-RTC_PROXY";
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 BrowserRtcConnectionFactory = class {
2972
- async initialize() {
2973
- }
2974
- async onConnectionDestroyed() {
2975
- }
2976
- async createConnection(config) {
2977
- return new RTCPeerConnection(config);
2978
- }
2979
- async initConnection(connection, info) {
2980
- }
2981
- };
2982
- var NodeRtcConnectionFactory = class _NodeRtcConnectionFactory {
2983
- static {
2984
- this._createdConnections = 0;
2985
- }
2986
- static {
2987
- this._cleanupMutex = new import_async10.Mutex();
2988
- }
2989
- // This should be inside the function to avoid triggering `eval` in the global scope.
2990
- // eslint-disable-next-line no-new-func
2991
- // TODO(burdon): Do imports here?
2992
- async initialize() {
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
- async createConnection(config) {
3002
- return _NodeRtcConnectionFactory._cleanupMutex.executeSynchronized(async () => {
3003
- const { RTCPeerConnection: RTCPeerConnection1 } = await import("#node-datachannel/polyfill");
3004
- _NodeRtcConnectionFactory._createdConnections++;
3005
- return new RTCPeerConnection1(config);
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 initConnection(connection, info) {
3009
- if (info.initiator) {
3010
- connection.onnegotiationneeded?.(null);
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: 0,
3033
- bytesReceived: 0,
3034
- packetsSent: 0,
3035
- packetsReceived: 0,
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
- return {
3040
- bytesSent: stats.dataChannel?.bytesSent,
3041
- bytesReceived: stats.dataChannel?.bytesReceived,
3042
- packetsSent: 0,
3043
- packetsReceived: 0,
3044
- rawStats: stats.raw
3045
- };
3046
- };
3047
- var getRtcConnectionStats = async (connection, channelTopic) => {
3048
- const stats = await connection.getStats();
3049
- const statsEntries = Array.from(stats.entries());
3050
- const transport = statsEntries.find(([_, entry]) => entry.type === "transport")?.[1];
3051
- const selectedCandidatePair = transport && statsEntries.find(([entryId]) => entryId === transport.selectedCandidatePairId)?.[1];
3052
- const remoteCandidate = selectedCandidatePair && statsEntries.find(([entryId]) => entryId === selectedCandidatePair.remoteCandidateId)?.[1];
3053
- const dataChannel = channelTopic && statsEntries.find(([_, entry]) => entry.type === "data-channel" && entry.label === channelTopic)?.[1];
3054
- return {
3055
- transport,
3056
- selectedCandidatePair,
3057
- dataChannel,
3058
- remoteCandidate,
3059
- raw: Object.fromEntries(stats)
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
- onConnectionError(error) {
3080
- if (this.isOpen) {
3081
- this.errors.raise(error);
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 _open() {
3085
- (0, import_invariant12.invariant)(!this._isChannelCreationInProgress, void 0, {
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: 56,
3084
+ L: 122,
3088
3085
  S: this,
3089
- A: [
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
- async _close() {
3111
- if (this._channel) {
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: 86,
3092
+ L: 123,
3120
3093
  S: this,
3121
3094
  C: (f, a) => f(...a)
3122
3095
  });
3123
- }
3124
- _initChannel(channel) {
3125
- Object.assign(channel, {
3126
- onopen: () => {
3127
- if (!this.isOpen) {
3128
- import_log13.log.warn("channel opened in a closed transport", {
3129
- topic: this._options.topic
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: 93,
3152
+ L: 165,
3133
3153
  S: this,
3134
3154
  C: (f, a) => f(...a)
3135
3155
  });
3136
- this._safeCloseChannel(channel);
3137
- return;
3156
+ this.errors.raise(new import_protocols7.UnknownProtocolError("unknown RTCError", err));
3138
3157
  }
3139
- (0, import_log13.log)("onopen", void 0, {
3158
+ } else if ("code" in err) {
3159
+ import_log12.log.info("simple-peer error", err, {
3140
3160
  F: __dxlog_file13,
3141
- L: 98,
3161
+ L: 170,
3142
3162
  S: this,
3143
3163
  C: (f, a) => f(...a)
3144
3164
  });
3145
- const duplex = new import_node_stream2.Duplex({
3146
- read: () => {
3147
- },
3148
- write: (chunk, encoding, callback) => {
3149
- return this._handleChannelWrite(chunk, callback);
3150
- }
3151
- });
3152
- duplex.pipe(this._options.stream).pipe(duplex);
3153
- this._stream = duplex;
3154
- this.connected.emit();
3155
- },
3156
- onclose: async () => {
3157
- (0, import_log13.log)("onclose", void 0, {
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: 111,
3192
+ L: 196,
3160
3193
  S: this,
3161
3194
  C: (f, a) => f(...a)
3162
3195
  });
3163
- await this.close();
3164
- },
3165
- onmessage: (event) => {
3166
- if (!this._stream) {
3167
- import_log13.log.warn("ignoring message on a closed channel", void 0, {
3168
- F: __dxlog_file13,
3169
- L: 117,
3170
- S: this,
3171
- C: (f, a) => f(...a)
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
- onbufferedamountlow: () => {
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: 166,
3215
+ L: 211,
3222
3216
  S: this,
3223
3217
  C: (f, a) => f(...a)
3224
3218
  });
3225
3219
  }
3226
- this._streamDataFlushedCallback = callback;
3227
- } else {
3228
- callback();
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
- _safeCloseChannel(channel) {
3232
- try {
3233
- channel.close();
3234
- } catch (error) {
3235
- import_log13.log.catch(error, void 0, {
3236
- F: __dxlog_file13,
3237
- L: 178,
3238
- S: this,
3239
- C: (f, a) => f(...a)
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
- return this._connection.onSignal(signal);
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
- seenLines.push(line);
3273
- deduplicatedLines.push(line);
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
- return deduplicatedLines;
3276
- };
3277
- function _ts_decorate6(decorators, target, key, desc) {
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
- createTransportChannel(options) {
3333
- const channel = new RtcTransportChannel(this, options);
3334
- this._transportChannels.set(options.topic, channel);
3335
- channel.closed.on(() => {
3336
- this._transportChannels.delete(options.topic);
3337
- if (this._transportChannels.size === 0) {
3338
- this._lockAndCloseConnection();
3339
- }
3340
- });
3341
- return channel;
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
- async _openConnection() {
3344
- if (this._connection) {
3345
- return this._connection;
3346
- }
3347
- (0, import_log12.log)("initializing connection...", () => ({
3348
- remotePeer: this._options.remotePeerKey
3349
- }), {
3350
- F: __dxlog_file14,
3351
- L: 115,
3352
- S: this,
3353
- C: (f, a) => f(...a)
3354
- });
3355
- const config = await this._loadConnectionConfig();
3356
- const connection = await this._factory.createConnection(config);
3357
- const iceCandidateErrors = [];
3358
- Object.assign(connection, {
3359
- onnegotiationneeded: async () => {
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
- // When error occurs while performing ICE negotiations through a STUN or TURN server.
3414
- // It's ok for some candidates to fail if a working pair is eventually found.
3415
- // https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/icecandidateerror_event
3416
- onicecandidateerror: (event) => {
3417
- const { url, errorCode, errorText } = event;
3418
- iceCandidateErrors.push({
3419
- url,
3420
- errorCode,
3421
- errorText
3422
- });
3423
- },
3424
- // When possible error during ICE gathering.
3425
- // https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/iceconnectionstatechange_event
3426
- oniceconnectionstatechange: () => {
3427
- if (connection !== this._connection) {
3428
- this._onConnectionCallbackAfterClose("oniceconnectionstatechange", connection);
3429
- return;
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
- // When new track (or channel) is added.
3444
- // State: { new, connecting, connected, disconnected, failed, closed }
3445
- // https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/connectionstatechange_event
3446
- onconnectionstatechange: () => {
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
- // When channel is added to connection.
3476
- // https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/datachannel_event
3477
- ondatachannel: (event) => {
3478
- (0, import_invariant11.invariant)(!this._initiator, "Initiator is expected to create data channels.", {
3479
- F: __dxlog_file14,
3480
- L: 209,
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
- if (connection !== this._connection) {
3488
- this._onConnectionCallbackAfterClose("ondatachannel", connection);
3489
- return;
3490
- }
3491
- (0, import_log12.log)("ondatachannel", {
3492
- label: event.channel.label
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
- this._dataChannels.set(event.channel.label, event.channel);
3500
- const pendingCallback = this._channelCreatedCallbacks.get(event.channel.label);
3501
- if (pendingCallback) {
3502
- this._channelCreatedCallbacks.delete(event.channel.label);
3503
- pendingCallback.resolve(event.channel);
3504
- }
3505
- }
3506
- });
3507
- this._connection = connection;
3508
- this._readyForCandidates.reset();
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 this._connection;
3355
+ return rpcStream;
3513
3356
  }
3514
- _lockAndAbort(connection, error) {
3515
- this._abortConnection(connection, error);
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
- _abortConnection(connection, error) {
3518
- if (connection !== this._connection) {
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: 255,
3372
+ L: 129,
3545
3373
  S: this,
3546
- C: (f, a) => f(...a)
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
- _lockAndCloseConnection() {
3550
- (0, import_invariant11.invariant)(this._transportChannels.size === 0, void 0, {
3383
+ async getStats({ proxyId }) {
3384
+ (0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
3551
3385
  F: __dxlog_file14,
3552
- L: 260,
3386
+ L: 134,
3553
3387
  S: this,
3554
3388
  A: [
3555
- "this._transportChannels.size === 0",
3389
+ "this.transports.has(proxyId)",
3556
3390
  ""
3557
3391
  ]
3558
3392
  });
3559
- if (this._connection) {
3560
- this._safeCloseConnection();
3561
- (0, import_log12.log)("connection closed", void 0, {
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 onSignal(signal) {
3570
- const connection = this._connection;
3571
- if (!connection) {
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: 271,
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, import_log12.log)("signal processed", void 0, {
3406
+ (0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
3640
3407
  F: __dxlog_file14,
3641
- L: 330,
3408
+ L: 142,
3642
3409
  S: this,
3643
- C: (f, a) => f(...a)
3410
+ A: [
3411
+ "this.transports.has(proxyId)",
3412
+ ""
3413
+ ]
3644
3414
  });
3645
- }
3646
- async _processIceCandidate(connection, candidate) {
3647
- try {
3648
- await this._readyForCandidates.wait();
3649
- if (connection === this._connection) {
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
- _onSessionNegotiated(connection) {
3670
- if (connection === this._connection) {
3671
- (0, import_log12.log)("ready to process ice candidates", void 0, {
3672
- F: __dxlog_file14,
3673
- L: 348,
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: 356,
3431
+ L: 158,
3694
3432
  S: this,
3695
3433
  C: (f, a) => f(...a)
3696
3434
  });
3697
- this._safeCloseConnection(connection);
3698
3435
  }
3699
- _safeCloseConnection(connection = this._connection) {
3700
- const resetFields = this._connection && connection === this._connection;
3701
- try {
3702
- connection?.close();
3703
- } catch (err) {
3704
- import_log12.log.catch(err, void 0, {
3705
- F: __dxlog_file14,
3706
- L: 368,
3707
- S: this,
3708
- C: (f, a) => f(...a)
3709
- });
3710
- }
3711
- if (resetFields) {
3712
- this._connection = void 0;
3713
- this._dataChannels.clear();
3714
- this._readyForCandidates.wake();
3715
- void this._factory.onConnectionDestroyed().catch((err) => import_log12.log.catch(err, void 0, {
3716
- F: __dxlog_file14,
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
- async _loadConnectionConfig() {
3728
- const config = {
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 _sendIceCandidate(candidate) {
3750
- try {
3751
- await this._options.sendSignal({
3752
- payload: {
3753
- data: {
3754
- type: "candidate",
3755
- candidate: {
3756
- candidate: candidate.candidate,
3757
- // These fields never seem to be not null, but connecting to Chrome doesn't work if they are.
3758
- sdpMLineIndex: candidate.sdpMLineIndex ?? "0",
3759
- sdpMid: candidate.sdpMid ?? "0"
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
- } catch (err) {
3765
- import_log12.log.warn("signaling error", {
3766
- err
3767
- }, {
3768
- F: __dxlog_file14,
3769
- L: 411,
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 _sendDescription(connection, description) {
3776
- if (connection !== this._connection) {
3777
- return;
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
- const data = {
3780
- type: description.type,
3781
- sdp: description.sdp
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
- get _connectionInfo() {
3790
- const connectionInfo = this._connection && {
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
- get _loggerContext() {
3809
- return {
3810
- ownPeerKey: this._options.ownPeerKey,
3811
- remotePeerKey: this._options.remotePeerKey,
3812
- initiator: this._initiator,
3813
- channels: this._transportChannels.size
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
- _ts_decorate6([
3818
- import_async11.synchronized
3819
- ], RtcPeerConnection.prototype, "_openConnection", null);
3820
- _ts_decorate6([
3821
- import_async11.synchronized
3822
- ], RtcPeerConnection.prototype, "_lockAndAbort", null);
3823
- _ts_decorate6([
3824
- import_async11.synchronized
3825
- ], RtcPeerConnection.prototype, "_lockAndCloseConnection", null);
3826
- _ts_decorate6([
3827
- import_async11.synchronized
3828
- ], RtcPeerConnection.prototype, "onSignal", null);
3829
- _ts_decorate6([
3830
- import_tracing.trace.info()
3831
- ], RtcPeerConnection.prototype, "_connectionInfo", null);
3832
- _ts_decorate6([
3833
- import_log12.logInfo
3834
- ], RtcPeerConnection.prototype, "_loggerContext", null);
3835
- RtcPeerConnection = _ts_decorate6([
3836
- import_tracing.trace.resource()
3837
- ], RtcPeerConnection);
3838
- var isRemoteDescriptionSet = (connection, data) => {
3839
- if (!connection.remoteDescription?.type || connection.remoteDescription?.type !== data.type) {
3840
- return false;
3841
- }
3842
- return areSdpEqual(connection.remoteDescription.sdp, data.sdp);
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 createIceFailureError = (details) => {
3845
- const candidateErrors = details.map(({ url, errorCode, errorText }) => `${errorCode} ${url}: ${errorText}`);
3846
- return new import_protocols7.ConnectivityError(`ICE failed:
3847
- ${candidateErrors.join("\n")}`);
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
- var createRtcTransportFactory = (webrtcConfig, iceProvider) => {
3850
- const connectionFactory = getRtcConnectionFactory();
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
- const connection = new RtcPeerConnection(connectionFactory, {
3854
- ownPeerKey: options.ownPeerKey,
3855
- remotePeerKey: options.remotePeerKey,
3856
- sendSignal: options.sendSignal,
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 __dxlog_file15 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/webrtc/rtc-transport-proxy.ts";
3865
- var RPC_TIMEOUT = 1e4;
3866
- var CLOSE_RPC_TIMEOUT = 3e3;
3867
- var RESP_MIN_THRESHOLD = 500;
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._proxyId = import_keys10.PublicKey.random();
3873
- this.closed = new import_async13.Event();
3874
- this.connected = new import_async13.Event();
3875
- this.errors = new import_debug6.ErrorStream();
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
- async _open() {
3878
- let stream;
3879
- try {
3880
- stream = this._options.bridgeService.open({
3881
- proxyId: this._proxyId,
3882
- remotePeerKey: this._options.remotePeerKey,
3883
- ownPeerKey: this._options.ownPeerKey,
3884
- topic: this._options.topic,
3885
- initiator: this._options.initiator ?? false
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
- timeout: RPC_TIMEOUT
3724
+ F: __dxlog_file16,
3725
+ L: 93,
3726
+ S: this,
3727
+ C: (f, a) => f(...a)
3888
3728
  });
3889
- } catch (error) {
3890
- this.errors.raise(error);
3891
- return;
3892
- }
3893
- this._serviceStream = stream;
3894
- stream.waitUntilReady().then(() => {
3895
- stream.subscribe(async (event) => {
3896
- (0, import_log14.log)("rtc transport proxy event", event, {
3897
- F: __dxlog_file15,
3898
- L: 66,
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
- if (event.connection) {
3903
- await this._handleConnection(event.connection);
3904
- } else if (event.data) {
3905
- this._handleData(event.data);
3906
- } else if (event.signal) {
3907
- await this._handleSignal(event.signal);
3908
- }
3909
- }, (err) => {
3910
- (0, import_log14.log)("rtc bridge stream closed", {
3911
- err
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: __dxlog_file15,
3914
- L: 76,
3839
+ F: __dxlog_file16,
3840
+ L: 161,
3915
3841
  S: this,
3916
3842
  C: (f, a) => f(...a)
3917
3843
  });
3918
- if (err) {
3919
- this._raiseIfOpen(err);
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 connectorStream = new import_node_stream3.Writable({
3925
- write: (chunk, _, callback) => {
3926
- const sendStartMs = Date.now();
3927
- this._options.bridgeService.sendData({
3928
- proxyId: this._proxyId,
3929
- payload: chunk
3930
- }, {
3931
- timeout: RPC_TIMEOUT
3932
- }).then(() => {
3933
- if (Date.now() - sendStartMs > RESP_MIN_THRESHOLD) {
3934
- (0, import_log14.log)("slow response, delaying callback", void 0, {
3935
- F: __dxlog_file15,
3936
- L: 93,
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
- }, (err) => {
3906
+ this._writeCallback = callback;
3907
+ } else {
3945
3908
  callback();
3946
- this._raiseIfOpen(err);
3947
- });
3909
+ }
3948
3910
  }
3949
3911
  });
3950
- connectorStream.on("error", (err) => {
3951
- this._raiseIfOpen(err);
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._options.stream.pipe(connectorStream);
3954
- }, (error) => {
3955
- if (error) {
3956
- this._raiseIfOpen(error);
3957
- } else {
3958
- void this.close();
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
- import_log14.log.catch(err, void 0, {
3982
- F: __dxlog_file15,
3983
- L: 134,
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
- try {
4033
- const response = await this._options.bridgeService.getDetails({
4034
- proxyId: this._proxyId
4035
- }, {
4036
- timeout: RPC_TIMEOUT
4037
- });
4038
- return response.details;
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
- try {
4045
- const response = await this._options.bridgeService.getStats({
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: "bridge-svc unreachable"
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
- _raiseIfOpen(error) {
4062
- if (this.isOpen) {
4063
- this.errors.raise(error);
4064
- } else {
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._bridgeService",
4105
- "'RtcTransportProxyFactory is not ready to open connections'"
4082
+ "this._peer",
4083
+ "'not open'"
4106
4084
  ]
4107
4085
  });
4108
- const transport = new RtcTransportProxy({
4109
- ...options,
4110
- bridgeService: this._bridgeService
4111
- });
4112
- this._connections.add(transport);
4113
- transport.closed.on(() => this._connections.delete(transport));
4114
- return transport;
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
- var decodeError = (err) => {
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
- var __dxlog_file16 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/webrtc/rtc-transport-service.ts";
4130
- var RtcTransportService = class {
4131
- constructor(webrtcConfig, iceProvider, _transportFactory = createRtcTransportFactory(webrtcConfig, iceProvider)) {
4132
- this._transportFactory = _transportFactory;
4133
- this._openTransports = new import_util10.ComplexMap(import_keys11.PublicKey.hash);
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
- hasOpenTransports() {
4136
- return this._openTransports.size > 0;
4126
+ get isOpen() {
4127
+ return this._connected && !this._closed;
4137
4128
  }
4138
- open(request) {
4139
- const existingTransport = this._openTransports.get(request.proxyId);
4140
- if (existingTransport) {
4141
- import_log15.log.error("requesting a new transport bridge for an existing proxy", void 0, {
4142
- F: __dxlog_file16,
4143
- L: 53,
4144
- S: this,
4145
- C: (f, a) => f(...a)
4146
- });
4147
- void this._safeCloseTransport(existingTransport);
4148
- this._openTransports.delete(request.proxyId);
4149
- }
4150
- return new import_codec_protobuf.Stream(({ ready, next, close }) => {
4151
- const pushNewState = createStateUpdater(next);
4152
- const transportStream = new import_node_stream4.Duplex({
4153
- read: () => {
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
- callback();
4167
- }
4168
- });
4169
- const transport = this._transportFactory.createTransport({
4170
- initiator: request.initiator,
4171
- topic: request.topic,
4172
- ownPeerKey: request.ownPeerKey,
4173
- remotePeerKey: request.remotePeerKey,
4174
- stream: transportStream,
4175
- sendSignal: async (signal) => {
4176
- next({
4177
- signal: {
4178
- payload: signal
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
- const transportState = {
4184
- proxyId: request.proxyId,
4185
- transport,
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
- ready();
4208
- });
4176
+ }
4209
4177
  }
4210
- async sendSignal({ proxyId, signal }) {
4211
- const transport = this._openTransports.get(proxyId);
4212
- (0, import_invariant14.invariant)(transport, void 0, {
4213
- F: __dxlog_file16,
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
- A: [
4217
- "transport",
4218
- ""
4219
- ]
4183
+ C: (f, a) => f(...a)
4220
4184
  });
4221
- await transport.transport.onSignal(signal);
4185
+ this._socket?.destroy();
4186
+ this._server?.close();
4187
+ this._closed = true;
4222
4188
  }
4223
- async getDetails({ proxyId }) {
4224
- const transport = this._openTransports.get(proxyId);
4225
- (0, import_invariant14.invariant)(transport, void 0, {
4226
- F: __dxlog_file16,
4227
- L: 128,
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
- A: [
4230
- "transport",
4231
- ""
4232
- ]
4196
+ C: (f, a) => f(...a)
4233
4197
  });
4234
- return {
4235
- details: await transport.transport.getDetails()
4236
- };
4237
- }
4238
- async getStats({ proxyId }) {
4239
- const transport = this._openTransports.get(proxyId);
4240
- (0, import_invariant14.invariant)(transport, void 0, {
4241
- F: __dxlog_file16,
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
- stats: await transport.transport.getStats()
4218
+ bytesSent: 0,
4219
+ bytesReceived: 0,
4220
+ packetsSent: 0,
4221
+ packetsReceived: 0
4251
4222
  };
4252
4223
  }
4253
- async sendData({ proxyId, payload }) {
4254
- const transport = this._openTransports.get(proxyId);
4255
- (0, import_invariant14.invariant)(transport, void 0, {
4256
- F: __dxlog_file16,
4257
- L: 142,
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
- A: [
4260
- "transport",
4261
- ""
4262
- ]
4232
+ C: (f, a) => f(...a)
4263
4233
  });
4264
- const bufferHasSpace = transport.connectorStream.push(payload);
4265
- if (!bufferHasSpace) {
4266
- await new Promise((resolve) => {
4267
- transport.writeProcessedCallbacks.push(resolve);
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: __dxlog_file16,
4303
- L: 177,
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
- RtcTransportProxy,
4362
- RtcTransportProxyFactory,
4363
- RtcTransportService,
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
- createRtcTransportFactory,
4303
+ createLibDataChannelTransportFactory,
4304
+ createSimplePeerTransportFactory,
4372
4305
  createTeleportProtocolFactory
4373
4306
  });
4374
- //# sourceMappingURL=chunk-7ZWQLO5T.cjs.map
4307
+ //# sourceMappingURL=chunk-4YAYC7WN.cjs.map