@dxos/network-manager 0.1.16 → 0.1.18

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 (60) hide show
  1. package/dist/lib/browser/index.mjs +144 -276
  2. package/dist/lib/browser/meta.json +1 -1
  3. package/dist/lib/browser/testing/index.mjs +153 -342
  4. package/dist/lib/node/index.cjs +145 -281
  5. package/dist/lib/node/meta.json +1 -1
  6. package/dist/lib/node/testing/index.cjs +153 -345
  7. package/dist/types/src/index.d.ts +0 -1
  8. package/dist/types/src/index.d.ts.map +1 -1
  9. package/dist/types/src/network-manager.d.ts +1 -5
  10. package/dist/types/src/network-manager.d.ts.map +1 -1
  11. package/dist/types/src/swarm/connection.d.ts +4 -0
  12. package/dist/types/src/swarm/connection.d.ts.map +1 -1
  13. package/dist/types/src/swarm/peer.d.ts.map +1 -1
  14. package/dist/types/src/swarm/swarm-mapper.d.ts +1 -3
  15. package/dist/types/src/swarm/swarm-mapper.d.ts.map +1 -1
  16. package/dist/types/src/testing/index.d.ts +0 -1
  17. package/dist/types/src/testing/index.d.ts.map +1 -1
  18. package/dist/types/src/testing/test-builder.d.ts +2 -2
  19. package/dist/types/src/testing/test-builder.d.ts.map +1 -1
  20. package/dist/types/src/testing/test-wire-protocol.d.ts +14 -0
  21. package/dist/types/src/testing/test-wire-protocol.d.ts.map +1 -0
  22. package/dist/types/src/tests/basic-test-suite.d.ts.map +1 -1
  23. package/dist/types/src/tests/property-test-suite.d.ts.map +1 -1
  24. package/dist/types/src/tests/utils.d.ts.map +1 -1
  25. package/dist/types/src/transport/memory-transport.d.ts +3 -3
  26. package/dist/types/src/transport/memory-transport.d.ts.map +1 -1
  27. package/dist/types/src/wire-protocol.d.ts +0 -10
  28. package/dist/types/src/wire-protocol.d.ts.map +1 -1
  29. package/package.json +16 -18
  30. package/src/connection-log.ts +26 -26
  31. package/src/index.ts +0 -1
  32. package/src/network-manager.ts +1 -8
  33. package/src/swarm/connection.ts +12 -1
  34. package/src/swarm/peer.ts +1 -3
  35. package/src/swarm/swarm-mapper.ts +29 -31
  36. package/src/swarm/swarm.test.ts +12 -34
  37. package/src/testing/index.ts +0 -1
  38. package/src/testing/test-builder.ts +4 -7
  39. package/src/testing/test-wire-protocol.ts +44 -0
  40. package/src/tests/basic-test-suite.ts +13 -53
  41. package/src/tests/property-test-suite.ts +13 -15
  42. package/src/tests/utils.ts +10 -37
  43. package/src/transport/memory-transport.test.ts +13 -52
  44. package/src/transport/memory-transport.ts +37 -29
  45. package/src/transport/webrtc-transport-proxy.test.ts +13 -73
  46. package/src/transport/webrtc-transport.test.ts +7 -38
  47. package/src/wire-protocol.ts +0 -24
  48. package/dist/lib/browser/index.mjs.map +0 -7
  49. package/dist/lib/browser/testing/index.mjs.map +0 -7
  50. package/dist/lib/node/index.cjs.map +0 -7
  51. package/dist/lib/node/testing/index.cjs.map +0 -7
  52. package/dist/types/src/protocol-factory.d.ts +0 -36
  53. package/dist/types/src/protocol-factory.d.ts.map +0 -1
  54. package/dist/types/src/testing/test-protocol.d.ts +0 -52
  55. package/dist/types/src/testing/test-protocol.d.ts.map +0 -1
  56. package/dist/types/src/tests/presence.test.d.ts +0 -2
  57. package/dist/types/src/tests/presence.test.d.ts.map +0 -1
  58. package/src/protocol-factory.ts +0 -88
  59. package/src/testing/test-protocol.ts +0 -166
  60. package/src/tests/presence.test.ts +0 -80
@@ -1,166 +0,0 @@
1
- //
2
- // Copyright 2020 DXOS.org
3
- //
4
-
5
- // Test/mock Protocol implementation used in network-manager tests.
6
-
7
- import assert from 'node:assert';
8
- import { EventEmitter } from 'node:events';
9
-
10
- import { PublicKey } from '@dxos/keys';
11
- import { log } from '@dxos/log';
12
- import { Extension, Protocol } from '@dxos/mesh-protocol';
13
-
14
- import { protocolFactory } from '../protocol-factory';
15
-
16
- const EXTENSION_NAME = 'test';
17
-
18
- // TODO(burdon): PublicKey.
19
- // TODO(dboreham): This method should be added to Protocol (and one for "my ID"?).
20
- export const getPeerId = (protocol: Protocol) => {
21
- const { peerId } = protocol.getSession() ?? {};
22
- if (!peerId) {
23
- return undefined;
24
- }
25
-
26
- return PublicKey.bufferize(peerId);
27
- };
28
-
29
- /**
30
- * @deprecated
31
- */
32
- // TODO(burdon): Reconcile with transportProtocolProvider.
33
- export const testProtocolProvider = (topic: Buffer, peerId: PublicKey, protocolPlugin: any) => {
34
- log('creating protocol-factory', { topic: PublicKey.from(topic), peerId });
35
-
36
- return protocolFactory({
37
- getTopics: () => [topic],
38
- session: { peerId: peerId.toHex() }, // TODO(burdon): PublicKey.
39
- plugins: [protocolPlugin]
40
- });
41
- };
42
-
43
- /**
44
- * Object Implementing a p2p protocol (interaction across a set of peers using a common protocol)
45
- * and an associated transport connection protocol (interaction with each individual peer over a single network
46
- * transport connection).
47
- */
48
- export class TestProtocolPlugin extends EventEmitter {
49
- /** @type {Map<string, {Protocol}>} */
50
- private readonly _peers = new Map(); // TODO(burdon): Complex map.
51
-
52
- /** @type {Buffer} */
53
- _peerId; // TODO(burdon): PublicKey.
54
-
55
- /** @type {Boolean} */
56
- _uppercase;
57
-
58
- initCalled = false;
59
-
60
- /**
61
- * Test Protocol. Passes through messages unchanged, or folds to upper case.
62
- * Provides a way to test that two protocols with different behavior are
63
- * indeed being used with two different swarm keys.
64
- * @param {Buffer} peerId
65
- * @param {Boolean} uppercase Fold payload case to upper if set.
66
- */
67
- constructor(peerId: Buffer, uppercase = false) {
68
- super();
69
- assert(Buffer.isBuffer(peerId));
70
-
71
- // TODO(dboreham): Mis-named because this is OUR node ID, not the id of any peer.
72
- this._peerId = peerId;
73
- this._uppercase = uppercase;
74
- }
75
-
76
- // TODO(burdon): Expose key directly.
77
- get peerId() {
78
- return this._peerId;
79
- }
80
-
81
- // TODO(burdon): Map of keys.
82
- get peers() {
83
- return Array.from(this._peers.values());
84
- }
85
-
86
- /**
87
- * Factory function for Extensions (per-connection object).
88
- * Called when a new peer transport connection is established.
89
- * @return {Extension}
90
- */
91
- createExtension() {
92
- log('creating extension', { peerId: PublicKey.from(this.peerId) }); // TODO(burdon): Just key.
93
- return new Extension(EXTENSION_NAME, { binary: true })
94
- .setInitHandler(this._init.bind(this))
95
- .setMessageHandler(this._receive.bind(this))
96
- .setHandshakeHandler(this._onPeerConnect.bind(this))
97
- .setCloseHandler(this._onPeerDisconnect.bind(this));
98
- }
99
-
100
- // Methods below are per-peer connection.
101
- // TODO(dboreham): Why are these here and not on Protocol?
102
-
103
- private async _init(protocol: Protocol) {
104
- this.initCalled = true;
105
- }
106
-
107
- /**
108
- * Send/Receive messages with peer when initiating a request/response interaction.
109
- * @param peerId Must be the value passed to the constructor on the responding node.
110
- * @param payload Message to send
111
- * @return Message received from peer in response to our request.
112
- */
113
- async send(peerId: Buffer, payload: string): Promise<string> {
114
- assert(Buffer.isBuffer(peerId));
115
- const peerIdStr = PublicKey.stringify(peerId); // TODO(burdon): PublicKey.
116
- const peer = this._peers.get(peerIdStr);
117
- if (!peer) {
118
- throw new Error(`peer not found: ${PublicKey.from(peerId).truncate()}`);
119
- }
120
-
121
- const extension = peer.getExtension(EXTENSION_NAME);
122
- const encoded = Buffer.from(payload);
123
-
124
- log('sending', { peerId: PublicKey.from(peerId), payload });
125
- return await extension.send(encoded, { oneway: true });
126
- }
127
-
128
- async _receive(protocol: Protocol, data: any) {
129
- const peerId = getPeerId(protocol);
130
- assert(peerId !== undefined);
131
- let payload = data.data.toString();
132
- if (this._uppercase) {
133
- payload = payload.toUpperCase();
134
- }
135
-
136
- log('received', { peerId: PublicKey.from(peerId), payload });
137
- this.emit('receive', protocol, payload);
138
- }
139
-
140
- async _onPeerConnect(protocol: Protocol) {
141
- log('connecting', { id: PublicKey.from(protocol.id) });
142
- const peerId = getPeerId(protocol);
143
- if (peerId === undefined) {
144
- return;
145
- }
146
-
147
- const peerIdStr = PublicKey.stringify(peerId);
148
- if (this._peers.has(peerIdStr)) {
149
- return;
150
- }
151
-
152
- this._peers.set(peerIdStr, protocol);
153
- this.emit('connect', protocol);
154
- }
155
-
156
- async _onPeerDisconnect(protocol: Protocol) {
157
- log('disconnecting', { id: PublicKey.from(protocol.id) });
158
- const peerId = getPeerId(protocol);
159
- if (peerId === undefined) {
160
- return;
161
- }
162
-
163
- this._peers.delete(PublicKey.stringify(peerId));
164
- this.emit('disconnect', peerId);
165
- }
166
- }
@@ -1,80 +0,0 @@
1
- //
2
- // Copyright 2021 DXOS.org
3
- //
4
-
5
- import { expect } from 'chai';
6
- import waitForExpect from 'wait-for-expect';
7
-
8
- import { PublicKey } from '@dxos/keys';
9
- import { MemorySignalManagerContext, MemorySignalManager } from '@dxos/messaging';
10
- import { PresencePlugin } from '@dxos/protocol-plugin-presence';
11
- import { describe, test, afterTest } from '@dxos/test';
12
-
13
- import { NetworkManager } from '../network-manager';
14
- import { createProtocolFactory } from '../protocol-factory';
15
- import { FullyConnectedTopology } from '../topology';
16
- import { MemoryTransportFactory } from '../transport';
17
- import { adaptProtocolProvider } from '../wire-protocol';
18
-
19
- const signalContext = new MemorySignalManagerContext();
20
-
21
- // TODO(burdon): Move to TestBuilder (configure plugins).
22
- const createPeer = async (topic: PublicKey) => {
23
- const peerId = PublicKey.random();
24
-
25
- const networkManager = new NetworkManager({
26
- signalManager: new MemorySignalManager(signalContext),
27
- transportFactory: MemoryTransportFactory
28
- });
29
- afterTest(() => networkManager.close());
30
-
31
- const presencePlugin = new PresencePlugin(peerId.asBuffer());
32
- afterTest(() => presencePlugin.stop());
33
-
34
- await networkManager.joinSwarm({
35
- peerId,
36
- protocolProvider: adaptProtocolProvider(createProtocolFactory(topic, peerId, [presencePlugin])),
37
- topic,
38
- topology: new FullyConnectedTopology()
39
- });
40
-
41
- return { peerId, presence: presencePlugin, networkManager };
42
- };
43
-
44
- describe('Presence', () => {
45
- test('detects connected peers', async () => {
46
- // TODO(burdon): Configure plugins.
47
- // const testBuilder = new TestBuilder();
48
- // const peer1 = testBuilder.createPeer();
49
- // const peer2 = testBuilder.createPeer();
50
-
51
- const topic = PublicKey.random();
52
- const peer1 = await createPeer(topic);
53
- const peer2 = await createPeer(topic);
54
- // await peer1.joinSwarm(topic);
55
- // await peer2.joinSwarm(topic);
56
-
57
- // TODO(burdon): Use triggers instead of waitForExpect.
58
- await waitForExpect(() => {
59
- expect(peer1.presence.peers.map((key) => key.toString('hex')).sort()).to.deep.eq(
60
- [peer1, peer2].map((key) => key.peerId.toHex()).sort()
61
- );
62
-
63
- expect(peer2.presence.peers.map((key) => key.toString('hex')).sort()).to.deep.eq(
64
- [peer1, peer2].map((key) => key.peerId.toHex()).sort()
65
- );
66
- });
67
-
68
- await peer2.networkManager.leaveSwarm(topic);
69
-
70
- await waitForExpect(() => {
71
- expect(peer1.presence.peers.map((key) => key.toString('hex')).sort()).to.deep.eq(
72
- [peer1].map((key) => key.peerId.toHex()).sort()
73
- );
74
-
75
- expect(peer2.presence.peers.map((key) => key.toString('hex')).sort()).to.deep.eq(
76
- [peer2].map((key) => key.peerId.toHex()).sort()
77
- );
78
- });
79
- });
80
- });