@dxos/network-manager 0.1.4 → 0.1.6

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 (46) hide show
  1. package/LICENSE +5 -18
  2. package/README.md +22 -0
  3. package/dist/src/network-manager.d.ts +2 -1
  4. package/dist/src/network-manager.d.ts.map +1 -1
  5. package/dist/src/network-manager.js +8 -8
  6. package/dist/src/network-manager.js.map +1 -1
  7. package/dist/src/network-manager.test.js +47 -69
  8. package/dist/src/network-manager.test.js.map +1 -1
  9. package/dist/src/protocol-factory.js +1 -1
  10. package/dist/src/protocol-factory.js.map +1 -1
  11. package/dist/src/swarm/swarm.test.js +46 -56
  12. package/dist/src/swarm/swarm.test.js.map +1 -1
  13. package/dist/src/testing/index.d.ts +1 -0
  14. package/dist/src/testing/index.d.ts.map +1 -1
  15. package/dist/src/testing/index.js +1 -0
  16. package/dist/src/testing/index.js.map +1 -1
  17. package/dist/src/testing/test-builder.d.ts +32 -0
  18. package/dist/src/testing/test-builder.d.ts.map +1 -0
  19. package/dist/src/testing/test-builder.js +73 -0
  20. package/dist/src/testing/test-builder.js.map +1 -0
  21. package/dist/src/testing/test-protocol.d.ts +3 -10
  22. package/dist/src/testing/test-protocol.d.ts.map +1 -1
  23. package/dist/src/testing/test-protocol.js +15 -16
  24. package/dist/src/testing/test-protocol.js.map +1 -1
  25. package/dist/src/transport/memory-transport.test.js +3 -3
  26. package/dist/src/transport/memory-transport.test.js.map +1 -1
  27. package/dist/src/transport/webrtc-transport-proxy.test.js +4 -4
  28. package/dist/src/transport/webrtc-transport-proxy.test.js.map +1 -1
  29. package/dist/src/transport/webrtc-transport.d.ts +0 -2
  30. package/dist/src/transport/webrtc-transport.d.ts.map +1 -1
  31. package/dist/src/transport/webrtc-transport.js +2 -5
  32. package/dist/src/transport/webrtc-transport.js.map +1 -1
  33. package/dist/src/transport/webrtc-transport.test.js +2 -2
  34. package/dist/src/transport/webrtc-transport.test.js.map +1 -1
  35. package/package.json +16 -16
  36. package/src/network-manager.test.ts +27 -81
  37. package/src/network-manager.ts +4 -3
  38. package/src/protocol-factory.ts +1 -1
  39. package/src/swarm/swarm.test.ts +54 -76
  40. package/src/testing/index.ts +1 -0
  41. package/src/testing/test-builder.ts +99 -0
  42. package/src/testing/test-protocol.ts +14 -16
  43. package/src/transport/memory-transport.test.ts +3 -3
  44. package/src/transport/webrtc-transport-proxy.test.ts +4 -4
  45. package/src/transport/webrtc-transport.test.ts +2 -2
  46. package/src/transport/webrtc-transport.ts +0 -4
@@ -0,0 +1,99 @@
1
+ //
2
+ // Copyright 2022 DXOS.org
3
+ //
4
+
5
+ import { PublicKey } from '@dxos/keys';
6
+ import { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';
7
+ import { afterTest } from '@dxos/testutils';
8
+
9
+ import { NetworkManager } from '../network-manager';
10
+ import { FullyConnectedTopology, Topology } from '../topology';
11
+ import { MemoryTransportFactory, TransportFactory } from '../transport';
12
+ import { TestProtocolPlugin, testProtocolProvider } from './test-protocol';
13
+
14
+ // Signal server will be started by the setup script.
15
+ export const TEST_SIGNAL_URL = 'ws://localhost:4000/.well-known/dx/signal';
16
+
17
+ export type TestBuilderOptions = {
18
+ signalUrl?: string;
19
+ };
20
+
21
+ // TODO(burdon): Builder pattern (see feed-store).
22
+ export class TestBuilder {
23
+ private _signalContext = new MemorySignalManagerContext();
24
+
25
+ constructor(private _options: TestBuilderOptions = {}) {}
26
+
27
+ createSignalManager() {
28
+ if (this._options.signalUrl) {
29
+ return new WebsocketSignalManager([this._options.signalUrl]);
30
+ }
31
+
32
+ return new MemorySignalManager(this._signalContext);
33
+ }
34
+
35
+ createNetworkManager() {
36
+ return new NetworkManager({
37
+ signalManager: new MemorySignalManager(this._signalContext),
38
+ transportFactory: MemoryTransportFactory
39
+ });
40
+ }
41
+ }
42
+
43
+ export interface CreatePeerOptions {
44
+ topic: PublicKey;
45
+ peerId: PublicKey;
46
+ topology?: Topology;
47
+ signalHosts?: string[];
48
+ transportFactory: TransportFactory;
49
+ }
50
+
51
+ // TODO(burdon): Remove.
52
+ const signalContext = new MemorySignalManagerContext();
53
+
54
+ /**
55
+ * @deprecated
56
+ */
57
+ export const createPeer = async ({
58
+ topic,
59
+ peerId,
60
+ topology = new FullyConnectedTopology(),
61
+ signalHosts,
62
+ transportFactory
63
+ }: CreatePeerOptions) => {
64
+ const signalManager = signalHosts ? new WebsocketSignalManager(signalHosts!) : new MemorySignalManager(signalContext);
65
+ await signalManager.subscribeMessages(peerId);
66
+ const networkManager = new NetworkManager({
67
+ signalManager,
68
+ transportFactory
69
+ });
70
+
71
+ afterTest(() => networkManager.destroy());
72
+
73
+ // TODO(burdon): Use keys everywhere.
74
+ const plugin = new TestProtocolPlugin(peerId.asBuffer());
75
+ const protocolProvider = testProtocolProvider(topic.asBuffer(), peerId, plugin);
76
+ await networkManager.openSwarmConnection({ topic, peerId, protocol: protocolProvider, topology });
77
+
78
+ return {
79
+ networkManager,
80
+ plugin
81
+ };
82
+ };
83
+
84
+ // const createMemoryNetworkManager = (signalContext: MemorySignalManagerContext) => {
85
+ // return new NetworkManager({
86
+ // signalManager: new MemorySignalManager(signalContext),
87
+ // transportFactory: MemoryTransportFactory
88
+ // });
89
+ // };
90
+
91
+ // const createWebRTCNetworkManager = async (config: any, peerId: PublicKey) => {
92
+ // const signalManager = new WebsocketSignalManager(signalHosts!);
93
+ // await signalManager.subscribeMessages(peerId);
94
+ //
95
+ // return new NetworkManager({
96
+ // signalManager,
97
+ // transportFactory: createWebRTCTransportFactory(config)
98
+ // });
99
+ // };
@@ -31,10 +31,10 @@ export const getPeerId = (protocol: Protocol) => {
31
31
  */
32
32
  export class TestProtocolPlugin extends EventEmitter {
33
33
  /** @type {Map<string, {Protocol}>} */
34
- _peers;
34
+ private readonly _peers = new Map(); // TODO(burdon): Complex map.
35
35
 
36
36
  /** @type {Buffer} */
37
- _peerId;
37
+ _peerId; // TODO(burdon): PublicKey.
38
38
 
39
39
  /** @type {Boolean} */
40
40
  _uppercase;
@@ -55,21 +55,14 @@ export class TestProtocolPlugin extends EventEmitter {
55
55
  // TODO(dboreham): Mis-named because this is OUR node ID, not the id of any peer.
56
56
  this._peerId = peerId;
57
57
  this._uppercase = uppercase;
58
- this._peers = new Map();
59
58
  }
60
59
 
61
- /**
62
- * This node's id.
63
- * @return {Buffer}
64
- */
60
+ // TODO(burdon): Expose key directly.
65
61
  get peerId() {
66
62
  return this._peerId;
67
63
  }
68
64
 
69
- /**
70
- * Array of the currently connected peers' node ids (not including our id).
71
- * @return {{Protocol}[]}
72
- */
65
+ // TODO(burdon): Map of keys.
73
66
  get peers() {
74
67
  return Array.from(this._peers.values());
75
68
  }
@@ -80,6 +73,7 @@ export class TestProtocolPlugin extends EventEmitter {
80
73
  * @return {Extension}
81
74
  */
82
75
  createExtension() {
76
+ log('creating extension', { peerId: PublicKey.from(this.peerId) }); // TODO(burdon): Just key.
83
77
  return new Extension(EXTENSION_NAME, { binary: true })
84
78
  .setInitHandler(this._init.bind(this))
85
79
  .setMessageHandler(this._receive.bind(this))
@@ -103,7 +97,8 @@ export class TestProtocolPlugin extends EventEmitter {
103
97
  // TODO(dboreham): Throw fatal error if peer not found.
104
98
  const extension = peer.getExtension(EXTENSION_NAME);
105
99
  const encoded = Buffer.from(payload);
106
- log('Sent', { peerIdStr, payload });
100
+
101
+ log('sent', { peerIdStr, payload });
107
102
  return await extension.send(encoded, { oneway: true });
108
103
  }
109
104
 
@@ -119,7 +114,8 @@ export class TestProtocolPlugin extends EventEmitter {
119
114
  if (this._uppercase) {
120
115
  payload = payload.toUpperCase();
121
116
  }
122
- log('Received', { peerIdStr, payload });
117
+
118
+ log('received', { peerIdStr, payload });
123
119
  this.emit('receive', protocol, payload);
124
120
  }
125
121
 
@@ -152,9 +148,11 @@ export class TestProtocolPlugin extends EventEmitter {
152
148
  * @return {ProtocolProvider}
153
149
  */
154
150
  // TODO(dboreham): Try to encapsulate swarm_key, nodeId.
155
- export const testProtocolProvider = (swarmKey: Buffer, nodeId: Buffer, protocolPlugin: any) =>
156
- protocolFactory({
151
+ export const testProtocolProvider = (swarmKey: Buffer, peerId: PublicKey, protocolPlugin: any) => {
152
+ log('creating protocol factory', { swarmKey: PublicKey.from(swarmKey), peerId });
153
+ return protocolFactory({
157
154
  getTopics: () => [swarmKey],
158
- session: { peerId: PublicKey.stringify(nodeId) },
155
+ session: { peerId: peerId.toHex() },
159
156
  plugins: [protocolPlugin]
160
157
  });
158
+ };
@@ -24,7 +24,7 @@ const createPair = () => {
24
24
  const peer2Id = PublicKey.random();
25
25
 
26
26
  const plugin1 = new TestProtocolPlugin(peer1Id.asBuffer());
27
- const protocolProvider1 = testProtocolProvider(topic.asBuffer(), peer1Id.asBuffer(), plugin1);
27
+ const protocolProvider1 = testProtocolProvider(topic.asBuffer(), peer1Id, plugin1);
28
28
  const connection1 = new MemoryTransport({
29
29
  stream: protocolProvider1({ channel: discoveryKey(topic), initiator: true }).stream,
30
30
  sendSignal: async (signal) => {
@@ -37,7 +37,7 @@ const createPair = () => {
37
37
  afterTest(() => connection1.errors.assertNoUnhandledErrors());
38
38
 
39
39
  const plugin2 = new TestProtocolPlugin(peer2Id.asBuffer());
40
- const protocolProvider2 = testProtocolProvider(topic.asBuffer(), peer2Id.asBuffer(), plugin2);
40
+ const protocolProvider2 = testProtocolProvider(topic.asBuffer(), peer2Id, plugin2);
41
41
  const connection2 = new MemoryTransport({
42
42
  stream: protocolProvider2({ channel: discoveryKey(topic), initiator: false }).stream,
43
43
  sendSignal: async (signal) => {
@@ -82,7 +82,7 @@ describe('MemoryTransport', function () {
82
82
  });
83
83
  });
84
84
 
85
- it('10 pairs of peers connecting at the same time', async function () {
85
+ it.skip('10 pairs of peers connecting at the same time', async function () {
86
86
  await Promise.all(
87
87
  range(10).map(async () => {
88
88
  const { plugin1, plugin2, peer1Id } = createPair();
@@ -108,7 +108,7 @@ describe('WebRTCTransportProxy', function () {
108
108
  const peer2Id = PublicKey.random();
109
109
 
110
110
  const plugin1 = new TestProtocolPlugin(peer1Id.asBuffer());
111
- const protocolProvider1 = testProtocolProvider(topic.asBuffer(), peer1Id.asBuffer(), plugin1);
111
+ const protocolProvider1 = testProtocolProvider(topic.asBuffer(), peer1Id, plugin1);
112
112
  const { webRTCTransportProxy: connection1 } = await setupProxy({
113
113
  initiator: true,
114
114
  stream: protocolProvider1({
@@ -123,7 +123,7 @@ describe('WebRTCTransportProxy', function () {
123
123
  afterTest(() => connection1.errors.assertNoUnhandledErrors());
124
124
 
125
125
  const plugin2 = new TestProtocolPlugin(peer2Id.asBuffer());
126
- const protocolProvider2 = testProtocolProvider(topic.asBuffer(), peer2Id.asBuffer(), plugin2);
126
+ const protocolProvider2 = testProtocolProvider(topic.asBuffer(), peer2Id, plugin2);
127
127
  const { webRTCTransportProxy: connection2 } = await setupProxy({
128
128
  initiator: false,
129
129
  stream: protocolProvider2({
@@ -201,7 +201,7 @@ describe('WebRTCTransportProxy', function () {
201
201
  const peer2Id = PublicKey.random();
202
202
 
203
203
  const plugin1 = new TestProtocolPlugin(peer1Id.asBuffer());
204
- const protocolProvider1 = testProtocolProvider(topic.asBuffer(), peer1Id.asBuffer(), plugin1);
204
+ const protocolProvider1 = testProtocolProvider(topic.asBuffer(), peer1Id, plugin1);
205
205
  const proxy1 = new WebRTCTransportProxy({
206
206
  initiator: true,
207
207
  stream: protocolProvider1({
@@ -217,7 +217,7 @@ describe('WebRTCTransportProxy', function () {
217
217
  afterTest(() => proxy1.errors.assertNoUnhandledErrors());
218
218
 
219
219
  const plugin2 = new TestProtocolPlugin(peer2Id.asBuffer());
220
- const protocolProvider2 = testProtocolProvider(topic.asBuffer(), peer2Id.asBuffer(), plugin2);
220
+ const protocolProvider2 = testProtocolProvider(topic.asBuffer(), peer2Id, plugin2);
221
221
  const proxy2 = new WebRTCTransportProxy({
222
222
  initiator: false,
223
223
  stream: protocolProvider2({
@@ -46,7 +46,7 @@ describe('WebRTCTransport', function () {
46
46
  const peer2Id = PublicKey.random();
47
47
 
48
48
  const plugin1 = new TestProtocolPlugin(peer1Id.asBuffer());
49
- const protocolProvider1 = testProtocolProvider(topic.asBuffer(), peer1Id.asBuffer(), plugin1);
49
+ const protocolProvider1 = testProtocolProvider(topic.asBuffer(), peer1Id, plugin1);
50
50
  const connection1 = new WebRTCTransport({
51
51
  initiator: true,
52
52
  stream: protocolProvider1({
@@ -62,7 +62,7 @@ describe('WebRTCTransport', function () {
62
62
  afterTest(() => connection1.errors.assertNoUnhandledErrors());
63
63
 
64
64
  const plugin2 = new TestProtocolPlugin(peer2Id.asBuffer());
65
- const protocolProvider2 = testProtocolProvider(topic.asBuffer(), peer2Id.asBuffer(), plugin2);
65
+ const protocolProvider2 = testProtocolProvider(topic.asBuffer(), peer2Id, plugin2);
66
66
  const connection2 = new WebRTCTransport({
67
67
  initiator: false,
68
68
  stream: protocolProvider2({
@@ -61,10 +61,6 @@ export class WebRTCTransport implements Transport {
61
61
  });
62
62
  }
63
63
 
64
- get peer() {
65
- return this._peer;
66
- }
67
-
68
64
  async close() {
69
65
  log('closing...');
70
66
  await this._disconnectStreams();