@dxos/network-manager 0.3.9-main.1d6fb54 → 0.3.9-main.320ebac

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 (54) hide show
  1. package/dist/lib/browser/{chunk-4HITD6WI.mjs → chunk-S2JHWVGQ.mjs} +237 -62
  2. package/dist/lib/browser/chunk-S2JHWVGQ.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-3SCPMSHV.cjs} +246 -61
  7. package/dist/lib/node/chunk-3SCPMSHV.cjs.map +7 -0
  8. package/dist/lib/node/{chunk-XE5JOIGD.cjs → chunk-DMWORJG3.cjs} +13 -4
  9. package/dist/lib/node/chunk-DMWORJG3.cjs.map +7 -0
  10. package/dist/lib/node/{datachannel-53JZPGFA.cjs → datachannel-ABYQKZRC.cjs} +9 -9
  11. package/dist/lib/node/{datachannel-53JZPGFA.cjs.map → datachannel-ABYQKZRC.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/transport/datachannel/rtc-peer-connection.d.ts +7 -0
  20. package/dist/types/src/transport/datachannel/rtc-peer-connection.d.ts.map +1 -1
  21. package/dist/types/src/transport/libdatachannel-transport.d.ts +3 -1
  22. package/dist/types/src/transport/libdatachannel-transport.d.ts.map +1 -1
  23. package/dist/types/src/transport/memory-transport.d.ts +3 -1
  24. package/dist/types/src/transport/memory-transport.d.ts.map +1 -1
  25. package/dist/types/src/transport/simplepeer-transport-proxy.d.ts +3 -1
  26. package/dist/types/src/transport/simplepeer-transport-proxy.d.ts.map +1 -1
  27. package/dist/types/src/transport/simplepeer-transport-service.d.ts +3 -1
  28. package/dist/types/src/transport/simplepeer-transport-service.d.ts.map +1 -1
  29. package/dist/types/src/transport/simplepeer-transport.d.ts +4 -1
  30. package/dist/types/src/transport/simplepeer-transport.d.ts.map +1 -1
  31. package/dist/types/src/transport/tcp-transport.browser.d.ts +3 -1
  32. package/dist/types/src/transport/tcp-transport.browser.d.ts.map +1 -1
  33. package/dist/types/src/transport/tcp-transport.d.ts +3 -1
  34. package/dist/types/src/transport/tcp-transport.d.ts.map +1 -1
  35. package/dist/types/src/transport/transport.d.ts +17 -0
  36. package/dist/types/src/transport/transport.d.ts.map +1 -1
  37. package/dist/types/src/wire-protocol.d.ts +1 -1
  38. package/dist/types/src/wire-protocol.d.ts.map +1 -1
  39. package/package.json +17 -17
  40. package/src/connection-log.ts +14 -1
  41. package/src/swarm/connection.ts +23 -4
  42. package/src/transport/datachannel/rtc-peer-connection.ts +13 -1
  43. package/src/transport/libdatachannel-transport.ts +37 -1
  44. package/src/transport/memory-transport.ts +14 -1
  45. package/src/transport/simplepeer-transport-proxy.ts +9 -1
  46. package/src/transport/simplepeer-transport-service.ts +14 -0
  47. package/src/transport/simplepeer-transport.ts +63 -2
  48. package/src/transport/tcp-transport.browser.ts +9 -1
  49. package/src/transport/tcp-transport.ts +19 -1
  50. package/src/transport/transport.ts +19 -0
  51. package/src/wire-protocol.ts +3 -3
  52. package/dist/lib/browser/chunk-4HITD6WI.mjs.map +0 -7
  53. package/dist/lib/node/chunk-6AD7QA4X.cjs.map +0 -7
  54. 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_3SCPMSHV_exports = {};
30
+ __export(chunk_3SCPMSHV_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_3SCPMSHV_exports);
59
+ var import_chunk_DMWORJG3 = require("./chunk-DMWORJG3.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
  }
@@ -2757,6 +2783,17 @@ var MemoryTransport = class _MemoryTransport {
2757
2783
  this._remote.wake(remoteId);
2758
2784
  }
2759
2785
  }
2786
+ async getDetails() {
2787
+ return this._instanceId.toHex();
2788
+ }
2789
+ async getStats() {
2790
+ return {
2791
+ bytesSent: 0,
2792
+ bytesReceived: 0,
2793
+ packetsSent: 0,
2794
+ packetsReceived: 0
2795
+ };
2796
+ }
2760
2797
  };
2761
2798
  _ts_decorate4([
2762
2799
  import_log10.logInfo
@@ -2774,7 +2811,7 @@ var TransportKind;
2774
2811
  })(TransportKind || (TransportKind = {}));
2775
2812
  var wrtc = null;
2776
2813
  try {
2777
- wrtc = (0, import_chunk_XE5JOIGD.__require)("@koush/wrtc");
2814
+ wrtc = (0, import_chunk_DMWORJG3.__require)("@koush/wrtc");
2778
2815
  } catch {
2779
2816
  }
2780
2817
  var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/simplepeer-transport.ts";
@@ -2899,7 +2936,7 @@ var SimplePeerTransport = class {
2899
2936
  this._peer._pc.getStats().then((stats) => {
2900
2937
  import_log11.log.info("report after webrtc error", {
2901
2938
  config: this.params.webrtcConfig,
2902
- stats
2939
+ stats: Object.fromEntries(stats.entries())
2903
2940
  }, {
2904
2941
  F: __dxlog_file12,
2905
2942
  L: 113,
@@ -2922,15 +2959,68 @@ var SimplePeerTransport = class {
2922
2959
  id: this._instanceId
2923
2960
  }), {
2924
2961
  F: __dxlog_file12,
2925
- L: 125,
2962
+ L: 126,
2926
2963
  S: this,
2927
2964
  C: (f, a) => f(...a)
2928
2965
  });
2929
2966
  }
2967
+ async getStats() {
2968
+ const stats = await this._getStats();
2969
+ if (!stats) {
2970
+ return {
2971
+ bytesSent: 0,
2972
+ bytesReceived: 0,
2973
+ packetsSent: 0,
2974
+ packetsReceived: 0,
2975
+ rawStats: {}
2976
+ };
2977
+ }
2978
+ return {
2979
+ bytesSent: stats.transport.bytesSent,
2980
+ bytesReceived: stats.transport.bytesReceived,
2981
+ packetsSent: stats.transport.messagesSent,
2982
+ packetsReceived: stats.transport.messagesReceived,
2983
+ rawStats: stats.raw
2984
+ };
2985
+ }
2986
+ async _getStats() {
2987
+ if (typeof this._peer?._pc?.getStats !== "function") {
2988
+ return null;
2989
+ }
2990
+ return await this._peer._pc.getStats().then((stats) => {
2991
+ const statsEntries = Array.from(stats.entries());
2992
+ const transport = statsEntries.filter((s) => s[1].type === "transport")[0][1];
2993
+ const candidatePair = statsEntries.filter((s) => s[0] === transport.selectedCandidatePairId);
2994
+ let selectedCandidatePair;
2995
+ let remoteCandidate;
2996
+ if (candidatePair.length > 0) {
2997
+ selectedCandidatePair = candidatePair[0][1];
2998
+ remoteCandidate = statsEntries.filter((s) => s[0] === selectedCandidatePair.remoteCandidateId)[0][1];
2999
+ }
3000
+ return {
3001
+ datachannel: statsEntries.filter((s) => s[1].type === "data-channel")[0][1],
3002
+ transport,
3003
+ selectedCandidatePair,
3004
+ remoteCandidate,
3005
+ raw: Object.fromEntries(stats.entries())
3006
+ };
3007
+ });
3008
+ }
3009
+ async getDetails() {
3010
+ const stats = await this._getStats();
3011
+ const rc = stats?.remoteCandidate;
3012
+ if (!rc) {
3013
+ return "unavailable";
3014
+ }
3015
+ if (rc.relay) {
3016
+ return `${rc.ip}:${rc.port}/${rc.protocol} relay for XXX ${rc.candidateType}`;
3017
+ }
3018
+ return `${rc.ip}:${rc.port}/${rc.protocol} ${rc.candidateType}`;
3019
+ }
2930
3020
  async destroy() {
2931
3021
  (0, import_log11.log)("closing...", void 0, {
2932
3022
  F: __dxlog_file12,
2933
- L: 129,
3023
+ L: 189,
2934
3024
  S: this,
2935
3025
  C: (f, a) => f(...a)
2936
3026
  });
@@ -2940,10 +3030,11 @@ var SimplePeerTransport = class {
2940
3030
  this._closed = true;
2941
3031
  this._disconnectStreams();
2942
3032
  this._peer.destroy();
3033
+ this._closed = true;
2943
3034
  this.closed.emit();
2944
3035
  (0, import_log11.log)("closed", void 0, {
2945
3036
  F: __dxlog_file12,
2946
- L: 137,
3037
+ L: 198,
2947
3038
  S: this,
2948
3039
  C: (f, a) => f(...a)
2949
3040
  });
@@ -3049,7 +3140,7 @@ var SimplePeerTransportService = class {
3049
3140
  async sendSignal({ proxyId, signal }) {
3050
3141
  (0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
3051
3142
  F: __dxlog_file13,
3052
- L: 112,
3143
+ L: 116,
3053
3144
  S: this,
3054
3145
  A: [
3055
3146
  "this.transports.has(proxyId)",
@@ -3058,18 +3149,46 @@ var SimplePeerTransportService = class {
3058
3149
  });
3059
3150
  await this.transports.get(proxyId).transport.signal(signal);
3060
3151
  }
3152
+ async getDetails({ proxyId }) {
3153
+ (0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
3154
+ F: __dxlog_file13,
3155
+ L: 121,
3156
+ S: this,
3157
+ A: [
3158
+ "this.transports.has(proxyId)",
3159
+ ""
3160
+ ]
3161
+ });
3162
+ return {
3163
+ details: await this.transports.get(proxyId).transport.getDetails()
3164
+ };
3165
+ }
3166
+ async getStats({ proxyId }) {
3167
+ (0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
3168
+ F: __dxlog_file13,
3169
+ L: 126,
3170
+ S: this,
3171
+ A: [
3172
+ "this.transports.has(proxyId)",
3173
+ ""
3174
+ ]
3175
+ });
3176
+ return {
3177
+ stats: await this.transports.get(proxyId).transport.getStats()
3178
+ };
3179
+ }
3061
3180
  async sendData({ proxyId, payload }) {
3062
3181
  if (this.transports.get(proxyId)?.state !== "OPEN") {
3063
3182
  import_log12.log.debug("transport is closed", void 0, {
3064
3183
  F: __dxlog_file13,
3065
- L: 118,
3184
+ L: 132,
3066
3185
  S: this,
3067
3186
  C: (f, a) => f(...a)
3068
3187
  });
3069
3188
  }
3070
3189
  (0, import_invariant11.invariant)(this.transports.has(proxyId), void 0, {
3071
3190
  F: __dxlog_file13,
3072
- L: 120,
3191
+ L: 134,
3073
3192
  S: this,
3074
3193
  A: [
3075
3194
  "this.transports.has(proxyId)",
@@ -3092,7 +3211,7 @@ var SimplePeerTransportService = class {
3092
3211
  }
3093
3212
  (0, import_log12.log)("Closed.", void 0, {
3094
3213
  F: __dxlog_file13,
3095
- L: 136,
3214
+ L: 150,
3096
3215
  S: this,
3097
3216
  C: (f, a) => f(...a)
3098
3217
  });
@@ -3219,6 +3338,16 @@ var SimplePeerTransportProxy = class {
3219
3338
  signal
3220
3339
  }).catch((err) => this.errors.raise(decodeError(err)));
3221
3340
  }
3341
+ async getDetails() {
3342
+ return (await this._params.bridgeService.getDetails({
3343
+ proxyId: this._proxyId
3344
+ })).details;
3345
+ }
3346
+ async getStats() {
3347
+ return (await this._params.bridgeService.getStats({
3348
+ proxyId: this._proxyId
3349
+ })).stats;
3350
+ }
3222
3351
  // TODO(burdon): Move open from constructor.
3223
3352
  async destroy() {
3224
3353
  await this._ctx.dispose();
@@ -3233,7 +3362,7 @@ var SimplePeerTransportProxy = class {
3233
3362
  } catch (err) {
3234
3363
  import_log13.log.catch(err, void 0, {
3235
3364
  F: __dxlog_file14,
3236
- L: 160,
3365
+ L: 168,
3237
3366
  S: this,
3238
3367
  C: (f, a) => f(...a)
3239
3368
  });
@@ -3269,7 +3398,7 @@ var SimplePeerTransportProxyFactory = class {
3269
3398
  createTransport(options) {
3270
3399
  (0, import_invariant12.invariant)(this._bridgeService, "SimplePeerTransportProxyFactory is not ready to open connections", {
3271
3400
  F: __dxlog_file14,
3272
- L: 197,
3401
+ L: 205,
3273
3402
  S: this,
3274
3403
  A: [
3275
3404
  "this._bridgeService",
@@ -3326,7 +3455,7 @@ var LibDataChannelTransport = class {
3326
3455
  this._readyForCandidates = new import_async11.Trigger();
3327
3456
  this._writeCallback = null;
3328
3457
  this._peer = (async () => {
3329
- const { RTCPeerConnection: PeerConnection } = await import("./datachannel-53JZPGFA.cjs");
3458
+ const { RTCPeerConnection: PeerConnection } = await import("./datachannel-ABYQKZRC.cjs");
3330
3459
  if (this._closed) {
3331
3460
  this.errors.raise(new Error("connection already closed"));
3332
3461
  }
@@ -3622,6 +3751,46 @@ var LibDataChannelTransport = class {
3622
3751
  });
3623
3752
  });
3624
3753
  }
3754
+ async getDetails() {
3755
+ return this._peer.then(async (peer) => {
3756
+ const cp = await peer.getSelectedCandidatePair();
3757
+ if (!cp) {
3758
+ return "unavailable";
3759
+ }
3760
+ return `${cp.remote.address}:${cp.remote.port}/${cp.remote.transportType} ${cp.remote.type}`;
3761
+ }).catch((err) => {
3762
+ import_log14.log.catch(err, void 0, {
3763
+ F: __dxlog_file15,
3764
+ L: 250,
3765
+ S: this,
3766
+ C: (f, a) => f(...a)
3767
+ });
3768
+ return "unavailable";
3769
+ });
3770
+ }
3771
+ async getStats() {
3772
+ return this._peer.then((peer) => {
3773
+ return {
3774
+ bytesSent: peer.bytesSent(),
3775
+ bytesReceived: peer.bytesReceived(),
3776
+ packetsSent: 0,
3777
+ packetsReceived: 0
3778
+ };
3779
+ }).catch((err) => {
3780
+ import_log14.log.catch(err, void 0, {
3781
+ F: __dxlog_file15,
3782
+ L: 266,
3783
+ S: this,
3784
+ C: (f, a) => f(...a)
3785
+ });
3786
+ return {
3787
+ bytesSent: 0,
3788
+ bytesReceived: 0,
3789
+ packetsSent: 0,
3790
+ packetsReceived: 0
3791
+ };
3792
+ });
3793
+ }
3625
3794
  // TODO(nf): add classmethod to call node-datachannel.cleanup() when all instances have been destroyed?
3626
3795
  async destroy() {
3627
3796
  await this._close();
@@ -3731,13 +3900,29 @@ var TcpTransport = class {
3731
3900
  host: "localhost"
3732
3901
  });
3733
3902
  }
3903
+ async getDetails() {
3904
+ if (this.options.initiator) {
3905
+ const { port: port2, address: address2 } = this._server?.address();
3906
+ return `LISTEN ${address2}:${port2}`;
3907
+ }
3908
+ const { port, address } = this._socket?.address();
3909
+ return `ACCEPT ${address}:${port}`;
3910
+ }
3911
+ async getStats() {
3912
+ return {
3913
+ bytesSent: 0,
3914
+ bytesReceived: 0,
3915
+ packetsSent: 0,
3916
+ packetsReceived: 0
3917
+ };
3918
+ }
3734
3919
  _handleSocket(socket) {
3735
3920
  (0, import_log15.log)("handling socket", {
3736
3921
  remotePort: socket.remotePort,
3737
3922
  localPort: socket.localPort
3738
3923
  }, {
3739
3924
  F: __dxlog_file16,
3740
- L: 91,
3925
+ L: 109,
3741
3926
  S: this,
3742
3927
  C: (f, a) => f(...a)
3743
3928
  });
@@ -3749,7 +3934,7 @@ var TcpTransport = class {
3749
3934
  port: this._socket?.remotePort
3750
3935
  }, {
3751
3936
  F: __dxlog_file16,
3752
- L: 97,
3937
+ L: 115,
3753
3938
  S: this,
3754
3939
  C: (f, a) => f(...a)
3755
3940
  });
@@ -3768,8 +3953,8 @@ var createTeleportProtocolFactory = (onConnection) => {
3768
3953
  const teleport = new import_teleport.Teleport(params);
3769
3954
  return {
3770
3955
  stream: teleport.stream,
3771
- open: async () => {
3772
- await teleport.open();
3956
+ open: async (sessionId) => {
3957
+ await teleport.open(sessionId);
3773
3958
  await onConnection(teleport);
3774
3959
  },
3775
3960
  close: async () => {
@@ -3810,4 +3995,4 @@ var createTeleportProtocolFactory = (onConnection) => {
3810
3995
  createSimplePeerTransportFactory,
3811
3996
  createTeleportProtocolFactory
3812
3997
  });
3813
- //# sourceMappingURL=chunk-6AD7QA4X.cjs.map
3998
+ //# sourceMappingURL=chunk-3SCPMSHV.cjs.map