@dxos/network-manager 0.3.9-main.14901ff → 0.3.9-main.16d375f

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 (61) hide show
  1. package/dist/lib/browser/{chunk-S2JHWVGQ.mjs → chunk-6B4JGIV2.mjs} +183 -82
  2. package/dist/lib/browser/chunk-6B4JGIV2.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +1 -11
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/browser/testing/index.mjs +3 -3
  6. package/dist/lib/node/{chunk-3SCPMSHV.cjs → chunk-Y2B5BDRH.cjs} +179 -84
  7. package/dist/lib/node/chunk-Y2B5BDRH.cjs.map +7 -0
  8. package/dist/lib/node/index.cjs +27 -36
  9. package/dist/lib/node/index.cjs.map +2 -2
  10. package/dist/lib/node/meta.json +1 -1
  11. package/dist/lib/node/testing/index.cjs +18 -19
  12. package/dist/lib/node/testing/index.cjs.map +1 -1
  13. package/dist/types/src/topology/mmst-topology.d.ts +1 -0
  14. package/dist/types/src/topology/mmst-topology.d.ts.map +1 -1
  15. package/dist/types/src/transport/index.d.ts +0 -1
  16. package/dist/types/src/transport/index.d.ts.map +1 -1
  17. package/dist/types/src/transport/libdatachannel-transport.d.ts +1 -0
  18. package/dist/types/src/transport/libdatachannel-transport.d.ts.map +1 -1
  19. package/dist/types/src/transport/simplepeer-transport.d.ts +3 -0
  20. package/dist/types/src/transport/simplepeer-transport.d.ts.map +1 -1
  21. package/package.json +18 -18
  22. package/src/topology/mmst-topology.ts +34 -6
  23. package/src/transport/index.ts +0 -1
  24. package/src/transport/libdatachannel-transport.test.ts +0 -4
  25. package/src/transport/libdatachannel-transport.ts +76 -34
  26. package/src/transport/simplepeer-transport.ts +7 -5
  27. package/dist/lib/browser/chunk-S2JHWVGQ.mjs.map +0 -7
  28. package/dist/lib/browser/chunk-YERMWDRB.mjs +0 -24
  29. package/dist/lib/browser/chunk-YERMWDRB.mjs.map +0 -7
  30. package/dist/lib/browser/index.browser-O53CPVK3.mjs +0 -14
  31. package/dist/lib/browser/index.browser-O53CPVK3.mjs.map +0 -7
  32. package/dist/lib/node/chunk-3SCPMSHV.cjs.map +0 -7
  33. package/dist/lib/node/chunk-DMWORJG3.cjs +0 -471
  34. package/dist/lib/node/chunk-DMWORJG3.cjs.map +0 -7
  35. package/dist/lib/node/datachannel-ABYQKZRC.cjs +0 -35
  36. package/dist/lib/node/datachannel-ABYQKZRC.cjs.map +0 -7
  37. package/dist/types/src/transport/datachannel/index.browser.d.ts +0 -15
  38. package/dist/types/src/transport/datachannel/index.browser.d.ts.map +0 -1
  39. package/dist/types/src/transport/datachannel/index.d.ts +0 -8
  40. package/dist/types/src/transport/datachannel/index.d.ts.map +0 -1
  41. package/dist/types/src/transport/datachannel/rtc-data-channel.d.ts +0 -29
  42. package/dist/types/src/transport/datachannel/rtc-data-channel.d.ts.map +0 -1
  43. package/dist/types/src/transport/datachannel/rtc-events.d.ts +0 -9
  44. package/dist/types/src/transport/datachannel/rtc-events.d.ts.map +0 -1
  45. package/dist/types/src/transport/datachannel/rtc-ice-candidate.d.ts +0 -22
  46. package/dist/types/src/transport/datachannel/rtc-ice-candidate.d.ts.map +0 -1
  47. package/dist/types/src/transport/datachannel/rtc-peer-connection.d.ts +0 -54
  48. package/dist/types/src/transport/datachannel/rtc-peer-connection.d.ts.map +0 -1
  49. package/dist/types/src/transport/datachannel/rtc-peer-connection.test.d.ts +0 -2
  50. package/dist/types/src/transport/datachannel/rtc-peer-connection.test.d.ts.map +0 -1
  51. package/dist/types/src/transport/datachannel/rtc-session-description.d.ts +0 -10
  52. package/dist/types/src/transport/datachannel/rtc-session-description.d.ts.map +0 -1
  53. package/src/transport/datachannel/README.md +0 -2
  54. package/src/transport/datachannel/index.browser.ts +0 -8
  55. package/src/transport/datachannel/index.ts +0 -17
  56. package/src/transport/datachannel/rtc-data-channel.ts +0 -148
  57. package/src/transport/datachannel/rtc-events.ts +0 -23
  58. package/src/transport/datachannel/rtc-ice-candidate.ts +0 -54
  59. package/src/transport/datachannel/rtc-peer-connection.test.ts +0 -112
  60. package/src/transport/datachannel/rtc-peer-connection.ts +0 -359
  61. package/src/transport/datachannel/rtc-session-description.ts +0 -23
@@ -1,7 +1,18 @@
1
1
  import "@dxos/node-std/globals";
2
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
3
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
4
+ }) : x)(function(x) {
5
+ if (typeof require !== "undefined")
6
+ return require.apply(this, arguments);
7
+ throw Error('Dynamic require of "' + x + '" is not supported');
8
+ });
9
+
10
+ // inject-globals:@inject-globals
2
11
  import {
3
- __require
4
- } from "./chunk-YERMWDRB.mjs";
12
+ global,
13
+ Buffer as Buffer2,
14
+ process
15
+ } from "@dxos/node-std/inject-globals";
5
16
 
6
17
  // packages/core/mesh/network-manager/src/swarm/connection.ts
7
18
  import { DeferredTask, Event, sleep, scheduleTask, scheduleTaskInterval, synchronized } from "@dxos/async";
@@ -2349,9 +2360,12 @@ import distance from "xor-distance";
2349
2360
  import { invariant as invariant8 } from "@dxos/invariant";
2350
2361
  import { log as log8 } from "@dxos/log";
2351
2362
  var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/topology/mmst-topology.ts";
2363
+ var MIN_UPDATE_INTERVAL = 1e3 * 10;
2364
+ var MAX_CHANGES_PER_UPDATE = 1;
2352
2365
  var MMSTTopology = class {
2353
2366
  constructor({ originateConnections = 2, maxPeers = 4, sampleSize = 10 } = {}) {
2354
2367
  this._sampleCollected = false;
2368
+ this._lastAction = /* @__PURE__ */ new Date(0);
2355
2369
  this._originateConnections = originateConnections;
2356
2370
  this._maxPeers = maxPeers;
2357
2371
  this._sampleSize = sampleSize;
@@ -2359,7 +2373,7 @@ var MMSTTopology = class {
2359
2373
  init(controller) {
2360
2374
  invariant8(!this._controller, "Already initialized", {
2361
2375
  F: __dxlog_file9,
2362
- L: 46,
2376
+ L: 51,
2363
2377
  S: this,
2364
2378
  A: [
2365
2379
  "!this._controller",
@@ -2371,7 +2385,7 @@ var MMSTTopology = class {
2371
2385
  update() {
2372
2386
  invariant8(this._controller, "Not initialized", {
2373
2387
  F: __dxlog_file9,
2374
- L: 51,
2388
+ L: 56,
2375
2389
  S: this,
2376
2390
  A: [
2377
2391
  "this._controller",
@@ -2382,7 +2396,7 @@ var MMSTTopology = class {
2382
2396
  if (this._sampleCollected || connected.length > this._maxPeers || candidates.length > 0) {
2383
2397
  log8("Running the algorithm.", void 0, {
2384
2398
  F: __dxlog_file9,
2385
- L: 55,
2399
+ L: 60,
2386
2400
  S: this,
2387
2401
  C: (f, a) => f(...a)
2388
2402
  });
@@ -2393,7 +2407,7 @@ var MMSTTopology = class {
2393
2407
  async onOffer(peer) {
2394
2408
  invariant8(this._controller, "Not initialized", {
2395
2409
  F: __dxlog_file9,
2396
- L: 62,
2410
+ L: 67,
2397
2411
  S: this,
2398
2412
  A: [
2399
2413
  "this._controller",
@@ -2404,7 +2418,7 @@ var MMSTTopology = class {
2404
2418
  const accept = connected.length < this._maxPeers;
2405
2419
  log8(`Offer ${peer} accept=${accept}`, void 0, {
2406
2420
  F: __dxlog_file9,
2407
- L: 65,
2421
+ L: 70,
2408
2422
  S: this,
2409
2423
  C: (f, a) => f(...a)
2410
2424
  });
@@ -2415,7 +2429,7 @@ var MMSTTopology = class {
2415
2429
  _runAlgorithm() {
2416
2430
  invariant8(this._controller, "Not initialized", {
2417
2431
  F: __dxlog_file9,
2418
- L: 74,
2432
+ L: 79,
2419
2433
  S: this,
2420
2434
  A: [
2421
2435
  "this._controller",
@@ -2424,27 +2438,84 @@ var MMSTTopology = class {
2424
2438
  });
2425
2439
  const { connected, candidates, ownPeerId } = this._controller.getState();
2426
2440
  if (connected.length > this._maxPeers) {
2441
+ log8(`disconnect ${connected.length - this._maxPeers} peers.`, void 0, {
2442
+ F: __dxlog_file9,
2443
+ L: 85,
2444
+ S: this,
2445
+ C: (f, a) => f(...a)
2446
+ });
2427
2447
  const sorted = sortByXorDistance(connected, ownPeerId).reverse().slice(0, this._maxPeers - connected.length);
2428
- for (const peer of sorted) {
2429
- log8(`Disconnect ${peer}.`, void 0, {
2448
+ invariant8(sorted.length === 0, void 0, {
2449
+ F: __dxlog_file9,
2450
+ L: 89,
2451
+ S: this,
2452
+ A: [
2453
+ "sorted.length === 0",
2454
+ ""
2455
+ ]
2456
+ });
2457
+ if (sorted.length > MAX_CHANGES_PER_UPDATE) {
2458
+ log8(`want to disconnect ${sorted.length} peers but limited to ${MAX_CHANGES_PER_UPDATE}`, void 0, {
2430
2459
  F: __dxlog_file9,
2431
- L: 83,
2460
+ L: 92,
2461
+ S: this,
2462
+ C: (f, a) => f(...a)
2463
+ });
2464
+ }
2465
+ if (Date.now() - this._lastAction.getTime() > MIN_UPDATE_INTERVAL) {
2466
+ for (const peer of sorted.slice(0, MAX_CHANGES_PER_UPDATE)) {
2467
+ log8(`Disconnect ${peer}.`, void 0, {
2468
+ F: __dxlog_file9,
2469
+ L: 97,
2470
+ S: this,
2471
+ C: (f, a) => f(...a)
2472
+ });
2473
+ this._controller.disconnect(peer);
2474
+ }
2475
+ this._lastAction = /* @__PURE__ */ new Date();
2476
+ } else {
2477
+ log8("rate limited discconnect", void 0, {
2478
+ F: __dxlog_file9,
2479
+ L: 102,
2432
2480
  S: this,
2433
2481
  C: (f, a) => f(...a)
2434
2482
  });
2435
- this._controller.disconnect(peer);
2436
2483
  }
2437
2484
  } else if (connected.length < this._originateConnections) {
2485
+ log8(`connect ${this._originateConnections - connected.length} peers.`, void 0, {
2486
+ F: __dxlog_file9,
2487
+ L: 106,
2488
+ S: this,
2489
+ C: (f, a) => f(...a)
2490
+ });
2438
2491
  const sample = candidates.sort(() => Math.random() - 0.5).slice(0, this._sampleSize);
2439
2492
  const sorted = sortByXorDistance(sample, ownPeerId).slice(0, this._originateConnections - connected.length);
2440
- for (const peer of sorted) {
2441
- log8(`Connect ${peer}.`, void 0, {
2493
+ if (sorted.length > MAX_CHANGES_PER_UPDATE) {
2494
+ log8(`want to connect ${sorted.length} peers but limited to ${MAX_CHANGES_PER_UPDATE}`, void 0, {
2442
2495
  F: __dxlog_file9,
2443
- L: 91,
2496
+ L: 111,
2497
+ S: this,
2498
+ C: (f, a) => f(...a)
2499
+ });
2500
+ }
2501
+ if (Date.now() - this._lastAction.getTime() > MIN_UPDATE_INTERVAL) {
2502
+ for (const peer of sorted.slice(0, MAX_CHANGES_PER_UPDATE)) {
2503
+ log8(`Connect ${peer}.`, void 0, {
2504
+ F: __dxlog_file9,
2505
+ L: 115,
2506
+ S: this,
2507
+ C: (f, a) => f(...a)
2508
+ });
2509
+ this._controller.connect(peer);
2510
+ }
2511
+ this._lastAction = /* @__PURE__ */ new Date();
2512
+ } else {
2513
+ log8("rate limited connect", void 0, {
2514
+ F: __dxlog_file9,
2515
+ L: 120,
2444
2516
  S: this,
2445
2517
  C: (f, a) => f(...a)
2446
2518
  });
2447
- this._controller.connect(peer);
2448
2519
  }
2449
2520
  }
2450
2521
  }
@@ -2779,6 +2850,9 @@ try {
2779
2850
  // packages/core/mesh/network-manager/src/transport/simplepeer-transport.ts
2780
2851
  var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/simplepeer-transport.ts";
2781
2852
  var SimplePeerTransport = class {
2853
+ /**
2854
+ * @params opts.config formatted as per https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/RTCPeerConnection
2855
+ */
2782
2856
  constructor(params) {
2783
2857
  this.params = params;
2784
2858
  this._closed = false;
@@ -2791,13 +2865,13 @@ var SimplePeerTransport = class {
2791
2865
  id: this._instanceId
2792
2866
  }), {
2793
2867
  F: __dxlog_file12,
2794
- L: 41,
2868
+ L: 44,
2795
2869
  S: this,
2796
2870
  C: (f, a) => f(...a)
2797
2871
  });
2798
2872
  log11("created connection", params, {
2799
2873
  F: __dxlog_file12,
2800
- L: 42,
2874
+ L: 45,
2801
2875
  S: this,
2802
2876
  C: (f, a) => f(...a)
2803
2877
  });
@@ -2810,7 +2884,7 @@ var SimplePeerTransport = class {
2810
2884
  this._peer.on("signal", async (data) => {
2811
2885
  log11("signal", data, {
2812
2886
  F: __dxlog_file12,
2813
- L: 51,
2887
+ L: 54,
2814
2888
  S: this,
2815
2889
  C: (f, a) => f(...a)
2816
2890
  });
@@ -2823,7 +2897,7 @@ var SimplePeerTransport = class {
2823
2897
  this._peer.on("connect", () => {
2824
2898
  log11("connected", void 0, {
2825
2899
  F: __dxlog_file12,
2826
- L: 56,
2900
+ L: 59,
2827
2901
  S: this,
2828
2902
  C: (f, a) => f(...a)
2829
2903
  });
@@ -2834,7 +2908,7 @@ var SimplePeerTransport = class {
2834
2908
  this._peer.on("close", async () => {
2835
2909
  log11("closed", void 0, {
2836
2910
  F: __dxlog_file12,
2837
- L: 63,
2911
+ L: 66,
2838
2912
  S: this,
2839
2913
  C: (f, a) => f(...a)
2840
2914
  });
@@ -2849,7 +2923,7 @@ var SimplePeerTransport = class {
2849
2923
  err
2850
2924
  }, {
2851
2925
  F: __dxlog_file12,
2852
- L: 74,
2926
+ L: 77,
2853
2927
  S: this,
2854
2928
  C: (f, a) => f(...a)
2855
2929
  });
@@ -2858,7 +2932,7 @@ var SimplePeerTransport = class {
2858
2932
  } else if ("code" in err) {
2859
2933
  log11.info("simple-peer error", err, {
2860
2934
  F: __dxlog_file12,
2861
- L: 79,
2935
+ L: 82,
2862
2936
  S: this,
2863
2937
  C: (f, a) => f(...a)
2864
2938
  });
@@ -2888,7 +2962,7 @@ var SimplePeerTransport = class {
2888
2962
  } else {
2889
2963
  log11.info("unknown peer connection error", err, {
2890
2964
  F: __dxlog_file12,
2891
- L: 105,
2965
+ L: 108,
2892
2966
  S: this,
2893
2967
  C: (f, a) => f(...a)
2894
2968
  });
@@ -2902,7 +2976,7 @@ var SimplePeerTransport = class {
2902
2976
  stats: Object.fromEntries(stats.entries())
2903
2977
  }, {
2904
2978
  F: __dxlog_file12,
2905
- L: 113,
2979
+ L: 116,
2906
2980
  S: this,
2907
2981
  C: (f, a) => f(...a)
2908
2982
  });
@@ -2911,7 +2985,7 @@ var SimplePeerTransport = class {
2911
2985
  } catch (err2) {
2912
2986
  log11.catch(err2, void 0, {
2913
2987
  F: __dxlog_file12,
2914
- L: 120,
2988
+ L: 123,
2915
2989
  S: this,
2916
2990
  C: (f, a) => f(...a)
2917
2991
  });
@@ -2922,7 +2996,7 @@ var SimplePeerTransport = class {
2922
2996
  id: this._instanceId
2923
2997
  }), {
2924
2998
  F: __dxlog_file12,
2925
- L: 126,
2999
+ L: 129,
2926
3000
  S: this,
2927
3001
  C: (f, a) => f(...a)
2928
3002
  });
@@ -2941,8 +3015,8 @@ var SimplePeerTransport = class {
2941
3015
  return {
2942
3016
  bytesSent: stats.transport.bytesSent,
2943
3017
  bytesReceived: stats.transport.bytesReceived,
2944
- packetsSent: stats.transport.messagesSent,
2945
- packetsReceived: stats.transport.messagesReceived,
3018
+ packetsSent: stats.transport.packetsSent,
3019
+ packetsReceived: stats.transport.packetsReceived,
2946
3020
  rawStats: stats.raw
2947
3021
  };
2948
3022
  }
@@ -2975,29 +3049,28 @@ var SimplePeerTransport = class {
2975
3049
  if (!rc) {
2976
3050
  return "unavailable";
2977
3051
  }
2978
- if (rc.relay) {
2979
- return `${rc.ip}:${rc.port}/${rc.protocol} relay for XXX ${rc.candidateType}`;
3052
+ if (rc.candidateType === "relay") {
3053
+ return `${rc.ip}:${rc.port}/${rc.protocol} relay for ${rc.relatedAddress}:${rc.relatedPort}`;
2980
3054
  }
2981
3055
  return `${rc.ip}:${rc.port}/${rc.protocol} ${rc.candidateType}`;
2982
3056
  }
2983
3057
  async destroy() {
2984
3058
  log11("closing...", void 0, {
2985
3059
  F: __dxlog_file12,
2986
- L: 189,
3060
+ L: 192,
2987
3061
  S: this,
2988
3062
  C: (f, a) => f(...a)
2989
3063
  });
2990
3064
  if (this._closed) {
2991
3065
  return;
2992
3066
  }
2993
- this._closed = true;
2994
3067
  this._disconnectStreams();
2995
3068
  this._peer.destroy();
2996
3069
  this._closed = true;
2997
3070
  this.closed.emit();
2998
3071
  log11("closed", void 0, {
2999
3072
  F: __dxlog_file12,
3000
- L: 198,
3073
+ L: 200,
3001
3074
  S: this,
3002
3075
  C: (f, a) => f(...a)
3003
3076
  });
@@ -3445,17 +3518,24 @@ var LibDataChannelTransport = class {
3445
3518
  this._readyForCandidates = new Trigger2();
3446
3519
  this._writeCallback = null;
3447
3520
  this._peer = (async () => {
3448
- const { RTCPeerConnection: PeerConnection } = await import("./index.browser-O53CPVK3.mjs");
3521
+ const { RTCPeerConnection } = (await importESM("node-datachannel/polyfill")).default;
3449
3522
  if (this._closed) {
3450
3523
  this.errors.raise(new Error("connection already closed"));
3451
3524
  }
3452
- const peer = new PeerConnection(params.webrtcConfig);
3525
+ if (params.webrtcConfig) {
3526
+ params.webrtcConfig.iceServers = params.webrtcConfig.iceServers ?? [];
3527
+ } else {
3528
+ params.webrtcConfig = {
3529
+ iceServers: []
3530
+ };
3531
+ }
3532
+ const peer = new RTCPeerConnection(params.webrtcConfig);
3453
3533
  peer.onicecandidateerror = (event) => {
3454
3534
  log14.error("peer.onicecandidateerror", {
3455
3535
  event
3456
3536
  }, {
3457
3537
  F: __dxlog_file15,
3458
- L: 53,
3538
+ L: 61,
3459
3539
  S: this,
3460
3540
  C: (f, a) => f(...a)
3461
3541
  });
@@ -3467,7 +3547,7 @@ var LibDataChannelTransport = class {
3467
3547
  transportConnectionState: this._connected
3468
3548
  }, {
3469
3549
  F: __dxlog_file15,
3470
- L: 57,
3550
+ L: 65,
3471
3551
  S: this,
3472
3552
  C: (f, a) => f(...a)
3473
3553
  });
@@ -3477,7 +3557,7 @@ var LibDataChannelTransport = class {
3477
3557
  event
3478
3558
  }, {
3479
3559
  F: __dxlog_file15,
3480
- L: 66,
3560
+ L: 74,
3481
3561
  S: this,
3482
3562
  C: (f, a) => f(...a)
3483
3563
  });
@@ -3501,7 +3581,7 @@ var LibDataChannelTransport = class {
3501
3581
  err
3502
3582
  }, {
3503
3583
  F: __dxlog_file15,
3504
- L: 83,
3584
+ L: 91,
3505
3585
  S: this,
3506
3586
  C: (f, a) => f(...a)
3507
3587
  });
@@ -3510,12 +3590,15 @@ var LibDataChannelTransport = class {
3510
3590
  };
3511
3591
  if (params.initiator) {
3512
3592
  peer.createOffer().then(async (offer) => {
3593
+ if (this._closed) {
3594
+ return;
3595
+ }
3513
3596
  if (peer.connectionState !== "connecting") {
3514
3597
  log14.error("i am initiator but peer not in state connecting", {
3515
3598
  peer
3516
3599
  }, {
3517
3600
  F: __dxlog_file15,
3518
- L: 92,
3601
+ L: 104,
3519
3602
  S: this,
3520
3603
  C: (f, a) => f(...a)
3521
3604
  });
@@ -3525,7 +3608,7 @@ var LibDataChannelTransport = class {
3525
3608
  offer
3526
3609
  }, {
3527
3610
  F: __dxlog_file15,
3528
- L: 95,
3611
+ L: 107,
3529
3612
  S: this,
3530
3613
  C: (f, a) => f(...a)
3531
3614
  });
@@ -3545,7 +3628,7 @@ var LibDataChannelTransport = class {
3545
3628
  this.handleChannel(peer.createDataChannel(DATACHANNEL_LABEL));
3546
3629
  log14.debug("created data channel", void 0, {
3547
3630
  F: __dxlog_file15,
3548
- L: 104,
3631
+ L: 116,
3549
3632
  S: this,
3550
3633
  C: (f, a) => f(...a)
3551
3634
  });
@@ -3558,7 +3641,7 @@ var LibDataChannelTransport = class {
3558
3641
  event
3559
3642
  }, {
3560
3643
  F: __dxlog_file15,
3561
- L: 110,
3644
+ L: 122,
3562
3645
  S: this,
3563
3646
  C: (f, a) => f(...a)
3564
3647
  });
@@ -3576,7 +3659,7 @@ var LibDataChannelTransport = class {
3576
3659
  this._channel.onopen = () => {
3577
3660
  log14.debug("dataChannel.onopen", void 0, {
3578
3661
  F: __dxlog_file15,
3579
- L: 126,
3662
+ L: 138,
3580
3663
  S: this,
3581
3664
  C: (f, a) => f(...a)
3582
3665
  });
@@ -3597,7 +3680,7 @@ var LibDataChannelTransport = class {
3597
3680
  if (this._writeCallback !== null) {
3598
3681
  log14.error("consumer trying to write before we're ready for more data", void 0, {
3599
3682
  F: __dxlog_file15,
3600
- L: 143,
3683
+ L: 155,
3601
3684
  S: this,
3602
3685
  C: (f, a) => f(...a)
3603
3686
  });
@@ -3622,7 +3705,7 @@ var LibDataChannelTransport = class {
3622
3705
  err
3623
3706
  }, {
3624
3707
  F: __dxlog_file15,
3625
- L: 163,
3708
+ L: 175,
3626
3709
  S: this,
3627
3710
  C: (f, a) => f(...a)
3628
3711
  });
@@ -3631,7 +3714,7 @@ var LibDataChannelTransport = class {
3631
3714
  this._channel.onmessage = (event) => {
3632
3715
  let data = event.data;
3633
3716
  if (data instanceof ArrayBuffer) {
3634
- data = Buffer.from(data);
3717
+ data = Buffer2.from(data);
3635
3718
  }
3636
3719
  this._stream.push(data);
3637
3720
  };
@@ -3646,6 +3729,12 @@ var LibDataChannelTransport = class {
3646
3729
  return;
3647
3730
  }
3648
3731
  await this._disconnectStreams();
3732
+ const peer = await this._peer;
3733
+ try {
3734
+ peer.close();
3735
+ } catch (err) {
3736
+ this.errors.raise(err);
3737
+ }
3649
3738
  this._closed = true;
3650
3739
  this.closed.emit();
3651
3740
  }
@@ -3659,7 +3748,7 @@ var LibDataChannelTransport = class {
3659
3748
  peer
3660
3749
  }, {
3661
3750
  F: __dxlog_file15,
3662
- L: 198,
3751
+ L: 216,
3663
3752
  S: this,
3664
3753
  C: (f, a) => f(...a)
3665
3754
  });
@@ -3687,7 +3776,7 @@ var LibDataChannelTransport = class {
3687
3776
  err
3688
3777
  }, {
3689
3778
  F: __dxlog_file15,
3690
- L: 209,
3779
+ L: 227,
3691
3780
  S: this,
3692
3781
  C: (f, a) => f(...a)
3693
3782
  });
@@ -3707,7 +3796,7 @@ var LibDataChannelTransport = class {
3707
3796
  err
3708
3797
  }, {
3709
3798
  F: __dxlog_file15,
3710
- L: 220,
3799
+ L: 238,
3711
3800
  S: this,
3712
3801
  C: (f, a) => f(...a)
3713
3802
  });
@@ -3726,7 +3815,7 @@ var LibDataChannelTransport = class {
3726
3815
  signal
3727
3816
  }, {
3728
3817
  F: __dxlog_file15,
3729
- L: 231,
3818
+ L: 249,
3730
3819
  S: this,
3731
3820
  C: (f, a) => f(...a)
3732
3821
  });
@@ -3735,51 +3824,61 @@ var LibDataChannelTransport = class {
3735
3824
  }).catch((err) => {
3736
3825
  log14.catch(err, void 0, {
3737
3826
  F: __dxlog_file15,
3738
- L: 236,
3827
+ L: 254,
3739
3828
  S: this,
3740
3829
  C: (f, a) => f(...a)
3741
3830
  });
3742
3831
  });
3743
3832
  }
3744
3833
  async getDetails() {
3834
+ const stats = await this._getStats();
3835
+ const rc = stats?.remoteCandidate;
3836
+ if (!rc) {
3837
+ return "unavailable";
3838
+ }
3839
+ if (rc.candidateType === "relay") {
3840
+ return `${rc.ip}:${rc.port} relay for ${rc.relatedAddress}:${rc.relatedPort}`;
3841
+ }
3842
+ return `${rc.ip}:${rc.port} ${rc.candidateType}`;
3843
+ }
3844
+ async _getStats() {
3745
3845
  return this._peer.then(async (peer) => {
3746
- const cp = await peer.getSelectedCandidatePair();
3747
- if (!cp) {
3748
- return "unavailable";
3846
+ const stats = await peer.getStats();
3847
+ const statsEntries = Array.from(stats.entries());
3848
+ const transport = statsEntries.filter((s) => s[1].type === "transport")[0][1];
3849
+ const candidatePair = statsEntries.filter((s) => s[0] === transport.selectedCandidatePairId);
3850
+ let selectedCandidatePair;
3851
+ let remoteCandidate;
3852
+ if (candidatePair.length > 0) {
3853
+ selectedCandidatePair = candidatePair[0][1];
3854
+ remoteCandidate = statsEntries.filter((s) => s[0] === selectedCandidatePair.remoteCandidateId)[0][1];
3749
3855
  }
3750
- return `${cp.remote.address}:${cp.remote.port}/${cp.remote.transportType} ${cp.remote.type}`;
3751
- }).catch((err) => {
3752
- log14.catch(err, void 0, {
3753
- F: __dxlog_file15,
3754
- L: 250,
3755
- S: this,
3756
- C: (f, a) => f(...a)
3757
- });
3758
- return "unavailable";
3856
+ return {
3857
+ transport,
3858
+ selectedCandidatePair,
3859
+ remoteCandidate,
3860
+ raw: Object.fromEntries(stats)
3861
+ };
3759
3862
  });
3760
3863
  }
3761
3864
  async getStats() {
3762
- return this._peer.then((peer) => {
3763
- return {
3764
- bytesSent: peer.bytesSent(),
3765
- bytesReceived: peer.bytesReceived(),
3766
- packetsSent: 0,
3767
- packetsReceived: 0
3768
- };
3769
- }).catch((err) => {
3770
- log14.catch(err, void 0, {
3771
- F: __dxlog_file15,
3772
- L: 266,
3773
- S: this,
3774
- C: (f, a) => f(...a)
3775
- });
3865
+ const stats = await this._getStats();
3866
+ if (!stats) {
3776
3867
  return {
3777
3868
  bytesSent: 0,
3778
3869
  bytesReceived: 0,
3779
3870
  packetsSent: 0,
3780
- packetsReceived: 0
3871
+ packetsReceived: 0,
3872
+ rawStats: {}
3781
3873
  };
3782
- });
3874
+ }
3875
+ return {
3876
+ bytesSent: stats.transport.bytesSent,
3877
+ bytesReceived: stats.transport.bytesReceived,
3878
+ packetsSent: 0,
3879
+ packetsReceived: 0,
3880
+ rawStats: stats.raw
3881
+ };
3783
3882
  }
3784
3883
  // TODO(nf): add classmethod to call node-datachannel.cleanup() when all instances have been destroyed?
3785
3884
  async destroy() {
@@ -3798,6 +3897,7 @@ var createLibDataChannelTransportFactory = (webrtcConfig) => ({
3798
3897
  webrtcConfig
3799
3898
  })
3800
3899
  });
3900
+ var importESM = Function("path", "return import(path)");
3801
3901
 
3802
3902
  // packages/core/mesh/network-manager/src/transport/tcp-transport.browser.ts
3803
3903
  import { Event as Event11 } from "@dxos/async";
@@ -3847,6 +3947,7 @@ var createTeleportProtocolFactory = (onConnection) => {
3847
3947
  };
3848
3948
 
3849
3949
  export {
3950
+ process,
3850
3951
  ConnectionState,
3851
3952
  Connection,
3852
3953
  SwarmMessenger,
@@ -3874,4 +3975,4 @@ export {
3874
3975
  TcpTransport,
3875
3976
  createTeleportProtocolFactory
3876
3977
  };
3877
- //# sourceMappingURL=chunk-S2JHWVGQ.mjs.map
3978
+ //# sourceMappingURL=chunk-6B4JGIV2.mjs.map