@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/.eslintignore
ADDED
package/.eslintrc
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# Trackerless Network
|
|
2
|
+
|
|
3
|
+
The Trackerless Network package is a reimplementation of the old (Corea-Brubeck) network package.
|
|
4
|
+
The package is reimplemented to use the network and transport stacks of the proto-rpc and DHT packages.
|
|
5
|
+
The main change to the network is that the `d-regular random graph` stream topologies are now generated
|
|
6
|
+
using a decentralized algorithm based on peer discovery from the DHT.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { ConnectionManager, DhtNode, PeerDescriptor, NodeType, PeerID } from '@streamr/dht'
|
|
2
|
+
import { StreamrNode, Event as StreamrNodeEvent } from '../src/logic/StreamrNode'
|
|
3
|
+
import {
|
|
4
|
+
ContentMessage,
|
|
5
|
+
MessageRef,
|
|
6
|
+
StreamMessage,
|
|
7
|
+
StreamMessageType
|
|
8
|
+
} from '../src/proto/packages/trackerless-network/protos/NetworkRpc'
|
|
9
|
+
import { program } from 'commander'
|
|
10
|
+
|
|
11
|
+
program
|
|
12
|
+
.option('--id <id>', 'Ethereum address / node id', 'bootstrap')
|
|
13
|
+
.option('--name <name>', 'Name in published messages', 'bootstrap')
|
|
14
|
+
.option('--streamIds <streamIds>', 'streamId to publish', (value: string) => value.split(','), ['stream-0'])
|
|
15
|
+
.option('--ip <ip>', 'Ip address to use', '0.0.0.0')
|
|
16
|
+
.option('--port <port>', 'Name in published messages', '23123')
|
|
17
|
+
.description('Run bootstrap node')
|
|
18
|
+
.parse(process.argv)
|
|
19
|
+
|
|
20
|
+
async function run(): Promise<void> {
|
|
21
|
+
|
|
22
|
+
const streamPartId = 'stream#0'
|
|
23
|
+
const ip = program.opts().ip
|
|
24
|
+
const port = parseInt(program.opts().port)
|
|
25
|
+
|
|
26
|
+
const epPeerDescriptor: PeerDescriptor = {
|
|
27
|
+
kademliaId: PeerID.fromString(program.opts().id).value,
|
|
28
|
+
type: NodeType.NODEJS,
|
|
29
|
+
websocket: { ip, port }
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const layer0 = new DhtNode({ peerDescriptor: epPeerDescriptor, numberOfNodesPerKBucket: 8 })
|
|
33
|
+
await layer0.start()
|
|
34
|
+
await layer0.joinDht([epPeerDescriptor])
|
|
35
|
+
|
|
36
|
+
const connectionManager = layer0.getTransport() as ConnectionManager
|
|
37
|
+
const streamrNode = new StreamrNode({})
|
|
38
|
+
await streamrNode.start(layer0, connectionManager, connectionManager)
|
|
39
|
+
|
|
40
|
+
await streamrNode.joinStream(streamPartId)
|
|
41
|
+
streamrNode.subscribeToStream(streamPartId)
|
|
42
|
+
|
|
43
|
+
streamrNode.on(StreamrNodeEvent.NEW_MESSAGE, (msg: StreamMessage) => {
|
|
44
|
+
// eslint-disable-next-line no-console
|
|
45
|
+
console.log(`new message received: ${JSON.parse(ContentMessage.fromBinary(msg.content).body).hello}`)
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
let sequenceNumber = 0
|
|
49
|
+
setInterval(() => {
|
|
50
|
+
const messageRef: MessageRef = {
|
|
51
|
+
sequenceNumber,
|
|
52
|
+
timestamp: BigInt(Date.now()),
|
|
53
|
+
publisherId: PeerID.fromValue(layer0.getPeerDescriptor().kademliaId).toString(),
|
|
54
|
+
streamPartition: 0,
|
|
55
|
+
streamId: streamPartId,
|
|
56
|
+
messageChainId: 'network'
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const content: ContentMessage = {
|
|
60
|
+
body: JSON.stringify({ hello: `from ${program.opts().name }` })
|
|
61
|
+
}
|
|
62
|
+
const message: StreamMessage = {
|
|
63
|
+
content: ContentMessage.toBinary(content),
|
|
64
|
+
messageRef,
|
|
65
|
+
messageType: StreamMessageType.MESSAGE,
|
|
66
|
+
signature: 'signature'
|
|
67
|
+
}
|
|
68
|
+
streamrNode.publishToStream(streamPartId, epPeerDescriptor, message)
|
|
69
|
+
sequenceNumber++
|
|
70
|
+
}, 10000)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
run()
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { ConnectionManager, DhtNode, PeerDescriptor, NodeType, PeerID } from '@streamr/dht'
|
|
2
|
+
import { Event as StreamrNodeEvent, StreamrNode } from '../src/logic/StreamrNode'
|
|
3
|
+
import {
|
|
4
|
+
ContentMessage,
|
|
5
|
+
MessageRef,
|
|
6
|
+
StreamMessage,
|
|
7
|
+
StreamMessageType
|
|
8
|
+
} from '../src/proto/packages/trackerless-network/protos/NetworkRpc'
|
|
9
|
+
import { program } from 'commander'
|
|
10
|
+
|
|
11
|
+
program
|
|
12
|
+
.option('--id <id>', 'Ethereum address / node id', 'full-node')
|
|
13
|
+
.option('--name <name>', 'Name in published messages', 'full-node')
|
|
14
|
+
.option('--wsPort <wsPort>', 'port for ws server', '23124')
|
|
15
|
+
.option('--entrypointId <entrypointId>', 'Entrypoints stringId', 'bootstrap')
|
|
16
|
+
.option('--entrypointIp <entrypointIp>', 'Entrypoints IP address', '0.0.0.0')
|
|
17
|
+
.option('--streamIds <streamIds>', 'streamId to publish', (value: string) => value.split(','), ['stream-0'])
|
|
18
|
+
.description('Run full node')
|
|
19
|
+
.parse(process.argv)
|
|
20
|
+
|
|
21
|
+
async function run(): Promise<void> {
|
|
22
|
+
|
|
23
|
+
const streamPartId = 'stream#0'
|
|
24
|
+
|
|
25
|
+
const epPeerDescriptor: PeerDescriptor = {
|
|
26
|
+
kademliaId: PeerID.fromString(program.opts().entrypointId).value,
|
|
27
|
+
type: NodeType.NODEJS,
|
|
28
|
+
websocket: { ip: program.opts().entrypointIp, port: 23123 }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const peerDescriptor: PeerDescriptor = {
|
|
32
|
+
kademliaId: PeerID.fromString(program.opts().id).value,
|
|
33
|
+
type: NodeType.NODEJS
|
|
34
|
+
}
|
|
35
|
+
const layer0 = new DhtNode({
|
|
36
|
+
peerDescriptor,
|
|
37
|
+
numberOfNodesPerKBucket: 2,
|
|
38
|
+
rpcRequestTimeout: 15000,
|
|
39
|
+
stunUrls: ['stun:stun.l.google.com:19302', 'turn:BrubeckTurn1:MIlbgtMw4nhpmbgqRrht1Q==@turn.streamr.network:5349'],
|
|
40
|
+
entryPoints: [epPeerDescriptor]
|
|
41
|
+
})
|
|
42
|
+
await layer0.start()
|
|
43
|
+
|
|
44
|
+
await layer0.joinDht([epPeerDescriptor])
|
|
45
|
+
|
|
46
|
+
const connectionManager = layer0.getTransport() as ConnectionManager
|
|
47
|
+
const streamrNode = new StreamrNode({})
|
|
48
|
+
await streamrNode.start(layer0, connectionManager, connectionManager)
|
|
49
|
+
|
|
50
|
+
streamrNode.subscribeToStream(streamPartId)
|
|
51
|
+
|
|
52
|
+
streamrNode.on(StreamrNodeEvent.NEW_MESSAGE, (msg: StreamMessage) => {
|
|
53
|
+
// eslint-disable-next-line no-console
|
|
54
|
+
console.log(`new message received: ${JSON.parse(ContentMessage.fromBinary(msg.content).body).hello}`)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
let sequenceNumber = 0
|
|
58
|
+
setInterval(() => {
|
|
59
|
+
// eslint-disable-next-line no-console
|
|
60
|
+
console.log(
|
|
61
|
+
`Number of connected stream neighbors ${streamrNode.getStream(streamPartId)?.layer2.getTargetNeighborStringIds().length || 0}, `
|
|
62
|
+
+ `targets: ${streamrNode.getStream(streamPartId)?.layer2.getTargetNeighborStringIds() || []}`
|
|
63
|
+
)
|
|
64
|
+
// eslint-disable-next-line no-console
|
|
65
|
+
console.log(
|
|
66
|
+
`Layer2: Nearby Contacts ${streamrNode.getStream(streamPartId)?.layer2.getNearbyContactPoolIds().length || 0}, `,
|
|
67
|
+
`Random Contacts ${streamrNode.getStream(streamPartId)?.layer2.getRandomContactPoolIds().length || 0}, `
|
|
68
|
+
)
|
|
69
|
+
// eslint-disable-next-line no-console
|
|
70
|
+
console.log(
|
|
71
|
+
`Layer1: Kbucket size ${streamrNode.getStream(streamPartId)?.layer1.getBucketSize() || 0} `,
|
|
72
|
+
`DHT contacts ${streamrNode.getStream(streamPartId)?.layer1.getNeighborList().getSize() || 0} `,
|
|
73
|
+
)
|
|
74
|
+
// eslint-disable-next-line no-console
|
|
75
|
+
console.log(
|
|
76
|
+
`Layer0: Kbucket size ${layer0.getBucketSize() || 0} `,
|
|
77
|
+
`DHT contacts ${layer0.getNeighborList().getSize() || 0}`
|
|
78
|
+
)
|
|
79
|
+
const messageRef: MessageRef = {
|
|
80
|
+
sequenceNumber,
|
|
81
|
+
timestamp: BigInt(Date.now()),
|
|
82
|
+
publisherId: PeerID.fromValue(layer0.getPeerDescriptor().kademliaId).toString(),
|
|
83
|
+
streamPartition: 0,
|
|
84
|
+
streamId: streamPartId,
|
|
85
|
+
messageChainId: 'network'
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const content: ContentMessage = {
|
|
89
|
+
body: JSON.stringify({ hello: `from ${program.opts().name }` })
|
|
90
|
+
}
|
|
91
|
+
const message: StreamMessage = {
|
|
92
|
+
content: ContentMessage.toBinary(content),
|
|
93
|
+
messageRef,
|
|
94
|
+
messageType: StreamMessageType.MESSAGE,
|
|
95
|
+
signature: 'signature'
|
|
96
|
+
}
|
|
97
|
+
streamrNode.publishToStream(streamPartId, epPeerDescriptor, message)
|
|
98
|
+
sequenceNumber++
|
|
99
|
+
}, 10000)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
run()
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { ConnectionManager, DhtNode, NodeType, PeerDescriptor, PeerID } from '@streamr/dht'
|
|
2
|
+
import { Event as StreamrNodeEvent, StreamrNode } from '../src/logic/StreamrNode'
|
|
3
|
+
import {
|
|
4
|
+
ContentMessage,
|
|
5
|
+
MessageRef,
|
|
6
|
+
StreamMessage,
|
|
7
|
+
StreamMessageType
|
|
8
|
+
} from '../src/proto/packages/trackerless-network/protos/NetworkRpc'
|
|
9
|
+
import { program } from 'commander'
|
|
10
|
+
|
|
11
|
+
program
|
|
12
|
+
.option('--id <id>', 'Ethereum address / node id', 'full-node')
|
|
13
|
+
.option('--name <name>', 'Name in published messages', 'full-node')
|
|
14
|
+
.option('--ip <ip>', 'Ip address to use', '0.0.0.0')
|
|
15
|
+
.option('--wsPort <port>', 'Name in published messages', '23124')
|
|
16
|
+
.option('--entrypointId <entrypointId>', 'Entrypoints stringId', 'bootstrap')
|
|
17
|
+
.option('--entrypointIp <entrypointIp>', 'Entrypoints IP address', '0.0.0.0')
|
|
18
|
+
.option('--streamIds <streamIds>', 'streamId to publish', (value: string) => value.split(','), ['stream-0'])
|
|
19
|
+
.description('Run full node')
|
|
20
|
+
.parse(process.argv)
|
|
21
|
+
|
|
22
|
+
async function run(): Promise<void> {
|
|
23
|
+
|
|
24
|
+
const streamPartId = 'stream#0'
|
|
25
|
+
const port = parseInt(program.opts().wsPort, 10)
|
|
26
|
+
const ip = program.opts().ip
|
|
27
|
+
|
|
28
|
+
const epPeerDescriptor: PeerDescriptor = {
|
|
29
|
+
kademliaId: PeerID.fromString(program.opts().entrypointId).value,
|
|
30
|
+
type: NodeType.NODEJS,
|
|
31
|
+
websocket: { ip: program.opts().entrypointIp, port: 23123 }
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const layer0 = new DhtNode({
|
|
35
|
+
webSocketPort: port,
|
|
36
|
+
webSocketHost: ip,
|
|
37
|
+
peerIdString: program.opts().id,
|
|
38
|
+
numberOfNodesPerKBucket: 2,
|
|
39
|
+
entryPoints: [epPeerDescriptor]
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
await layer0.start()
|
|
43
|
+
|
|
44
|
+
await layer0.joinDht([epPeerDescriptor])
|
|
45
|
+
|
|
46
|
+
const connectionManager = layer0.getTransport() as ConnectionManager
|
|
47
|
+
const streamrNode = new StreamrNode({})
|
|
48
|
+
await streamrNode.start(layer0, connectionManager, connectionManager)
|
|
49
|
+
|
|
50
|
+
streamrNode.subscribeToStream(streamPartId)
|
|
51
|
+
|
|
52
|
+
streamrNode.on(StreamrNodeEvent.NEW_MESSAGE, (msg: StreamMessage) => {
|
|
53
|
+
// eslint-disable-next-line no-console
|
|
54
|
+
console.log(`new message received: ${JSON.parse(ContentMessage.fromBinary(msg.content).body).hello}`)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
let sequenceNumber = 0
|
|
58
|
+
setInterval(() => {
|
|
59
|
+
// eslint-disable-next-line no-console
|
|
60
|
+
console.log(
|
|
61
|
+
`Number of connected stream neighbors ${streamrNode.getStream(streamPartId)?.layer2.getTargetNeighborStringIds().length || 0}, `
|
|
62
|
+
+ `targets: ${streamrNode.getStream(streamPartId)?.layer2.getTargetNeighborStringIds() || []}`
|
|
63
|
+
)
|
|
64
|
+
// eslint-disable-next-line no-console
|
|
65
|
+
console.log(
|
|
66
|
+
`Layer2: Nearby Contacts ${streamrNode.getStream(streamPartId)?.layer2.getNearbyContactPoolIds().length || 0}, `,
|
|
67
|
+
`Random Contacts ${streamrNode.getStream(streamPartId)?.layer2.getRandomContactPoolIds().length || 0}, `
|
|
68
|
+
)
|
|
69
|
+
// eslint-disable-next-line no-console
|
|
70
|
+
console.log(
|
|
71
|
+
`Layer1: Kbucket size ${streamrNode.getStream(streamPartId)?.layer1.getBucketSize() || 0} `,
|
|
72
|
+
`DHT contacts ${streamrNode.getStream(streamPartId)?.layer1.getNeighborList().getSize() || 0} `,
|
|
73
|
+
)
|
|
74
|
+
// eslint-disable-next-line no-console
|
|
75
|
+
console.log(
|
|
76
|
+
`Layer0: Kbucket size ${layer0.getBucketSize() || 0} `,
|
|
77
|
+
`DHT contacts ${layer0.getNeighborList().getSize() || 0}`
|
|
78
|
+
)
|
|
79
|
+
const messageRef: MessageRef = {
|
|
80
|
+
sequenceNumber,
|
|
81
|
+
timestamp: BigInt(Date.now()),
|
|
82
|
+
publisherId: PeerID.fromValue(layer0.getPeerDescriptor().kademliaId).toString(),
|
|
83
|
+
streamPartition: 0,
|
|
84
|
+
streamId: streamPartId,
|
|
85
|
+
messageChainId: 'network'
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const content: ContentMessage = {
|
|
89
|
+
body: JSON.stringify({ hello: `from ${program.opts().name }` })
|
|
90
|
+
}
|
|
91
|
+
const message: StreamMessage = {
|
|
92
|
+
content: ContentMessage.toBinary(content),
|
|
93
|
+
messageRef,
|
|
94
|
+
messageType: StreamMessageType.MESSAGE,
|
|
95
|
+
signature: 'signature'
|
|
96
|
+
}
|
|
97
|
+
streamrNode.publishToStream(streamPartId, epPeerDescriptor, message)
|
|
98
|
+
sequenceNumber++
|
|
99
|
+
}, 10000)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
run()
|
package/bin/network.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { spawn } from 'child_process'
|
|
2
|
+
import { program } from 'commander'
|
|
3
|
+
import * as path from 'path'
|
|
4
|
+
|
|
5
|
+
program
|
|
6
|
+
.option('--numOfNodes <id>', 'Number of nodes in the network', '10')
|
|
7
|
+
.option('--streamIds <streamIds>', 'streamId to publish', (value: string) => value.split(','), ['stream-0'])
|
|
8
|
+
.option('--entrypointIp <entrypointIp>', 'public IP of nodes to run', '0.0.0.0')
|
|
9
|
+
.description('Run bootstrap node')
|
|
10
|
+
.parse(process.argv)
|
|
11
|
+
|
|
12
|
+
async function run(): Promise<void> {
|
|
13
|
+
|
|
14
|
+
const numOfNodes = parseInt(program.opts().numOfNodes, 10)
|
|
15
|
+
|
|
16
|
+
const args = [
|
|
17
|
+
path.resolve('./bin/bootstrap-node.ts'),
|
|
18
|
+
'--ip=' + program.opts().entrypointIp
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
spawn('ts-node', args, {
|
|
22
|
+
stdio: [process.stdin, process.stdout, process.stderr]
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
setTimeout(async () => {
|
|
26
|
+
for (let i = 0; i < numOfNodes; i++) {
|
|
27
|
+
const args = [
|
|
28
|
+
path.resolve('./bin/full-node-webrtc.ts'),
|
|
29
|
+
'--id=full-node' + i,
|
|
30
|
+
'--name=full-node' + i,
|
|
31
|
+
'--wsPort=540' + i,
|
|
32
|
+
'--entrypointIp=' + program.opts().entrypointIp
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
spawn('ts-node', args, {
|
|
36
|
+
stdio: [process.stdin, process.stdout, process.stderr]
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
}, 2000)
|
|
40
|
+
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
run()
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Get human-readable names for some Ethereum addresses in Streamr test environment
|
|
4
|
+
* The list doesn't contain all known contract addresses or nodes, but we can add more
|
|
5
|
+
* addresses if needed.
|
|
6
|
+
*
|
|
7
|
+
* Currently contains hardcoded names for all streamr-docker-dev Broker/Tracker entities
|
|
8
|
+
* -> in the future each node receives the peer names from Tracker
|
|
9
|
+
* and we can remove the hardcoded values
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.NameDirectory = void 0;
|
|
13
|
+
const NAMES = {
|
|
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
|
+
// eslint-disable-next-line @typescript-eslint/no-extraneous-class
|
|
25
|
+
class NameDirectory {
|
|
26
|
+
// if name is not known, creates a short name from the address
|
|
27
|
+
static getName(address) {
|
|
28
|
+
if (address === undefined) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
const name = NAMES[address.toLowerCase()];
|
|
32
|
+
if (name !== undefined) {
|
|
33
|
+
return name;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
return (address.length > NameDirectory.MAX_FALLBACK_NAME_LENGTH)
|
|
37
|
+
? address.substring(0, this.MAX_FALLBACK_NAME_LENGTH)
|
|
38
|
+
: address;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.NameDirectory = NameDirectory;
|
|
43
|
+
NameDirectory.MAX_FALLBACK_NAME_LENGTH = 8;
|
|
44
|
+
//# sourceMappingURL=NameDirectory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NameDirectory.js","sourceRoot":"","sources":["../../src/NameDirectory.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAIH,MAAM,KAAK,GAA2B;IAClC,4CAA4C,EAAE,IAAI;IAClD,4CAA4C,EAAE,IAAI;IAClD,4CAA4C,EAAE,IAAI;IAClD,4CAA4C,EAAE,IAAI;IAClD,4CAA4C,EAAE,IAAI;IAClD,4CAA4C,EAAE,IAAI;IAClD,4CAA4C,EAAE,4BAA4B;IAC1E,4CAA4C,EAAE,oCAAoC;IAClF,4CAA4C,EAAE,kCAAkC;CACnF,CAAA;AAED,kEAAkE;AAClE,MAAa,aAAa;IAItB,8DAA8D;IAC9D,MAAM,CAAC,OAAO,CAAC,OAA6C;QACxD,IAAI,OAAO,KAAK,SAAS,EAAE;YACvB,OAAO,SAAS,CAAA;SACnB;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;QACzC,IAAI,IAAI,KAAK,SAAS,EAAE;YACpB,OAAO,IAAI,CAAA;SACd;aAAM;YACH,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,aAAa,CAAC,wBAAwB,CAAC;gBAC5D,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,wBAAwB,CAAC;gBACrD,CAAC,CAAC,OAAO,CAAA;SAChB;IACL,CAAC;;AAjBL,sCAkBC;AAhBU,sCAAwB,GAAG,CAAC,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { StreamMessage, StreamPartID } from '@streamr/protocol';
|
|
2
|
+
import { PeerDescriptor } from '@streamr/dht';
|
|
3
|
+
import { NetworkOptions, NetworkStack } from './NetworkStack';
|
|
4
|
+
import { MetricsContext } from '@streamr/utils';
|
|
5
|
+
import { ProxyDirection } from './proto/packages/trackerless-network/protos/NetworkRpc';
|
|
6
|
+
export declare class NetworkNode {
|
|
7
|
+
readonly stack: NetworkStack;
|
|
8
|
+
private readonly options;
|
|
9
|
+
private stopped;
|
|
10
|
+
constructor(opts: NetworkOptions);
|
|
11
|
+
start(doJoin?: boolean): Promise<void>;
|
|
12
|
+
setExtraMetadata(metadata: Record<string, unknown>): void;
|
|
13
|
+
inspect(node: PeerDescriptor, streamPartId: StreamPartID): Promise<boolean>;
|
|
14
|
+
publish(streamMessage: StreamMessage): Promise<void>;
|
|
15
|
+
subscribe(streamPartId: StreamPartID): Promise<void>;
|
|
16
|
+
setProxies(streamPartId: StreamPartID, contactPeerDescriptors: PeerDescriptor[], direction: ProxyDirection, getUserId: () => Promise<string>, connectionCount?: number): Promise<void>;
|
|
17
|
+
addMessageListener<T>(cb: (msg: StreamMessage<T>) => void): void;
|
|
18
|
+
setStreamPartEntryPoints(streamPartId: StreamPartID, contactPeerDescriptors: PeerDescriptor[]): void;
|
|
19
|
+
removeMessageListener<T>(cb: (msg: StreamMessage<T>) => void): void;
|
|
20
|
+
subscribeAndWaitForJoin(streamPartId: StreamPartID, timeout?: number, expectedNeighbors?: number): Promise<number>;
|
|
21
|
+
waitForJoinAndPublish(streamMessage: StreamMessage, timeout?: number): Promise<number>;
|
|
22
|
+
unsubscribe(streamPartId: StreamPartID): void;
|
|
23
|
+
getNeighborsForStreamPart(streamPartId: StreamPartID): ReadonlyArray<string>;
|
|
24
|
+
hasStreamPart(streamPartId: StreamPartID): boolean;
|
|
25
|
+
hasProxyConnection(streamPartId: StreamPartID, contactNodeId: string, direction: ProxyDirection): boolean;
|
|
26
|
+
getRtt(_nodeId: string): number | undefined;
|
|
27
|
+
stop(): Promise<void>;
|
|
28
|
+
getPeerDescriptor(): PeerDescriptor;
|
|
29
|
+
getMetricsContext(): MetricsContext;
|
|
30
|
+
getNodeId(): string;
|
|
31
|
+
getNodeStringId(): string;
|
|
32
|
+
getStreamParts(): StreamPartID[];
|
|
33
|
+
getNeighbors(): string[];
|
|
34
|
+
getDiagnosticInfo(): Record<string, unknown>;
|
|
35
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NetworkNode = void 0;
|
|
4
|
+
const protocol_1 = require("@streamr/protocol");
|
|
5
|
+
const StreamMessageTranslator_1 = require("./logic/protocol-integration/stream-message/StreamMessageTranslator");
|
|
6
|
+
const NetworkStack_1 = require("./NetworkStack");
|
|
7
|
+
const NetworkRpc_1 = require("./proto/packages/trackerless-network/protos/NetworkRpc");
|
|
8
|
+
/*
|
|
9
|
+
Convenience wrapper for building client-facing functionality. Used by client.
|
|
10
|
+
*/
|
|
11
|
+
class NetworkNode {
|
|
12
|
+
constructor(opts) {
|
|
13
|
+
this.stopped = false;
|
|
14
|
+
this.options = opts;
|
|
15
|
+
this.stack = new NetworkStack_1.NetworkStack(opts);
|
|
16
|
+
}
|
|
17
|
+
async start(doJoin) {
|
|
18
|
+
await this.stack.start(doJoin);
|
|
19
|
+
}
|
|
20
|
+
setExtraMetadata(metadata) {
|
|
21
|
+
this.stack.getStreamrNode().setExtraMetadata(metadata);
|
|
22
|
+
}
|
|
23
|
+
async inspect(node, streamPartId) {
|
|
24
|
+
return this.stack.getStreamrNode().inspect(node, streamPartId);
|
|
25
|
+
}
|
|
26
|
+
async publish(streamMessage) {
|
|
27
|
+
const streamPartId = streamMessage.getStreamPartID();
|
|
28
|
+
if (this.stack.getStreamrNode().isProxiedStreamPart(streamPartId, NetworkRpc_1.ProxyDirection.SUBSCRIBE)
|
|
29
|
+
&& streamMessage.messageType === protocol_1.StreamMessageType.MESSAGE) {
|
|
30
|
+
throw new Error(`Cannot publish content data to ${streamPartId} as proxy subscribe connections have been set`);
|
|
31
|
+
}
|
|
32
|
+
await this.stack.joinLayer0IfRequired(streamPartId);
|
|
33
|
+
const msg = StreamMessageTranslator_1.StreamMessageTranslator.toProtobuf(streamMessage);
|
|
34
|
+
this.stack.getStreamrNode().publishToStream(streamPartId, msg);
|
|
35
|
+
}
|
|
36
|
+
async subscribe(streamPartId) {
|
|
37
|
+
if (this.stack.getStreamrNode().isProxiedStreamPart(streamPartId, NetworkRpc_1.ProxyDirection.PUBLISH)) {
|
|
38
|
+
throw new Error(`Cannot subscribe to ${streamPartId} as proxy publish connections have been set`);
|
|
39
|
+
}
|
|
40
|
+
await this.stack.joinLayer0IfRequired(streamPartId);
|
|
41
|
+
this.stack.getStreamrNode().subscribeToStream(streamPartId);
|
|
42
|
+
}
|
|
43
|
+
async setProxies(streamPartId, contactPeerDescriptors, direction, getUserId, connectionCount) {
|
|
44
|
+
if (this.options.networkNode.acceptProxyConnections) {
|
|
45
|
+
throw new Error('cannot set proxies when acceptProxyConnections=true');
|
|
46
|
+
}
|
|
47
|
+
await this.stack.getStreamrNode().setProxies(streamPartId, contactPeerDescriptors, direction, getUserId, connectionCount);
|
|
48
|
+
}
|
|
49
|
+
addMessageListener(cb) {
|
|
50
|
+
this.stack.getStreamrNode().on('newMessage', (msg) => {
|
|
51
|
+
const translated = StreamMessageTranslator_1.StreamMessageTranslator.toClientProtocol(msg);
|
|
52
|
+
return cb(translated);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
setStreamPartEntryPoints(streamPartId, contactPeerDescriptors) {
|
|
56
|
+
this.stack.getStreamrNode().setStreamPartEntryPoints(streamPartId, contactPeerDescriptors);
|
|
57
|
+
}
|
|
58
|
+
removeMessageListener(cb) {
|
|
59
|
+
if (this.stopped) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
this.stack.getStreamrNode().off('newMessage', (msg) => {
|
|
63
|
+
const translated = StreamMessageTranslator_1.StreamMessageTranslator.toClientProtocol(msg);
|
|
64
|
+
return cb(translated);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async subscribeAndWaitForJoin(streamPartId, timeout, expectedNeighbors) {
|
|
68
|
+
if (this.stack.getStreamrNode().isProxiedStreamPart(streamPartId, NetworkRpc_1.ProxyDirection.PUBLISH)) {
|
|
69
|
+
throw new Error(`Cannot subscribe to ${streamPartId} as proxy publish connections have been set`);
|
|
70
|
+
}
|
|
71
|
+
return this.stack.getStreamrNode().waitForJoinAndSubscribe(streamPartId, timeout, expectedNeighbors);
|
|
72
|
+
}
|
|
73
|
+
async waitForJoinAndPublish(streamMessage, timeout) {
|
|
74
|
+
const streamPartId = streamMessage.getStreamPartID();
|
|
75
|
+
const msg = StreamMessageTranslator_1.StreamMessageTranslator.toProtobuf(streamMessage);
|
|
76
|
+
if (this.stack.getStreamrNode().isProxiedStreamPart(streamPartId, NetworkRpc_1.ProxyDirection.SUBSCRIBE)) {
|
|
77
|
+
throw new Error(`Cannot publish to ${streamPartId} as proxy subscribe connections have been set`);
|
|
78
|
+
}
|
|
79
|
+
return this.stack.getStreamrNode().waitForJoinAndPublish(streamPartId, msg, timeout);
|
|
80
|
+
}
|
|
81
|
+
unsubscribe(streamPartId) {
|
|
82
|
+
if (this.stopped) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.stack.getStreamrNode().unsubscribeFromStream(streamPartId);
|
|
86
|
+
}
|
|
87
|
+
getNeighborsForStreamPart(streamPartId) {
|
|
88
|
+
return this.hasStreamPart(streamPartId)
|
|
89
|
+
? this.stack.getStreamrNode().getStream(streamPartId).layer2.getTargetNeighborStringIds()
|
|
90
|
+
: [];
|
|
91
|
+
}
|
|
92
|
+
hasStreamPart(streamPartId) {
|
|
93
|
+
return this.stack.getStreamrNode().hasStream(streamPartId);
|
|
94
|
+
}
|
|
95
|
+
hasProxyConnection(streamPartId, contactNodeId, direction) {
|
|
96
|
+
return this.stack.getStreamrNode().hasProxyConnection(streamPartId, contactNodeId, direction);
|
|
97
|
+
}
|
|
98
|
+
// eslint-disable-next-line class-methods-use-this
|
|
99
|
+
getRtt(_nodeId) {
|
|
100
|
+
throw new Error('Not implemented');
|
|
101
|
+
}
|
|
102
|
+
async stop() {
|
|
103
|
+
this.stopped = true;
|
|
104
|
+
await this.stack.stop();
|
|
105
|
+
}
|
|
106
|
+
getPeerDescriptor() {
|
|
107
|
+
return this.stack.getLayer0DhtNode().getPeerDescriptor();
|
|
108
|
+
}
|
|
109
|
+
getMetricsContext() {
|
|
110
|
+
return this.stack.getMetricsContext();
|
|
111
|
+
}
|
|
112
|
+
getNodeId() {
|
|
113
|
+
return this.stack.getStreamrNode().getNodeId();
|
|
114
|
+
}
|
|
115
|
+
getNodeStringId() {
|
|
116
|
+
return this.stack.getStreamrNode().getNodeStringId();
|
|
117
|
+
}
|
|
118
|
+
getStreamParts() {
|
|
119
|
+
return this.stack.getStreamrNode().getStreamParts();
|
|
120
|
+
}
|
|
121
|
+
getNeighbors() {
|
|
122
|
+
return this.stack.getStreamrNode().getNeighbors();
|
|
123
|
+
}
|
|
124
|
+
// eslint-disable-next-line class-methods-use-this
|
|
125
|
+
getDiagnosticInfo() {
|
|
126
|
+
return {};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.NetworkNode = NetworkNode;
|
|
130
|
+
//# sourceMappingURL=NetworkNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NetworkNode.js","sourceRoot":"","sources":["../../src/NetworkNode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { DhtNode, DhtNodeOptions } from '@streamr/dht';
|
|
2
|
+
import { StreamrNode, StreamrNodeConfig } from './logic/StreamrNode';
|
|
3
|
+
import { MetricsContext } from '@streamr/utils';
|
|
4
|
+
import { EventEmitter } from 'eventemitter3';
|
|
5
|
+
import { StreamPartID } from '@streamr/protocol';
|
|
6
|
+
export interface NetworkOptions {
|
|
7
|
+
layer0: DhtNodeOptions;
|
|
8
|
+
networkNode: StreamrNodeConfig;
|
|
9
|
+
metricsContext?: MetricsContext;
|
|
10
|
+
}
|
|
11
|
+
export interface NetworkStackEvents {
|
|
12
|
+
stopped: () => void;
|
|
13
|
+
}
|
|
14
|
+
export declare class NetworkStack extends EventEmitter<NetworkStackEvents> {
|
|
15
|
+
private connectionManager?;
|
|
16
|
+
private layer0DhtNode?;
|
|
17
|
+
private streamrNode?;
|
|
18
|
+
private readonly metricsContext;
|
|
19
|
+
private readonly options;
|
|
20
|
+
private readonly firstConnectionTimeout;
|
|
21
|
+
private dhtJoinRequired;
|
|
22
|
+
constructor(options: NetworkOptions);
|
|
23
|
+
start(doJoin?: boolean): Promise<void>;
|
|
24
|
+
private joinDht;
|
|
25
|
+
private waitForFirstConnection;
|
|
26
|
+
joinLayer0IfRequired(streamPartId: StreamPartID): Promise<void>;
|
|
27
|
+
private isJoinRequired;
|
|
28
|
+
getStreamrNode(): StreamrNode;
|
|
29
|
+
getLayer0DhtNode(): DhtNode;
|
|
30
|
+
getMetricsContext(): MetricsContext;
|
|
31
|
+
stop(): Promise<void>;
|
|
32
|
+
}
|