@dxos/network-manager 0.1.58-main.eedac7a → 0.1.58-main.f4192cb
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.
- package/dist/lib/browser/{chunk-XRCMC23N.mjs → chunk-HKHUCTRB.mjs} +17 -21
- package/dist/lib/browser/chunk-HKHUCTRB.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +1 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +109 -109
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node/index.cjs +298 -302
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +818 -821
- package/dist/lib/node/testing/index.cjs.map +4 -4
- package/dist/types/src/swarm/peer.d.ts +2 -2
- package/dist/types/src/swarm/peer.d.ts.map +1 -1
- package/dist/types/src/swarm/swarm-mapper.d.ts.map +1 -1
- package/dist/types/src/swarm/swarm.d.ts +2 -2
- package/dist/types/src/swarm/swarm.d.ts.map +1 -1
- package/dist/types/src/testing/test-builder.d.ts +1 -1
- package/dist/types/src/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/tests/basic-test-suite.d.ts.map +1 -1
- package/dist/types/src/topology/star-topology.d.ts.map +1 -1
- package/dist/types/src/transport/simplepeer-transport-proxy.d.ts.map +1 -1
- package/dist/types/src/transport/simplepeer-transport-service.d.ts.map +1 -1
- package/package.json +17 -17
- package/src/swarm/connection.test.ts +1 -1
- package/src/swarm/peer.ts +2 -2
- package/src/swarm/swarm-mapper.ts +4 -7
- package/src/swarm/swarm.test.ts +3 -3
- package/src/swarm/swarm.ts +3 -3
- package/src/testing/test-builder.ts +1 -1
- package/src/tests/basic-test-suite.ts +1 -1
- package/src/tests/memory-transport.test.ts +2 -2
- package/src/tests/tcp-transport.test.ts +2 -2
- package/src/tests/webrtc-transport.test.ts +1 -1
- package/src/topology/star-topology.ts +1 -4
- package/src/transport/simplepeer-transport-proxy.ts +20 -19
- package/src/transport/simplepeer-transport-service.ts +1 -4
- package/dist/lib/browser/chunk-XRCMC23N.mjs.map +0 -7
|
@@ -1678,7 +1678,6 @@ var SwarmMapper = class {
|
|
|
1678
1678
|
get peers() {
|
|
1679
1679
|
return Array.from(this._peers.values());
|
|
1680
1680
|
}
|
|
1681
|
-
// prettier-ignore
|
|
1682
1681
|
constructor(_swarm) {
|
|
1683
1682
|
this._swarm = _swarm;
|
|
1684
1683
|
this._subscriptions = new EventSubscriptions();
|
|
@@ -1701,7 +1700,7 @@ var SwarmMapper = class {
|
|
|
1701
1700
|
_update() {
|
|
1702
1701
|
log5("updating swarm", void 0, {
|
|
1703
1702
|
F: __dxlog_file5,
|
|
1704
|
-
L:
|
|
1703
|
+
L: 72,
|
|
1705
1704
|
S: this,
|
|
1706
1705
|
C: (f, a) => f(...a)
|
|
1707
1706
|
});
|
|
@@ -1725,7 +1724,7 @@ var SwarmMapper = class {
|
|
|
1725
1724
|
totalPeersInSwarm: this._peers.size
|
|
1726
1725
|
}, {
|
|
1727
1726
|
F: __dxlog_file5,
|
|
1728
|
-
L:
|
|
1727
|
+
L: 113,
|
|
1729
1728
|
S: this,
|
|
1730
1729
|
C: (f, a) => f(...a)
|
|
1731
1730
|
});
|
|
@@ -2289,7 +2288,6 @@ import { invariant as invariant9 } from "@dxos/invariant";
|
|
|
2289
2288
|
import { log as log9 } from "@dxos/log";
|
|
2290
2289
|
var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/topology/star-topology.ts";
|
|
2291
2290
|
var StarTopology = class {
|
|
2292
|
-
// prettier-ignore
|
|
2293
2291
|
constructor(_centralPeer) {
|
|
2294
2292
|
this._centralPeer = _centralPeer;
|
|
2295
2293
|
}
|
|
@@ -2299,7 +2297,7 @@ var StarTopology = class {
|
|
|
2299
2297
|
init(controller) {
|
|
2300
2298
|
invariant9(!this._controller, "Already initialized.", {
|
|
2301
2299
|
F: __dxlog_file10,
|
|
2302
|
-
L:
|
|
2300
|
+
L: 21,
|
|
2303
2301
|
S: this,
|
|
2304
2302
|
A: [
|
|
2305
2303
|
"!this._controller",
|
|
@@ -2311,7 +2309,7 @@ var StarTopology = class {
|
|
|
2311
2309
|
update() {
|
|
2312
2310
|
invariant9(this._controller, "Not initialized.", {
|
|
2313
2311
|
F: __dxlog_file10,
|
|
2314
|
-
L:
|
|
2312
|
+
L: 26,
|
|
2315
2313
|
S: this,
|
|
2316
2314
|
A: [
|
|
2317
2315
|
"this._controller",
|
|
@@ -2322,7 +2320,7 @@ var StarTopology = class {
|
|
|
2322
2320
|
if (!ownPeerId.equals(this._centralPeer)) {
|
|
2323
2321
|
log9("leaf peer dropping all connections apart from central peer.", void 0, {
|
|
2324
2322
|
F: __dxlog_file10,
|
|
2325
|
-
L:
|
|
2323
|
+
L: 29,
|
|
2326
2324
|
S: this,
|
|
2327
2325
|
C: (f, a) => f(...a)
|
|
2328
2326
|
});
|
|
@@ -2332,7 +2330,7 @@ var StarTopology = class {
|
|
|
2332
2330
|
peer
|
|
2333
2331
|
}, {
|
|
2334
2332
|
F: __dxlog_file10,
|
|
2335
|
-
L:
|
|
2333
|
+
L: 34,
|
|
2336
2334
|
S: this,
|
|
2337
2335
|
C: (f, a) => f(...a)
|
|
2338
2336
|
});
|
|
@@ -2346,7 +2344,7 @@ var StarTopology = class {
|
|
|
2346
2344
|
peer
|
|
2347
2345
|
}, {
|
|
2348
2346
|
F: __dxlog_file10,
|
|
2349
|
-
L:
|
|
2347
|
+
L: 43,
|
|
2350
2348
|
S: this,
|
|
2351
2349
|
C: (f, a) => f(...a)
|
|
2352
2350
|
});
|
|
@@ -2357,7 +2355,7 @@ var StarTopology = class {
|
|
|
2357
2355
|
async onOffer(peer) {
|
|
2358
2356
|
invariant9(this._controller, "Not initialized.", {
|
|
2359
2357
|
F: __dxlog_file10,
|
|
2360
|
-
L:
|
|
2358
|
+
L: 50,
|
|
2361
2359
|
S: this,
|
|
2362
2360
|
A: [
|
|
2363
2361
|
"this._controller",
|
|
@@ -2371,7 +2369,7 @@ var StarTopology = class {
|
|
|
2371
2369
|
isSelfCentral: ownPeerId.equals(this._centralPeer)
|
|
2372
2370
|
}, {
|
|
2373
2371
|
F: __dxlog_file10,
|
|
2374
|
-
L:
|
|
2372
|
+
L: 52,
|
|
2375
2373
|
S: this,
|
|
2376
2374
|
C: (f, a) => f(...a)
|
|
2377
2375
|
});
|
|
@@ -2775,7 +2773,6 @@ import { ConnectionState as ConnectionState3 } from "@dxos/protocols/proto/dxos/
|
|
|
2775
2773
|
import { ComplexMap as ComplexMap8 } from "@dxos/util";
|
|
2776
2774
|
var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/simplepeer-transport-service.ts";
|
|
2777
2775
|
var SimplePeerTransportService = class {
|
|
2778
|
-
// prettier-ignore
|
|
2779
2776
|
constructor(_webrtcConfig) {
|
|
2780
2777
|
this._webrtcConfig = _webrtcConfig;
|
|
2781
2778
|
this.transports = new ComplexMap8(PublicKey11.hash);
|
|
@@ -2855,7 +2852,7 @@ var SimplePeerTransportService = class {
|
|
|
2855
2852
|
async sendSignal({ proxyId, signal }) {
|
|
2856
2853
|
invariant12(this.transports.has(proxyId), void 0, {
|
|
2857
2854
|
F: __dxlog_file13,
|
|
2858
|
-
L:
|
|
2855
|
+
L: 110,
|
|
2859
2856
|
S: this,
|
|
2860
2857
|
A: [
|
|
2861
2858
|
"this.transports.has(proxyId)",
|
|
@@ -2867,7 +2864,7 @@ var SimplePeerTransportService = class {
|
|
|
2867
2864
|
async sendData({ proxyId, payload }) {
|
|
2868
2865
|
invariant12(this.transports.has(proxyId), void 0, {
|
|
2869
2866
|
F: __dxlog_file13,
|
|
2870
|
-
L:
|
|
2867
|
+
L: 115,
|
|
2871
2868
|
S: this,
|
|
2872
2869
|
A: [
|
|
2873
2870
|
"this.transports.has(proxyId)",
|
|
@@ -2888,7 +2885,7 @@ var SimplePeerTransportService = class {
|
|
|
2888
2885
|
this.transports.delete(proxyId);
|
|
2889
2886
|
log12("Closed.", void 0, {
|
|
2890
2887
|
F: __dxlog_file13,
|
|
2891
|
-
L:
|
|
2888
|
+
L: 129,
|
|
2892
2889
|
S: this,
|
|
2893
2890
|
C: (f, a) => f(...a)
|
|
2894
2891
|
});
|
|
@@ -2908,7 +2905,6 @@ import { ConnectionState as ConnectionState4 } from "@dxos/protocols/proto/dxos/
|
|
|
2908
2905
|
import { arrayToBuffer } from "@dxos/util";
|
|
2909
2906
|
var __dxlog_file14 = "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/simplepeer-transport-proxy.ts";
|
|
2910
2907
|
var SimplePeerTransportProxy = class {
|
|
2911
|
-
// prettier-ignore
|
|
2912
2908
|
constructor(_params) {
|
|
2913
2909
|
this._params = _params;
|
|
2914
2910
|
this._proxyId = PublicKey12.random();
|
|
@@ -2925,7 +2921,7 @@ var SimplePeerTransportProxy = class {
|
|
|
2925
2921
|
this._serviceStream.subscribe(async (event) => {
|
|
2926
2922
|
log13("SimplePeerTransportProxy: event", event, {
|
|
2927
2923
|
F: __dxlog_file14,
|
|
2928
|
-
L:
|
|
2924
|
+
L: 55,
|
|
2929
2925
|
S: this,
|
|
2930
2926
|
C: (f, a) => f(...a)
|
|
2931
2927
|
});
|
|
@@ -2954,7 +2950,7 @@ var SimplePeerTransportProxy = class {
|
|
|
2954
2950
|
}));
|
|
2955
2951
|
}, (error) => log13.catch(error, void 0, {
|
|
2956
2952
|
F: __dxlog_file14,
|
|
2957
|
-
L:
|
|
2953
|
+
L: 83,
|
|
2958
2954
|
S: this,
|
|
2959
2955
|
C: (f, a) => f(...a)
|
|
2960
2956
|
}));
|
|
@@ -3000,7 +2996,7 @@ var SimplePeerTransportProxy = class {
|
|
|
3000
2996
|
} catch (err) {
|
|
3001
2997
|
log13.catch(err, void 0, {
|
|
3002
2998
|
F: __dxlog_file14,
|
|
3003
|
-
L:
|
|
2999
|
+
L: 134,
|
|
3004
3000
|
S: this,
|
|
3005
3001
|
C: (f, a) => f(...a)
|
|
3006
3002
|
});
|
|
@@ -3036,7 +3032,7 @@ var SimplePeerTransportProxyFactory = class {
|
|
|
3036
3032
|
createTransport(options) {
|
|
3037
3033
|
invariant13(this._bridgeService, "SimplePeerTransportProxyFactory is not ready to open connections", {
|
|
3038
3034
|
F: __dxlog_file14,
|
|
3039
|
-
L:
|
|
3035
|
+
L: 171,
|
|
3040
3036
|
S: this,
|
|
3041
3037
|
A: [
|
|
3042
3038
|
"this._bridgeService",
|
|
@@ -3455,4 +3451,4 @@ export {
|
|
|
3455
3451
|
createLibDataChannelTransportFactory,
|
|
3456
3452
|
createTeleportProtocolFactory
|
|
3457
3453
|
};
|
|
3458
|
-
//# sourceMappingURL=chunk-
|
|
3454
|
+
//# sourceMappingURL=chunk-HKHUCTRB.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/swarm/connection.ts", "../../../src/signal/swarm-messenger.ts", "../../../src/swarm/swarm.ts", "../../../src/swarm/peer.ts", "../../../src/swarm/swarm-mapper.ts", "../../../src/swarm/connection-limiter.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/transport.ts", "../../../src/transport/simplepeer-transport.ts", "../../../src/transport/webrtc.ts", "../../../src/transport/simplepeer-transport-service.ts", "../../../src/transport/simplepeer-transport-proxy.ts", "../../../src/transport/libdatachannel-transport.ts", "../../../src/wire-protocol.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2021 DXOS.org\n//\n\nimport { DeferredTask, Event, sleep, synchronized } from '@dxos/async';\nimport { Context, cancelWithContext } from '@dxos/context';\nimport { ErrorStream } from '@dxos/debug';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport {\n CancelledError,\n ProtocolError,\n ConnectionResetError,\n ConnectivityError,\n UnknownProtocolError,\n trace,\n} 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 * How long to wait before sending the signal in case we receive another signal.\n * This value is increased exponentially.\n */\nconst STARTING_SIGNALLING_DELAY = 10;\n\n/**\n * Maximum delay between signal batches.\n */\nconst MAX_SIGNALLING_DELAY = 300;\n\ninterface ConnectionCallbacks {\n /**\n * Connection opened.\n */\n onConnected?: () => void;\n\n /**\n * Connection closed.\n */\n onClosed?: (err?: Error) => void;\n}\n\n/**\n * State machine for each connection.\n */\nexport enum ConnectionState {\n /**\n * Connection is created, but not yet passed through the connection limiter.\n */\n CREATED = 'CREATED',\n\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 ABORTING = 'ABORTING',\n ABORTED = 'ABORTED',\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 readonly _ctx = new Context();\n\n private _state: ConnectionState = ConnectionState.CREATED;\n private _transport: Transport | undefined;\n closeReason?: string;\n\n private _incomingSignalBuffer: Signal[] = [];\n private _outgoingSignalBuffer: Signal[] = [];\n\n readonly stateChanged = new Event<ConnectionState>();\n readonly errors = new ErrorStream();\n\n public _instanceId = PublicKey.random().toHex();\n\n private readonly _signalSendTask = new DeferredTask(this._ctx, async () => {\n await this._flushSignalBuffer();\n });\n\n private _signallingDelay = STARTING_SIGNALLING_DELAY;\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 private readonly _callbacks?: ConnectionCallbacks,\n ) {\n log.trace('dxos.mesh.connection.construct', {\n sessionId: this.sessionId,\n topic: this.topic,\n localPeerId: this.ownId,\n remotePeerId: this.remoteId,\n initiator: this.initiator,\n });\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 async openConnection() {\n invariant(this._state === ConnectionState.INITIAL, 'Invalid state.');\n log.trace('dxos.mesh.connection.open-connection', trace.begin({ id: this._instanceId }));\n log.trace('dxos.mesh.connection.open', {\n sessionId: this.sessionId,\n topic: this.topic,\n localPeerId: this.ownId,\n remotePeerId: this.remoteId,\n initiator: this.initiator,\n });\n\n this._changeState(ConnectionState.CONNECTING);\n\n // TODO(dmaretskyi): Initialize only after the transport has established connection.\n this._protocol.open().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(new ProtocolError('protocol stream closed')).catch((err) => this.errors.raise(err));\n });\n\n invariant(!this._transport);\n this._transport = this._transportFactory.createTransport({\n initiator: this.initiator,\n stream: this._protocol.stream,\n sendSignal: async (signal) => this._sendSignal(signal),\n });\n\n this._transport.connected.once(() => {\n this._changeState(ConnectionState.CONNECTED);\n this._callbacks?.onConnected?.();\n });\n\n this._transport.closed.once(() => {\n this._transport = undefined;\n log('abort triggered by transport close');\n this.abort().catch((err) => this.errors.raise(err));\n });\n\n this._transport.errors.handle((err) => {\n log('transport error:', { err });\n if (!this.closeReason) {\n this.closeReason = err?.message;\n }\n\n // TODO(nf): fix ErrorStream so instanceof works here\n if (err instanceof ConnectionResetError) {\n log('aborting due to transport ConnectionResetError');\n this.abort().catch((err) => this.errors.raise(err));\n } else if (err instanceof ConnectivityError) {\n log('aborting due to transport ConnectivityError');\n this.abort().catch((err) => this.errors.raise(err));\n } else if (err instanceof UnknownProtocolError) {\n log('unsure what to do for UnknownProtocolError', { err });\n }\n\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._incomingSignalBuffer) {\n void this._transport.signal(signal); // TODO(burdon): Remove async?\n }\n\n this._incomingSignalBuffer = [];\n\n log.trace('dxos.mesh.connection.open-connection', trace.end({ id: this._instanceId }));\n }\n\n @synchronized\n // TODO(nf): make the caller responsible for recording the reason and determining flow control.\n async abort(err?: Error) {\n log('aborting...', { err });\n if (this._state === ConnectionState.CLOSED || this._state === ConnectionState.ABORTED) {\n log(`abort ignored: already ${this._state}`, this.closeReason);\n return;\n }\n\n this._changeState(ConnectionState.ABORTING);\n if (!this.closeReason) {\n this.closeReason = err?.message;\n }\n\n await this._ctx.dispose();\n\n try {\n // Forcefully close the stream flushing any unsent data packets.\n log('aborting protocol... ', { proto: this._protocol });\n await this._protocol.abort();\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 try {\n this._callbacks?.onClosed?.(err);\n } catch (err) {\n log.catch(err);\n }\n this._changeState(ConnectionState.ABORTED);\n }\n\n @synchronized\n async close(err?: Error) {\n if (!this.closeReason) {\n this.closeReason = err?.message;\n }\n if (\n this._state === ConnectionState.CLOSED ||\n this._state === ConnectionState.ABORTING ||\n this._state === ConnectionState.ABORTED\n ) {\n return;\n }\n const lastState = this._state;\n this._changeState(ConnectionState.CLOSING);\n\n await this._ctx.dispose();\n\n log('closing...', { peerId: this.ownId });\n\n if (lastState === ConnectionState.CONNECTED) {\n try {\n // Gracefully close the stream flushing any unsent data packets.\n await this._protocol.close();\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\n log('closed', { peerId: this.ownId });\n this._changeState(ConnectionState.CLOSED);\n this._callbacks?.onClosed?.(err);\n }\n\n private _sendSignal(signal: Signal) {\n this._outgoingSignalBuffer.push(signal);\n this._signalSendTask.schedule();\n }\n\n private async _flushSignalBuffer() {\n if (this._outgoingSignalBuffer.length === 0) {\n return;\n }\n\n try {\n if (process.env.NODE_ENV !== 'test') {\n await cancelWithContext(this._ctx, sleep(this._signallingDelay));\n this._signallingDelay = Math.min(this._signallingDelay * 2, MAX_SIGNALLING_DELAY);\n }\n\n const signals = [...this._outgoingSignalBuffer];\n this._outgoingSignalBuffer.length = 0;\n\n await this._signalMessaging.signal({\n author: this.ownId,\n recipient: this.remoteId,\n sessionId: this.sessionId,\n topic: this.topic,\n data: { signalBatch: { signals } },\n });\n } catch (err) {\n if (err instanceof CancelledError) {\n return;\n }\n\n // If signal fails treat connection as failed\n log.warn('signal failed', { err });\n await this.close();\n }\n }\n\n /**\n * Receive a signal from the remote peer.\n */\n async signal(msg: SignalMessage) {\n invariant(msg.sessionId);\n if (!msg.sessionId.equals(this.sessionId)) {\n log('dropping signal for incorrect session id');\n return;\n }\n invariant(msg.data.signal || msg.data.signalBatch);\n invariant(msg.author?.equals(this.remoteId));\n invariant(msg.recipient?.equals(this.ownId));\n\n const signals = msg.data.signalBatch ? msg.data.signalBatch.signals ?? [] : [msg.data.signal];\n for (const signal of signals) {\n if (!signal) {\n continue;\n }\n\n if ([ConnectionState.CREATED, ConnectionState.INITIAL].includes(this.state)) {\n log('buffered signal', { peerId: this.ownId, remoteId: this.remoteId, msg: msg.data });\n this._incomingSignalBuffer.push(signal);\n } else {\n invariant(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(signal);\n }\n }\n }\n\n initiate() {\n this._changeState(ConnectionState.INITIAL);\n }\n\n private _changeState(state: ConnectionState): void {\n log('stateChanged', { from: this._state, to: state, peerId: this.ownId });\n invariant(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 { Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\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}\n\nexport type SwarmMessengerOptions = {\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\nconst SwarmMessage = schema.getCodecForType('dxos.mesh.swarm.SwarmMessage');\n\n/**\n * Adds offer/answer and signal interfaces.\n */\nexport class SwarmMessenger implements SignalMessenger {\n private readonly _ctx = new Context();\n\n private readonly _sendMessage: (msg: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>;\n private readonly _onSignal: (message: SignalMessage) => Promise<void>;\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 }: SwarmMessengerOptions) {\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 = 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 } else if (message.data?.signalBatch) {\n await this._handleSignal({ author, recipient, message });\n } else {\n log.warn('unknown message', { message });\n }\n }\n\n async signal(message: SignalMessage): Promise<void> {\n invariant(message.data?.signal || message.data?.signalBatch, 'Invalid message');\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 });\n this._sendReliableMessage({\n author: message.author,\n recipient: message.recipient,\n message: networkMessage,\n }).catch((err) => reject(err));\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._sendMessage({\n author,\n recipient,\n payload: {\n type_url: 'dxos.mesh.swarm.SwarmMessage',\n value: SwarmMessage.encode(networkMessage),\n },\n });\n }\n\n private async _resolveAnswers(message: SwarmMessage): Promise<void> {\n invariant(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 invariant(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 invariant(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 try {\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 } catch (err) {\n log.warn('error sending answer', { err });\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 invariant(message.messageId);\n invariant(message.data.signal || message.data.signalBatch, 'Invalid message');\n const signalMessage: SignalMessage = {\n author,\n recipient,\n ...message,\n data: {\n signal: message.data.signal,\n signalBatch: message.data.signalBatch,\n },\n };\n\n await this._onSignal(signalMessage);\n }\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Event, scheduleTask, sleep, synchronized } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { ErrorStream } from '@dxos/debug';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log, logInfo } from '@dxos/log';\nimport { ListeningHandle, 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 { Connection, ConnectionState } from './connection';\nimport { ConnectionLimiter } from './connection-limiter';\nimport { Peer } from './peer';\nimport { SwarmMessenger, OfferMessage, SignalMessage } from '../signal';\nimport { SwarmController, Topology } from '../topology';\nimport { TransportFactory } from '../transport';\nimport { Topic } from '../types';\nimport { WireProtocolProvider } from '../wire-protocol';\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 private readonly _swarmMessenger: SwarmMessenger;\n\n private _ctx = new Context();\n\n private _listeningHandle?: ListeningHandle = undefined;\n\n /**\n * @internal\n */\n readonly _peers = new ComplexMap<PublicKey, Peer>(PublicKey.hash);\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 private readonly _connectionLimiter: ConnectionLimiter,\n private readonly _initiationDelay = INITIATION_DELAY,\n ) {\n log.trace(\n 'dxos.mesh.swarm.constructor',\n trace.begin({ id: this._instanceId, data: { topic: this._topic.toHex(), peerId: this._ownPeerId.toHex() } }),\n );\n log('creating swarm', { peerId: _ownPeerId });\n _topology.init(this._getSwarmController());\n\n this._swarmMessenger = new SwarmMessenger({\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 log.trace('dxos.mesh.swarm.constructor', trace.end({ id: this._instanceId }));\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 async open() {\n invariant(!this._listeningHandle);\n this._listeningHandle = await this._messenger.listen({\n peerId: this._ownPeerId,\n payloadType: 'dxos.mesh.swarm.SwarmMessage',\n onMessage: async (message) => {\n await this._swarmMessenger\n .receiveMessage(message)\n .catch((err) => log.warn('Error while receiving message', { err }));\n },\n });\n }\n\n async destroy() {\n log('destroying...');\n await this._listeningHandle?.unsubscribe();\n this._listeningHandle = undefined;\n\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 }\n\n async setTopology(topology: Topology) {\n invariant(!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 invariant(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 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 invariant(\n message.recipient?.equals(this._ownPeerId),\n `Invalid signal peer id expected=${this.ownPeerId}, actual=${message.recipient}`,\n );\n invariant(message.topic?.equals(this._topic));\n invariant(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 this._connectionLimiter,\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 this._peers.set(peerId, peer);\n }\n\n return peer;\n }\n\n private async _destroyPeer(peerId: PublicKey) {\n invariant(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('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(this._initiationDelay);\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 { Event, scheduleTask, synchronized } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { CancelledError, SystemError, TimeoutError } from '@dxos/protocols';\nimport { Answer } from '@dxos/protocols/proto/dxos/mesh/swarm';\n\nimport { Connection, ConnectionState } from './connection';\nimport { ConnectionLimiter } from './connection-limiter';\nimport { OfferMessage, SignalMessage, SignalMessenger } from '../signal';\nimport { TransportFactory } from '../transport';\nimport { WireProtocolProvider } from '../wire-protocol';\n\nexport class ConnectionDisplacedError extends SystemError {\n constructor() {\n super('Connection displaced by remote initiator.');\n }\n}\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 readonly connectionDisplaced = new Event<Connection>();\n\n // TODO(burdon): Convert to map?\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 _connectionLimiter: ConnectionLimiter,\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 // TODO(nf): gets stuck when remote connection is aborted (i.e. closed tab)\n log('close local connection', {\n localPeerId: this.id,\n topic: this.topic,\n remotePeerId: this.localPeerId,\n sessionId: this.connection?.sessionId,\n });\n\n if (this.connection) {\n // Close our connection and accept remote peer's connection.\n await this.closeConnection(new ConnectionDisplacedError());\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 invariant(message.sessionId);\n const connection = this._createConnection(false, message.sessionId);\n\n try {\n await this._connectionLimiter.connecting(message.sessionId);\n connection.initiate();\n\n await connection.openConnection();\n } catch (err: any) {\n if (!(err instanceof CancelledError)) {\n log.warn('connection error', { topic: this.topic, peerId: this.localPeerId, remoteId: this.id, err });\n }\n\n // Calls `onStateChange` with CLOSED state.\n await this.closeConnection(err);\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 invariant(!this.initiating, 'Initiation in progress.');\n invariant(!this.connection, 'Already connected.');\n const sessionId = PublicKey.random();\n log('initiating...', { id: this.id, topic: this.topic, peerId: this.id, sessionId });\n\n const connection = this._createConnection(true, sessionId);\n this.initiating = true;\n\n try {\n await this._connectionLimiter.connecting(sessionId);\n connection.initiate();\n\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 await connection.openConnection();\n this._callbacks.onAccepted();\n } catch (err: any) {\n log('initiation error', { err, topic: this.topic, peerId: this.localPeerId, remoteId: this.id });\n if (err instanceof TimeoutError) {\n await connection.abort(err);\n }\n // Calls `onStateChange` with CLOSED state.\n await this.closeConnection(err);\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 invariant(!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 onConnected: () => {\n this.availableToConnect = true;\n this._lastConnectionTime = Date.now();\n this._callbacks.onConnected();\n\n this._connectionLimiter.doneConnecting(sessionId);\n log.trace('dxos.mesh.connection.connected', {\n topic: this.topic,\n localPeerId: this.localPeerId,\n remotePeerId: this.id,\n sessionId,\n initiator,\n });\n },\n onClosed: (err) => {\n log('connection closed', { topic: this.topic, peerId: this.localPeerId, remoteId: this.id, initiator });\n\n // Make sure none of the connections are stuck in the limiter.\n this._connectionLimiter.doneConnecting(sessionId);\n\n invariant(this.connection === connection, 'Connection mismatch (race condition).');\n\n log.trace('dxos.mesh.connection.closed', {\n topic: this.topic,\n localPeerId: this.localPeerId,\n remotePeerId: this.id,\n sessionId,\n initiator,\n });\n\n if (err instanceof ConnectionDisplacedError) {\n this.connectionDisplaced.emit(this.connection);\n } else {\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 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\n this.connection = undefined;\n },\n },\n );\n this._callbacks.onInitiated(connection);\n\n void this._connectionCtx?.dispose();\n this._connectionCtx = this._ctx.derive();\n\n connection.errors.handle((err) => {\n log.warn('connection error', { topic: this.topic, peerId: this.localPeerId, remoteId: this.id, initiator, err });\n log.trace('dxos.mesh.connection.error', {\n topic: this.topic,\n localPeerId: this.localPeerId,\n remotePeerId: this.id,\n sessionId,\n initiator,\n err,\n });\n\n // Calls `onStateChange` with CLOSED state.\n void this.closeConnection(err);\n });\n\n this.connection = connection;\n\n return connection;\n }\n\n async closeConnection(err?: Error) {\n if (!this.connection) {\n return;\n }\n\n const connection = this.connection;\n\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(err);\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\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 constructor(private readonly _swarm: Swarm) {\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 2023 DXOS.org\n//\n\nimport { DeferredTask } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { CancelledError } from '@dxos/protocols';\nimport { ComplexMap } from '@dxos/util';\n\nexport const MAX_CONCURRENT_INITIATING_CONNECTIONS = 50;\n\nexport type ConnectionLimiterOptions = {\n maxConcurrentInitConnections?: number;\n};\n\n/**\n * Limits the amount of concurrent connections with 'CONNECTING' state.\n */\nexport class ConnectionLimiter {\n private readonly _ctx = new Context();\n private readonly _maxConcurrentInitConnections;\n /**\n * Queue of promises to resolve when initiating connections amount is below the limit.\n */\n private readonly _waitingPromises = new ComplexMap<PublicKey, { resolve: () => void; reject: (err: Error) => void }>(\n PublicKey.hash,\n );\n\n resolveWaitingPromises = new DeferredTask(this._ctx, async () => {\n Array.from(this._waitingPromises.values())\n .slice(0, this._maxConcurrentInitConnections)\n .forEach(({ resolve }) => {\n resolve();\n });\n });\n\n constructor({ maxConcurrentInitConnections = MAX_CONCURRENT_INITIATING_CONNECTIONS }: ConnectionLimiterOptions = {}) {\n this._maxConcurrentInitConnections = maxConcurrentInitConnections;\n }\n\n /**\n * @returns Promise that resolves in queue when connections amount with 'CONNECTING' state is below the limit.\n */\n async connecting(sessionId: PublicKey): Promise<void> {\n invariant(!this._waitingPromises.has(sessionId), 'Peer is already waiting for connection');\n log('waiting', { sessionId });\n await new Promise<void>((resolve, reject) => {\n this._waitingPromises.set(sessionId, {\n resolve,\n reject,\n });\n this.resolveWaitingPromises.schedule();\n });\n log('allow', { sessionId });\n }\n\n /**\n * Rejects promise returned by `connecting` method.\n */\n doneConnecting(sessionId: PublicKey) {\n log('done', { sessionId });\n if (!this._waitingPromises.has(sessionId)) {\n return;\n }\n this._waitingPromises.get(sessionId)!.reject(new CancelledError());\n this._waitingPromises.delete(sessionId);\n this.resolveWaitingPromises.schedule();\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 { MuxerStats } from '@dxos/teleport';\nimport { ComplexMap } from '@dxos/util';\n\nimport { ConnectionState, Swarm } from './swarm';\nimport { WireProtocol } from './wire-protocol';\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.CREATED,\n closeReason: connection.closeReason,\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.closeReason = connection.closeReason;\n connectionInfo.events!.push({\n type: EventType.CONNECTION_STATE_CHANGED,\n newState: state,\n });\n this.update.emit();\n });\n\n (connection.protocol as WireProtocol & { stats: Event<MuxerStats> })?.stats?.on((stats) => {\n connectionInfo.streams = stats.channels;\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 { Event } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\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, ConnectionLimiter } from './swarm';\nimport { Topology } from './topology';\nimport { TransportFactory } from './transport';\nimport { WireProtocolProvider } from './wire-protocol';\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 /**\n * @internal\n */\n 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 private readonly _connectionLimiter: ConnectionLimiter;\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._signalConnection = {\n join: (opts) => this._signalManager.join(opts),\n leave: (opts) => this._signalManager.leave(opts),\n };\n\n this._connectionLimiter = new ConnectionLimiter();\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 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.open', trace.begin({ id: this._instanceId }));\n await this._messenger.open();\n await this._signalManager.open();\n log.trace('dxos.mesh.network-manager.open', trace.end({ id: this._instanceId }));\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 }\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 invariant(PublicKey.isPublicKey(topic));\n invariant(PublicKey.isPublicKey(peerId));\n invariant(topology);\n invariant(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(\n topic,\n peerId,\n topology,\n protocol,\n this._messenger,\n this._transportFactory,\n label,\n this._connectionLimiter,\n );\n\n swarm.errors.handle((error) => {\n log('swarm error', { error });\n });\n\n this._swarms.set(topic, swarm);\n this._mappers.set(topic, new SwarmMapper(swarm));\n\n // Open before joining.\n await swarm.open();\n\n this._signalConnection.join({ topic, peerId }).catch((error) => log.catch(error));\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 { invariant } from '@dxos/invariant';\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 invariant(!this._controller, 'Already initialized');\n this._controller = controller;\n }\n\n update(): void {\n invariant(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 distance from 'xor-distance';\n\nimport { invariant } from '@dxos/invariant';\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 invariant(!this._controller, 'Already initialized');\n this._controller = controller;\n }\n\n update(): void {\n invariant(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 invariant(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 invariant(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 { invariant } from '@dxos/invariant';\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 constructor(private readonly _centralPeer: PublicKey) {}\n\n toString() {\n return `StarTopology(${this._centralPeer.truncate()})`;\n }\n\n init(controller: SwarmController): void {\n invariant(!this._controller, 'Already initialized.');\n this._controller = controller;\n }\n\n update(): void {\n invariant(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 invariant(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 { Transform } from 'node:stream';\n\nimport { Event, Trigger } from '@dxos/async';\nimport { ErrorStream } from '@dxos/debug';\nimport { invariant } from '@dxos/invariant';\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 invariant(!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 }).catch(err => {\n if (!this._destroyed) {\n this.errors.raise(err);\n }\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 invariant(!this._remoteConnection._remoteConnection, `Remote already connected: ${this._remoteInstanceId}`);\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 { Event } from '@dxos/async';\nimport { ErrorStream } from '@dxos/debug';\nimport { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';\n\nexport enum TransportKind {\n SIMPLE_PEER = 'SIMPLE_PEER',\n LIBDATACHANNEL = 'LIBDATACHANNEL',\n SIMPLE_PEER_PROXY = 'SIMPLE_PEER_PROXY',\n MEMORY = 'MEMORY',\n TCP = 'TCP',\n}\n\n/**\n * Abstraction over a P2P connection transport. Currently either WebRTC or in-memory.\n */\nexport interface Transport {\n closed: Event;\n connected: Event;\n errors: ErrorStream;\n\n destroy(): Promise<void>;\n signal(signal: Signal): void;\n}\n\nexport type TransportOptions = {\n /**\n * Did local node initiate this connection.\n */\n initiator: boolean;\n\n /**\n * Wire protocol.\n */\n stream: NodeJS.ReadWriteStream;\n\n /**\n * Send a signal message to remote peer.\n */\n sendSignal: (signal: Signal) => Promise<void>; // TODO(burdon): Remove async?\n\n timeout?: number;\n};\n\n/**\n *\n */\nexport interface TransportFactory {\n createTransport(options: TransportOptions): Transport;\n}\n", "/* eslint-disable no-fallthrough */\n//\n// Copyright 2020 DXOS.org\n//\n\nimport SimplePeerConstructor, { Instance as SimplePeer } from 'simple-peer';\nimport invariant from 'tiny-invariant';\n\nimport { Event } from '@dxos/async';\nimport { ErrorStream, raise } from '@dxos/debug';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ConnectionResetError, ConnectivityError, ProtocolError, UnknownProtocolError, 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 SimplePeerTransportParams = {\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 SimplePeerTransport 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\n constructor(private readonly params: SimplePeerTransportParams) {\n log.trace('dxos.mesh.webrtc-transport.constructor', trace.begin({ id: this._instanceId }));\n log('created connection', params);\n this._peer = new SimplePeerConstructor({\n channelName: 'dxos.mesh.transport',\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 // https://developer.mozilla.org/en-US/docs/Web/API/RTCError\n if (typeof RTCError !== 'undefined' && err instanceof RTCError) {\n // Sent when connection is unexpectedly severed\n if (err.errorDetail === 'sctp-failure') {\n this.errors.raise(new ConnectionResetError('sctp-failure from RTCError', err));\n } else {\n this.errors.raise(new UnknownProtocolError('unknown RTCError', err));\n }\n // catch more generic simple-peer errors: https://github.com/feross/simple-peer/blob/master/README.md#error-codes\n } else if ('code' in err) {\n log.info('simple-peer error', err);\n switch (err.code) {\n case 'ERR_WEBRTC_SUPPORT':\n this.errors.raise(new ProtocolError('WebRTC not supported', err));\n case 'ERR_ICE_CONNECTION_FAILURE':\n case 'ERR_DATA_CHANNEL':\n case 'ERR_CONNECTION_FAILURE':\n case 'ERR_SIGNALING':\n this.errors.raise(new ConnectivityError('unknown communication failure', err));\n case 'ERR_CREATE_OFFER':\n case 'ERR_CREATE_ANSWER':\n case 'ERR_SET_LOCAL_DESCRIPTION':\n case 'ERR_SET_REMOTE_DESCRIPTION':\n case 'ERR_ADD_ICE_CANDIDATE':\n this.errors.raise(new UnknownProtocolError('unknown simple-peer library failure', err));\n default:\n this.errors.raise(new Error('unknown simple-peer error'));\n }\n } else {\n log.info('unknown peer connection error', err);\n this.errors.raise(err);\n }\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 (err) {\n log.catch(err);\n }\n\n await this.destroy();\n });\n log.trace('dxos.mesh.webrtc-transport.constructor', trace.end({ id: this._instanceId }));\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 }\n\n signal(signal: Signal) {\n if (this._closed) {\n return; // Ignore signals after close.\n }\n\n invariant(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\nexport const createSimplePeerTransportFactory = (webrtcConfig?: any): TransportFactory => ({\n createTransport: (params) =>\n new SimplePeerTransport({\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 { Duplex } from 'node:stream';\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { invariant } from '@dxos/invariant';\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 { SimplePeerTransport } from './simplepeer-transport';\n\ntype TransportState = {\n transport: SimplePeerTransport;\n stream: Duplex;\n writeCallbacks: (() => void)[];\n};\n\nexport class SimplePeerTransportService implements BridgeService {\n private readonly transports = new ComplexMap<PublicKey, TransportState>(PublicKey.hash);\n\n constructor(private readonly _webrtcConfig?: any) {}\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 const callbacks = [...transportState.writeCallbacks];\n transportState.writeCallbacks.length = 0;\n for (const cb of callbacks) {\n cb();\n }\n },\n write: function (chunk, _, callback) {\n next({ data: { payload: chunk } });\n callback();\n },\n });\n\n const transport = new SimplePeerTransport({\n initiator: request.initiator,\n stream: duplex,\n webrtcConfig: this._webrtcConfig,\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 const transportState: TransportState = {\n transport,\n stream: duplex,\n writeCallbacks: [],\n };\n\n ready();\n\n this.transports.set(request.proxyId, transportState);\n });\n\n return rpcStream;\n }\n\n async sendSignal({ proxyId, signal }: SignalRequest): Promise<void> {\n invariant(this.transports.has(proxyId));\n await this.transports.get(proxyId)!.transport.signal(signal);\n }\n\n async sendData({ proxyId, payload }: DataRequest): Promise<void> {\n invariant(this.transports.has(proxyId));\n const state = this.transports.get(proxyId)!;\n const bufferHasSpace = state.stream.push(payload);\n if (!bufferHasSpace) {\n await new Promise<void>((resolve) => {\n state.writeCallbacks.push(resolve);\n });\n }\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 { Writable } from 'node:stream';\n\nimport { Event } from '@dxos/async';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { ErrorStream } from '@dxos/debug';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport {\n ConnectionResetError,\n TimeoutError,\n ProtocolError,\n ConnectivityError,\n UnknownProtocolError,\n} from '@dxos/protocols';\nimport { ConnectionState, BridgeEvent, BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';\nimport { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';\nimport { arrayToBuffer } from '@dxos/util';\n\nimport { Transport, TransportFactory, TransportOptions } from './transport';\n\nexport type SimplePeerTransportProxyParams = {\n initiator: boolean;\n stream: NodeJS.ReadWriteStream;\n bridgeService: BridgeService;\n // TODO(burdon): Rename onSignal.\n sendSignal: (signal: Signal) => Promise<void>;\n};\n\nexport class SimplePeerTransportProxy implements Transport {\n private readonly _proxyId = PublicKey.random();\n private readonly _ctx = new Context();\n\n readonly closed = new Event();\n readonly connected = new Event();\n readonly errors = new ErrorStream();\n\n private _closed = false;\n private _serviceStream!: Stream<BridgeEvent>;\n\n constructor(private readonly _params: SimplePeerTransportProxyParams) {\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('SimplePeerTransportProxy: 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 this._params.stream.pipe(\n new Writable({\n write: (chunk, _, callback) => {\n this._params.bridgeService\n .sendData({\n proxyId: this._proxyId,\n payload: chunk,\n })\n .then(\n () => callback(),\n (err: any) => {\n log.catch(err);\n },\n );\n },\n }),\n );\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(decodeError(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(arrayToBuffer(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(decodeError(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 await 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 void this._serviceStream.close();\n this.closed.emit();\n this._closed = true;\n }\n}\n\n// TODO(burdon): Why is this named Proxy?\nexport class SimplePeerTransportProxyFactory implements TransportFactory {\n private _bridgeService: BridgeService | undefined;\n private _connections = new Set<SimplePeerTransportProxy>();\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 invariant(this._bridgeService, 'SimplePeerTransportProxyFactory is not ready to open connections');\n\n const transport = new SimplePeerTransportProxy({\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// TODO(nf): fix so Errors crossing RPC boundary preserve class\nconst decodeError = (err: Error | string) => {\n const message = typeof err === 'string' ? err : err.message;\n\n if (message.includes('CONNECTION_RESET')) {\n return new ConnectionResetError(message);\n } else if (message.includes('TIMEOUT')) {\n return new TimeoutError(message);\n } else if (message.includes('PROTOCOL_ERROR')) {\n return new ProtocolError(message);\n } else if (message.includes('CONNECTIVITY_ERROR')) {\n return new ConnectivityError(message);\n } else if (message.includes('UNKNOWN_PROTOCOL_ERROR')) {\n return new UnknownProtocolError(message);\n } else {\n return typeof err === 'string' ? new Error(err) : err;\n }\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Duplex } from 'stream';\n\nimport { Event, Trigger, synchronized } from '@dxos/async';\nimport { ErrorStream } from '@dxos/debug';\nimport { log } from '@dxos/log';\nimport { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';\n\nimport { type PeerConnection } from './datachannel/rtc-peer-connection';\nimport { Transport, TransportFactory } from './transport';\n\nexport type LibDataChannelTransportParams = {\n initiator: boolean;\n stream: NodeJS.ReadWriteStream;\n webrtcConfig?: RTCConfiguration;\n sendSignal: (signal: Signal) => Promise<void>;\n};\n\nconst DATACHANNEL_LABEL = 'dxos.mesh.transport';\nconst MAX_BUFFERED_AMOUNT = 64 * 1024;\n\n// https://viblast.com/blog/2015/2/5/webrtc-data-channel-message-size/\nconst MAX_MESSAGE_SIZE = 64 * 1024;\n\n/**\n * Transport\n */\nexport class LibDataChannelTransport implements Transport {\n private _closed = false;\n readonly closed = new Event();\n private _connected = false;\n readonly connected = new Event();\n readonly errors = new ErrorStream();\n private readonly _peer: Promise<PeerConnection>;\n private _channel!: RTCDataChannel;\n private _stream!: Duplex;\n\n private readonly _readyForCandidates = new Trigger();\n private _writeCallback: (() => void) | null = null;\n\n constructor(private readonly params: LibDataChannelTransportParams) {\n this._peer = (async () => {\n const { RTCPeerConnection: PeerConnection } = await import('./datachannel');\n if (this._closed) {\n this.errors.raise(new Error('connection already closed'));\n }\n const peer = new PeerConnection(params.webrtcConfig);\n\n peer.onicecandidateerror = (event) => {\n log.error('peer.onicecandidateerror', { event });\n };\n\n peer.onconnectionstatechange = (event) => {\n log.debug('peer.onconnectionstatechange', {\n event,\n peerConnectionState: peer.connectionState,\n transportConnectionState: this._connected,\n });\n // TODO(nf): throw error if datachannel does not connect after some time?\n };\n\n peer.onicecandidate = async (event) => {\n log.debug('peer.onicecandidate', { event });\n if (event.candidate) {\n try {\n await params.sendSignal({\n payload: {\n data: {\n type: 'candidate',\n candidate: {\n candidate: event.candidate.candidate,\n // these fields never seem to be not null, but connecting to Chrome doesn't work if they are\n sdpMLineIndex: event.candidate.sdpMLineIndex ?? 0,\n sdpMid: event.candidate.sdpMid ?? 0,\n },\n },\n },\n });\n } catch (err) {\n log.warn('signaling errror', { err });\n }\n }\n };\n if (params.initiator) {\n peer\n .createOffer()\n .then(async (offer) => {\n if (peer.connectionState !== 'connecting') {\n log.error('i am initiator but peer not in state connecting', { peer });\n this.errors.raise(new Error('invalid state: peer is initiator, but other peer not in state connecting'));\n }\n log.debug(`im the initiator, creating offer, peer is in state ${peer.connectionState}`, { offer });\n await peer.setLocalDescription(offer);\n await params.sendSignal({ payload: { data: { type: offer.type, sdp: offer.sdp } } });\n return offer;\n })\n .catch((err) => {\n this.errors.raise(err);\n });\n this.handleChannel(peer.createDataChannel(DATACHANNEL_LABEL));\n log.debug('created data channel');\n peer.ondatachannel = (event) => {\n this.errors.raise(new Error('got ondatachannel when i am the initiator?'));\n };\n } else {\n peer.ondatachannel = (event) => {\n log.debug('peer.ondatachannel (non-initiator)', { event });\n // TODO(nf): should the label contain some identifier?\n if (event.channel.label !== DATACHANNEL_LABEL) {\n this.errors.raise(new Error(`unexpected channel label ${event.channel.label}`));\n }\n this.handleChannel(event.channel);\n };\n }\n\n return peer;\n })();\n }\n\n private handleChannel(dataChannel: RTCDataChannel) {\n this._channel = dataChannel;\n this._channel.onopen = () => {\n log.debug('dataChannel.onopen');\n const duplex = new Duplex({\n read: () => {},\n write: (chunk, encoding, callback) => {\n // todo wait to open\n\n if (chunk.length > MAX_MESSAGE_SIZE) {\n this.errors.raise(new Error(`message too large: ${chunk.length} > ${MAX_MESSAGE_SIZE}`));\n }\n dataChannel.send(chunk);\n\n if (this._channel.bufferedAmount > MAX_BUFFERED_AMOUNT) {\n if (this._writeCallback !== null) {\n log.error(\"consumer trying to write before we're ready for more data\");\n }\n this._writeCallback = callback;\n } else {\n callback();\n }\n },\n });\n\n duplex.pipe(this.params.stream).pipe(duplex);\n this._stream = duplex;\n this._connected = true;\n this.connected.emit();\n };\n\n this._channel.onerror = async (err) => {\n this.errors.raise(new Error('channel error: ' + err.toString()));\n await this._close();\n };\n this._channel.onclose = async (err) => {\n log.info('channel onclose', { err });\n await this._close();\n };\n this._channel.onmessage = (event) => {\n let data = event.data;\n if (data instanceof ArrayBuffer) {\n data = Buffer.from(data);\n }\n this._stream.push(data);\n };\n\n this._channel.onbufferedamountlow = () => {\n const cb = this._writeCallback;\n this._writeCallback = null;\n cb?.();\n };\n }\n\n @synchronized\n private async _close() {\n if (this._closed) {\n return;\n }\n await this._disconnectStreams();\n this._closed = true;\n this.closed.emit();\n }\n\n signal(signal: Signal): void {\n this._peer\n .then(async (peer) => {\n const data = signal.payload.data;\n switch (data.type) {\n case 'offer': {\n if ((await this._peer).connectionState !== 'new') {\n log.error('received offer but peer not in state new', { peer });\n this.errors.raise(new Error('invalid signalling state: received offer when peer is not in state new'));\n break;\n }\n try {\n await peer.setRemoteDescription({ type: data.type, sdp: data.sdp });\n const answer = await peer.createAnswer();\n await peer.setLocalDescription(answer);\n await this.params.sendSignal({ payload: { data: { type: answer.type, sdp: answer.sdp } } });\n this._readyForCandidates.wake();\n } catch (err) {\n log.error(\"can't handle offer from signalling server\", { err });\n this.errors.raise(new Error('error handling offer'));\n }\n break;\n }\n\n case 'answer':\n try {\n await peer.setRemoteDescription({ type: data.type, sdp: data.sdp });\n this._readyForCandidates.wake();\n } catch (err) {\n log.error(\"can't handle answer from signalling server\", { err });\n this.errors.raise(new Error('error handling answer'));\n }\n break;\n\n case 'candidate':\n await this._readyForCandidates.wait();\n await peer.addIceCandidate({ candidate: data.candidate.candidate });\n break;\n\n default:\n log.error('unhandled signal type', { type: data.type, signal });\n this.errors.raise(new Error(`unhandled signal type ${data.type}`));\n }\n })\n .catch((err) => {\n log.catch(err);\n });\n }\n\n // TODO(nf): add classmethod to call node-datachannel.cleanup() when all instances have been destroyed?\n async destroy(): Promise<void> {\n await this._close();\n }\n\n private async _disconnectStreams() {\n this.params.stream.unpipe?.(this._stream)?.unpipe?.(this.params.stream);\n }\n}\n\nexport const createLibDataChannelTransportFactory = (webrtcConfig?: any): TransportFactory => ({\n createTransport: (params) =>\n new LibDataChannelTransport({\n ...params,\n webrtcConfig,\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 open(): Promise<void>;\n close(): Promise<void>;\n abort(): 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 open: async () => {\n await teleport.open();\n await onConnection(teleport);\n },\n close: async () => {\n await teleport.close();\n },\n abort: async () => {\n await teleport.abort();\n },\n };\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DeferredTask", "Event", "sleep", "synchronized", "Context", "cancelWithContext", "ErrorStream", "invariant", "PublicKey", "log", "CancelledError", "ProtocolError", "ConnectionResetError", "ConnectivityError", "UnknownProtocolError", "trace", "STARTING_SIGNALLING_DELAY", "MAX_SIGNALLING_DELAY", "ConnectionState", "CREATED", "INITIAL", "CONNECTING", "CONNECTED", "CLOSING", "CLOSED", "ABORTING", "ABORTED", "Connection", "constructor", "topic", "ownId", "remoteId", "sessionId", "initiator", "_signalMessaging", "_protocol", "_transportFactory", "_callbacks", "_ctx", "_state", "_incomingSignalBuffer", "_outgoingSignalBuffer", "stateChanged", "errors", "_instanceId", "random", "toHex", "_signalSendTask", "_flushSignalBuffer", "_signallingDelay", "localPeerId", "remotePeerId", "state", "transport", "_transport", "protocol", "openConnection", "begin", "id", "_changeState", "open", "catch", "err", "raise", "stream", "on", "close", "createTransport", "sendSignal", "signal", "_sendSignal", "connected", "once", "onConnected", "closed", "undefined", "abort", "handle", "closeReason", "message", "end", "dispose", "proto", "destroy", "onClosed", "lastState", "peerId", "push", "schedule", "length", "process", "Math", "min", "signals", "author", "recipient", "data", "signalBatch", "warn", "msg", "equals", "includes", "initiate", "from", "to", "emit", "Context", "invariant", "PublicKey", "log", "schema", "ComplexMap", "SwarmMessage", "getCodecForType", "SwarmMessenger", "constructor", "sendMessage", "onSignal", "onOffer", "topic", "_ctx", "_offerRecords", "key", "toHex", "_sendMessage", "_onSignal", "_onOffer", "_topic", "receiveMessage", "author", "recipient", "payload", "type_url", "message", "decode", "value", "equals", "from", "to", "msg", "data", "offer", "_handleOffer", "answer", "_resolveAnswers", "signal", "_handleSignal", "signalBatch", "warn", "_sendReliableMessage", "networkMessage", "messageId", "random", "Promise", "resolve", "reject", "set", "catch", "err", "encode", "offerMessageId", "offerRecord", "get", "delete", "offerMessage", "sessionId", "signalMessage", "Event", "scheduleTask", "sleep", "synchronized", "Context", "ErrorStream", "invariant", "PublicKey", "log", "logInfo", "trace", "ComplexMap", "isNotNullOrUndefined", "Event", "scheduleTask", "synchronized", "Context", "invariant", "PublicKey", "log", "CancelledError", "SystemError", "TimeoutError", "ConnectionDisplacedError", "SystemError", "constructor", "CONNECTION_COUNTS_STABLE_AFTER", "Peer", "id", "topic", "localPeerId", "_signalMessaging", "_protocolProvider", "_transportFactory", "_connectionLimiter", "_callbacks", "_availableAfter", "availableToConnect", "_ctx", "Context", "advertizing", "initiating", "connectionDisplaced", "Event", "onOffer", "message", "remoteId", "author", "connection", "toHex", "log", "remotePeerId", "sessionId", "closeConnection", "accept", "invariant", "_createConnection", "connecting", "initiate", "openConnection", "err", "CancelledError", "warn", "peerId", "initiateConnection", "PublicKey", "random", "answer", "offer", "recipient", "data", "ownId", "state", "ConnectionState", "INITIAL", "onRejected", "onAccepted", "TimeoutError", "abort", "initiator", "Connection", "onConnected", "_lastConnectionTime", "Date", "now", "doneConnecting", "trace", "onClosed", "emit", "increaseInterval", "onDisconnected", "scheduleTask", "_connectionCtx", "onPeerAvailable", "undefined", "onInitiated", "dispose", "derive", "errors", "handle", "close", "onSignal", "signal", "destroy", "synchronized", "interval", "INITIATION_DELAY", "getClassName", "obj", "Object", "getPrototypeOf", "constructor", "name", "Swarm", "_topic", "_ownPeerId", "_topology", "_protocolProvider", "_messenger", "_transportFactory", "_label", "_connectionLimiter", "_initiationDelay", "_ctx", "Context", "_listeningHandle", "undefined", "_peers", "ComplexMap", "PublicKey", "hash", "_instanceId", "random", "toHex", "connectionAdded", "Event", "disconnected", "connected", "errors", "ErrorStream", "log", "trace", "begin", "id", "data", "topic", "peerId", "init", "_getSwarmController", "_swarmMessenger", "SwarmMessenger", "sendMessage", "msg", "onSignal", "onOffer", "end", "connections", "Array", "from", "values", "map", "peer", "connection", "filter", "isNotNullOrUndefined", "ownPeerId", "label", "open", "invariant", "listen", "payloadType", "onMessage", "message", "receiveMessage", "catch", "err", "warn", "destroy", "unsubscribe", "dispose", "Promise", "all", "keys", "key", "_destroyPeer", "setTopology", "topology", "disposed", "previous", "update", "onSwarmEvent", "swarmEvent", "peerAvailable", "equals", "_getOrCreatePeer", "advertizing", "peerLeft", "get", "state", "ConnectionState", "CONNECTED", "accept", "author", "recipient", "answer", "info", "goOffline", "goOnline", "Peer", "onInitiated", "emit", "onConnected", "onDisconnected", "onRejected", "has", "onAccepted", "remoteId", "onPeerAvailable", "set", "delete", "getState", "candidates", "availableToConnect", "connect", "scheduleTask", "_initiateConnection", "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", "DeferredTask", "Context", "invariant", "PublicKey", "log", "CancelledError", "ComplexMap", "MAX_CONCURRENT_INITIATING_CONNECTIONS", "ConnectionLimiter", "constructor", "maxConcurrentInitConnections", "_ctx", "_waitingPromises", "hash", "resolveWaitingPromises", "Array", "from", "values", "slice", "_maxConcurrentInitConnections", "forEach", "resolve", "connecting", "sessionId", "has", "Promise", "reject", "set", "schedule", "doneConnecting", "get", "delete", "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", "CREATED", "closeReason", "remotePeerId", "remoteId", "sessionId", "transport", "Object", "getPrototypeOf", "constructor", "name", "protocolExtensions", "events", "push", "stateChanged", "type", "newState", "protocol", "stats", "streams", "channels", "leftSwarm", "Event", "invariant", "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", "_signalConnection", "join", "opts", "leave", "_connectionLimiter", "ConnectionLimiter", "_connectionLog", "ConnectionLog", "connectionLog", "connectionState", "topics", "Array", "from", "keys", "getSwarmMap", "getSwarm", "open", "trace", "begin", "id", "end", "close", "leaveSwarm", "catch", "err", "joinSwarm", "peerId", "topology", "protocolProvider", "protocol", "label", "invariant", "isPublicKey", "has", "Error", "toString", "swarm", "Swarm", "errors", "handle", "error", "set", "SwarmMapper", "emit", "joinedSwarm", "count", "size", "ownPeerId", "map", "destroy", "delete", "leftSwarm", "setConnectionState", "state", "OFFLINE", "Promise", "all", "values", "goOffline", "goOnline", "invariant", "FullyConnectedTopology", "toString", "init", "controller", "_controller", "update", "candidates", "discovered", "getState", "peer", "connect", "onOffer", "destroy", "distance", "invariant", "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", "invariant", "log", "StarTopology", "constructor", "_centralPeer", "toString", "truncate", "init", "controller", "_controller", "update", "candidates", "connected", "ownPeerId", "getState", "equals", "peer", "disconnect", "connect", "onOffer", "isCentral", "isSelfCentral", "destroy", "Transform", "Event", "Trigger", "ErrorStream", "invariant", "PublicKey", "log", "logInfo", "ComplexMap", "MEMORY_TRANSPORT_DELAY", "createStreamDelay", "delay", "objectMode", "transform", "chunk", "_", "cb", "setTimeout", "MemoryTransportFactory", "createTransport", "params", "MemoryTransport", "_connections", "hash", "constructor", "options", "closed", "connected", "errors", "_instanceId", "random", "_remote", "_outgoingDelay", "_incomingDelay", "_destroyed", "has", "set", "initiator", "sendSignal", "payload", "transportId", "toHex", "catch", "err", "raise", "wait", "timeout", "then", "remoteId", "_remoteInstanceId", "_remoteConnection", "get", "emit", "stream", "pipe", "destroy", "delete", "unpipe", "undefined", "signal", "fromHex", "wake", "TransportKind", "SIMPLE_PEER", "LIBDATACHANNEL", "SIMPLE_PEER_PROXY", "MEMORY", "TCP", "SimplePeerConstructor", "invariant", "Event", "ErrorStream", "raise", "PublicKey", "log", "ConnectionResetError", "ConnectivityError", "ProtocolError", "UnknownProtocolError", "trace", "wrtc", "require", "SimplePeerTransport", "constructor", "params", "_closed", "closed", "Event", "connected", "errors", "ErrorStream", "_instanceId", "PublicKey", "random", "toHex", "log", "trace", "begin", "id", "_peer", "SimplePeerConstructor", "channelName", "initiator", "wrtc", "WEBRTC_SUPPORT", "undefined", "raise", "Error", "config", "webrtcConfig", "on", "data", "sendSignal", "payload", "stream", "pipe", "emit", "_disconnectStreams", "err", "RTCError", "errorDetail", "ConnectionResetError", "UnknownProtocolError", "info", "code", "ProtocolError", "ConnectivityError", "_pc", "getStats", "then", "stats", "warn", "catch", "destroy", "end", "signal", "invariant", "unpipe", "createSimplePeerTransportFactory", "createTransport", "Duplex", "Stream", "invariant", "PublicKey", "log", "ConnectionState", "ComplexMap", "SimplePeerTransportService", "constructor", "_webrtcConfig", "transports", "ComplexMap", "PublicKey", "hash", "open", "request", "rpcStream", "Stream", "ready", "next", "close", "duplex", "Duplex", "read", "callbacks", "transportState", "writeCallbacks", "length", "cb", "write", "chunk", "_", "callback", "data", "payload", "transport", "SimplePeerTransport", "initiator", "stream", "webrtcConfig", "sendSignal", "signal", "connection", "state", "ConnectionState", "CONNECTING", "connected", "on", "CONNECTED", "errors", "handle", "err", "CLOSED", "error", "toString", "closed", "set", "proxyId", "invariant", "has", "get", "sendData", "bufferHasSpace", "push", "Promise", "resolve", "destroy", "end", "delete", "log", "Writable", "Event", "Context", "ErrorStream", "invariant", "PublicKey", "log", "ConnectionResetError", "TimeoutError", "ProtocolError", "ConnectivityError", "UnknownProtocolError", "ConnectionState", "arrayToBuffer", "SimplePeerTransportProxy", "constructor", "_params", "_proxyId", "random", "_ctx", "closed", "connected", "errors", "_closed", "_serviceStream", "bridgeService", "open", "proxyId", "initiator", "waitUntilReady", "then", "subscribe", "event", "connection", "_handleConnection", "data", "_handleData", "signal", "_handleSignal", "stream", "pipe", "write", "chunk", "_", "callback", "sendData", "payload", "err", "catch", "error", "connectionEvent", "raise", "decodeError", "state", "CONNECTED", "emit", "CLOSED", "destroy", "dataEvent", "signalEvent", "sendSignal", "dispose", "close", "forceClose", "SimplePeerTransportProxyFactory", "_connections", "Set", "setBridgeService", "_bridgeService", "createTransport", "options", "transport", "add", "on", "delete", "message", "includes", "Error", "Duplex", "Event", "Trigger", "synchronized", "ErrorStream", "log", "DATACHANNEL_LABEL", "MAX_BUFFERED_AMOUNT", "MAX_MESSAGE_SIZE", "LibDataChannelTransport", "constructor", "params", "_closed", "closed", "_connected", "connected", "errors", "_readyForCandidates", "_writeCallback", "_peer", "RTCPeerConnection", "PeerConnection", "raise", "Error", "peer", "webrtcConfig", "onicecandidateerror", "event", "error", "onconnectionstatechange", "debug", "peerConnectionState", "connectionState", "transportConnectionState", "onicecandidate", "candidate", "sendSignal", "payload", "data", "type", "sdpMLineIndex", "sdpMid", "err", "warn", "initiator", "createOffer", "then", "offer", "setLocalDescription", "sdp", "catch", "handleChannel", "createDataChannel", "ondatachannel", "channel", "label", "dataChannel", "_channel", "onopen", "duplex", "read", "write", "chunk", "encoding", "callback", "length", "send", "bufferedAmount", "pipe", "stream", "_stream", "emit", "onerror", "toString", "_close", "onclose", "info", "onmessage", "ArrayBuffer", "Buffer", "from", "push", "onbufferedamountlow", "cb", "_disconnectStreams", "signal", "setRemoteDescription", "answer", "createAnswer", "wake", "wait", "addIceCandidate", "destroy", "unpipe", "createLibDataChannelTransportFactory", "createTransport", "Teleport", "createTeleportProtocolFactory", "onConnection", "params", "teleport", "Teleport", "stream", "open", "close", "abort"]
|
|
7
|
+
}
|