@dxos/network-manager 2.33.9-dev.bba8fc00 → 2.33.9-dev.ceab0857
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/network-manager.blueprint-test.d.ts +3 -1
- package/dist/src/network-manager.blueprint-test.d.ts.map +1 -1
- package/dist/src/network-manager.blueprint-test.js +46 -17
- package/dist/src/network-manager.blueprint-test.js.map +1 -1
- package/dist/src/network-manager.browser-test.js +1 -1
- package/dist/src/network-manager.browser-test.js.map +1 -1
- package/dist/src/network-manager.d.ts.map +1 -1
- package/dist/src/network-manager.js +6 -6
- package/dist/src/network-manager.js.map +1 -1
- package/dist/src/network-manager.test.js +5 -4
- package/dist/src/network-manager.test.js.map +1 -1
- package/dist/src/proto/gen/dxos/credentials.d.ts.map +1 -1
- package/dist/src/proto/gen/dxos/halo/keys.d.ts.map +1 -1
- package/dist/src/proto/gen/dxos/halo/keys.js.map +1 -1
- package/dist/src/proto/gen/dxos/mesh/signal.d.ts +52 -45
- package/dist/src/proto/gen/dxos/mesh/signal.d.ts.map +1 -1
- package/dist/src/proto/gen/dxos/mesh/signalMessage.d.ts +79 -0
- package/dist/src/proto/gen/dxos/mesh/signalMessage.d.ts.map +1 -0
- package/dist/src/proto/gen/dxos/mesh/signalMessage.js +3 -0
- package/dist/src/proto/gen/dxos/mesh/signalMessage.js.map +1 -0
- package/dist/src/proto/gen/google/protobuf.d.ts +6 -0
- package/dist/src/proto/gen/google/protobuf.d.ts.map +1 -1
- package/dist/src/proto/gen/index.d.ts +17 -5
- package/dist/src/proto/gen/index.d.ts.map +1 -1
- package/dist/src/proto/gen/index.js +1 -1
- package/dist/src/proto/gen/index.js.map +1 -1
- package/dist/src/proto/substitutions.d.ts +4 -0
- package/dist/src/proto/substitutions.d.ts.map +1 -1
- package/dist/src/proto/substitutions.js +3 -1
- package/dist/src/proto/substitutions.js.map +1 -1
- package/dist/src/signal/in-memory-signal-manager.d.ts +7 -7
- package/dist/src/signal/in-memory-signal-manager.d.ts.map +1 -1
- package/dist/src/signal/in-memory-signal-manager.js +29 -8
- package/dist/src/signal/in-memory-signal-manager.js.map +1 -1
- package/dist/src/signal/index.d.ts +1 -2
- package/dist/src/signal/index.d.ts.map +1 -1
- package/dist/src/signal/index.js +1 -2
- package/dist/src/signal/index.js.map +1 -1
- package/dist/src/signal/integration.test.d.ts +2 -0
- package/dist/src/signal/integration.test.d.ts.map +1 -0
- package/dist/src/signal/integration.test.js +102 -0
- package/dist/src/signal/integration.test.js.map +1 -0
- package/dist/src/signal/message-router.d.ts +7 -7
- package/dist/src/signal/message-router.d.ts.map +1 -1
- package/dist/src/signal/message-router.js +6 -1
- package/dist/src/signal/message-router.js.map +1 -1
- package/dist/src/signal/message-router.test.js +15 -19
- package/dist/src/signal/message-router.test.js.map +1 -1
- package/dist/src/signal/signal-client.d.ts +33 -18
- package/dist/src/signal/signal-client.d.ts.map +1 -1
- package/dist/src/signal/signal-client.js +102 -92
- package/dist/src/signal/signal-client.js.map +1 -1
- package/dist/src/signal/signal-client.test.js +60 -77
- package/dist/src/signal/signal-client.test.js.map +1 -1
- package/dist/src/signal/{websocket-signal-manager.d.ts → signal-manager-impl.d.ts} +13 -11
- package/dist/src/signal/signal-manager-impl.d.ts.map +1 -0
- package/dist/src/signal/signal-manager-impl.js +151 -0
- package/dist/src/signal/signal-manager-impl.js.map +1 -0
- package/dist/src/signal/signal-manager.d.ts +12 -11
- package/dist/src/signal/signal-manager.d.ts.map +1 -1
- package/dist/src/signal/signal-rpc-client.d.ts +19 -0
- package/dist/src/signal/signal-rpc-client.d.ts.map +1 -0
- package/dist/src/signal/signal-rpc-client.js +108 -0
- package/dist/src/signal/signal-rpc-client.js.map +1 -0
- package/dist/src/signal/signal-rpc-client.test.d.ts +2 -0
- package/dist/src/signal/signal-rpc-client.test.d.ts.map +1 -0
- package/dist/src/signal/signal-rpc-client.test.js +74 -0
- package/dist/src/signal/signal-rpc-client.test.js.map +1 -0
- package/dist/src/swarm/connection.d.ts +3 -3
- package/dist/src/swarm/connection.d.ts.map +1 -1
- package/dist/src/swarm/connection.js +1 -4
- package/dist/src/swarm/connection.js.map +1 -1
- package/dist/src/swarm/swarm.d.ts +6 -7
- package/dist/src/swarm/swarm.d.ts.map +1 -1
- package/dist/src/swarm/swarm.js +21 -17
- package/dist/src/swarm/swarm.js.map +1 -1
- package/dist/src/swarm/swarm.test.js +156 -117
- package/dist/src/swarm/swarm.test.js.map +1 -1
- package/dist/src/topology/fully-connected-topology.d.ts +0 -1
- package/dist/src/topology/fully-connected-topology.d.ts.map +1 -1
- package/dist/src/topology/fully-connected-topology.js +1 -6
- package/dist/src/topology/fully-connected-topology.js.map +1 -1
- package/dist/src/topology/mmst-topology.d.ts +0 -1
- package/dist/src/topology/mmst-topology.d.ts.map +1 -1
- package/dist/src/topology/mmst-topology.js +1 -6
- package/dist/src/topology/mmst-topology.js.map +1 -1
- package/dist/src/topology/star-topology.d.ts +0 -1
- package/dist/src/topology/star-topology.d.ts.map +1 -1
- package/dist/src/topology/star-topology.js +1 -6
- package/dist/src/topology/star-topology.js.map +1 -1
- package/dist/src/topology/topology.d.ts +0 -6
- package/dist/src/topology/topology.d.ts.map +1 -1
- package/dist/src/transport/in-memory-transport.d.ts +2 -2
- package/dist/src/transport/in-memory-transport.d.ts.map +1 -1
- package/dist/src/transport/in-memory-transport.js.map +1 -1
- package/dist/src/transport/transport.d.ts +3 -3
- package/dist/src/transport/transport.d.ts.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.map +1 -1
- package/dist/tests-setup.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -12
- package/src/network-manager.blueprint-test.ts +57 -22
- package/src/network-manager.browser-test.ts +1 -1
- package/src/network-manager.test.ts +8 -7
- package/src/network-manager.ts +8 -9
- package/src/proto/defs/dxos/mesh/signal.proto +53 -35
- package/src/proto/defs/dxos/mesh/signalMessage.proto +51 -0
- package/src/proto/gen/dxos/credentials.ts +1 -0
- package/src/proto/gen/dxos/halo/keys.ts +1 -0
- package/src/proto/gen/dxos/mesh/signal.ts +51 -45
- package/src/proto/gen/dxos/mesh/signalMessage.ts +83 -0
- package/src/proto/gen/google/protobuf.ts +7 -0
- package/src/proto/gen/index.ts +18 -6
- package/src/proto/substitutions.ts +3 -1
- package/src/signal/in-memory-signal-manager.ts +37 -12
- package/src/signal/index.ts +1 -2
- package/src/signal/integration.test.ts +117 -0
- package/src/signal/message-router.test.ts +36 -41
- package/src/signal/message-router.ts +22 -18
- package/src/signal/signal-client.test.ts +70 -92
- package/src/signal/signal-client.ts +119 -113
- package/src/signal/signal-manager-impl.ts +166 -0
- package/src/signal/signal-manager.ts +12 -12
- package/src/signal/signal-rpc-client.test.ts +86 -0
- package/src/signal/signal-rpc-client.ts +121 -0
- package/src/swarm/connection.ts +5 -8
- package/src/swarm/swarm.test.ts +208 -169
- package/src/swarm/swarm.ts +24 -20
- package/src/topology/fully-connected-topology.ts +1 -9
- package/src/topology/mmst-topology.ts +1 -9
- package/src/topology/star-topology.ts +1 -7
- package/src/topology/topology.ts +0 -7
- package/src/transport/in-memory-transport.ts +2 -2
- package/src/transport/transport.ts +3 -3
- package/src/transport/webrtc-transport.ts +3 -3
- package/dist/browser-mocha/bundle.js +0 -119286
- package/dist/browser-mocha/main.js +0 -27
- package/dist/src/signal/websocket-rpc.d.ts +0 -30
- package/dist/src/signal/websocket-rpc.d.ts.map +0 -1
- package/dist/src/signal/websocket-rpc.js +0 -203
- package/dist/src/signal/websocket-rpc.js.map +0 -1
- package/dist/src/signal/websocket-signal-manager.d.ts.map +0 -1
- package/dist/src/signal/websocket-signal-manager.js +0 -134
- package/dist/src/signal/websocket-signal-manager.js.map +0 -1
- package/src/signal/websocket-rpc.ts +0 -208
- package/src/signal/websocket-signal-manager.ts +0 -158
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/network-manager",
|
|
3
|
-
"version": "2.33.9-dev.
|
|
3
|
+
"version": "2.33.9-dev.ceab0857",
|
|
4
4
|
"description": "Network Manager",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "DXOS.org",
|
|
@@ -15,15 +15,16 @@
|
|
|
15
15
|
"README.md"
|
|
16
16
|
],
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@dxos/async": "2.33.9-dev.
|
|
19
|
-
"@dxos/credentials": "2.33.9-dev.
|
|
20
|
-
"@dxos/crypto": "2.33.9-dev.
|
|
21
|
-
"@dxos/debug": "2.33.9-dev.
|
|
22
|
-
"@dxos/mesh-protocol": "2.33.9-dev.
|
|
23
|
-
"@dxos/protocol-plugin-presence": "2.33.9-dev.
|
|
24
|
-
"@dxos/protocols": "2.33.9-dev.
|
|
25
|
-
"@dxos/
|
|
26
|
-
"@dxos/
|
|
18
|
+
"@dxos/async": "2.33.9-dev.ceab0857",
|
|
19
|
+
"@dxos/credentials": "2.33.9-dev.ceab0857",
|
|
20
|
+
"@dxos/crypto": "2.33.9-dev.ceab0857",
|
|
21
|
+
"@dxos/debug": "2.33.9-dev.ceab0857",
|
|
22
|
+
"@dxos/mesh-protocol": "2.33.9-dev.ceab0857",
|
|
23
|
+
"@dxos/protocol-plugin-presence": "2.33.9-dev.ceab0857",
|
|
24
|
+
"@dxos/protocols": "2.33.9-dev.ceab0857",
|
|
25
|
+
"@dxos/rpc": "2.33.9-dev.ceab0857",
|
|
26
|
+
"@dxos/codec-protobuf": "2.33.9-dev.ceab0857",
|
|
27
|
+
"@dxos/util": "2.33.9-dev.ceab0857",
|
|
27
28
|
"@koush/wrtc": "^0.5.3",
|
|
28
29
|
"assert": "^2.0.0",
|
|
29
30
|
"debug": "^4.3.3",
|
|
@@ -37,7 +38,7 @@
|
|
|
37
38
|
"@dxos/browser-mocha": "2.33.8",
|
|
38
39
|
"@dxos/eslint-plugin": "~1.0.34",
|
|
39
40
|
"@dxos/protocols-toolchain": "2.33.8",
|
|
40
|
-
"@dxos/signal": "2.33.9-dev.
|
|
41
|
+
"@dxos/signal": "2.33.9-dev.ceab0857",
|
|
41
42
|
"@dxos/testutils": "2.33.8",
|
|
42
43
|
"@types/debug": "^4.1.7",
|
|
43
44
|
"@types/mocha": "~8.2.2",
|
|
@@ -50,7 +51,8 @@
|
|
|
50
51
|
"fast-check": "~2.14.0",
|
|
51
52
|
"mocha": "~8.4.0",
|
|
52
53
|
"typescript": "^4.7.2",
|
|
53
|
-
"wait-for-expect": "^3.0.2"
|
|
54
|
+
"wait-for-expect": "^3.0.2",
|
|
55
|
+
"@swc-node/register": "~1.4.2"
|
|
54
56
|
},
|
|
55
57
|
"publishConfig": {
|
|
56
58
|
"access": "public"
|
|
@@ -25,21 +25,16 @@ const log = debug('dxos:network-manager:test');
|
|
|
25
25
|
interface CreatePeerOptions {
|
|
26
26
|
topic: PublicKey
|
|
27
27
|
peerId: PublicKey
|
|
28
|
-
inMemory?: boolean
|
|
29
28
|
topology?: Topology
|
|
30
29
|
signal?: string[]
|
|
31
30
|
ice?: any
|
|
32
31
|
}
|
|
33
32
|
|
|
34
|
-
const signalApiPort = 12098;
|
|
35
|
-
const signalApiUrl = 'ws://0.0.0.0:' + signalApiPort;
|
|
36
|
-
|
|
37
33
|
const createPeer = async ({
|
|
38
34
|
topic,
|
|
39
35
|
peerId,
|
|
40
|
-
inMemory,
|
|
41
36
|
topology = new FullyConnectedTopology(),
|
|
42
|
-
signal
|
|
37
|
+
signal,
|
|
43
38
|
ice
|
|
44
39
|
}: CreatePeerOptions) => {
|
|
45
40
|
const networkManager = new NetworkManager({ signal, ice });
|
|
@@ -55,14 +50,14 @@ const createPeer = async ({
|
|
|
55
50
|
};
|
|
56
51
|
};
|
|
57
52
|
|
|
58
|
-
const sharedTests = (inMemory: boolean) => {
|
|
53
|
+
const sharedTests = ({ inMemory, signalUrl } : { inMemory: boolean, signalUrl?: string }) => {
|
|
59
54
|
it('two peers connect to each other', async () => {
|
|
60
55
|
const topic = PublicKey.random();
|
|
61
56
|
const peer1Id = PublicKey.random();
|
|
62
57
|
const peer2Id = PublicKey.random();
|
|
63
58
|
|
|
64
|
-
const { plugin: plugin1, networkManager: nm1 } = await createPeer({ topic, peerId: peer1Id, inMemory });
|
|
65
|
-
const { plugin: plugin2, networkManager: nm2 } = await createPeer({ topic, peerId: peer2Id, inMemory });
|
|
59
|
+
const { plugin: plugin1, networkManager: nm1 } = await createPeer({ topic, peerId: peer1Id, signal: !inMemory ? [signalUrl!] : undefined });
|
|
60
|
+
const { plugin: plugin2, networkManager: nm2 } = await createPeer({ topic, peerId: peer2Id, signal: !inMemory ? [signalUrl!] : undefined });
|
|
66
61
|
|
|
67
62
|
const received: any[] = [];
|
|
68
63
|
const mockReceive = (p: Protocol, s: string) => {
|
|
@@ -74,13 +69,11 @@ const sharedTests = (inMemory: boolean) => {
|
|
|
74
69
|
plugin2.on('connect', async () => {
|
|
75
70
|
await plugin2.send(peer1Id.asBuffer(), 'Foo');
|
|
76
71
|
});
|
|
77
|
-
|
|
78
72
|
await waitForExpect(() => {
|
|
79
73
|
expect(received.length).toBe(2);
|
|
80
74
|
expect(received[0]).toBeInstanceOf(Protocol);
|
|
81
75
|
expect(received[1]).toBe('Foo');
|
|
82
76
|
});
|
|
83
|
-
|
|
84
77
|
await nm1.destroy();
|
|
85
78
|
await nm2.destroy();
|
|
86
79
|
}).timeout(10_000).retries(3);
|
|
@@ -90,8 +83,8 @@ const sharedTests = (inMemory: boolean) => {
|
|
|
90
83
|
const peer1Id = PublicKey.random();
|
|
91
84
|
const peer2Id = PublicKey.random();
|
|
92
85
|
|
|
93
|
-
const { networkManager: networkManager1, plugin: plugin1 } = await createPeer({ topic, peerId: peer1Id, inMemory });
|
|
94
|
-
const { networkManager: networkManager2, plugin: plugin2 } = await createPeer({ topic, peerId: peer2Id, inMemory });
|
|
86
|
+
const { networkManager: networkManager1, plugin: plugin1 } = await createPeer({ topic, peerId: peer1Id, signal: !inMemory ? [signalUrl!] : undefined });
|
|
87
|
+
const { networkManager: networkManager2, plugin: plugin2 } = await createPeer({ topic, peerId: peer2Id, signal: !inMemory ? [signalUrl!] : undefined });
|
|
95
88
|
|
|
96
89
|
await Promise.all([
|
|
97
90
|
Event.wrap(plugin1, 'connect').waitForCount(1),
|
|
@@ -117,11 +110,53 @@ const sharedTests = (inMemory: boolean) => {
|
|
|
117
110
|
log('Peer1 destroyed');
|
|
118
111
|
await networkManager2.destroy();
|
|
119
112
|
log('Peer2 destroyed');
|
|
120
|
-
}).timeout(10_000)
|
|
113
|
+
}).timeout(10_000);
|
|
114
|
+
|
|
115
|
+
it('join and leave swarm and reconnect', async () => {
|
|
116
|
+
const topic = PublicKey.random();
|
|
117
|
+
const peer1Id = PublicKey.random();
|
|
118
|
+
const peer2Id = PublicKey.random();
|
|
119
|
+
|
|
120
|
+
const { networkManager: networkManager1, plugin: plugin1 } = await createPeer({ topic, peerId: peer1Id, signal: !inMemory ? [signalUrl!] : undefined });
|
|
121
|
+
const { networkManager: networkManager2, plugin: plugin2 } = await createPeer({ topic, peerId: peer2Id, signal: !inMemory ? [signalUrl!] : undefined });
|
|
122
|
+
|
|
123
|
+
await Promise.all([
|
|
124
|
+
Event.wrap(plugin1, 'connect').waitForCount(1),
|
|
125
|
+
Event.wrap(plugin2, 'connect').waitForCount(1)
|
|
126
|
+
]);
|
|
127
|
+
|
|
128
|
+
log('Connected');
|
|
129
|
+
|
|
130
|
+
const disconnectPromises = Promise.all([
|
|
131
|
+
Event.wrap(plugin1, 'disconnect').waitForCount(1),
|
|
132
|
+
Event.wrap(plugin2, 'disconnect').waitForCount(1)
|
|
133
|
+
]);
|
|
134
|
+
|
|
135
|
+
const connectPromises = Promise.all([
|
|
136
|
+
Event.wrap(plugin1, 'connect').waitForCount(1),
|
|
137
|
+
Event.wrap(plugin2, 'connect').waitForCount(1)
|
|
138
|
+
]);
|
|
139
|
+
|
|
140
|
+
log('Disconnecting peer2');
|
|
141
|
+
await networkManager2.leaveProtocolSwarm(topic);
|
|
142
|
+
|
|
143
|
+
log('Reconnecting peer2');
|
|
144
|
+
const newPeer2Id = PublicKey.random();
|
|
145
|
+
networkManager2.joinProtocolSwarm({ topic, peerId: newPeer2Id, protocol: testProtocolProvider(topic.asBuffer(), peer2Id.asBuffer(), plugin2), topology: new FullyConnectedTopology() });
|
|
146
|
+
|
|
147
|
+
await disconnectPromises;
|
|
148
|
+
|
|
149
|
+
await connectPromises;
|
|
150
|
+
|
|
151
|
+
await networkManager1.destroy();
|
|
152
|
+
log('Peer1 destroyed');
|
|
153
|
+
await networkManager2.destroy();
|
|
154
|
+
log('Peer2 destroyed');
|
|
155
|
+
}).timeout(10_000);
|
|
121
156
|
};
|
|
122
157
|
|
|
123
158
|
// eslint-disable-next-line jest/no-export
|
|
124
|
-
export const webRTCTests = () => {
|
|
159
|
+
export const webRTCTests = ({ signalUrl } : { signalUrl?: string } = {}) => {
|
|
125
160
|
let topic: PublicKey;
|
|
126
161
|
let peer1Id: PublicKey;
|
|
127
162
|
let peer2Id: PublicKey;
|
|
@@ -132,7 +167,7 @@ export const webRTCTests = () => {
|
|
|
132
167
|
peer2Id = PublicKey.random();
|
|
133
168
|
});
|
|
134
169
|
|
|
135
|
-
sharedTests(false);
|
|
170
|
+
sharedTests({ inMemory: false, signalUrl });
|
|
136
171
|
|
|
137
172
|
it.skip('two peers with different signal & turn servers', async () => {
|
|
138
173
|
const { networkManager: networkManager1, plugin: plugin1 } = await createPeer({ topic, peerId: peer1Id, signal: ['wss://apollo3.kube.moon.dxos.network/dxos/signal'], ice: [{ urls: 'turn:apollo3.kube.moon.dxos.network:3478', username: 'dxos', credential: 'dxos' }] });
|
|
@@ -187,7 +222,7 @@ export const webRTCTests = () => {
|
|
|
187
222
|
|
|
188
223
|
// eslint-disable-next-line jest/no-export
|
|
189
224
|
export function inMemoryTests () {
|
|
190
|
-
sharedTests(true);
|
|
225
|
+
sharedTests({ inMemory: true });
|
|
191
226
|
|
|
192
227
|
it('two swarms at the same time', async () => {
|
|
193
228
|
const topicA = PublicKey.random();
|
|
@@ -197,10 +232,10 @@ export function inMemoryTests () {
|
|
|
197
232
|
const peerB1Id = PublicKey.random();
|
|
198
233
|
const peerB2Id = PublicKey.random();
|
|
199
234
|
|
|
200
|
-
const { plugin: pluginA1 } = await createPeer({ topic: topicA, peerId: peerA1Id
|
|
201
|
-
const { plugin: pluginA2 } = await createPeer({ topic: topicA, peerId: peerA2Id
|
|
202
|
-
const { plugin: pluginB1 } = await createPeer({ topic: topicB, peerId: peerB1Id
|
|
203
|
-
const { plugin: pluginB2 } = await createPeer({ topic: topicB, peerId: peerB2Id
|
|
235
|
+
const { plugin: pluginA1 } = await createPeer({ topic: topicA, peerId: peerA1Id });
|
|
236
|
+
const { plugin: pluginA2 } = await createPeer({ topic: topicA, peerId: peerA2Id });
|
|
237
|
+
const { plugin: pluginB1 } = await createPeer({ topic: topicB, peerId: peerB1Id });
|
|
238
|
+
const { plugin: pluginB2 } = await createPeer({ topic: topicB, peerId: peerB2Id });
|
|
204
239
|
|
|
205
240
|
const receivedA: any[] = [];
|
|
206
241
|
const mockReceiveA = (p: Protocol, s: string) => {
|
|
@@ -241,7 +276,7 @@ export function inMemoryTests () {
|
|
|
241
276
|
|
|
242
277
|
await Promise.all(range(peersPerTopic).map(async (_, index) => {
|
|
243
278
|
const peerId = PublicKey.random();
|
|
244
|
-
const { plugin } = await createPeer({ topic, peerId
|
|
279
|
+
const { plugin } = await createPeer({ topic, peerId });
|
|
245
280
|
|
|
246
281
|
const [done, pongReceived] = latch(peersPerTopic - 1);
|
|
247
282
|
|
|
@@ -6,7 +6,7 @@ import { inMemoryTests, webRTCTests } from './network-manager.blueprint-test';
|
|
|
6
6
|
|
|
7
7
|
describe('Network manager', () => {
|
|
8
8
|
describe('WebRTC transport', () => {
|
|
9
|
-
webRTCTests();
|
|
9
|
+
webRTCTests({ signalUrl: 'ws://localhost:12087/.well-known/dx/signal' });
|
|
10
10
|
}).timeout(10_000);
|
|
11
11
|
|
|
12
12
|
// TODO(marik-d): In-memory tests seem to be broken in the browser. Need more investigation.
|
|
@@ -2,24 +2,25 @@
|
|
|
2
2
|
// Copyright 2021 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
import { createTestBroker } from '@dxos/signal';
|
|
5
|
+
import { createTestBroker, TestBroker } from '@dxos/signal';
|
|
7
6
|
|
|
8
7
|
import { webRTCTests, inMemoryTests } from './network-manager.blueprint-test';
|
|
9
8
|
|
|
9
|
+
const PORT = 12087;
|
|
10
|
+
|
|
10
11
|
describe('Network manager', () => {
|
|
11
12
|
describe('WebRTC transport', () => {
|
|
12
|
-
let broker:
|
|
13
|
+
let broker: TestBroker;
|
|
13
14
|
|
|
14
15
|
before(async () => {
|
|
15
|
-
broker = await createTestBroker(
|
|
16
|
+
broker = await createTestBroker(PORT);
|
|
16
17
|
});
|
|
17
18
|
|
|
18
|
-
after(
|
|
19
|
-
|
|
19
|
+
after(() => {
|
|
20
|
+
broker?.stop();
|
|
20
21
|
});
|
|
21
22
|
|
|
22
|
-
webRTCTests();
|
|
23
|
+
webRTCTests({ signalUrl: `ws://localhost:${PORT}/.well-known/dx/signal` });
|
|
23
24
|
}).timeout(10_000);
|
|
24
25
|
|
|
25
26
|
describe('In-memory transport', () => {
|
package/src/network-manager.ts
CHANGED
|
@@ -12,8 +12,8 @@ import { PublicKey } from '@dxos/protocols';
|
|
|
12
12
|
import { ComplexMap } from '@dxos/util';
|
|
13
13
|
|
|
14
14
|
import { ConnectionLog } from './connection-log';
|
|
15
|
-
import {
|
|
16
|
-
import { InMemorySignalManager, SignalManager,
|
|
15
|
+
import { SignalMessage } from './proto/gen/dxos/mesh/signalMessage';
|
|
16
|
+
import { InMemorySignalManager, SignalManager, SignalManagerImpl } from './signal';
|
|
17
17
|
import { MessageRouter } from './signal/message-router';
|
|
18
18
|
import { Swarm, SwarmMapper } from './swarm';
|
|
19
19
|
import { Topology } from './topology';
|
|
@@ -48,20 +48,20 @@ export class NetworkManager {
|
|
|
48
48
|
constructor (options: NetworkManagerOptions = {}) {
|
|
49
49
|
this._ice = options.ice ?? [];
|
|
50
50
|
|
|
51
|
-
const onOffer = async (message:
|
|
51
|
+
const onOffer = async (message: SignalMessage) =>
|
|
52
52
|
await this._swarms.get(message.topic!)?.onOffer(message) ?? { accept: false };
|
|
53
53
|
|
|
54
54
|
this._signalManager = options.signal
|
|
55
|
-
? new
|
|
55
|
+
? new SignalManagerImpl(options.signal)
|
|
56
56
|
: new InMemorySignalManager(onOffer);
|
|
57
57
|
|
|
58
|
-
this._signalManager.
|
|
59
|
-
.on(([topic,
|
|
58
|
+
this._signalManager.swarmEvent
|
|
59
|
+
.on(([topic, event]) => this._swarms.get(topic)?.onSwarmEvent(event));
|
|
60
60
|
|
|
61
|
-
this._signalManager.
|
|
61
|
+
this._signalManager.onMessage.on(msg => this._messageRouter.receiveMessage(msg));
|
|
62
62
|
|
|
63
63
|
this._messageRouter = new MessageRouter({
|
|
64
|
-
sendMessage: msg => this._signalManager.
|
|
64
|
+
sendMessage: msg => this._signalManager.message(msg),
|
|
65
65
|
onSignal: async (msg) => this._swarms.get(msg.topic!)?.onSignal(msg),
|
|
66
66
|
onOffer: msg => onOffer(msg)
|
|
67
67
|
});
|
|
@@ -118,7 +118,6 @@ export class NetworkManager {
|
|
|
118
118
|
topology,
|
|
119
119
|
protocol,
|
|
120
120
|
this._messageRouter,
|
|
121
|
-
this._signalManager.lookup.bind(this._signalManager),
|
|
122
121
|
transportFactory,
|
|
123
122
|
options.label
|
|
124
123
|
);
|
|
@@ -1,51 +1,69 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2020 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
1
|
syntax = "proto3";
|
|
6
2
|
|
|
7
|
-
import "
|
|
3
|
+
import "google/protobuf/any.proto";
|
|
4
|
+
import "google/protobuf/empty.proto";
|
|
5
|
+
import "google/protobuf/timestamp.proto";
|
|
8
6
|
|
|
9
7
|
package dxos.mesh.signal;
|
|
10
8
|
|
|
9
|
+
option go_package = "github.com/dxos/kube/go/signal/pb";
|
|
10
|
+
|
|
11
|
+
message JoinRequest {
|
|
12
|
+
bytes swarm = 1;
|
|
13
|
+
bytes peer = 2;
|
|
14
|
+
}
|
|
15
|
+
|
|
11
16
|
message Message {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
PubKey remoteId = 2;
|
|
16
|
-
/// Swarm identefier.
|
|
17
|
-
PubKey topic = 3;
|
|
18
|
-
/// Unique connection identifier.
|
|
19
|
-
PubKey sessionId = 4;
|
|
20
|
-
/// Message payload.
|
|
21
|
-
MessageData data = 5;
|
|
22
|
-
/// Unique message identifier. Used for Acknolegment and matching Anwers to Offers.
|
|
23
|
-
optional PubKey messageId = 6;
|
|
17
|
+
bytes author = 1;
|
|
18
|
+
bytes recipient = 2;
|
|
19
|
+
google.protobuf.Any payload = 3;
|
|
24
20
|
}
|
|
25
21
|
|
|
26
|
-
message
|
|
27
|
-
|
|
28
|
-
Offer offer = 1;
|
|
29
|
-
Answer answer = 2;
|
|
30
|
-
Signal signal = 3;
|
|
31
|
-
Acknowledgement ack = 4;
|
|
32
|
-
}
|
|
22
|
+
message ReceptionRequest {
|
|
23
|
+
bytes peer = 1;
|
|
33
24
|
}
|
|
34
25
|
|
|
35
|
-
|
|
26
|
+
// Goes on Pub/Sub swarm topic and as a Join stream in RPC.
|
|
27
|
+
message SwarmEvent {
|
|
28
|
+
message PeerAvailable {
|
|
29
|
+
bytes peer = 1;
|
|
30
|
+
google.protobuf.Timestamp since = 2;
|
|
31
|
+
// When, if at all (handle the default value as not), this availability would expires were it not re-announced, like
|
|
32
|
+
// periodically in Pub/Sub with some margin such that Pub/Sub network partitions lead to offline statuses.
|
|
33
|
+
optional google.protobuf.Timestamp until = 3;
|
|
34
|
+
|
|
35
|
+
// Only relevant in Pub/Sub. Optional, the host topic to eagerly send PeerAvailable messages back to.
|
|
36
|
+
optional bytes announceBackToHost = 4;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
message PeerLeft {
|
|
40
|
+
bytes peer = 1;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
oneof event {
|
|
44
|
+
// The peer was announced as available on the swarm.
|
|
45
|
+
PeerAvailable peerAvailable = 1;
|
|
46
|
+
// The peer left, or their announcement timed out.
|
|
47
|
+
PeerLeft peerLeft = 2;
|
|
48
|
+
}
|
|
36
49
|
}
|
|
37
50
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
51
|
+
// Goes on a Pub/Sub host topic.
|
|
52
|
+
message HostEvent {
|
|
53
|
+
oneof event {
|
|
54
|
+
SwarmEvent.PeerAvailable peerAvailable = 1;
|
|
55
|
+
}
|
|
42
56
|
}
|
|
43
57
|
|
|
44
|
-
|
|
45
|
-
|
|
58
|
+
// Goes on Pub/Sub peer topic.
|
|
59
|
+
message PeerEvent {
|
|
60
|
+
oneof event {
|
|
61
|
+
Message message = 1;
|
|
62
|
+
}
|
|
46
63
|
}
|
|
47
64
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
65
|
+
service Signal {
|
|
66
|
+
rpc Join(JoinRequest) returns (stream SwarmEvent);
|
|
67
|
+
rpc ReceiveMessages(ReceptionRequest) returns (stream Message);
|
|
68
|
+
rpc SendMessage(Message) returns (google.protobuf.Empty);
|
|
69
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2020 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
syntax = "proto3";
|
|
6
|
+
|
|
7
|
+
import "@dxos/protocols/src/proto/dxos/halo/keys.proto";
|
|
8
|
+
|
|
9
|
+
package dxos.mesh.signalMessage;
|
|
10
|
+
|
|
11
|
+
message SignalMessage {
|
|
12
|
+
/// Sender's public key.
|
|
13
|
+
PubKey id = 1;
|
|
14
|
+
/// Receiver`s public key.
|
|
15
|
+
PubKey remoteId = 2;
|
|
16
|
+
/// Swarm identefier.
|
|
17
|
+
PubKey topic = 3;
|
|
18
|
+
/// Unique connection identifier.
|
|
19
|
+
PubKey sessionId = 4;
|
|
20
|
+
/// Message payload.
|
|
21
|
+
MessageData data = 5;
|
|
22
|
+
/// Unique message identifier. Used for Acknolegment and matching Anwers to Offers.
|
|
23
|
+
optional PubKey messageId = 6;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
message MessageData {
|
|
27
|
+
oneof payload {
|
|
28
|
+
Offer offer = 1;
|
|
29
|
+
Answer answer = 2;
|
|
30
|
+
Signal signal = 3;
|
|
31
|
+
Acknowledgement ack = 4;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
message Offer {
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
message Answer {
|
|
39
|
+
bool accept = 1;
|
|
40
|
+
/// MessageId of the Offer being answered.
|
|
41
|
+
optional PubKey offerMessageId = 2;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
message Signal {
|
|
45
|
+
string json = 1;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
message Acknowledgement {
|
|
49
|
+
// MessageId of the Message being acknowledged.
|
|
50
|
+
PubKey messageId = 1;
|
|
51
|
+
}
|
|
@@ -2,6 +2,7 @@ import type { Stream } from "@dxos/codec-protobuf";
|
|
|
2
2
|
import substitutions from "../../substitutions";
|
|
3
3
|
import * as dxos_halo_keys from "./halo/keys";
|
|
4
4
|
import * as dxos_mesh_signal from "./mesh/signal";
|
|
5
|
+
import * as dxos_mesh_signalMessage from "./mesh/signalMessage";
|
|
5
6
|
import * as google_protobuf from "../google/protobuf";
|
|
6
7
|
/**
|
|
7
8
|
* Defined in:
|
|
@@ -2,6 +2,7 @@ import type { Stream } from "@dxos/codec-protobuf";
|
|
|
2
2
|
import substitutions from "../../../substitutions";
|
|
3
3
|
import * as dxos_credentials from "../credentials";
|
|
4
4
|
import * as dxos_mesh_signal from "../mesh/signal";
|
|
5
|
+
import * as dxos_mesh_signalMessage from "../mesh/signalMessage";
|
|
5
6
|
import * as google_protobuf from "../../google/protobuf";
|
|
6
7
|
/**
|
|
7
8
|
* Defined in:
|
|
@@ -2,81 +2,87 @@ import type { Stream } from "@dxos/codec-protobuf";
|
|
|
2
2
|
import substitutions from "../../../substitutions";
|
|
3
3
|
import * as dxos_credentials from "../credentials";
|
|
4
4
|
import * as dxos_halo_keys from "../halo/keys";
|
|
5
|
+
import * as dxos_mesh_signalMessage from "./signalMessage";
|
|
5
6
|
import * as google_protobuf from "../../google/protobuf";
|
|
6
7
|
/**
|
|
7
8
|
* Defined in:
|
|
8
9
|
* {@link file://./../../../defs/dxos/mesh/signal.proto}
|
|
9
10
|
*/
|
|
10
|
-
export interface
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
*/
|
|
14
|
-
id: ReturnType<(typeof substitutions)["dxos.halo.keys.PubKey"]["decode"]>;
|
|
15
|
-
/**
|
|
16
|
-
* Receiver`s public key.
|
|
17
|
-
*/
|
|
18
|
-
remoteId: ReturnType<(typeof substitutions)["dxos.halo.keys.PubKey"]["decode"]>;
|
|
19
|
-
/**
|
|
20
|
-
* Swarm identefier.
|
|
21
|
-
*/
|
|
22
|
-
topic: ReturnType<(typeof substitutions)["dxos.halo.keys.PubKey"]["decode"]>;
|
|
23
|
-
/**
|
|
24
|
-
* Unique connection identifier.
|
|
25
|
-
*/
|
|
26
|
-
sessionId: ReturnType<(typeof substitutions)["dxos.halo.keys.PubKey"]["decode"]>;
|
|
27
|
-
/**
|
|
28
|
-
* Message payload.
|
|
29
|
-
*/
|
|
30
|
-
data: MessageData;
|
|
31
|
-
/**
|
|
32
|
-
* Unique message identifier. Used for Acknolegment and matching Anwers to Offers.
|
|
33
|
-
*
|
|
34
|
-
* Options:
|
|
35
|
-
* - proto3_optional = true
|
|
36
|
-
*/
|
|
37
|
-
messageId?: ReturnType<(typeof substitutions)["dxos.halo.keys.PubKey"]["decode"]>;
|
|
11
|
+
export interface JoinRequest {
|
|
12
|
+
swarm: Uint8Array;
|
|
13
|
+
peer: Uint8Array;
|
|
38
14
|
}
|
|
39
15
|
/**
|
|
40
16
|
* Defined in:
|
|
41
17
|
* {@link file://./../../../defs/dxos/mesh/signal.proto}
|
|
42
18
|
*/
|
|
43
|
-
export interface
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
ack?: Acknowledgement;
|
|
19
|
+
export interface Message {
|
|
20
|
+
author: Uint8Array;
|
|
21
|
+
recipient: Uint8Array;
|
|
22
|
+
payload: google_protobuf.Any;
|
|
48
23
|
}
|
|
49
24
|
/**
|
|
50
25
|
* Defined in:
|
|
51
26
|
* {@link file://./../../../defs/dxos/mesh/signal.proto}
|
|
52
27
|
*/
|
|
53
|
-
export interface
|
|
28
|
+
export interface ReceptionRequest {
|
|
29
|
+
peer: Uint8Array;
|
|
54
30
|
}
|
|
55
31
|
/**
|
|
56
32
|
* Defined in:
|
|
57
33
|
* {@link file://./../../../defs/dxos/mesh/signal.proto}
|
|
58
34
|
*/
|
|
59
|
-
export interface
|
|
60
|
-
|
|
35
|
+
export interface SwarmEvent {
|
|
36
|
+
peerAvailable?: SwarmEvent.PeerAvailable;
|
|
37
|
+
peerLeft?: SwarmEvent.PeerLeft;
|
|
38
|
+
}
|
|
39
|
+
export namespace SwarmEvent {
|
|
61
40
|
/**
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
* Options:
|
|
65
|
-
* - proto3_optional = true
|
|
41
|
+
* Defined in:
|
|
42
|
+
* {@link file://./../../../defs/dxos/mesh/signal.proto}
|
|
66
43
|
*/
|
|
67
|
-
|
|
44
|
+
export interface PeerAvailable {
|
|
45
|
+
peer: Uint8Array;
|
|
46
|
+
since: ReturnType<(typeof substitutions)["google.protobuf.Timestamp"]["decode"]>;
|
|
47
|
+
/**
|
|
48
|
+
* Options:
|
|
49
|
+
* - proto3_optional = true
|
|
50
|
+
*/
|
|
51
|
+
until?: ReturnType<(typeof substitutions)["google.protobuf.Timestamp"]["decode"]>;
|
|
52
|
+
/**
|
|
53
|
+
* Options:
|
|
54
|
+
* - proto3_optional = true
|
|
55
|
+
*/
|
|
56
|
+
announceBackToHost?: Uint8Array;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Defined in:
|
|
60
|
+
* {@link file://./../../../defs/dxos/mesh/signal.proto}
|
|
61
|
+
*/
|
|
62
|
+
export interface PeerLeft {
|
|
63
|
+
peer: Uint8Array;
|
|
64
|
+
}
|
|
68
65
|
}
|
|
69
66
|
/**
|
|
70
67
|
* Defined in:
|
|
71
68
|
* {@link file://./../../../defs/dxos/mesh/signal.proto}
|
|
72
69
|
*/
|
|
73
|
-
export interface
|
|
74
|
-
|
|
70
|
+
export interface HostEvent {
|
|
71
|
+
peerAvailable?: SwarmEvent.PeerAvailable;
|
|
75
72
|
}
|
|
76
73
|
/**
|
|
77
74
|
* Defined in:
|
|
78
75
|
* {@link file://./../../../defs/dxos/mesh/signal.proto}
|
|
79
76
|
*/
|
|
80
|
-
export interface
|
|
81
|
-
|
|
77
|
+
export interface PeerEvent {
|
|
78
|
+
message?: Message;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Defined in:
|
|
82
|
+
* {@link file://./../../../defs/dxos/mesh/signal.proto}
|
|
83
|
+
*/
|
|
84
|
+
export interface Signal {
|
|
85
|
+
join: (request: JoinRequest) => Stream<SwarmEvent>;
|
|
86
|
+
receiveMessages: (request: ReceptionRequest) => Stream<Message>;
|
|
87
|
+
sendMessage: (request: Message) => Promise<void>;
|
|
82
88
|
}
|