@dxos/network-manager 0.6.12 → 0.6.13-main.09887cd
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-GW3YM55A.mjs +14 -0
- package/dist/lib/browser/chunk-GW3YM55A.mjs.map +7 -0
- package/dist/lib/browser/{chunk-XYSYUN63.mjs → chunk-MKIVP7G3.mjs} +1249 -1065
- package/dist/lib/browser/chunk-MKIVP7G3.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +10 -19
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +22 -32
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/browser/transport/tcp/index.mjs +39 -0
- package/dist/lib/browser/transport/tcp/index.mjs.map +7 -0
- package/dist/lib/node/{chunk-4YAYC7WN.cjs → chunk-D6P7ACEM.cjs} +1262 -1205
- package/dist/lib/node/chunk-D6P7ACEM.cjs.map +7 -0
- package/dist/lib/node/index.cjs +27 -37
- package/dist/lib/node/index.cjs.map +2 -2
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +24 -34
- package/dist/lib/node/testing/index.cjs.map +3 -3
- package/dist/lib/node/transport/tcp/index.cjs +191 -0
- package/dist/lib/node/transport/tcp/index.cjs.map +7 -0
- package/dist/lib/node-esm/chunk-22DA2US6.mjs +4373 -0
- package/dist/lib/node-esm/chunk-22DA2US6.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +50 -0
- package/dist/lib/node-esm/index.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -0
- package/dist/lib/node-esm/testing/index.mjs +279 -0
- package/dist/lib/node-esm/testing/index.mjs.map +7 -0
- package/dist/lib/node-esm/transport/tcp/index.mjs +159 -0
- package/dist/lib/node-esm/transport/tcp/index.mjs.map +7 -0
- package/dist/types/src/network-manager.d.ts +2 -1
- package/dist/types/src/network-manager.d.ts.map +1 -1
- package/dist/types/src/signal/ice.d.ts.map +1 -1
- package/dist/types/src/signal/integration.node.test.d.ts +2 -0
- package/dist/types/src/signal/integration.node.test.d.ts.map +1 -0
- package/dist/types/src/signal/swarm-messenger.node.test.d.ts +2 -0
- package/dist/types/src/signal/swarm-messenger.node.test.d.ts.map +1 -0
- package/dist/types/src/swarm/connection.d.ts.map +1 -1
- package/dist/types/src/swarm/swarm.d.ts +1 -1
- package/dist/types/src/testing/test-builder.d.ts +2 -2
- package/dist/types/src/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/testing/test-wire-protocol.d.ts +1 -2
- package/dist/types/src/testing/test-wire-protocol.d.ts.map +1 -1
- package/dist/types/src/tests/basic-test-suite.d.ts.map +1 -1
- package/dist/types/src/tests/property-test-suite.d.ts.map +1 -1
- package/dist/types/src/tests/tcp-transport.node.test.d.ts +2 -0
- package/dist/types/src/tests/tcp-transport.node.test.d.ts.map +1 -0
- package/dist/types/src/tests/utils.d.ts.map +1 -1
- package/dist/types/src/transport/index.d.ts +1 -5
- package/dist/types/src/transport/index.d.ts.map +1 -1
- package/dist/types/src/transport/memory-transport.d.ts +2 -2
- package/dist/types/src/transport/memory-transport.d.ts.map +1 -1
- package/dist/types/src/transport/tcp/index.d.ts +2 -0
- package/dist/types/src/transport/tcp/index.d.ts.map +1 -0
- package/dist/types/src/transport/{tcp-transport.browser.d.ts → tcp/tcp-transport.browser.d.ts} +3 -3
- package/dist/types/src/transport/tcp/tcp-transport.browser.d.ts.map +1 -0
- package/dist/types/src/transport/{tcp-transport.d.ts → tcp/tcp-transport.d.ts} +3 -3
- package/dist/types/src/transport/tcp/tcp-transport.d.ts.map +1 -0
- package/dist/types/src/transport/transport.d.ts +7 -6
- package/dist/types/src/transport/transport.d.ts.map +1 -1
- package/dist/types/src/transport/webrtc/index.d.ts +4 -0
- package/dist/types/src/transport/webrtc/index.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/rtc-connection-factory.d.ts +14 -0
- package/dist/types/src/transport/webrtc/rtc-connection-factory.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts +68 -0
- package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/rtc-transport-channel.d.ts +33 -0
- package/dist/types/src/transport/webrtc/rtc-transport-channel.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/rtc-transport-channel.test.d.ts +2 -0
- package/dist/types/src/transport/webrtc/rtc-transport-channel.test.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/rtc-transport-factory.d.ts +4 -0
- package/dist/types/src/transport/webrtc/rtc-transport-factory.d.ts.map +1 -0
- package/dist/types/src/transport/{simplepeer-transport-proxy.d.ts → webrtc/rtc-transport-proxy.d.ts} +10 -12
- package/dist/types/src/transport/webrtc/rtc-transport-proxy.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/rtc-transport-proxy.test.d.ts +2 -0
- package/dist/types/src/transport/webrtc/rtc-transport-proxy.test.d.ts.map +1 -0
- package/dist/types/src/transport/{simplepeer-transport-service.d.ts → webrtc/rtc-transport-service.d.ts} +9 -7
- package/dist/types/src/transport/webrtc/rtc-transport-service.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/rtc-transport-stats.d.ts +4 -0
- package/dist/types/src/transport/webrtc/rtc-transport-stats.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/rtc-transport.test.d.ts +2 -0
- package/dist/types/src/transport/webrtc/rtc-transport.test.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/test-utils.d.ts +5 -0
- package/dist/types/src/transport/webrtc/test-utils.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/utils.d.ts +3 -0
- package/dist/types/src/transport/webrtc/utils.d.ts.map +1 -0
- package/package.json +55 -30
- package/src/network-manager.ts +5 -13
- package/src/signal/ice.test.ts +1 -3
- package/src/signal/ice.ts +6 -1
- package/src/signal/{integration.test.ts → integration.node.test.ts} +9 -15
- package/src/signal/{swarm-messenger.test.ts → swarm-messenger.node.test.ts} +13 -23
- package/src/swarm/connection-limiter.test.ts +3 -6
- package/src/swarm/connection.test.ts +63 -38
- package/src/swarm/connection.ts +5 -5
- package/src/swarm/swarm.test.ts +10 -12
- package/src/swarm/swarm.ts +1 -1
- package/src/testing/test-builder.ts +13 -29
- package/src/testing/test-wire-protocol.ts +1 -4
- package/src/tests/basic-test-suite.ts +34 -33
- package/src/tests/memory-transport.test.ts +40 -42
- package/src/tests/property-test-suite.ts +21 -22
- package/src/tests/tcp-transport.node.test.ts +65 -0
- package/src/tests/utils.ts +3 -2
- package/src/tests/webrtc-transport.test.ts +9 -9
- package/src/transport/index.ts +1 -5
- package/src/transport/memory-transport.ts +2 -0
- package/src/transport/tcp/index.ts +5 -0
- package/src/transport/{tcp-transport.browser.ts → tcp/tcp-transport.browser.ts} +7 -3
- package/src/transport/{tcp-transport.ts → tcp/tcp-transport.ts} +3 -1
- package/src/transport/transport.ts +8 -7
- package/src/transport/webrtc/index.ts +7 -0
- package/src/transport/webrtc/rtc-connection-factory.ts +82 -0
- package/src/transport/webrtc/rtc-peer-connection.ts +472 -0
- package/src/transport/webrtc/rtc-transport-channel.test.ts +176 -0
- package/src/transport/webrtc/rtc-transport-channel.ts +195 -0
- package/src/transport/webrtc/rtc-transport-factory.ts +28 -0
- package/src/transport/webrtc/rtc-transport-proxy.test.ts +413 -0
- package/src/transport/webrtc/rtc-transport-proxy.ts +264 -0
- package/src/transport/webrtc/rtc-transport-service.ts +192 -0
- package/src/transport/webrtc/rtc-transport-stats.ts +67 -0
- package/src/transport/webrtc/rtc-transport.test.ts +198 -0
- package/src/transport/webrtc/test-utils.ts +22 -0
- package/src/transport/webrtc/utils.ts +36 -0
- package/src/typings.d.ts +8 -2
- package/dist/lib/browser/chunk-XYSYUN63.mjs.map +0 -7
- package/dist/lib/node/chunk-4YAYC7WN.cjs.map +0 -7
- package/dist/types/src/signal/integration.test.d.ts +0 -2
- package/dist/types/src/signal/integration.test.d.ts.map +0 -1
- package/dist/types/src/signal/swarm-messenger.test.d.ts +0 -2
- package/dist/types/src/signal/swarm-messenger.test.d.ts.map +0 -1
- package/dist/types/src/tests/tcp-transport.test.d.ts +0 -2
- package/dist/types/src/tests/tcp-transport.test.d.ts.map +0 -1
- package/dist/types/src/transport/libdatachannel-transport.d.ts +0 -42
- package/dist/types/src/transport/libdatachannel-transport.d.ts.map +0 -1
- package/dist/types/src/transport/libdatachannel-transport.test.d.ts +0 -2
- package/dist/types/src/transport/libdatachannel-transport.test.d.ts.map +0 -1
- package/dist/types/src/transport/memory-transport.test.d.ts +0 -2
- package/dist/types/src/transport/memory-transport.test.d.ts.map +0 -1
- package/dist/types/src/transport/simplepeer-simple-peer.d.ts +0 -2
- package/dist/types/src/transport/simplepeer-simple-peer.d.ts.map +0 -1
- package/dist/types/src/transport/simplepeer-transport-proxy-test.d.ts +0 -2
- package/dist/types/src/transport/simplepeer-transport-proxy-test.d.ts.map +0 -1
- package/dist/types/src/transport/simplepeer-transport-proxy.d.ts.map +0 -1
- package/dist/types/src/transport/simplepeer-transport-service.d.ts.map +0 -1
- package/dist/types/src/transport/simplepeer-transport.d.ts +0 -36
- package/dist/types/src/transport/simplepeer-transport.d.ts.map +0 -1
- package/dist/types/src/transport/simplepeer-transport.test.d.ts +0 -2
- package/dist/types/src/transport/simplepeer-transport.test.d.ts.map +0 -1
- package/dist/types/src/transport/tcp-transport.browser.d.ts.map +0 -1
- package/dist/types/src/transport/tcp-transport.d.ts.map +0 -1
- package/dist/types/src/transport/webrtc.d.ts +0 -6
- package/dist/types/src/transport/webrtc.d.ts.map +0 -1
- package/src/globals.d.ts +0 -7
- package/src/tests/tcp-transport.test.ts +0 -67
- package/src/transport/libdatachannel-transport.test.ts +0 -100
- package/src/transport/libdatachannel-transport.ts +0 -376
- package/src/transport/memory-transport.test.ts +0 -74
- package/src/transport/simplepeer-simple-peer.ts +0 -26
- package/src/transport/simplepeer-transport-proxy-test.ts +0 -181
- package/src/transport/simplepeer-transport-proxy.ts +0 -246
- package/src/transport/simplepeer-transport-service.ts +0 -160
- package/src/transport/simplepeer-transport.test.ts +0 -61
- package/src/transport/simplepeer-transport.ts +0 -250
- package/src/transport/webrtc.ts +0 -15
package/src/swarm/swarm.test.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright 2020 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { expect } from '
|
|
5
|
+
import { onTestFinished, describe, expect, test } from 'vitest';
|
|
6
6
|
|
|
7
7
|
import { asyncTimeout, sleep } from '@dxos/async';
|
|
8
8
|
import { PublicKey } from '@dxos/keys';
|
|
@@ -13,7 +13,6 @@ import {
|
|
|
13
13
|
type PeerInfo,
|
|
14
14
|
type SignalManager,
|
|
15
15
|
} from '@dxos/messaging';
|
|
16
|
-
import { afterTest, describe, test } from '@dxos/test';
|
|
17
16
|
import { ComplexSet } from '@dxos/util';
|
|
18
17
|
|
|
19
18
|
import { ConnectionState } from './connection';
|
|
@@ -21,7 +20,7 @@ import { ConnectionLimiter } from './connection-limiter';
|
|
|
21
20
|
import { Swarm } from './swarm';
|
|
22
21
|
import { TestWireProtocol } from '../testing/test-wire-protocol';
|
|
23
22
|
import { FullyConnectedTopology } from '../topology';
|
|
24
|
-
import {
|
|
23
|
+
import { createRtcTransportFactory } from '../transport';
|
|
25
24
|
|
|
26
25
|
type TestPeer = {
|
|
27
26
|
swarm: Swarm;
|
|
@@ -47,21 +46,20 @@ describe('Swarm', () => {
|
|
|
47
46
|
signalManager?: SignalManager;
|
|
48
47
|
initiationDelay?: number;
|
|
49
48
|
}): Promise<TestPeer> => {
|
|
50
|
-
const protocol = new TestWireProtocol(
|
|
49
|
+
const protocol = new TestWireProtocol();
|
|
51
50
|
const swarm = new Swarm(
|
|
52
51
|
topic,
|
|
53
52
|
peer,
|
|
54
53
|
new FullyConnectedTopology(),
|
|
55
54
|
protocol.factory,
|
|
56
55
|
new Messenger({ signalManager }),
|
|
57
|
-
|
|
58
|
-
process.env.MOCHA_ENV === 'nodejs' ? createLibDataChannelTransportFactory() : createSimplePeerTransportFactory(),
|
|
56
|
+
createRtcTransportFactory(),
|
|
59
57
|
undefined,
|
|
60
58
|
connectionLimiter,
|
|
61
59
|
initiationDelay,
|
|
62
60
|
);
|
|
63
61
|
|
|
64
|
-
|
|
62
|
+
onTestFinished(async () => {
|
|
65
63
|
await swarm.destroy();
|
|
66
64
|
await signalManager.close();
|
|
67
65
|
});
|
|
@@ -81,7 +79,7 @@ describe('Swarm', () => {
|
|
|
81
79
|
expect(peer2.swarm.connections.length).to.equal(0);
|
|
82
80
|
|
|
83
81
|
await connectSwarms(peer1, peer2);
|
|
84
|
-
})
|
|
82
|
+
});
|
|
85
83
|
|
|
86
84
|
test('two peers try to originate connections to each other simultaneously', async () => {
|
|
87
85
|
const topic = PublicKey.random();
|
|
@@ -93,7 +91,7 @@ describe('Swarm', () => {
|
|
|
93
91
|
expect(peer2.swarm.connections.length).to.equal(0);
|
|
94
92
|
|
|
95
93
|
await connectSwarms(peer1, peer2);
|
|
96
|
-
})
|
|
94
|
+
});
|
|
97
95
|
|
|
98
96
|
test('with simultaneous connections one of the peers drops initiated connection', async () => {
|
|
99
97
|
const topic = PublicKey.random();
|
|
@@ -111,9 +109,9 @@ describe('Swarm', () => {
|
|
|
111
109
|
|
|
112
110
|
await connectSwarms(peer1, peer2);
|
|
113
111
|
await asyncTimeout(connectionDisplaced!, 1000);
|
|
114
|
-
})
|
|
112
|
+
});
|
|
115
113
|
|
|
116
|
-
test('second peer discovered after delay', async () => {
|
|
114
|
+
test('second peer discovered after delay', { timeout: 10_000 }, async () => {
|
|
117
115
|
const topic = PublicKey.random();
|
|
118
116
|
|
|
119
117
|
const peer1 = await setupSwarm({ topic });
|
|
@@ -126,7 +124,7 @@ describe('Swarm', () => {
|
|
|
126
124
|
expect(peer2.swarm.connections.length).to.equal(0);
|
|
127
125
|
|
|
128
126
|
await connectSwarms(peer1, peer2, () => sleep(15));
|
|
129
|
-
})
|
|
127
|
+
});
|
|
130
128
|
|
|
131
129
|
test('connection limiter', async () => {
|
|
132
130
|
// remotePeer1 <--> peer (connectionLimiter: max = 1) <--> remotePeer2
|
package/src/swarm/swarm.ts
CHANGED
|
@@ -29,7 +29,7 @@ const getClassName = (obj: any) => Object.getPrototypeOf(obj).constructor.name;
|
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
31
|
* A single peer's view of the swarm.
|
|
32
|
-
* Manages a set of
|
|
32
|
+
* Manages a set of peers subscribed on the same topic.
|
|
33
33
|
* Routes signal events and maintains swarm topology.
|
|
34
34
|
*/
|
|
35
35
|
export class Swarm {
|
|
@@ -16,19 +16,12 @@ import { type Runtime } from '@dxos/protocols/proto/dxos/config';
|
|
|
16
16
|
import { createLinkedPorts, createProtoRpcPeer, type ProtoRpcPeer } from '@dxos/rpc';
|
|
17
17
|
import { ComplexMap } from '@dxos/util';
|
|
18
18
|
|
|
19
|
+
import { TcpTransportFactory } from '#tcp-transport';
|
|
19
20
|
import { type TestTeleportExtensionFactory, TestWireProtocol } from './test-wire-protocol';
|
|
20
21
|
import { SwarmNetworkManager } from '../network-manager';
|
|
21
22
|
import { FullyConnectedTopology } from '../topology';
|
|
22
|
-
import {
|
|
23
|
-
|
|
24
|
-
createSimplePeerTransportFactory,
|
|
25
|
-
MemoryTransportFactory,
|
|
26
|
-
SimplePeerTransportProxyFactory,
|
|
27
|
-
SimplePeerTransportService,
|
|
28
|
-
type TransportFactory,
|
|
29
|
-
TransportKind,
|
|
30
|
-
} from '../transport';
|
|
31
|
-
import { TcpTransportFactory } from '../transport/tcp-transport';
|
|
23
|
+
import { MemoryTransportFactory, type TransportFactory, TransportKind } from '../transport';
|
|
24
|
+
import { createRtcTransportFactory, RtcTransportProxyFactory, RtcTransportService } from '../transport';
|
|
32
25
|
|
|
33
26
|
// Signal server will be started by the setup script.
|
|
34
27
|
const port = process.env.SIGNAL_PORT ?? 4000;
|
|
@@ -85,18 +78,12 @@ export class TestPeer {
|
|
|
85
78
|
constructor(
|
|
86
79
|
private readonly testBuilder: TestBuilder,
|
|
87
80
|
public readonly peerId: PublicKey,
|
|
88
|
-
public readonly transport
|
|
81
|
+
public readonly transport: TransportKind = testBuilder.options.signalHosts
|
|
82
|
+
? TransportKind.WEB_RTC
|
|
83
|
+
: TransportKind.MEMORY,
|
|
89
84
|
) {
|
|
90
85
|
this._signalManager = this.testBuilder.createSignalManager();
|
|
91
|
-
|
|
92
|
-
if (this.testBuilder.options.signalHosts) {
|
|
93
|
-
// TODO(nf): configure better
|
|
94
|
-
transport = process.env.MOCHA_ENV === 'nodejs' ? TransportKind.LIBDATACHANNEL : TransportKind.SIMPLE_PEER;
|
|
95
|
-
} else {
|
|
96
|
-
transport = TransportKind.MEMORY;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
this._networkManager = this.createNetworkManager(transport);
|
|
86
|
+
this._networkManager = this.createNetworkManager(this.transport);
|
|
100
87
|
}
|
|
101
88
|
|
|
102
89
|
// TODO(burdon): Move to TestBuilder.
|
|
@@ -110,13 +97,10 @@ export class TestPeer {
|
|
|
110
97
|
case TransportKind.TCP:
|
|
111
98
|
transportFactory = TcpTransportFactory;
|
|
112
99
|
break;
|
|
113
|
-
case TransportKind.
|
|
114
|
-
transportFactory =
|
|
115
|
-
break;
|
|
116
|
-
case TransportKind.LIBDATACHANNEL:
|
|
117
|
-
transportFactory = createLibDataChannelTransportFactory();
|
|
100
|
+
case TransportKind.WEB_RTC:
|
|
101
|
+
transportFactory = createRtcTransportFactory();
|
|
118
102
|
break;
|
|
119
|
-
case TransportKind.
|
|
103
|
+
case TransportKind.WEB_RTC_PROXY:
|
|
120
104
|
{
|
|
121
105
|
// Simulates bridge to shared worker.
|
|
122
106
|
const [proxyPort, servicePort] = createLinkedPorts();
|
|
@@ -137,14 +121,14 @@ export class TestPeer {
|
|
|
137
121
|
exposed: {
|
|
138
122
|
BridgeService: schema.getService('dxos.mesh.bridge.BridgeService'),
|
|
139
123
|
},
|
|
140
|
-
handlers: { BridgeService: new
|
|
124
|
+
handlers: { BridgeService: new RtcTransportService() },
|
|
141
125
|
noHandshake: true,
|
|
142
126
|
encodingOptions: {
|
|
143
127
|
preserveAny: true,
|
|
144
128
|
},
|
|
145
129
|
});
|
|
146
130
|
|
|
147
|
-
transportFactory = new
|
|
131
|
+
transportFactory = new RtcTransportProxyFactory().setBridgeService(this._proxy.rpc.BridgeService);
|
|
148
132
|
}
|
|
149
133
|
break;
|
|
150
134
|
default:
|
|
@@ -219,7 +203,7 @@ export class TestSwarmConnection {
|
|
|
219
203
|
) {
|
|
220
204
|
// TODO(burdon): Configure plugins.
|
|
221
205
|
// TODO(burdon): Prevent reuse?
|
|
222
|
-
this.protocol = new TestWireProtocol(this.
|
|
206
|
+
this.protocol = new TestWireProtocol(this.extensionFactory);
|
|
223
207
|
}
|
|
224
208
|
|
|
225
209
|
// TODO(burdon): Need to create new plugin instance per swarm?
|
|
@@ -29,10 +29,7 @@ export class TestWireProtocol {
|
|
|
29
29
|
({ remotePeerId, extension }) => remotePeerId.toHex() + extension,
|
|
30
30
|
);
|
|
31
31
|
|
|
32
|
-
constructor(
|
|
33
|
-
public readonly peerId: PublicKey,
|
|
34
|
-
private readonly _extensionFactory: TestTeleportExtensionFactory = () => [],
|
|
35
|
-
) {}
|
|
32
|
+
constructor(private readonly _extensionFactory: TestTeleportExtensionFactory = () => []) {}
|
|
36
33
|
|
|
37
34
|
readonly factory = createTeleportProtocolFactory(async (teleport) => {
|
|
38
35
|
log('create', { remotePeerId: teleport.remotePeerId });
|
|
@@ -2,13 +2,11 @@
|
|
|
2
2
|
// Copyright 2021 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { expect } from '
|
|
6
|
-
import waitForExpect from 'wait-for-expect';
|
|
5
|
+
import { onTestFinished, expect, test } from 'vitest';
|
|
7
6
|
|
|
8
7
|
import { asyncTimeout } from '@dxos/async';
|
|
9
8
|
import { PublicKey } from '@dxos/keys';
|
|
10
9
|
import { log } from '@dxos/log';
|
|
11
|
-
import { afterTest, test } from '@dxos/test';
|
|
12
10
|
import { range } from '@dxos/util';
|
|
13
11
|
|
|
14
12
|
import { exchangeMessages, joinSwarm, leaveSwarm, openAndCloseAfterTest } from './utils';
|
|
@@ -25,7 +23,7 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
|
|
|
25
23
|
return;
|
|
26
24
|
}
|
|
27
25
|
|
|
28
|
-
test('joins swarm, sends messages, and cleanly exits', async () => {
|
|
26
|
+
test.skip('joins swarm, sends messages, and cleanly exits', async () => {
|
|
29
27
|
const peer1 = testBuilder.createPeer();
|
|
30
28
|
const peer2 = testBuilder.createPeer();
|
|
31
29
|
await openAndCloseAfterTest([peer1, peer2]);
|
|
@@ -34,24 +32,24 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
|
|
|
34
32
|
const [swarm1, swarm2] = await joinSwarm([peer1, peer2], topic, () => new FullyConnectedTopology());
|
|
35
33
|
await exchangeMessages(swarm1, swarm2);
|
|
36
34
|
await leaveSwarm([peer1, peer2], topic);
|
|
37
|
-
})
|
|
35
|
+
});
|
|
38
36
|
|
|
39
37
|
// TODO(burdon): Test with more peers (configure and test messaging).
|
|
40
|
-
test('joins swarm with star topology', async () => {
|
|
38
|
+
test.skip('joins swarm with star topology', async () => {
|
|
41
39
|
const peer1 = testBuilder.createPeer();
|
|
42
|
-
|
|
40
|
+
onTestFinished(() => peer1.close());
|
|
43
41
|
const peer2 = testBuilder.createPeer();
|
|
44
|
-
|
|
42
|
+
onTestFinished(() => peer2.close());
|
|
45
43
|
await openAndCloseAfterTest([peer1, peer2]);
|
|
46
44
|
|
|
47
45
|
const topic = PublicKey.random();
|
|
48
46
|
const [swarm1, swarm2] = await joinSwarm([peer1, peer2], topic, () => new StarTopology(peer1.peerId)); // NOTE: Same peer.
|
|
49
47
|
await exchangeMessages(swarm1, swarm2);
|
|
50
48
|
await leaveSwarm([peer1, peer2], topic);
|
|
51
|
-
})
|
|
49
|
+
});
|
|
52
50
|
|
|
53
51
|
// TODO(burdon): Fails when trying to reconnect to same topic.
|
|
54
|
-
test('joins swarm multiple times', async () => {
|
|
52
|
+
test.skip('joins swarm multiple times', async () => {
|
|
55
53
|
const peer1 = testBuilder.createPeer();
|
|
56
54
|
const peer2 = testBuilder.createPeer();
|
|
57
55
|
await openAndCloseAfterTest([peer1, peer2]);
|
|
@@ -75,9 +73,9 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
|
|
|
75
73
|
await exchangeMessages(swarm1, swarm2);
|
|
76
74
|
await leaveSwarm([peer1, peer2], topic2);
|
|
77
75
|
}
|
|
78
|
-
})
|
|
76
|
+
});
|
|
79
77
|
|
|
80
|
-
test('joins multiple swarms', async () => {
|
|
78
|
+
test.skip('joins multiple swarms', async () => {
|
|
81
79
|
// TODO(burdon): N peers.
|
|
82
80
|
// TODO(burdon): Merge with test below.
|
|
83
81
|
const peer1 = testBuilder.createPeer();
|
|
@@ -87,9 +85,9 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
|
|
|
87
85
|
const numSwarms = 5;
|
|
88
86
|
const topics = Array.from(Array(numSwarms)).map(() => PublicKey.random());
|
|
89
87
|
expect(topics).to.have.length(numSwarms);
|
|
90
|
-
})
|
|
88
|
+
});
|
|
91
89
|
|
|
92
|
-
test('joins multiple swarms concurrently', async () => {
|
|
90
|
+
test.skip('joins multiple swarms concurrently', async () => {
|
|
93
91
|
const createSwarm = async () => {
|
|
94
92
|
const topicA = PublicKey.random();
|
|
95
93
|
const peer1a = testBuilder.createPeer();
|
|
@@ -109,9 +107,9 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
|
|
|
109
107
|
test1.swarm1a.protocol.testConnection(test1.peer2a.peerId),
|
|
110
108
|
test2.swarm1a.protocol.testConnection(test2.peer2a.peerId),
|
|
111
109
|
]);
|
|
112
|
-
})
|
|
110
|
+
});
|
|
113
111
|
|
|
114
|
-
test('peers reconnect after and error in connection', async () => {
|
|
112
|
+
test.skip('peers reconnect after and error in connection', async () => {
|
|
115
113
|
const peer1 = testBuilder.createPeer();
|
|
116
114
|
const peer2 = testBuilder.createPeer();
|
|
117
115
|
await openAndCloseAfterTest([peer1, peer2]);
|
|
@@ -131,9 +129,9 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
|
|
|
131
129
|
await exchangeMessages(swarm1, swarm2);
|
|
132
130
|
|
|
133
131
|
await leaveSwarm([peer1, peer2], topic);
|
|
134
|
-
})
|
|
132
|
+
});
|
|
135
133
|
|
|
136
|
-
test('going offline and back online', async () => {
|
|
134
|
+
test.skip('going offline and back online', { timeout: 2_000 }, async () => {
|
|
137
135
|
const peer1 = testBuilder.createPeer();
|
|
138
136
|
const peer2 = testBuilder.createPeer();
|
|
139
137
|
await openAndCloseAfterTest([peer1, peer2]);
|
|
@@ -158,28 +156,31 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
|
|
|
158
156
|
await peerLeft;
|
|
159
157
|
|
|
160
158
|
// Wait for peer to be removed from the swarm.
|
|
161
|
-
await
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
159
|
+
await expect
|
|
160
|
+
.poll(() => !!peer2._networkManager.getSwarm(topic)!._peers.get({ peerKey: peer1.peerId.toHex() })?.advertizing, {
|
|
161
|
+
timeout: 1_000,
|
|
162
|
+
})
|
|
163
|
+
.toBe(false);
|
|
165
164
|
|
|
166
165
|
await peer1.goOnline();
|
|
167
166
|
|
|
168
|
-
await
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
167
|
+
await expect
|
|
168
|
+
.poll(() => peer1._networkManager.getSwarm(topic)?._peers.get({ peerKey: peer2.peerId.toHex() })?.advertizing, {
|
|
169
|
+
timeout: 2_000,
|
|
170
|
+
})
|
|
171
|
+
.toBe(true);
|
|
172
|
+
await expect
|
|
173
|
+
.poll(() => peer2._networkManager.getSwarm(topic)?._peers.get({ peerKey: peer1.peerId.toHex() })?.advertizing, {
|
|
174
|
+
timeout: 2_000,
|
|
175
|
+
})
|
|
176
|
+
.toBe(true);
|
|
174
177
|
|
|
175
178
|
await exchangeMessages(swarm1, swarm2);
|
|
176
179
|
await leaveSwarm([peer1, peer2], topic);
|
|
177
|
-
})
|
|
178
|
-
.tag('flaky')
|
|
179
|
-
.timeout(2_000);
|
|
180
|
+
});
|
|
180
181
|
|
|
181
182
|
// TODO(mykola): Fails with large amount of peers ~10.
|
|
182
|
-
test('many peers and connections', async () => {
|
|
183
|
+
test.skip('many peers and connections', async () => {
|
|
183
184
|
const numTopics = 2;
|
|
184
185
|
const peersPerTopic = 3;
|
|
185
186
|
const swarmsAllPeersConnected: Promise<any>[] = [];
|
|
@@ -207,5 +208,5 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
|
|
|
207
208
|
);
|
|
208
209
|
|
|
209
210
|
await asyncTimeout(Promise.all(swarmsAllPeersConnected), 2_000);
|
|
210
|
-
})
|
|
211
|
+
});
|
|
211
212
|
};
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
// Copyright 2021 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { randomBytes } from 'crypto';
|
|
5
|
+
import { randomBytes } from 'node:crypto';
|
|
6
|
+
import { describe, test } from 'vitest';
|
|
6
7
|
|
|
7
8
|
import { PublicKey } from '@dxos/keys';
|
|
8
|
-
import { test } from '@dxos/test';
|
|
9
9
|
import { range } from '@dxos/util';
|
|
10
10
|
|
|
11
11
|
import { basicTestSuite } from './basic-test-suite';
|
|
@@ -17,47 +17,45 @@ describe('Memory transport', () => {
|
|
|
17
17
|
const testBuilder = new TestBuilder();
|
|
18
18
|
basicTestSuite(testBuilder);
|
|
19
19
|
|
|
20
|
-
test
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
// console.log(`Round ${i}/${NUM_ROUNDS}`);
|
|
49
|
-
await Promise.all(
|
|
50
|
-
pairs.map(async ({ swarm1, swarm2 }) => {
|
|
51
|
-
await exchangeMessages(swarm1, swarm2, message);
|
|
52
|
-
}),
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
|
|
20
|
+
test.skip('load', { timeout: 1_000_000 }, async () => {
|
|
21
|
+
const NUM_PAIRS = 100;
|
|
22
|
+
const NUM_ROUNDS = 10_000;
|
|
23
|
+
const PACKET_SIZE = 1_000;
|
|
24
|
+
|
|
25
|
+
const pairs = await Promise.all(
|
|
26
|
+
range(NUM_PAIRS).map(async () => {
|
|
27
|
+
const peer1 = testBuilder.createPeer();
|
|
28
|
+
const peer2 = testBuilder.createPeer();
|
|
29
|
+
await openAndCloseAfterTest([peer1, peer2]);
|
|
30
|
+
|
|
31
|
+
const topic = PublicKey.random();
|
|
32
|
+
const [swarm1, swarm2] = await joinSwarm([peer1, peer2], topic, () => new FullyConnectedTopology());
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
peer1,
|
|
36
|
+
peer2,
|
|
37
|
+
topic,
|
|
38
|
+
swarm1,
|
|
39
|
+
swarm2,
|
|
40
|
+
};
|
|
41
|
+
}),
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
const message = randomBytes(PACKET_SIZE / 2).toString('hex');
|
|
45
|
+
|
|
46
|
+
for (let i = 0; i < NUM_ROUNDS; i++) {
|
|
47
|
+
// console.log(`Round ${i}/${NUM_ROUNDS}`);
|
|
56
48
|
await Promise.all(
|
|
57
|
-
pairs.map(async ({
|
|
58
|
-
await
|
|
49
|
+
pairs.map(async ({ swarm1, swarm2 }) => {
|
|
50
|
+
await exchangeMessages(swarm1, swarm2, message);
|
|
59
51
|
}),
|
|
60
52
|
);
|
|
61
|
-
}
|
|
62
|
-
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
await Promise.all(
|
|
56
|
+
pairs.map(async ({ peer1, peer2, topic }) => {
|
|
57
|
+
await leaveSwarm([peer1, peer2], topic);
|
|
58
|
+
}),
|
|
59
|
+
);
|
|
60
|
+
});
|
|
63
61
|
});
|
|
@@ -4,11 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
import * as fc from 'fast-check';
|
|
6
6
|
import { type ModelRunSetup } from 'fast-check';
|
|
7
|
-
import
|
|
7
|
+
import { test } from 'vitest';
|
|
8
8
|
|
|
9
9
|
import { todo } from '@dxos/debug';
|
|
10
10
|
import { PublicKey } from '@dxos/keys';
|
|
11
|
-
import { test } from '@dxos/test';
|
|
12
11
|
import { ComplexMap, ComplexSet, range } from '@dxos/util';
|
|
13
12
|
|
|
14
13
|
import { type SwarmNetworkManager } from '../network-manager';
|
|
@@ -37,29 +36,29 @@ export const propertyTestSuite = () => {
|
|
|
37
36
|
}
|
|
38
37
|
|
|
39
38
|
const assertState = async (model: Model, real: Real) => {
|
|
40
|
-
await waitForExpect(() => {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
39
|
+
// await waitForExpect(() => {
|
|
40
|
+
for (const peer of real.peers.values()) {
|
|
41
|
+
if (peer.presence) {
|
|
42
|
+
for (const expectedPeerId of model.joinedPeers) {
|
|
43
|
+
if (expectedPeerId.equals(peer.presence.peerId)) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const actuallyConnectedPeers = peer.presence!.peers;
|
|
48
|
+
if (!actuallyConnectedPeers.some((peer: any) => PublicKey.equals(expectedPeerId, peer))) {
|
|
49
|
+
// TODO(burdon): More concise error.
|
|
50
|
+
const context = {
|
|
51
|
+
peerId: peer.presence.peerId,
|
|
52
|
+
expectedPeerId: expectedPeerId.truncate(),
|
|
53
|
+
connectedPeerIds: actuallyConnectedPeers.map((key: any) => key.toString('hex')),
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
throw new Error(`Expected peer to be in the list of joined peers: ${context}`);
|
|
59
57
|
}
|
|
60
58
|
}
|
|
61
59
|
}
|
|
62
|
-
}
|
|
60
|
+
}
|
|
61
|
+
// }, 5_000);
|
|
63
62
|
|
|
64
63
|
real.peers.forEach((peer) =>
|
|
65
64
|
peer.networkManager.topics.forEach((topic) => {
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2021 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { randomBytes } from 'node:crypto';
|
|
6
|
+
import { describe, test } from 'vitest';
|
|
7
|
+
|
|
8
|
+
import { PublicKey } from '@dxos/keys';
|
|
9
|
+
import { range } from '@dxos/util';
|
|
10
|
+
|
|
11
|
+
import { basicTestSuite } from './basic-test-suite';
|
|
12
|
+
import { exchangeMessages, joinSwarm, leaveSwarm, openAndCloseAfterTest } from './utils';
|
|
13
|
+
import { TestBuilder } from '../testing';
|
|
14
|
+
import { FullyConnectedTopology } from '../topology';
|
|
15
|
+
import { TransportKind } from '../transport';
|
|
16
|
+
|
|
17
|
+
describe('Tcp transport', () => {
|
|
18
|
+
const testBuilder = new TestBuilder({
|
|
19
|
+
transport: TransportKind.TCP,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
basicTestSuite(testBuilder);
|
|
23
|
+
|
|
24
|
+
test.skip('load', { timeout: 1_000_000 }, async () => {
|
|
25
|
+
const NUM_PAIRS = 100;
|
|
26
|
+
const NUM_ROUNDS = 10_000;
|
|
27
|
+
const PACKET_SIZE = 1_000;
|
|
28
|
+
|
|
29
|
+
const pairs = await Promise.all(
|
|
30
|
+
range(NUM_PAIRS).map(async () => {
|
|
31
|
+
const peer1 = testBuilder.createPeer();
|
|
32
|
+
const peer2 = testBuilder.createPeer();
|
|
33
|
+
await openAndCloseAfterTest([peer1, peer2]);
|
|
34
|
+
|
|
35
|
+
const topic = PublicKey.random();
|
|
36
|
+
const [swarm1, swarm2] = await joinSwarm([peer1, peer2], topic, () => new FullyConnectedTopology());
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
peer1,
|
|
40
|
+
peer2,
|
|
41
|
+
topic,
|
|
42
|
+
swarm1,
|
|
43
|
+
swarm2,
|
|
44
|
+
};
|
|
45
|
+
}),
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const message = randomBytes(PACKET_SIZE / 2).toString('hex');
|
|
49
|
+
|
|
50
|
+
for (let i = 0; i < NUM_ROUNDS; i++) {
|
|
51
|
+
// console.log(`Round ${i}/${NUM_ROUNDS}`);
|
|
52
|
+
await Promise.all(
|
|
53
|
+
pairs.map(async ({ swarm1, swarm2 }) => {
|
|
54
|
+
await exchangeMessages(swarm1, swarm2, message);
|
|
55
|
+
}),
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
await Promise.all(
|
|
60
|
+
pairs.map(async ({ peer1, peer2, topic }) => {
|
|
61
|
+
await leaveSwarm([peer1, peer2], topic);
|
|
62
|
+
}),
|
|
63
|
+
);
|
|
64
|
+
});
|
|
65
|
+
});
|
package/src/tests/utils.ts
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { onTestFinished } from 'vitest';
|
|
6
|
+
|
|
5
7
|
import { asyncTimeout } from '@dxos/async';
|
|
6
8
|
import { type PublicKey } from '@dxos/keys';
|
|
7
|
-
import { afterTest } from '@dxos/test';
|
|
8
9
|
import { type Provider } from '@dxos/util';
|
|
9
10
|
|
|
10
11
|
import { type TestPeer, type TestSwarmConnection } from '../testing';
|
|
@@ -19,7 +20,7 @@ import { type Topology } from '../topology';
|
|
|
19
20
|
*/
|
|
20
21
|
export const openAndCloseAfterTest = async (peers: TestPeer[]) => {
|
|
21
22
|
await Promise.all(peers.map((peer) => peer.open()));
|
|
22
|
-
|
|
23
|
+
onTestFinished(async () => {
|
|
23
24
|
await asyncTimeout(Promise.all(peers.map((peer) => peer.close())), 1_000);
|
|
24
25
|
});
|
|
25
26
|
};
|
|
@@ -2,29 +2,29 @@
|
|
|
2
2
|
// Copyright 2021 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { describe } from '
|
|
5
|
+
import { describe } from 'vitest';
|
|
6
6
|
|
|
7
7
|
import { basicTestSuite } from './basic-test-suite';
|
|
8
8
|
import { TEST_SIGNAL_HOSTS, TestBuilder } from '../testing';
|
|
9
9
|
|
|
10
|
-
describe('WebRTC transport', () => {
|
|
10
|
+
describe('WebRTC transport', { timeout: 10_000 }, () => {
|
|
11
11
|
const testBuilder = new TestBuilder();
|
|
12
12
|
basicTestSuite(testBuilder);
|
|
13
|
-
})
|
|
13
|
+
});
|
|
14
14
|
|
|
15
|
-
describe('WebRTC transport proxy', () => {
|
|
15
|
+
describe('WebRTC transport proxy', { timeout: 10_000 }, () => {
|
|
16
16
|
const testBuilder = new TestBuilder({ bridge: true });
|
|
17
17
|
basicTestSuite(testBuilder);
|
|
18
|
-
})
|
|
18
|
+
});
|
|
19
19
|
|
|
20
20
|
describe('test with signal server', () => {
|
|
21
|
-
describe('WebRTC transport', () => {
|
|
21
|
+
describe('WebRTC transport', { timeout: 10_000 }, () => {
|
|
22
22
|
const testBuilder = new TestBuilder({ signalHosts: TEST_SIGNAL_HOSTS });
|
|
23
23
|
basicTestSuite(testBuilder);
|
|
24
|
-
})
|
|
24
|
+
});
|
|
25
25
|
|
|
26
|
-
describe('WebRTC transport proxy', () => {
|
|
26
|
+
describe('WebRTC transport proxy', { timeout: 10_000 }, () => {
|
|
27
27
|
const testBuilder = new TestBuilder({ signalHosts: TEST_SIGNAL_HOSTS, bridge: true });
|
|
28
28
|
basicTestSuite(testBuilder);
|
|
29
|
-
})
|
|
29
|
+
});
|
|
30
30
|
});
|
package/src/transport/index.ts
CHANGED
|
@@ -4,8 +4,4 @@
|
|
|
4
4
|
|
|
5
5
|
export * from './memory-transport';
|
|
6
6
|
export * from './transport';
|
|
7
|
-
export * from './
|
|
8
|
-
export * from './simplepeer-transport-service';
|
|
9
|
-
export * from './simplepeer-transport-proxy';
|
|
10
|
-
export * from './libdatachannel-transport';
|
|
11
|
-
export * from './tcp-transport';
|
|
7
|
+
export * from './webrtc';
|
|
@@ -123,6 +123,7 @@ export class MemoryTransport implements Transport {
|
|
|
123
123
|
this.errors.raise(err);
|
|
124
124
|
});
|
|
125
125
|
}
|
|
126
|
+
return this;
|
|
126
127
|
}
|
|
127
128
|
|
|
128
129
|
async close() {
|
|
@@ -155,6 +156,7 @@ export class MemoryTransport implements Transport {
|
|
|
155
156
|
|
|
156
157
|
this.closed.emit();
|
|
157
158
|
log('closed');
|
|
159
|
+
return this;
|
|
158
160
|
}
|
|
159
161
|
|
|
160
162
|
async onSignal({ payload }: Signal) {
|