@dxos/network-manager 0.1.9 → 0.1.11
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/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/network-manager.d.ts +10 -14
- package/dist/src/network-manager.d.ts.map +1 -1
- package/dist/src/network-manager.js +28 -33
- package/dist/src/network-manager.js.map +1 -1
- package/dist/src/protocol-factory.d.ts.map +1 -1
- package/dist/src/protocol-factory.js +8 -6
- package/dist/src/protocol-factory.js.map +1 -1
- package/dist/src/signal/index.d.ts +2 -2
- package/dist/src/signal/index.d.ts.map +1 -1
- package/dist/src/signal/index.js +2 -2
- package/dist/src/signal/index.js.map +1 -1
- package/dist/src/signal/message-router.d.ts +2 -2
- package/dist/src/signal/message-router.js +3 -3
- package/dist/src/signal/message-router.js.map +1 -1
- package/dist/src/signal/{signal-messaging.d.ts → signal-messenger.d.ts} +2 -2
- package/dist/src/signal/{signal-messaging.d.ts.map → signal-messenger.d.ts.map} +1 -1
- package/dist/src/signal/{signal-messaging.js → signal-messenger.js} +1 -1
- package/dist/src/signal/signal-messenger.js.map +1 -0
- package/dist/src/swarm/connection.d.ts +6 -3
- package/dist/src/swarm/connection.d.ts.map +1 -1
- package/dist/src/swarm/connection.js +28 -15
- package/dist/src/swarm/connection.js.map +1 -1
- package/dist/src/swarm/peer.d.ts +45 -0
- package/dist/src/swarm/peer.d.ts.map +1 -0
- package/dist/src/swarm/peer.js +113 -0
- package/dist/src/swarm/peer.js.map +1 -0
- package/dist/src/swarm/swarm-mapper.d.ts +2 -2
- package/dist/src/swarm/swarm-mapper.d.ts.map +1 -1
- package/dist/src/swarm/swarm-mapper.js +12 -10
- package/dist/src/swarm/swarm-mapper.js.map +1 -1
- package/dist/src/swarm/swarm.d.ts +13 -18
- package/dist/src/swarm/swarm.d.ts.map +1 -1
- package/dist/src/swarm/swarm.js +126 -97
- package/dist/src/swarm/swarm.js.map +1 -1
- package/dist/src/swarm/swarm.test.js +2 -2
- package/dist/src/swarm/swarm.test.js.map +1 -1
- package/dist/src/testing/test-builder.d.ts +31 -18
- package/dist/src/testing/test-builder.d.ts.map +1 -1
- package/dist/src/testing/test-builder.js +120 -48
- package/dist/src/testing/test-builder.js.map +1 -1
- package/dist/src/testing/test-protocol.d.ts +5 -5
- package/dist/src/testing/test-protocol.d.ts.map +1 -1
- package/dist/src/testing/test-protocol.js +28 -24
- package/dist/src/testing/test-protocol.js.map +1 -1
- package/dist/src/tests/basic-test-suite.d.ts +6 -0
- package/dist/src/tests/basic-test-suite.d.ts.map +1 -0
- package/dist/src/tests/basic-test-suite.js +142 -0
- package/dist/src/tests/basic-test-suite.js.map +1 -0
- package/dist/src/tests/memory-transport.test.d.ts +2 -0
- package/dist/src/tests/memory-transport.test.d.ts.map +1 -0
- package/dist/src/tests/memory-transport.test.js +12 -0
- package/dist/src/tests/memory-transport.test.js.map +1 -0
- package/dist/src/{presence.test.d.ts → tests/presence.test.d.ts} +0 -0
- package/dist/src/tests/presence.test.d.ts.map +1 -0
- package/dist/src/{presence.test.js → tests/presence.test.js} +21 -20
- package/dist/src/tests/presence.test.js.map +1 -0
- package/dist/src/tests/property-test-suite.d.ts +5 -0
- package/dist/src/tests/property-test-suite.d.ts.map +1 -0
- package/dist/src/tests/property-test-suite.js +203 -0
- package/dist/src/tests/property-test-suite.js.map +1 -0
- package/dist/src/tests/utils.d.ts +21 -0
- package/dist/src/tests/utils.d.ts.map +1 -0
- package/dist/src/tests/utils.js +76 -0
- package/dist/src/tests/utils.js.map +1 -0
- package/dist/src/tests/webrtc-transport.test.d.ts +2 -0
- package/dist/src/tests/webrtc-transport.test.d.ts.map +1 -0
- package/dist/src/tests/webrtc-transport.test.js +16 -0
- package/dist/src/tests/webrtc-transport.test.js.map +1 -0
- package/dist/src/topology/fully-connected-topology.d.ts +1 -1
- package/dist/src/topology/fully-connected-topology.d.ts.map +1 -1
- package/dist/src/topology/fully-connected-topology.js +4 -3
- package/dist/src/topology/fully-connected-topology.js.map +1 -1
- package/dist/src/topology/mmst-topology.js +4 -4
- package/dist/src/topology/mmst-topology.js.map +1 -1
- package/dist/src/topology/star-topology.js +4 -4
- package/dist/src/topology/star-topology.js.map +1 -1
- package/dist/src/topology/topology.d.ts +0 -5
- package/dist/src/topology/topology.d.ts.map +1 -1
- package/dist/src/transport/memory-transport.d.ts +8 -7
- package/dist/src/transport/memory-transport.d.ts.map +1 -1
- package/dist/src/transport/memory-transport.js +79 -45
- package/dist/src/transport/memory-transport.js.map +1 -1
- package/dist/src/transport/memory-transport.test.js +3 -2
- package/dist/src/transport/memory-transport.test.js.map +1 -1
- package/dist/src/transport/transport.d.ts +8 -4
- package/dist/src/transport/transport.d.ts.map +1 -1
- package/dist/src/transport/webrtc-simple-peer.test.d.ts +2 -0
- package/dist/src/transport/webrtc-simple-peer.test.d.ts.map +1 -0
- package/dist/src/transport/{wrtc-simple-peer.test.js → webrtc-simple-peer.test.js} +2 -2
- package/dist/src/transport/webrtc-simple-peer.test.js.map +1 -0
- package/dist/src/transport/webrtc-transport-proxy.d.ts +4 -4
- package/dist/src/transport/webrtc-transport-proxy.d.ts.map +1 -1
- package/dist/src/transport/webrtc-transport-proxy.js +15 -10
- package/dist/src/transport/webrtc-transport-proxy.js.map +1 -1
- package/dist/src/transport/webrtc-transport-proxy.test.js +2 -2
- package/dist/src/transport/webrtc-transport-proxy.test.js.map +1 -1
- package/dist/src/transport/webrtc-transport-service.js +2 -2
- package/dist/src/transport/webrtc-transport-service.js.map +1 -1
- package/dist/src/transport/webrtc-transport.d.ts +3 -3
- package/dist/src/transport/webrtc-transport.d.ts.map +1 -1
- package/dist/src/transport/webrtc-transport.js +10 -10
- package/dist/src/transport/webrtc-transport.js.map +1 -1
- package/dist/src/transport/webrtc-transport.test.js +3 -3
- package/dist/src/transport/webrtc-transport.test.js.map +1 -1
- package/dist/src/types.d.ts +1 -1
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +27 -22
- package/src/index.ts +2 -2
- package/src/network-manager.ts +31 -46
- package/src/protocol-factory.ts +5 -3
- package/src/signal/index.ts +2 -2
- package/src/signal/integration.test.ts +1 -1
- package/src/signal/message-router.test.ts +1 -1
- package/src/signal/message-router.ts +2 -2
- package/src/signal/{signal-messaging.ts → signal-messenger.ts} +2 -2
- package/src/swarm/connection.ts +23 -12
- package/src/swarm/peer.ts +156 -0
- package/src/swarm/swarm-mapper.ts +21 -10
- package/src/swarm/swarm.ts +142 -111
- package/src/testing/test-builder.ts +143 -63
- package/src/testing/test-protocol.ts +31 -23
- package/src/tests/basic-test-suite.ts +168 -0
- package/src/tests/memory-transport.test.ts +11 -0
- package/src/{presence.test.ts → tests/presence.test.ts} +24 -23
- package/src/tests/property-test-suite.ts +221 -0
- package/src/tests/utils.ts +85 -0
- package/src/tests/webrtc-transport.test.ts +16 -0
- package/src/topology/fully-connected-topology.ts +5 -4
- package/src/topology/topology.ts +0 -5
- package/src/transport/memory-transport.test.ts +3 -2
- package/src/transport/memory-transport.ts +79 -49
- package/src/transport/transport.ts +9 -3
- package/src/transport/{wrtc-simple-peer.test.ts → webrtc-simple-peer.test.ts} +1 -1
- package/src/transport/webrtc-transport-proxy.test.ts +2 -2
- package/src/transport/webrtc-transport-proxy.ts +17 -8
- package/src/transport/webrtc-transport-service.ts +1 -1
- package/src/transport/webrtc-transport.test.ts +4 -6
- package/src/transport/webrtc-transport.ts +4 -4
- package/testing.d.ts +11 -0
- package/testing.js +5 -0
- package/dist/src/network-manager.test.d.ts +0 -2
- package/dist/src/network-manager.test.d.ts.map +0 -1
- package/dist/src/network-manager.test.js +0 -596
- package/dist/src/network-manager.test.js.map +0 -1
- package/dist/src/presence.test.d.ts.map +0 -1
- package/dist/src/presence.test.js.map +0 -1
- package/dist/src/signal/signal-messaging.js.map +0 -1
- package/dist/src/transport/wrtc-simple-peer.test.d.ts +0 -2
- package/dist/src/transport/wrtc-simple-peer.test.d.ts.map +0 -1
- package/dist/src/transport/wrtc-simple-peer.test.js.map +0 -1
- package/src/network-manager.test.ts +0 -707
|
@@ -3,7 +3,7 @@ import { Event } from '@dxos/async';
|
|
|
3
3
|
import { ErrorStream } from '@dxos/debug';
|
|
4
4
|
import { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
5
5
|
import { Transport, TransportFactory } from './transport';
|
|
6
|
-
export
|
|
6
|
+
export type WebRTCTransportParams = {
|
|
7
7
|
initiator: boolean;
|
|
8
8
|
stream: NodeJS.ReadWriteStream;
|
|
9
9
|
webrtcConfig?: any;
|
|
@@ -19,8 +19,8 @@ export declare class WebRTCTransport implements Transport {
|
|
|
19
19
|
readonly connected: Event<void>;
|
|
20
20
|
readonly errors: ErrorStream;
|
|
21
21
|
constructor(params: WebRTCTransportParams);
|
|
22
|
-
|
|
23
|
-
signal(signal: Signal):
|
|
22
|
+
destroy(): Promise<void>;
|
|
23
|
+
signal(signal: Signal): void;
|
|
24
24
|
private _disconnectStreams;
|
|
25
25
|
}
|
|
26
26
|
export declare const createWebRTCTransportFactory: (webrtcConfig?: any) => TransportFactory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webrtc-transport.d.ts","sourceRoot":"","sources":["../../../src/transport/webrtc-transport.ts"],"names":[],"mappings":";AAOA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAS,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG1D,
|
|
1
|
+
{"version":3,"file":"webrtc-transport.d.ts","sourceRoot":"","sources":["../../../src/transport/webrtc-transport.ts"],"names":[],"mappings":";AAOA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAS,MAAM,aAAa,CAAC;AAEjD,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;IAOnC,OAAO,CAAC,QAAQ,CAAC,MAAM;IANnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IAEnC,QAAQ,CAAC,MAAM,cAAe;IAC9B,QAAQ,CAAC,SAAS,cAAe;IACjC,QAAQ,CAAC,MAAM,cAAqB;gBAEP,MAAM,EAAE,qBAAqB;IA+BpD,OAAO;IAQb,MAAM,CAAC,MAAM,EAAE,MAAM;YAMP,kBAAkB;CAIjC;AAGD,eAAO,MAAM,4BAA4B,kBAAmB,GAAG,KAAG,gBAMhE,CAAC"}
|
|
@@ -22,39 +22,39 @@ class WebRTCTransport {
|
|
|
22
22
|
this.closed = new async_1.Event();
|
|
23
23
|
this.connected = new async_1.Event();
|
|
24
24
|
this.errors = new debug_1.ErrorStream();
|
|
25
|
-
(0, log_1.log)('created connection', params, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport.ts", line: 34 });
|
|
25
|
+
(0, log_1.log)('created connection', params, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport.ts", line: 34, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
|
|
26
26
|
this._peer = new simple_peer_1.default({
|
|
27
27
|
initiator: this.params.initiator,
|
|
28
28
|
wrtc: simple_peer_1.default.WEBRTC_SUPPORT ? undefined : webrtc_1.wrtc !== null && webrtc_1.wrtc !== void 0 ? webrtc_1.wrtc : (0, debug_1.raise)(new Error('wrtc not available')),
|
|
29
29
|
config: this.params.webrtcConfig
|
|
30
30
|
});
|
|
31
31
|
this._peer.on('signal', async (data) => {
|
|
32
|
-
(0, log_1.log)('signal', data, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport.ts", line: 42 });
|
|
32
|
+
(0, log_1.log)('signal', data, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport.ts", line: 42, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
|
|
33
33
|
await this.params.sendSignal({ json: JSON.stringify(data) });
|
|
34
34
|
});
|
|
35
35
|
this._peer.on('connect', () => {
|
|
36
|
-
(0, log_1.log)('connected', {}, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport.ts", line: 47 });
|
|
36
|
+
(0, log_1.log)('connected', {}, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport.ts", line: 47, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
|
|
37
37
|
this.params.stream.pipe(this._peer).pipe(this.params.stream);
|
|
38
38
|
this.connected.emit();
|
|
39
39
|
});
|
|
40
40
|
this._peer.on('close', async () => {
|
|
41
|
-
(0, log_1.log)('closed', {}, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport.ts", line: 53 });
|
|
41
|
+
(0, log_1.log)('closed', {}, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport.ts", line: 53, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
|
|
42
42
|
await this._disconnectStreams();
|
|
43
43
|
this.closed.emit();
|
|
44
44
|
});
|
|
45
45
|
this._peer.on('error', async (err) => {
|
|
46
46
|
this.errors.raise(err);
|
|
47
|
-
await this.
|
|
47
|
+
await this.destroy();
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
|
-
async
|
|
51
|
-
(0, log_1.log)('closing...', {}, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport.ts", line: 65 });
|
|
50
|
+
async destroy() {
|
|
51
|
+
(0, log_1.log)('closing...', {}, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport.ts", line: 65, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
|
|
52
52
|
await this._disconnectStreams();
|
|
53
53
|
this._peer.destroy();
|
|
54
54
|
this.closed.emit();
|
|
55
|
-
(0, log_1.log)('closed', {}, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport.ts", line: 69 });
|
|
55
|
+
(0, log_1.log)('closed', {}, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport.ts", line: 69, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
|
|
56
56
|
}
|
|
57
|
-
|
|
57
|
+
signal(signal) {
|
|
58
58
|
(0, node_assert_1.default)(this._peer, 'Connection not ready to accept signals.');
|
|
59
59
|
(0, node_assert_1.default)(signal.json, 'Signal message must contain signal data.');
|
|
60
60
|
this._peer.signal(JSON.parse(signal.json));
|
|
@@ -68,7 +68,7 @@ class WebRTCTransport {
|
|
|
68
68
|
exports.WebRTCTransport = WebRTCTransport;
|
|
69
69
|
// TODO(dmaretskyi): Convert to class.
|
|
70
70
|
const createWebRTCTransportFactory = (webrtcConfig) => ({
|
|
71
|
-
|
|
71
|
+
createTransport: (params) => new WebRTCTransport({
|
|
72
72
|
...params,
|
|
73
73
|
webrtcConfig
|
|
74
74
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webrtc-transport.js","sourceRoot":"","sources":["../../../src/transport/webrtc-transport.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;AAEF,8DAAiC;AACjC,8DAA4E;AAE5E,uCAAoC;AACpC,uCAAiD;AACjD,mCAAgC;AAIhC,qCAAgC;AAShC;;GAEG;AACH,MAAa,eAAe;IAO1B,YAA6B,MAA6B;QAA7B,WAAM,GAAN,MAAM,CAAuB;QAJjD,WAAM,GAAG,IAAI,aAAK,EAAE,CAAC;QACrB,cAAS,GAAG,IAAI,aAAK,EAAE,CAAC;QACxB,WAAM,GAAG,IAAI,mBAAW,EAAE,CAAC;QAGlC,IAAA,SAAG,EAAC,oBAAoB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"webrtc-transport.js","sourceRoot":"","sources":["../../../src/transport/webrtc-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ describe('WebRTCTransport', function () {
|
|
|
30
30
|
};
|
|
31
31
|
connection.closed.once(closedCb);
|
|
32
32
|
await (0, async_1.sleep)(10); // Let simple-peer process events.
|
|
33
|
-
await connection.
|
|
33
|
+
await connection.destroy();
|
|
34
34
|
await (0, async_1.sleep)(10); // Process events.
|
|
35
35
|
(0, expect_1.default)(callsCounter).toEqual(1);
|
|
36
36
|
})
|
|
@@ -53,7 +53,7 @@ describe('WebRTCTransport', function () {
|
|
|
53
53
|
await connection2.signal(signal);
|
|
54
54
|
}
|
|
55
55
|
});
|
|
56
|
-
(0, testutils_1.afterTest)(() => connection1.
|
|
56
|
+
(0, testutils_1.afterTest)(() => connection1.destroy());
|
|
57
57
|
(0, testutils_1.afterTest)(() => connection1.errors.assertNoUnhandledErrors());
|
|
58
58
|
const plugin2 = new testing_1.TestProtocolPlugin(peer2Id.asBuffer());
|
|
59
59
|
const protocolProvider2 = (0, testing_1.testProtocolProvider)(topic.asBuffer(), peer2Id, plugin2);
|
|
@@ -68,7 +68,7 @@ describe('WebRTCTransport', function () {
|
|
|
68
68
|
await connection1.signal(signal);
|
|
69
69
|
}
|
|
70
70
|
});
|
|
71
|
-
(0, testutils_1.afterTest)(() => connection2.
|
|
71
|
+
(0, testutils_1.afterTest)(() => connection2.destroy());
|
|
72
72
|
(0, testutils_1.afterTest)(() => connection2.errors.assertNoUnhandledErrors());
|
|
73
73
|
const received = [];
|
|
74
74
|
const mockReceive = (p, s) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webrtc-transport.test.js","sourceRoot":"","sources":["../../../src/transport/webrtc-transport.test.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;AAEF,oDAA4B;AAC5B,mCAAgC;AAChC,sEAA4C;AAE5C,uCAAoC;AACpC,yCAA4C;AAC5C,qCAAuC;AACvC,uDAA+C;AAC/C,+CAA4C;AAE5C,wCAAsE;AACtE,yDAAqD;AAErD,QAAQ,CAAC,iBAAiB,EAAE;IAC1B,sHAAsH;IACtH,EAAE,CAAC,gBAAgB,EAAE,KAAK;QACxB,MAAM,UAAU,GAAG,IAAI,kCAAe,CAAC;YACrC,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,IAAI,eAAM,EAAE;YACpB,UAAU,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,YAAY,EAAE,CAAC;QACjB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"webrtc-transport.test.js","sourceRoot":"","sources":["../../../src/transport/webrtc-transport.test.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;AAEF,oDAA4B;AAC5B,mCAAgC;AAChC,sEAA4C;AAE5C,uCAAoC;AACpC,yCAA4C;AAC5C,qCAAuC;AACvC,uDAA+C;AAC/C,+CAA4C;AAE5C,wCAAsE;AACtE,yDAAqD;AAErD,QAAQ,CAAC,iBAAiB,EAAE;IAC1B,sHAAsH;IACtH,EAAE,CAAC,gBAAgB,EAAE,KAAK;QACxB,MAAM,UAAU,GAAG,IAAI,kCAAe,CAAC;YACrC,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,IAAI,eAAM,EAAE;YACpB,UAAU,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,YAAY,EAAE,CAAC;QACjB,CAAC,CAAC;QAEF,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,IAAA,aAAK,EAAC,EAAE,CAAC,CAAC,CAAC,kCAAkC;QACnD,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;QAE3B,MAAM,IAAA,aAAK,EAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB;QACnC,IAAA,gBAAM,EAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC;SACC,OAAO,CAAC,IAAK,CAAC;SACd,OAAO,CAAC,CAAC,CAAC,CAAC;IAEd,EAAE,CAAC,0DAA0D,EAAE,KAAK;QAClE,MAAM,KAAK,GAAG,gBAAS,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,gBAAS,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,gBAAS,CAAC,MAAM,EAAE,CAAC;QAEnC,MAAM,OAAO,GAAG,IAAI,4BAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,MAAM,iBAAiB,GAAG,IAAA,8BAAoB,EAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACnF,MAAM,WAAW,GAAG,IAAI,kCAAe,CAAC;YACtC,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,iBAAiB,CAAC;gBACxB,OAAO,EAAE,IAAA,qBAAY,EAAC,KAAK,CAAC;gBAC5B,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC,MAAM;YACT,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBAC3B,MAAM,IAAA,aAAK,EAAC,EAAE,CAAC,CAAC;gBAChB,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;SACF,CAAC,CAAC;QACH,IAAA,qBAAS,EAAC,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,IAAA,qBAAS,EAAC,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,IAAI,4BAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,MAAM,iBAAiB,GAAG,IAAA,8BAAoB,EAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACnF,MAAM,WAAW,GAAG,IAAI,kCAAe,CAAC;YACtC,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,iBAAiB,CAAC;gBACxB,OAAO,EAAE,IAAA,qBAAY,EAAC,KAAK,CAAC;gBAC5B,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC,MAAM;YACT,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBAC3B,MAAM,IAAA,aAAK,EAAC,EAAE,CAAC,CAAC;gBAChB,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;SACF,CAAC,CAAC;QACH,IAAA,qBAAS,EAAC,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,IAAA,qBAAS,EAAC,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,CAAC;QAE9D,MAAM,QAAQ,GAAU,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,CAAC,CAAW,EAAE,CAAS,EAAE,EAAE;YAC7C,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC;QACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACnC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YACvC,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,sBAAsB,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,MAAM,IAAA,yBAAa,EAAC,GAAG,EAAE;YACvB,IAAA,gBAAM,EAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,IAAA,gBAAM,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,wBAAQ,CAAC,CAAC;YAC7C,IAAA,gBAAM,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;SACC,OAAO,CAAC,IAAK,CAAC;SACd,OAAO,CAAC,CAAC,CAAC,CAAC;AAChB,CAAC,CAAC,CAAC"}
|
package/dist/src/types.d.ts
CHANGED
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,SAAS,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.11",
|
|
4
4
|
"description": "Network Manager",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -12,47 +12,52 @@
|
|
|
12
12
|
},
|
|
13
13
|
"types": "dist/src/index.d.ts",
|
|
14
14
|
"files": [
|
|
15
|
+
"testing.d.ts",
|
|
16
|
+
"testing.js",
|
|
15
17
|
"dist",
|
|
16
|
-
"src"
|
|
17
|
-
"README.md"
|
|
18
|
+
"src"
|
|
18
19
|
],
|
|
19
20
|
"dependencies": {
|
|
20
|
-
"@dxos/async": "0.1.9",
|
|
21
|
-
"@dxos/codec-protobuf": "0.1.9",
|
|
22
|
-
"@dxos/credentials": "0.1.9",
|
|
23
|
-
"@dxos/crypto": "0.1.9",
|
|
24
|
-
"@dxos/debug": "0.1.9",
|
|
25
|
-
"@dxos/keys": "0.1.9",
|
|
26
|
-
"@dxos/log": "0.1.9",
|
|
27
|
-
"@dxos/mesh-protocol": "0.1.9",
|
|
28
|
-
"@dxos/messaging": "0.1.9",
|
|
29
|
-
"@dxos/protocol-plugin-presence": "0.1.9",
|
|
30
|
-
"@dxos/protocols": "0.1.9",
|
|
31
|
-
"@dxos/rpc": "0.1.9",
|
|
32
|
-
"@dxos/util": "0.1.9",
|
|
33
21
|
"@koush/wrtc": "^0.5.3",
|
|
34
22
|
"assert": "^2.0.0",
|
|
35
23
|
"isomorphic-ws": "^4.0.1",
|
|
36
24
|
"nanomessage-rpc": "^3.0.0",
|
|
37
25
|
"simple-peer": "9.11.0",
|
|
38
26
|
"ws": "^7.4.4",
|
|
39
|
-
"xor-distance": "^2.0.0"
|
|
27
|
+
"xor-distance": "^2.0.0",
|
|
28
|
+
"@dxos/async": "0.1.11",
|
|
29
|
+
"@dxos/codec-protobuf": "0.1.11",
|
|
30
|
+
"@dxos/credentials": "0.1.11",
|
|
31
|
+
"@dxos/crypto": "0.1.11",
|
|
32
|
+
"@dxos/debug": "0.1.11",
|
|
33
|
+
"@dxos/keys": "0.1.11",
|
|
34
|
+
"@dxos/log": "0.1.11",
|
|
35
|
+
"@dxos/mesh-protocol": "0.1.11",
|
|
36
|
+
"@dxos/messaging": "0.1.11",
|
|
37
|
+
"@dxos/protocol-plugin-presence": "0.1.11",
|
|
38
|
+
"@dxos/protocols": "0.1.11",
|
|
39
|
+
"@dxos/rpc": "0.1.11",
|
|
40
|
+
"@dxos/util": "0.1.11"
|
|
40
41
|
},
|
|
41
42
|
"devDependencies": {
|
|
42
|
-
"@dxos/signal": "0.1.9",
|
|
43
|
-
"@dxos/testutils": "0.1.9",
|
|
44
43
|
"@swc-node/register": "^1.5.4",
|
|
45
44
|
"@swc/core": "^1.3.9",
|
|
46
45
|
"@types/simple-peer": "9.11.3",
|
|
47
46
|
"@types/ws": "^7.4.0",
|
|
48
47
|
"earljs": "~0.1.10",
|
|
49
48
|
"fast-check": "~2.14.0",
|
|
50
|
-
"typescript": "^4.8.4"
|
|
49
|
+
"typescript": "^4.8.4",
|
|
50
|
+
"@dxos/signal": "0.1.11",
|
|
51
|
+
"@dxos/testutils": "0.1.11"
|
|
51
52
|
},
|
|
52
53
|
"publishConfig": {
|
|
53
54
|
"access": "public"
|
|
54
55
|
},
|
|
55
|
-
"
|
|
56
|
-
"
|
|
56
|
+
"beast": {
|
|
57
|
+
"classDiagrams": [
|
|
58
|
+
{
|
|
59
|
+
"root": "src/network-manager.ts"
|
|
60
|
+
}
|
|
61
|
+
]
|
|
57
62
|
}
|
|
58
63
|
}
|
package/src/index.ts
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
// Copyright 2020 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
export * from './connection-log';
|
|
5
6
|
export * from './network-manager';
|
|
6
7
|
export * from './protocol-factory';
|
|
8
|
+
export * from './signal';
|
|
7
9
|
export * from './swarm';
|
|
8
10
|
export * from './topology';
|
|
9
11
|
export * from './transport';
|
|
10
|
-
export * from './signal';
|
|
11
12
|
export * from './types';
|
|
12
|
-
export * from './connection-log';
|
package/src/network-manager.ts
CHANGED
|
@@ -66,12 +66,12 @@ export type NetworkManagerOptions = {
|
|
|
66
66
|
/**
|
|
67
67
|
* Manages connection to the swarm.
|
|
68
68
|
*/
|
|
69
|
+
// TODO(dmaretskyi): Rename SwarmManager.
|
|
69
70
|
export class NetworkManager {
|
|
70
|
-
private readonly _transportFactory: TransportFactory;
|
|
71
|
-
|
|
72
71
|
private readonly _swarms = new ComplexMap<PublicKey, Swarm>(PublicKey.hash);
|
|
73
72
|
private readonly _mappers = new ComplexMap<PublicKey, SwarmMapper>(PublicKey.hash);
|
|
74
73
|
|
|
74
|
+
private readonly _transportFactory: TransportFactory;
|
|
75
75
|
private readonly _signalManager: SignalManager;
|
|
76
76
|
private readonly _messenger: Messenger;
|
|
77
77
|
private readonly _signalConnection: SignalConnection;
|
|
@@ -86,18 +86,24 @@ export class NetworkManager {
|
|
|
86
86
|
this._signalManager = signalManager;
|
|
87
87
|
this._signalManager.swarmEvent.on(({ topic, swarmEvent: event }) => this._swarms.get(topic)?.onSwarmEvent(event));
|
|
88
88
|
this._messenger = new Messenger({ signalManager: this._signalManager });
|
|
89
|
-
|
|
90
89
|
this._signalConnection = {
|
|
91
90
|
join: (opts) => this._signalManager.join(opts),
|
|
92
91
|
leave: (opts) => this._signalManager.leave(opts)
|
|
93
92
|
};
|
|
94
93
|
|
|
94
|
+
// TODO(burdon): Inject listener (generic pattern).
|
|
95
95
|
if (log) {
|
|
96
96
|
this._connectionLog = new ConnectionLog();
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
|
|
100
|
+
// TODO(burdon): Remove access (Devtools only).
|
|
101
|
+
get connectionLog() {
|
|
102
|
+
return this._connectionLog;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// TODO(burdon): Remove access (Devtools only).
|
|
106
|
+
get signalManager() {
|
|
101
107
|
return this._signalManager;
|
|
102
108
|
}
|
|
103
109
|
|
|
@@ -106,11 +112,6 @@ export class NetworkManager {
|
|
|
106
112
|
return Array.from(this._swarms.keys());
|
|
107
113
|
}
|
|
108
114
|
|
|
109
|
-
// TODO(burdon): Factor out devtools.
|
|
110
|
-
get connectionLog() {
|
|
111
|
-
return this._connectionLog;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
115
|
getSwarmMap(topic: PublicKey): SwarmMapper | undefined {
|
|
115
116
|
return this._mappers.get(topic);
|
|
116
117
|
}
|
|
@@ -119,30 +120,33 @@ export class NetworkManager {
|
|
|
119
120
|
return this._swarms.get(topic);
|
|
120
121
|
}
|
|
121
122
|
|
|
123
|
+
async close() {
|
|
124
|
+
for (const topic of this._swarms.keys()) {
|
|
125
|
+
await this.leaveSwarm(topic).catch((err) => {
|
|
126
|
+
log(err);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
await this._signalManager.destroy();
|
|
131
|
+
}
|
|
132
|
+
|
|
122
133
|
/**
|
|
123
134
|
* Join the swarm.
|
|
124
135
|
*/
|
|
125
|
-
// TODO(burdon): Join/Open?
|
|
126
|
-
async
|
|
127
|
-
topic,
|
|
128
|
-
peerId,
|
|
129
|
-
topology,
|
|
130
|
-
protocol,
|
|
131
|
-
presence,
|
|
132
|
-
label
|
|
133
|
-
}: SwarmOptions): Promise<SwarmConnection> {
|
|
136
|
+
// TODO(burdon): Join/Open? Swarm abstraction?
|
|
137
|
+
async joinSwarm({ topic, peerId, topology, protocol, presence, label }: SwarmOptions): Promise<SwarmConnection> {
|
|
134
138
|
assert(PublicKey.isPublicKey(topic));
|
|
135
139
|
assert(PublicKey.isPublicKey(peerId));
|
|
136
140
|
assert(topology);
|
|
137
141
|
assert(typeof protocol === 'function');
|
|
138
142
|
if (this._swarms.has(topic)) {
|
|
139
|
-
throw new Error(`Already connected to swarm: ${topic}`);
|
|
143
|
+
throw new Error(`Already connected to swarm: ${PublicKey.from(topic)}`);
|
|
140
144
|
}
|
|
141
145
|
|
|
142
|
-
log('joining', { topic, peerId, topology: topology.toString() });
|
|
146
|
+
log('joining', { topic: PublicKey.from(topic), peerId, topology: topology.toString() }); // TODO(burdon): Log peerId.
|
|
143
147
|
const swarm = new Swarm(topic, peerId, topology, protocol, this._messenger, this._transportFactory, label);
|
|
144
148
|
swarm.errors.handle((error) => {
|
|
145
|
-
log(
|
|
149
|
+
log('swarm error', { error });
|
|
146
150
|
});
|
|
147
151
|
|
|
148
152
|
this._swarms.set(topic, swarm);
|
|
@@ -151,22 +155,23 @@ export class NetworkManager {
|
|
|
151
155
|
|
|
152
156
|
this.topicsUpdated.emit();
|
|
153
157
|
this._connectionLog?.swarmJoined(swarm);
|
|
154
|
-
log('
|
|
158
|
+
log('joined', { topic: PublicKey.from(topic), count: this._swarms.size });
|
|
155
159
|
|
|
156
160
|
return {
|
|
157
|
-
close: () => this.
|
|
161
|
+
close: () => this.leaveSwarm(topic)
|
|
158
162
|
};
|
|
159
163
|
}
|
|
160
164
|
|
|
161
165
|
/**
|
|
162
166
|
* Close the connection.
|
|
163
167
|
*/
|
|
164
|
-
async
|
|
168
|
+
async leaveSwarm(topic: PublicKey) {
|
|
165
169
|
if (!this._swarms.has(topic)) {
|
|
170
|
+
log.warn('swarm not open', { topic: PublicKey.from(topic) });
|
|
166
171
|
return;
|
|
167
172
|
}
|
|
168
173
|
|
|
169
|
-
log('
|
|
174
|
+
log('leaving', { topic: PublicKey.from(topic) });
|
|
170
175
|
const swarm = this._swarms.get(topic)!;
|
|
171
176
|
await this._signalConnection.leave({ topic, peerId: swarm.ownPeerId });
|
|
172
177
|
|
|
@@ -180,26 +185,6 @@ export class NetworkManager {
|
|
|
180
185
|
this._swarms.delete(topic);
|
|
181
186
|
|
|
182
187
|
await this.topicsUpdated.emit();
|
|
183
|
-
log('
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* @deprecated
|
|
188
|
-
*/
|
|
189
|
-
// TODO(dmaretskyi): Remove.
|
|
190
|
-
async start() {
|
|
191
|
-
console.warn('NetworkManger.start is deprecated.');
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// TODO(burdon): Open/close?
|
|
195
|
-
async destroy() {
|
|
196
|
-
for (const topic of this._swarms.keys()) {
|
|
197
|
-
await this.closeSwarmConnection(topic).catch((err) => {
|
|
198
|
-
log(`Failed to leave swarm ${topic} on NetworkManager.destroy}`);
|
|
199
|
-
log(err);
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
await this._signalManager.destroy();
|
|
188
|
+
log('left', { topic: PublicKey.from(topic), count: this._swarms.size });
|
|
204
189
|
}
|
|
205
190
|
}
|
package/src/protocol-factory.ts
CHANGED
|
@@ -32,6 +32,7 @@ export const protocolFactory = ({
|
|
|
32
32
|
getTopics
|
|
33
33
|
}: ProtocolFactoryOptions): ProtocolProvider => {
|
|
34
34
|
assert(getTopics);
|
|
35
|
+
|
|
35
36
|
// eslint-disable-next-line no-unused-vars
|
|
36
37
|
return ({ channel, initiator }) => {
|
|
37
38
|
log('creating protocol');
|
|
@@ -42,6 +43,7 @@ export const protocolFactory = ({
|
|
|
42
43
|
if (publicKey) {
|
|
43
44
|
protocol.setContext({ topic: PublicKey.stringify(publicKey) });
|
|
44
45
|
}
|
|
46
|
+
|
|
45
47
|
assert(publicKey, 'PublicKey not found in discovery.');
|
|
46
48
|
return publicKey;
|
|
47
49
|
},
|
|
@@ -51,7 +53,6 @@ export const protocolFactory = ({
|
|
|
51
53
|
});
|
|
52
54
|
|
|
53
55
|
protocol.setExtensions(plugins.map((plugin) => plugin.createExtension())).init();
|
|
54
|
-
|
|
55
56
|
return protocol;
|
|
56
57
|
};
|
|
57
58
|
};
|
|
@@ -75,9 +76,10 @@ export const transportProtocolProvider = (
|
|
|
75
76
|
rendezvousKey: Buffer,
|
|
76
77
|
peerId: Buffer,
|
|
77
78
|
protocolPlugin: any
|
|
78
|
-
): ProtocolProvider =>
|
|
79
|
-
protocolFactory({
|
|
79
|
+
): ProtocolProvider => {
|
|
80
|
+
return protocolFactory({
|
|
80
81
|
getTopics: () => [rendezvousKey],
|
|
81
82
|
session: { peerId: PublicKey.stringify(peerId) },
|
|
82
83
|
plugins: [protocolPlugin]
|
|
83
84
|
});
|
|
85
|
+
};
|
package/src/signal/index.ts
CHANGED
|
@@ -12,7 +12,7 @@ import { WebsocketSignalManager } from '@dxos/messaging';
|
|
|
12
12
|
import { createTestBroker, TestBroker } from '@dxos/signal';
|
|
13
13
|
|
|
14
14
|
import { MessageRouter } from './message-router';
|
|
15
|
-
import { SignalMessage } from './signal-
|
|
15
|
+
import { SignalMessage } from './signal-messenger';
|
|
16
16
|
|
|
17
17
|
describe('Signal Integration Test', function () {
|
|
18
18
|
let broker: TestBroker;
|
|
@@ -16,7 +16,7 @@ import { createTestBroker } from '@dxos/signal';
|
|
|
16
16
|
import { afterTest } from '@dxos/testutils';
|
|
17
17
|
|
|
18
18
|
import { MessageRouter } from './message-router';
|
|
19
|
-
import { OfferMessage, SignalMessage } from './signal-
|
|
19
|
+
import { OfferMessage, SignalMessage } from './signal-messenger';
|
|
20
20
|
|
|
21
21
|
describe('MessageRouter', function () {
|
|
22
22
|
let topic: PublicKey;
|
|
@@ -11,7 +11,7 @@ import { schema } from '@dxos/protocols';
|
|
|
11
11
|
import { Answer, SwarmMessage } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
12
12
|
import { ComplexMap, MakeOptional } from '@dxos/util';
|
|
13
13
|
|
|
14
|
-
import { OfferMessage, SignalMessage,
|
|
14
|
+
import { OfferMessage, SignalMessage, SignalMessenger } from './signal-messenger';
|
|
15
15
|
|
|
16
16
|
interface OfferRecord {
|
|
17
17
|
resolve: (answer: Answer) => void;
|
|
@@ -28,7 +28,7 @@ interface MessageRouterOptions {
|
|
|
28
28
|
/**
|
|
29
29
|
* Adds offer/answer and signal interfaces.
|
|
30
30
|
*/
|
|
31
|
-
export class MessageRouter implements
|
|
31
|
+
export class MessageRouter implements SignalMessenger {
|
|
32
32
|
private readonly _onSignal: (message: SignalMessage) => Promise<void>;
|
|
33
33
|
private readonly _sendMessage: (msg: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>;
|
|
34
34
|
|
package/src/swarm/connection.ts
CHANGED
|
@@ -11,7 +11,7 @@ import { log } from '@dxos/log';
|
|
|
11
11
|
import { Protocol } from '@dxos/mesh-protocol';
|
|
12
12
|
import { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
13
13
|
|
|
14
|
-
import { SignalMessage,
|
|
14
|
+
import { SignalMessage, SignalMessenger } from '../signal';
|
|
15
15
|
import { Transport, TransportFactory } from '../transport';
|
|
16
16
|
|
|
17
17
|
/**
|
|
@@ -72,7 +72,7 @@ export class Connection {
|
|
|
72
72
|
public readonly remoteId: PublicKey,
|
|
73
73
|
public readonly sessionId: PublicKey,
|
|
74
74
|
public readonly initiator: boolean,
|
|
75
|
-
private readonly _signalMessaging:
|
|
75
|
+
private readonly _signalMessaging: SignalMessenger,
|
|
76
76
|
private readonly _protocol: Protocol,
|
|
77
77
|
private readonly _transportFactory: TransportFactory
|
|
78
78
|
) {}
|
|
@@ -108,7 +108,7 @@ export class Connection {
|
|
|
108
108
|
|
|
109
109
|
if (answer.accept) {
|
|
110
110
|
try {
|
|
111
|
-
this.
|
|
111
|
+
this.openConnection();
|
|
112
112
|
} catch (err: any) {
|
|
113
113
|
this.errors.raise(err);
|
|
114
114
|
}
|
|
@@ -124,13 +124,16 @@ export class Connection {
|
|
|
124
124
|
});
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
+
/**
|
|
128
|
+
* Create an underlying transport and prepares it for the connection.
|
|
129
|
+
*/
|
|
127
130
|
// TODO(burdon): Make async?
|
|
128
|
-
|
|
131
|
+
openConnection() {
|
|
129
132
|
assert(this._state === ConnectionState.INITIAL, 'Invalid state.');
|
|
130
133
|
this._changeState(this.initiator ? ConnectionState.INITIATING_CONNECTION : ConnectionState.CONNECTING);
|
|
131
134
|
|
|
132
135
|
assert(!this._transport);
|
|
133
|
-
this._transport = this._transportFactory.
|
|
136
|
+
this._transport = this._transportFactory.createTransport({
|
|
134
137
|
initiator: this.initiator,
|
|
135
138
|
stream: this._protocol.stream,
|
|
136
139
|
sendSignal: async (signal) => {
|
|
@@ -169,17 +172,24 @@ export class Connection {
|
|
|
169
172
|
return;
|
|
170
173
|
}
|
|
171
174
|
|
|
172
|
-
|
|
173
|
-
log('closing', { peerId: this.ownId });
|
|
175
|
+
log('closing...', { peerId: this.ownId });
|
|
174
176
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
+
try {
|
|
178
|
+
// Gracefully close the stream flushing any unsent data packets.
|
|
179
|
+
await this._protocol.close();
|
|
180
|
+
} catch (err: any) {
|
|
181
|
+
log.catch(err);
|
|
182
|
+
}
|
|
177
183
|
|
|
178
|
-
|
|
179
|
-
|
|
184
|
+
try {
|
|
185
|
+
// After the transport is closed streams are disconnected.
|
|
186
|
+
await this._transport?.destroy();
|
|
187
|
+
} catch (err: any) {
|
|
188
|
+
log.catch(err);
|
|
189
|
+
}
|
|
180
190
|
|
|
181
|
-
this._changeState(ConnectionState.CLOSED);
|
|
182
191
|
log('closed', { peerId: this.ownId });
|
|
192
|
+
this._changeState(ConnectionState.CLOSED);
|
|
183
193
|
}
|
|
184
194
|
|
|
185
195
|
async signal(msg: SignalMessage) {
|
|
@@ -204,6 +214,7 @@ export class Connection {
|
|
|
204
214
|
}
|
|
205
215
|
|
|
206
216
|
private _changeState(state: ConnectionState): void {
|
|
217
|
+
assert(state !== this._state, 'Already in this state.');
|
|
207
218
|
this._state = state;
|
|
208
219
|
this.stateChanged.emit(state);
|
|
209
220
|
}
|