@dxos/network-manager 0.1.23 → 0.1.24

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.
@@ -17,7 +17,7 @@ export declare class ConnectionLog {
17
17
  readonly update: Event<void>;
18
18
  getSwarmInfo(swarmId: PublicKey): SwarmInfo;
19
19
  get swarms(): SwarmInfo[];
20
- swarmJoined(swarm: Swarm): void;
21
- swarmLeft(swarm: Swarm): void;
20
+ joinedSwarm(swarm: Swarm): void;
21
+ leftSwarm(swarm: Swarm): void;
22
22
  }
23
23
  //# sourceMappingURL=connection-log.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"basic-test-suite.d.ts","sourceRoot":"","sources":["../../../../src/tests/basic-test-suite.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAMzC;;GAEG;AACH,eAAO,MAAM,cAAc,gBAAiB,WAAW,6BA8JtD,CAAC"}
1
+ {"version":3,"file":"basic-test-suite.d.ts","sourceRoot":"","sources":["../../../../src/tests/basic-test-suite.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAMzC;;GAEG;AACH,eAAO,MAAM,cAAc,gBAAiB,WAAW,6BAsKtD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/tests/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAMvC;;GAEG;AACH,eAAO,MAAM,qBAAqB,UAAiB,QAAQ,EAAE,kBAK5D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,UAAiB,QAAQ,EAAE,SAAS,SAAS,aAAa,SAAS,QAAQ,CAAC,mCAOjG,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,UAAiB,QAAQ,EAAE,SAAS,SAAS,mCAOnE,CAAC;AAEF;;GAEG;AAGH,eAAO,MAAM,gBAAgB,WAAkB,mBAAmB,UAAU,mBAAmB,kBAG9F,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/tests/utils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAMvC;;GAEG;AACH,eAAO,MAAM,qBAAqB,UAAiB,QAAQ,EAAE,kBAK5D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,UAAiB,QAAQ,EAAE,SAAS,SAAS,aAAa,SAAS,QAAQ,CAAC,mCAOjG,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,UAAiB,QAAQ,EAAE,SAAS,SAAS,mCAOnE,CAAC;AAEF;;GAEG;AAGH,eAAO,MAAM,gBAAgB,WAAkB,mBAAmB,UAAU,mBAAmB,kBAG9F,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/network-manager",
3
- "version": "0.1.23",
3
+ "version": "0.1.24",
4
4
  "description": "Network Manager",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -25,20 +25,20 @@
25
25
  "simple-peer": "9.11.0",
26
26
  "ws": "^7.4.4",
27
27
  "xor-distance": "^2.0.0",
28
- "@dxos/async": "0.1.23",
29
- "@dxos/codec-protobuf": "0.1.23",
30
- "@dxos/context": "0.1.23",
31
- "@dxos/credentials": "0.1.23",
32
- "@dxos/crypto": "0.1.23",
33
- "@dxos/debug": "0.1.23",
34
- "@dxos/keys": "0.1.23",
35
- "@dxos/log": "0.1.23",
36
- "@dxos/messaging": "0.1.23",
37
- "@dxos/node-std": "0.1.23",
38
- "@dxos/protocols": "0.1.23",
39
- "@dxos/rpc": "0.1.23",
40
- "@dxos/teleport": "0.1.23",
41
- "@dxos/util": "0.1.23"
28
+ "@dxos/async": "0.1.24",
29
+ "@dxos/codec-protobuf": "0.1.24",
30
+ "@dxos/context": "0.1.24",
31
+ "@dxos/credentials": "0.1.24",
32
+ "@dxos/crypto": "0.1.24",
33
+ "@dxos/debug": "0.1.24",
34
+ "@dxos/keys": "0.1.24",
35
+ "@dxos/log": "0.1.24",
36
+ "@dxos/messaging": "0.1.24",
37
+ "@dxos/node-std": "0.1.24",
38
+ "@dxos/protocols": "0.1.24",
39
+ "@dxos/rpc": "0.1.24",
40
+ "@dxos/teleport": "0.1.24",
41
+ "@dxos/util": "0.1.24"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@swc-node/register": "^1.5.4",
@@ -48,7 +48,7 @@
48
48
  "earljs": "~0.1.10",
49
49
  "fast-check": "~3.3.0",
50
50
  "typescript": "^4.8.4",
51
- "@dxos/signal": "0.1.23"
51
+ "@dxos/signal": "0.1.24"
52
52
  },
53
53
  "publishConfig": {
54
54
  "access": "public"
@@ -34,7 +34,7 @@ export class ConnectionLog {
34
34
  return Array.from(this._swarms.values());
35
35
  }
36
36
 
37
- swarmJoined(swarm: Swarm) {
37
+ joinedSwarm(swarm: Swarm) {
38
38
  const info: SwarmInfo = {
39
39
  id: swarm.instanceId,
40
40
  topic: swarm.topic,
@@ -95,7 +95,7 @@ export class ConnectionLog {
95
95
  });
96
96
  }
97
97
 
98
- swarmLeft(swarm: Swarm) {
98
+ leftSwarm(swarm: Swarm) {
99
99
  this.getSwarmInfo(swarm.instanceId).isActive = false;
100
100
  this.update.emit();
101
101
  }
@@ -170,7 +170,7 @@ export class NetworkManager {
170
170
  this._mappers.set(topic, new SwarmMapper(swarm));
171
171
 
172
172
  this.topicsUpdated.emit();
173
- this._connectionLog?.swarmJoined(swarm);
173
+ this._connectionLog?.joinedSwarm(swarm);
174
174
  log('joined', { topic: PublicKey.from(topic), count: this._swarms.size });
175
175
 
176
176
  return {
@@ -195,7 +195,7 @@ export class NetworkManager {
195
195
  map.destroy();
196
196
  this._mappers.delete(topic);
197
197
 
198
- this._connectionLog?.swarmLeft(swarm);
198
+ this._connectionLog?.leftSwarm(swarm);
199
199
 
200
200
  await swarm.destroy();
201
201
  this._swarms.delete(topic);
@@ -221,8 +221,8 @@ export class NetworkManager {
221
221
  case ConnectionState.ONLINE: {
222
222
  this._connectionState = state;
223
223
  // go online
224
- await Promise.all([...this._swarms.values()].map((swarm) => swarm.goOnline()));
225
224
  this._messenger.open();
225
+ await Promise.all([...this._swarms.values()].map((swarm) => swarm.goOnline()));
226
226
  await this._signalManager.open();
227
227
  break;
228
228
  }
@@ -152,7 +152,7 @@ export class Swarm {
152
152
  log('swarm event', { swarmEvent }); // TODO(burdon): Stringify.
153
153
 
154
154
  if (this._ctx.disposed) {
155
- log.warn('ignored for offline swarm');
155
+ log('swarm event ignored for disposed swarm');
156
156
  return;
157
157
  }
158
158
 
@@ -181,7 +181,7 @@ export class Swarm {
181
181
  async onOffer(message: OfferMessage): Promise<Answer> {
182
182
  log('offer', { message });
183
183
  if (this._ctx.disposed) {
184
- log.info('ignored for offline swarm');
184
+ log('ignored for disposed swarm');
185
185
  return { accept: false };
186
186
  }
187
187
 
@@ -5,6 +5,7 @@
5
5
  import { expect } from 'chai';
6
6
  import waitForExpect from 'wait-for-expect';
7
7
 
8
+ import { asyncTimeout } from '@dxos/async';
8
9
  import { PublicKey } from '@dxos/keys';
9
10
  import { log } from '@dxos/log';
10
11
  import { afterTest, test } from '@dxos/test';
@@ -76,7 +77,7 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
76
77
  }
77
78
  });
78
79
 
79
- test.skip('joins multiple swarms', async () => {
80
+ test('joins multiple swarms', async () => {
80
81
  // TODO(burdon): N peers.
81
82
  // TODO(burdon): Merge with test below.
82
83
  const peer1 = testBuilder.createPeer();
@@ -88,7 +89,7 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
88
89
  expect(topics).to.have.length(numSwarms);
89
90
  });
90
91
 
91
- test.skip('joins multiple swarms concurrently', async () => {
92
+ test('joins multiple swarms concurrently', async () => {
92
93
  const createSwarm = async () => {
93
94
  const topicA = PublicKey.random();
94
95
  const peer1a = testBuilder.createPeer();
@@ -106,75 +107,83 @@ export const basicTestSuite = (testBuilder: TestBuilder, runTests = true) => {
106
107
 
107
108
  await Promise.all([
108
109
  test1.swarm1a.protocol.testConnection(test1.peer2a.peerId),
109
- test2.swarm1a.protocol.testConnection(test1.peer2a.peerId)
110
+ test2.swarm1a.protocol.testConnection(test2.peer2a.peerId)
110
111
  ]);
111
112
  });
112
113
 
113
- // TODO(mykola): Flaky test because of test signal server.
114
- test
115
- .skip('going offline and back online', async () => {
116
- const peer1 = testBuilder.createPeer();
117
- const peer2 = testBuilder.createPeer();
118
- await openAndCloseAfterTest([peer1, peer2]);
114
+ test('going offline and back online', async () => {
115
+ const peer1 = testBuilder.createPeer();
116
+ const peer2 = testBuilder.createPeer();
117
+ await openAndCloseAfterTest([peer1, peer2]);
119
118
 
120
- const topic = PublicKey.random();
119
+ const topic = PublicKey.random();
121
120
 
122
- const [swarm1, swarm2] = await joinSwarm([peer1, peer2], topic);
123
- await exchangeMessages(swarm1, swarm2);
121
+ const [swarm1, swarm2] = await joinSwarm([peer1, peer2], topic);
122
+ await exchangeMessages(swarm1, swarm2);
124
123
 
125
- //
126
- // Going offline and back online
127
- //
128
- const connectionDropped = peer2._networkManager
129
- .getSwarm(topic)
130
- ?.disconnected.waitFor((peerId) => peerId.equals(peer1.peerId));
124
+ //
125
+ // Going offline and back online
126
+ //
127
+ const connectionDropped = peer2._networkManager
128
+ .getSwarm(topic)
129
+ ?.disconnected.waitFor((peerId) => peerId.equals(peer1.peerId));
131
130
 
132
- const peerLeft = peer2._networkManager.signalManager.swarmEvent.waitFor(
133
- (event) => !!event.swarmEvent.peerLeft && peer1.peerId.equals(event.swarmEvent.peerLeft?.peer)
134
- );
131
+ const peerLeft = peer2._networkManager.signalManager.swarmEvent.waitFor(
132
+ (event) => !!event.swarmEvent.peerLeft && peer1.peerId.equals(event.swarmEvent.peerLeft?.peer)
133
+ );
135
134
 
136
- await peer1.goOffline();
137
- await connectionDropped;
138
- await peerLeft;
135
+ await peer1.goOffline();
136
+ await connectionDropped;
137
+ await peerLeft;
139
138
 
140
- // Wait for peer to be removed from the swarm.
141
- await waitForExpect(() => {
142
- expect(!!peer2._networkManager.getSwarm(topic)!._peers.get(peer1.peerId)?.advertizing).to.be.false;
143
- }, 1_000);
139
+ // Wait for peer to be removed from the swarm.
140
+ await waitForExpect(() => {
141
+ expect(!!peer2._networkManager.getSwarm(topic)!._peers.get(peer1.peerId)?.advertizing).to.be.false;
142
+ }, 1_000);
144
143
 
145
- await peer1.goOnline();
144
+ await peer1.goOnline();
146
145
 
147
- await waitForExpect(() => {
148
- expect(peer1._networkManager.getSwarm(topic)?._peers.get(peer2.peerId)?.advertizing).to.be.true;
146
+ await waitForExpect(() => {
147
+ expect(peer1._networkManager.getSwarm(topic)?._peers.get(peer2.peerId)?.advertizing).to.be.true;
149
148
 
150
- expect(peer2._networkManager.getSwarm(topic)?._peers.get(peer1.peerId)?.advertizing).to.be.true;
151
- }, 2_000);
149
+ expect(peer2._networkManager.getSwarm(topic)?._peers.get(peer1.peerId)?.advertizing).to.be.true;
150
+ }, 2_000);
152
151
 
153
- await exchangeMessages(swarm1, swarm2);
154
- await leaveSwarm([peer1, peer2], topic);
155
- })
152
+ await exchangeMessages(swarm1, swarm2);
153
+ await leaveSwarm([peer1, peer2], topic);
154
+ })
155
+ .tag('e2e')
156
156
  .timeout(2_000);
157
157
 
158
- // TODO(mykola): broken.
158
+ // TODO(mykola): Fails with large amount of peers ~10.
159
+ // Time wasted: 1 hour (increment when you work on it).
159
160
  test.skip('many peers and connections', async () => {
160
- const numTopics = 5;
161
- const peersPerTopic = 5;
162
-
163
- await Promise.all(
164
- range(numTopics).map(async () => {
165
- const topic = PublicKey.random();
166
-
167
- await Promise.all(
168
- range(peersPerTopic).map(async () => {
169
- const peer = testBuilder.createPeer();
170
- await openAndCloseAfterTest([peer]);
171
- const swarm = await peer.createSwarm(topic).join();
172
- await swarm.protocol.connected.waitForCondition(
173
- () => swarm.protocol.connections.size === peersPerTopic - 1
174
- );
175
- })
176
- );
177
- })
161
+ const numTopics = 2;
162
+ const peersPerTopic = 3;
163
+ const swarmsAllPeersConnected: Promise<any>[] = [];
164
+
165
+ await asyncTimeout(
166
+ Promise.all(
167
+ range(numTopics).map(async () => {
168
+ const topic = PublicKey.random();
169
+
170
+ return Promise.all(
171
+ range(peersPerTopic).map(async () => {
172
+ const peer = testBuilder.createPeer();
173
+ await openAndCloseAfterTest([peer]);
174
+ const swarm = peer.createSwarm(topic);
175
+
176
+ swarmsAllPeersConnected.push(
177
+ swarm.protocol.connected.waitFor(() => swarm.protocol.connections.size === peersPerTopic - 1)
178
+ );
179
+ await swarm.join();
180
+ })
181
+ );
182
+ })
183
+ ),
184
+ 2_000
178
185
  );
186
+
187
+ await asyncTimeout(Promise.all(swarmsAllPeersConnected), 2_000);
179
188
  });
180
189
  };
@@ -2,6 +2,7 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
+ import { asyncTimeout } from '@dxos/async';
5
6
  import { PublicKey } from '@dxos/keys';
6
7
  import { afterTest } from '@dxos/test';
7
8
  import { Provider } from '@dxos/util';
@@ -19,7 +20,7 @@ import { Topology } from '../topology';
19
20
  export const openAndCloseAfterTest = async (peers: TestPeer[]) => {
20
21
  await Promise.all(peers.map((peer) => peer.open()));
21
22
  afterTest(async () => {
22
- await Promise.all(peers.map((peer) => peer.close()));
23
+ await asyncTimeout(Promise.all(peers.map((peer) => peer.close())), 1_000);
23
24
  });
24
25
  };
25
26
 
@@ -16,8 +16,7 @@ import { afterAll, afterTest, beforeAll, describe, test } from '@dxos/test';
16
16
  import { WebRTCTransportProxy } from './webrtc-transport-proxy';
17
17
  import { WebRTCTransportService } from './webrtc-transport-service';
18
18
 
19
- // TODO(burdon): Flaky.
20
- describe.skip('WebRTCTransportProxy', () => {
19
+ describe('WebRTCTransportProxy', () => {
21
20
  const setupProxy = async ({
22
21
  initiator = true,
23
22
  stream = new TestStream(),
@@ -91,7 +90,7 @@ describe.skip('WebRTCTransportProxy', () => {
91
90
  expect(callsCounter).toEqual(1);
92
91
  })
93
92
  .timeout(1_000)
94
- .retries(3);
93
+ .tag('e2e');
95
94
 
96
95
  test('establish connection and send data through with protocol', async () => {
97
96
  const stream1 = new TestStream();
@@ -118,7 +117,7 @@ describe.skip('WebRTCTransportProxy', () => {
118
117
  await TestStream.assertConnectivity(stream1, stream2);
119
118
  })
120
119
  .timeout(2_000)
121
- .retries(3);
120
+ .tag('e2e');
122
121
 
123
122
  describe('Multiplexing', () => {
124
123
  let service: any;
@@ -186,7 +185,7 @@ describe.skip('WebRTCTransportProxy', () => {
186
185
 
187
186
  await TestStream.assertConnectivity(stream1, stream2);
188
187
  })
189
- .timeout(5_000)
190
- .retries(3);
188
+ .timeout(3_000)
189
+ .tag('e2e');
191
190
  });
192
191
  });