@dxos/network-manager 0.1.35 → 0.1.36-next.ef27157

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.
@@ -433,8 +433,8 @@ var MessageRouter = class {
433
433
 
434
434
  // packages/core/mesh/network-manager/src/swarm/swarm.ts
435
435
  import assert4 from "@dxos/node-std/assert";
436
- import { Event as Event2, scheduleTask, sleep, synchronized as synchronized3 } from "@dxos/async";
437
- import { Context } from "@dxos/context";
436
+ import { Event as Event2, scheduleTask as scheduleTask2, sleep, synchronized as synchronized3 } from "@dxos/async";
437
+ import { Context as Context2 } from "@dxos/context";
438
438
  import { ErrorStream as ErrorStream2 } from "@dxos/debug";
439
439
  import { PublicKey as PublicKey4 } from "@dxos/keys";
440
440
  import { log as log4, logInfo } from "@dxos/log";
@@ -443,7 +443,8 @@ import { ComplexMap as ComplexMap2, isNotNullOrUndefined } from "@dxos/util";
443
443
 
444
444
  // packages/core/mesh/network-manager/src/swarm/peer.ts
445
445
  import assert3 from "@dxos/node-std/assert";
446
- import { synchronized as synchronized2 } from "@dxos/async";
446
+ import { scheduleTask, synchronized as synchronized2 } from "@dxos/async";
447
+ import { Context } from "@dxos/context";
447
448
  import { PublicKey as PublicKey3 } from "@dxos/keys";
448
449
  import { log as log3 } from "@dxos/log";
449
450
  var __decorate2 = function(decorators, target, key, desc) {
@@ -456,6 +457,7 @@ var __decorate2 = function(decorators, target, key, desc) {
456
457
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
457
458
  return c > 3 && r && Object.defineProperty(target, key, r), r;
458
459
  };
460
+ var CONNECTION_COUNTS_STABLE_AFTER = 5e3;
459
461
  var Peer = class {
460
462
  constructor(id, topic, localPeerId, _signalMessaging, _protocolProvider, _transportFactory, _callbacks) {
461
463
  this.id = id;
@@ -465,6 +467,9 @@ var Peer = class {
465
467
  this._protocolProvider = _protocolProvider;
466
468
  this._transportFactory = _transportFactory;
467
469
  this._callbacks = _callbacks;
470
+ this._availableAfter = 0;
471
+ this.availableToConnect = true;
472
+ this._ctx = new Context();
468
473
  this.advertizing = false;
469
474
  this.initiating = false;
470
475
  }
@@ -481,7 +486,7 @@ var Peer = class {
481
486
  peerId: this.localPeerId
482
487
  }, {
483
488
  file: "peer.ts",
484
- line: 86,
489
+ line: 107,
485
490
  scope: this,
486
491
  callSite: (f, a) => f(...a)
487
492
  });
@@ -508,7 +513,7 @@ var Peer = class {
508
513
  err
509
514
  }, {
510
515
  file: "peer.ts",
511
- line: 110,
516
+ line: 131,
512
517
  scope: this,
513
518
  callSite: (f, a) => f(...a)
514
519
  });
@@ -537,7 +542,7 @@ var Peer = class {
537
542
  sessionId
538
543
  }, {
539
544
  file: "peer.ts",
540
- line: 128,
545
+ line: 149,
541
546
  scope: this,
542
547
  callSite: (f, a) => f(...a)
543
548
  });
@@ -560,14 +565,14 @@ var Peer = class {
560
565
  remoteId: this.id
561
566
  }, {
562
567
  file: "peer.ts",
563
- line: 140,
568
+ line: 161,
564
569
  scope: this,
565
570
  callSite: (f, a) => f(...a)
566
571
  });
567
572
  if (connection.state !== ConnectionState.INITIAL) {
568
573
  log3("ignoring response", {}, {
569
574
  file: "peer.ts",
570
- line: 142,
575
+ line: 163,
571
576
  scope: this,
572
577
  callSite: (f, a) => f(...a)
573
578
  });
@@ -587,7 +592,7 @@ var Peer = class {
587
592
  err
588
593
  }, {
589
594
  file: "peer.ts",
590
- line: 153,
595
+ line: 174,
591
596
  scope: this,
592
597
  callSite: (f, a) => f(...a)
593
598
  });
@@ -602,6 +607,7 @@ var Peer = class {
602
607
  * Either we're initiating a connection or creating one in response to an offer from the other peer.
603
608
  */
604
609
  _createConnection(initiator, sessionId) {
610
+ var _a;
605
611
  log3("creating connection", {
606
612
  topic: this.topic,
607
613
  peerId: this.localPeerId,
@@ -610,7 +616,7 @@ var Peer = class {
610
616
  sessionId
611
617
  }, {
612
618
  file: "peer.ts",
613
- line: 167,
619
+ line: 188,
614
620
  scope: this,
615
621
  callSite: (f, a) => f(...a)
616
622
  });
@@ -633,9 +639,13 @@ var Peer = class {
633
639
  );
634
640
  connection._traceParent = this._traceParent;
635
641
  this._callbacks.onInitiated(connection);
642
+ void ((_a = this._connectionCtx) == null ? void 0 : _a.dispose());
643
+ this._connectionCtx = this._ctx.derive();
636
644
  connection.stateChanged.on((state) => {
637
645
  switch (state) {
638
646
  case ConnectionState.CONNECTED: {
647
+ this.availableToConnect = true;
648
+ this._lastConnectionTime = Date.now();
639
649
  this._callbacks.onConnected();
640
650
  break;
641
651
  }
@@ -647,13 +657,23 @@ var Peer = class {
647
657
  initiator
648
658
  }, {
649
659
  file: "peer.ts",
650
- line: 197,
660
+ line: 224,
651
661
  scope: this,
652
662
  callSite: (f, a) => f(...a)
653
663
  });
654
664
  assert3(this.connection === connection, "Connection mismatch (race condition).");
665
+ if (this._lastConnectionTime && this._lastConnectionTime + CONNECTION_COUNTS_STABLE_AFTER < Date.now()) {
666
+ this._availableAfter = 0;
667
+ } else {
668
+ this.availableToConnect = false;
669
+ this._availableAfter = increaseInterval(this._availableAfter);
670
+ }
655
671
  this.connection = void 0;
656
672
  this._callbacks.onDisconnected();
673
+ scheduleTask(this._connectionCtx, () => {
674
+ this.availableToConnect = true;
675
+ this._callbacks.onPeerAvailable();
676
+ }, this._availableAfter);
657
677
  break;
658
678
  }
659
679
  }
@@ -667,7 +687,7 @@ var Peer = class {
667
687
  err
668
688
  }, {
669
689
  file: "peer.ts",
670
- line: 207,
690
+ line: 252,
671
691
  scope: this,
672
692
  callSite: (f, a) => f(...a)
673
693
  });
@@ -686,7 +706,7 @@ var Peer = class {
686
706
  sessionId: connection.sessionId
687
707
  }, {
688
708
  file: "peer.ts",
689
- line: 223,
709
+ line: 268,
690
710
  scope: this,
691
711
  callSite: (f, a) => f(...a)
692
712
  });
@@ -696,7 +716,7 @@ var Peer = class {
696
716
  sessionId: connection.sessionId
697
717
  }, {
698
718
  file: "peer.ts",
699
- line: 229,
719
+ line: 274,
700
720
  scope: this,
701
721
  callSite: (f, a) => f(...a)
702
722
  });
@@ -707,7 +727,7 @@ var Peer = class {
707
727
  message
708
728
  }, {
709
729
  file: "peer.ts",
710
- line: 234,
730
+ line: 279,
711
731
  scope: this,
712
732
  callSite: (f, a) => f(...a)
713
733
  });
@@ -717,12 +737,13 @@ var Peer = class {
717
737
  }
718
738
  async destroy() {
719
739
  var _a;
740
+ await this._ctx.dispose();
720
741
  log3("Destroying peer", {
721
742
  peerId: this.id,
722
743
  topic: this.topic
723
744
  }, {
724
745
  file: "peer.ts",
725
- line: 242,
746
+ line: 288,
726
747
  scope: this,
727
748
  callSite: (f, a) => f(...a)
728
749
  });
@@ -732,6 +753,18 @@ var Peer = class {
732
753
  __decorate2([
733
754
  synchronized2
734
755
  ], Peer.prototype, "destroy", null);
756
+ var increaseInterval = (interval) => {
757
+ if (interval === 0) {
758
+ return 50;
759
+ } else if (interval < 500) {
760
+ return 500;
761
+ } else if (interval < 1e3) {
762
+ return 1e3;
763
+ } else if (interval < 5e3) {
764
+ return 5e3;
765
+ }
766
+ return 1e4;
767
+ };
735
768
 
736
769
  // packages/core/mesh/network-manager/src/swarm/swarm.ts
737
770
  var __decorate3 = function(decorators, target, key, desc) {
@@ -758,7 +791,7 @@ var Swarm = class {
758
791
  this._transportFactory = _transportFactory;
759
792
  this._label = _label;
760
793
  this._peers = new ComplexMap2(PublicKey4.hash);
761
- this._ctx = new Context();
794
+ this._ctx = new Context2();
762
795
  this.connectionAdded = new Event2();
763
796
  this.disconnected = new Event2();
764
797
  this.connected = new Event2();
@@ -998,7 +1031,7 @@ var Swarm = class {
998
1031
  }
999
1032
  // For debug purposes
1000
1033
  async goOnline() {
1001
- this._ctx = new Context();
1034
+ this._ctx = new Context2();
1002
1035
  }
1003
1036
  _getOrCreatePeer(peerId) {
1004
1037
  let peer = this._peers.get(peerId);
@@ -1027,6 +1060,9 @@ var Swarm = class {
1027
1060
  },
1028
1061
  onOffer: (remoteId) => {
1029
1062
  return this._topology.onOffer(remoteId);
1063
+ },
1064
+ onPeerAvailable: () => {
1065
+ this._topology.update();
1030
1066
  }
1031
1067
  });
1032
1068
  peer._traceParent = this._instanceId;
@@ -1044,19 +1080,19 @@ var Swarm = class {
1044
1080
  getState: () => ({
1045
1081
  ownPeerId: this._ownPeerId,
1046
1082
  connected: Array.from(this._peers.values()).filter((peer) => peer.connection).map((peer) => peer.id),
1047
- candidates: Array.from(this._peers.values()).filter((peer) => !peer.connection && peer.advertizing).map((peer) => peer.id)
1083
+ candidates: Array.from(this._peers.values()).filter((peer) => !peer.connection && peer.advertizing && peer.availableToConnect).map((peer) => peer.id)
1048
1084
  }),
1049
1085
  connect: (peer) => {
1050
1086
  if (this._ctx.disposed) {
1051
1087
  return;
1052
1088
  }
1053
- scheduleTask(this._ctx, async () => {
1089
+ scheduleTask2(this._ctx, async () => {
1054
1090
  try {
1055
1091
  await this._initiateConnection(peer);
1056
1092
  } catch (err) {
1057
1093
  log4.warn("initiation error", err, {
1058
1094
  file: "swarm.ts",
1059
- line: 317,
1095
+ line: 320,
1060
1096
  scope: this,
1061
1097
  callSite: (f, a) => f(...a)
1062
1098
  });
@@ -1067,7 +1103,7 @@ var Swarm = class {
1067
1103
  if (this._ctx.disposed) {
1068
1104
  return;
1069
1105
  }
1070
- scheduleTask(this._ctx, async () => {
1106
+ scheduleTask2(this._ctx, async () => {
1071
1107
  await this._closeConnection(peer);
1072
1108
  this._topology.update();
1073
1109
  });
@@ -1084,7 +1120,7 @@ var Swarm = class {
1084
1120
  remoteId
1085
1121
  }, {
1086
1122
  file: "swarm.ts",
1087
- line: 344,
1123
+ line: 347,
1088
1124
  scope: this,
1089
1125
  callSite: (f, a) => f(...a)
1090
1126
  });
@@ -1101,7 +1137,7 @@ var Swarm = class {
1101
1137
  remoteId
1102
1138
  }, {
1103
1139
  file: "swarm.ts",
1104
- line: 358,
1140
+ line: 361,
1105
1141
  scope: this,
1106
1142
  callSite: (f, a) => f(...a)
1107
1143
  });
@@ -1111,7 +1147,7 @@ var Swarm = class {
1111
1147
  remoteId
1112
1148
  }, {
1113
1149
  file: "swarm.ts",
1114
- line: 361,
1150
+ line: 364,
1115
1151
  scope: this,
1116
1152
  callSite: (f, a) => f(...a)
1117
1153
  });
@@ -2098,7 +2134,7 @@ var WebRTCTransportService = class {
2098
2134
  // packages/core/mesh/network-manager/src/transport/webrtc-transport-proxy.ts
2099
2135
  import assert12 from "@dxos/node-std/assert";
2100
2136
  import { Event as Event8 } from "@dxos/async";
2101
- import { Context as Context2 } from "@dxos/context";
2137
+ import { Context as Context3 } from "@dxos/context";
2102
2138
  import { ErrorStream as ErrorStream5 } from "@dxos/debug";
2103
2139
  import { PublicKey as PublicKey11 } from "@dxos/keys";
2104
2140
  import { log as log12 } from "@dxos/log";
@@ -2108,7 +2144,7 @@ var WebRTCTransportProxy = class {
2108
2144
  constructor(_params) {
2109
2145
  this._params = _params;
2110
2146
  this._proxyId = PublicKey11.random();
2111
- this._ctx = new Context2();
2147
+ this._ctx = new Context3();
2112
2148
  this.closed = new Event8();
2113
2149
  this._closed = false;
2114
2150
  this.connected = new Event8();
@@ -2284,4 +2320,4 @@ export {
2284
2320
  WebRTCTransportProxyFactory,
2285
2321
  createTeleportProtocolFactory
2286
2322
  };
2287
- //# sourceMappingURL=chunk-4W77MFHZ.mjs.map
2323
+ //# sourceMappingURL=chunk-KOU3LGWY.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/swarm/connection.ts", "../../../src/signal/message-router.ts", "../../../src/swarm/swarm.ts", "../../../src/swarm/peer.ts", "../../../src/swarm/swarm-mapper.ts", "../../../src/connection-log.ts", "../../../src/network-manager.ts", "../../../src/topology/fully-connected-topology.ts", "../../../src/topology/mmst-topology.ts", "../../../src/topology/star-topology.ts", "../../../src/transport/memory-transport.ts", "../../../src/transport/webrtc-transport.ts", "../../../src/transport/webrtc.ts", "../../../src/transport/webrtc-transport-service.ts", "../../../src/transport/webrtc-transport-proxy.ts", "../../../src/wire-protocol.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2021 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event, synchronized } from '@dxos/async';\nimport { ErrorStream } from '@dxos/debug';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/protocols';\nimport { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';\n\nimport { SignalMessage, SignalMessenger } from '../signal';\nimport { Transport, TransportFactory } from '../transport';\nimport { WireProtocol } from '../wire-protocol';\n\n/**\n * State machine for each connection.\n */\nexport enum ConnectionState {\n /**\n * Initial state. Connection is registered but no attempt to connect to the remote peer has been performed.\n * Might mean that we are waiting for the answer signal from the remote peer.\n */\n INITIAL = 'INITIAL',\n\n /**\n * Trying to establish connection.\n */\n CONNECTING = 'CONNECTING',\n\n /**\n * Connection is established.\n */\n CONNECTED = 'CONNECTED',\n\n /**\n * Connection is being closed.\n */\n CLOSING = 'CLOSING',\n\n /**\n * Connection closed.\n */\n CLOSED = 'CLOSED'\n}\n\n/**\n * Represents a connection to a remote peer.\n * Owns a transport paired together with a wire-protocol.\n */\nexport class Connection {\n private _state: ConnectionState = ConnectionState.INITIAL;\n private _transport: Transport | undefined;\n private _bufferedSignals: Signal[] = [];\n\n readonly stateChanged = new Event<ConnectionState>();\n readonly errors = new ErrorStream();\n\n public _instanceId = PublicKey.random().toHex();\n public _traceParent?: string;\n public _performance = {\n signalsSent: 0\n };\n\n constructor(\n public readonly topic: PublicKey,\n public readonly ownId: PublicKey, // TODO(burdon): peerID?\n public readonly remoteId: PublicKey,\n public readonly sessionId: PublicKey,\n public readonly initiator: boolean,\n private readonly _signalMessaging: SignalMessenger,\n private readonly _protocol: WireProtocol,\n private readonly _transportFactory: TransportFactory\n ) {}\n\n get state() {\n return this._state;\n }\n\n get transport() {\n return this._transport;\n }\n\n get protocol() {\n return this._protocol;\n }\n\n /**\n * Create an underlying transport and prepares it for the connection.\n */\n // TODO(burdon): Make async?\n openConnection() {\n assert(this._state === ConnectionState.INITIAL, 'Invalid state.');\n this._changeState(ConnectionState.CONNECTING);\n log.trace('dxos.mesh.connection', trace.begin({ id: this._instanceId, parentId: this._traceParent }));\n\n // TODO(dmaretskyi): Initialize only after the transport has established connection.\n this._protocol.initialize().catch((err) => {\n this.errors.raise(err);\n });\n\n // TODO(dmaretskyi): Piped streams should do this automatically, but it break's without this code.\n this._protocol.stream.on('close', () => {\n log('protocol stream closed');\n this.close().catch((err) => this.errors.raise(err));\n });\n\n assert(!this._transport);\n this._transport = this._transportFactory.createTransport({\n initiator: this.initiator,\n stream: this._protocol.stream,\n sendSignal: async (signal) => {\n this._performance.signalsSent++;\n await this._signalMessaging.signal({\n author: this.ownId,\n recipient: this.remoteId,\n sessionId: this.sessionId,\n topic: this.topic,\n data: { signal }\n });\n }\n });\n\n this._transport.connected.once(() => {\n this._changeState(ConnectionState.CONNECTED);\n });\n\n this._transport.closed.once(() => {\n this._transport = undefined;\n this.close().catch((err) => this.errors.raise(err));\n });\n\n this._transport.errors.handle((err) => {\n if (this._state !== ConnectionState.CLOSED && this._state !== ConnectionState.CLOSING) {\n this.errors.raise(err);\n }\n });\n\n // Replay signals that were received before transport was created.\n for (const signal of this._bufferedSignals) {\n void this._transport.signal(signal); // TODO(burdon): Remove async?\n }\n\n this._bufferedSignals = [];\n }\n\n @synchronized\n async close() {\n if (this._state === ConnectionState.CLOSED) {\n return;\n }\n this._changeState(ConnectionState.CLOSING);\n\n log('closing...', { peerId: this.ownId });\n\n try {\n // Gracefully close the stream flushing any unsent data packets.\n await this._protocol.destroy();\n } catch (err: any) {\n log.catch(err);\n }\n\n try {\n // After the transport is closed streams are disconnected.\n await this._transport?.destroy();\n } catch (err: any) {\n log.catch(err);\n }\n\n log('closed', { peerId: this.ownId });\n this._changeState(ConnectionState.CLOSED);\n log.trace(\n 'dxos.mesh.connection',\n trace.end({ id: this._instanceId, status: 'ok', data: { performance: this._performance } })\n );\n }\n\n async signal(msg: SignalMessage) {\n assert(msg.sessionId);\n if (!msg.sessionId.equals(this.sessionId)) {\n log('dropping signal for incorrect session id');\n return;\n }\n assert(msg.data.signal);\n assert(msg.author?.equals(this.remoteId));\n assert(msg.recipient?.equals(this.ownId));\n\n if (this._state === ConnectionState.INITIAL) {\n log('buffered signal', { peerId: this.ownId, remoteId: this.remoteId, msg: msg.data });\n this._bufferedSignals.push(msg.data.signal);\n return;\n }\n\n assert(this._transport, 'Connection not ready to accept signals.');\n log('received signal', { peerId: this.ownId, remoteId: this.remoteId, msg: msg.data });\n await this._transport.signal(msg.data.signal);\n }\n\n private _changeState(state: ConnectionState): void {\n log('stateChanged', { from: this._state, too: state, peerId: this.ownId });\n assert(state !== this._state, 'Already in this state.');\n this._state = state;\n this.stateChanged.emit(state);\n }\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Any } from '@dxos/codec-protobuf';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { Answer, SwarmMessage } from '@dxos/protocols/proto/dxos/mesh/swarm';\nimport { ComplexMap, MakeOptional } from '@dxos/util';\n\nimport { OfferMessage, SignalMessage, SignalMessenger } from './signal-messenger';\n\ninterface OfferRecord {\n resolve: (answer: Answer) => void;\n reject: (error?: Error) => void;\n}\n\ninterface MessageRouterOptions {\n sendMessage: (params: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>;\n onOffer: (message: OfferMessage) => Promise<Answer>;\n onSignal: (message: SignalMessage) => Promise<void>;\n topic: PublicKey;\n}\n\n/**\n * Adds offer/answer and signal interfaces.\n */\nexport class MessageRouter implements SignalMessenger {\n private readonly _onSignal: (message: SignalMessage) => Promise<void>;\n private readonly _sendMessage: (msg: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>;\n\n private readonly _onOffer: (message: OfferMessage) => Promise<Answer>;\n private readonly _topic: PublicKey;\n\n private readonly _offerRecords: ComplexMap<PublicKey, OfferRecord> = new ComplexMap((key) => key.toHex());\n\n constructor({ sendMessage, onSignal, onOffer, topic }: MessageRouterOptions) {\n this._sendMessage = sendMessage;\n this._onSignal = onSignal;\n this._onOffer = onOffer;\n this._topic = topic;\n }\n\n async receiveMessage({\n author,\n recipient,\n payload\n }: {\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }): Promise<void> {\n if (payload.type_url !== 'dxos.mesh.swarm.SwarmMessage') {\n // Ignore not swarm messages.\n return;\n }\n const message: SwarmMessage = schema.getCodecForType('dxos.mesh.swarm.SwarmMessage').decode(payload.value);\n\n if (!this._topic.equals(message.topic)) {\n // Ignore messages from wrong topics.\n return;\n }\n\n log('received', { from: author, to: recipient, msg: message });\n\n if (message.data?.offer) {\n await this._handleOffer({ author, recipient, message });\n } else if (message.data?.answer) {\n await this._resolveAnswers(message);\n } else if (message.data?.signal) {\n await this._handleSignal({ author, recipient, message });\n }\n }\n\n async signal(message: SignalMessage): Promise<void> {\n assert(message.data?.signal);\n await this._sendReliableMessage({\n author: message.author,\n recipient: message.recipient,\n message\n });\n }\n\n async offer(message: OfferMessage): Promise<Answer> {\n const networkMessage: SwarmMessage = {\n ...message,\n messageId: PublicKey.random()\n };\n return new Promise<Answer>((resolve, reject) => {\n this._offerRecords.set(networkMessage.messageId!, { resolve, reject });\n return this._sendReliableMessage({\n author: message.author,\n recipient: message.recipient,\n message: networkMessage\n });\n });\n }\n\n private async _sendReliableMessage({\n author,\n recipient,\n message\n }: {\n author: PublicKey;\n recipient: PublicKey;\n message: MakeOptional<SwarmMessage, 'messageId'>;\n }): Promise<void> {\n const networkMessage: SwarmMessage = {\n ...message,\n // Setting unique message_id if it not specified yet.\n messageId: message.messageId ?? PublicKey.random()\n };\n\n log('sending', { from: author, to: recipient, msg: networkMessage });\n await this._encodeAndSend({ author, recipient, message: networkMessage });\n }\n\n private async _encodeAndSend({\n author,\n recipient,\n message\n }: {\n author: PublicKey;\n recipient: PublicKey;\n message: SwarmMessage;\n }) {\n await this._sendMessage({\n author,\n recipient,\n payload: {\n type_url: 'dxos.mesh.swarm.SwarmMessage',\n value: schema.getCodecForType('dxos.mesh.swarm.SwarmMessage').encode(message)\n }\n });\n }\n\n private async _resolveAnswers(message: SwarmMessage): Promise<void> {\n assert(message.data?.answer?.offerMessageId, 'No offerMessageId');\n const offerRecord = this._offerRecords.get(message.data.answer.offerMessageId);\n if (offerRecord) {\n this._offerRecords.delete(message.data.answer.offerMessageId);\n assert(message.data?.answer, 'No answer');\n log('resolving', { answer: message.data.answer });\n offerRecord.resolve(message.data.answer);\n }\n }\n\n private async _handleOffer({\n author,\n recipient,\n message\n }: {\n author: PublicKey;\n recipient: PublicKey;\n message: SwarmMessage;\n }): Promise<void> {\n assert(message.data.offer, 'No offer');\n const offerMessage: OfferMessage = {\n author,\n recipient,\n ...message,\n data: { offer: message.data.offer }\n };\n const answer = await this._onOffer(offerMessage);\n answer.offerMessageId = message.messageId;\n await this._sendReliableMessage({\n author: recipient,\n recipient: author,\n message: {\n topic: message.topic,\n sessionId: message.sessionId,\n data: { answer }\n }\n });\n }\n\n private async _handleSignal({\n author,\n recipient,\n message\n }: {\n author: PublicKey;\n recipient: PublicKey;\n message: SwarmMessage;\n }): Promise<void> {\n assert(message.messageId);\n assert(message.data.signal, 'No Signal');\n const signalMessage: SignalMessage = {\n author,\n recipient,\n ...message,\n data: { signal: message.data.signal }\n };\n\n await this._onSignal(signalMessage);\n }\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event, scheduleTask, sleep, synchronized } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { ErrorStream } from '@dxos/debug';\nimport { PublicKey } from '@dxos/keys';\nimport { log, logInfo } from '@dxos/log';\nimport { Messenger } from '@dxos/messaging';\nimport { trace } from '@dxos/protocols';\nimport { SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { Answer } from '@dxos/protocols/proto/dxos/mesh/swarm';\nimport { ComplexMap, isNotNullOrUndefined } from '@dxos/util';\n\nimport { MessageRouter, OfferMessage, SignalMessage } from '../signal';\nimport { SwarmController, Topology } from '../topology';\nimport { TransportFactory } from '../transport';\nimport { Topic } from '../types';\nimport { WireProtocolProvider } from '../wire-protocol';\nimport { Connection, ConnectionState } from './connection';\nimport { Peer } from './peer';\n\nconst INITIATION_DELAY = 100;\n\n// TODO(burdon): Factor out.\nconst getClassName = (obj: any) => Object.getPrototypeOf(obj).constructor.name;\n\n/**\n * A single peer's view of the swarm.\n * Manages a set of connections implemented by simple-peer instances.\n * Routes signal events and maintains swarm topology.\n */\nexport class Swarm {\n /**\n * @internal\n */\n readonly _peers = new ComplexMap<PublicKey, Peer>(PublicKey.hash);\n\n private readonly _swarmMessenger: MessageRouter;\n\n private _ctx = new Context();\n\n /**\n * Unique id of the swarm, local to the current peer, generated when swarm is joined.\n */\n @logInfo\n readonly _instanceId = PublicKey.random().toHex();\n\n /**\n * New connection to a peer is started.\n * @internal\n */\n readonly connectionAdded = new Event<Connection>();\n\n /**\n * Connection to a peer is dropped.\n * @internal\n */\n readonly disconnected = new Event<PublicKey>();\n\n /**\n * Connection is established to a new peer.\n * @internal\n */\n readonly connected = new Event<PublicKey>();\n\n readonly errors = new ErrorStream();\n\n // TODO(burdon): Swarm => Peer.create/destroy =< Connection.open/close\n\n // TODO(burdon): Split up properties.\n constructor(\n private readonly _topic: PublicKey,\n private readonly _ownPeerId: PublicKey,\n private _topology: Topology,\n private readonly _protocolProvider: WireProtocolProvider,\n private readonly _messenger: Messenger,\n private readonly _transportFactory: TransportFactory,\n private readonly _label: string | undefined\n ) {\n log('creating swarm', { peerId: _ownPeerId });\n _topology.init(this._getSwarmController());\n\n this._swarmMessenger = new MessageRouter({\n sendMessage: async (msg) => await this._messenger.sendMessage(msg),\n onSignal: async (msg) => await this.onSignal(msg),\n onOffer: async (msg) => await this.onOffer(msg),\n topic: this._topic\n });\n\n this._messenger\n .listen({\n peerId: this._ownPeerId,\n payloadType: 'dxos.mesh.swarm.SwarmMessage',\n onMessage: async (message) => await this._swarmMessenger.receiveMessage(message)\n })\n .catch((error) => log.catch(error));\n\n log.trace(\n 'dxos.mesh.swarm',\n trace.begin({ id: this._instanceId, data: { topic: this._topic.toHex(), peerId: this._ownPeerId.toHex() } })\n );\n }\n\n get connections() {\n return Array.from(this._peers.values())\n .map((peer) => peer.connection)\n .filter(isNotNullOrUndefined);\n }\n\n @logInfo\n get ownPeerId() {\n return this._ownPeerId;\n }\n\n /**\n * Custom label assigned to this swarm. Used in devtools to display human-readable names for swarms.\n */\n get label(): string | undefined {\n return this._label;\n }\n\n @logInfo\n get topic(): Topic {\n return this._topic;\n }\n\n // TODO(burdon): async open?\n async destroy() {\n log('destroying...');\n await this._ctx.dispose();\n await this._topology.destroy();\n await Promise.all(Array.from(this._peers.keys()).map((key) => this._destroyPeer(key)));\n log('destroyed');\n log.trace('dxos.mesh.swarm', trace.end({ id: this._instanceId }));\n }\n\n async setTopology(topology: Topology) {\n assert(!this._ctx.disposed, 'Swarm is offline');\n if (topology === this._topology) {\n return;\n }\n log('setting topology', {\n previous: getClassName(this._topology),\n topology: getClassName(topology)\n });\n\n await this._topology.destroy();\n this._topology = topology;\n this._topology.init(this._getSwarmController());\n this._topology.update();\n }\n\n @synchronized\n onSwarmEvent(swarmEvent: SwarmEvent) {\n log('swarm event', { swarmEvent }); // TODO(burdon): Stringify.\n\n if (this._ctx.disposed) {\n log('swarm event ignored for disposed swarm');\n return;\n }\n\n if (swarmEvent.peerAvailable) {\n const peerId = PublicKey.from(swarmEvent.peerAvailable.peer);\n log('new peer', { peerId });\n if (!peerId.equals(this._ownPeerId)) {\n const peer = this._getOrCreatePeer(peerId);\n peer.advertizing = true;\n }\n } else if (swarmEvent.peerLeft) {\n const peer = this._peers.get(PublicKey.from(swarmEvent.peerLeft.peer));\n if (peer) {\n peer.advertizing = false;\n if (peer.connection?.state !== ConnectionState.CONNECTED) {\n // Destroy peer only if there is no p2p-connection established\n void this._destroyPeer(peer.id).catch((err) => log.catch(err));\n }\n }\n }\n\n this._topology.update();\n }\n\n @synchronized\n async onOffer(message: OfferMessage): Promise<Answer> {\n log('offer', { message });\n if (this._ctx.disposed) {\n log('ignored for disposed swarm');\n return { accept: false };\n }\n\n // Id of the peer offering us the connection.\n assert(message.author);\n if (!message.recipient?.equals(this._ownPeerId)) {\n log('rejecting offer with incorrect peerId', { message });\n return { accept: false };\n }\n if (!message.topic?.equals(this._topic)) {\n log('rejecting offer with incorrect topic', { message });\n return { accept: false };\n }\n\n const peer = this._getOrCreatePeer(message.author);\n const answer = await peer.onOffer(message);\n this._topology.update();\n return answer;\n }\n\n @synchronized\n async onSignal(message: SignalMessage): Promise<void> {\n log('signal', { message });\n if (this._ctx.disposed) {\n log.info('ignored for offline swarm');\n return;\n }\n assert(\n message.recipient?.equals(this._ownPeerId),\n `Invalid signal peer id expected=${this.ownPeerId}, actual=${message.recipient}`\n );\n assert(message.topic?.equals(this._topic));\n assert(message.author);\n\n const peer = this._getOrCreatePeer(message.author);\n await peer.onSignal(message);\n }\n\n // For debug purposes\n @synchronized\n async goOffline() {\n await this._ctx.dispose();\n await Promise.all([...this._peers.keys()].map((peerId) => this._destroyPeer(peerId)));\n }\n\n // For debug purposes\n @synchronized\n async goOnline() {\n this._ctx = new Context();\n }\n\n private _getOrCreatePeer(peerId: PublicKey): Peer {\n let peer = this._peers.get(peerId);\n if (!peer) {\n peer = new Peer(\n peerId,\n this._topic,\n this._ownPeerId,\n this._swarmMessenger,\n this._protocolProvider,\n this._transportFactory,\n {\n onInitiated: (connection) => {\n this.connectionAdded.emit(connection);\n },\n onConnected: () => {\n this.connected.emit(peerId);\n },\n onDisconnected: async () => {\n if (!peer!.advertizing) {\n await this._destroyPeer(peer!.id);\n }\n\n this.disconnected.emit(peerId);\n this._topology.update();\n },\n onRejected: () => {\n // If the peer rejected our connection remove it from the set of candidates.\n // TODO(dmaretskyi): Set flag instead.\n if (this._peers.has(peerId)) {\n void this._destroyPeer(peerId);\n }\n },\n onAccepted: () => {\n this._topology.update();\n },\n onOffer: (remoteId) => {\n return this._topology.onOffer(remoteId);\n },\n onPeerAvailable: () => {\n this._topology.update();\n }\n }\n );\n peer._traceParent = this._instanceId;\n this._peers.set(peerId, peer);\n }\n\n return peer;\n }\n\n private async _destroyPeer(peerId: PublicKey) {\n assert(this._peers.has(peerId));\n await this._peers.get(peerId)!.destroy();\n this._peers.delete(peerId);\n }\n\n private _getSwarmController(): SwarmController {\n return {\n getState: () => ({\n ownPeerId: this._ownPeerId,\n connected: Array.from(this._peers.values())\n .filter((peer) => peer.connection)\n .map((peer) => peer.id),\n candidates: Array.from(this._peers.values())\n .filter((peer) => !peer.connection && peer.advertizing && peer.availableToConnect)\n .map((peer) => peer.id)\n }),\n connect: (peer) => {\n if (this._ctx.disposed) {\n return;\n }\n\n // Run in a separate non-blocking task.\n scheduleTask(this._ctx, async () => {\n try {\n await this._initiateConnection(peer);\n } catch (err: any) {\n log.warn('initiation error', err);\n }\n });\n },\n disconnect: async (peer) => {\n if (this._ctx.disposed) {\n return;\n }\n\n // Run in a separate non-blocking task.\n scheduleTask(this._ctx, async () => {\n await this._closeConnection(peer);\n this._topology.update();\n });\n }\n };\n }\n\n /**\n * Creates a connection then sends message over signal network.\n */\n private async _initiateConnection(remoteId: PublicKey) {\n const ctx = this._ctx; // Copy to avoid getting reset while sleeping.\n\n // It is likely that the other peer will also try to connect to us at the same time.\n // If our peerId is higher, we will wait for a bit so that other peer has a chance to connect first.\n if (remoteId.toHex() < this._ownPeerId.toHex()) {\n log('initiation delay', { remoteId });\n await sleep(INITIATION_DELAY);\n }\n if (ctx.disposed) {\n return;\n }\n\n const peer = this._getOrCreatePeer(remoteId);\n\n if (peer.connection) {\n // Do nothing if peer is already connected.\n return;\n }\n\n log('initiating connection...', { remoteId });\n await peer.initiateConnection();\n this._topology.update();\n log('initiated', { remoteId });\n }\n\n private async _closeConnection(peerId: PublicKey) {\n const peer = this._peers.get(peerId);\n if (!peer) {\n return;\n }\n\n await peer.closeConnection();\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { scheduleTask, synchronized } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { Answer } from '@dxos/protocols/proto/dxos/mesh/swarm';\n\nimport { OfferMessage, SignalMessage, SignalMessenger } from '../signal';\nimport { TransportFactory } from '../transport';\nimport { WireProtocolProvider } from '../wire-protocol';\nimport { Connection, ConnectionState } from './connection';\n\ninterface PeerCallbacks {\n /**\n * Connection attempt initiated.\n */\n onInitiated: (connection: Connection) => void;\n\n /**\n * Connection opened.\n */\n onConnected: () => void;\n\n /**\n * Connection closed.\n */\n onDisconnected: () => void;\n\n /**\n * Peer accepted our offer to connect.\n */\n onAccepted: () => void;\n\n /**\n * Peer rejected our offer to connect.\n */\n onRejected: () => void;\n\n /**\n * Returns true if the remote peer's offer should be accepted.\n */\n onOffer: (remoteId: PublicKey) => Promise<boolean>;\n\n /**\n * Peer is available to connect.\n */\n onPeerAvailable: () => void;\n}\n\n/**\n * Minimum time the connection needs to be open to not incur a cool-down timer for this peer after the connection closes.\n */\nconst CONNECTION_COUNTS_STABLE_AFTER = 5_000;\n\n/**\n * State of remote peer during the lifetime of a swarm connection.\n * Can open and close multiple connections to the remote peer.\n */\nexport class Peer {\n /**\n * Will be available to connect after this time.\n */\n private _availableAfter = 0;\n public availableToConnect = true;\n private _lastConnectionTime?: number;\n\n private readonly _ctx = new Context();\n private _connectionCtx?: Context;\n\n public connection?: Connection;\n\n /**\n * Whether the peer is currently advertizing itself on the signal-network.\n */\n public advertizing = false;\n\n public initiating = false;\n\n public _traceParent?: string;\n\n constructor(\n public readonly id: PublicKey,\n public readonly topic: PublicKey,\n public readonly localPeerId: PublicKey,\n private readonly _signalMessaging: SignalMessenger,\n private readonly _protocolProvider: WireProtocolProvider,\n private readonly _transportFactory: TransportFactory,\n private readonly _callbacks: PeerCallbacks\n ) {}\n\n /**\n * Respond to remote offer.\n */\n async onOffer(message: OfferMessage): Promise<Answer> {\n const remoteId = message.author;\n\n // Check if we are already trying to connect to that peer.\n if (this.connection || this.initiating) {\n // Peer with the highest Id closes its connection, and accepts remote peer's offer.\n if (remoteId.toHex() < this.localPeerId.toHex()) {\n // TODO(burdon): Too verbose.\n log(\"closing local connection and accepting remote peer's offer\", {\n id: this.id,\n topic: this.topic,\n peerId: this.localPeerId\n });\n\n if (this.connection) {\n // Close our connection and accept remote peer's connection.\n await this.closeConnection();\n }\n } else {\n // Continue with our origination attempt, the remote peer will close it's connection and accept ours.\n return { accept: false };\n }\n }\n\n if (await this._callbacks.onOffer(remoteId)) {\n if (!this.connection) {\n // Connection might have been already established.\n assert(message.sessionId);\n const connection = this._createConnection(false, message.sessionId);\n try {\n connection.openConnection();\n } catch (err: any) {\n log.warn('connection error', { topic: this.topic, peerId: this.localPeerId, remoteId: this.id, err });\n // Calls `onStateChange` with CLOSED state.\n await this.closeConnection();\n }\n\n return { accept: true };\n }\n }\n return { accept: false };\n }\n\n /**\n * Initiate a connection to the remote peer.\n */\n async initiateConnection() {\n assert(!this.initiating, 'Initiation in progress.');\n assert(!this.connection, 'Already connected.');\n const sessionId = PublicKey.random();\n log('initiating...', { id: this.id, topic: this.topic, peerId: this.id, sessionId });\n const connection = this._createConnection(true, sessionId);\n this.initiating = true;\n\n try {\n const answer = await this._signalMessaging.offer({\n author: this.localPeerId,\n recipient: this.id,\n sessionId,\n topic: this.topic,\n data: { offer: {} }\n });\n log('received', { answer, topic: this.topic, ownId: this.localPeerId, remoteId: this.id });\n if (connection.state !== ConnectionState.INITIAL) {\n log('ignoring response');\n return;\n }\n\n if (!answer.accept) {\n this._callbacks.onRejected();\n return;\n }\n connection.openConnection();\n this._callbacks.onAccepted();\n } catch (err: any) {\n log.warn('initiation error', { topic: this.topic, peerId: this.localPeerId, remoteId: this.id, err });\n // Calls `onStateChange` with CLOSED state.\n await this.closeConnection();\n throw err;\n } finally {\n this.initiating = false;\n }\n }\n\n /**\n * Create new connection.\n * Either we're initiating a connection or creating one in response to an offer from the other peer.\n */\n private _createConnection(initiator: boolean, sessionId: PublicKey) {\n log('creating connection', {\n topic: this.topic,\n peerId: this.localPeerId,\n remoteId: this.id,\n initiator,\n sessionId\n });\n assert(!this.connection, 'Already connected.');\n\n const connection = new Connection(\n this.topic,\n this.localPeerId,\n this.id,\n sessionId,\n initiator,\n this._signalMessaging,\n // TODO(dmaretskyi): Init only when connection is established.\n this._protocolProvider({ initiator, localPeerId: this.localPeerId, remotePeerId: this.id, topic: this.topic }),\n this._transportFactory\n );\n connection._traceParent = this._traceParent;\n this._callbacks.onInitiated(connection);\n\n void this._connectionCtx?.dispose();\n this._connectionCtx = this._ctx.derive();\n\n connection.stateChanged.on((state) => {\n switch (state) {\n case ConnectionState.CONNECTED: {\n this.availableToConnect = true;\n this._lastConnectionTime = Date.now();\n this._callbacks.onConnected();\n break;\n }\n\n case ConnectionState.CLOSED: {\n log('connection closed', { topic: this.topic, peerId: this.localPeerId, remoteId: this.id, initiator });\n assert(this.connection === connection, 'Connection mismatch (race condition).');\n\n if (this._lastConnectionTime && this._lastConnectionTime + CONNECTION_COUNTS_STABLE_AFTER < Date.now()) {\n // If we're closing the connection, and it has been connected for a while, reset the backoff.\n this._availableAfter = 0;\n } else {\n this.availableToConnect = false;\n this._availableAfter = increaseInterval(this._availableAfter);\n }\n\n this.connection = undefined;\n this._callbacks.onDisconnected();\n\n scheduleTask(\n this._connectionCtx!,\n () => {\n this.availableToConnect = true;\n this._callbacks.onPeerAvailable();\n },\n this._availableAfter\n );\n\n break;\n }\n }\n });\n connection.errors.handle((err) => {\n log.warn('connection error', { topic: this.topic, peerId: this.localPeerId, remoteId: this.id, initiator, err });\n\n // Calls `onStateChange` with CLOSED state.\n void this.closeConnection();\n });\n\n this.connection = connection;\n\n return connection;\n }\n\n async closeConnection() {\n if (!this.connection) {\n return;\n }\n const connection = this.connection;\n log('closing...', { peerId: this.id, sessionId: connection.sessionId });\n\n // Triggers `onStateChange` callback which will clean up the connection.\n // Won't throw.\n await connection.close();\n\n log('closed', { peerId: this.id, sessionId: connection.sessionId });\n }\n\n async onSignal(message: SignalMessage) {\n if (!this.connection) {\n log('dropping signal message for non-existent connection', { message });\n return;\n }\n await this.connection.signal(message);\n }\n\n @synchronized\n async destroy() {\n await this._ctx.dispose();\n log('Destroying peer', { peerId: this.id, topic: this.topic });\n\n // Won't throw.\n await this?.connection?.close();\n }\n}\n\nconst increaseInterval = (interval: number) => {\n if (interval === 0) {\n return 50;\n } else if (interval < 500) {\n return 500;\n } else if (interval < 1000) {\n return 1000;\n } else if (interval < 5_000) {\n return 5_000;\n }\n return 10_000;\n};\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Event, EventSubscriptions } from '@dxos/async';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ComplexMap } from '@dxos/util';\n\nimport { ConnectionState } from './connection';\nimport { Swarm } from './swarm';\n\n/**\n * State of the connection to the remote peer with additional info derived from network mapping.\n */\nexport type PeerState = ConnectionState | 'INDIRECTLY_CONNECTED' | 'ME';\n\n/**\n * Information about remote peer, directly or indirectly connected.\n */\nexport interface PeerInfo {\n id: PublicKey;\n state: PeerState;\n connections: PublicKey[];\n}\n\ntype Unsubscribe = () => void;\n\nexport class SwarmMapper {\n private readonly _subscriptions = new EventSubscriptions();\n private readonly _connectionSubscriptions = new ComplexMap<PublicKey, Unsubscribe>(PublicKey.hash);\n private readonly _peers = new ComplexMap<PublicKey, PeerInfo>(PublicKey.hash);\n\n readonly mapUpdated = new Event<PeerInfo[]>();\n\n get peers(): PeerInfo[] {\n return Array.from(this._peers.values());\n }\n\n // prettier-ignore\n constructor(\n private readonly _swarm: Swarm\n ) {\n this._subscriptions.add(\n _swarm.connectionAdded.on((connection) => {\n this._update();\n this._connectionSubscriptions.set(\n connection.remoteId,\n connection.stateChanged.on(() => {\n this._update();\n })\n );\n })\n );\n\n this._subscriptions.add(\n _swarm.disconnected.on((peerId) => {\n this._connectionSubscriptions.get(peerId)?.();\n this._connectionSubscriptions.delete(peerId);\n this._update();\n })\n );\n\n // if (_presence) {\n // this._subscriptions.add(_presence.graphUpdated.on(() => {\n // this._update();\n // }));\n // }\n\n // TODO(burdon): Do not call from constructor.\n this._update();\n }\n\n private _update() {\n log('updating swarm');\n\n this._peers.clear();\n this._peers.set(this._swarm.ownPeerId, {\n id: this._swarm.ownPeerId,\n state: 'ME', // TODO(burdon): Enum (rename \"local\").\n connections: []\n });\n\n for (const connection of this._swarm.connections) {\n this._peers.set(connection.remoteId, {\n id: connection.remoteId,\n state: connection.state,\n connections: [this._swarm.ownPeerId]\n });\n }\n\n // if (this._presence) {\n // this._presence.graph.forEachNode((node: any) => {\n // const id = PublicKey.fromHex(node.id);\n // if (this._peers.has(id)) {\n // return;\n // }\n\n // this._peers.set(id, {\n // id,\n // state: 'INDIRECTLY_CONNECTED',\n // connections: []\n // });\n // });\n\n // this._presence.graph.forEachLink((link: any) => {\n // const from = PublicKey.from(link.fromId);\n // const to = PublicKey.from(link.toId);\n // // Ignore connections to self, they are already handled.\n // if (!from.equals(this._swarm.ownPeerId) && !to.equals(this._swarm.ownPeerId)) {\n // this._peers.get(from)!.connections.push(to);\n // }\n // });\n // }\n\n log('graph changed', {\n directConnections: this._swarm.connections.length,\n totalPeersInSwarm: this._peers.size\n });\n\n this.mapUpdated.emit(Array.from(this._peers.values()));\n }\n\n // TODO(burdon): Async open/close.\n destroy() {\n Array.from(this._connectionSubscriptions.values()).forEach((cb) => cb());\n this._subscriptions.clear();\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { raise } from '@dxos/debug';\nimport { PublicKey } from '@dxos/keys';\nimport { SwarmInfo, ConnectionInfo } from '@dxos/protocols/proto/dxos/devtools/swarm';\nimport { ComplexMap } from '@dxos/util';\n\nimport { ConnectionState, Swarm } from './swarm';\n\nexport enum EventType {\n CONNECTION_STATE_CHANGED = 'CONNECTION_STATE_CHANGED',\n PROTOCOL_ERROR = 'PROTOCOL_ERROR',\n PROTOCOL_EXTENSIONS_INITIALIZED = 'PROTOCOL_EXTENSIONS_INITIALIZED',\n PROTOCOL_EXTENSIONS_HANDSHAKE = 'PROTOCOL_EXTENSIONS_HANDSHAKE',\n PROTOCOL_HANDSHAKE = 'PROTOCOL_HANDSHAKE'\n}\n\nexport class ConnectionLog {\n /**\n * SwarmId => info\n */\n private readonly _swarms = new ComplexMap<PublicKey, SwarmInfo>(PublicKey.hash);\n\n readonly update = new Event();\n\n getSwarmInfo(swarmId: PublicKey) {\n return this._swarms.get(swarmId) ?? raise(new Error(`Swarm not found: ${swarmId}`));\n }\n\n get swarms(): SwarmInfo[] {\n return Array.from(this._swarms.values());\n }\n\n joinedSwarm(swarm: Swarm) {\n const info: SwarmInfo = {\n id: PublicKey.from(swarm._instanceId),\n topic: swarm.topic,\n isActive: true,\n label: swarm.label,\n connections: []\n };\n\n this._swarms.set(PublicKey.from(swarm._instanceId), info);\n this.update.emit();\n\n swarm.connectionAdded.on((connection) => {\n const connectionInfo: ConnectionInfo = {\n state: ConnectionState.INITIAL,\n remotePeerId: connection.remoteId,\n sessionId: connection.sessionId,\n transport: connection.transport && Object.getPrototypeOf(connection.transport).constructor.name,\n protocolExtensions: [], // TODO(dmaretskyi): Fix.\n events: []\n };\n info.connections!.push(connectionInfo);\n this.update.emit();\n\n connection.stateChanged.on((state) => {\n connectionInfo.state = state;\n connectionInfo.events!.push({\n type: EventType.CONNECTION_STATE_CHANGED,\n newState: state\n });\n this.update.emit();\n });\n\n // connection.protocol.protocol?.error.on((error) => {\n // connectionInfo.events!.push({\n // type: EventType.PROTOCOL_ERROR,\n // error: error.stack ?? error.message\n // });\n // this.update.emit();\n // });\n // connection.protocol.protocol?.extensionsInitialized.on(() => {\n // connectionInfo.events!.push({\n // type: EventType.PROTOCOL_EXTENSIONS_INITIALIZED\n // });\n // this.update.emit();\n // });\n // connection.protocol.protocol?.extensionsHandshake.on(() => {\n // connectionInfo.events!.push({\n // type: EventType.PROTOCOL_EXTENSIONS_HANDSHAKE\n // });\n // this.update.emit();\n // });\n // connection.protocol.protocol?.handshake.on(() => {\n // connectionInfo.events!.push({\n // type: EventType.PROTOCOL_HANDSHAKE\n // });\n // this.update.emit();\n // });\n });\n }\n\n leftSwarm(swarm: Swarm) {\n this.getSwarmInfo(PublicKey.from(swarm._instanceId)).isActive = false;\n this.update.emit();\n }\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event } from '@dxos/async';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { Messenger, SignalManager } from '@dxos/messaging';\nimport { trace } from '@dxos/protocols';\nimport { ConnectionState } from '@dxos/protocols/proto/dxos/client/services';\nimport { ComplexMap } from '@dxos/util';\n\nimport { ConnectionLog } from './connection-log';\nimport { SignalConnection } from './signal';\nimport { Swarm, SwarmMapper } from './swarm';\nimport { Topology } from './topology';\nimport { TransportFactory } from './transport';\nimport { WireProtocolProvider } from './wire-protocol';\n\n/**\n * Represents a single connection to a remote peer.\n */\nexport type SwarmConnection = {\n close(): Promise<void>;\n};\n\n// TODO(burdon): Add timeout.\nexport type SwarmOptions = {\n /**\n * Swarm topic.\n */\n topic: PublicKey;\n\n /**\n * This node's peer id.\n */\n peerId: PublicKey;\n\n /**\n * Protocol to use for every connection.\n */\n protocolProvider: WireProtocolProvider;\n\n /**\n * Requested topology. Must be a new instance for every swarm.\n */\n topology?: Topology;\n\n /**\n * Custom label assigned to this swarm.\n * Used in devtools to display human-readable names for swarms.\n */\n label?: string;\n};\n\nexport type NetworkManagerOptions = {\n transportFactory: TransportFactory;\n signalManager: SignalManager;\n log?: boolean; // Log to devtools.\n};\n\n/**\n * Manages connection to the swarm.\n */\n// TODO(dmaretskyi): Rename SwarmManager.\nexport class NetworkManager {\n private readonly _swarms = new ComplexMap<PublicKey, Swarm>(PublicKey.hash);\n private readonly _mappers = new ComplexMap<PublicKey, SwarmMapper>(PublicKey.hash);\n\n private readonly _transportFactory: TransportFactory;\n private readonly _signalManager: SignalManager;\n private readonly _messenger: Messenger;\n private readonly _signalConnection: SignalConnection;\n\n private _connectionState = ConnectionState.ONLINE;\n public readonly connectionStateChanged = new Event<ConnectionState>();\n\n private readonly _connectionLog?: ConnectionLog;\n\n public readonly topicsUpdated = new Event<void>();\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n constructor({ transportFactory, signalManager, log }: NetworkManagerOptions) {\n this._transportFactory = transportFactory;\n\n // Listen for signal manager events.\n this._signalManager = signalManager;\n this._signalManager.swarmEvent.on(({ topic, swarmEvent: event }) => this._swarms.get(topic)?.onSwarmEvent(event));\n this._messenger = new Messenger({ signalManager: this._signalManager });\n this._messenger._traceParent = this._instanceId;\n this._signalConnection = {\n join: (opts) => this._signalManager.join(opts),\n leave: (opts) => this._signalManager.leave(opts)\n };\n\n // TODO(burdon): Inject listener (generic pattern).\n if (log) {\n this._connectionLog = new ConnectionLog();\n }\n }\n\n // TODO(burdon): Remove access (Devtools only).\n get connectionLog() {\n return this._connectionLog;\n }\n\n // TODO(burdon): Remove access (Devtools only).\n get signalManager() {\n return this._signalManager;\n }\n\n get connectionState() {\n return this._connectionState;\n }\n\n // TODO(burdon): Reconcile with \"discovery_key\".\n get topics() {\n return Array.from(this._swarms.keys());\n }\n\n getSwarmMap(topic: PublicKey): SwarmMapper | undefined {\n return this._mappers.get(topic);\n }\n\n getSwarm(topic: PublicKey): Swarm | undefined {\n return this._swarms.get(topic);\n }\n\n async open() {\n log.trace('dxos.mesh.network-manager', trace.begin({ id: this._instanceId }));\n await this._messenger.open();\n await this._signalManager.open();\n }\n\n async close() {\n for (const topic of this._swarms.keys()) {\n await this.leaveSwarm(topic).catch((err) => {\n log(err);\n });\n }\n\n await this._messenger.close();\n await this._signalManager.close();\n log.trace('dxos.mesh.network-manager', trace.end({ id: this._instanceId }));\n }\n\n /**\n * Join the swarm.\n */\n async joinSwarm({\n topic,\n peerId,\n topology,\n protocolProvider: protocol,\n label\n }: SwarmOptions): Promise<SwarmConnection> {\n assert(PublicKey.isPublicKey(topic));\n assert(PublicKey.isPublicKey(peerId));\n assert(topology);\n assert(typeof protocol === 'function');\n if (this._swarms.has(topic)) {\n throw new Error(`Already connected to swarm: ${PublicKey.from(topic)}`);\n }\n\n log('joining', { topic: PublicKey.from(topic), peerId, topology: topology.toString() }); // TODO(burdon): Log peerId.\n const swarm = new Swarm(topic, peerId, topology, protocol, this._messenger, this._transportFactory, label);\n swarm.errors.handle((error) => {\n log('swarm error', { error });\n });\n\n this._swarms.set(topic, swarm);\n this._signalConnection.join({ topic, peerId }).catch((error) => log.catch(error));\n this._mappers.set(topic, new SwarmMapper(swarm));\n\n this.topicsUpdated.emit();\n this._connectionLog?.joinedSwarm(swarm);\n log('joined', { topic: PublicKey.from(topic), count: this._swarms.size });\n\n return {\n close: () => this.leaveSwarm(topic)\n };\n }\n\n /**\n * Close the connection.\n */\n async leaveSwarm(topic: PublicKey) {\n if (!this._swarms.has(topic)) {\n log.warn('swarm not open', { topic: PublicKey.from(topic).truncate() });\n return;\n }\n\n log('leaving', { topic: PublicKey.from(topic) });\n const swarm = this._swarms.get(topic)!;\n await this._signalConnection.leave({ topic, peerId: swarm.ownPeerId });\n\n const map = this._mappers.get(topic)!;\n map.destroy();\n this._mappers.delete(topic);\n\n this._connectionLog?.leftSwarm(swarm);\n\n await swarm.destroy();\n this._swarms.delete(topic);\n\n await this.topicsUpdated.emit();\n log('left', { topic: PublicKey.from(topic), count: this._swarms.size });\n }\n\n async setConnectionState(state: ConnectionState) {\n if (state === this._connectionState) {\n return;\n }\n\n switch (state) {\n case ConnectionState.OFFLINE: {\n this._connectionState = state;\n // go offline\n await Promise.all([...this._swarms.values()].map((swarm) => swarm.goOffline()));\n await this._messenger.close();\n await this._signalManager.close();\n break;\n }\n case ConnectionState.ONLINE: {\n this._connectionState = state;\n // go online\n this._messenger.open();\n await Promise.all([...this._swarms.values()].map((swarm) => swarm.goOnline()));\n await this._signalManager.open();\n break;\n }\n }\n\n this.connectionStateChanged.emit(this._connectionState);\n }\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { PublicKey } from '@dxos/keys';\n\nimport { SwarmController, Topology } from './topology';\n\nexport class FullyConnectedTopology implements Topology {\n private _controller?: SwarmController;\n\n toString() {\n return 'FullyConnectedTopology';\n }\n\n init(controller: SwarmController): void {\n assert(!this._controller, 'Already initialized');\n this._controller = controller;\n }\n\n update(): void {\n assert(this._controller, 'Not initialized');\n const { candidates: discovered } = this._controller.getState();\n for (const peer of discovered) {\n // TODO(burdon): Back-off.\n this._controller.connect(peer);\n }\n }\n\n async onOffer(peer: PublicKey): Promise<boolean> {\n return true;\n }\n\n async destroy(): Promise<void> {\n // Nothing to do.\n }\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport assert from 'node:assert';\nimport distance from 'xor-distance';\n\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\n\nimport { SwarmController, Topology } from './topology';\n\nexport interface MMSTTopologyOptions {\n /**\n * Number of connections the peer will originate by itself.\n */\n originateConnections?: number;\n\n /**\n * Maximum number of connections allowed, all other connections will be dropped.\n */\n maxPeers?: number;\n\n /**\n * Size of random sample from which peer candidates are selected.\n */\n sampleSize?: number;\n}\n\nexport class MMSTTopology implements Topology {\n private readonly _originateConnections: number;\n private readonly _maxPeers: number;\n private readonly _sampleSize: number;\n\n private _controller?: SwarmController;\n\n private _sampleCollected = false;\n\n constructor({ originateConnections = 2, maxPeers = 4, sampleSize = 10 }: MMSTTopologyOptions = {}) {\n this._originateConnections = originateConnections;\n this._maxPeers = maxPeers;\n this._sampleSize = sampleSize;\n }\n\n init(controller: SwarmController): void {\n assert(!this._controller, 'Already initialized');\n this._controller = controller;\n }\n\n update(): void {\n assert(this._controller, 'Not initialized');\n const { connected, candidates } = this._controller.getState();\n // Run the algorithms if we have first candidates, ran it before, or have more connections than needed.\n if (this._sampleCollected || connected.length > this._maxPeers || candidates.length > 0) {\n log('Running the algorithm.');\n this._sampleCollected = true;\n this._runAlgorithm();\n }\n }\n\n async onOffer(peer: PublicKey): Promise<boolean> {\n assert(this._controller, 'Not initialized');\n const { connected } = this._controller.getState();\n const accept = connected.length < this._maxPeers;\n log(`Offer ${peer} accept=${accept}`);\n return accept;\n }\n\n async destroy(): Promise<void> {\n // Nothing to do.\n }\n\n private _runAlgorithm() {\n assert(this._controller, 'Not initialized');\n const { connected, candidates, ownPeerId } = this._controller.getState();\n\n if (connected.length > this._maxPeers) {\n // Disconnect extra peers.\n const sorted = sortByXorDistance(connected, ownPeerId)\n .reverse()\n .slice(0, this._maxPeers - connected.length);\n for (const peer of sorted) {\n log(`Disconnect ${peer}.`);\n this._controller.disconnect(peer);\n }\n } else if (connected.length < this._originateConnections) {\n // Connect new peers to reach desired quota.\n const sample = candidates.sort(() => Math.random() - 0.5).slice(0, this._sampleSize);\n const sorted = sortByXorDistance(sample, ownPeerId).slice(0, this._originateConnections - connected.length);\n for (const peer of sorted) {\n log(`Connect ${peer}.`);\n this._controller.connect(peer);\n }\n }\n }\n\n toString() {\n return 'MMSTTopology';\n }\n}\n\nconst sortByXorDistance = (keys: PublicKey[], reference: PublicKey): PublicKey[] =>\n keys.sort((a, b) =>\n distance.gt(distance(a.asBuffer(), reference.asBuffer()), distance(b.asBuffer(), reference.asBuffer()))\n );\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\n\nimport { SwarmController, Topology } from './topology';\n\nexport class StarTopology implements Topology {\n private _controller?: SwarmController;\n\n // prettier-ignore\n constructor(\n private readonly _centralPeer: PublicKey\n ) {}\n\n toString() {\n return `StarTopology(${this._centralPeer.truncate()})`;\n }\n\n init(controller: SwarmController): void {\n assert(!this._controller, 'Already initialized.');\n this._controller = controller;\n }\n\n update(): void {\n assert(this._controller, 'Not initialized.');\n const { candidates, connected, ownPeerId } = this._controller.getState();\n if (!ownPeerId.equals(this._centralPeer)) {\n log('leaf peer dropping all connections apart from central peer.');\n\n // Drop all connections other than central peer.\n for (const peer of connected) {\n if (!peer.equals(this._centralPeer)) {\n log('dropping connection', { peer });\n this._controller.disconnect(peer);\n }\n }\n }\n\n for (const peer of candidates) {\n // Connect to central peer.\n if (peer.equals(this._centralPeer) || ownPeerId.equals(this._centralPeer)) {\n log('connecting to peer', { peer });\n this._controller.connect(peer);\n }\n }\n }\n\n async onOffer(peer: PublicKey): Promise<boolean> {\n assert(this._controller, 'Not initialized.');\n const { ownPeerId } = this._controller.getState();\n log('offer', {\n peer,\n isCentral: peer.equals(this._centralPeer),\n isSelfCentral: ownPeerId.equals(this._centralPeer)\n });\n return ownPeerId.equals(this._centralPeer) || peer.equals(this._centralPeer);\n }\n\n async destroy(): Promise<void> {\n // Nothing to do.\n }\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport assert from 'node:assert';\nimport { Transform } from 'node:stream';\n\nimport { Event, Trigger } from '@dxos/async';\nimport { ErrorStream } from '@dxos/debug';\nimport { PublicKey } from '@dxos/keys';\nimport { log, logInfo } from '@dxos/log';\nimport { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';\nimport { ComplexMap } from '@dxos/util';\n\nimport { Transport, TransportFactory, TransportOptions } from './transport';\n\n// TODO(burdon): Make configurable.\n// Delay (in milliseconds) for data being sent through in-memory connections to simulate network latency.\nconst MEMORY_TRANSPORT_DELAY = 1;\n\n/**\n * Creates a binary stream that delays data being sent through the stream by the specified amount of time.\n */\nconst createStreamDelay = (delay: number): NodeJS.ReadWriteStream => {\n return new Transform({\n objectMode: true,\n transform: (chunk, _, cb) => {\n setTimeout(() => cb(null, chunk), delay); // TODO(burdon): Randomize.\n }\n });\n};\n\nexport const MemoryTransportFactory: TransportFactory = {\n createTransport: (params) => new MemoryTransport(params)\n};\n\n/**\n * Fake transport.\n */\nexport class MemoryTransport implements Transport {\n // TODO(burdon): Remove static properties (inject context into constructor).\n private static readonly _connections = new ComplexMap<PublicKey, MemoryTransport>(PublicKey.hash);\n\n public readonly closed = new Event<void>();\n public readonly connected = new Event<void>();\n public readonly errors = new ErrorStream();\n\n @logInfo\n private readonly _instanceId = PublicKey.random(); // TODO(burdon): Rename peerId? (Use local/remote labels in logs).\n\n private readonly _remote = new Trigger<PublicKey>();\n\n private readonly _outgoingDelay = createStreamDelay(MEMORY_TRANSPORT_DELAY);\n private readonly _incomingDelay = createStreamDelay(MEMORY_TRANSPORT_DELAY);\n\n private _destroyed = false;\n\n @logInfo\n private _remoteInstanceId!: PublicKey;\n\n private _remoteConnection?: MemoryTransport;\n\n constructor(private readonly options: TransportOptions) {\n log('creating');\n\n assert(!MemoryTransport._connections.has(this._instanceId), 'Duplicate memory connection');\n MemoryTransport._connections.set(this._instanceId, this);\n\n // Initiator will send a signal, the receiver will receive the unique ID and connect the streams.\n if (this.options.initiator) {\n // prettier-ignore\n setTimeout(async () => {\n log('sending signal');\n void this.options.sendSignal({\n payload: { transportId: this._instanceId.toHex() }\n });\n });\n } else {\n this._remote\n .wait({ timeout: this.options.timeout ?? 1000 })\n .then((remoteId) => {\n if (this._destroyed) {\n return;\n }\n\n this._remoteInstanceId = remoteId;\n this._remoteConnection = MemoryTransport._connections.get(this._remoteInstanceId);\n if (!this._remoteConnection) {\n // Remote connection was destroyed before we could connect.\n this._destroyed = true;\n this.closed.emit();\n return;\n }\n\n assert(\n !this._remoteConnection._remoteConnection,\n new Error(`Remote already connected: ${this._remoteInstanceId}`)\n );\n this._remoteConnection._remoteConnection = this;\n this._remoteConnection._remoteInstanceId = this._instanceId;\n\n log('connected');\n this.options.stream\n .pipe(this._outgoingDelay)\n .pipe(this._remoteConnection.options.stream)\n .pipe(this._incomingDelay)\n .pipe(this.options.stream);\n\n this.connected.emit();\n this._remoteConnection.connected.emit();\n })\n .catch((err) => {\n if (this._destroyed) {\n return;\n }\n\n this.errors.raise(err);\n });\n }\n }\n\n async destroy(): Promise<void> {\n log('closing');\n this._destroyed = true;\n\n MemoryTransport._connections.delete(this._instanceId);\n if (this._remoteConnection) {\n log('closing');\n this._remoteConnection._destroyed = true;\n MemoryTransport._connections.delete(this._remoteInstanceId);\n\n // TODO(dmaretskyi): Hypercore streams do not seem to have the unpipe method.\n // NOTE(burdon): Using readable-stream.wrap() might help (see feed-store).\n // code this._stream\n // code .unpipe(this._outgoingDelay)\n // code .unpipe(this._remoteConnection._stream)\n // code .unpipe(this._incomingDelay)\n // code .unpipe(this._stream);\n\n this._outgoingDelay.unpipe();\n this._incomingDelay.unpipe();\n\n this._remoteConnection.closed.emit();\n this._remoteConnection._remoteConnection = undefined;\n this._remoteConnection = undefined;\n log('closed');\n }\n\n this.closed.emit();\n log('closed');\n }\n\n signal({ payload }: Signal) {\n log('received signal', { payload });\n if (!payload?.transportId) {\n return;\n }\n // TODO(burdon): Check open?\n const transportId = payload.transportId as string;\n if (transportId) {\n const remoteId = PublicKey.fromHex(transportId);\n this._remote.wake(remoteId);\n }\n }\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport assert from 'node:assert';\nimport SimplePeerConstructor, { Instance as SimplePeer } from 'simple-peer';\n\nimport { Event } from '@dxos/async';\nimport { ErrorStream, raise } from '@dxos/debug';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/protocols';\nimport { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';\n\nimport { Transport, TransportFactory } from './transport';\nimport { wrtc } from './webrtc';\n\nexport type WebRTCTransportParams = {\n initiator: boolean;\n stream: NodeJS.ReadWriteStream;\n webrtcConfig?: any;\n sendSignal: (signal: Signal) => Promise<void>;\n};\n\n/**\n * Implements Transport for WebRTC. Uses simple-peer under the hood.\n */\nexport class WebRTCTransport implements Transport {\n private readonly _peer: SimplePeer;\n private _closed = false;\n\n readonly closed = new Event();\n readonly connected = new Event();\n readonly errors = new ErrorStream();\n\n private readonly _instanceId = PublicKey.random().toHex();\n private readonly _performance = {\n bytesSent: 0,\n bytesReceived: 0\n };\n\n constructor(private readonly params: WebRTCTransportParams) {\n log.trace('dxos.mesh.webrtc-transport', trace.begin({ id: this._instanceId }));\n log('created connection', params);\n this._peer = new SimplePeerConstructor({\n initiator: this.params.initiator,\n wrtc: SimplePeerConstructor.WEBRTC_SUPPORT ? undefined : wrtc ?? raise(new Error('wrtc not available')),\n config: this.params.webrtcConfig\n });\n\n this._peer.on('signal', async (data) => {\n log('signal', data);\n await this.params.sendSignal({ payload: { data } });\n });\n\n this._peer.on('connect', () => {\n log('connected');\n this.params.stream.pipe(this._peer!).pipe(this.params.stream);\n this.connected.emit();\n });\n\n this._peer.on('close', async () => {\n log('closed');\n await this._disconnectStreams();\n this.closed.emit();\n });\n\n this._peer.on('error', async (err) => {\n this.errors.raise(err);\n\n // Try to gather additional information about the connection.\n try {\n if (typeof (this._peer as any)?._pc.getStats === 'function') {\n (this._peer as any)._pc.getStats().then((stats: any) => {\n log.warn('report after webrtc error', {\n config: this.params.webrtcConfig,\n stats\n });\n });\n }\n } catch {} // TODO(burdon): Ignored?\n\n await this.destroy();\n });\n }\n\n async destroy() {\n log('closing...');\n this._closed = true;\n await this._disconnectStreams();\n this._peer!.destroy();\n this.closed.emit();\n log('closed');\n log.trace(\n 'dxos.mesh.webrtc-transport',\n trace.end({ id: this._instanceId, data: { performance: this._performance } })\n );\n }\n\n signal(signal: Signal) {\n if (this._closed) {\n return; // Ignore signals after close.\n }\n\n assert(signal.payload.data, 'Signal message must contain signal data.');\n this._peer.signal(signal.payload.data);\n }\n\n private async _disconnectStreams() {\n // TODO(rzadp): Find a way of unpiping this?\n this.params.stream.unpipe?.(this._peer)?.unpipe?.(this.params.stream);\n }\n}\n\n// TODO(dmaretskyi): Convert to class.\nexport const createWebRTCTransportFactory = (webrtcConfig?: any): TransportFactory => ({\n createTransport: (params) =>\n new WebRTCTransport({\n ...params,\n webrtcConfig\n })\n});\n", "//\n// Copyright 2022 DXOS.org\n//\n\n/**\n * Will be null if WebRTC is not available in this environment.\n */\nlet wrtc: any = null;\n\n// Try to load WebRTC if available. This will fail in the shared-worker context.\ntry {\n wrtc = require('@koush/wrtc');\n} catch {}\n\nexport { wrtc };\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\nimport { Duplex } from 'node:stream';\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport {\n BridgeService,\n ConnectionRequest,\n SignalRequest,\n DataRequest,\n BridgeEvent,\n ConnectionState,\n CloseRequest\n} from '@dxos/protocols/proto/dxos/mesh/bridge';\nimport { ComplexMap } from '@dxos/util';\n\nimport { WebRTCTransport } from './webrtc-transport';\n\nexport class WebRTCTransportService implements BridgeService {\n private readonly transports = new ComplexMap<PublicKey, { transport: WebRTCTransport; stream: Duplex }>(\n PublicKey.hash\n );\n\n // prettier-ignore\n constructor(\n private readonly _webrtcConfig?: any\n ) {}\n\n open(request: ConnectionRequest): Stream<BridgeEvent> {\n const rpcStream: Stream<BridgeEvent> = new Stream(({ ready, next, close }) => {\n const duplex: Duplex = new Duplex({\n read: () => {},\n write: function (chunk, _, callback) {\n next({ data: { payload: chunk } });\n callback();\n }\n });\n\n const transport = new WebRTCTransport({\n initiator: request.initiator,\n stream: duplex,\n sendSignal: async (signal) => {\n next({\n signal: { payload: signal }\n });\n }\n });\n\n next({\n connection: {\n state: ConnectionState.CONNECTING\n }\n });\n\n transport.connected.on(() => {\n next({\n connection: {\n state: ConnectionState.CONNECTED\n }\n });\n });\n\n transport.errors.handle((err) => {\n next({\n connection: {\n state: ConnectionState.CLOSED,\n error: err.toString()\n }\n });\n close(err);\n });\n\n transport.closed.on(() => {\n next({\n connection: {\n state: ConnectionState.CLOSED\n }\n });\n close();\n });\n\n ready();\n this.transports.set(request.proxyId, { transport, stream: duplex });\n });\n\n return rpcStream;\n }\n\n async sendSignal({ proxyId, signal }: SignalRequest): Promise<void> {\n assert(this.transports.has(proxyId));\n await this.transports.get(proxyId)!.transport.signal(signal);\n }\n\n async sendData({ proxyId, payload }: DataRequest): Promise<void> {\n assert(this.transports.has(proxyId));\n await this.transports.get(proxyId)!.stream.push(payload);\n }\n\n async close({ proxyId }: CloseRequest) {\n await this.transports.get(proxyId)?.transport.destroy();\n await this.transports.get(proxyId)?.stream.end();\n this.transports.delete(proxyId);\n log('Closed.');\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event } from '@dxos/async';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { ErrorStream } from '@dxos/debug';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ConnectionState, BridgeEvent, BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';\nimport { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';\n\nimport { Transport, TransportFactory, TransportOptions } from './transport';\n\nexport type WebRTCTransportProxyParams = {\n initiator: boolean;\n stream: NodeJS.ReadWriteStream;\n bridgeService: BridgeService;\n sendSignal: (signal: Signal) => Promise<void>;\n};\n\nexport class WebRTCTransportProxy implements Transport {\n private readonly _proxyId = PublicKey.random();\n private readonly _ctx = new Context();\n\n readonly closed = new Event();\n private _closed = false;\n readonly connected = new Event();\n\n readonly errors = new ErrorStream();\n\n private _serviceStream!: Stream<BridgeEvent>;\n\n // prettier-ignore\n constructor(\n private readonly _params: WebRTCTransportProxyParams\n ) {\n this._serviceStream = this._params.bridgeService.open({\n proxyId: this._proxyId,\n initiator: this._params.initiator\n });\n\n this._serviceStream.waitUntilReady().then(\n () => {\n this._serviceStream.subscribe(async (event: BridgeEvent) => {\n log('WebRTCTransportProxy: event', event);\n if (event.connection) {\n await this._handleConnection(event.connection);\n } else if (event.data) {\n this._handleData(event.data);\n } else if (event.signal) {\n await this._handleSignal(event.signal);\n }\n });\n\n const dataListener = async (data: Uint8Array) => {\n try {\n await this._params.bridgeService.sendData({\n proxyId: this._proxyId,\n payload: data\n });\n } catch (err: any) {\n log.catch(err);\n }\n };\n this._params.stream.on('data', dataListener);\n this._ctx.onDispose(() => { this._params.stream.off('data', dataListener); });\n },\n (error) => log.catch(error)\n );\n }\n\n private async _handleConnection(connectionEvent: BridgeEvent.ConnectionEvent): Promise<void> {\n if (connectionEvent.error) {\n this.errors.raise(new Error(connectionEvent.error));\n }\n\n switch (connectionEvent.state) {\n case ConnectionState.CONNECTED: {\n this.connected.emit();\n break;\n }\n case ConnectionState.CLOSED: {\n await this.destroy();\n break;\n }\n }\n }\n\n private _handleData(dataEvent: BridgeEvent.DataEvent) {\n // NOTE: This must be a Buffer otherwise hypercore-protocol breaks.\n this._params.stream.write(Buffer.from(dataEvent.payload));\n }\n\n private async _handleSignal(signalEvent: BridgeEvent.SignalEvent) {\n await this._params.sendSignal(signalEvent.payload);\n }\n\n signal(signal: Signal): void {\n this._params.bridgeService\n .sendSignal({\n proxyId: this._proxyId,\n signal\n })\n .catch((err) => this.errors.raise(err));\n }\n\n // TODO(burdon): Move open from constructor.\n async destroy(): Promise<void> {\n await this._ctx.dispose();\n if (this._closed) {\n return;\n }\n\n this._serviceStream.close();\n\n try {\n await this._params.bridgeService.close({ proxyId: this._proxyId });\n } catch (err: any) {\n log.catch(err);\n }\n\n this.closed.emit();\n this._closed = true;\n }\n\n /**\n * Called when underlying proxy service becomes unavailable.\n */\n // TODO(burdon): Option on close method.\n forceClose() {\n this._serviceStream.close();\n this.closed.emit();\n this._closed = true;\n }\n}\n\n// TODO(burdon): Why is this named Proxy?\nexport class WebRTCTransportProxyFactory implements TransportFactory {\n private _bridgeService: BridgeService | undefined;\n private _connections = new Set<WebRTCTransportProxy>();\n\n /**\n * Sets the current BridgeService to be used to open connections.\n * Calling this method will close any existing connections.\n */\n setBridgeService(bridgeService: BridgeService | undefined): this {\n this._bridgeService = bridgeService;\n for (const connection of this._connections) {\n connection.forceClose();\n }\n\n return this;\n }\n\n createTransport(options: TransportOptions): Transport {\n assert(this._bridgeService, 'WebRTCTransportProxyFactory is not ready to open connections');\n\n const transport = new WebRTCTransportProxy({\n ...options,\n bridgeService: this._bridgeService\n });\n\n this._connections.add(transport);\n transport.closed.on(() => this._connections.delete(transport));\n\n return transport;\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Duplex } from 'node:stream';\n\nimport { PublicKey } from '@dxos/keys';\nimport { Teleport } from '@dxos/teleport';\n\nexport type WireProtocolParams = {\n initiator: boolean;\n localPeerId: PublicKey;\n remotePeerId: PublicKey;\n topic: PublicKey;\n};\n\nexport type WireProtocolProvider = (params: WireProtocolParams) => WireProtocol;\n\n/**\n * Application-specific network protocol that is used when a connection to a peer is established.\n * Will implement high-level logic, like replication, authentication, etc.\n */\nexport interface WireProtocol {\n stream: Duplex;\n\n initialize(): Promise<void>;\n destroy(): Promise<void>;\n}\n\n/**\n * Create a wire-protocol provider backed by a teleport instance.\n * @param onConnection Called after teleport is initialized for the session. Protocol extensions could be attached here.\n * @returns\n */\nexport const createTeleportProtocolFactory = (\n onConnection: (teleport: Teleport) => Promise<void>\n): WireProtocolProvider => {\n return (params) => {\n const teleport = new Teleport(params);\n return {\n stream: teleport.stream,\n initialize: async () => {\n await teleport.open();\n await onConnection(teleport);\n },\n destroy: async () => {\n await teleport.close();\n }\n };\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["assert", "Event", "synchronized", "ErrorStream", "PublicKey", "log", "trace", "ConnectionState", "INITIAL", "CONNECTING", "CONNECTED", "CLOSING", "CLOSED", "Connection", "constructor", "topic", "ownId", "remoteId", "sessionId", "initiator", "_signalMessaging", "_protocol", "_transportFactory", "_state", "_bufferedSignals", "stateChanged", "errors", "_instanceId", "random", "toHex", "_performance", "signalsSent", "state", "transport", "_transport", "protocol", "openConnection", "_changeState", "begin", "id", "parentId", "_traceParent", "initialize", "catch", "err", "raise", "stream", "on", "close", "createTransport", "sendSignal", "signal", "author", "recipient", "data", "connected", "once", "closed", "undefined", "handle", "peerId", "destroy", "end", "status", "performance", "msg", "equals", "push", "from", "too", "emit", "assert", "PublicKey", "log", "schema", "ComplexMap", "MessageRouter", "constructor", "sendMessage", "onSignal", "onOffer", "topic", "_offerRecords", "key", "toHex", "_sendMessage", "_onSignal", "_onOffer", "_topic", "receiveMessage", "author", "recipient", "payload", "type_url", "message", "getCodecForType", "decode", "value", "equals", "from", "to", "msg", "data", "offer", "_handleOffer", "answer", "_resolveAnswers", "signal", "_handleSignal", "_sendReliableMessage", "networkMessage", "messageId", "random", "Promise", "resolve", "reject", "set", "_encodeAndSend", "encode", "offerMessageId", "offerRecord", "get", "delete", "offerMessage", "sessionId", "signalMessage", "assert", "Event", "scheduleTask", "sleep", "synchronized", "Context", "ErrorStream", "PublicKey", "log", "logInfo", "trace", "ComplexMap", "isNotNullOrUndefined", "assert", "scheduleTask", "synchronized", "Context", "PublicKey", "log", "__decorate", "CONNECTION_COUNTS_STABLE_AFTER", "Peer", "constructor", "id", "topic", "localPeerId", "_signalMessaging", "_protocolProvider", "_transportFactory", "_callbacks", "_availableAfter", "availableToConnect", "_ctx", "Context", "advertizing", "initiating", "onOffer", "message", "remoteId", "author", "connection", "toHex", "log", "peerId", "closeConnection", "accept", "assert", "sessionId", "_createConnection", "openConnection", "err", "warn", "initiateConnection", "PublicKey", "random", "answer", "offer", "recipient", "data", "ownId", "state", "ConnectionState", "INITIAL", "onRejected", "onAccepted", "initiator", "Connection", "remotePeerId", "_traceParent", "onInitiated", "_connectionCtx", "dispose", "derive", "stateChanged", "on", "CONNECTED", "_lastConnectionTime", "Date", "now", "onConnected", "CLOSED", "increaseInterval", "undefined", "onDisconnected", "scheduleTask", "onPeerAvailable", "errors", "handle", "close", "onSignal", "signal", "destroy", "synchronized", "interval", "__decorate", "INITIATION_DELAY", "getClassName", "obj", "Object", "getPrototypeOf", "constructor", "name", "Swarm", "_topic", "_ownPeerId", "_topology", "_protocolProvider", "_messenger", "_transportFactory", "_label", "_peers", "ComplexMap", "PublicKey", "hash", "_ctx", "Context", "connectionAdded", "Event", "disconnected", "connected", "errors", "ErrorStream", "_instanceId", "random", "toHex", "log", "peerId", "init", "_getSwarmController", "_swarmMessenger", "MessageRouter", "sendMessage", "msg", "onSignal", "onOffer", "topic", "listen", "payloadType", "onMessage", "message", "receiveMessage", "catch", "error", "trace", "begin", "id", "data", "connections", "Array", "from", "values", "map", "peer", "connection", "filter", "isNotNullOrUndefined", "ownPeerId", "label", "destroy", "dispose", "Promise", "all", "keys", "key", "_destroyPeer", "end", "setTopology", "topology", "assert", "disposed", "previous", "update", "onSwarmEvent", "swarmEvent", "peerAvailable", "equals", "_getOrCreatePeer", "advertizing", "peerLeft", "get", "state", "ConnectionState", "CONNECTED", "err", "accept", "author", "recipient", "answer", "info", "goOffline", "goOnline", "Peer", "onInitiated", "emit", "onConnected", "onDisconnected", "onRejected", "has", "onAccepted", "remoteId", "onPeerAvailable", "_traceParent", "set", "delete", "getState", "candidates", "availableToConnect", "connect", "scheduleTask", "_initiateConnection", "warn", "disconnect", "_closeConnection", "ctx", "sleep", "initiateConnection", "closeConnection", "logInfo", "synchronized", "Event", "EventSubscriptions", "PublicKey", "log", "ComplexMap", "SwarmMapper", "peers", "Array", "from", "_peers", "values", "constructor", "_swarm", "_subscriptions", "_connectionSubscriptions", "hash", "mapUpdated", "add", "connectionAdded", "on", "connection", "_update", "set", "remoteId", "stateChanged", "disconnected", "peerId", "get", "delete", "clear", "ownPeerId", "id", "state", "connections", "directConnections", "length", "totalPeersInSwarm", "size", "emit", "destroy", "forEach", "cb", "Event", "raise", "PublicKey", "ComplexMap", "EventType", "CONNECTION_STATE_CHANGED", "PROTOCOL_ERROR", "PROTOCOL_EXTENSIONS_INITIALIZED", "PROTOCOL_EXTENSIONS_HANDSHAKE", "PROTOCOL_HANDSHAKE", "ConnectionLog", "_swarms", "ComplexMap", "PublicKey", "hash", "update", "Event", "getSwarmInfo", "swarmId", "get", "raise", "Error", "swarms", "Array", "from", "values", "joinedSwarm", "swarm", "info", "id", "_instanceId", "topic", "isActive", "label", "connections", "set", "emit", "connectionAdded", "on", "connection", "connectionInfo", "state", "ConnectionState", "INITIAL", "remotePeerId", "remoteId", "sessionId", "transport", "Object", "getPrototypeOf", "constructor", "name", "protocolExtensions", "events", "push", "stateChanged", "type", "newState", "leftSwarm", "assert", "Event", "PublicKey", "log", "Messenger", "trace", "ConnectionState", "ComplexMap", "NetworkManager", "constructor", "transportFactory", "signalManager", "log", "_swarms", "ComplexMap", "PublicKey", "hash", "_mappers", "_connectionState", "ConnectionState", "ONLINE", "connectionStateChanged", "Event", "topicsUpdated", "_instanceId", "random", "toHex", "_transportFactory", "_signalManager", "swarmEvent", "on", "topic", "event", "get", "onSwarmEvent", "_messenger", "Messenger", "_traceParent", "_signalConnection", "join", "opts", "leave", "_connectionLog", "ConnectionLog", "connectionLog", "connectionState", "topics", "Array", "from", "keys", "getSwarmMap", "getSwarm", "open", "trace", "begin", "id", "close", "leaveSwarm", "catch", "err", "end", "joinSwarm", "peerId", "topology", "protocolProvider", "protocol", "label", "assert", "isPublicKey", "has", "Error", "toString", "swarm", "Swarm", "errors", "handle", "error", "set", "SwarmMapper", "emit", "joinedSwarm", "count", "size", "warn", "truncate", "ownPeerId", "map", "destroy", "delete", "leftSwarm", "setConnectionState", "state", "OFFLINE", "Promise", "all", "values", "goOffline", "goOnline", "assert", "FullyConnectedTopology", "toString", "init", "controller", "_controller", "update", "candidates", "discovered", "getState", "peer", "connect", "onOffer", "destroy", "assert", "distance", "log", "MMSTTopology", "constructor", "originateConnections", "maxPeers", "sampleSize", "_sampleCollected", "_originateConnections", "_maxPeers", "_sampleSize", "init", "controller", "_controller", "update", "connected", "candidates", "getState", "length", "_runAlgorithm", "onOffer", "peer", "accept", "destroy", "ownPeerId", "sorted", "sortByXorDistance", "reverse", "slice", "disconnect", "sample", "sort", "Math", "random", "connect", "toString", "keys", "reference", "a", "b", "gt", "asBuffer", "assert", "log", "StarTopology", "constructor", "_centralPeer", "toString", "truncate", "init", "controller", "_controller", "update", "candidates", "connected", "ownPeerId", "getState", "equals", "peer", "disconnect", "connect", "onOffer", "isCentral", "isSelfCentral", "destroy", "assert", "Transform", "Event", "Trigger", "ErrorStream", "PublicKey", "log", "logInfo", "ComplexMap", "__decorate", "MEMORY_TRANSPORT_DELAY", "createStreamDelay", "delay", "objectMode", "transform", "chunk", "_", "cb", "setTimeout", "MemoryTransportFactory", "createTransport", "params", "MemoryTransport", "constructor", "options", "closed", "connected", "errors", "_remote", "_outgoingDelay", "_incomingDelay", "_destroyed", "_instanceId", "random", "_connections", "has", "set", "initiator", "sendSignal", "payload", "transportId", "toHex", "wait", "timeout", "then", "remoteId", "_remoteInstanceId", "_remoteConnection", "get", "emit", "Error", "stream", "pipe", "catch", "err", "raise", "destroy", "delete", "unpipe", "undefined", "signal", "fromHex", "wake", "hash", "assert", "SimplePeerConstructor", "Event", "ErrorStream", "raise", "PublicKey", "log", "trace", "wrtc", "require", "WebRTCTransport", "constructor", "params", "_closed", "closed", "Event", "connected", "errors", "ErrorStream", "_instanceId", "PublicKey", "random", "toHex", "_performance", "bytesSent", "bytesReceived", "log", "trace", "begin", "id", "_peer", "SimplePeerConstructor", "initiator", "wrtc", "WEBRTC_SUPPORT", "undefined", "raise", "Error", "config", "webrtcConfig", "on", "data", "sendSignal", "payload", "stream", "pipe", "emit", "_disconnectStreams", "err", "_a", "_pc", "getStats", "then", "stats", "warn", "destroy", "end", "performance", "signal", "assert", "unpipe", "createWebRTCTransportFactory", "createTransport", "assert", "Duplex", "Stream", "PublicKey", "log", "ConnectionState", "ComplexMap", "WebRTCTransportService", "constructor", "_webrtcConfig", "transports", "ComplexMap", "PublicKey", "hash", "open", "request", "rpcStream", "Stream", "ready", "next", "close", "duplex", "Duplex", "read", "write", "chunk", "_", "callback", "data", "payload", "transport", "WebRTCTransport", "initiator", "stream", "sendSignal", "signal", "connection", "state", "ConnectionState", "CONNECTING", "connected", "on", "CONNECTED", "errors", "handle", "err", "CLOSED", "error", "toString", "closed", "set", "proxyId", "assert", "has", "get", "sendData", "push", "destroy", "end", "delete", "log", "assert", "Event", "Context", "ErrorStream", "PublicKey", "log", "ConnectionState", "WebRTCTransportProxy", "constructor", "_params", "_proxyId", "random", "_ctx", "closed", "_closed", "connected", "errors", "_serviceStream", "bridgeService", "open", "proxyId", "initiator", "waitUntilReady", "then", "subscribe", "event", "connection", "_handleConnection", "data", "_handleData", "signal", "_handleSignal", "dataListener", "sendData", "payload", "err", "catch", "stream", "on", "onDispose", "off", "error", "connectionEvent", "raise", "Error", "state", "CONNECTED", "emit", "CLOSED", "destroy", "dataEvent", "write", "Buffer", "from", "signalEvent", "sendSignal", "dispose", "close", "forceClose", "WebRTCTransportProxyFactory", "_connections", "Set", "setBridgeService", "_bridgeService", "createTransport", "options", "transport", "add", "delete", "Teleport", "createTeleportProtocolFactory", "onConnection", "params", "teleport", "stream", "initialize", "open", "destroy", "close"]
7
+ }
@@ -19,7 +19,7 @@ import {
19
19
  WebRTCTransportService,
20
20
  createTeleportProtocolFactory,
21
21
  createWebRTCTransportFactory
22
- } from "./chunk-4W77MFHZ.mjs";
22
+ } from "./chunk-KOU3LGWY.mjs";
23
23
  export {
24
24
  Connection,
25
25
  ConnectionLog,