@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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transport/index.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;;;;;;;;;;;AAEF,qDAAmC;AACnC,8CAA4B;AAC5B,qDAAmC;AACnC,6DAA2C;AAC3C,2DAAyC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Event } from '@dxos/async';
|
|
3
|
+
import { ErrorStream } from '@dxos/debug';
|
|
4
|
+
import { PublicKey } from '@dxos/keys';
|
|
5
|
+
import { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
6
|
+
import { Transport, TransportFactory } from './transport';
|
|
7
|
+
/**
|
|
8
|
+
* Fake transport.
|
|
9
|
+
*/
|
|
10
|
+
export declare class MemoryTransport implements Transport {
|
|
11
|
+
private readonly _ownId;
|
|
12
|
+
private readonly _remoteId;
|
|
13
|
+
private readonly _sessionId;
|
|
14
|
+
private readonly _topic;
|
|
15
|
+
private readonly _stream;
|
|
16
|
+
private static readonly _connections;
|
|
17
|
+
readonly closed: Event<void>;
|
|
18
|
+
readonly connected: Event<void>;
|
|
19
|
+
readonly errors: ErrorStream;
|
|
20
|
+
private readonly _ownKey;
|
|
21
|
+
private readonly _remoteKey;
|
|
22
|
+
private readonly _outgoingDelay;
|
|
23
|
+
private readonly _incomingDelay;
|
|
24
|
+
private _remoteConnection?;
|
|
25
|
+
constructor(_ownId: PublicKey, _remoteId: PublicKey, _sessionId: PublicKey, _topic: PublicKey, _stream: NodeJS.ReadWriteStream);
|
|
26
|
+
get remoteId(): PublicKey;
|
|
27
|
+
get sessionId(): PublicKey;
|
|
28
|
+
signal(signal: Signal): Promise<void>;
|
|
29
|
+
close(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
export declare const MemoryTransportFactory: TransportFactory;
|
|
32
|
+
//# sourceMappingURL=memory-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-transport.d.ts","sourceRoot":"","sources":["../../../src/transport/memory-transport.ts"],"names":[],"mappings":";AAOA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAG/D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAkB1D;;GAEG;AAEH,qBAAa,eAAgB,YAAW,SAAS;IAmB7C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IArB1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAElC;IAEF,SAAgB,MAAM,cAAqB;IAC3C,SAAgB,SAAS,cAAqB;IAC9C,SAAgB,MAAM,cAAqB;IAE3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAE3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6C;IAC5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6C;IAE5E,OAAO,CAAC,iBAAiB,CAAC,CAAkB;gBAGzB,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,SAAS,EACrB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,CAAC,eAAe;IA0BlD,IAAI,QAAQ,IAAI,SAAS,CAExB;IAED,IAAI,SAAS,IAAI,SAAS,CAEzB;IAEK,MAAM,CAAC,MAAM,EAAE,MAAM;IAIrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA0B7B;AAED,eAAO,MAAM,sBAAsB,EAAE,gBAEpC,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
//
|
|
3
|
+
// Copyright 2020 DXOS.org
|
|
4
|
+
//
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MemoryTransportFactory = exports.MemoryTransport = void 0;
|
|
10
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
11
|
+
const stream_1 = require("stream");
|
|
12
|
+
const async_1 = require("@dxos/async");
|
|
13
|
+
const debug_1 = require("@dxos/debug");
|
|
14
|
+
const log_1 = require("@dxos/log");
|
|
15
|
+
const util_1 = require("@dxos/util");
|
|
16
|
+
// Delay (in milliseconds) for data being sent through in-memory connections to simulate network latency.
|
|
17
|
+
const MEMORY_TRANSPORT_DELAY = 1;
|
|
18
|
+
/**
|
|
19
|
+
* Creates a binary stream that delays data being sent through the stream by the specified amount of time.
|
|
20
|
+
*/
|
|
21
|
+
const createStreamDelay = (delay) => new stream_1.Transform({
|
|
22
|
+
objectMode: true,
|
|
23
|
+
transform: (chunk, _, cb) => {
|
|
24
|
+
setTimeout(() => cb(null, chunk), delay); // TODO(burdon): Randomize.
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Fake transport.
|
|
29
|
+
*/
|
|
30
|
+
// TODO(burdon): Remove static variables.
|
|
31
|
+
class MemoryTransport {
|
|
32
|
+
constructor(_ownId, _remoteId, _sessionId, _topic, _stream) {
|
|
33
|
+
this._ownId = _ownId;
|
|
34
|
+
this._remoteId = _remoteId;
|
|
35
|
+
this._sessionId = _sessionId;
|
|
36
|
+
this._topic = _topic;
|
|
37
|
+
this._stream = _stream;
|
|
38
|
+
this.closed = new async_1.Event();
|
|
39
|
+
this.connected = new async_1.Event();
|
|
40
|
+
this.errors = new debug_1.ErrorStream();
|
|
41
|
+
this._outgoingDelay = createStreamDelay(MEMORY_TRANSPORT_DELAY);
|
|
42
|
+
this._incomingDelay = createStreamDelay(MEMORY_TRANSPORT_DELAY);
|
|
43
|
+
(0, log_1.log)('creating', { topic: this._topic, peerId: this._ownId, remoteId: this._remoteId }, { file: "packages/core/mesh/network-manager/src/transport/memory-transport.ts", line: 62 });
|
|
44
|
+
this._ownKey = [this._topic, this._ownId, this._remoteId];
|
|
45
|
+
this._remoteKey = [this._topic, this._remoteId, this._ownId];
|
|
46
|
+
(0, node_assert_1.default)(!MemoryTransport._connections.has(this._ownKey), 'Duplicate memory connection');
|
|
47
|
+
MemoryTransport._connections.set(this._ownKey, this);
|
|
48
|
+
this._remoteConnection = MemoryTransport._connections.get(this._remoteKey);
|
|
49
|
+
if (this._remoteConnection) {
|
|
50
|
+
this._remoteConnection._remoteConnection = this;
|
|
51
|
+
(0, log_1.log)('connected', { topic: this._topic, peerId: this._ownId, remoteId: this._remoteId }, { file: "packages/core/mesh/network-manager/src/transport/memory-transport.ts", line: 74 });
|
|
52
|
+
this._stream
|
|
53
|
+
.pipe(this._outgoingDelay)
|
|
54
|
+
.pipe(this._remoteConnection._stream)
|
|
55
|
+
.pipe(this._incomingDelay)
|
|
56
|
+
.pipe(this._stream);
|
|
57
|
+
this.connected.emit();
|
|
58
|
+
this._remoteConnection.connected.emit();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
get remoteId() {
|
|
62
|
+
return this._remoteId;
|
|
63
|
+
}
|
|
64
|
+
get sessionId() {
|
|
65
|
+
return this._sessionId;
|
|
66
|
+
}
|
|
67
|
+
async signal(signal) {
|
|
68
|
+
// No-op.
|
|
69
|
+
}
|
|
70
|
+
async close() {
|
|
71
|
+
(0, log_1.log)('closing', { topic: this._topic, peerId: this._ownId, remoteId: this._remoteId }, { file: "packages/core/mesh/network-manager/src/transport/memory-transport.ts", line: 99 });
|
|
72
|
+
MemoryTransport._connections.delete(this._ownKey);
|
|
73
|
+
if (this._remoteConnection) {
|
|
74
|
+
MemoryTransport._connections.delete(this._remoteKey);
|
|
75
|
+
// TODO(dmaretskyi): Hypercore streams do not seem to have the unpipe method.
|
|
76
|
+
// NOTE(burdon): Using readable-stream.wrap() might help (see feed-store).
|
|
77
|
+
// code this._stream
|
|
78
|
+
// code .unpipe(this._outgoingDelay)
|
|
79
|
+
// code .unpipe(this._remoteConnection._stream)
|
|
80
|
+
// code .unpipe(this._incomingDelay)
|
|
81
|
+
// code .unpipe(this._stream);
|
|
82
|
+
this._outgoingDelay.unpipe();
|
|
83
|
+
this._incomingDelay.unpipe();
|
|
84
|
+
this._remoteConnection.closed.emit();
|
|
85
|
+
this._remoteConnection._remoteConnection = undefined;
|
|
86
|
+
this._remoteConnection = undefined;
|
|
87
|
+
}
|
|
88
|
+
this.closed.emit();
|
|
89
|
+
(0, log_1.log)('closed', { topic: this._topic }, { file: "packages/core/mesh/network-manager/src/transport/memory-transport.ts", line: 122 });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.MemoryTransport = MemoryTransport;
|
|
93
|
+
// TODO(burdon): Remove global properties.
|
|
94
|
+
MemoryTransport._connections = new util_1.ComplexMap(([topic, nodeId, remoteId]) => topic.toHex() + nodeId.toHex() + remoteId.toHex());
|
|
95
|
+
exports.MemoryTransportFactory = {
|
|
96
|
+
create: (opts) => new MemoryTransport(opts.ownId, opts.remoteId, opts.sessionId, opts.topic, opts.stream)
|
|
97
|
+
};
|
|
98
|
+
//# sourceMappingURL=memory-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-transport.js","sourceRoot":"","sources":["../../../src/transport/memory-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-transport.test.d.ts","sourceRoot":"","sources":["../../../src/transport/memory-transport.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
//
|
|
3
|
+
// Copyright 2021 DXOS.org
|
|
4
|
+
//
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const expect_1 = __importDefault(require("expect"));
|
|
10
|
+
const wait_for_expect_1 = __importDefault(require("wait-for-expect"));
|
|
11
|
+
const crypto_1 = require("@dxos/crypto");
|
|
12
|
+
const keys_1 = require("@dxos/keys");
|
|
13
|
+
const mesh_protocol_1 = require("@dxos/mesh-protocol");
|
|
14
|
+
const testutils_1 = require("@dxos/testutils");
|
|
15
|
+
const util_1 = require("@dxos/util");
|
|
16
|
+
const testing_1 = require("../testing");
|
|
17
|
+
const memory_transport_1 = require("./memory-transport");
|
|
18
|
+
// TODO(burdon): Flaky test.
|
|
19
|
+
// Cannot log after tests are done. Did you forget to wait for something async in your test?
|
|
20
|
+
// Attempted to log "Ignoring unsupported ICE candidate.".
|
|
21
|
+
const createPair = () => {
|
|
22
|
+
const topic = keys_1.PublicKey.random();
|
|
23
|
+
const peer1Id = keys_1.PublicKey.random();
|
|
24
|
+
const peer2Id = keys_1.PublicKey.random();
|
|
25
|
+
const sessionId = keys_1.PublicKey.random();
|
|
26
|
+
const plugin1 = new testing_1.TestProtocolPlugin(peer1Id.asBuffer());
|
|
27
|
+
const protocolProvider1 = (0, testing_1.testProtocolProvider)(topic.asBuffer(), peer1Id.asBuffer(), plugin1);
|
|
28
|
+
const connection1 = new memory_transport_1.MemoryTransport(peer1Id, peer2Id, sessionId, topic, protocolProvider1({ channel: (0, crypto_1.discoveryKey)(topic), initiator: true }).stream);
|
|
29
|
+
(0, testutils_1.afterTest)(() => connection1.close());
|
|
30
|
+
(0, testutils_1.afterTest)(() => connection1.errors.assertNoUnhandledErrors());
|
|
31
|
+
const plugin2 = new testing_1.TestProtocolPlugin(peer2Id.asBuffer());
|
|
32
|
+
const protocolProvider2 = (0, testing_1.testProtocolProvider)(topic.asBuffer(), peer2Id.asBuffer(), plugin2);
|
|
33
|
+
const connection2 = new memory_transport_1.MemoryTransport(peer2Id, peer1Id, sessionId, topic, protocolProvider2({ channel: (0, crypto_1.discoveryKey)(topic), initiator: false }).stream);
|
|
34
|
+
(0, testutils_1.afterTest)(() => connection2.close());
|
|
35
|
+
(0, testutils_1.afterTest)(() => connection2.errors.assertNoUnhandledErrors());
|
|
36
|
+
return {
|
|
37
|
+
connection1,
|
|
38
|
+
connection2,
|
|
39
|
+
plugin1,
|
|
40
|
+
plugin2,
|
|
41
|
+
peer1Id,
|
|
42
|
+
peer2Id,
|
|
43
|
+
topic
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
describe('MemoryTransport', function () {
|
|
47
|
+
it('establish connection and send data through with protocol', async function () {
|
|
48
|
+
const { plugin1, plugin2, peer1Id } = createPair();
|
|
49
|
+
const received = [];
|
|
50
|
+
const mockReceive = (p, s) => {
|
|
51
|
+
received.push(p, s);
|
|
52
|
+
return undefined;
|
|
53
|
+
};
|
|
54
|
+
plugin1.on('receive', mockReceive);
|
|
55
|
+
plugin2.on('connect', async (protocol) => {
|
|
56
|
+
await plugin2.send(peer1Id.asBuffer(), '{"message": "Hello"}');
|
|
57
|
+
});
|
|
58
|
+
await (0, wait_for_expect_1.default)(() => {
|
|
59
|
+
(0, expect_1.default)(received.length).toBe(2);
|
|
60
|
+
(0, expect_1.default)(received[0]).toBeInstanceOf(mesh_protocol_1.Protocol);
|
|
61
|
+
(0, expect_1.default)(received[1]).toBe('{"message": "Hello"}');
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
it('10 pairs of peers connecting at the same time', async function () {
|
|
65
|
+
await Promise.all((0, util_1.range)(10).map(async () => {
|
|
66
|
+
const { plugin1, plugin2, peer1Id } = createPair();
|
|
67
|
+
const received = [];
|
|
68
|
+
const mockReceive = (p, s) => {
|
|
69
|
+
received.push(p, s);
|
|
70
|
+
return undefined;
|
|
71
|
+
};
|
|
72
|
+
plugin1.on('receive', mockReceive);
|
|
73
|
+
plugin2.on('connect', async (protocol) => {
|
|
74
|
+
await plugin2.send(peer1Id.asBuffer(), '{"message": "Hello"}');
|
|
75
|
+
});
|
|
76
|
+
await (0, wait_for_expect_1.default)(() => {
|
|
77
|
+
(0, expect_1.default)(received.length).toBe(2);
|
|
78
|
+
(0, expect_1.default)(received[0]).toBeInstanceOf(mesh_protocol_1.Protocol);
|
|
79
|
+
(0, expect_1.default)(received[1]).toBe('{"message": "Hello"}');
|
|
80
|
+
});
|
|
81
|
+
}));
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=memory-transport.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-transport.test.js","sourceRoot":"","sources":["../../../src/transport/memory-transport.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Event } from '@dxos/async';
|
|
3
|
+
import { ErrorStream } from '@dxos/debug';
|
|
4
|
+
import { PublicKey } from '@dxos/keys';
|
|
5
|
+
import { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
6
|
+
import { SignalMessage } from '../signal';
|
|
7
|
+
/**
|
|
8
|
+
* Abstraction over a P2P connection transport. Currently either WebRTC or in-memory.
|
|
9
|
+
*/
|
|
10
|
+
export interface Transport {
|
|
11
|
+
closed: Event;
|
|
12
|
+
connected: Event;
|
|
13
|
+
errors: ErrorStream;
|
|
14
|
+
signal(signal: Signal): Promise<void>;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export declare type TransportOptions = {
|
|
18
|
+
/**
|
|
19
|
+
* Did local node initiate this connection.
|
|
20
|
+
*/
|
|
21
|
+
initiator: boolean;
|
|
22
|
+
ownId: PublicKey;
|
|
23
|
+
remoteId: PublicKey;
|
|
24
|
+
sessionId: PublicKey;
|
|
25
|
+
topic: PublicKey;
|
|
26
|
+
/**
|
|
27
|
+
* Wire protocol.
|
|
28
|
+
*/
|
|
29
|
+
stream: NodeJS.ReadWriteStream;
|
|
30
|
+
/**
|
|
31
|
+
* Send a signal message to remote peer.
|
|
32
|
+
*/
|
|
33
|
+
sendSignal: (msg: SignalMessage) => Promise<void>;
|
|
34
|
+
};
|
|
35
|
+
export interface TransportFactory {
|
|
36
|
+
create(options: TransportOptions): Transport;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/transport/transport.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,KAAK,CAAC;IACd,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,oBAAY,gBAAgB,GAAG;IAC7B;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC;IAE/B;;OAEG;IACH,UAAU,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAC9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/transport/transport.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Event } from '@dxos/async';
|
|
3
|
+
import { ErrorStream } from '@dxos/debug';
|
|
4
|
+
import { PublicKey } from '@dxos/keys';
|
|
5
|
+
import { BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';
|
|
6
|
+
import { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
7
|
+
import { SignalMessage } from '../signal';
|
|
8
|
+
import { Transport, TransportFactory, TransportOptions } from './transport';
|
|
9
|
+
export interface WebRTCTransportProxyParams {
|
|
10
|
+
initiator: boolean;
|
|
11
|
+
stream: NodeJS.ReadWriteStream;
|
|
12
|
+
ownId: PublicKey;
|
|
13
|
+
remoteId: PublicKey;
|
|
14
|
+
sessionId: PublicKey;
|
|
15
|
+
topic: PublicKey;
|
|
16
|
+
sendSignal: (msg: SignalMessage) => void;
|
|
17
|
+
bridgeService: BridgeService;
|
|
18
|
+
}
|
|
19
|
+
export declare class WebRTCTransportProxy implements Transport {
|
|
20
|
+
private readonly _params;
|
|
21
|
+
readonly closed: Event<void>;
|
|
22
|
+
private _closed;
|
|
23
|
+
readonly connected: Event<void>;
|
|
24
|
+
readonly errors: ErrorStream;
|
|
25
|
+
private _serviceStream;
|
|
26
|
+
private readonly _proxyId;
|
|
27
|
+
constructor(_params: WebRTCTransportProxyParams);
|
|
28
|
+
private _handleConnection;
|
|
29
|
+
private _handleData;
|
|
30
|
+
private _handleSignal;
|
|
31
|
+
signal(signal: Signal): Promise<void>;
|
|
32
|
+
close(): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Called when underlying proxy service becomes unavailable.
|
|
35
|
+
*/
|
|
36
|
+
forceClose(): void;
|
|
37
|
+
}
|
|
38
|
+
export declare class WebRTCTransportProxyFactory implements TransportFactory {
|
|
39
|
+
private _bridgeService;
|
|
40
|
+
private _connections;
|
|
41
|
+
/**
|
|
42
|
+
* Sets the current BridgeService to be used to open connections.
|
|
43
|
+
* Calling this method will close any existing connections.
|
|
44
|
+
*/
|
|
45
|
+
setBridgeService(bridgeService: BridgeService | undefined): this;
|
|
46
|
+
create(options: TransportOptions): Transport;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=webrtc-transport-proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webrtc-transport-proxy.d.ts","sourceRoot":"","sources":["../../../src/transport/webrtc-transport-proxy.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAgC,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACrG,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACzC,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,qBAAa,oBAAqB,YAAW,SAAS;IAWlD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAV1B,QAAQ,CAAC,MAAM,cAAe;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,QAAQ,CAAC,SAAS,cAAe;IACjC,QAAQ,CAAC,MAAM,cAAqB;IAEpC,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;gBAI5B,OAAO,EAAE,0BAA0B;YAkCxC,iBAAiB;IAiB/B,OAAO,CAAC,WAAW;YAKL,aAAa;IAUrB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B;;OAEG;IACH,UAAU;CAKX;AAED,qBAAa,2BAA4B,YAAW,gBAAgB;IAClE,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,YAAY,CAAmC;IAEvD;;;OAGG;IACH,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI;IAShE,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS;CAa7C"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
//
|
|
3
|
+
// Copyright 2022 DXOS.org
|
|
4
|
+
//
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.WebRTCTransportProxyFactory = exports.WebRTCTransportProxy = void 0;
|
|
10
|
+
const assert_1 = __importDefault(require("assert"));
|
|
11
|
+
const async_1 = require("@dxos/async");
|
|
12
|
+
const debug_1 = require("@dxos/debug");
|
|
13
|
+
const keys_1 = require("@dxos/keys");
|
|
14
|
+
const log_1 = require("@dxos/log");
|
|
15
|
+
const bridge_1 = require("@dxos/protocols/proto/dxos/mesh/bridge");
|
|
16
|
+
class WebRTCTransportProxy {
|
|
17
|
+
// prettier-ignore
|
|
18
|
+
constructor(_params) {
|
|
19
|
+
this._params = _params;
|
|
20
|
+
this.closed = new async_1.Event();
|
|
21
|
+
this._closed = false;
|
|
22
|
+
this.connected = new async_1.Event();
|
|
23
|
+
this.errors = new debug_1.ErrorStream();
|
|
24
|
+
this._proxyId = keys_1.PublicKey.random();
|
|
25
|
+
this._serviceStream = this._params.bridgeService.open({
|
|
26
|
+
proxyId: this._proxyId,
|
|
27
|
+
initiator: this._params.initiator
|
|
28
|
+
});
|
|
29
|
+
this._serviceStream.waitUntilReady().then(() => {
|
|
30
|
+
this._serviceStream.subscribe(async (msg) => {
|
|
31
|
+
if (msg.connection) {
|
|
32
|
+
await this._handleConnection(msg.connection);
|
|
33
|
+
}
|
|
34
|
+
else if (msg.data) {
|
|
35
|
+
this._handleData(msg.data);
|
|
36
|
+
}
|
|
37
|
+
else if (msg.signal) {
|
|
38
|
+
await this._handleSignal(msg.signal);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
this._params.stream.on('data', async (data) => {
|
|
42
|
+
try {
|
|
43
|
+
await this._params.bridgeService.sendData({
|
|
44
|
+
proxyId: this._proxyId,
|
|
45
|
+
payload: data
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
log_1.log.catch(err, {}, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport-proxy.ts", line: 66 });
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}, (error) => log_1.log.catch(error, {}, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport-proxy.ts", line: 70 }));
|
|
53
|
+
}
|
|
54
|
+
async _handleConnection(connectionEvent) {
|
|
55
|
+
if (connectionEvent.error) {
|
|
56
|
+
this.errors.raise(new Error(connectionEvent.error));
|
|
57
|
+
}
|
|
58
|
+
switch (connectionEvent.state) {
|
|
59
|
+
case bridge_1.ConnectionState.CONNECTED: {
|
|
60
|
+
this.connected.emit();
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case bridge_1.ConnectionState.CLOSED: {
|
|
64
|
+
await this.close();
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
_handleData(dataEvent) {
|
|
70
|
+
// NOTE: This must be a Buffer otherwise hypercore-protocol breaks.
|
|
71
|
+
this._params.stream.write(Buffer.from(dataEvent.payload));
|
|
72
|
+
}
|
|
73
|
+
async _handleSignal(signalEvent) {
|
|
74
|
+
await this._params.sendSignal({
|
|
75
|
+
author: this._params.ownId,
|
|
76
|
+
recipient: this._params.remoteId,
|
|
77
|
+
topic: this._params.topic,
|
|
78
|
+
sessionId: this._params.sessionId,
|
|
79
|
+
data: { signal: signalEvent.payload }
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async signal(signal) {
|
|
83
|
+
await this._params.bridgeService.sendSignal({
|
|
84
|
+
proxyId: this._proxyId,
|
|
85
|
+
signal
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async close() {
|
|
89
|
+
if (this._closed) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
this._serviceStream.close();
|
|
93
|
+
try {
|
|
94
|
+
await this._params.bridgeService.close({ proxyId: this._proxyId });
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
log_1.log.catch(err, {}, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport-proxy.ts", line: 121 });
|
|
98
|
+
}
|
|
99
|
+
this.closed.emit();
|
|
100
|
+
this._closed = true;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Called when underlying proxy service becomes unavailable.
|
|
104
|
+
*/
|
|
105
|
+
forceClose() {
|
|
106
|
+
this._serviceStream.close();
|
|
107
|
+
this.closed.emit();
|
|
108
|
+
this._closed = true;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.WebRTCTransportProxy = WebRTCTransportProxy;
|
|
112
|
+
class WebRTCTransportProxyFactory {
|
|
113
|
+
constructor() {
|
|
114
|
+
this._connections = new Set();
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Sets the current BridgeService to be used to open connections.
|
|
118
|
+
* Calling this method will close any existing connections.
|
|
119
|
+
*/
|
|
120
|
+
setBridgeService(bridgeService) {
|
|
121
|
+
this._bridgeService = bridgeService;
|
|
122
|
+
for (const connection of this._connections) {
|
|
123
|
+
connection.forceClose();
|
|
124
|
+
}
|
|
125
|
+
return this;
|
|
126
|
+
}
|
|
127
|
+
create(options) {
|
|
128
|
+
(0, assert_1.default)(this._bridgeService, 'WebRTCTransportProxyFactory is not ready to open connections');
|
|
129
|
+
const transport = new WebRTCTransportProxy({
|
|
130
|
+
...options,
|
|
131
|
+
bridgeService: this._bridgeService
|
|
132
|
+
});
|
|
133
|
+
this._connections.add(transport);
|
|
134
|
+
transport.closed.on(() => this._connections.delete(transport));
|
|
135
|
+
return transport;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.WebRTCTransportProxyFactory = WebRTCTransportProxyFactory;
|
|
139
|
+
//# sourceMappingURL=webrtc-transport-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webrtc-transport-proxy.js","sourceRoot":"","sources":["../../../src/transport/webrtc-transport-proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webrtc-transport-proxy.test.d.ts","sourceRoot":"","sources":["../../../src/transport/webrtc-transport-proxy.test.ts"],"names":[],"mappings":""}
|