@dxos/network-manager 0.6.12 → 0.6.13-main.548ca8d

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 (157) hide show
  1. package/dist/lib/browser/chunk-GW3YM55A.mjs +14 -0
  2. package/dist/lib/browser/chunk-GW3YM55A.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-XYSYUN63.mjs → chunk-IDPSMH73.mjs} +1230 -1031
  4. package/dist/lib/browser/chunk-IDPSMH73.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +10 -19
  6. package/dist/lib/browser/meta.json +1 -1
  7. package/dist/lib/browser/testing/index.mjs +18 -27
  8. package/dist/lib/browser/testing/index.mjs.map +3 -3
  9. package/dist/lib/browser/transport/tcp/index.mjs +39 -0
  10. package/dist/lib/browser/transport/tcp/index.mjs.map +7 -0
  11. package/dist/lib/node/{chunk-4YAYC7WN.cjs → chunk-MCPADZS5.cjs} +1246 -1174
  12. package/dist/lib/node/chunk-MCPADZS5.cjs.map +7 -0
  13. package/dist/lib/node/index.cjs +27 -37
  14. package/dist/lib/node/index.cjs.map +2 -2
  15. package/dist/lib/node/meta.json +1 -1
  16. package/dist/lib/node/testing/index.cjs +20 -29
  17. package/dist/lib/node/testing/index.cjs.map +3 -3
  18. package/dist/lib/node/transport/tcp/index.cjs +191 -0
  19. package/dist/lib/node/transport/tcp/index.cjs.map +7 -0
  20. package/dist/lib/node-esm/chunk-NL5MMIE4.mjs +4388 -0
  21. package/dist/lib/node-esm/chunk-NL5MMIE4.mjs.map +7 -0
  22. package/dist/lib/node-esm/index.mjs +50 -0
  23. package/dist/lib/node-esm/index.mjs.map +7 -0
  24. package/dist/lib/node-esm/meta.json +1 -0
  25. package/dist/lib/node-esm/testing/index.mjs +280 -0
  26. package/dist/lib/node-esm/testing/index.mjs.map +7 -0
  27. package/dist/lib/node-esm/transport/tcp/index.mjs +159 -0
  28. package/dist/lib/node-esm/transport/tcp/index.mjs.map +7 -0
  29. package/dist/types/src/signal/ice.d.ts.map +1 -1
  30. package/dist/types/src/signal/integration.node.test.d.ts +2 -0
  31. package/dist/types/src/signal/integration.node.test.d.ts.map +1 -0
  32. package/dist/types/src/signal/swarm-messenger.node.test.d.ts +2 -0
  33. package/dist/types/src/signal/swarm-messenger.node.test.d.ts.map +1 -0
  34. package/dist/types/src/swarm/connection.d.ts.map +1 -1
  35. package/dist/types/src/swarm/swarm.d.ts +1 -1
  36. package/dist/types/src/testing/test-builder.d.ts +2 -2
  37. package/dist/types/src/testing/test-builder.d.ts.map +1 -1
  38. package/dist/types/src/tests/basic-test-suite.d.ts.map +1 -1
  39. package/dist/types/src/tests/property-test-suite.d.ts.map +1 -1
  40. package/dist/types/src/tests/tcp-transport.node.test.d.ts +2 -0
  41. package/dist/types/src/tests/tcp-transport.node.test.d.ts.map +1 -0
  42. package/dist/types/src/tests/utils.d.ts.map +1 -1
  43. package/dist/types/src/transport/index.d.ts +1 -5
  44. package/dist/types/src/transport/index.d.ts.map +1 -1
  45. package/dist/types/src/transport/memory-transport.d.ts +2 -2
  46. package/dist/types/src/transport/memory-transport.d.ts.map +1 -1
  47. package/dist/types/src/transport/tcp/index.d.ts +2 -0
  48. package/dist/types/src/transport/tcp/index.d.ts.map +1 -0
  49. package/dist/types/src/transport/{tcp-transport.browser.d.ts → tcp/tcp-transport.browser.d.ts} +3 -3
  50. package/dist/types/src/transport/tcp/tcp-transport.browser.d.ts.map +1 -0
  51. package/dist/types/src/transport/{tcp-transport.d.ts → tcp/tcp-transport.d.ts} +3 -3
  52. package/dist/types/src/transport/tcp/tcp-transport.d.ts.map +1 -0
  53. package/dist/types/src/transport/transport.d.ts +7 -6
  54. package/dist/types/src/transport/transport.d.ts.map +1 -1
  55. package/dist/types/src/transport/webrtc/index.d.ts +4 -0
  56. package/dist/types/src/transport/webrtc/index.d.ts.map +1 -0
  57. package/dist/types/src/transport/webrtc/rtc-connection-factory.d.ts +14 -0
  58. package/dist/types/src/transport/webrtc/rtc-connection-factory.d.ts.map +1 -0
  59. package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts +68 -0
  60. package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts.map +1 -0
  61. package/dist/types/src/transport/webrtc/rtc-transport-channel.d.ts +33 -0
  62. package/dist/types/src/transport/webrtc/rtc-transport-channel.d.ts.map +1 -0
  63. package/dist/types/src/transport/webrtc/rtc-transport-channel.test.d.ts +2 -0
  64. package/dist/types/src/transport/webrtc/rtc-transport-channel.test.d.ts.map +1 -0
  65. package/dist/types/src/transport/webrtc/rtc-transport-factory.d.ts +4 -0
  66. package/dist/types/src/transport/webrtc/rtc-transport-factory.d.ts.map +1 -0
  67. package/dist/types/src/transport/{simplepeer-transport-proxy.d.ts → webrtc/rtc-transport-proxy.d.ts} +10 -12
  68. package/dist/types/src/transport/webrtc/rtc-transport-proxy.d.ts.map +1 -0
  69. package/dist/types/src/transport/webrtc/rtc-transport-proxy.test.d.ts +2 -0
  70. package/dist/types/src/transport/webrtc/rtc-transport-proxy.test.d.ts.map +1 -0
  71. package/dist/types/src/transport/{simplepeer-transport-service.d.ts → webrtc/rtc-transport-service.d.ts} +9 -7
  72. package/dist/types/src/transport/webrtc/rtc-transport-service.d.ts.map +1 -0
  73. package/dist/types/src/transport/webrtc/rtc-transport-stats.d.ts +4 -0
  74. package/dist/types/src/transport/webrtc/rtc-transport-stats.d.ts.map +1 -0
  75. package/dist/types/src/transport/webrtc/rtc-transport.test.d.ts +2 -0
  76. package/dist/types/src/transport/webrtc/rtc-transport.test.d.ts.map +1 -0
  77. package/dist/types/src/transport/webrtc/test-utils.d.ts +5 -0
  78. package/dist/types/src/transport/webrtc/test-utils.d.ts.map +1 -0
  79. package/dist/types/src/transport/webrtc/utils.d.ts +3 -0
  80. package/dist/types/src/transport/webrtc/utils.d.ts.map +1 -0
  81. package/package.json +53 -30
  82. package/src/signal/ice.test.ts +1 -3
  83. package/src/signal/ice.ts +6 -1
  84. package/src/signal/{integration.test.ts → integration.node.test.ts} +9 -15
  85. package/src/signal/{swarm-messenger.test.ts → swarm-messenger.node.test.ts} +13 -23
  86. package/src/swarm/connection-limiter.test.ts +3 -6
  87. package/src/swarm/connection.test.ts +63 -38
  88. package/src/swarm/connection.ts +5 -5
  89. package/src/swarm/swarm.test.ts +9 -11
  90. package/src/swarm/swarm.ts +1 -1
  91. package/src/testing/test-builder.ts +12 -28
  92. package/src/tests/basic-test-suite.ts +34 -33
  93. package/src/tests/memory-transport.test.ts +40 -42
  94. package/src/tests/property-test-suite.ts +21 -22
  95. package/src/tests/tcp-transport.node.test.ts +65 -0
  96. package/src/tests/utils.ts +3 -2
  97. package/src/tests/webrtc-transport.test.ts +9 -9
  98. package/src/transport/index.ts +1 -5
  99. package/src/transport/memory-transport.ts +2 -0
  100. package/src/transport/tcp/index.ts +5 -0
  101. package/src/transport/{tcp-transport.browser.ts → tcp/tcp-transport.browser.ts} +7 -3
  102. package/src/transport/{tcp-transport.ts → tcp/tcp-transport.ts} +3 -1
  103. package/src/transport/transport.ts +8 -7
  104. package/src/transport/webrtc/index.ts +7 -0
  105. package/src/transport/webrtc/rtc-connection-factory.ts +82 -0
  106. package/src/transport/webrtc/rtc-peer-connection.ts +472 -0
  107. package/src/transport/webrtc/rtc-transport-channel.test.ts +176 -0
  108. package/src/transport/webrtc/rtc-transport-channel.ts +195 -0
  109. package/src/transport/webrtc/rtc-transport-factory.ts +28 -0
  110. package/src/transport/webrtc/rtc-transport-proxy.test.ts +413 -0
  111. package/src/transport/webrtc/rtc-transport-proxy.ts +264 -0
  112. package/src/transport/webrtc/rtc-transport-service.ts +192 -0
  113. package/src/transport/webrtc/rtc-transport-stats.ts +67 -0
  114. package/src/transport/webrtc/rtc-transport.test.ts +198 -0
  115. package/src/transport/webrtc/test-utils.ts +22 -0
  116. package/src/transport/webrtc/utils.ts +36 -0
  117. package/src/typings.d.ts +8 -2
  118. package/dist/lib/browser/chunk-XYSYUN63.mjs.map +0 -7
  119. package/dist/lib/node/chunk-4YAYC7WN.cjs.map +0 -7
  120. package/dist/types/src/signal/integration.test.d.ts +0 -2
  121. package/dist/types/src/signal/integration.test.d.ts.map +0 -1
  122. package/dist/types/src/signal/swarm-messenger.test.d.ts +0 -2
  123. package/dist/types/src/signal/swarm-messenger.test.d.ts.map +0 -1
  124. package/dist/types/src/tests/tcp-transport.test.d.ts +0 -2
  125. package/dist/types/src/tests/tcp-transport.test.d.ts.map +0 -1
  126. package/dist/types/src/transport/libdatachannel-transport.d.ts +0 -42
  127. package/dist/types/src/transport/libdatachannel-transport.d.ts.map +0 -1
  128. package/dist/types/src/transport/libdatachannel-transport.test.d.ts +0 -2
  129. package/dist/types/src/transport/libdatachannel-transport.test.d.ts.map +0 -1
  130. package/dist/types/src/transport/memory-transport.test.d.ts +0 -2
  131. package/dist/types/src/transport/memory-transport.test.d.ts.map +0 -1
  132. package/dist/types/src/transport/simplepeer-simple-peer.d.ts +0 -2
  133. package/dist/types/src/transport/simplepeer-simple-peer.d.ts.map +0 -1
  134. package/dist/types/src/transport/simplepeer-transport-proxy-test.d.ts +0 -2
  135. package/dist/types/src/transport/simplepeer-transport-proxy-test.d.ts.map +0 -1
  136. package/dist/types/src/transport/simplepeer-transport-proxy.d.ts.map +0 -1
  137. package/dist/types/src/transport/simplepeer-transport-service.d.ts.map +0 -1
  138. package/dist/types/src/transport/simplepeer-transport.d.ts +0 -36
  139. package/dist/types/src/transport/simplepeer-transport.d.ts.map +0 -1
  140. package/dist/types/src/transport/simplepeer-transport.test.d.ts +0 -2
  141. package/dist/types/src/transport/simplepeer-transport.test.d.ts.map +0 -1
  142. package/dist/types/src/transport/tcp-transport.browser.d.ts.map +0 -1
  143. package/dist/types/src/transport/tcp-transport.d.ts.map +0 -1
  144. package/dist/types/src/transport/webrtc.d.ts +0 -6
  145. package/dist/types/src/transport/webrtc.d.ts.map +0 -1
  146. package/src/globals.d.ts +0 -7
  147. package/src/tests/tcp-transport.test.ts +0 -67
  148. package/src/transport/libdatachannel-transport.test.ts +0 -100
  149. package/src/transport/libdatachannel-transport.ts +0 -376
  150. package/src/transport/memory-transport.test.ts +0 -74
  151. package/src/transport/simplepeer-simple-peer.ts +0 -26
  152. package/src/transport/simplepeer-transport-proxy-test.ts +0 -181
  153. package/src/transport/simplepeer-transport-proxy.ts +0 -246
  154. package/src/transport/simplepeer-transport-service.ts +0 -160
  155. package/src/transport/simplepeer-transport.test.ts +0 -61
  156. package/src/transport/simplepeer-transport.ts +0 -250
  157. package/src/transport/webrtc.ts +0 -15
@@ -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
- createLibDataChannelTransportFactory,
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?: TransportKind,
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
- if (!transport) {
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.SIMPLE_PEER:
114
- transportFactory = createSimplePeerTransportFactory();
115
- break;
116
- case TransportKind.LIBDATACHANNEL:
117
- transportFactory = createLibDataChannelTransportFactory();
100
+ case TransportKind.WEB_RTC:
101
+ transportFactory = createRtcTransportFactory();
118
102
  break;
119
- case TransportKind.SIMPLE_PEER_PROXY:
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 SimplePeerTransportService() },
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 SimplePeerTransportProxyFactory().setBridgeService(this._proxy.rpc.BridgeService);
131
+ transportFactory = new RtcTransportProxyFactory().setBridgeService(this._proxy.rpc.BridgeService);
148
132
  }
149
133
  break;
150
134
  default:
@@ -2,13 +2,11 @@
2
2
  // Copyright 2021 DXOS.org
3
3
  //
4
4
 
5
- import { expect } from 'chai';
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
- }).tag('flaky');
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
- afterTest(() => peer1.close());
40
+ onTestFinished(() => peer1.close());
43
41
  const peer2 = testBuilder.createPeer();
44
- afterTest(() => peer2.close());
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
- }).tag('flaky');
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
- }).tag('flaky');
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
- }).tag('flaky');
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
- }).tag('flaky');
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
- }).tag('flaky');
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 waitForExpect(() => {
162
- expect(!!peer2._networkManager.getSwarm(topic)!._peers.get({ peerKey: peer1.peerId.toHex() })?.advertizing).to.be
163
- .false;
164
- }, 1_000);
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 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);
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
- }).tag('stress');
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
- .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
-
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 ({ peer1, peer2, topic }) => {
58
- await leaveSwarm([peer1, peer2], topic);
49
+ pairs.map(async ({ swarm1, swarm2 }) => {
50
+ await exchangeMessages(swarm1, swarm2, message);
59
51
  }),
60
52
  );
61
- })
62
- .timeout(1_000_000);
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 waitForExpect from 'wait-for-expect';
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
- 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
- }
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
- }, 5_000);
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
+ });
@@ -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
- afterTest(async () => {
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 '@dxos/test';
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
- }).timeout(10_000);
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
- }).timeout(10_000);
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
- }).timeout(10_000);
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
- }).timeout(10_000);
29
+ });
30
30
  });
@@ -4,8 +4,4 @@
4
4
 
5
5
  export * from './memory-transport';
6
6
  export * from './transport';
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';
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) {
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './tcp-transport';
@@ -5,7 +5,7 @@
5
5
  import { Event } from '@dxos/async';
6
6
  import { ErrorStream } from '@dxos/debug';
7
7
 
8
- import { type Transport, type TransportFactory, type TransportStats } from './transport';
8
+ import { type Transport, type TransportFactory, type TransportStats } from '../transport';
9
9
 
10
10
  export const TcpTransportFactory: TransportFactory = {
11
11
  createTransport: () => new TcpTransport(),
@@ -23,9 +23,13 @@ export class TcpTransport implements Transport {
23
23
  return true;
24
24
  }
25
25
 
26
- async open() {}
26
+ async open() {
27
+ return this;
28
+ }
27
29
 
28
- async close() {}
30
+ async close() {
31
+ return this;
32
+ }
29
33
 
30
34
  async onSignal() {
31
35
  throw new Error('Method not implemented.');
@@ -9,7 +9,7 @@ import { ErrorStream } from '@dxos/debug';
9
9
  import { log } from '@dxos/log';
10
10
  import { type Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
11
11
 
12
- import { type Transport, type TransportFactory, type TransportOptions, type TransportStats } from './transport';
12
+ import { type Transport, type TransportFactory, type TransportOptions, type TransportStats } from '../transport';
13
13
 
14
14
  export const TcpTransportFactory: TransportFactory = {
15
15
  createTransport: (options) => new TcpTransport(options),
@@ -72,6 +72,7 @@ export class TcpTransport implements Transport {
72
72
  this._server.listen(0);
73
73
  });
74
74
  }
75
+ return this;
75
76
  }
76
77
 
77
78
  async close() {
@@ -79,6 +80,7 @@ export class TcpTransport implements Transport {
79
80
  this._socket?.destroy();
80
81
  this._server?.close();
81
82
  this._closed = true;
83
+ return this;
82
84
  }
83
85
 
84
86
  async onSignal({ payload }: Signal) {
@@ -8,9 +8,8 @@ import { type PublicKey } from '@dxos/keys';
8
8
  import { type Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
9
9
 
10
10
  export enum TransportKind {
11
- SIMPLE_PEER = 'SIMPLE_PEER',
12
- SIMPLE_PEER_PROXY = 'SIMPLE_PEER_PROXY',
13
- LIBDATACHANNEL = 'LIBDATACHANNEL',
11
+ WEB_RTC = 'WEB-RTC',
12
+ WEB_RTC_PROXY = 'WEB-RTC_PROXY',
14
13
  MEMORY = 'MEMORY',
15
14
  TCP = 'TCP',
16
15
  }
@@ -25,10 +24,8 @@ export interface Transport {
25
24
  connected: Event;
26
25
  errors: ErrorStream;
27
26
 
28
- open(): Promise<void>;
29
- close(): Promise<void>;
30
-
31
- get isOpen(): boolean;
27
+ open(): Promise<this>;
28
+ close(): Promise<this>;
32
29
 
33
30
  /**
34
31
  * Handle message from signaling.
@@ -50,6 +47,10 @@ export interface Transport {
50
47
  * Common options for all transports.
51
48
  */
52
49
  export type TransportOptions = {
50
+ ownPeerKey: string;
51
+ remotePeerKey: string;
52
+
53
+ topic: string;
53
54
  /**
54
55
  * Did local node initiate this connection.
55
56
  */
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './rtc-transport-factory';
6
+ export * from './rtc-transport-proxy';
7
+ export * from './rtc-transport-service';