@dxos/network-manager 0.4.10-main.ef6fbc2 → 0.4.10-main.f635fb0

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 (45) hide show
  1. package/dist/lib/browser/{chunk-OIR45T43.mjs → chunk-OSMVZUEK.mjs} +464 -425
  2. package/dist/lib/browser/chunk-OSMVZUEK.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +1 -1
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/browser/testing/index.mjs +1 -1
  6. package/dist/lib/node/{chunk-HUPX2JGP.cjs → chunk-M4CGCR2I.cjs} +480 -440
  7. package/dist/lib/node/chunk-M4CGCR2I.cjs.map +7 -0
  8. package/dist/lib/node/index.cjs +27 -27
  9. package/dist/lib/node/index.cjs.map +1 -1
  10. package/dist/lib/node/meta.json +1 -1
  11. package/dist/lib/node/testing/index.cjs +18 -18
  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/transport/libdatachannel-transport.d.ts +20 -19
  15. package/dist/types/src/transport/libdatachannel-transport.d.ts.map +1 -1
  16. package/dist/types/src/transport/memory-transport.d.ts +17 -10
  17. package/dist/types/src/transport/memory-transport.d.ts.map +1 -1
  18. package/dist/types/src/transport/simplepeer-transport-proxy.d.ts +7 -9
  19. package/dist/types/src/transport/simplepeer-transport-proxy.d.ts.map +1 -1
  20. package/dist/types/src/transport/simplepeer-transport-service.d.ts.map +1 -1
  21. package/dist/types/src/transport/simplepeer-transport.d.ts +9 -11
  22. package/dist/types/src/transport/simplepeer-transport.d.ts.map +1 -1
  23. package/dist/types/src/transport/tcp-transport.browser.d.ts +7 -2
  24. package/dist/types/src/transport/tcp-transport.browser.d.ts.map +1 -1
  25. package/dist/types/src/transport/tcp-transport.d.ts +6 -4
  26. package/dist/types/src/transport/tcp-transport.d.ts.map +1 -1
  27. package/dist/types/src/transport/transport.d.ts +18 -12
  28. package/dist/types/src/transport/transport.d.ts.map +1 -1
  29. package/package.json +17 -17
  30. package/src/swarm/connection.ts +7 -5
  31. package/src/swarm/peer.ts +0 -1
  32. package/src/transport/libdatachannel-transport.test.ts +14 -9
  33. package/src/transport/libdatachannel-transport.ts +226 -204
  34. package/src/transport/memory-transport.test.ts +10 -7
  35. package/src/transport/memory-transport.ts +49 -42
  36. package/src/transport/simplepeer-transport-proxy-test.ts +13 -8
  37. package/src/transport/simplepeer-transport-proxy.ts +48 -49
  38. package/src/transport/simplepeer-transport-service.ts +5 -2
  39. package/src/transport/simplepeer-transport.test.ts +9 -5
  40. package/src/transport/simplepeer-transport.ts +25 -25
  41. package/src/transport/tcp-transport.browser.ts +10 -5
  42. package/src/transport/tcp-transport.ts +31 -22
  43. package/src/transport/transport.ts +25 -14
  44. package/dist/lib/browser/chunk-OIR45T43.mjs.map +0 -7
  45. package/dist/lib/node/chunk-HUPX2JGP.cjs.map +0 -7
@@ -12,7 +12,7 @@ import { type Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
12
12
  import { type Transport, type TransportFactory, type TransportOptions, type TransportStats } from './transport';
13
13
 
14
14
  export const TcpTransportFactory: TransportFactory = {
15
- createTransport: (params) => new TcpTransport(params),
15
+ createTransport: (options) => new TcpTransport(options),
16
16
  };
17
17
 
18
18
  /**
@@ -22,23 +22,28 @@ export class TcpTransport implements Transport {
22
22
  private _server?: Server = undefined;
23
23
  private _socket?: Socket = undefined;
24
24
 
25
+ private _connected = false;
26
+ private _closed = false;
27
+
25
28
  public readonly closed = new Event<void>();
26
29
  public readonly connected = new Event<void>();
27
30
  public readonly errors = new ErrorStream();
28
31
 
29
- private _destroyed = false;
32
+ constructor(private readonly options: TransportOptions) {}
30
33
 
31
- private _connected = false;
34
+ get isOpen() {
35
+ return this._connected && !this._closed;
36
+ }
32
37
 
33
- constructor(private readonly options: TransportOptions) {
34
- log('creating');
38
+ async open() {
39
+ log('opening');
35
40
 
36
41
  // Initiator will send a signal, the receiver will receive the unique ID and connect the streams.
37
42
  if (this.options.initiator) {
38
- // prettier-ignore
43
+ // TODO(burdon): Why timeout?
39
44
  setTimeout(async () => {
40
45
  const { Server } = await import('node:net');
41
- this._server = new Server(socket => {
46
+ this._server = new Server((socket) => {
42
47
  log('new connection');
43
48
  if (this._connected) {
44
49
  socket.destroy();
@@ -49,17 +54,18 @@ export class TcpTransport implements Transport {
49
54
  this._server.on('listening', () => {
50
55
  const { port } = this._server!.address() as AddressInfo;
51
56
  log('listening', { port });
52
- void this.options.sendSignal({
53
- payload: { port }
54
- }).catch(err => {
55
- if (!this._destroyed) {
56
- this.errors.raise(err);
57
- }
58
- });
59
-
57
+ void this.options
58
+ .sendSignal({
59
+ payload: { port },
60
+ })
61
+ .catch((err) => {
62
+ if (!this._closed) {
63
+ this.errors.raise(err);
64
+ }
65
+ });
60
66
  });
61
67
 
62
- this._server.on('error', err => {
68
+ this._server.on('error', (err) => {
63
69
  this.errors.raise(err);
64
70
  });
65
71
 
@@ -68,15 +74,14 @@ export class TcpTransport implements Transport {
68
74
  }
69
75
  }
70
76
 
71
- async destroy(): Promise<void> {
77
+ async close() {
72
78
  log('closing');
73
79
  this._socket?.destroy();
74
80
  this._server?.close();
75
-
76
- this._destroyed = true;
81
+ this._closed = true;
77
82
  }
78
83
 
79
- signal({ payload }: Signal) {
84
+ async onSignal({ payload }: Signal) {
80
85
  log('received signal', { payload });
81
86
  if (this.options.initiator || this._connected) {
82
87
  return;
@@ -92,6 +97,7 @@ export class TcpTransport implements Transport {
92
97
  const { port, address } = this._server?.address() as AddressInfo;
93
98
  return `LISTEN ${address}:${port}`;
94
99
  }
100
+
95
101
  const { port, address } = this._socket?.address() as AddressInfo;
96
102
  return `ACCEPT ${address}:${port}`;
97
103
  }
@@ -108,18 +114,21 @@ export class TcpTransport implements Transport {
108
114
  private _handleSocket(socket: Socket) {
109
115
  log('handling socket', { remotePort: socket.remotePort, localPort: socket.localPort });
110
116
  this._socket = socket;
111
- this.connected.emit();
112
- this.options.stream.pipe(this._socket!).pipe(this.options.stream);
113
117
 
114
118
  this._socket.on('connect', () => {
115
119
  log('connected to', { port: this._socket?.remotePort });
116
120
  this._connected = true;
117
121
  });
122
+
118
123
  this._socket.on('error', (err) => {
119
124
  this.errors.raise(err);
120
125
  });
126
+
121
127
  this._socket.on('close', () => {
122
128
  this.closed.emit();
123
129
  });
130
+
131
+ this.connected.emit();
132
+ this.options.stream.pipe(this._socket!).pipe(this.options.stream);
124
133
  }
125
134
  }
@@ -9,32 +9,46 @@ import { type Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
9
9
 
10
10
  export enum TransportKind {
11
11
  SIMPLE_PEER = 'SIMPLE_PEER',
12
- LIBDATACHANNEL = 'LIBDATACHANNEL',
13
12
  SIMPLE_PEER_PROXY = 'SIMPLE_PEER_PROXY',
13
+ LIBDATACHANNEL = 'LIBDATACHANNEL',
14
14
  MEMORY = 'MEMORY',
15
15
  TCP = 'TCP',
16
16
  }
17
17
 
18
18
  /**
19
- * Abstraction over a P2P connection transport. Currently either WebRTC or in-memory.
19
+ * Abstraction over a P2P connection transport.
20
+ * Currently, WebRTC or in-memory.
20
21
  */
22
+ // TODO(burdon): Create abstract base class for common logging and error handling?
21
23
  export interface Transport {
22
24
  closed: Event;
23
25
  connected: Event;
24
26
  errors: ErrorStream;
25
27
 
28
+ open(): Promise<void>;
29
+ close(): Promise<void>;
30
+
31
+ get isOpen(): boolean;
32
+
26
33
  /**
27
- * Transport-specfic stats.
34
+ * Handle message from signaling.
35
+ */
36
+ onSignal(signal: Signal): Promise<void>;
37
+
38
+ /**
39
+ * Transport-specific stats.
28
40
  */
29
41
  getStats(): Promise<TransportStats>;
42
+
30
43
  /**
31
- * Transport-specfic connection details.
44
+ * Transport-specific connection details.
32
45
  */
33
46
  getDetails(): Promise<string>;
34
- destroy(): Promise<void>;
35
- signal(signal: Signal): void;
36
47
  }
37
48
 
49
+ /**
50
+ * Common options for all transports.
51
+ */
38
52
  export type TransportOptions = {
39
53
  /**
40
54
  * Did local node initiate this connection.
@@ -42,23 +56,20 @@ export type TransportOptions = {
42
56
  initiator: boolean;
43
57
 
44
58
  /**
45
- * Wire protocol.
59
+ * Wire protocol for data stream.
46
60
  */
47
61
  stream: NodeJS.ReadWriteStream;
48
62
 
49
63
  /**
50
- * Send a signal message to remote peer.
64
+ * Sends signal message to remote peer.
51
65
  */
52
- sendSignal: (signal: Signal) => Promise<void>; // TODO(burdon): Remove async?
53
-
54
- timeout?: number;
66
+ sendSignal: (signal: Signal) => Promise<void>;
55
67
 
56
68
  sessionId?: PublicKey;
69
+
70
+ timeout?: number;
57
71
  };
58
72
 
59
- /**
60
- *
61
- */
62
73
  export interface TransportFactory {
63
74
  createTransport(options: TransportOptions): Transport;
64
75
  }