@dxos/network-manager 2.12.16 → 2.12.20

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 (71) hide show
  1. package/dist/browser-mocha/bundle.js +31463 -10909
  2. package/dist/src/connection-log.d.ts +43 -0
  3. package/dist/src/connection-log.d.ts.map +1 -0
  4. package/dist/src/connection-log.js +89 -0
  5. package/dist/src/connection-log.js.map +1 -0
  6. package/dist/src/index.d.ts +2 -0
  7. package/dist/src/index.d.ts.map +1 -1
  8. package/dist/src/index.js +2 -0
  9. package/dist/src/index.js.map +1 -1
  10. package/dist/src/network-manager.blueprint-test.d.ts.map +1 -1
  11. package/dist/src/network-manager.blueprint-test.js +2 -0
  12. package/dist/src/network-manager.blueprint-test.js.map +1 -1
  13. package/dist/src/network-manager.d.ts +7 -0
  14. package/dist/src/network-manager.d.ts.map +1 -1
  15. package/dist/src/network-manager.js +15 -3
  16. package/dist/src/network-manager.js.map +1 -1
  17. package/dist/src/presence.test.js +1 -0
  18. package/dist/src/presence.test.js.map +1 -1
  19. package/dist/src/signal/in-memory-signal-manager.d.ts +1 -0
  20. package/dist/src/signal/in-memory-signal-manager.d.ts.map +1 -1
  21. package/dist/src/signal/in-memory-signal-manager.js +1 -0
  22. package/dist/src/signal/in-memory-signal-manager.js.map +1 -1
  23. package/dist/src/signal/interface.d.ts +1 -0
  24. package/dist/src/signal/interface.d.ts.map +1 -1
  25. package/dist/src/signal/signal-api.d.ts.map +1 -1
  26. package/dist/src/signal/signal-api.js +3 -0
  27. package/dist/src/signal/signal-api.js.map +1 -1
  28. package/dist/src/signal/websocket-signal-manager.d.ts +1 -0
  29. package/dist/src/signal/websocket-signal-manager.d.ts.map +1 -1
  30. package/dist/src/signal/websocket-signal-manager.js +3 -0
  31. package/dist/src/signal/websocket-signal-manager.js.map +1 -1
  32. package/dist/src/swarm/connection.d.ts +1 -0
  33. package/dist/src/swarm/connection.d.ts.map +1 -1
  34. package/dist/src/swarm/connection.js +3 -0
  35. package/dist/src/swarm/connection.js.map +1 -1
  36. package/dist/src/swarm/swarm.d.ts +6 -0
  37. package/dist/src/swarm/swarm.d.ts.map +1 -1
  38. package/dist/src/swarm/swarm.js +7 -0
  39. package/dist/src/swarm/swarm.js.map +1 -1
  40. package/dist/src/transport/webrtc-transport.d.ts +1 -1
  41. package/dist/src/transport/webrtc-transport.d.ts.map +1 -1
  42. package/dist/src/transport/webrtc-transport.js +3 -3
  43. package/dist/src/transport/webrtc-transport.js.map +1 -1
  44. package/dist/src/transport/webrtc-transport.test.js +4 -3
  45. package/dist/src/transport/webrtc-transport.test.js.map +1 -1
  46. package/dist/src/transport/wrtc-simple-peer.test.d.ts +2 -0
  47. package/dist/src/transport/wrtc-simple-peer.test.d.ts.map +1 -0
  48. package/dist/src/transport/wrtc-simple-peer.test.js +24 -0
  49. package/dist/src/transport/wrtc-simple-peer.test.js.map +1 -0
  50. package/dist/src/types.d.ts +6 -0
  51. package/dist/src/types.d.ts.map +1 -0
  52. package/dist/src/types.js +6 -0
  53. package/dist/src/types.js.map +1 -0
  54. package/dist/tsconfig.tsbuildinfo +1 -1
  55. package/package.json +12 -11
  56. package/src/connection-log.ts +124 -0
  57. package/src/index.ts +2 -0
  58. package/src/network-manager.blueprint-test.ts +2 -0
  59. package/src/network-manager.ts +23 -3
  60. package/src/presence.test.ts +1 -0
  61. package/src/{types.d.ts → shims.d.ts} +0 -0
  62. package/src/signal/in-memory-signal-manager.ts +2 -0
  63. package/src/signal/interface.ts +2 -0
  64. package/src/signal/signal-api.ts +3 -0
  65. package/src/signal/websocket-signal-manager.ts +4 -0
  66. package/src/swarm/connection.ts +4 -0
  67. package/src/swarm/swarm.ts +11 -1
  68. package/src/transport/webrtc-transport.test.ts +4 -3
  69. package/src/transport/webrtc-transport.ts +3 -3
  70. package/src/transport/wrtc-simple-peer.test.ts +23 -0
  71. package/src/types.ts +10 -0
@@ -20,6 +20,7 @@ const createPeer = (topic: PublicKey) => {
20
20
  afterTest(() => networkManager.destroy());
21
21
 
22
22
  const presencePlugin = new PresencePlugin(peerId.asBuffer());
23
+ afterTest(() => presencePlugin.stop());
23
24
 
24
25
  networkManager.joinProtocolSwarm({
25
26
  peerId,
File without changes
@@ -58,6 +58,8 @@ export class InMemorySignalManager implements SignalManager {
58
58
  assert(state.connections.get(msg.remoteId), 'Peer not connected');
59
59
  state.connections.get(msg.remoteId)!.onSignal.emit(msg);
60
60
  }
61
+
62
+ async destroy () {}
61
63
  }
62
64
 
63
65
  // This is global state for the in-memory signal manager.
@@ -27,4 +27,6 @@ export interface SignalManager {
27
27
  offer (msg: SignalApi.SignalMessage): Promise<SignalApi.Answer>;
28
28
 
29
29
  signal (msg: SignalApi.SignalMessage): void;
30
+
31
+ destroy(): Promise<void>;
30
32
  }
@@ -141,6 +141,9 @@ export class SignalApi {
141
141
  console.error('Signal api already reconnecting.');
142
142
  return;
143
143
  }
144
+ if (this._state === SignalApi.State.CLOSED) {
145
+ return;
146
+ }
144
147
 
145
148
  this._reconnectIntervalId = setTimeout(() => {
146
149
  this._reconnectIntervalId = undefined;
@@ -151,6 +151,10 @@ export class WebsocketSignalManager implements SignalManager {
151
151
  }
152
152
  }
153
153
 
154
+ async destroy () {
155
+ await Promise.all(Array.from(this._servers.values()).map(server => server.close()));
156
+ }
157
+
154
158
  peerCandidatesChanged = new Event<[topic: PublicKey, candidates: PublicKey[]]>()
155
159
 
156
160
  onSignal = new Event<SignalApi.SignalMessage>();
@@ -75,6 +75,10 @@ export class Connection {
75
75
  return this._transport;
76
76
  }
77
77
 
78
+ get protocol () {
79
+ return this._protocol;
80
+ }
81
+
78
82
  connect () {
79
83
  assert(this._state === ConnectionState.INITIAL, 'Invalid state.');
80
84
 
@@ -10,6 +10,7 @@ import { discoveryKey, PublicKey } from '@dxos/crypto';
10
10
  import { ErrorStream } from '@dxos/debug';
11
11
  import { ComplexMap, ComplexSet } from '@dxos/util';
12
12
 
13
+ import { Topic } from '..';
13
14
  import { ProtocolProvider } from '../network-manager';
14
15
  import { SignalApi } from '../signal';
15
16
  import { SwarmController, Topology } from '../topology';
@@ -24,6 +25,11 @@ const log = debug('dxos:network-manager:swarm');
24
25
  * Routes signal events and maintains swarm topology.
25
26
  */
26
27
  export class Swarm {
28
+ /**
29
+ * Unique id of the swarm, local to the current peer, generated when swarm is joined.
30
+ */
31
+ readonly id = PublicKey.random();
32
+
27
33
  private readonly _connections = new ComplexMap<PublicKey, Connection>(x => x.toHex());
28
34
 
29
35
  private readonly _discoveredPeers = new ComplexSet<PublicKey>(x => x.toHex());
@@ -77,6 +83,10 @@ export class Swarm {
77
83
  return this._label;
78
84
  }
79
85
 
86
+ get topic (): Topic {
87
+ return this._topic;
88
+ }
89
+
80
90
  onPeerCandidatesChanged (candidates: PublicKey[]) {
81
91
  log(`New peers for ${this._topic} ${candidates}`);
82
92
  this._discoveredPeers.clear();
@@ -118,7 +128,7 @@ export class Swarm {
118
128
  const connection = this._createConnection(false, message.id, message.sessionId);
119
129
  try {
120
130
  connection.connect();
121
- } catch (err) {
131
+ } catch (err: any) {
122
132
  this.errors.raise(err);
123
133
  }
124
134
  accept = true;
@@ -4,6 +4,7 @@
4
4
 
5
5
  import expect from 'expect';
6
6
  import { it as test } from 'mocha';
7
+ import { Duplex } from 'stream';
7
8
  import waitForExpect from 'wait-for-expect';
8
9
 
9
10
  import { sleep } from '@dxos/async';
@@ -14,12 +15,12 @@ import { afterTest } from '@dxos/testutils';
14
15
  import { TestProtocolPlugin, testProtocolProvider } from '../testing/test-protocol';
15
16
  import { WebrtcTransport } from './webrtc-transport';
16
17
 
17
- describe('WebrtcConnection', () => {
18
- // This doesn't clean up correctly and crashes with SIGSEGV at the end. Probably an issue with wrtc package.
18
+ describe('WebrtcTransport', () => {
19
+ // This doesn't clean up correctly and crashes with SIGSEGV / SIGABRT at the end. Probably an issue with wrtc package.
19
20
  test('open and close', async () => {
20
21
  const connection = new WebrtcTransport(
21
22
  true,
22
- new Protocol().stream,
23
+ new Duplex(),
23
24
  PublicKey.random(),
24
25
  PublicKey.random(),
25
26
  PublicKey.random(),
@@ -72,7 +72,7 @@ export class WebrtcTransport implements Transport {
72
72
  });
73
73
  this._peer.on('close', async () => {
74
74
  log(`Connection closed ${this._ownId} -> ${this._remoteId}`);
75
- await this._closeStream();
75
+ await this._disconnectStreams();
76
76
  this.closed.emit();
77
77
  });
78
78
  }
@@ -95,12 +95,12 @@ export class WebrtcTransport implements Transport {
95
95
  }
96
96
 
97
97
  async close () {
98
- await this._closeStream();
98
+ await this._disconnectStreams();
99
99
  this._peer!.destroy();
100
100
  log('Closed.');
101
101
  }
102
102
 
103
- private async _closeStream () {
103
+ private async _disconnectStreams () {
104
104
  this._stream.unpipe?.(this._peer)?.unpipe?.(this._stream); // TODO(rzadp): Find a way of unpiping this?
105
105
  }
106
106
  }
@@ -0,0 +1,23 @@
1
+ //
2
+ // Copyright 2020 DXOS.org
3
+ //
4
+
5
+ import { it as test } from 'mocha';
6
+ import SimplePeerConstructor from 'simple-peer';
7
+ import wrtc from 'wrtc';
8
+
9
+ import { sleep } from '@dxos/async';
10
+
11
+ describe('node wrtc and simple-peer', () => {
12
+ // Simplest test that reproduces SIGABRT (mac) and SIGSEGV (linux) in wrtc.
13
+ test.skip('open and close', async () => {
14
+ const peer = new SimplePeerConstructor({
15
+ initiator: true,
16
+ wrtc
17
+ });
18
+
19
+ await sleep(1);
20
+
21
+ await peer.destroy();
22
+ }).timeout(3_000);
23
+ });
package/src/types.ts ADDED
@@ -0,0 +1,10 @@
1
+ //
2
+ // Copyright 2021 DXOS.org
3
+ //
4
+
5
+ import { PublicKey } from '@dxos/crypto';
6
+
7
+ /**
8
+ * Swarm topic.
9
+ */
10
+ export type Topic = PublicKey