@dxos/network-manager 0.6.13 → 0.6.14-main.1366248

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 (164) hide show
  1. package/dist/lib/browser/{chunk-XYSYUN63.mjs → chunk-UEVA7BFW.mjs} +1323 -1102
  2. package/dist/lib/browser/chunk-UEVA7BFW.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +9 -19
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/browser/testing/index.mjs +30 -37
  6. package/dist/lib/browser/testing/index.mjs.map +3 -3
  7. package/dist/lib/browser/transport/tcp/index.mjs +38 -0
  8. package/dist/lib/browser/transport/tcp/index.mjs.map +7 -0
  9. package/dist/lib/node/{chunk-4YAYC7WN.cjs → chunk-LK5D44SA.cjs} +1336 -1239
  10. package/dist/lib/node/chunk-LK5D44SA.cjs.map +7 -0
  11. package/dist/lib/node/index.cjs +27 -37
  12. package/dist/lib/node/index.cjs.map +2 -2
  13. package/dist/lib/node/meta.json +1 -1
  14. package/dist/lib/node/testing/index.cjs +34 -38
  15. package/dist/lib/node/testing/index.cjs.map +3 -3
  16. package/dist/lib/node/transport/tcp/index.cjs +191 -0
  17. package/dist/lib/node/transport/tcp/index.cjs.map +7 -0
  18. package/dist/lib/node-esm/chunk-Y5TD36KR.mjs +4413 -0
  19. package/dist/lib/node-esm/chunk-Y5TD36KR.mjs.map +7 -0
  20. package/dist/lib/node-esm/index.mjs +50 -0
  21. package/dist/lib/node-esm/index.mjs.map +7 -0
  22. package/dist/lib/node-esm/meta.json +1 -0
  23. package/dist/lib/node-esm/testing/index.mjs +285 -0
  24. package/dist/lib/node-esm/testing/index.mjs.map +7 -0
  25. package/dist/lib/node-esm/transport/tcp/index.mjs +159 -0
  26. package/dist/lib/node-esm/transport/tcp/index.mjs.map +7 -0
  27. package/dist/types/src/network-manager.d.ts +2 -1
  28. package/dist/types/src/network-manager.d.ts.map +1 -1
  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/peer.d.ts.map +1 -1
  36. package/dist/types/src/swarm/swarm.d.ts +2 -1
  37. package/dist/types/src/swarm/swarm.d.ts.map +1 -1
  38. package/dist/types/src/testing/test-builder.d.ts +2 -2
  39. package/dist/types/src/testing/test-builder.d.ts.map +1 -1
  40. package/dist/types/src/testing/test-wire-protocol.d.ts +1 -2
  41. package/dist/types/src/testing/test-wire-protocol.d.ts.map +1 -1
  42. package/dist/types/src/tests/basic-test-suite.d.ts.map +1 -1
  43. package/dist/types/src/tests/property-test-suite.d.ts.map +1 -1
  44. package/dist/types/src/tests/tcp-transport.node.test.d.ts +2 -0
  45. package/dist/types/src/tests/tcp-transport.node.test.d.ts.map +1 -0
  46. package/dist/types/src/tests/utils.d.ts.map +1 -1
  47. package/dist/types/src/transport/index.d.ts +1 -5
  48. package/dist/types/src/transport/index.d.ts.map +1 -1
  49. package/dist/types/src/transport/memory-transport.d.ts +2 -2
  50. package/dist/types/src/transport/memory-transport.d.ts.map +1 -1
  51. package/dist/types/src/transport/tcp/index.d.ts +2 -0
  52. package/dist/types/src/transport/tcp/index.d.ts.map +1 -0
  53. package/dist/types/src/transport/{tcp-transport.browser.d.ts → tcp/tcp-transport.browser.d.ts} +3 -3
  54. package/dist/types/src/transport/tcp/tcp-transport.browser.d.ts.map +1 -0
  55. package/dist/types/src/transport/{tcp-transport.d.ts → tcp/tcp-transport.d.ts} +3 -3
  56. package/dist/types/src/transport/tcp/tcp-transport.d.ts.map +1 -0
  57. package/dist/types/src/transport/transport.d.ts +7 -6
  58. package/dist/types/src/transport/transport.d.ts.map +1 -1
  59. package/dist/types/src/transport/webrtc/index.d.ts +4 -0
  60. package/dist/types/src/transport/webrtc/index.d.ts.map +1 -0
  61. package/dist/types/src/transport/webrtc/rtc-connection-factory.d.ts +14 -0
  62. package/dist/types/src/transport/webrtc/rtc-connection-factory.d.ts.map +1 -0
  63. package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts +68 -0
  64. package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts.map +1 -0
  65. package/dist/types/src/transport/webrtc/rtc-transport-channel.d.ts +33 -0
  66. package/dist/types/src/transport/webrtc/rtc-transport-channel.d.ts.map +1 -0
  67. package/dist/types/src/transport/webrtc/rtc-transport-channel.test.d.ts +2 -0
  68. package/dist/types/src/transport/webrtc/rtc-transport-channel.test.d.ts.map +1 -0
  69. package/dist/types/src/transport/webrtc/rtc-transport-factory.d.ts +4 -0
  70. package/dist/types/src/transport/webrtc/rtc-transport-factory.d.ts.map +1 -0
  71. package/dist/types/src/transport/{simplepeer-transport-proxy.d.ts → webrtc/rtc-transport-proxy.d.ts} +10 -12
  72. package/dist/types/src/transport/webrtc/rtc-transport-proxy.d.ts.map +1 -0
  73. package/dist/types/src/transport/webrtc/rtc-transport-proxy.test.d.ts +2 -0
  74. package/dist/types/src/transport/webrtc/rtc-transport-proxy.test.d.ts.map +1 -0
  75. package/dist/types/src/transport/{simplepeer-transport-service.d.ts → webrtc/rtc-transport-service.d.ts} +9 -7
  76. package/dist/types/src/transport/webrtc/rtc-transport-service.d.ts.map +1 -0
  77. package/dist/types/src/transport/webrtc/rtc-transport-stats.d.ts +4 -0
  78. package/dist/types/src/transport/webrtc/rtc-transport-stats.d.ts.map +1 -0
  79. package/dist/types/src/transport/webrtc/rtc-transport.test.d.ts +2 -0
  80. package/dist/types/src/transport/webrtc/rtc-transport.test.d.ts.map +1 -0
  81. package/dist/types/src/transport/webrtc/test-utils.d.ts +5 -0
  82. package/dist/types/src/transport/webrtc/test-utils.d.ts.map +1 -0
  83. package/dist/types/src/transport/webrtc/utils.d.ts +3 -0
  84. package/dist/types/src/transport/webrtc/utils.d.ts.map +1 -0
  85. package/package.json +53 -36
  86. package/src/network-manager.ts +5 -13
  87. package/src/signal/ice.test.ts +1 -3
  88. package/src/signal/ice.ts +6 -1
  89. package/src/signal/{integration.test.ts → integration.node.test.ts} +9 -15
  90. package/src/signal/{swarm-messenger.test.ts → swarm-messenger.node.test.ts} +13 -23
  91. package/src/swarm/connection-limiter.test.ts +3 -6
  92. package/src/swarm/connection.test.ts +63 -38
  93. package/src/swarm/connection.ts +7 -7
  94. package/src/swarm/peer.ts +4 -1
  95. package/src/swarm/swarm.test.ts +10 -12
  96. package/src/swarm/swarm.ts +16 -3
  97. package/src/testing/test-builder.ts +14 -29
  98. package/src/testing/test-wire-protocol.ts +7 -8
  99. package/src/tests/basic-test-suite.ts +32 -31
  100. package/src/tests/memory-transport.test.ts +40 -42
  101. package/src/tests/property-test-suite.ts +21 -22
  102. package/src/tests/tcp-transport.node.test.ts +65 -0
  103. package/src/tests/utils.ts +3 -2
  104. package/src/tests/webrtc-transport.test.ts +10 -10
  105. package/src/transport/index.ts +1 -5
  106. package/src/transport/memory-transport.ts +2 -0
  107. package/src/transport/tcp/index.ts +5 -0
  108. package/src/transport/{tcp-transport.browser.ts → tcp/tcp-transport.browser.ts} +7 -3
  109. package/src/transport/{tcp-transport.ts → tcp/tcp-transport.ts} +3 -1
  110. package/src/transport/transport.ts +8 -7
  111. package/src/transport/webrtc/index.ts +7 -0
  112. package/src/transport/webrtc/rtc-connection-factory.ts +82 -0
  113. package/src/transport/webrtc/rtc-peer-connection.ts +472 -0
  114. package/src/transport/webrtc/rtc-transport-channel.test.ts +176 -0
  115. package/src/transport/webrtc/rtc-transport-channel.ts +195 -0
  116. package/src/transport/webrtc/rtc-transport-factory.ts +28 -0
  117. package/src/transport/webrtc/rtc-transport-proxy.test.ts +413 -0
  118. package/src/transport/webrtc/rtc-transport-proxy.ts +264 -0
  119. package/src/transport/webrtc/rtc-transport-service.ts +192 -0
  120. package/src/transport/webrtc/rtc-transport-stats.ts +67 -0
  121. package/src/transport/webrtc/rtc-transport.test.ts +210 -0
  122. package/src/transport/webrtc/test-utils.ts +22 -0
  123. package/src/transport/webrtc/utils.ts +36 -0
  124. package/src/typings.d.ts +8 -2
  125. package/dist/lib/browser/chunk-XYSYUN63.mjs.map +0 -7
  126. package/dist/lib/node/chunk-4YAYC7WN.cjs.map +0 -7
  127. package/dist/types/src/signal/integration.test.d.ts +0 -2
  128. package/dist/types/src/signal/integration.test.d.ts.map +0 -1
  129. package/dist/types/src/signal/swarm-messenger.test.d.ts +0 -2
  130. package/dist/types/src/signal/swarm-messenger.test.d.ts.map +0 -1
  131. package/dist/types/src/tests/tcp-transport.test.d.ts +0 -2
  132. package/dist/types/src/tests/tcp-transport.test.d.ts.map +0 -1
  133. package/dist/types/src/transport/libdatachannel-transport.d.ts +0 -42
  134. package/dist/types/src/transport/libdatachannel-transport.d.ts.map +0 -1
  135. package/dist/types/src/transport/libdatachannel-transport.test.d.ts +0 -2
  136. package/dist/types/src/transport/libdatachannel-transport.test.d.ts.map +0 -1
  137. package/dist/types/src/transport/memory-transport.test.d.ts +0 -2
  138. package/dist/types/src/transport/memory-transport.test.d.ts.map +0 -1
  139. package/dist/types/src/transport/simplepeer-simple-peer.d.ts +0 -2
  140. package/dist/types/src/transport/simplepeer-simple-peer.d.ts.map +0 -1
  141. package/dist/types/src/transport/simplepeer-transport-proxy-test.d.ts +0 -2
  142. package/dist/types/src/transport/simplepeer-transport-proxy-test.d.ts.map +0 -1
  143. package/dist/types/src/transport/simplepeer-transport-proxy.d.ts.map +0 -1
  144. package/dist/types/src/transport/simplepeer-transport-service.d.ts.map +0 -1
  145. package/dist/types/src/transport/simplepeer-transport.d.ts +0 -36
  146. package/dist/types/src/transport/simplepeer-transport.d.ts.map +0 -1
  147. package/dist/types/src/transport/simplepeer-transport.test.d.ts +0 -2
  148. package/dist/types/src/transport/simplepeer-transport.test.d.ts.map +0 -1
  149. package/dist/types/src/transport/tcp-transport.browser.d.ts.map +0 -1
  150. package/dist/types/src/transport/tcp-transport.d.ts.map +0 -1
  151. package/dist/types/src/transport/webrtc.d.ts +0 -6
  152. package/dist/types/src/transport/webrtc.d.ts.map +0 -1
  153. package/src/globals.d.ts +0 -7
  154. package/src/tests/tcp-transport.test.ts +0 -67
  155. package/src/transport/libdatachannel-transport.test.ts +0 -100
  156. package/src/transport/libdatachannel-transport.ts +0 -376
  157. package/src/transport/memory-transport.test.ts +0 -74
  158. package/src/transport/simplepeer-simple-peer.ts +0 -26
  159. package/src/transport/simplepeer-transport-proxy-test.ts +0 -181
  160. package/src/transport/simplepeer-transport-proxy.ts +0 -246
  161. package/src/transport/simplepeer-transport-service.ts +0 -160
  162. package/src/transport/simplepeer-transport.test.ts +0 -61
  163. package/src/transport/simplepeer-transport.ts +0 -250
  164. package/src/transport/webrtc.ts +0 -15
@@ -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
- describe('test with signal server', () => {
21
- describe('WebRTC transport', () => {
20
+ describe.skip('test with signal server', () => {
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';
@@ -0,0 +1,82 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { Mutex } from '@dxos/async';
6
+
7
+ export type ConnectionInfo = {
8
+ initiator: boolean;
9
+ };
10
+
11
+ export interface RtcConnectionFactory {
12
+ initialize(): Promise<void>;
13
+ onConnectionDestroyed(): Promise<void>;
14
+ createConnection(config: RTCConfiguration): Promise<RTCPeerConnection>;
15
+ initConnection(connection: RTCPeerConnection, info: ConnectionInfo): Promise<void>;
16
+ }
17
+
18
+ /**
19
+ * Use built-in browser RTCPeerConnection.
20
+ */
21
+ class BrowserRtcConnectionFactory implements RtcConnectionFactory {
22
+ async initialize() {}
23
+ async onConnectionDestroyed() {}
24
+
25
+ async createConnection(config: RTCConfiguration) {
26
+ return new RTCPeerConnection(config);
27
+ }
28
+
29
+ async initConnection(connection: RTCPeerConnection, info: ConnectionInfo): Promise<void> {}
30
+ }
31
+
32
+ /**
33
+ * Use `node-datachannel` polyfill.
34
+ * https://github.com/paullouisageneau/libdatachannel
35
+ */
36
+ class NodeRtcConnectionFactory implements RtcConnectionFactory {
37
+ private static _createdConnections = 0;
38
+ private static _cleanupMutex = new Mutex();
39
+
40
+ // This should be inside the function to avoid triggering `eval` in the global scope.
41
+ // eslint-disable-next-line no-new-func
42
+
43
+ // TODO(burdon): Do imports here?
44
+ async initialize() {}
45
+ async onConnectionDestroyed() {
46
+ return NodeRtcConnectionFactory._cleanupMutex.executeSynchronized(async () => {
47
+ if (--NodeRtcConnectionFactory._createdConnections === 0) {
48
+ (await import('#node-datachannel')).cleanup();
49
+ }
50
+ });
51
+ }
52
+
53
+ async createConnection(config: RTCConfiguration) {
54
+ return NodeRtcConnectionFactory._cleanupMutex.executeSynchronized(async () => {
55
+ const { RTCPeerConnection } = await import('#node-datachannel/polyfill');
56
+ NodeRtcConnectionFactory._createdConnections++;
57
+ return new RTCPeerConnection(config);
58
+ });
59
+ }
60
+
61
+ async initConnection(connection: RTCPeerConnection, info: ConnectionInfo): Promise<void> {
62
+ // Initiator peer is responsible for data-channel creation. This triggers the callback in browsers.
63
+ // In node-datachannel/polyfill createOffer() / setLocalDescription(offer) are no-ops, the process
64
+ // is handled by c++ implementation when a data-channel gets created.
65
+ // By calling the method here we'll start waiting for an offer promise that'll resolve on data-channel creation
66
+ // at which point we'll need to send an SDP to a remote peer.
67
+ // https://github.com/murat-dogan/node-datachannel/blob/master/polyfill/RTCPeerConnection.js#L452C1-L459C6
68
+ //
69
+ if (info.initiator) {
70
+ connection.onnegotiationneeded?.(null as any);
71
+ }
72
+ }
73
+ }
74
+
75
+ /**
76
+ * Create platform-specific connection factory.
77
+ */
78
+ export const getRtcConnectionFactory = (): RtcConnectionFactory => {
79
+ return typeof (globalThis as any).RTCPeerConnection === 'undefined'
80
+ ? new NodeRtcConnectionFactory()
81
+ : new BrowserRtcConnectionFactory();
82
+ };