@dxos/network-manager 0.3.9-main.3a0f16f → 0.3.9-main.4e30508

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 (58) hide show
  1. package/dist/lib/browser/{chunk-4HITD6WI.mjs → chunk-J7KS7JMZ.mjs} +325 -87
  2. package/dist/lib/browser/chunk-J7KS7JMZ.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +1 -1
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/browser/testing/index.mjs +1 -1
  6. package/dist/lib/node/{chunk-6AD7QA4X.cjs → chunk-55WTPQV5.cjs} +334 -86
  7. package/dist/lib/node/chunk-55WTPQV5.cjs.map +7 -0
  8. package/dist/lib/node/{chunk-XE5JOIGD.cjs → chunk-JDKM4UPJ.cjs} +21 -13
  9. package/dist/lib/node/chunk-JDKM4UPJ.cjs.map +7 -0
  10. package/dist/lib/node/{datachannel-53JZPGFA.cjs → datachannel-3VTTIMR5.cjs} +9 -9
  11. package/dist/lib/node/{datachannel-53JZPGFA.cjs.map → datachannel-3VTTIMR5.cjs.map} +2 -2
  12. package/dist/lib/node/index.cjs +32 -32
  13. package/dist/lib/node/index.cjs.map +1 -1
  14. package/dist/lib/node/meta.json +1 -1
  15. package/dist/lib/node/testing/index.cjs +19 -19
  16. package/dist/types/src/connection-log.d.ts.map +1 -1
  17. package/dist/types/src/swarm/connection.d.ts +4 -1
  18. package/dist/types/src/swarm/connection.d.ts.map +1 -1
  19. package/dist/types/src/topology/mmst-topology.d.ts +1 -0
  20. package/dist/types/src/topology/mmst-topology.d.ts.map +1 -1
  21. package/dist/types/src/transport/datachannel/rtc-peer-connection.d.ts +7 -0
  22. package/dist/types/src/transport/datachannel/rtc-peer-connection.d.ts.map +1 -1
  23. package/dist/types/src/transport/libdatachannel-transport.d.ts +3 -1
  24. package/dist/types/src/transport/libdatachannel-transport.d.ts.map +1 -1
  25. package/dist/types/src/transport/memory-transport.d.ts +3 -1
  26. package/dist/types/src/transport/memory-transport.d.ts.map +1 -1
  27. package/dist/types/src/transport/simplepeer-transport-proxy.d.ts +3 -1
  28. package/dist/types/src/transport/simplepeer-transport-proxy.d.ts.map +1 -1
  29. package/dist/types/src/transport/simplepeer-transport-service.d.ts +3 -1
  30. package/dist/types/src/transport/simplepeer-transport-service.d.ts.map +1 -1
  31. package/dist/types/src/transport/simplepeer-transport.d.ts +7 -1
  32. package/dist/types/src/transport/simplepeer-transport.d.ts.map +1 -1
  33. package/dist/types/src/transport/tcp-transport.browser.d.ts +3 -1
  34. package/dist/types/src/transport/tcp-transport.browser.d.ts.map +1 -1
  35. package/dist/types/src/transport/tcp-transport.d.ts +3 -1
  36. package/dist/types/src/transport/tcp-transport.d.ts.map +1 -1
  37. package/dist/types/src/transport/transport.d.ts +17 -0
  38. package/dist/types/src/transport/transport.d.ts.map +1 -1
  39. package/dist/types/src/wire-protocol.d.ts +1 -1
  40. package/dist/types/src/wire-protocol.d.ts.map +1 -1
  41. package/package.json +17 -17
  42. package/src/connection-log.ts +14 -1
  43. package/src/swarm/connection.ts +23 -4
  44. package/src/topology/mmst-topology.ts +35 -7
  45. package/src/transport/datachannel/rtc-peer-connection.ts +20 -12
  46. package/src/transport/libdatachannel-transport.test.ts +0 -4
  47. package/src/transport/libdatachannel-transport.ts +37 -1
  48. package/src/transport/memory-transport.ts +14 -1
  49. package/src/transport/simplepeer-transport-proxy.ts +9 -1
  50. package/src/transport/simplepeer-transport-service.ts +14 -0
  51. package/src/transport/simplepeer-transport.ts +66 -2
  52. package/src/transport/tcp-transport.browser.ts +9 -1
  53. package/src/transport/tcp-transport.ts +19 -1
  54. package/src/transport/transport.ts +19 -0
  55. package/src/wire-protocol.ts +3 -3
  56. package/dist/lib/browser/chunk-4HITD6WI.mjs.map +0 -7
  57. package/dist/lib/node/chunk-6AD7QA4X.cjs.map +0 -7
  58. package/dist/lib/node/chunk-XE5JOIGD.cjs.map +0 -7
@@ -26,8 +26,8 @@ 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_6AD7QA4X_exports = {};
30
- __export(chunk_6AD7QA4X_exports, {
29
+ var chunk_55WTPQV5_exports = {};
30
+ __export(chunk_55WTPQV5_exports, {
31
31
  Connection: () => Connection,
32
32
  ConnectionLimiter: () => ConnectionLimiter,
33
33
  ConnectionLog: () => ConnectionLog,
@@ -55,8 +55,8 @@ __export(chunk_6AD7QA4X_exports, {
55
55
  createSimplePeerTransportFactory: () => createSimplePeerTransportFactory,
56
56
  createTeleportProtocolFactory: () => createTeleportProtocolFactory
57
57
  });
58
- module.exports = __toCommonJS(chunk_6AD7QA4X_exports);
59
- var import_chunk_XE5JOIGD = require("./chunk-XE5JOIGD.cjs");
58
+ module.exports = __toCommonJS(chunk_55WTPQV5_exports);
59
+ var import_chunk_JDKM4UPJ = require("./chunk-JDKM4UPJ.cjs");
60
60
  var import_async = require("@dxos/async");
61
61
  var import_context = require("@dxos/context");
62
62
  var import_debug = require("@dxos/debug");
@@ -166,6 +166,7 @@ function _ts_decorate(decorators, target, key, desc) {
166
166
  var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/connection.ts";
167
167
  var STARTING_SIGNALLING_DELAY = 10;
168
168
  var TRANSPORT_CONNECTION_TIMEOUT = 1e4;
169
+ var TRANSPORT_STATS_INTERVAL = 5e3;
169
170
  var MAX_SIGNALLING_DELAY = 300;
170
171
  var ConnectionState;
171
172
  (function(ConnectionState5) {
@@ -228,6 +229,7 @@ var Connection = class {
228
229
  this.stateChanged = new import_async.Event();
229
230
  this.errors = new import_debug.ErrorStream();
230
231
  this._instanceId = import_keys.PublicKey.random().toHex();
232
+ this.transportStats = new import_async.Event();
231
233
  this._signalSendTask = new import_async.DeferredTask(this._ctx, async () => {
232
234
  await this._flushSignalBuffer();
233
235
  });
@@ -240,11 +242,14 @@ var Connection = class {
240
242
  initiator: this.initiator
241
243
  }, {
242
244
  F: __dxlog_file,
243
- L: 130,
245
+ L: 134,
244
246
  S: this,
245
247
  C: (f, a) => f(...a)
246
248
  });
247
249
  }
250
+ get sessionIdString() {
251
+ return this.sessionId.truncate();
252
+ }
248
253
  get state() {
249
254
  return this._state;
250
255
  }
@@ -260,7 +265,7 @@ var Connection = class {
260
265
  async openConnection() {
261
266
  (0, import_invariant.invariant)(this._state === ConnectionState.INITIAL, "Invalid state.", {
262
267
  F: __dxlog_file,
263
- L: 155,
268
+ L: 164,
264
269
  S: this,
265
270
  A: [
266
271
  "this._state === ConnectionState.INITIAL",
@@ -271,7 +276,7 @@ var Connection = class {
271
276
  id: this._instanceId
272
277
  }), {
273
278
  F: __dxlog_file,
274
- L: 156,
279
+ L: 165,
275
280
  S: this,
276
281
  C: (f, a) => f(...a)
277
282
  });
@@ -283,18 +288,18 @@ var Connection = class {
283
288
  initiator: this.initiator
284
289
  }, {
285
290
  F: __dxlog_file,
286
- L: 157,
291
+ L: 166,
287
292
  S: this,
288
293
  C: (f, a) => f(...a)
289
294
  });
290
295
  this._changeState(ConnectionState.CONNECTING);
291
- this._protocol.open().catch((err) => {
296
+ this._protocol.open(this.sessionId).catch((err) => {
292
297
  this.errors.raise(err);
293
298
  });
294
299
  this._protocol.stream.on("close", () => {
295
300
  (0, import_log.log)("protocol stream closed", void 0, {
296
301
  F: __dxlog_file,
297
- L: 174,
302
+ L: 183,
298
303
  S: this,
299
304
  C: (f, a) => f(...a)
300
305
  });
@@ -303,7 +308,7 @@ var Connection = class {
303
308
  (0, import_async.scheduleTask)(this.connectedTimeoutContext, async () => {
304
309
  import_log.log.info(`timeout waiting ${TRANSPORT_CONNECTION_TIMEOUT / 1e3}s for transport to connect, aborting`, void 0, {
305
310
  F: __dxlog_file,
306
- L: 181,
311
+ L: 190,
307
312
  S: this,
308
313
  C: (f, a) => f(...a)
309
314
  });
@@ -311,7 +316,7 @@ var Connection = class {
311
316
  }, TRANSPORT_CONNECTION_TIMEOUT);
312
317
  (0, import_invariant.invariant)(!this._transport, void 0, {
313
318
  F: __dxlog_file,
314
- L: 189,
319
+ L: 198,
315
320
  S: this,
316
321
  A: [
317
322
  "!this._transport",
@@ -321,18 +326,20 @@ var Connection = class {
321
326
  this._transport = this._transportFactory.createTransport({
322
327
  initiator: this.initiator,
323
328
  stream: this._protocol.stream,
324
- sendSignal: async (signal) => this._sendSignal(signal)
329
+ sendSignal: async (signal) => this._sendSignal(signal),
330
+ sessionId: this.sessionId
325
331
  });
326
332
  this._transport.connected.once(async () => {
327
333
  this._changeState(ConnectionState.CONNECTED);
328
334
  await this.connectedTimeoutContext.dispose();
329
335
  this._callbacks?.onConnected?.();
336
+ (0, import_async.scheduleTaskInterval)(this._ctx, async () => this._emitTransportStats(), TRANSPORT_STATS_INTERVAL);
330
337
  });
331
338
  this._transport.closed.once(() => {
332
339
  this._transport = void 0;
333
340
  (0, import_log.log)("abort triggered by transport close", void 0, {
334
341
  F: __dxlog_file,
335
- L: 204,
342
+ L: 216,
336
343
  S: this,
337
344
  C: (f, a) => f(...a)
338
345
  });
@@ -343,7 +350,7 @@ var Connection = class {
343
350
  err
344
351
  }, {
345
352
  F: __dxlog_file,
346
- L: 209,
353
+ L: 221,
347
354
  S: this,
348
355
  C: (f, a) => f(...a)
349
356
  });
@@ -353,7 +360,7 @@ var Connection = class {
353
360
  if (err instanceof import_protocols.ConnectionResetError) {
354
361
  import_log.log.info("aborting due to transport ConnectionResetError", void 0, {
355
362
  F: __dxlog_file,
356
- L: 216,
363
+ L: 228,
357
364
  S: this,
358
365
  C: (f, a) => f(...a)
359
366
  });
@@ -361,7 +368,7 @@ var Connection = class {
361
368
  } else if (err instanceof import_protocols.ConnectivityError) {
362
369
  import_log.log.info("aborting due to transport ConnectivityError", void 0, {
363
370
  F: __dxlog_file,
364
- L: 219,
371
+ L: 231,
365
372
  S: this,
366
373
  C: (f, a) => f(...a)
367
374
  });
@@ -371,7 +378,7 @@ var Connection = class {
371
378
  err
372
379
  }, {
373
380
  F: __dxlog_file,
374
- L: 222,
381
+ L: 234,
375
382
  S: this,
376
383
  C: (f, a) => f(...a)
377
384
  });
@@ -389,7 +396,7 @@ var Connection = class {
389
396
  id: this._instanceId
390
397
  }), {
391
398
  F: __dxlog_file,
392
- L: 238,
399
+ L: 250,
393
400
  S: this,
394
401
  C: (f, a) => f(...a)
395
402
  });
@@ -399,14 +406,14 @@ var Connection = class {
399
406
  err
400
407
  }, {
401
408
  F: __dxlog_file,
402
- L: 245,
409
+ L: 257,
403
410
  S: this,
404
411
  C: (f, a) => f(...a)
405
412
  });
406
413
  if (this._state === ConnectionState.CLOSED || this._state === ConnectionState.ABORTED) {
407
414
  (0, import_log.log)(`abort ignored: already ${this._state}`, this.closeReason, {
408
415
  F: __dxlog_file,
409
- L: 247,
416
+ L: 259,
410
417
  S: this,
411
418
  C: (f, a) => f(...a)
412
419
  });
@@ -421,7 +428,7 @@ var Connection = class {
421
428
  try {
422
429
  (0, import_log.log)("aborting protocol... ", void 0, {
423
430
  F: __dxlog_file,
424
- L: 261,
431
+ L: 273,
425
432
  S: this,
426
433
  C: (f, a) => f(...a)
427
434
  });
@@ -429,7 +436,7 @@ var Connection = class {
429
436
  } catch (err2) {
430
437
  import_log.log.catch(err2, void 0, {
431
438
  F: __dxlog_file,
432
- L: 264,
439
+ L: 276,
433
440
  S: this,
434
441
  C: (f, a) => f(...a)
435
442
  });
@@ -439,7 +446,7 @@ var Connection = class {
439
446
  } catch (err2) {
440
447
  import_log.log.catch(err2, void 0, {
441
448
  F: __dxlog_file,
442
- L: 271,
449
+ L: 283,
443
450
  S: this,
444
451
  C: (f, a) => f(...a)
445
452
  });
@@ -449,7 +456,7 @@ var Connection = class {
449
456
  } catch (err2) {
450
457
  import_log.log.catch(err2, void 0, {
451
458
  F: __dxlog_file,
452
- L: 277,
459
+ L: 289,
453
460
  S: this,
454
461
  C: (f, a) => f(...a)
455
462
  });
@@ -473,7 +480,7 @@ var Connection = class {
473
480
  peerId: this.ownId
474
481
  }, {
475
482
  F: __dxlog_file,
476
- L: 302,
483
+ L: 314,
477
484
  S: this,
478
485
  C: (f, a) => f(...a)
479
486
  });
@@ -483,7 +490,7 @@ var Connection = class {
483
490
  } catch (err2) {
484
491
  import_log.log.catch(err2, void 0, {
485
492
  F: __dxlog_file,
486
- L: 309,
493
+ L: 321,
487
494
  S: this,
488
495
  C: (f, a) => f(...a)
489
496
  });
@@ -493,7 +500,7 @@ var Connection = class {
493
500
  } catch (err2) {
494
501
  import_log.log.catch(err2, void 0, {
495
502
  F: __dxlog_file,
496
- L: 316,
503
+ L: 328,
497
504
  S: this,
498
505
  C: (f, a) => f(...a)
499
506
  });
@@ -501,7 +508,7 @@ var Connection = class {
501
508
  } else {
502
509
  import_log.log.info(`graceful close requested when we were in ${lastState} state? aborting`, void 0, {
503
510
  F: __dxlog_file,
504
- L: 319,
511
+ L: 331,
505
512
  S: this,
506
513
  C: (f, a) => f(...a)
507
514
  });
@@ -510,7 +517,7 @@ var Connection = class {
510
517
  } catch (err2) {
511
518
  import_log.log.catch(err2, void 0, {
512
519
  F: __dxlog_file,
513
- L: 323,
520
+ L: 335,
514
521
  S: this,
515
522
  C: (f, a) => f(...a)
516
523
  });
@@ -520,7 +527,7 @@ var Connection = class {
520
527
  } catch (err2) {
521
528
  import_log.log.catch(err2, void 0, {
522
529
  F: __dxlog_file,
523
- L: 328,
530
+ L: 340,
524
531
  S: this,
525
532
  C: (f, a) => f(...a)
526
533
  });
@@ -530,7 +537,7 @@ var Connection = class {
530
537
  peerId: this.ownId
531
538
  }, {
532
539
  F: __dxlog_file,
533
- L: 332,
540
+ L: 344,
534
541
  S: this,
535
542
  C: (f, a) => f(...a)
536
543
  });
@@ -573,7 +580,7 @@ var Connection = class {
573
580
  err
574
581
  }, {
575
582
  F: __dxlog_file,
576
- L: 370,
583
+ L: 382,
577
584
  S: this,
578
585
  C: (f, a) => f(...a)
579
586
  });
@@ -586,7 +593,7 @@ var Connection = class {
586
593
  async signal(msg) {
587
594
  (0, import_invariant.invariant)(msg.sessionId, void 0, {
588
595
  F: __dxlog_file,
589
- L: 379,
596
+ L: 391,
590
597
  S: this,
591
598
  A: [
592
599
  "msg.sessionId",
@@ -596,7 +603,7 @@ var Connection = class {
596
603
  if (!msg.sessionId.equals(this.sessionId)) {
597
604
  (0, import_log.log)("dropping signal for incorrect session id", void 0, {
598
605
  F: __dxlog_file,
599
- L: 381,
606
+ L: 393,
600
607
  S: this,
601
608
  C: (f, a) => f(...a)
602
609
  });
@@ -604,7 +611,7 @@ var Connection = class {
604
611
  }
605
612
  (0, import_invariant.invariant)(msg.data.signal || msg.data.signalBatch, void 0, {
606
613
  F: __dxlog_file,
607
- L: 384,
614
+ L: 396,
608
615
  S: this,
609
616
  A: [
610
617
  "msg.data.signal || msg.data.signalBatch",
@@ -613,7 +620,7 @@ var Connection = class {
613
620
  });
614
621
  (0, import_invariant.invariant)(msg.author?.equals(this.remoteId), void 0, {
615
622
  F: __dxlog_file,
616
- L: 385,
623
+ L: 397,
617
624
  S: this,
618
625
  A: [
619
626
  "msg.author?.equals(this.remoteId)",
@@ -622,7 +629,7 @@ var Connection = class {
622
629
  });
623
630
  (0, import_invariant.invariant)(msg.recipient?.equals(this.ownId), void 0, {
624
631
  F: __dxlog_file,
625
- L: 386,
632
+ L: 398,
626
633
  S: this,
627
634
  A: [
628
635
  "msg.recipient?.equals(this.ownId)",
@@ -646,7 +653,7 @@ var Connection = class {
646
653
  msg: msg.data
647
654
  }, {
648
655
  F: __dxlog_file,
649
- L: 395,
656
+ L: 407,
650
657
  S: this,
651
658
  C: (f, a) => f(...a)
652
659
  });
@@ -654,7 +661,7 @@ var Connection = class {
654
661
  } else {
655
662
  (0, import_invariant.invariant)(this._transport, "Connection not ready to accept signals.", {
656
663
  F: __dxlog_file,
657
- L: 398,
664
+ L: 410,
658
665
  S: this,
659
666
  A: [
660
667
  "this._transport",
@@ -667,7 +674,7 @@ var Connection = class {
667
674
  msg: msg.data
668
675
  }, {
669
676
  F: __dxlog_file,
670
- L: 399,
677
+ L: 411,
671
678
  S: this,
672
679
  C: (f, a) => f(...a)
673
680
  });
@@ -685,13 +692,13 @@ var Connection = class {
685
692
  peerId: this.ownId
686
693
  }, {
687
694
  F: __dxlog_file,
688
- L: 410,
695
+ L: 422,
689
696
  S: this,
690
697
  C: (f, a) => f(...a)
691
698
  });
692
699
  (0, import_invariant.invariant)(state !== this._state, "Already in this state.", {
693
700
  F: __dxlog_file,
694
- L: 411,
701
+ L: 423,
695
702
  S: this,
696
703
  A: [
697
704
  "state !== this._state",
@@ -701,7 +708,16 @@ var Connection = class {
701
708
  this._state = state;
702
709
  this.stateChanged.emit(state);
703
710
  }
711
+ async _emitTransportStats() {
712
+ const stats = await this.transport?.getStats();
713
+ if (stats) {
714
+ this.transportStats.emit(stats);
715
+ }
716
+ }
704
717
  };
718
+ _ts_decorate([
719
+ import_log.logInfo
720
+ ], Connection.prototype, "sessionIdString", null);
705
721
  _ts_decorate([
706
722
  import_async.synchronized
707
723
  ], Connection.prototype, "abort", null);
@@ -2090,7 +2106,7 @@ var ConnectionLog = class {
2090
2106
  };
2091
2107
  info.connections.push(connectionInfo);
2092
2108
  this.update.emit();
2093
- connection.stateChanged.on((state) => {
2109
+ connection.stateChanged.on(async (state) => {
2094
2110
  connectionInfo.state = state;
2095
2111
  connectionInfo.closeReason = connection.closeReason;
2096
2112
  connectionInfo.lastUpdate = /* @__PURE__ */ new Date();
@@ -2098,6 +2114,10 @@ var ConnectionLog = class {
2098
2114
  type: EventType.CONNECTION_STATE_CHANGED,
2099
2115
  newState: state
2100
2116
  });
2117
+ if (state === ConnectionState.CONNECTED) {
2118
+ const details = await connection.transport?.getDetails();
2119
+ connectionInfo.transportDetails = details;
2120
+ }
2101
2121
  this.update.emit();
2102
2122
  });
2103
2123
  connection.protocol?.stats?.on((stats) => {
@@ -2107,6 +2127,12 @@ var ConnectionLog = class {
2107
2127
  connectionInfo.lastUpdate = /* @__PURE__ */ new Date();
2108
2128
  this.update.emit();
2109
2129
  });
2130
+ connection.transportStats?.on((stats) => {
2131
+ connectionInfo.transportBytesSent = stats.bytesSent;
2132
+ connectionInfo.transportBytesReceived = stats.bytesReceived;
2133
+ connectionInfo.transportPacketsSent = stats.packetsSent;
2134
+ connectionInfo.transportPacketsReceived = stats.packetsReceived;
2135
+ });
2110
2136
  gcSwarm(info);
2111
2137
  });
2112
2138
  }
@@ -2389,9 +2415,12 @@ var FullyConnectedTopology = class {
2389
2415
  }
2390
2416
  };
2391
2417
  var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/topology/mmst-topology.ts";
2418
+ var MIN_UPDATE_INTERVAL = 1e3 * 10;
2419
+ var MAX_CHANGES_PER_UPDATE = 1;
2392
2420
  var MMSTTopology = class {
2393
2421
  constructor({ originateConnections = 2, maxPeers = 4, sampleSize = 10 } = {}) {
2394
2422
  this._sampleCollected = false;
2423
+ this._lastAction = /* @__PURE__ */ new Date(0);
2395
2424
  this._originateConnections = originateConnections;
2396
2425
  this._maxPeers = maxPeers;
2397
2426
  this._sampleSize = sampleSize;
@@ -2399,7 +2428,7 @@ var MMSTTopology = class {
2399
2428
  init(controller) {
2400
2429
  (0, import_invariant8.invariant)(!this._controller, "Already initialized", {
2401
2430
  F: __dxlog_file9,
2402
- L: 46,
2431
+ L: 51,
2403
2432
  S: this,
2404
2433
  A: [
2405
2434
  "!this._controller",
@@ -2411,7 +2440,7 @@ var MMSTTopology = class {
2411
2440
  update() {
2412
2441
  (0, import_invariant8.invariant)(this._controller, "Not initialized", {
2413
2442
  F: __dxlog_file9,
2414
- L: 51,
2443
+ L: 56,
2415
2444
  S: this,
2416
2445
  A: [
2417
2446
  "this._controller",
@@ -2420,9 +2449,9 @@ var MMSTTopology = class {
2420
2449
  });
2421
2450
  const { connected, candidates } = this._controller.getState();
2422
2451
  if (this._sampleCollected || connected.length > this._maxPeers || candidates.length > 0) {
2423
- (0, import_log8.log)("Running the algorithm.", void 0, {
2452
+ import_log8.log.info("Running the algorithm.", void 0, {
2424
2453
  F: __dxlog_file9,
2425
- L: 55,
2454
+ L: 60,
2426
2455
  S: this,
2427
2456
  C: (f, a) => f(...a)
2428
2457
  });
@@ -2433,7 +2462,7 @@ var MMSTTopology = class {
2433
2462
  async onOffer(peer) {
2434
2463
  (0, import_invariant8.invariant)(this._controller, "Not initialized", {
2435
2464
  F: __dxlog_file9,
2436
- L: 62,
2465
+ L: 67,
2437
2466
  S: this,
2438
2467
  A: [
2439
2468
  "this._controller",
@@ -2444,7 +2473,7 @@ var MMSTTopology = class {
2444
2473
  const accept = connected.length < this._maxPeers;
2445
2474
  (0, import_log8.log)(`Offer ${peer} accept=${accept}`, void 0, {
2446
2475
  F: __dxlog_file9,
2447
- L: 65,
2476
+ L: 70,
2448
2477
  S: this,
2449
2478
  C: (f, a) => f(...a)
2450
2479
  });
@@ -2455,7 +2484,7 @@ var MMSTTopology = class {
2455
2484
  _runAlgorithm() {
2456
2485
  (0, import_invariant8.invariant)(this._controller, "Not initialized", {
2457
2486
  F: __dxlog_file9,
2458
- L: 74,
2487
+ L: 79,
2459
2488
  S: this,
2460
2489
  A: [
2461
2490
  "this._controller",
@@ -2464,27 +2493,84 @@ var MMSTTopology = class {
2464
2493
  });
2465
2494
  const { connected, candidates, ownPeerId } = this._controller.getState();
2466
2495
  if (connected.length > this._maxPeers) {
2496
+ import_log8.log.info(`disconnect ${connected.length - this._maxPeers} peers.`, void 0, {
2497
+ F: __dxlog_file9,
2498
+ L: 85,
2499
+ S: this,
2500
+ C: (f, a) => f(...a)
2501
+ });
2467
2502
  const sorted = sortByXorDistance(connected, ownPeerId).reverse().slice(0, this._maxPeers - connected.length);
2468
- for (const peer of sorted) {
2469
- (0, import_log8.log)(`Disconnect ${peer}.`, void 0, {
2503
+ (0, import_invariant8.invariant)(sorted.length === 0, void 0, {
2504
+ F: __dxlog_file9,
2505
+ L: 89,
2506
+ S: this,
2507
+ A: [
2508
+ "sorted.length === 0",
2509
+ ""
2510
+ ]
2511
+ });
2512
+ if (sorted.length > MAX_CHANGES_PER_UPDATE) {
2513
+ (0, import_log8.log)(`want to disconnect ${sorted.length} peers but limited to ${MAX_CHANGES_PER_UPDATE}`, void 0, {
2470
2514
  F: __dxlog_file9,
2471
- L: 83,
2515
+ L: 92,
2516
+ S: this,
2517
+ C: (f, a) => f(...a)
2518
+ });
2519
+ }
2520
+ if (Date.now() - this._lastAction.getTime() > MIN_UPDATE_INTERVAL) {
2521
+ for (const peer of sorted.slice(0, MAX_CHANGES_PER_UPDATE)) {
2522
+ import_log8.log.info(`Disconnect ${peer}.`, void 0, {
2523
+ F: __dxlog_file9,
2524
+ L: 97,
2525
+ S: this,
2526
+ C: (f, a) => f(...a)
2527
+ });
2528
+ this._controller.disconnect(peer);
2529
+ }
2530
+ this._lastAction = /* @__PURE__ */ new Date();
2531
+ } else {
2532
+ import_log8.log.info("rate limited discconnect", void 0, {
2533
+ F: __dxlog_file9,
2534
+ L: 102,
2472
2535
  S: this,
2473
2536
  C: (f, a) => f(...a)
2474
2537
  });
2475
- this._controller.disconnect(peer);
2476
2538
  }
2477
2539
  } else if (connected.length < this._originateConnections) {
2540
+ import_log8.log.info(`connect ${this._originateConnections - connected.length} peers.`, void 0, {
2541
+ F: __dxlog_file9,
2542
+ L: 106,
2543
+ S: this,
2544
+ C: (f, a) => f(...a)
2545
+ });
2478
2546
  const sample = candidates.sort(() => Math.random() - 0.5).slice(0, this._sampleSize);
2479
2547
  const sorted = sortByXorDistance(sample, ownPeerId).slice(0, this._originateConnections - connected.length);
2480
- for (const peer of sorted) {
2481
- (0, import_log8.log)(`Connect ${peer}.`, void 0, {
2548
+ if (sorted.length > MAX_CHANGES_PER_UPDATE) {
2549
+ (0, import_log8.log)(`want to connect ${sorted.length} peers but limited to ${MAX_CHANGES_PER_UPDATE}`, void 0, {
2482
2550
  F: __dxlog_file9,
2483
- L: 91,
2551
+ L: 111,
2552
+ S: this,
2553
+ C: (f, a) => f(...a)
2554
+ });
2555
+ }
2556
+ if (Date.now() - this._lastAction.getTime() > MIN_UPDATE_INTERVAL) {
2557
+ for (const peer of sorted.slice(0, MAX_CHANGES_PER_UPDATE)) {
2558
+ import_log8.log.info(`Connect ${peer}.`, void 0, {
2559
+ F: __dxlog_file9,
2560
+ L: 115,
2561
+ S: this,
2562
+ C: (f, a) => f(...a)
2563
+ });
2564
+ this._controller.connect(peer);
2565
+ }
2566
+ this._lastAction = /* @__PURE__ */ new Date();
2567
+ } else {
2568
+ import_log8.log.info("rate limited connect", void 0, {
2569
+ F: __dxlog_file9,
2570
+ L: 120,
2484
2571
  S: this,
2485
2572
  C: (f, a) => f(...a)
2486
2573
  });
2487
- this._controller.connect(peer);
2488
2574
  }
2489
2575
  }
2490
2576
  }
@@ -2757,6 +2843,17 @@ var MemoryTransport = class _MemoryTransport {
2757
2843
  this._remote.wake(remoteId);
2758
2844
  }
2759
2845
  }
2846
+ async getDetails() {
2847
+ return this._instanceId.toHex();
2848
+ }
2849
+ async getStats() {
2850
+ return {
2851
+ bytesSent: 0,
2852
+ bytesReceived: 0,
2853
+ packetsSent: 0,
2854
+ packetsReceived: 0
2855
+ };
2856
+ }
2760
2857
  };
2761
2858
  _ts_decorate4([
2762
2859
  import_log10.logInfo
@@ -2774,11 +2871,14 @@ var TransportKind;
2774
2871
  })(TransportKind || (TransportKind = {}));
2775
2872
  var wrtc = null;
2776
2873
  try {
2777
- wrtc = (0, import_chunk_XE5JOIGD.__require)("@koush/wrtc");
2874
+ wrtc = (0, import_chunk_JDKM4UPJ.__require)("@koush/wrtc");
2778
2875
  } catch {
2779
2876
  }
2780
2877
  var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/simplepeer-transport.ts";
2781
2878
  var SimplePeerTransport = class {
2879
+ /**
2880
+ * @params opts.config formatted as per https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/RTCPeerConnection
2881
+ */
2782
2882
  constructor(params) {
2783
2883
  this.params = params;
2784
2884
  this._closed = false;
@@ -2791,13 +2891,13 @@ var SimplePeerTransport = class {
2791
2891
  id: this._instanceId
2792
2892
  }), {
2793
2893
  F: __dxlog_file12,
2794
- L: 41,
2894
+ L: 44,
2795
2895
  S: this,
2796
2896
  C: (f, a) => f(...a)
2797
2897
  });
2798
2898
  (0, import_log11.log)("created connection", params, {
2799
2899
  F: __dxlog_file12,
2800
- L: 42,
2900
+ L: 45,
2801
2901
  S: this,
2802
2902
  C: (f, a) => f(...a)
2803
2903
  });
@@ -2810,7 +2910,7 @@ var SimplePeerTransport = class {
2810
2910
  this._peer.on("signal", async (data) => {
2811
2911
  (0, import_log11.log)("signal", data, {
2812
2912
  F: __dxlog_file12,
2813
- L: 51,
2913
+ L: 54,
2814
2914
  S: this,
2815
2915
  C: (f, a) => f(...a)
2816
2916
  });
@@ -2823,7 +2923,7 @@ var SimplePeerTransport = class {
2823
2923
  this._peer.on("connect", () => {
2824
2924
  (0, import_log11.log)("connected", void 0, {
2825
2925
  F: __dxlog_file12,
2826
- L: 56,
2926
+ L: 59,
2827
2927
  S: this,
2828
2928
  C: (f, a) => f(...a)
2829
2929
  });
@@ -2834,7 +2934,7 @@ var SimplePeerTransport = class {
2834
2934
  this._peer.on("close", async () => {
2835
2935
  (0, import_log11.log)("closed", void 0, {
2836
2936
  F: __dxlog_file12,
2837
- L: 63,
2937
+ L: 66,
2838
2938
  S: this,
2839
2939
  C: (f, a) => f(...a)
2840
2940
  });
@@ -2849,7 +2949,7 @@ var SimplePeerTransport = class {
2849
2949
  err
2850
2950
  }, {
2851
2951
  F: __dxlog_file12,
2852
- L: 74,
2952
+ L: 77,
2853
2953
  S: this,
2854
2954
  C: (f, a) => f(...a)
2855
2955
  });
@@ -2858,7 +2958,7 @@ var SimplePeerTransport = class {
2858
2958
  } else if ("code" in err) {
2859
2959
  import_log11.log.info("simple-peer error", err, {
2860
2960
  F: __dxlog_file12,
2861
- L: 79,
2961
+ L: 82,
2862
2962
  S: this,
2863
2963
  C: (f, a) => f(...a)
2864
2964
  });
@@ -2888,7 +2988,7 @@ var SimplePeerTransport = class {
2888
2988
  } else {
2889
2989
  import_log11.log.info("unknown peer connection error", err, {
2890
2990
  F: __dxlog_file12,
2891
- L: 105,
2991
+ L: 108,
2892
2992
  S: this,
2893
2993
  C: (f, a) => f(...a)
2894
2994
  });
@@ -2899,10 +2999,10 @@ var SimplePeerTransport = class {
2899
2999
  this._peer._pc.getStats().then((stats) => {
2900
3000
  import_log11.log.info("report after webrtc error", {
2901
3001
  config: this.params.webrtcConfig,
2902
- stats
3002
+ stats: Object.fromEntries(stats.entries())
2903
3003
  }, {
2904
3004
  F: __dxlog_file12,
2905
- L: 113,
3005
+ L: 116,
2906
3006
  S: this,
2907
3007
  C: (f, a) => f(...a)
2908
3008
  });
@@ -2911,7 +3011,7 @@ var SimplePeerTransport = class {
2911
3011
  } catch (err2) {
2912
3012
  import_log11.log.catch(err2, void 0, {
2913
3013
  F: __dxlog_file12,
2914
- L: 120,
3014
+ L: 123,
2915
3015
  S: this,
2916
3016
  C: (f, a) => f(...a)
2917
3017
  });
@@ -2922,15 +3022,68 @@ var SimplePeerTransport = class {
2922
3022
  id: this._instanceId
2923
3023
  }), {
2924
3024
  F: __dxlog_file12,
2925
- L: 125,
3025
+ L: 129,
2926
3026
  S: this,
2927
3027
  C: (f, a) => f(...a)
2928
3028
  });
2929
3029
  }
3030
+ async getStats() {
3031
+ const stats = await this._getStats();
3032
+ if (!stats) {
3033
+ return {
3034
+ bytesSent: 0,
3035
+ bytesReceived: 0,
3036
+ packetsSent: 0,
3037
+ packetsReceived: 0,
3038
+ rawStats: {}
3039
+ };
3040
+ }
3041
+ return {
3042
+ bytesSent: stats.transport.bytesSent,
3043
+ bytesReceived: stats.transport.bytesReceived,
3044
+ packetsSent: stats.transport.messagesSent,
3045
+ packetsReceived: stats.transport.messagesReceived,
3046
+ rawStats: stats.raw
3047
+ };
3048
+ }
3049
+ async _getStats() {
3050
+ if (typeof this._peer?._pc?.getStats !== "function") {
3051
+ return null;
3052
+ }
3053
+ return await this._peer._pc.getStats().then((stats) => {
3054
+ const statsEntries = Array.from(stats.entries());
3055
+ const transport = statsEntries.filter((s) => s[1].type === "transport")[0][1];
3056
+ const candidatePair = statsEntries.filter((s) => s[0] === transport.selectedCandidatePairId);
3057
+ let selectedCandidatePair;
3058
+ let remoteCandidate;
3059
+ if (candidatePair.length > 0) {
3060
+ selectedCandidatePair = candidatePair[0][1];
3061
+ remoteCandidate = statsEntries.filter((s) => s[0] === selectedCandidatePair.remoteCandidateId)[0][1];
3062
+ }
3063
+ return {
3064
+ datachannel: statsEntries.filter((s) => s[1].type === "data-channel")[0][1],
3065
+ transport,
3066
+ selectedCandidatePair,
3067
+ remoteCandidate,
3068
+ raw: Object.fromEntries(stats.entries())
3069
+ };
3070
+ });
3071
+ }
3072
+ async getDetails() {
3073
+ const stats = await this._getStats();
3074
+ const rc = stats?.remoteCandidate;
3075
+ if (!rc) {
3076
+ return "unavailable";
3077
+ }
3078
+ if (rc.relay) {
3079
+ return `${rc.ip}:${rc.port}/${rc.protocol} relay for XXX ${rc.candidateType}`;
3080
+ }
3081
+ return `${rc.ip}:${rc.port}/${rc.protocol} ${rc.candidateType}`;
3082
+ }
2930
3083
  async destroy() {
2931
3084
  (0, import_log11.log)("closing...", void 0, {
2932
3085
  F: __dxlog_file12,
2933
- L: 129,
3086
+ L: 192,
2934
3087
  S: this,
2935
3088
  C: (f, a) => f(...a)
2936
3089
  });
@@ -2940,10 +3093,11 @@ var SimplePeerTransport = class {
2940
3093
  this._closed = true;
2941
3094
  this._disconnectStreams();
2942
3095
  this._peer.destroy();
3096
+ this._closed = true;
2943
3097
  this.closed.emit();
2944
3098
  (0, import_log11.log)("closed", void 0, {
2945
3099
  F: __dxlog_file12,
2946
- L: 137,
3100
+ L: 201,
2947
3101
  S: this,
2948
3102
  C: (f, a) => f(...a)
2949
3103
  });
@@ -3049,7 +3203,7 @@ var SimplePeerTransportService = class {
3049
3203
  async sendSignal({ proxyId, signal }) {
3050
3204
  (0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
3051
3205
  F: __dxlog_file13,
3052
- L: 112,
3206
+ L: 116,
3053
3207
  S: this,
3054
3208
  A: [
3055
3209
  "this.transports.has(proxyId)",
@@ -3058,18 +3212,46 @@ var SimplePeerTransportService = class {
3058
3212
  });
3059
3213
  await this.transports.get(proxyId).transport.signal(signal);
3060
3214
  }
3215
+ async getDetails({ proxyId }) {
3216
+ (0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
3217
+ F: __dxlog_file13,
3218
+ L: 121,
3219
+ S: this,
3220
+ A: [
3221
+ "this.transports.has(proxyId)",
3222
+ ""
3223
+ ]
3224
+ });
3225
+ return {
3226
+ details: await this.transports.get(proxyId).transport.getDetails()
3227
+ };
3228
+ }
3229
+ async getStats({ proxyId }) {
3230
+ (0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
3231
+ F: __dxlog_file13,
3232
+ L: 126,
3233
+ S: this,
3234
+ A: [
3235
+ "this.transports.has(proxyId)",
3236
+ ""
3237
+ ]
3238
+ });
3239
+ return {
3240
+ stats: await this.transports.get(proxyId).transport.getStats()
3241
+ };
3242
+ }
3061
3243
  async sendData({ proxyId, payload }) {
3062
3244
  if (this.transports.get(proxyId)?.state !== "OPEN") {
3063
3245
  import_log12.log.debug("transport is closed", void 0, {
3064
3246
  F: __dxlog_file13,
3065
- L: 118,
3247
+ L: 132,
3066
3248
  S: this,
3067
3249
  C: (f, a) => f(...a)
3068
3250
  });
3069
3251
  }
3070
3252
  (0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
3071
3253
  F: __dxlog_file13,
3072
- L: 120,
3254
+ L: 134,
3073
3255
  S: this,
3074
3256
  A: [
3075
3257
  "this.transports.has(proxyId)",
@@ -3092,7 +3274,7 @@ var SimplePeerTransportService = class {
3092
3274
  }
3093
3275
  (0, import_log12.log)("Closed.", void 0, {
3094
3276
  F: __dxlog_file13,
3095
- L: 136,
3277
+ L: 150,
3096
3278
  S: this,
3097
3279
  C: (f, a) => f(...a)
3098
3280
  });
@@ -3219,6 +3401,16 @@ var SimplePeerTransportProxy = class {
3219
3401
  signal
3220
3402
  }).catch((err) => this.errors.raise(decodeError(err)));
3221
3403
  }
3404
+ async getDetails() {
3405
+ return (await this._params.bridgeService.getDetails({
3406
+ proxyId: this._proxyId
3407
+ })).details;
3408
+ }
3409
+ async getStats() {
3410
+ return (await this._params.bridgeService.getStats({
3411
+ proxyId: this._proxyId
3412
+ })).stats;
3413
+ }
3222
3414
  // TODO(burdon): Move open from constructor.
3223
3415
  async destroy() {
3224
3416
  await this._ctx.dispose();
@@ -3233,7 +3425,7 @@ var SimplePeerTransportProxy = class {
3233
3425
  } catch (err) {
3234
3426
  import_log13.log.catch(err, void 0, {
3235
3427
  F: __dxlog_file14,
3236
- L: 160,
3428
+ L: 168,
3237
3429
  S: this,
3238
3430
  C: (f, a) => f(...a)
3239
3431
  });
@@ -3269,7 +3461,7 @@ var SimplePeerTransportProxyFactory = class {
3269
3461
  createTransport(options) {
3270
3462
  (0, import_invariant12.invariant)(this._bridgeService, "SimplePeerTransportProxyFactory is not ready to open connections", {
3271
3463
  F: __dxlog_file14,
3272
- L: 197,
3464
+ L: 205,
3273
3465
  S: this,
3274
3466
  A: [
3275
3467
  "this._bridgeService",
@@ -3326,7 +3518,7 @@ var LibDataChannelTransport = class {
3326
3518
  this._readyForCandidates = new import_async11.Trigger();
3327
3519
  this._writeCallback = null;
3328
3520
  this._peer = (async () => {
3329
- const { RTCPeerConnection: PeerConnection } = await import("./datachannel-53JZPGFA.cjs");
3521
+ const { RTCPeerConnection: PeerConnection } = await import("./datachannel-3VTTIMR5.cjs");
3330
3522
  if (this._closed) {
3331
3523
  this.errors.raise(new Error("connection already closed"));
3332
3524
  }
@@ -3622,6 +3814,46 @@ var LibDataChannelTransport = class {
3622
3814
  });
3623
3815
  });
3624
3816
  }
3817
+ async getDetails() {
3818
+ return this._peer.then(async (peer) => {
3819
+ const cp = await peer.getSelectedCandidatePair();
3820
+ if (!cp) {
3821
+ return "unavailable";
3822
+ }
3823
+ return `${cp.remote.address}:${cp.remote.port}/${cp.remote.transportType} ${cp.remote.type}`;
3824
+ }).catch((err) => {
3825
+ import_log14.log.catch(err, void 0, {
3826
+ F: __dxlog_file15,
3827
+ L: 250,
3828
+ S: this,
3829
+ C: (f, a) => f(...a)
3830
+ });
3831
+ return "unavailable";
3832
+ });
3833
+ }
3834
+ async getStats() {
3835
+ return this._peer.then((peer) => {
3836
+ return {
3837
+ bytesSent: peer.bytesSent(),
3838
+ bytesReceived: peer.bytesReceived(),
3839
+ packetsSent: 0,
3840
+ packetsReceived: 0
3841
+ };
3842
+ }).catch((err) => {
3843
+ import_log14.log.catch(err, void 0, {
3844
+ F: __dxlog_file15,
3845
+ L: 266,
3846
+ S: this,
3847
+ C: (f, a) => f(...a)
3848
+ });
3849
+ return {
3850
+ bytesSent: 0,
3851
+ bytesReceived: 0,
3852
+ packetsSent: 0,
3853
+ packetsReceived: 0
3854
+ };
3855
+ });
3856
+ }
3625
3857
  // TODO(nf): add classmethod to call node-datachannel.cleanup() when all instances have been destroyed?
3626
3858
  async destroy() {
3627
3859
  await this._close();
@@ -3731,13 +3963,29 @@ var TcpTransport = class {
3731
3963
  host: "localhost"
3732
3964
  });
3733
3965
  }
3966
+ async getDetails() {
3967
+ if (this.options.initiator) {
3968
+ const { port: port2, address: address2 } = this._server?.address();
3969
+ return `LISTEN ${address2}:${port2}`;
3970
+ }
3971
+ const { port, address } = this._socket?.address();
3972
+ return `ACCEPT ${address}:${port}`;
3973
+ }
3974
+ async getStats() {
3975
+ return {
3976
+ bytesSent: 0,
3977
+ bytesReceived: 0,
3978
+ packetsSent: 0,
3979
+ packetsReceived: 0
3980
+ };
3981
+ }
3734
3982
  _handleSocket(socket) {
3735
3983
  (0, import_log15.log)("handling socket", {
3736
3984
  remotePort: socket.remotePort,
3737
3985
  localPort: socket.localPort
3738
3986
  }, {
3739
3987
  F: __dxlog_file16,
3740
- L: 91,
3988
+ L: 109,
3741
3989
  S: this,
3742
3990
  C: (f, a) => f(...a)
3743
3991
  });
@@ -3749,7 +3997,7 @@ var TcpTransport = class {
3749
3997
  port: this._socket?.remotePort
3750
3998
  }, {
3751
3999
  F: __dxlog_file16,
3752
- L: 97,
4000
+ L: 115,
3753
4001
  S: this,
3754
4002
  C: (f, a) => f(...a)
3755
4003
  });
@@ -3768,8 +4016,8 @@ var createTeleportProtocolFactory = (onConnection) => {
3768
4016
  const teleport = new import_teleport.Teleport(params);
3769
4017
  return {
3770
4018
  stream: teleport.stream,
3771
- open: async () => {
3772
- await teleport.open();
4019
+ open: async (sessionId) => {
4020
+ await teleport.open(sessionId);
3773
4021
  await onConnection(teleport);
3774
4022
  },
3775
4023
  close: async () => {
@@ -3810,4 +4058,4 @@ var createTeleportProtocolFactory = (onConnection) => {
3810
4058
  createSimplePeerTransportFactory,
3811
4059
  createTeleportProtocolFactory
3812
4060
  });
3813
- //# sourceMappingURL=chunk-6AD7QA4X.cjs.map
4061
+ //# sourceMappingURL=chunk-55WTPQV5.cjs.map