@dxos/network-manager 0.1.4 → 0.1.6
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/LICENSE +5 -18
- package/README.md +22 -0
- package/dist/src/network-manager.d.ts +2 -1
- package/dist/src/network-manager.d.ts.map +1 -1
- package/dist/src/network-manager.js +8 -8
- package/dist/src/network-manager.js.map +1 -1
- package/dist/src/network-manager.test.js +47 -69
- package/dist/src/network-manager.test.js.map +1 -1
- package/dist/src/protocol-factory.js +1 -1
- package/dist/src/protocol-factory.js.map +1 -1
- package/dist/src/swarm/swarm.test.js +46 -56
- package/dist/src/swarm/swarm.test.js.map +1 -1
- package/dist/src/testing/index.d.ts +1 -0
- package/dist/src/testing/index.d.ts.map +1 -1
- package/dist/src/testing/index.js +1 -0
- package/dist/src/testing/index.js.map +1 -1
- package/dist/src/testing/test-builder.d.ts +32 -0
- package/dist/src/testing/test-builder.d.ts.map +1 -0
- package/dist/src/testing/test-builder.js +73 -0
- package/dist/src/testing/test-builder.js.map +1 -0
- package/dist/src/testing/test-protocol.d.ts +3 -10
- package/dist/src/testing/test-protocol.d.ts.map +1 -1
- package/dist/src/testing/test-protocol.js +15 -16
- package/dist/src/testing/test-protocol.js.map +1 -1
- package/dist/src/transport/memory-transport.test.js +3 -3
- package/dist/src/transport/memory-transport.test.js.map +1 -1
- package/dist/src/transport/webrtc-transport-proxy.test.js +4 -4
- package/dist/src/transport/webrtc-transport-proxy.test.js.map +1 -1
- package/dist/src/transport/webrtc-transport.d.ts +0 -2
- package/dist/src/transport/webrtc-transport.d.ts.map +1 -1
- package/dist/src/transport/webrtc-transport.js +2 -5
- package/dist/src/transport/webrtc-transport.js.map +1 -1
- package/dist/src/transport/webrtc-transport.test.js +2 -2
- package/dist/src/transport/webrtc-transport.test.js.map +1 -1
- package/package.json +16 -16
- package/src/network-manager.test.ts +27 -81
- package/src/network-manager.ts +4 -3
- package/src/protocol-factory.ts +1 -1
- package/src/swarm/swarm.test.ts +54 -76
- package/src/testing/index.ts +1 -0
- package/src/testing/test-builder.ts +99 -0
- package/src/testing/test-protocol.ts +14 -16
- package/src/transport/memory-transport.test.ts +3 -3
- package/src/transport/webrtc-transport-proxy.test.ts +4 -4
- package/src/transport/webrtc-transport.test.ts +2 -2
- package/src/transport/webrtc-transport.ts +0 -4
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { PublicKey } from '@dxos/keys';
|
|
6
|
+
import { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';
|
|
7
|
+
import { afterTest } from '@dxos/testutils';
|
|
8
|
+
|
|
9
|
+
import { NetworkManager } from '../network-manager';
|
|
10
|
+
import { FullyConnectedTopology, Topology } from '../topology';
|
|
11
|
+
import { MemoryTransportFactory, TransportFactory } from '../transport';
|
|
12
|
+
import { TestProtocolPlugin, testProtocolProvider } from './test-protocol';
|
|
13
|
+
|
|
14
|
+
// Signal server will be started by the setup script.
|
|
15
|
+
export const TEST_SIGNAL_URL = 'ws://localhost:4000/.well-known/dx/signal';
|
|
16
|
+
|
|
17
|
+
export type TestBuilderOptions = {
|
|
18
|
+
signalUrl?: string;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// TODO(burdon): Builder pattern (see feed-store).
|
|
22
|
+
export class TestBuilder {
|
|
23
|
+
private _signalContext = new MemorySignalManagerContext();
|
|
24
|
+
|
|
25
|
+
constructor(private _options: TestBuilderOptions = {}) {}
|
|
26
|
+
|
|
27
|
+
createSignalManager() {
|
|
28
|
+
if (this._options.signalUrl) {
|
|
29
|
+
return new WebsocketSignalManager([this._options.signalUrl]);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return new MemorySignalManager(this._signalContext);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
createNetworkManager() {
|
|
36
|
+
return new NetworkManager({
|
|
37
|
+
signalManager: new MemorySignalManager(this._signalContext),
|
|
38
|
+
transportFactory: MemoryTransportFactory
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface CreatePeerOptions {
|
|
44
|
+
topic: PublicKey;
|
|
45
|
+
peerId: PublicKey;
|
|
46
|
+
topology?: Topology;
|
|
47
|
+
signalHosts?: string[];
|
|
48
|
+
transportFactory: TransportFactory;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// TODO(burdon): Remove.
|
|
52
|
+
const signalContext = new MemorySignalManagerContext();
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @deprecated
|
|
56
|
+
*/
|
|
57
|
+
export const createPeer = async ({
|
|
58
|
+
topic,
|
|
59
|
+
peerId,
|
|
60
|
+
topology = new FullyConnectedTopology(),
|
|
61
|
+
signalHosts,
|
|
62
|
+
transportFactory
|
|
63
|
+
}: CreatePeerOptions) => {
|
|
64
|
+
const signalManager = signalHosts ? new WebsocketSignalManager(signalHosts!) : new MemorySignalManager(signalContext);
|
|
65
|
+
await signalManager.subscribeMessages(peerId);
|
|
66
|
+
const networkManager = new NetworkManager({
|
|
67
|
+
signalManager,
|
|
68
|
+
transportFactory
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
afterTest(() => networkManager.destroy());
|
|
72
|
+
|
|
73
|
+
// TODO(burdon): Use keys everywhere.
|
|
74
|
+
const plugin = new TestProtocolPlugin(peerId.asBuffer());
|
|
75
|
+
const protocolProvider = testProtocolProvider(topic.asBuffer(), peerId, plugin);
|
|
76
|
+
await networkManager.openSwarmConnection({ topic, peerId, protocol: protocolProvider, topology });
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
networkManager,
|
|
80
|
+
plugin
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
// const createMemoryNetworkManager = (signalContext: MemorySignalManagerContext) => {
|
|
85
|
+
// return new NetworkManager({
|
|
86
|
+
// signalManager: new MemorySignalManager(signalContext),
|
|
87
|
+
// transportFactory: MemoryTransportFactory
|
|
88
|
+
// });
|
|
89
|
+
// };
|
|
90
|
+
|
|
91
|
+
// const createWebRTCNetworkManager = async (config: any, peerId: PublicKey) => {
|
|
92
|
+
// const signalManager = new WebsocketSignalManager(signalHosts!);
|
|
93
|
+
// await signalManager.subscribeMessages(peerId);
|
|
94
|
+
//
|
|
95
|
+
// return new NetworkManager({
|
|
96
|
+
// signalManager,
|
|
97
|
+
// transportFactory: createWebRTCTransportFactory(config)
|
|
98
|
+
// });
|
|
99
|
+
// };
|
|
@@ -31,10 +31,10 @@ export const getPeerId = (protocol: Protocol) => {
|
|
|
31
31
|
*/
|
|
32
32
|
export class TestProtocolPlugin extends EventEmitter {
|
|
33
33
|
/** @type {Map<string, {Protocol}>} */
|
|
34
|
-
_peers;
|
|
34
|
+
private readonly _peers = new Map(); // TODO(burdon): Complex map.
|
|
35
35
|
|
|
36
36
|
/** @type {Buffer} */
|
|
37
|
-
_peerId;
|
|
37
|
+
_peerId; // TODO(burdon): PublicKey.
|
|
38
38
|
|
|
39
39
|
/** @type {Boolean} */
|
|
40
40
|
_uppercase;
|
|
@@ -55,21 +55,14 @@ export class TestProtocolPlugin extends EventEmitter {
|
|
|
55
55
|
// TODO(dboreham): Mis-named because this is OUR node ID, not the id of any peer.
|
|
56
56
|
this._peerId = peerId;
|
|
57
57
|
this._uppercase = uppercase;
|
|
58
|
-
this._peers = new Map();
|
|
59
58
|
}
|
|
60
59
|
|
|
61
|
-
|
|
62
|
-
* This node's id.
|
|
63
|
-
* @return {Buffer}
|
|
64
|
-
*/
|
|
60
|
+
// TODO(burdon): Expose key directly.
|
|
65
61
|
get peerId() {
|
|
66
62
|
return this._peerId;
|
|
67
63
|
}
|
|
68
64
|
|
|
69
|
-
|
|
70
|
-
* Array of the currently connected peers' node ids (not including our id).
|
|
71
|
-
* @return {{Protocol}[]}
|
|
72
|
-
*/
|
|
65
|
+
// TODO(burdon): Map of keys.
|
|
73
66
|
get peers() {
|
|
74
67
|
return Array.from(this._peers.values());
|
|
75
68
|
}
|
|
@@ -80,6 +73,7 @@ export class TestProtocolPlugin extends EventEmitter {
|
|
|
80
73
|
* @return {Extension}
|
|
81
74
|
*/
|
|
82
75
|
createExtension() {
|
|
76
|
+
log('creating extension', { peerId: PublicKey.from(this.peerId) }); // TODO(burdon): Just key.
|
|
83
77
|
return new Extension(EXTENSION_NAME, { binary: true })
|
|
84
78
|
.setInitHandler(this._init.bind(this))
|
|
85
79
|
.setMessageHandler(this._receive.bind(this))
|
|
@@ -103,7 +97,8 @@ export class TestProtocolPlugin extends EventEmitter {
|
|
|
103
97
|
// TODO(dboreham): Throw fatal error if peer not found.
|
|
104
98
|
const extension = peer.getExtension(EXTENSION_NAME);
|
|
105
99
|
const encoded = Buffer.from(payload);
|
|
106
|
-
|
|
100
|
+
|
|
101
|
+
log('sent', { peerIdStr, payload });
|
|
107
102
|
return await extension.send(encoded, { oneway: true });
|
|
108
103
|
}
|
|
109
104
|
|
|
@@ -119,7 +114,8 @@ export class TestProtocolPlugin extends EventEmitter {
|
|
|
119
114
|
if (this._uppercase) {
|
|
120
115
|
payload = payload.toUpperCase();
|
|
121
116
|
}
|
|
122
|
-
|
|
117
|
+
|
|
118
|
+
log('received', { peerIdStr, payload });
|
|
123
119
|
this.emit('receive', protocol, payload);
|
|
124
120
|
}
|
|
125
121
|
|
|
@@ -152,9 +148,11 @@ export class TestProtocolPlugin extends EventEmitter {
|
|
|
152
148
|
* @return {ProtocolProvider}
|
|
153
149
|
*/
|
|
154
150
|
// TODO(dboreham): Try to encapsulate swarm_key, nodeId.
|
|
155
|
-
export const testProtocolProvider = (swarmKey: Buffer,
|
|
156
|
-
|
|
151
|
+
export const testProtocolProvider = (swarmKey: Buffer, peerId: PublicKey, protocolPlugin: any) => {
|
|
152
|
+
log('creating protocol factory', { swarmKey: PublicKey.from(swarmKey), peerId });
|
|
153
|
+
return protocolFactory({
|
|
157
154
|
getTopics: () => [swarmKey],
|
|
158
|
-
session: { peerId:
|
|
155
|
+
session: { peerId: peerId.toHex() },
|
|
159
156
|
plugins: [protocolPlugin]
|
|
160
157
|
});
|
|
158
|
+
};
|
|
@@ -24,7 +24,7 @@ const createPair = () => {
|
|
|
24
24
|
const peer2Id = PublicKey.random();
|
|
25
25
|
|
|
26
26
|
const plugin1 = new TestProtocolPlugin(peer1Id.asBuffer());
|
|
27
|
-
const protocolProvider1 = testProtocolProvider(topic.asBuffer(), peer1Id
|
|
27
|
+
const protocolProvider1 = testProtocolProvider(topic.asBuffer(), peer1Id, plugin1);
|
|
28
28
|
const connection1 = new MemoryTransport({
|
|
29
29
|
stream: protocolProvider1({ channel: discoveryKey(topic), initiator: true }).stream,
|
|
30
30
|
sendSignal: async (signal) => {
|
|
@@ -37,7 +37,7 @@ const createPair = () => {
|
|
|
37
37
|
afterTest(() => connection1.errors.assertNoUnhandledErrors());
|
|
38
38
|
|
|
39
39
|
const plugin2 = new TestProtocolPlugin(peer2Id.asBuffer());
|
|
40
|
-
const protocolProvider2 = testProtocolProvider(topic.asBuffer(), peer2Id
|
|
40
|
+
const protocolProvider2 = testProtocolProvider(topic.asBuffer(), peer2Id, plugin2);
|
|
41
41
|
const connection2 = new MemoryTransport({
|
|
42
42
|
stream: protocolProvider2({ channel: discoveryKey(topic), initiator: false }).stream,
|
|
43
43
|
sendSignal: async (signal) => {
|
|
@@ -82,7 +82,7 @@ describe('MemoryTransport', function () {
|
|
|
82
82
|
});
|
|
83
83
|
});
|
|
84
84
|
|
|
85
|
-
it('10 pairs of peers connecting at the same time', async function () {
|
|
85
|
+
it.skip('10 pairs of peers connecting at the same time', async function () {
|
|
86
86
|
await Promise.all(
|
|
87
87
|
range(10).map(async () => {
|
|
88
88
|
const { plugin1, plugin2, peer1Id } = createPair();
|
|
@@ -108,7 +108,7 @@ describe('WebRTCTransportProxy', function () {
|
|
|
108
108
|
const peer2Id = PublicKey.random();
|
|
109
109
|
|
|
110
110
|
const plugin1 = new TestProtocolPlugin(peer1Id.asBuffer());
|
|
111
|
-
const protocolProvider1 = testProtocolProvider(topic.asBuffer(), peer1Id
|
|
111
|
+
const protocolProvider1 = testProtocolProvider(topic.asBuffer(), peer1Id, plugin1);
|
|
112
112
|
const { webRTCTransportProxy: connection1 } = await setupProxy({
|
|
113
113
|
initiator: true,
|
|
114
114
|
stream: protocolProvider1({
|
|
@@ -123,7 +123,7 @@ describe('WebRTCTransportProxy', function () {
|
|
|
123
123
|
afterTest(() => connection1.errors.assertNoUnhandledErrors());
|
|
124
124
|
|
|
125
125
|
const plugin2 = new TestProtocolPlugin(peer2Id.asBuffer());
|
|
126
|
-
const protocolProvider2 = testProtocolProvider(topic.asBuffer(), peer2Id
|
|
126
|
+
const protocolProvider2 = testProtocolProvider(topic.asBuffer(), peer2Id, plugin2);
|
|
127
127
|
const { webRTCTransportProxy: connection2 } = await setupProxy({
|
|
128
128
|
initiator: false,
|
|
129
129
|
stream: protocolProvider2({
|
|
@@ -201,7 +201,7 @@ describe('WebRTCTransportProxy', function () {
|
|
|
201
201
|
const peer2Id = PublicKey.random();
|
|
202
202
|
|
|
203
203
|
const plugin1 = new TestProtocolPlugin(peer1Id.asBuffer());
|
|
204
|
-
const protocolProvider1 = testProtocolProvider(topic.asBuffer(), peer1Id
|
|
204
|
+
const protocolProvider1 = testProtocolProvider(topic.asBuffer(), peer1Id, plugin1);
|
|
205
205
|
const proxy1 = new WebRTCTransportProxy({
|
|
206
206
|
initiator: true,
|
|
207
207
|
stream: protocolProvider1({
|
|
@@ -217,7 +217,7 @@ describe('WebRTCTransportProxy', function () {
|
|
|
217
217
|
afterTest(() => proxy1.errors.assertNoUnhandledErrors());
|
|
218
218
|
|
|
219
219
|
const plugin2 = new TestProtocolPlugin(peer2Id.asBuffer());
|
|
220
|
-
const protocolProvider2 = testProtocolProvider(topic.asBuffer(), peer2Id
|
|
220
|
+
const protocolProvider2 = testProtocolProvider(topic.asBuffer(), peer2Id, plugin2);
|
|
221
221
|
const proxy2 = new WebRTCTransportProxy({
|
|
222
222
|
initiator: false,
|
|
223
223
|
stream: protocolProvider2({
|
|
@@ -46,7 +46,7 @@ describe('WebRTCTransport', function () {
|
|
|
46
46
|
const peer2Id = PublicKey.random();
|
|
47
47
|
|
|
48
48
|
const plugin1 = new TestProtocolPlugin(peer1Id.asBuffer());
|
|
49
|
-
const protocolProvider1 = testProtocolProvider(topic.asBuffer(), peer1Id
|
|
49
|
+
const protocolProvider1 = testProtocolProvider(topic.asBuffer(), peer1Id, plugin1);
|
|
50
50
|
const connection1 = new WebRTCTransport({
|
|
51
51
|
initiator: true,
|
|
52
52
|
stream: protocolProvider1({
|
|
@@ -62,7 +62,7 @@ describe('WebRTCTransport', function () {
|
|
|
62
62
|
afterTest(() => connection1.errors.assertNoUnhandledErrors());
|
|
63
63
|
|
|
64
64
|
const plugin2 = new TestProtocolPlugin(peer2Id.asBuffer());
|
|
65
|
-
const protocolProvider2 = testProtocolProvider(topic.asBuffer(), peer2Id
|
|
65
|
+
const protocolProvider2 = testProtocolProvider(topic.asBuffer(), peer2Id, plugin2);
|
|
66
66
|
const connection2 = new WebRTCTransport({
|
|
67
67
|
initiator: false,
|
|
68
68
|
stream: protocolProvider2({
|