@dxos/network-manager 0.1.55 → 0.1.56-main.09ca29d
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-IBLQYMBY.mjs → chunk-FC6CWDES.mjs} +823 -294
- package/dist/lib/browser/chunk-FC6CWDES.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +5 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +2 -2
- package/dist/lib/node/index.cjs +843 -312
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +772 -301
- package/dist/lib/node/testing/index.cjs.map +4 -4
- package/dist/types/src/network-manager.d.ts +1 -1
- package/dist/types/src/network-manager.d.ts.map +1 -1
- package/dist/types/src/signal/swarm-messenger.d.ts.map +1 -1
- package/dist/types/src/swarm/connection-limiter.d.ts +28 -0
- package/dist/types/src/swarm/connection-limiter.d.ts.map +1 -0
- package/dist/types/src/swarm/connection-limiter.test.d.ts +2 -0
- package/dist/types/src/swarm/connection-limiter.test.d.ts.map +1 -0
- package/dist/types/src/swarm/connection.d.ts +1 -1
- package/dist/types/src/swarm/connection.d.ts.map +1 -1
- package/dist/types/src/swarm/connection.test.d.ts +2 -0
- package/dist/types/src/swarm/connection.test.d.ts.map +1 -0
- package/dist/types/src/swarm/index.d.ts +1 -0
- package/dist/types/src/swarm/index.d.ts.map +1 -1
- package/dist/types/src/swarm/peer.d.ts +3 -1
- package/dist/types/src/swarm/peer.d.ts.map +1 -1
- package/dist/types/src/swarm/swarm.d.ts +3 -1
- package/dist/types/src/swarm/swarm.d.ts.map +1 -1
- package/dist/types/src/topology/fully-connected-topology.d.ts.map +1 -1
- package/dist/types/src/topology/star-topology.d.ts.map +1 -1
- package/dist/types/src/transport/memory-transport.d.ts.map +1 -1
- package/dist/types/src/transport/webrtc-transport-proxy.d.ts.map +1 -1
- package/dist/types/src/transport/webrtc-transport-service.d.ts.map +1 -1
- package/dist/types/src/transport/webrtc-transport.d.ts.map +1 -1
- package/package.json +18 -18
- package/src/network-manager.ts +19 -6
- package/src/signal/swarm-messenger.ts +1 -2
- package/src/swarm/connection-limiter.test.ts +44 -0
- package/src/swarm/connection-limiter.ts +72 -0
- package/src/swarm/connection.test.ts +72 -0
- package/src/swarm/connection.ts +18 -5
- package/src/swarm/index.ts +1 -0
- package/src/swarm/peer.ts +46 -9
- package/src/swarm/swarm.test.ts +140 -90
- package/src/swarm/swarm.ts +4 -3
- package/src/topology/fully-connected-topology.ts +1 -2
- package/src/topology/mmst-topology.ts +1 -1
- package/src/topology/star-topology.ts +1 -2
- package/src/transport/memory-transport.ts +1 -1
- package/src/transport/webrtc-transport-proxy.ts +14 -12
- package/src/transport/webrtc-transport-service.ts +31 -8
- package/src/transport/webrtc-transport.ts +1 -1
- package/dist/lib/browser/chunk-IBLQYMBY.mjs.map +0 -7
|
@@ -45,12 +45,12 @@ export type NetworkManagerOptions = {
|
|
|
45
45
|
* Manages connection to the swarm.
|
|
46
46
|
*/
|
|
47
47
|
export declare class NetworkManager {
|
|
48
|
-
private readonly _swarms;
|
|
49
48
|
private readonly _mappers;
|
|
50
49
|
private readonly _transportFactory;
|
|
51
50
|
private readonly _signalManager;
|
|
52
51
|
private readonly _messenger;
|
|
53
52
|
private readonly _signalConnection;
|
|
53
|
+
private readonly _connectionLimiter;
|
|
54
54
|
private _connectionState;
|
|
55
55
|
readonly connectionStateChanged: Event<ConnectionState>;
|
|
56
56
|
private readonly _connectionLog?;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-manager.d.ts","sourceRoot":"","sources":["../../../src/network-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"network-manager.d.ts","sourceRoot":"","sources":["../../../src/network-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAa,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAG7E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAqB,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAGF,MAAM,MAAM,YAAY,GAAG;IACzB;;OAEG;IACH,KAAK,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,MAAM,EAAE,SAAS,CAAC;IAElB;;OAEG;IACH,gBAAgB,EAAE,oBAAoB,CAAC;IAEvC;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,CAAC;AAEF;;GAEG;AAEH,qBAAa,cAAc;IAKzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0D;IAEnF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAmB;IACrD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAmB;IACrD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;IAEvD,OAAO,CAAC,gBAAgB,CAA0B;IAClD,SAAgB,sBAAsB,yBAAgC;IAEtE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAgB;IAEhD,SAAgB,aAAa,cAAqB;IAElD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAE9C,EAAE,gBAAgB,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE,qBAAqB;IAoB3E,IAAI,aAAa,8BAEhB;IAED,IAAI,eAAe,oBAElB;IAGD,IAAI,MAAM,gBAET;IAED,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS;IAItD,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,GAAG,SAAS;IAIvC,IAAI;IAOJ,KAAK;IAWX;;OAEG;IACG,SAAS,CAAC,EACd,KAAK,EACL,MAAM,EACN,QAAQ,EACR,gBAAgB,EAAE,QAAQ,EAC1B,KAAK,GACN,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;IA0C1C;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,SAAS;IAuB3B,kBAAkB,CAAC,KAAK,EAAE,eAAe;CA0BhD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swarm-messenger.d.ts","sourceRoot":"","sources":["../../../../src/signal/swarm-messenger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"swarm-messenger.d.ts","sourceRoot":"","sources":["../../../../src/signal/swarm-messenger.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAG3C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,MAAM,EAAgB,MAAM,uCAAuC,CAAC;AAG7E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAMlF,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,EAAE,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClG,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,KAAK,EAAE,SAAS,CAAC;CAClB,CAAC;AAIF;;GAEG;AACH,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4C;IACtE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoF;IAEjH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6C;IACtE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IAEnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4E;gBAE9F,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,qBAAqB;IAOtE,cAAc,CAAC,EACnB,MAAM,EACN,SAAS,EACT,OAAO,GACR,EAAE;QACD,MAAM,EAAE,SAAS,CAAC;QAClB,SAAS,EAAE,SAAS,CAAC;QACrB,OAAO,EAAE,GAAG,CAAC;KACd,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BX,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7C,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;YAerC,oBAAoB;YA0BpB,eAAe;YAWf,YAAY;YAiCZ,aAAa;CAuB5B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DeferredTask } from '@dxos/async';
|
|
2
|
+
import { PublicKey } from '@dxos/keys';
|
|
3
|
+
export declare const MAX_CONCURRENT_INITIATING_CONNECTIONS = 3;
|
|
4
|
+
export type ConnectionLimiterOptions = {
|
|
5
|
+
maxConcurrentInitConnections?: number;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Limits the amount of concurrent connections with 'CONNECTING' state.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ConnectionLimiter {
|
|
11
|
+
private readonly _ctx;
|
|
12
|
+
private readonly _maxConcurrentInitConnections;
|
|
13
|
+
/**
|
|
14
|
+
* Queue of promises to resolve when initiating connections amount is below the limit.
|
|
15
|
+
*/
|
|
16
|
+
private readonly _waitingPromises;
|
|
17
|
+
resolveWaitingPromises: DeferredTask;
|
|
18
|
+
constructor({ maxConcurrentInitConnections }?: ConnectionLimiterOptions);
|
|
19
|
+
/**
|
|
20
|
+
* @returns Promise that resolves in queue when connections amount with 'CONNECTING' state is below the limit.
|
|
21
|
+
*/
|
|
22
|
+
connecting(sessionId: PublicKey): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Rejects promise returned by `connecting` method.
|
|
25
|
+
*/
|
|
26
|
+
doneConnecting(sessionId: PublicKey): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=connection-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-limiter.d.ts","sourceRoot":"","sources":["../../../../src/swarm/connection-limiter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIvC,eAAO,MAAM,qCAAqC,IAAI,CAAC;AAEvD,MAAM,MAAM,wBAAwB,GAAG;IACrC,4BAA4B,CAAC,EAAE,MAAM,CAAC;CACvC,CAAC;AAEF;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC/C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAE/B;IAEF,sBAAsB,eAMnB;gBAES,EAAE,4BAAoE,EAAE,GAAE,wBAA6B;IAInH;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAarD;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,SAAS;CASpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-limiter.test.d.ts","sourceRoot":"","sources":["../../../../src/swarm/connection-limiter.test.ts"],"names":[],"mappings":""}
|
|
@@ -61,7 +61,7 @@ export declare class Connection {
|
|
|
61
61
|
/**
|
|
62
62
|
* Create an underlying transport and prepares it for the connection.
|
|
63
63
|
*/
|
|
64
|
-
openConnection(): void
|
|
64
|
+
openConnection(): Promise<void>;
|
|
65
65
|
close(): Promise<void>;
|
|
66
66
|
private _sendSignal;
|
|
67
67
|
private _flushSignalBuffer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../../src/swarm/connection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../../src/swarm/connection.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,EAAuB,MAAM,aAAa,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAKvC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAahD;;GAEG;AACH,oBAAY,eAAe;IACzB;;;OAGG;IACH,OAAO,YAAY;IAEnB;;OAEG;IACH,UAAU,eAAe;IAEzB;;OAEG;IACH,SAAS,cAAc;IAEvB;;OAEG;IACH,OAAO,YAAY;IAEnB;;OAEG;IACH,MAAM,WAAW;CAClB;AAED;;;GAGG;AACH,qBAAa,UAAU;aAqBH,KAAK,EAAE,SAAS;aAChB,KAAK,EAAE,SAAS;aAChB,QAAQ,EAAE,SAAS;aACnB,SAAS,EAAE,SAAS;aACpB,SAAS,EAAE,OAAO;IAClC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IA3BpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IAEtC,OAAO,CAAC,MAAM,CAA4C;IAC1D,OAAO,CAAC,UAAU,CAAwB;IAE1C,OAAO,CAAC,qBAAqB,CAAgB;IAC7C,OAAO,CAAC,qBAAqB,CAAgB;IAE7C,QAAQ,CAAC,YAAY,yBAAgC;IACrD,QAAQ,CAAC,MAAM,cAAqB;IAE7B,WAAW,SAA8B;IAEhD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAE7B;IAEH,OAAO,CAAC,gBAAgB,CAA6B;gBAGnC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,SAAS,EAAE,wBAAwB;IAC1C,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,OAAO,EACjB,gBAAgB,EAAE,eAAe,EACjC,SAAS,EAAE,YAAY,EACvB,iBAAiB,EAAE,gBAAgB;IAWtD,IAAI,KAAK,oBAER;IAED,IAAI,SAAS,0BAEZ;IAED,IAAI,QAAQ,iBAEX;IAED;;OAEG;IACG,cAAc;IAyDd,KAAK;IA4BX,OAAO,CAAC,WAAW;YAKL,kBAAkB;IA8BhC;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,aAAa;IA2B/B,OAAO,CAAC,YAAY;CAMrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.test.d.ts","sourceRoot":"","sources":["../../../../src/swarm/connection.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/swarm/index.ts"],"names":[],"mappings":"AAIA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/swarm/index.ts"],"names":[],"mappings":"AAIA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC"}
|
|
@@ -4,6 +4,7 @@ import { OfferMessage, SignalMessage, SignalMessenger } from '../signal';
|
|
|
4
4
|
import { TransportFactory } from '../transport';
|
|
5
5
|
import { WireProtocolProvider } from '../wire-protocol';
|
|
6
6
|
import { Connection } from './connection';
|
|
7
|
+
import { ConnectionLimiter } from './connection-limiter';
|
|
7
8
|
interface PeerCallbacks {
|
|
8
9
|
/**
|
|
9
10
|
* Connection attempt initiated.
|
|
@@ -45,6 +46,7 @@ export declare class Peer {
|
|
|
45
46
|
private readonly _signalMessaging;
|
|
46
47
|
private readonly _protocolProvider;
|
|
47
48
|
private readonly _transportFactory;
|
|
49
|
+
private readonly _connectionLimiter;
|
|
48
50
|
private readonly _callbacks;
|
|
49
51
|
/**
|
|
50
52
|
* Will be available to connect after this time.
|
|
@@ -60,7 +62,7 @@ export declare class Peer {
|
|
|
60
62
|
*/
|
|
61
63
|
advertizing: boolean;
|
|
62
64
|
initiating: boolean;
|
|
63
|
-
constructor(id: PublicKey, topic: PublicKey, localPeerId: PublicKey, _signalMessaging: SignalMessenger, _protocolProvider: WireProtocolProvider, _transportFactory: TransportFactory, _callbacks: PeerCallbacks);
|
|
65
|
+
constructor(id: PublicKey, topic: PublicKey, localPeerId: PublicKey, _signalMessaging: SignalMessenger, _protocolProvider: WireProtocolProvider, _transportFactory: TransportFactory, _connectionLimiter: ConnectionLimiter, _callbacks: PeerCallbacks);
|
|
64
66
|
/**
|
|
65
67
|
* Respond to remote offer.
|
|
66
68
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peer.d.ts","sourceRoot":"","sources":["../../../../src/swarm/peer.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"peer.d.ts","sourceRoot":"","sources":["../../../../src/swarm/peer.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,UAAU,aAAa;IACrB;;OAEG;IACH,WAAW,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAE9C;;OAEG;IACH,WAAW,EAAE,MAAM,IAAI,CAAC;IAExB;;OAEG;IACH,cAAc,EAAE,MAAM,IAAI,CAAC;IAE3B;;OAEG;IACH,UAAU,EAAE,MAAM,IAAI,CAAC;IAEvB;;OAEG;IACH,UAAU,EAAE,MAAM,IAAI,CAAC;IAEvB;;OAEG;IACH,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnD;;OAEG;IACH,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B;AAOD;;;GAGG;AACH,qBAAa,IAAI;aAoBG,EAAE,EAAE,SAAS;aACb,KAAK,EAAE,SAAS;aAChB,WAAW,EAAE,SAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU;IA1B7B;;OAEG;IACH,OAAO,CAAC,eAAe,CAAK;IACrB,kBAAkB,UAAQ;IACjC,OAAO,CAAC,mBAAmB,CAAC,CAAS;IAErC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,cAAc,CAAC,CAAU;IAE1B,UAAU,CAAC,EAAE,UAAU,CAAC;IAE/B;;OAEG;IACI,WAAW,UAAS;IAEpB,UAAU,UAAS;gBAER,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,SAAS,EACrB,gBAAgB,EAAE,eAAe,EACjC,iBAAiB,EAAE,oBAAoB,EACvC,iBAAiB,EAAE,gBAAgB,EACnC,kBAAkB,EAAE,iBAAiB,EACrC,UAAU,EAAE,aAAa;IAG5C;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAiDrD;;OAEG;IACG,kBAAkB;IAyCxB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAqGnB,eAAe;IAcf,QAAQ,CAAC,OAAO,EAAE,aAAa;IAU/B,OAAO;CAOd"}
|
|
@@ -9,6 +9,7 @@ import { TransportFactory } from '../transport';
|
|
|
9
9
|
import { Topic } from '../types';
|
|
10
10
|
import { WireProtocolProvider } from '../wire-protocol';
|
|
11
11
|
import { Connection } from './connection';
|
|
12
|
+
import { ConnectionLimiter } from './connection-limiter';
|
|
12
13
|
/**
|
|
13
14
|
* A single peer's view of the swarm.
|
|
14
15
|
* Manages a set of connections implemented by simple-peer instances.
|
|
@@ -22,6 +23,7 @@ export declare class Swarm {
|
|
|
22
23
|
private readonly _messenger;
|
|
23
24
|
private readonly _transportFactory;
|
|
24
25
|
private readonly _label;
|
|
26
|
+
private readonly _connectionLimiter;
|
|
25
27
|
private readonly _swarmMessenger;
|
|
26
28
|
private _ctx;
|
|
27
29
|
private _listeningHandle?;
|
|
@@ -30,7 +32,7 @@ export declare class Swarm {
|
|
|
30
32
|
*/
|
|
31
33
|
readonly _instanceId: string;
|
|
32
34
|
readonly errors: ErrorStream;
|
|
33
|
-
constructor(_topic: PublicKey, _ownPeerId: PublicKey, _topology: Topology, _protocolProvider: WireProtocolProvider, _messenger: Messenger, _transportFactory: TransportFactory, _label: string | undefined);
|
|
35
|
+
constructor(_topic: PublicKey, _ownPeerId: PublicKey, _topology: Topology, _protocolProvider: WireProtocolProvider, _messenger: Messenger, _transportFactory: TransportFactory, _label: string | undefined, _connectionLimiter: ConnectionLimiter);
|
|
34
36
|
get connections(): Connection[];
|
|
35
37
|
get ownPeerId(): PublicKey;
|
|
36
38
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../../../../src/swarm/swarm.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../../../../src/swarm/swarm.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAmB,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAG/D,OAAO,EAAkB,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAmB,QAAQ,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAQzD;;;;GAIG;AACH,qBAAa,KAAK;IA0Cd,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IA3CrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAEjD,OAAO,CAAC,IAAI,CAAiB;IAE7B,OAAO,CAAC,gBAAgB,CAAC,CAA8B;IAEvD;;OAEG;IAEH,QAAQ,CAAC,WAAW,SAA8B;IAoBlD,QAAQ,CAAC,MAAM,cAAqB;gBAMjB,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,SAAS,EAC9B,SAAS,EAAE,QAAQ,EACV,iBAAiB,EAAE,oBAAoB,EACvC,UAAU,EAAE,SAAS,EACrB,iBAAiB,EAAE,gBAAgB,EACnC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,kBAAkB,EAAE,iBAAiB;IAkBxD,IAAI,WAAW,iBAId;IAED,IACI,SAAS,cAEZ;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED,IACI,KAAK,IAAI,KAAK,CAEjB;IAEK,IAAI;IAaJ,OAAO;IAWP,WAAW,CAAC,QAAQ,EAAE,QAAQ;IAiBpC,YAAY,CAAC,UAAU,EAAE,UAAU;IA8B7B,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAwB/C,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB/C,SAAS;IAOT,QAAQ;IAId,OAAO,CAAC,gBAAgB;YAkDV,YAAY;IAM1B,OAAO,CAAC,mBAAmB;IAuC3B;;OAEG;YACW,mBAAmB;YA0BnB,gBAAgB;CAQ/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fully-connected-topology.d.ts","sourceRoot":"","sources":["../../../../src/topology/fully-connected-topology.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fully-connected-topology.d.ts","sourceRoot":"","sources":["../../../../src/topology/fully-connected-topology.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEvD,qBAAa,sBAAuB,YAAW,QAAQ;IACrD,OAAO,CAAC,WAAW,CAAC,CAAkB;IAEtC,QAAQ;IAIR,IAAI,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAKvC,MAAM,IAAI,IAAI;IASR,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAI1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"star-topology.d.ts","sourceRoot":"","sources":["../../../../src/topology/star-topology.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"star-topology.d.ts","sourceRoot":"","sources":["../../../../src/topology/star-topology.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEvD,qBAAa,YAAa,YAAW,QAAQ;IAKzC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAJ/B,OAAO,CAAC,WAAW,CAAC,CAAkB;gBAInB,YAAY,EAAE,SAAS;IAG1C,QAAQ;IAIR,IAAI,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAKvC,MAAM,IAAI,IAAI;IAwBR,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAW1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-transport.d.ts","sourceRoot":"","sources":["../../../../src/transport/memory-transport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memory-transport.d.ts","sourceRoot":"","sources":["../../../../src/transport/memory-transport.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAW,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI1C,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAG/D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAkB5E,eAAO,MAAM,sBAAsB,EAAE,gBAEpC,CAAC;AAEF;;GAEG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAuBnC,OAAO,CAAC,QAAQ,CAAC,OAAO;IArBpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAA8D;IAElG,SAAgB,MAAM,cAAqB;IAC3C,SAAgB,SAAS,cAAqB;IAC9C,SAAgB,MAAM,cAAqB;IAG3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAElD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IAEpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6C;IAC5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6C;IAE5E,OAAO,CAAC,UAAU,CAAS;IAG3B,OAAO,CAAC,iBAAiB,CAAa;IAEtC,OAAO,CAAC,iBAAiB,CAAC,CAAkB;gBAEf,OAAO,EAAE,gBAAgB;IA4DhD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B9B,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM;CAY3B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webrtc-transport-proxy.d.ts","sourceRoot":"","sources":["../../../../src/transport/webrtc-transport-proxy.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"webrtc-transport-proxy.d.ts","sourceRoot":"","sources":["../../../../src/transport/webrtc-transport-proxy.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI1C,OAAO,EAAgC,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACrG,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAG/D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C,CAAC;AAEF,qBAAa,oBAAqB,YAAW,SAAS;IAclD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAb1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IAEtC,QAAQ,CAAC,MAAM,cAAe;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,QAAQ,CAAC,SAAS,cAAe;IAEjC,QAAQ,CAAC,MAAM,cAAqB;IAEpC,OAAO,CAAC,cAAc,CAAuB;gBAI1B,OAAO,EAAE,0BAA0B;YAsCxC,iBAAiB;IAiB/B,OAAO,CAAC,WAAW;YAKL,aAAa;IAI3B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAUtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB9B;;OAEG;IAEH,UAAU;CAKX;AAGD,qBAAa,2BAA4B,YAAW,gBAAgB;IAClE,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,YAAY,CAAmC;IAEvD;;;OAGG;IACH,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI;IAShE,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS;CAatD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webrtc-transport-service.d.ts","sourceRoot":"","sources":["../../../../src/transport/webrtc-transport-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webrtc-transport-service.d.ts","sourceRoot":"","sources":["../../../../src/transport/webrtc-transport-service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAI9C,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,WAAW,EAEX,YAAY,EACb,MAAM,wCAAwC,CAAC;AAWhD,qBAAa,sBAAuB,YAAW,aAAa;IAKxD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAJjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6D;gBAIrE,aAAa,CAAC,KAAK;IAGtC,IAAI,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAAC,WAAW,CAAC;IA0E/C,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7D,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1D,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,YAAY;CAMtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webrtc-transport.d.ts","sourceRoot":"","sources":["../../../../src/transport/webrtc-transport.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"webrtc-transport.d.ts","sourceRoot":"","sources":["../../../../src/transport/webrtc-transport.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAS,MAAM,aAAa,CAAC;AAKjD,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC;IAC/B,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C,CAAC;AAEF;;GAEG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAUnC,OAAO,CAAC,QAAQ,CAAC,MAAM;IATnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,OAAO,CAAS;IAExB,QAAQ,CAAC,MAAM,cAAe;IAC9B,QAAQ,CAAC,SAAS,cAAe;IACjC,QAAQ,CAAC,MAAM,cAAqB;IAEpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAE7B,MAAM,EAAE,qBAAqB;IA8CpD,OAAO;IASb,MAAM,CAAC,MAAM,EAAE,MAAM;YASP,kBAAkB;CAIjC;AAGD,eAAO,MAAM,4BAA4B,kBAAmB,GAAG,KAAG,gBAMhE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/network-manager",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.56-main.09ca29d",
|
|
4
4
|
"description": "Network Manager",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -23,24 +23,24 @@
|
|
|
23
23
|
"isomorphic-ws": "^4.0.1",
|
|
24
24
|
"nanomessage-rpc": "^3.0.0",
|
|
25
25
|
"simple-peer": "9.11.1",
|
|
26
|
-
"tiny-invariant": "^1.3.1",
|
|
27
26
|
"ws": "^7.4.4",
|
|
28
27
|
"xor-distance": "^2.0.0",
|
|
29
|
-
"@dxos/async": "0.1.
|
|
30
|
-
"@dxos/codec-protobuf": "0.1.
|
|
31
|
-
"@dxos/context": "0.1.
|
|
32
|
-
"@dxos/credentials": "0.1.
|
|
33
|
-
"@dxos/crypto": "0.1.
|
|
34
|
-
"@dxos/debug": "0.1.
|
|
35
|
-
"@dxos/errors": "0.1.
|
|
36
|
-
"@dxos/
|
|
37
|
-
"@dxos/
|
|
38
|
-
"@dxos/
|
|
39
|
-
"@dxos/
|
|
40
|
-
"@dxos/
|
|
41
|
-
"@dxos/
|
|
42
|
-
"@dxos/
|
|
43
|
-
"@dxos/
|
|
28
|
+
"@dxos/async": "0.1.56-main.09ca29d",
|
|
29
|
+
"@dxos/codec-protobuf": "0.1.56-main.09ca29d",
|
|
30
|
+
"@dxos/context": "0.1.56-main.09ca29d",
|
|
31
|
+
"@dxos/credentials": "0.1.56-main.09ca29d",
|
|
32
|
+
"@dxos/crypto": "0.1.56-main.09ca29d",
|
|
33
|
+
"@dxos/debug": "0.1.56-main.09ca29d",
|
|
34
|
+
"@dxos/errors": "0.1.56-main.09ca29d",
|
|
35
|
+
"@dxos/invariant": "0.1.56-main.09ca29d",
|
|
36
|
+
"@dxos/keys": "0.1.56-main.09ca29d",
|
|
37
|
+
"@dxos/log": "0.1.56-main.09ca29d",
|
|
38
|
+
"@dxos/messaging": "0.1.56-main.09ca29d",
|
|
39
|
+
"@dxos/node-std": "0.1.56-main.09ca29d",
|
|
40
|
+
"@dxos/protocols": "0.1.56-main.09ca29d",
|
|
41
|
+
"@dxos/rpc": "0.1.56-main.09ca29d",
|
|
42
|
+
"@dxos/teleport": "0.1.56-main.09ca29d",
|
|
43
|
+
"@dxos/util": "0.1.56-main.09ca29d"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@swc-node/register": "1.5.4",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"earljs": "~0.1.10",
|
|
51
51
|
"fast-check": "~3.3.0",
|
|
52
52
|
"typescript": "^5.0.4",
|
|
53
|
-
"@dxos/signal": "0.1.
|
|
53
|
+
"@dxos/signal": "0.1.56-main.09ca29d"
|
|
54
54
|
},
|
|
55
55
|
"publishConfig": {
|
|
56
56
|
"access": "public"
|
package/src/network-manager.ts
CHANGED
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
// Copyright 2020 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import invariant from 'tiny-invariant';
|
|
6
|
-
|
|
7
5
|
import { Event } from '@dxos/async';
|
|
6
|
+
import { invariant } from '@dxos/invariant';
|
|
8
7
|
import { PublicKey } from '@dxos/keys';
|
|
9
8
|
import { log } from '@dxos/log';
|
|
10
9
|
import { Messenger, SignalManager } from '@dxos/messaging';
|
|
@@ -14,11 +13,10 @@ import { ComplexMap } from '@dxos/util';
|
|
|
14
13
|
|
|
15
14
|
import { ConnectionLog } from './connection-log';
|
|
16
15
|
import { SignalConnection } from './signal';
|
|
17
|
-
import { Swarm, SwarmMapper } from './swarm';
|
|
16
|
+
import { Swarm, SwarmMapper, ConnectionLimiter } from './swarm';
|
|
18
17
|
import { Topology } from './topology';
|
|
19
18
|
import { TransportFactory } from './transport';
|
|
20
19
|
import { WireProtocolProvider } from './wire-protocol';
|
|
21
|
-
|
|
22
20
|
/**
|
|
23
21
|
* Represents a single connection to a remote peer.
|
|
24
22
|
*/
|
|
@@ -66,13 +64,17 @@ export type NetworkManagerOptions = {
|
|
|
66
64
|
*/
|
|
67
65
|
// TODO(dmaretskyi): Rename SwarmManager.
|
|
68
66
|
export class NetworkManager {
|
|
69
|
-
|
|
67
|
+
/**
|
|
68
|
+
* @internal
|
|
69
|
+
*/
|
|
70
|
+
readonly _swarms = new ComplexMap<PublicKey, Swarm>(PublicKey.hash);
|
|
70
71
|
private readonly _mappers = new ComplexMap<PublicKey, SwarmMapper>(PublicKey.hash);
|
|
71
72
|
|
|
72
73
|
private readonly _transportFactory: TransportFactory;
|
|
73
74
|
private readonly _signalManager: SignalManager;
|
|
74
75
|
private readonly _messenger: Messenger;
|
|
75
76
|
private readonly _signalConnection: SignalConnection;
|
|
77
|
+
private readonly _connectionLimiter: ConnectionLimiter;
|
|
76
78
|
|
|
77
79
|
private _connectionState = ConnectionState.ONLINE;
|
|
78
80
|
public readonly connectionStateChanged = new Event<ConnectionState>();
|
|
@@ -95,6 +97,7 @@ export class NetworkManager {
|
|
|
95
97
|
leave: (opts) => this._signalManager.leave(opts),
|
|
96
98
|
};
|
|
97
99
|
|
|
100
|
+
this._connectionLimiter = new ConnectionLimiter();
|
|
98
101
|
// TODO(burdon): Inject listener (generic pattern).
|
|
99
102
|
if (log) {
|
|
100
103
|
this._connectionLog = new ConnectionLog();
|
|
@@ -160,7 +163,17 @@ export class NetworkManager {
|
|
|
160
163
|
}
|
|
161
164
|
|
|
162
165
|
log('joining', { topic: PublicKey.from(topic), peerId, topology: topology.toString() }); // TODO(burdon): Log peerId.
|
|
163
|
-
const swarm = new Swarm(
|
|
166
|
+
const swarm = new Swarm(
|
|
167
|
+
topic,
|
|
168
|
+
peerId,
|
|
169
|
+
topology,
|
|
170
|
+
protocol,
|
|
171
|
+
this._messenger,
|
|
172
|
+
this._transportFactory,
|
|
173
|
+
label,
|
|
174
|
+
this._connectionLimiter,
|
|
175
|
+
);
|
|
176
|
+
|
|
164
177
|
swarm.errors.handle((error) => {
|
|
165
178
|
log('swarm error', { error });
|
|
166
179
|
});
|
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
// Copyright 2020 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import invariant from 'tiny-invariant';
|
|
6
|
-
|
|
7
5
|
import { Any } from '@dxos/codec-protobuf';
|
|
8
6
|
import { Context } from '@dxos/context';
|
|
7
|
+
import { invariant } from '@dxos/invariant';
|
|
9
8
|
import { PublicKey } from '@dxos/keys';
|
|
10
9
|
import { log } from '@dxos/log';
|
|
11
10
|
import { schema } from '@dxos/protocols';
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
import chai, { expect } from 'chai';
|
|
5
|
+
import chaiAsPromised from 'chai-as-promised';
|
|
6
|
+
|
|
7
|
+
import { asyncTimeout } from '@dxos/async';
|
|
8
|
+
import { PublicKey } from '@dxos/keys';
|
|
9
|
+
import { describe, test } from '@dxos/test';
|
|
10
|
+
|
|
11
|
+
import { ConnectionLimiter } from './connection-limiter';
|
|
12
|
+
|
|
13
|
+
chai.use(chaiAsPromised);
|
|
14
|
+
|
|
15
|
+
describe('ConnectionLimiter', () => {
|
|
16
|
+
function* setupPeers(
|
|
17
|
+
limiter: ConnectionLimiter,
|
|
18
|
+
): Generator<{ sessionId: PublicKey; connecting: () => Promise<void>; doneConnecting: () => void }> {
|
|
19
|
+
while (true) {
|
|
20
|
+
const sessionId = PublicKey.random();
|
|
21
|
+
yield {
|
|
22
|
+
sessionId,
|
|
23
|
+
connecting: () => asyncTimeout(limiter.connecting(sessionId), 500),
|
|
24
|
+
doneConnecting: () => limiter.doneConnecting(sessionId),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
test('resolves immediately when limit is not reached', async () => {
|
|
30
|
+
const limiter = new ConnectionLimiter({ maxConcurrentInitConnections: 2 });
|
|
31
|
+
const [first, second, third] = setupPeers(limiter);
|
|
32
|
+
await Promise.all([first.connecting(), second.connecting()]);
|
|
33
|
+
first.doneConnecting();
|
|
34
|
+
await third.connecting();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('rejects if done is called', async () => {
|
|
38
|
+
const limiter = new ConnectionLimiter({ maxConcurrentInitConnections: 1 });
|
|
39
|
+
const [first] = setupPeers(limiter);
|
|
40
|
+
const testPromise = expect(first.connecting()).to.be.rejected;
|
|
41
|
+
first.doneConnecting();
|
|
42
|
+
await testPromise;
|
|
43
|
+
});
|
|
44
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { DeferredTask } from '@dxos/async';
|
|
6
|
+
import { Context } from '@dxos/context';
|
|
7
|
+
import { CancelledError } from '@dxos/errors';
|
|
8
|
+
import { invariant } from '@dxos/invariant';
|
|
9
|
+
import { PublicKey } from '@dxos/keys';
|
|
10
|
+
import { log } from '@dxos/log';
|
|
11
|
+
import { ComplexMap } from '@dxos/util';
|
|
12
|
+
|
|
13
|
+
export const MAX_CONCURRENT_INITIATING_CONNECTIONS = 3;
|
|
14
|
+
|
|
15
|
+
export type ConnectionLimiterOptions = {
|
|
16
|
+
maxConcurrentInitConnections?: number;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Limits the amount of concurrent connections with 'CONNECTING' state.
|
|
21
|
+
*/
|
|
22
|
+
export class ConnectionLimiter {
|
|
23
|
+
private readonly _ctx = new Context();
|
|
24
|
+
private readonly _maxConcurrentInitConnections;
|
|
25
|
+
/**
|
|
26
|
+
* Queue of promises to resolve when initiating connections amount is below the limit.
|
|
27
|
+
*/
|
|
28
|
+
private readonly _waitingPromises = new ComplexMap<PublicKey, { resolve: () => void; reject: (err: Error) => void }>(
|
|
29
|
+
PublicKey.hash,
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
resolveWaitingPromises = new DeferredTask(this._ctx, async () => {
|
|
33
|
+
Array.from(this._waitingPromises.values())
|
|
34
|
+
.slice(0, this._maxConcurrentInitConnections)
|
|
35
|
+
.forEach(({ resolve }) => {
|
|
36
|
+
resolve();
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
constructor({ maxConcurrentInitConnections = MAX_CONCURRENT_INITIATING_CONNECTIONS }: ConnectionLimiterOptions = {}) {
|
|
41
|
+
this._maxConcurrentInitConnections = maxConcurrentInitConnections;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @returns Promise that resolves in queue when connections amount with 'CONNECTING' state is below the limit.
|
|
46
|
+
*/
|
|
47
|
+
async connecting(sessionId: PublicKey): Promise<void> {
|
|
48
|
+
invariant(!this._waitingPromises.has(sessionId), 'Peer is already waiting for connection');
|
|
49
|
+
log('waiting', { sessionId });
|
|
50
|
+
await new Promise<void>((resolve, reject) => {
|
|
51
|
+
this._waitingPromises.set(sessionId, {
|
|
52
|
+
resolve,
|
|
53
|
+
reject,
|
|
54
|
+
});
|
|
55
|
+
this.resolveWaitingPromises.schedule();
|
|
56
|
+
});
|
|
57
|
+
log('allow', { sessionId });
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Rejects promise returned by `connecting` method.
|
|
62
|
+
*/
|
|
63
|
+
doneConnecting(sessionId: PublicKey) {
|
|
64
|
+
log('done', { sessionId });
|
|
65
|
+
if (!this._waitingPromises.has(sessionId)) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
this._waitingPromises.get(sessionId)!.reject(new CancelledError());
|
|
69
|
+
this._waitingPromises.delete(sessionId);
|
|
70
|
+
this.resolveWaitingPromises.schedule();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { sleep } from '@dxos/async';
|
|
6
|
+
import { PublicKey } from '@dxos/keys';
|
|
7
|
+
import { log } from '@dxos/log';
|
|
8
|
+
import { describe, test } from '@dxos/test';
|
|
9
|
+
|
|
10
|
+
import { TestWireProtocol } from '../testing/test-wire-protocol';
|
|
11
|
+
import { createWebRTCTransportFactory } from '../transport';
|
|
12
|
+
import { Connection } from './connection';
|
|
13
|
+
|
|
14
|
+
describe('Connection', () => {
|
|
15
|
+
test('initiator opens after responder', async () => {
|
|
16
|
+
const [topic, peerId1, peerId2, sessionId] = PublicKey.randomSequence();
|
|
17
|
+
const protocol1 = new TestWireProtocol(peerId1);
|
|
18
|
+
const connection1 = new Connection(
|
|
19
|
+
topic,
|
|
20
|
+
peerId1,
|
|
21
|
+
peerId2,
|
|
22
|
+
sessionId,
|
|
23
|
+
true,
|
|
24
|
+
{
|
|
25
|
+
offer: async (msg) => {
|
|
26
|
+
log('offer', { msg });
|
|
27
|
+
|
|
28
|
+
return { accept: true };
|
|
29
|
+
},
|
|
30
|
+
signal: async (msg) => {
|
|
31
|
+
await connection2.signal(msg);
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
protocol1.factory({
|
|
35
|
+
initiator: true,
|
|
36
|
+
localPeerId: peerId1,
|
|
37
|
+
remotePeerId: peerId2,
|
|
38
|
+
topic,
|
|
39
|
+
}),
|
|
40
|
+
createWebRTCTransportFactory(),
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
const protocol2 = new TestWireProtocol(peerId2);
|
|
44
|
+
const connection2 = new Connection(
|
|
45
|
+
topic,
|
|
46
|
+
peerId2,
|
|
47
|
+
peerId1,
|
|
48
|
+
sessionId,
|
|
49
|
+
false,
|
|
50
|
+
{
|
|
51
|
+
offer: async (msg) => {
|
|
52
|
+
log('offer', { msg });
|
|
53
|
+
|
|
54
|
+
return { accept: true };
|
|
55
|
+
},
|
|
56
|
+
signal: async (msg) => {
|
|
57
|
+
await connection1.signal(msg);
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
protocol2.factory({ initiator: false, localPeerId: peerId2, remotePeerId: peerId1, topic }),
|
|
61
|
+
createWebRTCTransportFactory(),
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
await connection2.openConnection();
|
|
65
|
+
await sleep(100);
|
|
66
|
+
await connection1.openConnection();
|
|
67
|
+
await Promise.all([
|
|
68
|
+
protocol1.testConnection(peerId2, 'test message 1'),
|
|
69
|
+
protocol2.testConnection(peerId1, 'test message 2'),
|
|
70
|
+
]);
|
|
71
|
+
});
|
|
72
|
+
});
|
package/src/swarm/connection.ts
CHANGED
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
// Copyright 2021 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import invariant from 'tiny-invariant';
|
|
6
|
-
|
|
7
5
|
import { DeferredTask, Event, sleep, synchronized } from '@dxos/async';
|
|
8
6
|
import { Context, cancelWithContext } from '@dxos/context';
|
|
9
7
|
import { ErrorStream } from '@dxos/debug';
|
|
10
8
|
import { CancelledError } from '@dxos/errors';
|
|
9
|
+
import { invariant } from '@dxos/invariant';
|
|
11
10
|
import { PublicKey } from '@dxos/keys';
|
|
12
11
|
import { log } from '@dxos/log';
|
|
13
12
|
import { trace } from '@dxos/protocols';
|
|
@@ -92,7 +91,15 @@ export class Connection {
|
|
|
92
91
|
private readonly _signalMessaging: SignalMessenger,
|
|
93
92
|
private readonly _protocol: WireProtocol,
|
|
94
93
|
private readonly _transportFactory: TransportFactory,
|
|
95
|
-
) {
|
|
94
|
+
) {
|
|
95
|
+
log.trace('dxos.mesh.connection.construct', {
|
|
96
|
+
sessionId: this.sessionId,
|
|
97
|
+
topic: this.topic,
|
|
98
|
+
localPeerId: this.ownId,
|
|
99
|
+
remotePeerId: this.remoteId,
|
|
100
|
+
initiator: this.initiator,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
96
103
|
|
|
97
104
|
get state() {
|
|
98
105
|
return this._state;
|
|
@@ -109,10 +116,16 @@ export class Connection {
|
|
|
109
116
|
/**
|
|
110
117
|
* Create an underlying transport and prepares it for the connection.
|
|
111
118
|
*/
|
|
112
|
-
|
|
113
|
-
openConnection() {
|
|
119
|
+
async openConnection() {
|
|
114
120
|
invariant(this._state === ConnectionState.INITIAL, 'Invalid state.');
|
|
115
121
|
log.trace('dxos.mesh.connection.open-connection', trace.begin({ id: this._instanceId }));
|
|
122
|
+
log.trace('dxos.mesh.connection.open', {
|
|
123
|
+
sessionId: this.sessionId,
|
|
124
|
+
topic: this.topic,
|
|
125
|
+
localPeerId: this.ownId,
|
|
126
|
+
remotePeerId: this.remoteId,
|
|
127
|
+
initiator: this.initiator,
|
|
128
|
+
});
|
|
116
129
|
|
|
117
130
|
this._changeState(ConnectionState.CONNECTING);
|
|
118
131
|
|
package/src/swarm/index.ts
CHANGED