@streamr/trackerless-network 0.0.1-tatum.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/.eslintignore +7 -0
- package/.eslintrc +3 -0
- package/README.md +6 -0
- package/bin/bootstrap-node.ts +73 -0
- package/bin/full-node-webrtc.ts +102 -0
- package/bin/full-node-websocket.ts +102 -0
- package/bin/network.ts +43 -0
- package/dist/package.json +53 -0
- package/dist/src/NameDirectory.d.ts +5 -0
- package/dist/src/NameDirectory.js +44 -0
- package/dist/src/NameDirectory.js.map +1 -0
- package/dist/src/NetworkNode.d.ts +35 -0
- package/dist/src/NetworkNode.js +130 -0
- package/dist/src/NetworkNode.js.map +1 -0
- package/dist/src/NetworkStack.d.ts +32 -0
- package/dist/src/NetworkStack.js +108 -0
- package/dist/src/NetworkStack.js.map +1 -0
- package/dist/src/exports.d.ts +6 -0
- package/dist/src/exports.js +12 -0
- package/dist/src/exports.js.map +1 -0
- package/dist/src/identifiers.d.ts +1 -0
- package/dist/src/identifiers.js +3 -0
- package/dist/src/identifiers.js.map +1 -0
- package/dist/src/logic/DuplicateMessageDetector.d.ts +55 -0
- package/dist/src/logic/DuplicateMessageDetector.js +155 -0
- package/dist/src/logic/DuplicateMessageDetector.js.map +1 -0
- package/dist/src/logic/ILayer0.d.ts +13 -0
- package/dist/src/logic/ILayer0.js +3 -0
- package/dist/src/logic/ILayer0.js.map +1 -0
- package/dist/src/logic/IStreamNode.d.ts +12 -0
- package/dist/src/logic/IStreamNode.js +3 -0
- package/dist/src/logic/IStreamNode.js.map +1 -0
- package/dist/src/logic/PeerList.d.ts +27 -0
- package/dist/src/logic/PeerList.js +84 -0
- package/dist/src/logic/PeerList.js.map +1 -0
- package/dist/src/logic/RandomGraphNode.d.ts +68 -0
- package/dist/src/logic/RandomGraphNode.js +201 -0
- package/dist/src/logic/RandomGraphNode.js.map +1 -0
- package/dist/src/logic/Remote.d.ts +9 -0
- package/dist/src/logic/Remote.js +15 -0
- package/dist/src/logic/Remote.js.map +1 -0
- package/dist/src/logic/RemoteRandomGraphNode.d.ts +8 -0
- package/dist/src/logic/RemoteRandomGraphNode.js +35 -0
- package/dist/src/logic/RemoteRandomGraphNode.js.map +1 -0
- package/dist/src/logic/StreamEntryPointDiscovery.d.ts +36 -0
- package/dist/src/logic/StreamEntryPointDiscovery.js +179 -0
- package/dist/src/logic/StreamEntryPointDiscovery.js.map +1 -0
- package/dist/src/logic/StreamNodeServer.d.ts +20 -0
- package/dist/src/logic/StreamNodeServer.js +26 -0
- package/dist/src/logic/StreamNodeServer.js.map +1 -0
- package/dist/src/logic/StreamrNode.d.ts +76 -0
- package/dist/src/logic/StreamrNode.js +303 -0
- package/dist/src/logic/StreamrNode.js.map +1 -0
- package/dist/src/logic/createRandomGraphNode.d.ts +5 -0
- package/dist/src/logic/createRandomGraphNode.js +110 -0
- package/dist/src/logic/createRandomGraphNode.js.map +1 -0
- package/dist/src/logic/inspect/InspectSession.d.ts +18 -0
- package/dist/src/logic/inspect/InspectSession.js +38 -0
- package/dist/src/logic/inspect/InspectSession.js.map +1 -0
- package/dist/src/logic/inspect/Inspector.d.ts +33 -0
- package/dist/src/logic/inspect/Inspector.js +63 -0
- package/dist/src/logic/inspect/Inspector.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/Handshaker.d.ts +35 -0
- package/dist/src/logic/neighbor-discovery/Handshaker.js +121 -0
- package/dist/src/logic/neighbor-discovery/Handshaker.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/HandshakerServer.d.ts +30 -0
- package/dist/src/logic/neighbor-discovery/HandshakerServer.js +78 -0
- package/dist/src/logic/neighbor-discovery/HandshakerServer.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/NeighborFinder.d.ts +23 -0
- package/dist/src/logic/neighbor-discovery/NeighborFinder.js +44 -0
- package/dist/src/logic/neighbor-discovery/NeighborFinder.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.d.ts +30 -0
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js +42 -0
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManagerServer.d.ts +20 -0
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManagerServer.js +42 -0
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManagerServer.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/RemoteHandshaker.d.ts +12 -0
- package/dist/src/logic/neighbor-discovery/RemoteHandshaker.js +54 -0
- package/dist/src/logic/neighbor-discovery/RemoteHandshaker.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.d.ts +11 -0
- package/dist/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.js +37 -0
- package/dist/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.js.map +1 -0
- package/dist/src/logic/propagation/FifoMapWithTTL.d.ts +36 -0
- package/dist/src/logic/propagation/FifoMapWithTTL.js +81 -0
- package/dist/src/logic/propagation/FifoMapWithTTL.js.map +1 -0
- package/dist/src/logic/propagation/Propagation.d.ts +31 -0
- package/dist/src/logic/propagation/Propagation.js +64 -0
- package/dist/src/logic/propagation/Propagation.js.map +1 -0
- package/dist/src/logic/propagation/PropagationTaskStore.d.ts +21 -0
- package/dist/src/logic/propagation/PropagationTaskStore.js +32 -0
- package/dist/src/logic/propagation/PropagationTaskStore.js.map +1 -0
- package/dist/src/logic/protocol-integration/stream-message/ContentMessageTranslator.d.ts +5 -0
- package/dist/src/logic/protocol-integration/stream-message/ContentMessageTranslator.js +17 -0
- package/dist/src/logic/protocol-integration/stream-message/ContentMessageTranslator.js.map +1 -0
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.d.ts +6 -0
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js +27 -0
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js.map +1 -0
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.d.ts +6 -0
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js +33 -0
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js.map +1 -0
- package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.d.ts +6 -0
- package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js +109 -0
- package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js.map +1 -0
- package/dist/src/logic/proxy/ProxyStreamConnectionClient.d.ts +44 -0
- package/dist/src/logic/proxy/ProxyStreamConnectionClient.js +189 -0
- package/dist/src/logic/proxy/ProxyStreamConnectionClient.js.map +1 -0
- package/dist/src/logic/proxy/ProxyStreamConnectionServer.d.ts +34 -0
- package/dist/src/logic/proxy/ProxyStreamConnectionServer.js +64 -0
- package/dist/src/logic/proxy/ProxyStreamConnectionServer.js.map +1 -0
- package/dist/src/logic/proxy/RemoteProxyServer.d.ts +7 -0
- package/dist/src/logic/proxy/RemoteProxyServer.js +36 -0
- package/dist/src/logic/proxy/RemoteProxyServer.js.map +1 -0
- package/dist/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.d.ts +6 -0
- package/dist/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.js +28 -0
- package/dist/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.js.map +1 -0
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcServer.d.ts +20 -0
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcServer.js +29 -0
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcServer.js.map +1 -0
- package/dist/src/logic/utils.d.ts +3 -0
- package/dist/src/logic/utils.js +16 -0
- package/dist/src/logic/utils.js.map +1 -0
- package/dist/src/proto/google/protobuf/any.d.ts +173 -0
- package/dist/src/proto/google/protobuf/any.js +155 -0
- package/dist/src/proto/google/protobuf/any.js.map +1 -0
- package/dist/src/proto/google/protobuf/empty.d.ts +32 -0
- package/dist/src/proto/google/protobuf/empty.js +34 -0
- package/dist/src/proto/google/protobuf/empty.js.map +1 -0
- package/dist/src/proto/google/protobuf/timestamp.d.ts +149 -0
- package/dist/src/proto/google/protobuf/timestamp.js +136 -0
- package/dist/src/proto/google/protobuf/timestamp.js.map +1 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +320 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +245 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +1089 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.js +710 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +145 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.js +3 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.js.map +1 -0
- package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.d.ts +87 -0
- package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +66 -0
- package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js.map +1 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.d.ts +156 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js +122 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js.map +1 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.d.ts +524 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js +350 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js.map +1 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.d.ts +65 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.js +3 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.js.map +1 -0
- package/dist/test/benchmark/first-message.d.ts +1 -0
- package/dist/test/benchmark/first-message.js +137 -0
- package/dist/test/benchmark/first-message.js.map +1 -0
- package/dist/test/utils/utils.d.ts +12 -0
- package/dist/test/utils/utils.js +86 -0
- package/dist/test/utils/utils.js.map +1 -0
- package/jest.config.js +36 -0
- package/karma.config.js +20 -0
- package/log.txt +501 -0
- package/package.json +53 -0
- package/proto.sh +2 -0
- package/protos/NetworkRpc.proto +161 -0
- package/src/NameDirectory.ts +44 -0
- package/src/NetworkNode.ts +169 -0
- package/src/NetworkStack.ts +144 -0
- package/src/exports.ts +6 -0
- package/src/identifiers.ts +1 -0
- package/src/logic/DuplicateMessageDetector.ts +167 -0
- package/src/logic/ILayer0.ts +14 -0
- package/src/logic/IStreamNode.ts +17 -0
- package/src/logic/PeerList.ts +106 -0
- package/src/logic/RandomGraphNode.ts +310 -0
- package/src/logic/Remote.ts +19 -0
- package/src/logic/RemoteRandomGraphNode.ts +39 -0
- package/src/logic/StreamEntryPointDiscovery.ts +221 -0
- package/src/logic/StreamNodeServer.ts +44 -0
- package/src/logic/StreamrNode.ts +416 -0
- package/src/logic/createRandomGraphNode.ts +114 -0
- package/src/logic/inspect/InspectSession.ts +49 -0
- package/src/logic/inspect/Inspector.ts +89 -0
- package/src/logic/neighbor-discovery/Handshaker.ts +180 -0
- package/src/logic/neighbor-discovery/HandshakerServer.ts +99 -0
- package/src/logic/neighbor-discovery/NeighborFinder.ts +61 -0
- package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +67 -0
- package/src/logic/neighbor-discovery/NeighborUpdateManagerServer.ts +61 -0
- package/src/logic/neighbor-discovery/RemoteHandshaker.ts +64 -0
- package/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.ts +41 -0
- package/src/logic/propagation/FifoMapWithTTL.ts +108 -0
- package/src/logic/propagation/Propagation.ts +83 -0
- package/src/logic/propagation/PropagationTaskStore.ts +40 -0
- package/src/logic/protocol-integration/stream-message/ContentMessageTranslator.ts +16 -0
- package/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.ts +28 -0
- package/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.ts +38 -0
- package/src/logic/protocol-integration/stream-message/StreamMessageTranslator.ts +142 -0
- package/src/logic/proxy/ProxyStreamConnectionClient.ts +255 -0
- package/src/logic/proxy/ProxyStreamConnectionServer.ts +97 -0
- package/src/logic/proxy/RemoteProxyServer.ts +36 -0
- package/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.ts +27 -0
- package/src/logic/temporary-connection/TemporaryConnectionRpcServer.ts +50 -0
- package/src/logic/utils.ts +17 -0
- package/src/proto/google/protobuf/any.ts +319 -0
- package/src/proto/google/protobuf/empty.ts +84 -0
- package/src/proto/google/protobuf/timestamp.ts +281 -0
- package/src/proto/packages/dht/protos/DhtRpc.client.ts +373 -0
- package/src/proto/packages/dht/protos/DhtRpc.server.ts +148 -0
- package/src/proto/packages/dht/protos/DhtRpc.ts +1399 -0
- package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +108 -0
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.client.ts +176 -0
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.server.ts +68 -0
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.ts +667 -0
- package/test/benchmark/first-message.ts +155 -0
- package/test/end-to-end/inspect.test.ts +119 -0
- package/test/end-to-end/proxy-and-full-node.test.ts +140 -0
- package/test/end-to-end/proxy-connections.test.ts +228 -0
- package/test/end-to-end/proxy-key-exchange.test.ts +142 -0
- package/test/end-to-end/random-graph-with-real-connections.test.ts +154 -0
- package/test/end-to-end/webrtc-full-node-network.test.ts +97 -0
- package/test/end-to-end/websocket-full-node-network.test.ts +93 -0
- package/test/integration/Handshakes.test.ts +167 -0
- package/test/integration/Inspect.test.ts +102 -0
- package/test/integration/NetworkNode.test.ts +99 -0
- package/test/integration/NetworkRpc.test.ts +61 -0
- package/test/integration/NetworkStack.test.ts +74 -0
- package/test/integration/NetworkStackStoppedDuringStart.test.ts +45 -0
- package/test/integration/Propagation.test.ts +79 -0
- package/test/integration/RandomGraphNode-Layer1Node-Latencies.test.ts +141 -0
- package/test/integration/RandomGraphNode-Layer1Node.test.ts +226 -0
- package/test/integration/RemoteHandshaker.test.ts +78 -0
- package/test/integration/RemoteNeighborUpdateManager.test.ts +82 -0
- package/test/integration/RemoteRandomGraphNode.test.ts +102 -0
- package/test/integration/StreamrNode.test.ts +145 -0
- package/test/integration/stream-without-default-entrypoints.test.ts +132 -0
- package/test/unit/ContentMessageTranslator.test.ts +20 -0
- package/test/unit/DuplicateMessageDetector.test.ts +192 -0
- package/test/unit/FifoMapWithTtl.test.ts +229 -0
- package/test/unit/GroupKeyRequestTranslator.test.ts +36 -0
- package/test/unit/GroupKeyResponseTranslator.test.ts +39 -0
- package/test/unit/Handshaker.test.ts +63 -0
- package/test/unit/HandshakerServer.test.ts +123 -0
- package/test/unit/InspectSession.test.ts +78 -0
- package/test/unit/Inspector.test.ts +57 -0
- package/test/unit/NeighborFinder.test.ts +48 -0
- package/test/unit/NumberPair.test.ts +22 -0
- package/test/unit/PeerList.test.ts +150 -0
- package/test/unit/Propagation.test.ts +134 -0
- package/test/unit/RandomGraphNode.test.ts +73 -0
- package/test/unit/StreamEntrypointDiscovery.test.ts +152 -0
- package/test/unit/StreamMessageTranslator.test.ts +67 -0
- package/test/unit/StreamNodeServer.test.ts +63 -0
- package/test/unit/StreamrNode.test.ts +74 -0
- package/test/utils/mock/MockHandshaker.ts +15 -0
- package/test/utils/mock/MockLayer0.ts +71 -0
- package/test/utils/mock/MockLayer1.ts +6 -0
- package/test/utils/mock/MockNeighborFinder.ts +19 -0
- package/test/utils/mock/MockNeighborUpdateManager.ts +21 -0
- package/test/utils/mock/Transport.ts +25 -0
- package/test/utils/utils.ts +104 -0
- package/tsconfig.browser.json +12 -0
- package/tsconfig.jest.json +15 -0
- package/tsconfig.node.json +18 -0
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@streamr/trackerless-network",
|
|
3
|
+
"version": "0.0.1-tatum.0",
|
|
4
|
+
"description": "Minimal and extendable implementation of the Streamr Network node.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/streamr-dev/network-monorepo.git",
|
|
8
|
+
"directory": "packages/trackerless-network"
|
|
9
|
+
},
|
|
10
|
+
"main": "dist/src/exports.js",
|
|
11
|
+
"types": "dist/src/exports.d.ts",
|
|
12
|
+
"license": "STREAMR NETWORK OPEN SOURCE LICENSE",
|
|
13
|
+
"author": "Streamr Network AG <contact@streamr.network>",
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc -b tsconfig.node.json",
|
|
16
|
+
"build-browser": "webpack --mode=development --progress",
|
|
17
|
+
"generate-protoc-code": "./proto.sh",
|
|
18
|
+
"check": "tsc -p ./tsconfig.jest.json --noEmit",
|
|
19
|
+
"clean": "jest --clearCache || true; rm -rf dist *.tsbuildinfo node_modules/.cache || true",
|
|
20
|
+
"coverage": "jest --coverage",
|
|
21
|
+
"eslint": "eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts}'",
|
|
22
|
+
"test": "jest",
|
|
23
|
+
"test-browser": "karma start karma.config.js",
|
|
24
|
+
"test-unit": "jest test/unit",
|
|
25
|
+
"test-integration": "jest test/integration",
|
|
26
|
+
"test-e2e": "jest test/end-to-end",
|
|
27
|
+
"network": "ts-node bin/network",
|
|
28
|
+
"run-joining-benchmark": "node --max-old-space-size=24288 dist/test/benchmark/first-message.js"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@protobuf-ts/runtime": "^2.8.2",
|
|
32
|
+
"@protobuf-ts/runtime-rpc": "^2.8.2",
|
|
33
|
+
"@streamr/dht": "0.0.1-tatum.0",
|
|
34
|
+
"@streamr/proto-rpc": "0.0.1-tatum.0",
|
|
35
|
+
"@streamr/protocol": "0.0.1-tatum.0",
|
|
36
|
+
"@streamr/test-utils": "0.0.1-tatum.0",
|
|
37
|
+
"@streamr/utils": "0.0.1-tatum.0",
|
|
38
|
+
"eventemitter3": "^5.0.0",
|
|
39
|
+
"lodash": "^4.17.21",
|
|
40
|
+
"yallist": "^4.0.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@streamr/browser-test-runner": "^0.0.1",
|
|
44
|
+
"@types/lodash": "^4.14.197",
|
|
45
|
+
"@types/yallist": "^4.0.1",
|
|
46
|
+
"commander": "^11.0.0",
|
|
47
|
+
"expect": "^29.6.2",
|
|
48
|
+
"express": "^4.17.1",
|
|
49
|
+
"ts-essentials": "^9.3.0",
|
|
50
|
+
"ts-loader": "^9.4.4",
|
|
51
|
+
"ts-node": "^10.9.1"
|
|
52
|
+
}
|
|
53
|
+
}
|
package/proto.sh
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
syntax = "proto3";
|
|
2
|
+
|
|
3
|
+
option optimize_for = CODE_SIZE;
|
|
4
|
+
|
|
5
|
+
import "google/protobuf/empty.proto";
|
|
6
|
+
import "google/protobuf/any.proto";
|
|
7
|
+
import "packages/dht/protos/DhtRpc.proto";
|
|
8
|
+
|
|
9
|
+
service NetworkRpc {
|
|
10
|
+
rpc sendData (StreamMessage) returns (google.protobuf.Empty);
|
|
11
|
+
rpc leaveStreamNotice (LeaveStreamNotice) returns (google.protobuf.Empty);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
service ProxyConnectionRpc {
|
|
15
|
+
rpc requestConnection (ProxyConnectionRequest) returns (ProxyConnectionResponse);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
service HandshakeRpc {
|
|
19
|
+
rpc handshake (StreamHandshakeRequest) returns (StreamHandshakeResponse);
|
|
20
|
+
rpc interleaveNotice (InterleaveNotice) returns (google.protobuf.Empty);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
service NeighborUpdateRpc {
|
|
24
|
+
rpc neighborUpdate (NeighborUpdate) returns (NeighborUpdate);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
service TemporaryConnectionRpc {
|
|
28
|
+
rpc openConnection (TemporaryConnectionRequest) returns (TemporaryConnectionResponse);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
message MessageRef {
|
|
32
|
+
int64 timestamp = 1;
|
|
33
|
+
int32 sequenceNumber = 2;
|
|
34
|
+
string messageChainId = 3;
|
|
35
|
+
string streamId = 4;
|
|
36
|
+
int32 streamPartition = 5;
|
|
37
|
+
string publisherId = 6;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
message ContentMessage {
|
|
41
|
+
string body = 1;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
enum StreamMessageType {
|
|
45
|
+
MESSAGE = 0;
|
|
46
|
+
GROUP_KEY_REQUEST = 1;
|
|
47
|
+
GROUP_KEY_RESPONSE = 2;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
enum EncryptionType {
|
|
51
|
+
NONE = 0;
|
|
52
|
+
RSA = 1;
|
|
53
|
+
AES = 2;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
message EncryptedGroupKey {
|
|
57
|
+
string groupKeyId = 1;
|
|
58
|
+
string encryptedGroupKeyHex = 2;
|
|
59
|
+
optional string serialized = 3;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
message StreamMessage {
|
|
63
|
+
StreamMessageType messageType = 1;
|
|
64
|
+
optional EncryptionType encryptionType = 2;
|
|
65
|
+
bytes content = 3;
|
|
66
|
+
string signature = 4;
|
|
67
|
+
MessageRef messageRef = 5;
|
|
68
|
+
optional MessageRef previousMessageRef = 6;
|
|
69
|
+
optional string groupKeyId = 7;
|
|
70
|
+
optional EncryptedGroupKey newGroupKey = 8;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
message GroupKeyRequest {
|
|
74
|
+
string requestId = 1;
|
|
75
|
+
string recipient = 2;
|
|
76
|
+
string rsaPublicKey = 3;
|
|
77
|
+
repeated string groupKeyIds = 4;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
message GroupKeyResponse {
|
|
81
|
+
string requestId = 1;
|
|
82
|
+
string recipient = 2;
|
|
83
|
+
repeated EncryptedGroupKey encryptedGroupKeys = 3;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
message Layer2Message {
|
|
87
|
+
Layer2Type type = 1;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
enum Layer2Type {
|
|
91
|
+
Data = 0;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
message StreamHandshakeRequest {
|
|
95
|
+
string randomGraphId = 1;
|
|
96
|
+
string senderId = 2;
|
|
97
|
+
string requestId = 3;
|
|
98
|
+
optional string concurrentHandshakeTargetId = 4;
|
|
99
|
+
repeated string neighbors = 5;
|
|
100
|
+
dht.PeerDescriptor senderDescriptor = 6;
|
|
101
|
+
optional string interleavingFrom = 7;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
message StreamHandshakeResponse {
|
|
105
|
+
bool accepted = 1;
|
|
106
|
+
string requestId = 2;
|
|
107
|
+
optional dht.PeerDescriptor interleaveTarget = 3;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
message InterleaveNotice {
|
|
111
|
+
string senderId = 1;
|
|
112
|
+
string randomGraphId = 2;
|
|
113
|
+
dht.PeerDescriptor interleaveTarget = 3;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
message LeaveStreamNotice {
|
|
117
|
+
string randomGraphId = 1;
|
|
118
|
+
string senderId = 2;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
message NeighborUpdate {
|
|
122
|
+
string senderId = 1;
|
|
123
|
+
string randomGraphId = 2;
|
|
124
|
+
bool removeMe = 3;
|
|
125
|
+
repeated dht.PeerDescriptor neighborDescriptors = 4;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
message StreamEntryPoint {
|
|
129
|
+
dht.PeerDescriptor peerDescriptor = 1;
|
|
130
|
+
bool firstToJoin = 2;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
message ProxyConnectionRequest {
|
|
134
|
+
string senderId = 1;
|
|
135
|
+
string streamId = 2;
|
|
136
|
+
uint32 streamPartition = 3;
|
|
137
|
+
ProxyDirection direction = 4;
|
|
138
|
+
string userId = 5;
|
|
139
|
+
dht.PeerDescriptor senderDescriptor = 6;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
message ProxyConnectionResponse {
|
|
143
|
+
string senderId = 1;
|
|
144
|
+
string streamId = 2;
|
|
145
|
+
uint32 streamPartition = 3;
|
|
146
|
+
ProxyDirection direction = 4;
|
|
147
|
+
bool accepted = 5;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
message TemporaryConnectionRequest {
|
|
151
|
+
string senderId = 1;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
message TemporaryConnectionResponse {
|
|
155
|
+
bool accepted = 1;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
enum ProxyDirection {
|
|
159
|
+
PUBLISH = 0;
|
|
160
|
+
SUBSCRIBE = 1;
|
|
161
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Get human-readable names for some Ethereum addresses in Streamr test environment
|
|
3
|
+
* The list doesn't contain all known contract addresses or nodes, but we can add more
|
|
4
|
+
* addresses if needed.
|
|
5
|
+
*
|
|
6
|
+
* Currently contains hardcoded names for all streamr-docker-dev Broker/Tracker entities
|
|
7
|
+
* -> in the future each node receives the peer names from Tracker
|
|
8
|
+
* and we can remove the hardcoded values
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { EthereumAddress } from '@streamr/utils'
|
|
12
|
+
|
|
13
|
+
const NAMES: Record<string, string> = {
|
|
14
|
+
'0xb9e7cebf7b03ae26458e32a059488386b05798e8': 'T1',
|
|
15
|
+
'0x0540a3e144cdd81f402e7772c76a5808b71d2d30': 'T2',
|
|
16
|
+
'0xf2c195be194a2c91e93eacb1d6d55a00552a85e2': 'T3',
|
|
17
|
+
'0xde1112f631486cfc759a50196853011528bc5fa0': 'S1',
|
|
18
|
+
'0xde222e8603fcf641f928e5f66a0cbf4de70d5352': 'B1',
|
|
19
|
+
'0xde3331ca6b8b636e0b82bf08e941f727b8927442': 'B2',
|
|
20
|
+
'0x6ccdd5d866ea766f6df5965aa98deccd629ff222': 'DOCKER_DEV_STREAM_REGISTRY',
|
|
21
|
+
'0xd04af489677001444280366dd0885b03daade71d': 'DOCKER_DEV_STREAM_STORAGE_REGISTRY',
|
|
22
|
+
'0x231b810d98702782963472e1d60a25496999e75d': 'DOCKER_DEV_STORAGE_NODE_REGISTRY'
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-extraneous-class
|
|
26
|
+
export class NameDirectory {
|
|
27
|
+
|
|
28
|
+
static MAX_FALLBACK_NAME_LENGTH = 8
|
|
29
|
+
|
|
30
|
+
// if name is not known, creates a short name from the address
|
|
31
|
+
static getName(address: EthereumAddress | string | undefined): string | undefined {
|
|
32
|
+
if (address === undefined) {
|
|
33
|
+
return undefined
|
|
34
|
+
}
|
|
35
|
+
const name = NAMES[address.toLowerCase()]
|
|
36
|
+
if (name !== undefined) {
|
|
37
|
+
return name
|
|
38
|
+
} else {
|
|
39
|
+
return (address.length > NameDirectory.MAX_FALLBACK_NAME_LENGTH)
|
|
40
|
+
? address.substring(0, this.MAX_FALLBACK_NAME_LENGTH)
|
|
41
|
+
: address
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { StreamMessage, StreamPartID, StreamMessageType } from '@streamr/protocol'
|
|
2
|
+
import { PeerDescriptor, PeerIDKey } from '@streamr/dht'
|
|
3
|
+
import { StreamMessageTranslator } from './logic/protocol-integration/stream-message/StreamMessageTranslator'
|
|
4
|
+
import { NetworkOptions, NetworkStack } from './NetworkStack'
|
|
5
|
+
import { MetricsContext } from '@streamr/utils'
|
|
6
|
+
import { ProxyDirection } from './proto/packages/trackerless-network/protos/NetworkRpc'
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
Convenience wrapper for building client-facing functionality. Used by client.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export class NetworkNode {
|
|
13
|
+
|
|
14
|
+
readonly stack: NetworkStack
|
|
15
|
+
private readonly options: NetworkOptions
|
|
16
|
+
private stopped = false
|
|
17
|
+
constructor(opts: NetworkOptions) {
|
|
18
|
+
this.options = opts
|
|
19
|
+
this.stack = new NetworkStack(opts)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async start(doJoin?: boolean): Promise<void> {
|
|
23
|
+
await this.stack.start(doJoin)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
setExtraMetadata(metadata: Record<string, unknown>): void {
|
|
27
|
+
this.stack.getStreamrNode().setExtraMetadata(metadata)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async inspect(node: PeerDescriptor, streamPartId: StreamPartID): Promise<boolean> {
|
|
31
|
+
return this.stack.getStreamrNode().inspect(node, streamPartId)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async publish(streamMessage: StreamMessage): Promise<void> {
|
|
35
|
+
const streamPartId = streamMessage.getStreamPartID()
|
|
36
|
+
if (this.stack.getStreamrNode().isProxiedStreamPart(streamPartId, ProxyDirection.SUBSCRIBE)
|
|
37
|
+
&& streamMessage.messageType === StreamMessageType.MESSAGE) {
|
|
38
|
+
throw new Error(`Cannot publish content data to ${streamPartId} as proxy subscribe connections have been set`)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
await this.stack.joinLayer0IfRequired(streamPartId)
|
|
42
|
+
const msg = StreamMessageTranslator.toProtobuf(streamMessage)
|
|
43
|
+
this.stack.getStreamrNode().publishToStream(streamPartId, msg)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async subscribe(streamPartId: StreamPartID): Promise<void> {
|
|
47
|
+
if (this.stack.getStreamrNode().isProxiedStreamPart(streamPartId, ProxyDirection.PUBLISH)) {
|
|
48
|
+
throw new Error(`Cannot subscribe to ${streamPartId} as proxy publish connections have been set`)
|
|
49
|
+
}
|
|
50
|
+
await this.stack.joinLayer0IfRequired(streamPartId)
|
|
51
|
+
this.stack.getStreamrNode().subscribeToStream(streamPartId)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async setProxies(
|
|
55
|
+
streamPartId: StreamPartID,
|
|
56
|
+
contactPeerDescriptors: PeerDescriptor[],
|
|
57
|
+
direction: ProxyDirection,
|
|
58
|
+
getUserId: () => Promise<string>,
|
|
59
|
+
connectionCount?: number
|
|
60
|
+
): Promise<void> {
|
|
61
|
+
if (this.options.networkNode.acceptProxyConnections) {
|
|
62
|
+
throw new Error('cannot set proxies when acceptProxyConnections=true')
|
|
63
|
+
}
|
|
64
|
+
await this.stack.getStreamrNode().setProxies(streamPartId, contactPeerDescriptors, direction, getUserId, connectionCount)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
addMessageListener<T>(cb: (msg: StreamMessage<T>) => void): void {
|
|
68
|
+
this.stack.getStreamrNode().on('newMessage', (msg) => {
|
|
69
|
+
const translated = StreamMessageTranslator.toClientProtocol<T>(msg)
|
|
70
|
+
return cb(translated)
|
|
71
|
+
})
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
setStreamPartEntryPoints(streamPartId: StreamPartID, contactPeerDescriptors: PeerDescriptor[]): void {
|
|
75
|
+
this.stack.getStreamrNode()!.setStreamPartEntryPoints(streamPartId, contactPeerDescriptors)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
removeMessageListener<T>(cb: (msg: StreamMessage<T>) => void): void {
|
|
79
|
+
if (this.stopped) {
|
|
80
|
+
return
|
|
81
|
+
}
|
|
82
|
+
this.stack.getStreamrNode().off('newMessage', (msg) => {
|
|
83
|
+
const translated = StreamMessageTranslator.toClientProtocol<T>(msg)
|
|
84
|
+
return cb(translated)
|
|
85
|
+
})
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async subscribeAndWaitForJoin(
|
|
89
|
+
streamPartId: StreamPartID,
|
|
90
|
+
timeout?: number,
|
|
91
|
+
expectedNeighbors?: number
|
|
92
|
+
): Promise<number> {
|
|
93
|
+
if (this.stack.getStreamrNode()!.isProxiedStreamPart(streamPartId, ProxyDirection.PUBLISH)) {
|
|
94
|
+
throw new Error(`Cannot subscribe to ${streamPartId} as proxy publish connections have been set`)
|
|
95
|
+
}
|
|
96
|
+
return this.stack.getStreamrNode().waitForJoinAndSubscribe(streamPartId, timeout, expectedNeighbors)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async waitForJoinAndPublish(streamMessage: StreamMessage, timeout?: number): Promise<number> {
|
|
100
|
+
const streamPartId = streamMessage.getStreamPartID()
|
|
101
|
+
const msg = StreamMessageTranslator.toProtobuf(streamMessage)
|
|
102
|
+
|
|
103
|
+
if (this.stack.getStreamrNode()!.isProxiedStreamPart(streamPartId, ProxyDirection.SUBSCRIBE)) {
|
|
104
|
+
throw new Error(`Cannot publish to ${streamPartId} as proxy subscribe connections have been set`)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return this.stack.getStreamrNode().waitForJoinAndPublish(streamPartId, msg, timeout)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
unsubscribe(streamPartId: StreamPartID): void {
|
|
111
|
+
if (this.stopped) {
|
|
112
|
+
return
|
|
113
|
+
}
|
|
114
|
+
this.stack.getStreamrNode().unsubscribeFromStream(streamPartId)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
getNeighborsForStreamPart(streamPartId: StreamPartID): ReadonlyArray<string> {
|
|
118
|
+
return this.hasStreamPart(streamPartId)
|
|
119
|
+
? this.stack.getStreamrNode().getStream(streamPartId)!.layer2.getTargetNeighborStringIds()
|
|
120
|
+
: []
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
hasStreamPart(streamPartId: StreamPartID): boolean {
|
|
124
|
+
return this.stack.getStreamrNode().hasStream(streamPartId)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
hasProxyConnection(streamPartId: StreamPartID, contactNodeId: string, direction: ProxyDirection): boolean {
|
|
128
|
+
return this.stack.getStreamrNode()!.hasProxyConnection(streamPartId, contactNodeId as PeerIDKey, direction)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// eslint-disable-next-line class-methods-use-this
|
|
132
|
+
getRtt(_nodeId: string): number | undefined {
|
|
133
|
+
throw new Error('Not implemented')
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async stop(): Promise<void> {
|
|
137
|
+
this.stopped = true
|
|
138
|
+
await this.stack.stop()
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
getPeerDescriptor(): PeerDescriptor {
|
|
142
|
+
return this.stack.getLayer0DhtNode().getPeerDescriptor()
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
getMetricsContext(): MetricsContext {
|
|
146
|
+
return this.stack.getMetricsContext()
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
getNodeId(): string {
|
|
150
|
+
return this.stack.getStreamrNode().getNodeId()
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
getNodeStringId(): string {
|
|
154
|
+
return this.stack.getStreamrNode().getNodeStringId()
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
getStreamParts(): StreamPartID[] {
|
|
158
|
+
return this.stack.getStreamrNode().getStreamParts()
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
getNeighbors(): string[] {
|
|
162
|
+
return this.stack.getStreamrNode().getNeighbors()
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// eslint-disable-next-line class-methods-use-this
|
|
166
|
+
getDiagnosticInfo(): Record<string, unknown> {
|
|
167
|
+
return {}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { ConnectionManager, DhtNode, DhtNodeOptions, isSamePeerDescriptor } from '@streamr/dht'
|
|
2
|
+
import { StreamrNode, StreamrNodeConfig } from './logic/StreamrNode'
|
|
3
|
+
import { MetricsContext, waitForEvent3 } from '@streamr/utils'
|
|
4
|
+
import { EventEmitter } from 'eventemitter3'
|
|
5
|
+
import { StreamPartID } from '@streamr/protocol'
|
|
6
|
+
|
|
7
|
+
interface ReadynessEvents {
|
|
8
|
+
done: () => void
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
class ReadynessListener {
|
|
12
|
+
|
|
13
|
+
private readonly emitter = new EventEmitter<ReadynessEvents>()
|
|
14
|
+
private readonly networkStack: NetworkStack
|
|
15
|
+
private readonly dhtNode: DhtNode
|
|
16
|
+
|
|
17
|
+
constructor(networkStack: NetworkStack, dhtNode: DhtNode) {
|
|
18
|
+
this.networkStack = networkStack
|
|
19
|
+
this.dhtNode = dhtNode
|
|
20
|
+
this.networkStack.on('stopped', this.onStopped)
|
|
21
|
+
this.dhtNode.on('connected', this.onConnected)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
private onConnected = () => {
|
|
25
|
+
this.networkStack.off('stopped', this.onStopped)
|
|
26
|
+
this.dhtNode.off('connected', this.onConnected)
|
|
27
|
+
this.emitter.emit('done')
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
private onStopped = () => {
|
|
31
|
+
this.networkStack.off('stopped', this.onStopped)
|
|
32
|
+
this.dhtNode.off('connected', this.onConnected)
|
|
33
|
+
this.emitter.emit('done')
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public async waitUntilReady(timeout: number): Promise<void> {
|
|
37
|
+
if (this.dhtNode.getNumberOfConnections() > 0) {
|
|
38
|
+
return
|
|
39
|
+
} else {
|
|
40
|
+
await waitForEvent3<ReadynessEvents>(this.emitter, 'done', timeout)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface NetworkOptions {
|
|
46
|
+
layer0: DhtNodeOptions
|
|
47
|
+
networkNode: StreamrNodeConfig
|
|
48
|
+
metricsContext?: MetricsContext
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface NetworkStackEvents {
|
|
52
|
+
stopped: () => void
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export class NetworkStack extends EventEmitter<NetworkStackEvents> {
|
|
56
|
+
|
|
57
|
+
private connectionManager?: ConnectionManager
|
|
58
|
+
private layer0DhtNode?: DhtNode
|
|
59
|
+
private streamrNode?: StreamrNode
|
|
60
|
+
private readonly metricsContext: MetricsContext
|
|
61
|
+
private readonly options: NetworkOptions
|
|
62
|
+
private readonly firstConnectionTimeout: number
|
|
63
|
+
private dhtJoinRequired = true
|
|
64
|
+
|
|
65
|
+
constructor(options: NetworkOptions) {
|
|
66
|
+
super()
|
|
67
|
+
this.options = options
|
|
68
|
+
this.metricsContext = options.metricsContext ?? new MetricsContext()
|
|
69
|
+
this.layer0DhtNode = new DhtNode({
|
|
70
|
+
...options.layer0,
|
|
71
|
+
metricsContext: this.metricsContext
|
|
72
|
+
})
|
|
73
|
+
this.streamrNode = new StreamrNode({
|
|
74
|
+
...options.networkNode,
|
|
75
|
+
nodeName: options.networkNode.nodeName ?? options.layer0.nodeName,
|
|
76
|
+
metricsContext: this.metricsContext
|
|
77
|
+
})
|
|
78
|
+
this.firstConnectionTimeout = options.networkNode.firstConnectionTimeout ?? 5000
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async start(doJoin = true): Promise<void> {
|
|
82
|
+
await this.layer0DhtNode!.start()
|
|
83
|
+
this.connectionManager = this.layer0DhtNode!.getTransport() as ConnectionManager
|
|
84
|
+
if (this.options.layer0.entryPoints!.some((entryPoint) =>
|
|
85
|
+
isSamePeerDescriptor(entryPoint, this.layer0DhtNode!.getPeerDescriptor())
|
|
86
|
+
)) {
|
|
87
|
+
this.dhtJoinRequired = false
|
|
88
|
+
await this.layer0DhtNode?.joinDht(this.options.layer0.entryPoints!)
|
|
89
|
+
await this.streamrNode?.start(this.layer0DhtNode!, this.connectionManager!, this.connectionManager!)
|
|
90
|
+
} else {
|
|
91
|
+
if (doJoin) {
|
|
92
|
+
this.dhtJoinRequired = false
|
|
93
|
+
await this.joinDht()
|
|
94
|
+
}
|
|
95
|
+
await this.streamrNode?.start(this.layer0DhtNode!, this.connectionManager!, this.connectionManager!)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private async joinDht(): Promise<void> {
|
|
100
|
+
setImmediate(() => {
|
|
101
|
+
this.layer0DhtNode?.joinDht(this.options.layer0.entryPoints!)
|
|
102
|
+
})
|
|
103
|
+
await this.waitForFirstConnection()
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private async waitForFirstConnection(): Promise<void> {
|
|
107
|
+
const readynessListener = new ReadynessListener(this, this.layer0DhtNode!)
|
|
108
|
+
await readynessListener.waitUntilReady(this.firstConnectionTimeout)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async joinLayer0IfRequired(streamPartId: StreamPartID): Promise<void> {
|
|
112
|
+
if (this.isJoinRequired(streamPartId)) {
|
|
113
|
+
this.dhtJoinRequired = false
|
|
114
|
+
await this.joinDht()
|
|
115
|
+
} else if (this.layer0DhtNode!.getNumberOfConnections() < 1) {
|
|
116
|
+
await this.waitForFirstConnection()
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private isJoinRequired(streamPartId: StreamPartID): boolean {
|
|
121
|
+
return this.dhtJoinRequired && !this.layer0DhtNode!.hasJoined() && this.streamrNode!.isJoinRequired(streamPartId)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
getStreamrNode(): StreamrNode {
|
|
125
|
+
return this.streamrNode!
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
getLayer0DhtNode(): DhtNode {
|
|
129
|
+
return this.layer0DhtNode!
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
getMetricsContext(): MetricsContext {
|
|
133
|
+
return this.metricsContext
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async stop(): Promise<void> {
|
|
137
|
+
await this.streamrNode!.destroy()
|
|
138
|
+
this.streamrNode = undefined
|
|
139
|
+
this.layer0DhtNode = undefined
|
|
140
|
+
this.connectionManager = undefined
|
|
141
|
+
this.emit('stopped')
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
}
|
package/src/exports.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { NetworkStack, NetworkOptions } from './NetworkStack'
|
|
2
|
+
export { NetworkNode } from './NetworkNode'
|
|
3
|
+
export { StreamrNodeConfig } from './logic/StreamrNode'
|
|
4
|
+
export { NameDirectory } from './NameDirectory'
|
|
5
|
+
export { NodeId } from './identifiers'
|
|
6
|
+
export { ProxyDirection } from './proto/packages/trackerless-network/protos/NetworkRpc'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type NodeId = string
|