@dxos/network-manager 0.3.8 → 0.3.9-main.03b62b6

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-H7XJ7HES.mjs → chunk-KGZ5C6JO.mjs} +407 -118
  2. package/dist/lib/browser/chunk-KGZ5C6JO.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 +3 -3
  6. package/dist/lib/node/{chunk-XE5JOIGD.cjs → chunk-JDKM4UPJ.cjs} +21 -13
  7. package/dist/lib/node/chunk-JDKM4UPJ.cjs.map +7 -0
  8. package/dist/lib/node/{chunk-RBHZCZH4.cjs → chunk-WUBZ4UOJ.cjs} +410 -111
  9. package/dist/lib/node/chunk-WUBZ4UOJ.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 +21 -21
  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 +27 -1
  43. package/src/swarm/connection.ts +40 -6
  44. package/src/topology/mmst-topology.ts +34 -6
  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 +44 -4
  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 +70 -4
  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-H7XJ7HES.mjs.map +0 -7
  57. package/dist/lib/node/chunk-RBHZCZH4.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_RBHZCZH4_exports = {};
30
- __export(chunk_RBHZCZH4_exports, {
29
+ var chunk_WUBZ4UOJ_exports = {};
30
+ __export(chunk_WUBZ4UOJ_exports, {
31
31
  Connection: () => Connection,
32
32
  ConnectionLimiter: () => ConnectionLimiter,
33
33
  ConnectionLog: () => ConnectionLog,
@@ -55,8 +55,8 @@ __export(chunk_RBHZCZH4_exports, {
55
55
  createSimplePeerTransportFactory: () => createSimplePeerTransportFactory,
56
56
  createTeleportProtocolFactory: () => createTeleportProtocolFactory
57
57
  });
58
- module.exports = __toCommonJS(chunk_RBHZCZH4_exports);
59
- var import_chunk_XE5JOIGD = require("./chunk-XE5JOIGD.cjs");
58
+ module.exports = __toCommonJS(chunk_WUBZ4UOJ_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");
@@ -163,9 +163,10 @@ function _ts_decorate(decorators, target, key, desc) {
163
163
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
164
164
  return c > 3 && r && Object.defineProperty(target, key, r), r;
165
165
  }
166
- var __dxlog_file = "/home/circleci/project/packages/core/mesh/network-manager/src/swarm/connection.ts";
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: 129,
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: 154,
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: 155,
279
+ L: 165,
275
280
  S: this,
276
281
  C: (f, a) => f(...a)
277
282
  });
@@ -283,35 +288,35 @@ var Connection = class {
283
288
  initiator: this.initiator
284
289
  }, {
285
290
  F: __dxlog_file,
286
- L: 156,
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: 173,
302
+ L: 183,
298
303
  S: this,
299
304
  C: (f, a) => f(...a)
300
305
  });
301
306
  this.close(new import_protocols.ProtocolError("protocol stream closed")).catch((err) => this.errors.raise(err));
302
307
  });
303
308
  (0, import_async.scheduleTask)(this.connectedTimeoutContext, async () => {
304
- import_log.log.info("timeout waiting for transport to connect, aborting", void 0, {
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: 180,
311
+ L: 190,
307
312
  S: this,
308
313
  C: (f, a) => f(...a)
309
314
  });
310
- await this.abort().catch((err) => this.errors.raise(err));
315
+ await this.abort(new import_protocols.TimeoutError(`${TRANSPORT_CONNECTION_TIMEOUT / 1e3}s for transport to connect`)).catch((err) => this.errors.raise(err));
311
316
  }, TRANSPORT_CONNECTION_TIMEOUT);
312
317
  (0, import_invariant.invariant)(!this._transport, void 0, {
313
318
  F: __dxlog_file,
314
- L: 186,
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: 201,
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: 206,
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: 213,
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: 216,
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: 219,
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: 235,
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: 242,
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: 244,
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: 258,
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: 261,
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: 268,
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: 274,
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: 299,
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: 306,
493
+ L: 321,
487
494
  S: this,
488
495
  C: (f, a) => f(...a)
489
496
  });
@@ -493,7 +500,34 @@ var Connection = class {
493
500
  } catch (err2) {
494
501
  import_log.log.catch(err2, void 0, {
495
502
  F: __dxlog_file,
496
- L: 313,
503
+ L: 328,
504
+ S: this,
505
+ C: (f, a) => f(...a)
506
+ });
507
+ }
508
+ } else {
509
+ import_log.log.info(`graceful close requested when we were in ${lastState} state? aborting`, void 0, {
510
+ F: __dxlog_file,
511
+ L: 331,
512
+ S: this,
513
+ C: (f, a) => f(...a)
514
+ });
515
+ try {
516
+ await this._protocol.abort();
517
+ } catch (err2) {
518
+ import_log.log.catch(err2, void 0, {
519
+ F: __dxlog_file,
520
+ L: 335,
521
+ S: this,
522
+ C: (f, a) => f(...a)
523
+ });
524
+ }
525
+ try {
526
+ await this._transport?.destroy();
527
+ } catch (err2) {
528
+ import_log.log.catch(err2, void 0, {
529
+ F: __dxlog_file,
530
+ L: 340,
497
531
  S: this,
498
532
  C: (f, a) => f(...a)
499
533
  });
@@ -503,7 +537,7 @@ var Connection = class {
503
537
  peerId: this.ownId
504
538
  }, {
505
539
  F: __dxlog_file,
506
- L: 317,
540
+ L: 344,
507
541
  S: this,
508
542
  C: (f, a) => f(...a)
509
543
  });
@@ -546,7 +580,7 @@ var Connection = class {
546
580
  err
547
581
  }, {
548
582
  F: __dxlog_file,
549
- L: 355,
583
+ L: 382,
550
584
  S: this,
551
585
  C: (f, a) => f(...a)
552
586
  });
@@ -559,7 +593,7 @@ var Connection = class {
559
593
  async signal(msg) {
560
594
  (0, import_invariant.invariant)(msg.sessionId, void 0, {
561
595
  F: __dxlog_file,
562
- L: 364,
596
+ L: 391,
563
597
  S: this,
564
598
  A: [
565
599
  "msg.sessionId",
@@ -569,7 +603,7 @@ var Connection = class {
569
603
  if (!msg.sessionId.equals(this.sessionId)) {
570
604
  (0, import_log.log)("dropping signal for incorrect session id", void 0, {
571
605
  F: __dxlog_file,
572
- L: 366,
606
+ L: 393,
573
607
  S: this,
574
608
  C: (f, a) => f(...a)
575
609
  });
@@ -577,7 +611,7 @@ var Connection = class {
577
611
  }
578
612
  (0, import_invariant.invariant)(msg.data.signal || msg.data.signalBatch, void 0, {
579
613
  F: __dxlog_file,
580
- L: 369,
614
+ L: 396,
581
615
  S: this,
582
616
  A: [
583
617
  "msg.data.signal || msg.data.signalBatch",
@@ -586,7 +620,7 @@ var Connection = class {
586
620
  });
587
621
  (0, import_invariant.invariant)(msg.author?.equals(this.remoteId), void 0, {
588
622
  F: __dxlog_file,
589
- L: 370,
623
+ L: 397,
590
624
  S: this,
591
625
  A: [
592
626
  "msg.author?.equals(this.remoteId)",
@@ -595,7 +629,7 @@ var Connection = class {
595
629
  });
596
630
  (0, import_invariant.invariant)(msg.recipient?.equals(this.ownId), void 0, {
597
631
  F: __dxlog_file,
598
- L: 371,
632
+ L: 398,
599
633
  S: this,
600
634
  A: [
601
635
  "msg.recipient?.equals(this.ownId)",
@@ -619,7 +653,7 @@ var Connection = class {
619
653
  msg: msg.data
620
654
  }, {
621
655
  F: __dxlog_file,
622
- L: 380,
656
+ L: 407,
623
657
  S: this,
624
658
  C: (f, a) => f(...a)
625
659
  });
@@ -627,7 +661,7 @@ var Connection = class {
627
661
  } else {
628
662
  (0, import_invariant.invariant)(this._transport, "Connection not ready to accept signals.", {
629
663
  F: __dxlog_file,
630
- L: 383,
664
+ L: 410,
631
665
  S: this,
632
666
  A: [
633
667
  "this._transport",
@@ -640,7 +674,7 @@ var Connection = class {
640
674
  msg: msg.data
641
675
  }, {
642
676
  F: __dxlog_file,
643
- L: 384,
677
+ L: 411,
644
678
  S: this,
645
679
  C: (f, a) => f(...a)
646
680
  });
@@ -658,13 +692,13 @@ var Connection = class {
658
692
  peerId: this.ownId
659
693
  }, {
660
694
  F: __dxlog_file,
661
- L: 395,
695
+ L: 422,
662
696
  S: this,
663
697
  C: (f, a) => f(...a)
664
698
  });
665
699
  (0, import_invariant.invariant)(state !== this._state, "Already in this state.", {
666
700
  F: __dxlog_file,
667
- L: 396,
701
+ L: 423,
668
702
  S: this,
669
703
  A: [
670
704
  "state !== this._state",
@@ -674,14 +708,23 @@ var Connection = class {
674
708
  this._state = state;
675
709
  this.stateChanged.emit(state);
676
710
  }
711
+ async _emitTransportStats() {
712
+ const stats = await this.transport?.getStats();
713
+ if (stats) {
714
+ this.transportStats.emit(stats);
715
+ }
716
+ }
677
717
  };
718
+ _ts_decorate([
719
+ import_log.logInfo
720
+ ], Connection.prototype, "sessionIdString", null);
678
721
  _ts_decorate([
679
722
  import_async.synchronized
680
723
  ], Connection.prototype, "abort", null);
681
724
  _ts_decorate([
682
725
  import_async.synchronized
683
726
  ], Connection.prototype, "close", null);
684
- var __dxlog_file2 = "/home/circleci/project/packages/core/mesh/network-manager/src/signal/swarm-messenger.ts";
727
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/signal/swarm-messenger.ts";
685
728
  var SwarmMessage = import_protocols2.schema.getCodecForType("dxos.mesh.swarm.SwarmMessage");
686
729
  var SwarmMessenger = class {
687
730
  constructor({ sendMessage, onSignal, onOffer, topic }) {
@@ -926,7 +969,7 @@ function _ts_decorate2(decorators, target, key, desc) {
926
969
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
927
970
  return c > 3 && r && Object.defineProperty(target, key, r), r;
928
971
  }
929
- var __dxlog_file3 = "/home/circleci/project/packages/core/mesh/network-manager/src/swarm/peer.ts";
972
+ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/peer.ts";
930
973
  var ConnectionDisplacedError = class extends import_protocols4.SystemError {
931
974
  constructor() {
932
975
  super("Connection displaced by remote initiator.");
@@ -1402,7 +1445,7 @@ function _ts_decorate3(decorators, target, key, desc) {
1402
1445
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1403
1446
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1404
1447
  }
1405
- var __dxlog_file4 = "/home/circleci/project/packages/core/mesh/network-manager/src/swarm/swarm.ts";
1448
+ var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts";
1406
1449
  var INITIATION_DELAY = 100;
1407
1450
  var getClassName = (obj) => Object.getPrototypeOf(obj).constructor.name;
1408
1451
  var Swarm = class {
@@ -1887,7 +1930,7 @@ _ts_decorate3([
1887
1930
  _ts_decorate3([
1888
1931
  import_async2.synchronized
1889
1932
  ], Swarm.prototype, "goOnline", null);
1890
- var __dxlog_file5 = "/home/circleci/project/packages/core/mesh/network-manager/src/swarm/swarm-mapper.ts";
1933
+ var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm-mapper.ts";
1891
1934
  var SwarmMapper = class {
1892
1935
  get peers() {
1893
1936
  return Array.from(this._peers.values());
@@ -1950,7 +1993,7 @@ var SwarmMapper = class {
1950
1993
  this._subscriptions.clear();
1951
1994
  }
1952
1995
  };
1953
- var __dxlog_file6 = "/home/circleci/project/packages/core/mesh/network-manager/src/swarm/connection-limiter.ts";
1996
+ var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/connection-limiter.ts";
1954
1997
  var MAX_CONCURRENT_INITIATING_CONNECTIONS = 50;
1955
1998
  var ConnectionLimiter = class {
1956
1999
  constructor({ maxConcurrentInitConnections = MAX_CONCURRENT_INITIATING_CONNECTIONS } = {}) {
@@ -2020,6 +2063,7 @@ var ConnectionLimiter = class {
2020
2063
  this.resolveWaitingPromises.schedule();
2021
2064
  }
2022
2065
  };
2066
+ var CONNECTION_GC_THRESHOLD = 1e3 * 60 * 15;
2023
2067
  var EventType;
2024
2068
  (function(EventType2) {
2025
2069
  EventType2["CONNECTION_STATE_CHANGED"] = "CONNECTION_STATE_CHANGED";
@@ -2057,25 +2101,39 @@ var ConnectionLog = class {
2057
2101
  sessionId: connection.sessionId,
2058
2102
  transport: connection.transport && Object.getPrototypeOf(connection.transport).constructor.name,
2059
2103
  protocolExtensions: [],
2060
- events: []
2104
+ events: [],
2105
+ lastUpdate: /* @__PURE__ */ new Date()
2061
2106
  };
2062
2107
  info.connections.push(connectionInfo);
2063
2108
  this.update.emit();
2064
- connection.stateChanged.on((state) => {
2109
+ connection.stateChanged.on(async (state) => {
2065
2110
  connectionInfo.state = state;
2066
2111
  connectionInfo.closeReason = connection.closeReason;
2112
+ connectionInfo.lastUpdate = /* @__PURE__ */ new Date();
2067
2113
  connectionInfo.events.push({
2068
2114
  type: EventType.CONNECTION_STATE_CHANGED,
2069
2115
  newState: state
2070
2116
  });
2117
+ if (state === ConnectionState.CONNECTED) {
2118
+ const details = await connection.transport?.getDetails();
2119
+ connectionInfo.transportDetails = details;
2120
+ }
2071
2121
  this.update.emit();
2072
2122
  });
2073
2123
  connection.protocol?.stats?.on((stats) => {
2074
2124
  connectionInfo.readBufferSize = stats.readBufferSize;
2075
2125
  connectionInfo.writeBufferSize = stats.writeBufferSize;
2076
2126
  connectionInfo.streams = stats.channels;
2127
+ connectionInfo.lastUpdate = /* @__PURE__ */ new Date();
2077
2128
  this.update.emit();
2078
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
+ });
2136
+ gcSwarm(info);
2079
2137
  });
2080
2138
  }
2081
2139
  leftSwarm(swarm) {
@@ -2083,7 +2141,12 @@ var ConnectionLog = class {
2083
2141
  this.update.emit();
2084
2142
  }
2085
2143
  };
2086
- var __dxlog_file7 = "/home/circleci/project/packages/core/mesh/network-manager/src/network-manager.ts";
2144
+ var gcSwarm = (swarm) => {
2145
+ swarm.connections = swarm.connections?.filter((connection) => {
2146
+ return connection.lastUpdate ? Date.now() - connection.lastUpdate.getTime() < CONNECTION_GC_THRESHOLD : true;
2147
+ });
2148
+ };
2149
+ var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/network-manager.ts";
2087
2150
  var NetworkManager = class {
2088
2151
  constructor({ transportFactory, signalManager, log: log1 }) {
2089
2152
  this._swarms = new import_util6.ComplexMap(import_keys8.PublicKey.hash);
@@ -2313,7 +2376,7 @@ var NetworkManager = class {
2313
2376
  this.connectionStateChanged.emit(this._connectionState);
2314
2377
  }
2315
2378
  };
2316
- var __dxlog_file8 = "/home/circleci/project/packages/core/mesh/network-manager/src/topology/fully-connected-topology.ts";
2379
+ var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/topology/fully-connected-topology.ts";
2317
2380
  var FullyConnectedTopology = class {
2318
2381
  toString() {
2319
2382
  return "FullyConnectedTopology";
@@ -2351,10 +2414,13 @@ var FullyConnectedTopology = class {
2351
2414
  async destroy() {
2352
2415
  }
2353
2416
  };
2354
- var __dxlog_file9 = "/home/circleci/project/packages/core/mesh/network-manager/src/topology/mmst-topology.ts";
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;
2355
2420
  var MMSTTopology = class {
2356
2421
  constructor({ originateConnections = 2, maxPeers = 4, sampleSize = 10 } = {}) {
2357
2422
  this._sampleCollected = false;
2423
+ this._lastAction = /* @__PURE__ */ new Date(0);
2358
2424
  this._originateConnections = originateConnections;
2359
2425
  this._maxPeers = maxPeers;
2360
2426
  this._sampleSize = sampleSize;
@@ -2362,7 +2428,7 @@ var MMSTTopology = class {
2362
2428
  init(controller) {
2363
2429
  (0, import_invariant8.invariant)(!this._controller, "Already initialized", {
2364
2430
  F: __dxlog_file9,
2365
- L: 46,
2431
+ L: 51,
2366
2432
  S: this,
2367
2433
  A: [
2368
2434
  "!this._controller",
@@ -2374,7 +2440,7 @@ var MMSTTopology = class {
2374
2440
  update() {
2375
2441
  (0, import_invariant8.invariant)(this._controller, "Not initialized", {
2376
2442
  F: __dxlog_file9,
2377
- L: 51,
2443
+ L: 56,
2378
2444
  S: this,
2379
2445
  A: [
2380
2446
  "this._controller",
@@ -2385,7 +2451,7 @@ var MMSTTopology = class {
2385
2451
  if (this._sampleCollected || connected.length > this._maxPeers || candidates.length > 0) {
2386
2452
  (0, import_log8.log)("Running the algorithm.", void 0, {
2387
2453
  F: __dxlog_file9,
2388
- L: 55,
2454
+ L: 60,
2389
2455
  S: this,
2390
2456
  C: (f, a) => f(...a)
2391
2457
  });
@@ -2396,7 +2462,7 @@ var MMSTTopology = class {
2396
2462
  async onOffer(peer) {
2397
2463
  (0, import_invariant8.invariant)(this._controller, "Not initialized", {
2398
2464
  F: __dxlog_file9,
2399
- L: 62,
2465
+ L: 67,
2400
2466
  S: this,
2401
2467
  A: [
2402
2468
  "this._controller",
@@ -2407,7 +2473,7 @@ var MMSTTopology = class {
2407
2473
  const accept = connected.length < this._maxPeers;
2408
2474
  (0, import_log8.log)(`Offer ${peer} accept=${accept}`, void 0, {
2409
2475
  F: __dxlog_file9,
2410
- L: 65,
2476
+ L: 70,
2411
2477
  S: this,
2412
2478
  C: (f, a) => f(...a)
2413
2479
  });
@@ -2418,7 +2484,7 @@ var MMSTTopology = class {
2418
2484
  _runAlgorithm() {
2419
2485
  (0, import_invariant8.invariant)(this._controller, "Not initialized", {
2420
2486
  F: __dxlog_file9,
2421
- L: 74,
2487
+ L: 79,
2422
2488
  S: this,
2423
2489
  A: [
2424
2490
  "this._controller",
@@ -2427,27 +2493,84 @@ var MMSTTopology = class {
2427
2493
  });
2428
2494
  const { connected, candidates, ownPeerId } = this._controller.getState();
2429
2495
  if (connected.length > this._maxPeers) {
2496
+ (0, import_log8.log)(`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
+ });
2430
2502
  const sorted = sortByXorDistance(connected, ownPeerId).reverse().slice(0, this._maxPeers - connected.length);
2431
- for (const peer of sorted) {
2432
- (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, {
2433
2514
  F: __dxlog_file9,
2434
- 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
+ (0, import_log8.log)(`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
+ (0, import_log8.log)("rate limited discconnect", void 0, {
2533
+ F: __dxlog_file9,
2534
+ L: 102,
2435
2535
  S: this,
2436
2536
  C: (f, a) => f(...a)
2437
2537
  });
2438
- this._controller.disconnect(peer);
2439
2538
  }
2440
2539
  } else if (connected.length < this._originateConnections) {
2540
+ (0, import_log8.log)(`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
+ });
2441
2546
  const sample = candidates.sort(() => Math.random() - 0.5).slice(0, this._sampleSize);
2442
2547
  const sorted = sortByXorDistance(sample, ownPeerId).slice(0, this._originateConnections - connected.length);
2443
- for (const peer of sorted) {
2444
- (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, {
2445
2550
  F: __dxlog_file9,
2446
- 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
+ (0, import_log8.log)(`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
+ (0, import_log8.log)("rate limited connect", void 0, {
2569
+ F: __dxlog_file9,
2570
+ L: 120,
2447
2571
  S: this,
2448
2572
  C: (f, a) => f(...a)
2449
2573
  });
2450
- this._controller.connect(peer);
2451
2574
  }
2452
2575
  }
2453
2576
  }
@@ -2456,7 +2579,7 @@ var MMSTTopology = class {
2456
2579
  }
2457
2580
  };
2458
2581
  var sortByXorDistance = (keys, reference) => keys.sort((a, b) => import_xor_distance.default.gt((0, import_xor_distance.default)(a.asBuffer(), reference.asBuffer()), (0, import_xor_distance.default)(b.asBuffer(), reference.asBuffer())));
2459
- var __dxlog_file10 = "/home/circleci/project/packages/core/mesh/network-manager/src/topology/star-topology.ts";
2582
+ var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/topology/star-topology.ts";
2460
2583
  var StarTopology = class {
2461
2584
  constructor(_centralPeer) {
2462
2585
  this._centralPeer = _centralPeer;
@@ -2558,7 +2681,7 @@ function _ts_decorate4(decorators, target, key, desc) {
2558
2681
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
2559
2682
  return c > 3 && r && Object.defineProperty(target, key, r), r;
2560
2683
  }
2561
- var __dxlog_file11 = "/home/circleci/project/packages/core/mesh/network-manager/src/transport/memory-transport.ts";
2684
+ var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/memory-transport.ts";
2562
2685
  var MEMORY_TRANSPORT_DELAY = 1;
2563
2686
  var createStreamDelay = (delay) => {
2564
2687
  return new import_node_stream.Transform({
@@ -2720,6 +2843,17 @@ var MemoryTransport = class _MemoryTransport {
2720
2843
  this._remote.wake(remoteId);
2721
2844
  }
2722
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
+ }
2723
2857
  };
2724
2858
  _ts_decorate4([
2725
2859
  import_log10.logInfo
@@ -2737,11 +2871,14 @@ var TransportKind;
2737
2871
  })(TransportKind || (TransportKind = {}));
2738
2872
  var wrtc = null;
2739
2873
  try {
2740
- wrtc = (0, import_chunk_XE5JOIGD.__require)("@koush/wrtc");
2874
+ wrtc = (0, import_chunk_JDKM4UPJ.__require)("@koush/wrtc");
2741
2875
  } catch {
2742
2876
  }
2743
- var __dxlog_file12 = "/home/circleci/project/packages/core/mesh/network-manager/src/transport/simplepeer-transport.ts";
2877
+ var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/simplepeer-transport.ts";
2744
2878
  var SimplePeerTransport = class {
2879
+ /**
2880
+ * @params opts.config formatted as per https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/RTCPeerConnection
2881
+ */
2745
2882
  constructor(params) {
2746
2883
  this.params = params;
2747
2884
  this._closed = false;
@@ -2754,13 +2891,13 @@ var SimplePeerTransport = class {
2754
2891
  id: this._instanceId
2755
2892
  }), {
2756
2893
  F: __dxlog_file12,
2757
- L: 41,
2894
+ L: 44,
2758
2895
  S: this,
2759
2896
  C: (f, a) => f(...a)
2760
2897
  });
2761
2898
  (0, import_log11.log)("created connection", params, {
2762
2899
  F: __dxlog_file12,
2763
- L: 42,
2900
+ L: 45,
2764
2901
  S: this,
2765
2902
  C: (f, a) => f(...a)
2766
2903
  });
@@ -2773,7 +2910,7 @@ var SimplePeerTransport = class {
2773
2910
  this._peer.on("signal", async (data) => {
2774
2911
  (0, import_log11.log)("signal", data, {
2775
2912
  F: __dxlog_file12,
2776
- L: 51,
2913
+ L: 54,
2777
2914
  S: this,
2778
2915
  C: (f, a) => f(...a)
2779
2916
  });
@@ -2786,7 +2923,7 @@ var SimplePeerTransport = class {
2786
2923
  this._peer.on("connect", () => {
2787
2924
  (0, import_log11.log)("connected", void 0, {
2788
2925
  F: __dxlog_file12,
2789
- L: 56,
2926
+ L: 59,
2790
2927
  S: this,
2791
2928
  C: (f, a) => f(...a)
2792
2929
  });
@@ -2797,7 +2934,7 @@ var SimplePeerTransport = class {
2797
2934
  this._peer.on("close", async () => {
2798
2935
  (0, import_log11.log)("closed", void 0, {
2799
2936
  F: __dxlog_file12,
2800
- L: 63,
2937
+ L: 66,
2801
2938
  S: this,
2802
2939
  C: (f, a) => f(...a)
2803
2940
  });
@@ -2808,12 +2945,20 @@ var SimplePeerTransport = class {
2808
2945
  if (err.errorDetail === "sctp-failure") {
2809
2946
  this.errors.raise(new import_protocols7.ConnectionResetError("sctp-failure from RTCError", err));
2810
2947
  } else {
2948
+ import_log11.log.info("unknown RTCError", {
2949
+ err
2950
+ }, {
2951
+ F: __dxlog_file12,
2952
+ L: 77,
2953
+ S: this,
2954
+ C: (f, a) => f(...a)
2955
+ });
2811
2956
  this.errors.raise(new import_protocols7.UnknownProtocolError("unknown RTCError", err));
2812
2957
  }
2813
2958
  } else if ("code" in err) {
2814
2959
  import_log11.log.info("simple-peer error", err, {
2815
2960
  F: __dxlog_file12,
2816
- L: 78,
2961
+ L: 82,
2817
2962
  S: this,
2818
2963
  C: (f, a) => f(...a)
2819
2964
  });
@@ -2821,10 +2966,12 @@ var SimplePeerTransport = class {
2821
2966
  case "ERR_WEBRTC_SUPPORT":
2822
2967
  this.errors.raise(new import_protocols7.ProtocolError("WebRTC not supported", err));
2823
2968
  break;
2969
+ case "ERR_SIGNALING":
2970
+ this.errors.raise(new import_protocols7.ConnectivityError("signaling failure", err));
2971
+ break;
2824
2972
  case "ERR_ICE_CONNECTION_FAILURE":
2825
2973
  case "ERR_DATA_CHANNEL":
2826
2974
  case "ERR_CONNECTION_FAILURE":
2827
- case "ERR_SIGNALING":
2828
2975
  this.errors.raise(new import_protocols7.ConnectivityError("unknown communication failure", err));
2829
2976
  break;
2830
2977
  case "ERR_CREATE_OFFER":
@@ -2841,7 +2988,7 @@ var SimplePeerTransport = class {
2841
2988
  } else {
2842
2989
  import_log11.log.info("unknown peer connection error", err, {
2843
2990
  F: __dxlog_file12,
2844
- L: 102,
2991
+ L: 108,
2845
2992
  S: this,
2846
2993
  C: (f, a) => f(...a)
2847
2994
  });
@@ -2852,10 +2999,10 @@ var SimplePeerTransport = class {
2852
2999
  this._peer._pc.getStats().then((stats) => {
2853
3000
  import_log11.log.info("report after webrtc error", {
2854
3001
  config: this.params.webrtcConfig,
2855
- stats
3002
+ stats: Object.fromEntries(stats.entries())
2856
3003
  }, {
2857
3004
  F: __dxlog_file12,
2858
- L: 110,
3005
+ L: 116,
2859
3006
  S: this,
2860
3007
  C: (f, a) => f(...a)
2861
3008
  });
@@ -2864,7 +3011,7 @@ var SimplePeerTransport = class {
2864
3011
  } catch (err2) {
2865
3012
  import_log11.log.catch(err2, void 0, {
2866
3013
  F: __dxlog_file12,
2867
- L: 117,
3014
+ L: 123,
2868
3015
  S: this,
2869
3016
  C: (f, a) => f(...a)
2870
3017
  });
@@ -2875,28 +3022,81 @@ var SimplePeerTransport = class {
2875
3022
  id: this._instanceId
2876
3023
  }), {
2877
3024
  F: __dxlog_file12,
2878
- L: 122,
3025
+ L: 129,
2879
3026
  S: this,
2880
3027
  C: (f, a) => f(...a)
2881
3028
  });
2882
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.candidateType === "relay") {
3079
+ return `${rc.ip}:${rc.port}/${rc.protocol} relay for ${rc.relatedAddress}:${rc.relatedPort}`;
3080
+ }
3081
+ return `${rc.ip}:${rc.port}/${rc.protocol} ${rc.candidateType}`;
3082
+ }
2883
3083
  async destroy() {
2884
3084
  (0, import_log11.log)("closing...", void 0, {
2885
3085
  F: __dxlog_file12,
2886
- L: 126,
3086
+ L: 192,
2887
3087
  S: this,
2888
3088
  C: (f, a) => f(...a)
2889
3089
  });
2890
3090
  if (this._closed) {
2891
3091
  return;
2892
3092
  }
2893
- this._closed = true;
2894
3093
  this._disconnectStreams();
2895
3094
  this._peer.destroy();
3095
+ this._closed = true;
2896
3096
  this.closed.emit();
2897
3097
  (0, import_log11.log)("closed", void 0, {
2898
3098
  F: __dxlog_file12,
2899
- L: 134,
3099
+ L: 200,
2900
3100
  S: this,
2901
3101
  C: (f, a) => f(...a)
2902
3102
  });
@@ -2920,7 +3120,7 @@ var createSimplePeerTransportFactory = (webrtcConfig) => ({
2920
3120
  webrtcConfig
2921
3121
  })
2922
3122
  });
2923
- var __dxlog_file13 = "/home/circleci/project/packages/core/mesh/network-manager/src/transport/simplepeer-transport-service.ts";
3123
+ var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/simplepeer-transport-service.ts";
2924
3124
  var SimplePeerTransportService = class {
2925
3125
  constructor(_webrtcConfig) {
2926
3126
  this._webrtcConfig = _webrtcConfig;
@@ -3002,7 +3202,7 @@ var SimplePeerTransportService = class {
3002
3202
  async sendSignal({ proxyId, signal }) {
3003
3203
  (0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
3004
3204
  F: __dxlog_file13,
3005
- L: 112,
3205
+ L: 116,
3006
3206
  S: this,
3007
3207
  A: [
3008
3208
  "this.transports.has(proxyId)",
@@ -3011,18 +3211,46 @@ var SimplePeerTransportService = class {
3011
3211
  });
3012
3212
  await this.transports.get(proxyId).transport.signal(signal);
3013
3213
  }
3214
+ async getDetails({ proxyId }) {
3215
+ (0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
3216
+ F: __dxlog_file13,
3217
+ L: 121,
3218
+ S: this,
3219
+ A: [
3220
+ "this.transports.has(proxyId)",
3221
+ ""
3222
+ ]
3223
+ });
3224
+ return {
3225
+ details: await this.transports.get(proxyId).transport.getDetails()
3226
+ };
3227
+ }
3228
+ async getStats({ proxyId }) {
3229
+ (0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
3230
+ F: __dxlog_file13,
3231
+ L: 126,
3232
+ S: this,
3233
+ A: [
3234
+ "this.transports.has(proxyId)",
3235
+ ""
3236
+ ]
3237
+ });
3238
+ return {
3239
+ stats: await this.transports.get(proxyId).transport.getStats()
3240
+ };
3241
+ }
3014
3242
  async sendData({ proxyId, payload }) {
3015
3243
  if (this.transports.get(proxyId)?.state !== "OPEN") {
3016
3244
  import_log12.log.debug("transport is closed", void 0, {
3017
3245
  F: __dxlog_file13,
3018
- L: 118,
3246
+ L: 132,
3019
3247
  S: this,
3020
3248
  C: (f, a) => f(...a)
3021
3249
  });
3022
3250
  }
3023
3251
  (0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
3024
3252
  F: __dxlog_file13,
3025
- L: 120,
3253
+ L: 134,
3026
3254
  S: this,
3027
3255
  A: [
3028
3256
  "this.transports.has(proxyId)",
@@ -3045,13 +3273,13 @@ var SimplePeerTransportService = class {
3045
3273
  }
3046
3274
  (0, import_log12.log)("Closed.", void 0, {
3047
3275
  F: __dxlog_file13,
3048
- L: 136,
3276
+ L: 150,
3049
3277
  S: this,
3050
3278
  C: (f, a) => f(...a)
3051
3279
  });
3052
3280
  }
3053
3281
  };
3054
- var __dxlog_file14 = "/home/circleci/project/packages/core/mesh/network-manager/src/transport/simplepeer-transport-proxy.ts";
3282
+ var __dxlog_file14 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/simplepeer-transport-proxy.ts";
3055
3283
  var RESP_MIN_THRESHOLD = 500;
3056
3284
  var TIMEOUT_THRESHOLD = 10;
3057
3285
  var SimplePeerTransportProxy = class {
@@ -3172,6 +3400,16 @@ var SimplePeerTransportProxy = class {
3172
3400
  signal
3173
3401
  }).catch((err) => this.errors.raise(decodeError(err)));
3174
3402
  }
3403
+ async getDetails() {
3404
+ return (await this._params.bridgeService.getDetails({
3405
+ proxyId: this._proxyId
3406
+ })).details;
3407
+ }
3408
+ async getStats() {
3409
+ return (await this._params.bridgeService.getStats({
3410
+ proxyId: this._proxyId
3411
+ })).stats;
3412
+ }
3175
3413
  // TODO(burdon): Move open from constructor.
3176
3414
  async destroy() {
3177
3415
  await this._ctx.dispose();
@@ -3186,7 +3424,7 @@ var SimplePeerTransportProxy = class {
3186
3424
  } catch (err) {
3187
3425
  import_log13.log.catch(err, void 0, {
3188
3426
  F: __dxlog_file14,
3189
- L: 160,
3427
+ L: 168,
3190
3428
  S: this,
3191
3429
  C: (f, a) => f(...a)
3192
3430
  });
@@ -3222,7 +3460,7 @@ var SimplePeerTransportProxyFactory = class {
3222
3460
  createTransport(options) {
3223
3461
  (0, import_invariant12.invariant)(this._bridgeService, "SimplePeerTransportProxyFactory is not ready to open connections", {
3224
3462
  F: __dxlog_file14,
3225
- L: 197,
3463
+ L: 205,
3226
3464
  S: this,
3227
3465
  A: [
3228
3466
  "this._bridgeService",
@@ -3264,7 +3502,7 @@ function _ts_decorate5(decorators, target, key, desc) {
3264
3502
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
3265
3503
  return c > 3 && r && Object.defineProperty(target, key, r), r;
3266
3504
  }
3267
- var __dxlog_file15 = "/home/circleci/project/packages/core/mesh/network-manager/src/transport/libdatachannel-transport.ts";
3505
+ var __dxlog_file15 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/libdatachannel-transport.ts";
3268
3506
  var DATACHANNEL_LABEL = "dxos.mesh.transport";
3269
3507
  var MAX_BUFFERED_AMOUNT = 64 * 1024;
3270
3508
  var MAX_MESSAGE_SIZE = 64 * 1024;
@@ -3279,7 +3517,7 @@ var LibDataChannelTransport = class {
3279
3517
  this._readyForCandidates = new import_async11.Trigger();
3280
3518
  this._writeCallback = null;
3281
3519
  this._peer = (async () => {
3282
- const { RTCPeerConnection: PeerConnection } = await import("./datachannel-53JZPGFA.cjs");
3520
+ const { RTCPeerConnection: PeerConnection } = await import("./datachannel-3VTTIMR5.cjs");
3283
3521
  if (this._closed) {
3284
3522
  this.errors.raise(new Error("connection already closed"));
3285
3523
  }
@@ -3417,16 +3655,21 @@ var LibDataChannelTransport = class {
3417
3655
  const duplex = new import_stream.Duplex({
3418
3656
  read: () => {
3419
3657
  },
3420
- write: (chunk, encoding, callback) => {
3658
+ write: async (chunk, encoding, callback) => {
3421
3659
  if (chunk.length > MAX_MESSAGE_SIZE) {
3422
3660
  this.errors.raise(new Error(`message too large: ${chunk.length} > ${MAX_MESSAGE_SIZE}`));
3423
3661
  }
3424
- dataChannel.send(chunk);
3662
+ try {
3663
+ dataChannel.send(chunk);
3664
+ } catch (err) {
3665
+ this.errors.raise(err);
3666
+ await this._close();
3667
+ }
3425
3668
  if (this._channel.bufferedAmount > MAX_BUFFERED_AMOUNT) {
3426
3669
  if (this._writeCallback !== null) {
3427
3670
  import_log14.log.error("consumer trying to write before we're ready for more data", void 0, {
3428
3671
  F: __dxlog_file15,
3429
- L: 139,
3672
+ L: 143,
3430
3673
  S: this,
3431
3674
  C: (f, a) => f(...a)
3432
3675
  });
@@ -3451,7 +3694,7 @@ var LibDataChannelTransport = class {
3451
3694
  err
3452
3695
  }, {
3453
3696
  F: __dxlog_file15,
3454
- L: 159,
3697
+ L: 163,
3455
3698
  S: this,
3456
3699
  C: (f, a) => f(...a)
3457
3700
  });
@@ -3488,7 +3731,7 @@ var LibDataChannelTransport = class {
3488
3731
  peer
3489
3732
  }, {
3490
3733
  F: __dxlog_file15,
3491
- L: 194,
3734
+ L: 198,
3492
3735
  S: this,
3493
3736
  C: (f, a) => f(...a)
3494
3737
  });
@@ -3516,7 +3759,7 @@ var LibDataChannelTransport = class {
3516
3759
  err
3517
3760
  }, {
3518
3761
  F: __dxlog_file15,
3519
- L: 205,
3762
+ L: 209,
3520
3763
  S: this,
3521
3764
  C: (f, a) => f(...a)
3522
3765
  });
@@ -3536,7 +3779,7 @@ var LibDataChannelTransport = class {
3536
3779
  err
3537
3780
  }, {
3538
3781
  F: __dxlog_file15,
3539
- L: 216,
3782
+ L: 220,
3540
3783
  S: this,
3541
3784
  C: (f, a) => f(...a)
3542
3785
  });
@@ -3555,7 +3798,7 @@ var LibDataChannelTransport = class {
3555
3798
  signal
3556
3799
  }, {
3557
3800
  F: __dxlog_file15,
3558
- L: 227,
3801
+ L: 231,
3559
3802
  S: this,
3560
3803
  C: (f, a) => f(...a)
3561
3804
  });
@@ -3564,10 +3807,50 @@ var LibDataChannelTransport = class {
3564
3807
  }).catch((err) => {
3565
3808
  import_log14.log.catch(err, void 0, {
3566
3809
  F: __dxlog_file15,
3567
- L: 232,
3810
+ L: 236,
3811
+ S: this,
3812
+ C: (f, a) => f(...a)
3813
+ });
3814
+ });
3815
+ }
3816
+ async getDetails() {
3817
+ return this._peer.then(async (peer) => {
3818
+ const cp = await peer.getSelectedCandidatePair();
3819
+ if (!cp) {
3820
+ return "unavailable";
3821
+ }
3822
+ return `${cp.remote.address}:${cp.remote.port}/${cp.remote.transportType} ${cp.remote.type}`;
3823
+ }).catch((err) => {
3824
+ import_log14.log.catch(err, void 0, {
3825
+ F: __dxlog_file15,
3826
+ L: 250,
3568
3827
  S: this,
3569
3828
  C: (f, a) => f(...a)
3570
3829
  });
3830
+ return "unavailable";
3831
+ });
3832
+ }
3833
+ async getStats() {
3834
+ return this._peer.then((peer) => {
3835
+ return {
3836
+ bytesSent: peer.bytesSent(),
3837
+ bytesReceived: peer.bytesReceived(),
3838
+ packetsSent: 0,
3839
+ packetsReceived: 0
3840
+ };
3841
+ }).catch((err) => {
3842
+ import_log14.log.catch(err, void 0, {
3843
+ F: __dxlog_file15,
3844
+ L: 266,
3845
+ S: this,
3846
+ C: (f, a) => f(...a)
3847
+ });
3848
+ return {
3849
+ bytesSent: 0,
3850
+ bytesReceived: 0,
3851
+ packetsSent: 0,
3852
+ packetsReceived: 0
3853
+ };
3571
3854
  });
3572
3855
  }
3573
3856
  // TODO(nf): add classmethod to call node-datachannel.cleanup() when all instances have been destroyed?
@@ -3587,7 +3870,7 @@ var createLibDataChannelTransportFactory = (webrtcConfig) => ({
3587
3870
  webrtcConfig
3588
3871
  })
3589
3872
  });
3590
- var __dxlog_file16 = "/home/circleci/project/packages/core/mesh/network-manager/src/transport/tcp-transport.ts";
3873
+ var __dxlog_file16 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/tcp-transport.ts";
3591
3874
  var TcpTransportFactory = {
3592
3875
  createTransport: (params) => new TcpTransport(params)
3593
3876
  };
@@ -3679,13 +3962,29 @@ var TcpTransport = class {
3679
3962
  host: "localhost"
3680
3963
  });
3681
3964
  }
3965
+ async getDetails() {
3966
+ if (this.options.initiator) {
3967
+ const { port: port2, address: address2 } = this._server?.address();
3968
+ return `LISTEN ${address2}:${port2}`;
3969
+ }
3970
+ const { port, address } = this._socket?.address();
3971
+ return `ACCEPT ${address}:${port}`;
3972
+ }
3973
+ async getStats() {
3974
+ return {
3975
+ bytesSent: 0,
3976
+ bytesReceived: 0,
3977
+ packetsSent: 0,
3978
+ packetsReceived: 0
3979
+ };
3980
+ }
3682
3981
  _handleSocket(socket) {
3683
3982
  (0, import_log15.log)("handling socket", {
3684
3983
  remotePort: socket.remotePort,
3685
3984
  localPort: socket.localPort
3686
3985
  }, {
3687
3986
  F: __dxlog_file16,
3688
- L: 91,
3987
+ L: 109,
3689
3988
  S: this,
3690
3989
  C: (f, a) => f(...a)
3691
3990
  });
@@ -3697,7 +3996,7 @@ var TcpTransport = class {
3697
3996
  port: this._socket?.remotePort
3698
3997
  }, {
3699
3998
  F: __dxlog_file16,
3700
- L: 97,
3999
+ L: 115,
3701
4000
  S: this,
3702
4001
  C: (f, a) => f(...a)
3703
4002
  });
@@ -3716,8 +4015,8 @@ var createTeleportProtocolFactory = (onConnection) => {
3716
4015
  const teleport = new import_teleport.Teleport(params);
3717
4016
  return {
3718
4017
  stream: teleport.stream,
3719
- open: async () => {
3720
- await teleport.open();
4018
+ open: async (sessionId) => {
4019
+ await teleport.open(sessionId);
3721
4020
  await onConnection(teleport);
3722
4021
  },
3723
4022
  close: async () => {
@@ -3758,4 +4057,4 @@ var createTeleportProtocolFactory = (onConnection) => {
3758
4057
  createSimplePeerTransportFactory,
3759
4058
  createTeleportProtocolFactory
3760
4059
  });
3761
- //# sourceMappingURL=chunk-RBHZCZH4.cjs.map
4060
+ //# sourceMappingURL=chunk-WUBZ4UOJ.cjs.map