@dxos/network-manager 0.6.13-main.ed424a1 → 0.6.13

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.
Files changed (163) hide show
  1. package/dist/lib/browser/{chunk-MKIVP7G3.mjs → chunk-XYSYUN63.mjs} +1064 -1248
  2. package/dist/lib/browser/chunk-XYSYUN63.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +19 -10
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/browser/testing/index.mjs +32 -22
  6. package/dist/lib/browser/testing/index.mjs.map +3 -3
  7. package/dist/lib/node/{chunk-D6P7ACEM.cjs → chunk-4YAYC7WN.cjs} +1207 -1264
  8. package/dist/lib/node/chunk-4YAYC7WN.cjs.map +7 -0
  9. package/dist/lib/node/index.cjs +37 -27
  10. package/dist/lib/node/index.cjs.map +2 -2
  11. package/dist/lib/node/meta.json +1 -1
  12. package/dist/lib/node/testing/index.cjs +34 -24
  13. package/dist/lib/node/testing/index.cjs.map +3 -3
  14. package/dist/types/src/network-manager.d.ts +1 -2
  15. package/dist/types/src/network-manager.d.ts.map +1 -1
  16. package/dist/types/src/signal/ice.d.ts.map +1 -1
  17. package/dist/types/src/signal/integration.test.d.ts +2 -0
  18. package/dist/types/src/signal/integration.test.d.ts.map +1 -0
  19. package/dist/types/src/signal/swarm-messenger.test.d.ts +2 -0
  20. package/dist/types/src/signal/swarm-messenger.test.d.ts.map +1 -0
  21. package/dist/types/src/swarm/connection.d.ts.map +1 -1
  22. package/dist/types/src/swarm/swarm.d.ts +1 -1
  23. package/dist/types/src/testing/test-builder.d.ts +2 -2
  24. package/dist/types/src/testing/test-builder.d.ts.map +1 -1
  25. package/dist/types/src/testing/test-wire-protocol.d.ts +2 -1
  26. package/dist/types/src/testing/test-wire-protocol.d.ts.map +1 -1
  27. package/dist/types/src/tests/basic-test-suite.d.ts.map +1 -1
  28. package/dist/types/src/tests/property-test-suite.d.ts.map +1 -1
  29. package/dist/types/src/tests/tcp-transport.test.d.ts +2 -0
  30. package/dist/types/src/tests/tcp-transport.test.d.ts.map +1 -0
  31. package/dist/types/src/tests/utils.d.ts.map +1 -1
  32. package/dist/types/src/transport/index.d.ts +5 -1
  33. package/dist/types/src/transport/index.d.ts.map +1 -1
  34. package/dist/types/src/transport/libdatachannel-transport.d.ts +42 -0
  35. package/dist/types/src/transport/libdatachannel-transport.d.ts.map +1 -0
  36. package/dist/types/src/transport/libdatachannel-transport.test.d.ts +2 -0
  37. package/dist/types/src/transport/libdatachannel-transport.test.d.ts.map +1 -0
  38. package/dist/types/src/transport/memory-transport.d.ts +2 -2
  39. package/dist/types/src/transport/memory-transport.d.ts.map +1 -1
  40. package/dist/types/src/transport/memory-transport.test.d.ts +2 -0
  41. package/dist/types/src/transport/memory-transport.test.d.ts.map +1 -0
  42. package/dist/types/src/transport/simplepeer-simple-peer.d.ts +2 -0
  43. package/dist/types/src/transport/simplepeer-simple-peer.d.ts.map +1 -0
  44. package/dist/types/src/transport/simplepeer-transport-proxy-test.d.ts +2 -0
  45. package/dist/types/src/transport/simplepeer-transport-proxy-test.d.ts.map +1 -0
  46. package/dist/types/src/transport/{webrtc/rtc-transport-proxy.d.ts → simplepeer-transport-proxy.d.ts} +12 -10
  47. package/dist/types/src/transport/simplepeer-transport-proxy.d.ts.map +1 -0
  48. package/dist/types/src/transport/{webrtc/rtc-transport-service.d.ts → simplepeer-transport-service.d.ts} +7 -9
  49. package/dist/types/src/transport/simplepeer-transport-service.d.ts.map +1 -0
  50. package/dist/types/src/transport/simplepeer-transport.d.ts +36 -0
  51. package/dist/types/src/transport/simplepeer-transport.d.ts.map +1 -0
  52. package/dist/types/src/transport/simplepeer-transport.test.d.ts +2 -0
  53. package/dist/types/src/transport/simplepeer-transport.test.d.ts.map +1 -0
  54. package/dist/types/src/transport/{tcp/tcp-transport.browser.d.ts → tcp-transport.browser.d.ts} +3 -3
  55. package/dist/types/src/transport/tcp-transport.browser.d.ts.map +1 -0
  56. package/dist/types/src/transport/{tcp/tcp-transport.d.ts → tcp-transport.d.ts} +3 -3
  57. package/dist/types/src/transport/tcp-transport.d.ts.map +1 -0
  58. package/dist/types/src/transport/transport.d.ts +6 -7
  59. package/dist/types/src/transport/transport.d.ts.map +1 -1
  60. package/dist/types/src/transport/webrtc.d.ts +6 -0
  61. package/dist/types/src/transport/webrtc.d.ts.map +1 -0
  62. package/package.json +30 -55
  63. package/src/globals.d.ts +7 -0
  64. package/src/network-manager.ts +13 -5
  65. package/src/signal/ice.test.ts +3 -1
  66. package/src/signal/ice.ts +1 -6
  67. package/src/signal/{integration.node.test.ts → integration.test.ts} +15 -9
  68. package/src/signal/{swarm-messenger.node.test.ts → swarm-messenger.test.ts} +23 -13
  69. package/src/swarm/connection-limiter.test.ts +6 -3
  70. package/src/swarm/connection.test.ts +38 -63
  71. package/src/swarm/connection.ts +5 -5
  72. package/src/swarm/swarm.test.ts +12 -10
  73. package/src/swarm/swarm.ts +1 -1
  74. package/src/testing/test-builder.ts +29 -13
  75. package/src/testing/test-wire-protocol.ts +4 -1
  76. package/src/tests/basic-test-suite.ts +33 -34
  77. package/src/tests/memory-transport.test.ts +42 -40
  78. package/src/tests/property-test-suite.ts +22 -21
  79. package/src/tests/tcp-transport.test.ts +67 -0
  80. package/src/tests/utils.ts +2 -3
  81. package/src/tests/webrtc-transport.test.ts +9 -9
  82. package/src/transport/index.ts +5 -1
  83. package/src/transport/libdatachannel-transport.test.ts +100 -0
  84. package/src/transport/libdatachannel-transport.ts +376 -0
  85. package/src/transport/memory-transport.test.ts +74 -0
  86. package/src/transport/memory-transport.ts +0 -2
  87. package/src/transport/simplepeer-simple-peer.ts +26 -0
  88. package/src/transport/simplepeer-transport-proxy-test.ts +181 -0
  89. package/src/transport/simplepeer-transport-proxy.ts +246 -0
  90. package/src/transport/simplepeer-transport-service.ts +160 -0
  91. package/src/transport/simplepeer-transport.test.ts +61 -0
  92. package/src/transport/simplepeer-transport.ts +250 -0
  93. package/src/transport/{tcp/tcp-transport.browser.ts → tcp-transport.browser.ts} +3 -7
  94. package/src/transport/{tcp/tcp-transport.ts → tcp-transport.ts} +1 -3
  95. package/src/transport/transport.ts +7 -8
  96. package/src/transport/webrtc.ts +15 -0
  97. package/src/typings.d.ts +2 -8
  98. package/dist/lib/browser/chunk-GW3YM55A.mjs +0 -14
  99. package/dist/lib/browser/chunk-GW3YM55A.mjs.map +0 -7
  100. package/dist/lib/browser/chunk-MKIVP7G3.mjs.map +0 -7
  101. package/dist/lib/browser/transport/tcp/index.mjs +0 -39
  102. package/dist/lib/browser/transport/tcp/index.mjs.map +0 -7
  103. package/dist/lib/node/chunk-D6P7ACEM.cjs.map +0 -7
  104. package/dist/lib/node/transport/tcp/index.cjs +0 -191
  105. package/dist/lib/node/transport/tcp/index.cjs.map +0 -7
  106. package/dist/lib/node-esm/chunk-22DA2US6.mjs +0 -4373
  107. package/dist/lib/node-esm/chunk-22DA2US6.mjs.map +0 -7
  108. package/dist/lib/node-esm/index.mjs +0 -50
  109. package/dist/lib/node-esm/index.mjs.map +0 -7
  110. package/dist/lib/node-esm/meta.json +0 -1
  111. package/dist/lib/node-esm/testing/index.mjs +0 -279
  112. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  113. package/dist/lib/node-esm/transport/tcp/index.mjs +0 -159
  114. package/dist/lib/node-esm/transport/tcp/index.mjs.map +0 -7
  115. package/dist/types/src/signal/integration.node.test.d.ts +0 -2
  116. package/dist/types/src/signal/integration.node.test.d.ts.map +0 -1
  117. package/dist/types/src/signal/swarm-messenger.node.test.d.ts +0 -2
  118. package/dist/types/src/signal/swarm-messenger.node.test.d.ts.map +0 -1
  119. package/dist/types/src/tests/tcp-transport.node.test.d.ts +0 -2
  120. package/dist/types/src/tests/tcp-transport.node.test.d.ts.map +0 -1
  121. package/dist/types/src/transport/tcp/index.d.ts +0 -2
  122. package/dist/types/src/transport/tcp/index.d.ts.map +0 -1
  123. package/dist/types/src/transport/tcp/tcp-transport.browser.d.ts.map +0 -1
  124. package/dist/types/src/transport/tcp/tcp-transport.d.ts.map +0 -1
  125. package/dist/types/src/transport/webrtc/index.d.ts +0 -4
  126. package/dist/types/src/transport/webrtc/index.d.ts.map +0 -1
  127. package/dist/types/src/transport/webrtc/rtc-connection-factory.d.ts +0 -14
  128. package/dist/types/src/transport/webrtc/rtc-connection-factory.d.ts.map +0 -1
  129. package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts +0 -68
  130. package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts.map +0 -1
  131. package/dist/types/src/transport/webrtc/rtc-transport-channel.d.ts +0 -33
  132. package/dist/types/src/transport/webrtc/rtc-transport-channel.d.ts.map +0 -1
  133. package/dist/types/src/transport/webrtc/rtc-transport-channel.test.d.ts +0 -2
  134. package/dist/types/src/transport/webrtc/rtc-transport-channel.test.d.ts.map +0 -1
  135. package/dist/types/src/transport/webrtc/rtc-transport-factory.d.ts +0 -4
  136. package/dist/types/src/transport/webrtc/rtc-transport-factory.d.ts.map +0 -1
  137. package/dist/types/src/transport/webrtc/rtc-transport-proxy.d.ts.map +0 -1
  138. package/dist/types/src/transport/webrtc/rtc-transport-proxy.test.d.ts +0 -2
  139. package/dist/types/src/transport/webrtc/rtc-transport-proxy.test.d.ts.map +0 -1
  140. package/dist/types/src/transport/webrtc/rtc-transport-service.d.ts.map +0 -1
  141. package/dist/types/src/transport/webrtc/rtc-transport-stats.d.ts +0 -4
  142. package/dist/types/src/transport/webrtc/rtc-transport-stats.d.ts.map +0 -1
  143. package/dist/types/src/transport/webrtc/rtc-transport.test.d.ts +0 -2
  144. package/dist/types/src/transport/webrtc/rtc-transport.test.d.ts.map +0 -1
  145. package/dist/types/src/transport/webrtc/test-utils.d.ts +0 -5
  146. package/dist/types/src/transport/webrtc/test-utils.d.ts.map +0 -1
  147. package/dist/types/src/transport/webrtc/utils.d.ts +0 -3
  148. package/dist/types/src/transport/webrtc/utils.d.ts.map +0 -1
  149. package/src/tests/tcp-transport.node.test.ts +0 -65
  150. package/src/transport/tcp/index.ts +0 -5
  151. package/src/transport/webrtc/index.ts +0 -7
  152. package/src/transport/webrtc/rtc-connection-factory.ts +0 -82
  153. package/src/transport/webrtc/rtc-peer-connection.ts +0 -472
  154. package/src/transport/webrtc/rtc-transport-channel.test.ts +0 -176
  155. package/src/transport/webrtc/rtc-transport-channel.ts +0 -195
  156. package/src/transport/webrtc/rtc-transport-factory.ts +0 -28
  157. package/src/transport/webrtc/rtc-transport-proxy.test.ts +0 -413
  158. package/src/transport/webrtc/rtc-transport-proxy.ts +0 -264
  159. package/src/transport/webrtc/rtc-transport-service.ts +0 -192
  160. package/src/transport/webrtc/rtc-transport-stats.ts +0 -67
  161. package/src/transport/webrtc/rtc-transport.test.ts +0 -198
  162. package/src/transport/webrtc/test-utils.ts +0 -22
  163. package/src/transport/webrtc/utils.ts +0 -36
@@ -2,11 +2,13 @@
2
2
  // Copyright 2021 DXOS.org
3
3
  //
4
4
 
5
- import { onTestFinished, expect, test } from 'vitest';
5
+ import { expect } from 'chai';
6
+ import waitForExpect from 'wait-for-expect';
6
7
 
7
8
  import { asyncTimeout } from '@dxos/async';
8
9
  import { PublicKey } from '@dxos/keys';
9
10
  import { log } from '@dxos/log';
11
+ import { afterTest, test } from '@dxos/test';
10
12
  import { range } from '@dxos/util';
11
13
 
12
14
  import { exchangeMessages, joinSwarm, leaveSwarm, openAndCloseAfterTest } from './utils';
@@ -23,7 +25,7 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
23
25
  return;
24
26
  }
25
27
 
26
- test.skip('joins swarm, sends messages, and cleanly exits', async () => {
28
+ test('joins swarm, sends messages, and cleanly exits', async () => {
27
29
  const peer1 = testBuilder.createPeer();
28
30
  const peer2 = testBuilder.createPeer();
29
31
  await openAndCloseAfterTest([peer1, peer2]);
@@ -32,24 +34,24 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
32
34
  const [swarm1, swarm2] = await joinSwarm([peer1, peer2], topic, () => new FullyConnectedTopology());
33
35
  await exchangeMessages(swarm1, swarm2);
34
36
  await leaveSwarm([peer1, peer2], topic);
35
- });
37
+ }).tag('flaky');
36
38
 
37
39
  // TODO(burdon): Test with more peers (configure and test messaging).
38
- test.skip('joins swarm with star topology', async () => {
40
+ test('joins swarm with star topology', async () => {
39
41
  const peer1 = testBuilder.createPeer();
40
- onTestFinished(() => peer1.close());
42
+ afterTest(() => peer1.close());
41
43
  const peer2 = testBuilder.createPeer();
42
- onTestFinished(() => peer2.close());
44
+ afterTest(() => peer2.close());
43
45
  await openAndCloseAfterTest([peer1, peer2]);
44
46
 
45
47
  const topic = PublicKey.random();
46
48
  const [swarm1, swarm2] = await joinSwarm([peer1, peer2], topic, () => new StarTopology(peer1.peerId)); // NOTE: Same peer.
47
49
  await exchangeMessages(swarm1, swarm2);
48
50
  await leaveSwarm([peer1, peer2], topic);
49
- });
51
+ }).tag('flaky');
50
52
 
51
53
  // TODO(burdon): Fails when trying to reconnect to same topic.
52
- test.skip('joins swarm multiple times', async () => {
54
+ test('joins swarm multiple times', async () => {
53
55
  const peer1 = testBuilder.createPeer();
54
56
  const peer2 = testBuilder.createPeer();
55
57
  await openAndCloseAfterTest([peer1, peer2]);
@@ -73,9 +75,9 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
73
75
  await exchangeMessages(swarm1, swarm2);
74
76
  await leaveSwarm([peer1, peer2], topic2);
75
77
  }
76
- });
78
+ }).tag('flaky');
77
79
 
78
- test.skip('joins multiple swarms', async () => {
80
+ test('joins multiple swarms', async () => {
79
81
  // TODO(burdon): N peers.
80
82
  // TODO(burdon): Merge with test below.
81
83
  const peer1 = testBuilder.createPeer();
@@ -85,9 +87,9 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
85
87
  const numSwarms = 5;
86
88
  const topics = Array.from(Array(numSwarms)).map(() => PublicKey.random());
87
89
  expect(topics).to.have.length(numSwarms);
88
- });
90
+ }).tag('flaky');
89
91
 
90
- test.skip('joins multiple swarms concurrently', async () => {
92
+ test('joins multiple swarms concurrently', async () => {
91
93
  const createSwarm = async () => {
92
94
  const topicA = PublicKey.random();
93
95
  const peer1a = testBuilder.createPeer();
@@ -107,9 +109,9 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
107
109
  test1.swarm1a.protocol.testConnection(test1.peer2a.peerId),
108
110
  test2.swarm1a.protocol.testConnection(test2.peer2a.peerId),
109
111
  ]);
110
- });
112
+ }).tag('flaky');
111
113
 
112
- test.skip('peers reconnect after and error in connection', async () => {
114
+ test('peers reconnect after and error in connection', async () => {
113
115
  const peer1 = testBuilder.createPeer();
114
116
  const peer2 = testBuilder.createPeer();
115
117
  await openAndCloseAfterTest([peer1, peer2]);
@@ -129,9 +131,9 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
129
131
  await exchangeMessages(swarm1, swarm2);
130
132
 
131
133
  await leaveSwarm([peer1, peer2], topic);
132
- });
134
+ }).tag('flaky');
133
135
 
134
- test.skip('going offline and back online', { timeout: 2_000 }, async () => {
136
+ test('going offline and back online', async () => {
135
137
  const peer1 = testBuilder.createPeer();
136
138
  const peer2 = testBuilder.createPeer();
137
139
  await openAndCloseAfterTest([peer1, peer2]);
@@ -156,31 +158,28 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
156
158
  await peerLeft;
157
159
 
158
160
  // Wait for peer to be removed from the swarm.
159
- await expect
160
- .poll(() => !!peer2._networkManager.getSwarm(topic)!._peers.get({ peerKey: peer1.peerId.toHex() })?.advertizing, {
161
- timeout: 1_000,
162
- })
163
- .toBe(false);
161
+ await waitForExpect(() => {
162
+ expect(!!peer2._networkManager.getSwarm(topic)!._peers.get({ peerKey: peer1.peerId.toHex() })?.advertizing).to.be
163
+ .false;
164
+ }, 1_000);
164
165
 
165
166
  await peer1.goOnline();
166
167
 
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);
168
+ await waitForExpect(() => {
169
+ expect(peer1._networkManager.getSwarm(topic)?._peers.get({ peerKey: peer2.peerId.toHex() })?.advertizing).to.be
170
+ .true;
171
+ expect(peer2._networkManager.getSwarm(topic)?._peers.get({ peerKey: peer1.peerId.toHex() })?.advertizing).to.be
172
+ .true;
173
+ }, 2_000);
177
174
 
178
175
  await exchangeMessages(swarm1, swarm2);
179
176
  await leaveSwarm([peer1, peer2], topic);
180
- });
177
+ })
178
+ .tag('flaky')
179
+ .timeout(2_000);
181
180
 
182
181
  // TODO(mykola): Fails with large amount of peers ~10.
183
- test.skip('many peers and connections', async () => {
182
+ test('many peers and connections', async () => {
184
183
  const numTopics = 2;
185
184
  const peersPerTopic = 3;
186
185
  const swarmsAllPeersConnected: Promise<any>[] = [];
@@ -208,5 +207,5 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
208
207
  );
209
208
 
210
209
  await asyncTimeout(Promise.all(swarmsAllPeersConnected), 2_000);
211
- });
210
+ }).tag('stress');
212
211
  };
@@ -2,10 +2,10 @@
2
2
  // Copyright 2021 DXOS.org
3
3
  //
4
4
 
5
- import { randomBytes } from 'node:crypto';
6
- import { describe, test } from 'vitest';
5
+ import { randomBytes } from 'crypto';
7
6
 
8
7
  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,45 +17,47 @@ describe('Memory transport', () => {
17
17
  const testBuilder = new TestBuilder();
18
18
  basicTestSuite(testBuilder);
19
19
 
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}`);
20
+ test
21
+ .skip('load', async () => {
22
+ const NUM_PAIRS = 100;
23
+ const NUM_ROUNDS = 10_000;
24
+ const PACKET_SIZE = 1_000;
25
+
26
+ const pairs = await Promise.all(
27
+ range(NUM_PAIRS).map(async () => {
28
+ const peer1 = testBuilder.createPeer();
29
+ const peer2 = testBuilder.createPeer();
30
+ await openAndCloseAfterTest([peer1, peer2]);
31
+
32
+ const topic = PublicKey.random();
33
+ const [swarm1, swarm2] = await joinSwarm([peer1, peer2], topic, () => new FullyConnectedTopology());
34
+
35
+ return {
36
+ peer1,
37
+ peer2,
38
+ topic,
39
+ swarm1,
40
+ swarm2,
41
+ };
42
+ }),
43
+ );
44
+
45
+ const message = randomBytes(PACKET_SIZE / 2).toString('hex');
46
+
47
+ for (let i = 0; i < NUM_ROUNDS; i++) {
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
+
48
56
  await Promise.all(
49
- pairs.map(async ({ swarm1, swarm2 }) => {
50
- await exchangeMessages(swarm1, swarm2, message);
57
+ pairs.map(async ({ peer1, peer2, topic }) => {
58
+ await leaveSwarm([peer1, peer2], topic);
51
59
  }),
52
60
  );
53
- }
54
-
55
- await Promise.all(
56
- pairs.map(async ({ peer1, peer2, topic }) => {
57
- await leaveSwarm([peer1, peer2], topic);
58
- }),
59
- );
60
- });
61
+ })
62
+ .timeout(1_000_000);
61
63
  });
@@ -4,10 +4,11 @@
4
4
 
5
5
  import * as fc from 'fast-check';
6
6
  import { type ModelRunSetup } from 'fast-check';
7
- import { test } from 'vitest';
7
+ import waitForExpect from 'wait-for-expect';
8
8
 
9
9
  import { todo } from '@dxos/debug';
10
10
  import { PublicKey } from '@dxos/keys';
11
+ import { test } from '@dxos/test';
11
12
  import { ComplexMap, ComplexSet, range } from '@dxos/util';
12
13
 
13
14
  import { type SwarmNetworkManager } from '../network-manager';
@@ -36,29 +37,29 @@ export const propertyTestSuite = () => {
36
37
  }
37
38
 
38
39
  const assertState = async (model: Model, real: Real) => {
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}`);
40
+ await waitForExpect(() => {
41
+ for (const peer of real.peers.values()) {
42
+ if (peer.presence) {
43
+ for (const expectedPeerId of model.joinedPeers) {
44
+ if (expectedPeerId.equals(peer.presence.peerId)) {
45
+ continue;
46
+ }
47
+
48
+ const actuallyConnectedPeers = peer.presence!.peers;
49
+ if (!actuallyConnectedPeers.some((peer: any) => PublicKey.equals(expectedPeerId, peer))) {
50
+ // TODO(burdon): More concise error.
51
+ const context = {
52
+ peerId: peer.presence.peerId,
53
+ expectedPeerId: expectedPeerId.truncate(),
54
+ connectedPeerIds: actuallyConnectedPeers.map((key: any) => key.toString('hex')),
55
+ };
56
+
57
+ throw new Error(`Expected peer to be in the list of joined peers: ${context}`);
58
+ }
57
59
  }
58
60
  }
59
61
  }
60
- }
61
- // }, 5_000);
62
+ }, 5_000);
62
63
 
63
64
  real.peers.forEach((peer) =>
64
65
  peer.networkManager.topics.forEach((topic) => {
@@ -0,0 +1,67 @@
1
+ //
2
+ // Copyright 2021 DXOS.org
3
+ //
4
+
5
+ import { randomBytes } from 'crypto';
6
+
7
+ import { PublicKey } from '@dxos/keys';
8
+ import { test } from '@dxos/test';
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
25
+ .skip('load', async () => {
26
+ const NUM_PAIRS = 100;
27
+ const NUM_ROUNDS = 10_000;
28
+ const PACKET_SIZE = 1_000;
29
+
30
+ const pairs = await Promise.all(
31
+ range(NUM_PAIRS).map(async () => {
32
+ const peer1 = testBuilder.createPeer();
33
+ const peer2 = testBuilder.createPeer();
34
+ await openAndCloseAfterTest([peer1, peer2]);
35
+
36
+ const topic = PublicKey.random();
37
+ const [swarm1, swarm2] = await joinSwarm([peer1, peer2], topic, () => new FullyConnectedTopology());
38
+
39
+ return {
40
+ peer1,
41
+ peer2,
42
+ topic,
43
+ swarm1,
44
+ swarm2,
45
+ };
46
+ }),
47
+ );
48
+
49
+ const message = randomBytes(PACKET_SIZE / 2).toString('hex');
50
+
51
+ for (let i = 0; i < NUM_ROUNDS; i++) {
52
+ // console.log(`Round ${i}/${NUM_ROUNDS}`);
53
+ await Promise.all(
54
+ pairs.map(async ({ swarm1, swarm2 }) => {
55
+ await exchangeMessages(swarm1, swarm2, message);
56
+ }),
57
+ );
58
+ }
59
+
60
+ await Promise.all(
61
+ pairs.map(async ({ peer1, peer2, topic }) => {
62
+ await leaveSwarm([peer1, peer2], topic);
63
+ }),
64
+ );
65
+ })
66
+ .timeout(1_000_000);
67
+ });
@@ -2,10 +2,9 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { onTestFinished } from 'vitest';
6
-
7
5
  import { asyncTimeout } from '@dxos/async';
8
6
  import { type PublicKey } from '@dxos/keys';
7
+ import { afterTest } from '@dxos/test';
9
8
  import { type Provider } from '@dxos/util';
10
9
 
11
10
  import { type TestPeer, type TestSwarmConnection } from '../testing';
@@ -20,7 +19,7 @@ import { type Topology } from '../topology';
20
19
  */
21
20
  export const openAndCloseAfterTest = async (peers: TestPeer[]) => {
22
21
  await Promise.all(peers.map((peer) => peer.open()));
23
- onTestFinished(async () => {
22
+ afterTest(async () => {
24
23
  await asyncTimeout(Promise.all(peers.map((peer) => peer.close())), 1_000);
25
24
  });
26
25
  };
@@ -2,29 +2,29 @@
2
2
  // Copyright 2021 DXOS.org
3
3
  //
4
4
 
5
- import { describe } from 'vitest';
5
+ import { describe } from '@dxos/test';
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', { timeout: 10_000 }, () => {
10
+ describe('WebRTC transport', () => {
11
11
  const testBuilder = new TestBuilder();
12
12
  basicTestSuite(testBuilder);
13
- });
13
+ }).timeout(10_000);
14
14
 
15
- describe('WebRTC transport proxy', { timeout: 10_000 }, () => {
15
+ describe('WebRTC transport proxy', () => {
16
16
  const testBuilder = new TestBuilder({ bridge: true });
17
17
  basicTestSuite(testBuilder);
18
- });
18
+ }).timeout(10_000);
19
19
 
20
20
  describe('test with signal server', () => {
21
- describe('WebRTC transport', { timeout: 10_000 }, () => {
21
+ describe('WebRTC transport', () => {
22
22
  const testBuilder = new TestBuilder({ signalHosts: TEST_SIGNAL_HOSTS });
23
23
  basicTestSuite(testBuilder);
24
- });
24
+ }).timeout(10_000);
25
25
 
26
- describe('WebRTC transport proxy', { timeout: 10_000 }, () => {
26
+ describe('WebRTC transport proxy', () => {
27
27
  const testBuilder = new TestBuilder({ signalHosts: TEST_SIGNAL_HOSTS, bridge: true });
28
28
  basicTestSuite(testBuilder);
29
- });
29
+ }).timeout(10_000);
30
30
  });
@@ -4,4 +4,8 @@
4
4
 
5
5
  export * from './memory-transport';
6
6
  export * from './transport';
7
- export * from './webrtc';
7
+ export * from './simplepeer-transport';
8
+ export * from './simplepeer-transport-service';
9
+ export * from './simplepeer-transport-proxy';
10
+ export * from './libdatachannel-transport';
11
+ export * from './tcp-transport';
@@ -0,0 +1,100 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { Duplex } from 'stream';
6
+
7
+ import { sleep, TestStream } from '@dxos/async';
8
+ import { log } from '@dxos/log';
9
+ import { afterTest, describe, test } from '@dxos/test';
10
+
11
+ import { LibDataChannelTransport } from './libdatachannel-transport';
12
+ import { SimplePeerTransport } from './simplepeer-transport';
13
+
14
+ describe('LibDataChannelTransport', () => {
15
+ test('open and close', async () => {
16
+ const connection = new LibDataChannelTransport({
17
+ initiator: true,
18
+ stream: new Duplex(),
19
+ sendSignal: async () => {},
20
+ });
21
+
22
+ await connection.open();
23
+ const wait = connection.closed.waitForCount(1);
24
+ await connection.close();
25
+ await wait;
26
+ })
27
+ .onlyEnvironments('nodejs')
28
+ .timeout(1_000)
29
+ .retries(3);
30
+
31
+ test('establish connection and send data through with protocol', async () => {
32
+ const stream1 = new TestStream();
33
+ const connection1 = new LibDataChannelTransport({
34
+ initiator: true,
35
+ stream: stream1,
36
+ sendSignal: async (signal) => {
37
+ await sleep(10);
38
+ await connection2.onSignal(signal);
39
+ },
40
+ });
41
+ await connection1.open();
42
+ afterTest(() => connection1.close());
43
+ afterTest(() => connection1.errors.assertNoUnhandledErrors());
44
+
45
+ const stream2 = new TestStream();
46
+ const connection2 = new LibDataChannelTransport({
47
+ initiator: false,
48
+ stream: stream2,
49
+ sendSignal: async (signal) => {
50
+ await sleep(10);
51
+ await connection1.onSignal(signal);
52
+ },
53
+ });
54
+ await connection2.open();
55
+ afterTest(() => connection2.close());
56
+ afterTest(() => connection2.errors.assertNoUnhandledErrors());
57
+
58
+ await TestStream.assertConnectivity(stream1, stream2, { timeout: 2_000 });
59
+ })
60
+ .onlyEnvironments('nodejs')
61
+ .timeout(2_000)
62
+ .retries(3);
63
+
64
+ test('establish connection between LibDataChannel and SimplePeer', async () => {
65
+ const stream1 = new TestStream();
66
+ const connection1 = new LibDataChannelTransport({
67
+ initiator: true,
68
+ stream: stream1,
69
+ sendSignal: async (signal) => {
70
+ log.debug('signal', signal);
71
+
72
+ await sleep(10);
73
+ await connection2.onSignal(signal);
74
+ },
75
+ });
76
+ await connection1.open();
77
+ afterTest(() => connection1.close());
78
+ afterTest(() => connection1.errors.assertNoUnhandledErrors());
79
+
80
+ const stream2 = new TestStream();
81
+ const connection2 = new SimplePeerTransport({
82
+ initiator: false,
83
+ stream: stream2,
84
+ sendSignal: async (signal) => {
85
+ log.debug('signal', signal);
86
+
87
+ await sleep(10);
88
+ await connection1.onSignal(signal);
89
+ },
90
+ });
91
+ await connection2.open();
92
+ afterTest(() => connection2.close());
93
+ afterTest(() => connection2.errors.assertNoUnhandledErrors());
94
+
95
+ await TestStream.assertConnectivity(stream1, stream2, { timeout: 2_000 });
96
+ })
97
+ .onlyEnvironments('nodejs')
98
+ .timeout(2_000)
99
+ .retries(3);
100
+ });