@dxos/network-manager 0.1.0
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.
- package/LICENSE +21 -0
- package/dist/src/connection-log.d.ts +23 -0
- package/dist/src/connection-log.d.ts.map +1 -0
- package/dist/src/connection-log.js +98 -0
- package/dist/src/connection-log.js.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +28 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/network-manager.d.ts +80 -0
- package/dist/src/network-manager.d.ts.map +1 -0
- package/dist/src/network-manager.js +123 -0
- package/dist/src/network-manager.js.map +1 -0
- package/dist/src/network-manager.test.d.ts +2 -0
- package/dist/src/network-manager.test.d.ts.map +1 -0
- package/dist/src/network-manager.test.js +621 -0
- package/dist/src/network-manager.test.js.map +1 -0
- package/dist/src/presence.test.d.ts +2 -0
- package/dist/src/presence.test.d.ts.map +1 -0
- package/dist/src/presence.test.js +60 -0
- package/dist/src/presence.test.js.map +1 -0
- package/dist/src/protocol-factory.d.ts +30 -0
- package/dist/src/protocol-factory.d.ts.map +1 -0
- package/dist/src/protocol-factory.js +64 -0
- package/dist/src/protocol-factory.js.map +1 -0
- package/dist/src/signal/index.d.ts +4 -0
- package/dist/src/signal/index.d.ts.map +1 -0
- package/dist/src/signal/index.js +23 -0
- package/dist/src/signal/index.js.map +1 -0
- package/dist/src/signal/integration.test.d.ts +2 -0
- package/dist/src/signal/integration.test.d.ts.map +1 -0
- package/dist/src/signal/integration.test.js +105 -0
- package/dist/src/signal/integration.test.js.map +1 -0
- package/dist/src/signal/message-router.d.ts +39 -0
- package/dist/src/signal/message-router.d.ts.map +1 -0
- package/dist/src/signal/message-router.js +135 -0
- package/dist/src/signal/message-router.js.map +1 -0
- package/dist/src/signal/message-router.test.d.ts +2 -0
- package/dist/src/signal/message-router.test.d.ts.map +1 -0
- package/dist/src/signal/message-router.test.js +211 -0
- package/dist/src/signal/message-router.test.js.map +1 -0
- package/dist/src/signal/signal-connection.d.ts +21 -0
- package/dist/src/signal/signal-connection.d.ts.map +1 -0
- package/dist/src/signal/signal-connection.js +6 -0
- package/dist/src/signal/signal-connection.js.map +1 -0
- package/dist/src/signal/signal-messaging.d.ts +34 -0
- package/dist/src/signal/signal-messaging.d.ts.map +1 -0
- package/dist/src/signal/signal-messaging.js +6 -0
- package/dist/src/signal/signal-messaging.js.map +1 -0
- package/dist/src/swarm/connection.d.ts +69 -0
- package/dist/src/swarm/connection.d.ts.map +1 -0
- package/dist/src/swarm/connection.js +187 -0
- package/dist/src/swarm/connection.js.map +1 -0
- package/dist/src/swarm/index.d.ts +4 -0
- package/dist/src/swarm/index.d.ts.map +1 -0
- package/dist/src/swarm/index.js +23 -0
- package/dist/src/swarm/index.js.map +1 -0
- package/dist/src/swarm/swarm-mapper.d.ts +30 -0
- package/dist/src/swarm/swarm-mapper.d.ts.map +1 -0
- package/dist/src/swarm/swarm-mapper.js +90 -0
- package/dist/src/swarm/swarm-mapper.js.map +1 -0
- package/dist/src/swarm/swarm.d.ts +64 -0
- package/dist/src/swarm/swarm.d.ts.map +1 -0
- package/dist/src/swarm/swarm.js +276 -0
- package/dist/src/swarm/swarm.js.map +1 -0
- package/dist/src/swarm/swarm.test.d.ts +2 -0
- package/dist/src/swarm/swarm.test.d.ts.map +1 -0
- package/dist/src/swarm/swarm.test.js +145 -0
- package/dist/src/swarm/swarm.test.js.map +1 -0
- package/dist/src/testing/index.d.ts +2 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +21 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/testing/test-protocol.d.ts +59 -0
- package/dist/src/testing/test-protocol.d.ts.map +1 -0
- package/dist/src/testing/test-protocol.js +140 -0
- package/dist/src/testing/test-protocol.js.map +1 -0
- package/dist/src/topology/fully-connected-topology.d.ts +11 -0
- package/dist/src/topology/fully-connected-topology.d.ts.map +1 -0
- package/dist/src/topology/fully-connected-topology.js +34 -0
- package/dist/src/topology/fully-connected-topology.js.map +1 -0
- package/dist/src/topology/index.d.ts +5 -0
- package/dist/src/topology/index.d.ts.map +1 -0
- package/dist/src/topology/index.js +24 -0
- package/dist/src/topology/index.js.map +1 -0
- package/dist/src/topology/mmst-topology.d.ts +31 -0
- package/dist/src/topology/mmst-topology.d.ts.map +1 -0
- package/dist/src/topology/mmst-topology.js +73 -0
- package/dist/src/topology/mmst-topology.js.map +1 -0
- package/dist/src/topology/star-topology.d.ts +13 -0
- package/dist/src/topology/star-topology.d.ts.map +1 -0
- package/dist/src/topology/star-topology.js +60 -0
- package/dist/src/topology/star-topology.js.map +1 -0
- package/dist/src/topology/topology.d.ts +56 -0
- package/dist/src/topology/topology.d.ts.map +1 -0
- package/dist/src/topology/topology.js +6 -0
- package/dist/src/topology/topology.js.map +1 -0
- package/dist/src/transport/index.d.ts +6 -0
- package/dist/src/transport/index.d.ts.map +1 -0
- package/dist/src/transport/index.js +25 -0
- package/dist/src/transport/index.js.map +1 -0
- package/dist/src/transport/memory-transport.d.ts +32 -0
- package/dist/src/transport/memory-transport.d.ts.map +1 -0
- package/dist/src/transport/memory-transport.js +98 -0
- package/dist/src/transport/memory-transport.js.map +1 -0
- package/dist/src/transport/memory-transport.test.d.ts +2 -0
- package/dist/src/transport/memory-transport.test.d.ts.map +1 -0
- package/dist/src/transport/memory-transport.test.js +84 -0
- package/dist/src/transport/memory-transport.test.js.map +1 -0
- package/dist/src/transport/transport.d.ts +38 -0
- package/dist/src/transport/transport.d.ts.map +1 -0
- package/dist/src/transport/transport.js +6 -0
- package/dist/src/transport/transport.js.map +1 -0
- package/dist/src/transport/webrtc-transport-proxy.d.ts +48 -0
- package/dist/src/transport/webrtc-transport-proxy.d.ts.map +1 -0
- package/dist/src/transport/webrtc-transport-proxy.js +139 -0
- package/dist/src/transport/webrtc-transport-proxy.js.map +1 -0
- package/dist/src/transport/webrtc-transport-proxy.test.d.ts +2 -0
- package/dist/src/transport/webrtc-transport-proxy.test.d.ts.map +1 -0
- package/dist/src/transport/webrtc-transport-proxy.test.js +245 -0
- package/dist/src/transport/webrtc-transport-proxy.test.js.map +1 -0
- package/dist/src/transport/webrtc-transport-service.d.ts +15 -0
- package/dist/src/transport/webrtc-transport-service.d.ts.map +1 -0
- package/dist/src/transport/webrtc-transport-service.js +97 -0
- package/dist/src/transport/webrtc-transport-service.js.map +1 -0
- package/dist/src/transport/webrtc-transport.d.ts +34 -0
- package/dist/src/transport/webrtc-transport.d.ts.map +1 -0
- package/dist/src/transport/webrtc-transport.js +100 -0
- package/dist/src/transport/webrtc-transport.js.map +1 -0
- package/dist/src/transport/webrtc-transport.test.d.ts +2 -0
- package/dist/src/transport/webrtc-transport.test.d.ts.map +1 -0
- package/dist/src/transport/webrtc-transport.test.js +80 -0
- package/dist/src/transport/webrtc-transport.test.js.map +1 -0
- package/dist/src/transport/webrtc.d.ts +6 -0
- package/dist/src/transport/webrtc.d.ts.map +1 -0
- package/dist/src/transport/webrtc.js +17 -0
- package/dist/src/transport/webrtc.js.map +1 -0
- package/dist/src/transport/wrtc-simple-peer.test.d.ts +2 -0
- package/dist/src/transport/wrtc-simple-peer.test.d.ts.map +1 -0
- package/dist/src/transport/wrtc-simple-peer.test.js +24 -0
- package/dist/src/transport/wrtc-simple-peer.test.js.map +1 -0
- package/dist/src/types.d.ts +6 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +6 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +58 -0
- package/src/connection-log.ts +102 -0
- package/src/globals.d.ts +7 -0
- package/src/index.ts +12 -0
- package/src/network-manager.test.ts +764 -0
- package/src/network-manager.ts +204 -0
- package/src/presence.test.ts +78 -0
- package/src/protocol-factory.ts +83 -0
- package/src/signal/index.ts +7 -0
- package/src/signal/integration.test.ts +129 -0
- package/src/signal/message-router.test.ts +274 -0
- package/src/signal/message-router.ts +200 -0
- package/src/signal/signal-connection.ts +20 -0
- package/src/signal/signal-messaging.ts +38 -0
- package/src/swarm/connection.ts +206 -0
- package/src/swarm/index.ts +7 -0
- package/src/swarm/swarm-mapper.ts +120 -0
- package/src/swarm/swarm.test.ts +192 -0
- package/src/swarm/swarm.ts +328 -0
- package/src/testing/index.ts +5 -0
- package/src/testing/test-protocol.ts +160 -0
- package/src/topology/fully-connected-topology.ts +38 -0
- package/src/topology/index.ts +8 -0
- package/src/topology/mmst-topology.ts +105 -0
- package/src/topology/star-topology.ts +67 -0
- package/src/topology/topology.ts +69 -0
- package/src/transport/index.ts +9 -0
- package/src/transport/memory-transport.test.ts +110 -0
- package/src/transport/memory-transport.ts +128 -0
- package/src/transport/transport.ts +47 -0
- package/src/transport/webrtc-transport-proxy.test.ts +290 -0
- package/src/transport/webrtc-transport-proxy.ts +167 -0
- package/src/transport/webrtc-transport-service.ts +115 -0
- package/src/transport/webrtc-transport.test.ts +112 -0
- package/src/transport/webrtc-transport.ts +122 -0
- package/src/transport/webrtc.ts +15 -0
- package/src/transport/wrtc-simple-peer.test.ts +24 -0
- package/src/types.ts +10 -0
- package/src/typings.d.ts +7 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2020 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import assert from 'node:assert';
|
|
6
|
+
import SimplePeerConstructor, { Instance as SimplePeer } from 'simple-peer';
|
|
7
|
+
|
|
8
|
+
import { Event } from '@dxos/async';
|
|
9
|
+
import { ErrorStream, raise } from '@dxos/debug';
|
|
10
|
+
import { PublicKey } from '@dxos/keys';
|
|
11
|
+
import { log } from '@dxos/log';
|
|
12
|
+
import { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
13
|
+
|
|
14
|
+
import { SignalMessage } from '../signal';
|
|
15
|
+
import { Transport, TransportFactory } from './transport';
|
|
16
|
+
import { wrtc } from './webrtc';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Implements Transport for WebRTC. Uses simple-peer under the hood.
|
|
20
|
+
*/
|
|
21
|
+
export class WebRTCTransport implements Transport {
|
|
22
|
+
private readonly _peer: SimplePeer;
|
|
23
|
+
|
|
24
|
+
readonly closed = new Event();
|
|
25
|
+
readonly connected = new Event();
|
|
26
|
+
readonly errors = new ErrorStream();
|
|
27
|
+
|
|
28
|
+
constructor(
|
|
29
|
+
private readonly _initiator: boolean,
|
|
30
|
+
private readonly _stream: NodeJS.ReadWriteStream,
|
|
31
|
+
private readonly _ownId: PublicKey,
|
|
32
|
+
private readonly _remoteId: PublicKey,
|
|
33
|
+
private readonly _sessionId: PublicKey,
|
|
34
|
+
private readonly _topic: PublicKey,
|
|
35
|
+
private readonly _sendSignal: (msg: SignalMessage) => void,
|
|
36
|
+
private readonly _webrtcConfig?: any
|
|
37
|
+
) {
|
|
38
|
+
log(`Created WebRTC connection ${this._ownId} -> ${this._remoteId} initiator=${this._initiator}`);
|
|
39
|
+
|
|
40
|
+
log(
|
|
41
|
+
`Creating WebRTC connection topic=${this._topic} ownId=${this._ownId} remoteId=${this._remoteId} initiator=${
|
|
42
|
+
this._initiator
|
|
43
|
+
} webrtcConfig=${JSON.stringify(this._webrtcConfig)}`
|
|
44
|
+
);
|
|
45
|
+
this._peer = new SimplePeerConstructor({
|
|
46
|
+
initiator: this._initiator,
|
|
47
|
+
wrtc: SimplePeerConstructor.WEBRTC_SUPPORT ? undefined : wrtc ?? raise(new Error('wrtc not available')),
|
|
48
|
+
config: this._webrtcConfig
|
|
49
|
+
});
|
|
50
|
+
this._peer.on('signal', async (data) => {
|
|
51
|
+
try {
|
|
52
|
+
await this._sendSignal({
|
|
53
|
+
author: this._ownId,
|
|
54
|
+
recipient: this._remoteId,
|
|
55
|
+
sessionId: this._sessionId,
|
|
56
|
+
topic: this._topic,
|
|
57
|
+
data: { signal: { json: JSON.stringify(data) } }
|
|
58
|
+
});
|
|
59
|
+
} catch (err: any) {
|
|
60
|
+
this.errors.raise(err);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
this._peer.on('connect', () => {
|
|
64
|
+
log(`Connection established ${this._ownId} -> ${this._remoteId}`);
|
|
65
|
+
this._stream.pipe(this._peer!).pipe(this._stream);
|
|
66
|
+
this.connected.emit();
|
|
67
|
+
});
|
|
68
|
+
this._peer.on('error', async (err) => {
|
|
69
|
+
this.errors.raise(err);
|
|
70
|
+
await this.close();
|
|
71
|
+
});
|
|
72
|
+
this._peer.on('close', async () => {
|
|
73
|
+
log(`Connection closed ${this._ownId} -> ${this._remoteId}`);
|
|
74
|
+
await this._disconnectStreams();
|
|
75
|
+
this.closed.emit();
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
get remoteId() {
|
|
80
|
+
return this._remoteId;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
get sessionId() {
|
|
84
|
+
return this._sessionId;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
get peer() {
|
|
88
|
+
return this._peer;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async signal(signal: Signal) {
|
|
92
|
+
assert(this._peer, 'Connection not ready to accept signals.');
|
|
93
|
+
assert(signal.json, 'Signal message must contain signal data.');
|
|
94
|
+
this._peer.signal(JSON.parse(signal.json));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async close() {
|
|
98
|
+
await this._disconnectStreams();
|
|
99
|
+
this._peer!.destroy();
|
|
100
|
+
log('Closed.');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
private async _disconnectStreams() {
|
|
104
|
+
// TODO(rzadp): Find a way of unpiping this?
|
|
105
|
+
this._stream.unpipe?.(this._peer)?.unpipe?.(this._stream);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// TODO(dmaretskyi): Convert to class.
|
|
110
|
+
export const createWebRTCTransportFactory = (webrtcConfig?: any): TransportFactory => ({
|
|
111
|
+
create: (opts) =>
|
|
112
|
+
new WebRTCTransport( // TODO(burdon): Refactor with to take opts in constructor.
|
|
113
|
+
opts.initiator,
|
|
114
|
+
opts.stream,
|
|
115
|
+
opts.ownId,
|
|
116
|
+
opts.remoteId,
|
|
117
|
+
opts.sessionId,
|
|
118
|
+
opts.topic,
|
|
119
|
+
opts.sendSignal,
|
|
120
|
+
webrtcConfig
|
|
121
|
+
)
|
|
122
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Will be null if WebRTC is not available in this environment.
|
|
7
|
+
*/
|
|
8
|
+
let wrtc: any = null;
|
|
9
|
+
|
|
10
|
+
// Try to load WebRTC if available. This will fail in the shared-worker context.
|
|
11
|
+
try {
|
|
12
|
+
wrtc = require('@koush/wrtc');
|
|
13
|
+
} catch {}
|
|
14
|
+
|
|
15
|
+
export { wrtc };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2020 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
// @dxos/mocha platform=nodejs
|
|
6
|
+
|
|
7
|
+
import wrtc from '@koush/wrtc';
|
|
8
|
+
import SimplePeerConstructor from 'simple-peer';
|
|
9
|
+
|
|
10
|
+
import { sleep } from '@dxos/async';
|
|
11
|
+
|
|
12
|
+
describe('node wrtc and simple-peer', function () {
|
|
13
|
+
// Simplest test that reproduces SIGABRT (mac) and SIGSEGV (linux) in wrtc.
|
|
14
|
+
it.skip('open and close', async function () {
|
|
15
|
+
const peer = new SimplePeerConstructor({
|
|
16
|
+
initiator: true,
|
|
17
|
+
wrtc
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
await sleep(1);
|
|
21
|
+
|
|
22
|
+
await peer.destroy();
|
|
23
|
+
}).timeout(3_000);
|
|
24
|
+
});
|
package/src/types.ts
ADDED