@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.
Files changed (262) hide show
  1. package/.eslintignore +7 -0
  2. package/.eslintrc +3 -0
  3. package/README.md +6 -0
  4. package/bin/bootstrap-node.ts +73 -0
  5. package/bin/full-node-webrtc.ts +102 -0
  6. package/bin/full-node-websocket.ts +102 -0
  7. package/bin/network.ts +43 -0
  8. package/dist/package.json +53 -0
  9. package/dist/src/NameDirectory.d.ts +5 -0
  10. package/dist/src/NameDirectory.js +44 -0
  11. package/dist/src/NameDirectory.js.map +1 -0
  12. package/dist/src/NetworkNode.d.ts +35 -0
  13. package/dist/src/NetworkNode.js +130 -0
  14. package/dist/src/NetworkNode.js.map +1 -0
  15. package/dist/src/NetworkStack.d.ts +32 -0
  16. package/dist/src/NetworkStack.js +108 -0
  17. package/dist/src/NetworkStack.js.map +1 -0
  18. package/dist/src/exports.d.ts +6 -0
  19. package/dist/src/exports.js +12 -0
  20. package/dist/src/exports.js.map +1 -0
  21. package/dist/src/identifiers.d.ts +1 -0
  22. package/dist/src/identifiers.js +3 -0
  23. package/dist/src/identifiers.js.map +1 -0
  24. package/dist/src/logic/DuplicateMessageDetector.d.ts +55 -0
  25. package/dist/src/logic/DuplicateMessageDetector.js +155 -0
  26. package/dist/src/logic/DuplicateMessageDetector.js.map +1 -0
  27. package/dist/src/logic/ILayer0.d.ts +13 -0
  28. package/dist/src/logic/ILayer0.js +3 -0
  29. package/dist/src/logic/ILayer0.js.map +1 -0
  30. package/dist/src/logic/IStreamNode.d.ts +12 -0
  31. package/dist/src/logic/IStreamNode.js +3 -0
  32. package/dist/src/logic/IStreamNode.js.map +1 -0
  33. package/dist/src/logic/PeerList.d.ts +27 -0
  34. package/dist/src/logic/PeerList.js +84 -0
  35. package/dist/src/logic/PeerList.js.map +1 -0
  36. package/dist/src/logic/RandomGraphNode.d.ts +68 -0
  37. package/dist/src/logic/RandomGraphNode.js +201 -0
  38. package/dist/src/logic/RandomGraphNode.js.map +1 -0
  39. package/dist/src/logic/Remote.d.ts +9 -0
  40. package/dist/src/logic/Remote.js +15 -0
  41. package/dist/src/logic/Remote.js.map +1 -0
  42. package/dist/src/logic/RemoteRandomGraphNode.d.ts +8 -0
  43. package/dist/src/logic/RemoteRandomGraphNode.js +35 -0
  44. package/dist/src/logic/RemoteRandomGraphNode.js.map +1 -0
  45. package/dist/src/logic/StreamEntryPointDiscovery.d.ts +36 -0
  46. package/dist/src/logic/StreamEntryPointDiscovery.js +179 -0
  47. package/dist/src/logic/StreamEntryPointDiscovery.js.map +1 -0
  48. package/dist/src/logic/StreamNodeServer.d.ts +20 -0
  49. package/dist/src/logic/StreamNodeServer.js +26 -0
  50. package/dist/src/logic/StreamNodeServer.js.map +1 -0
  51. package/dist/src/logic/StreamrNode.d.ts +76 -0
  52. package/dist/src/logic/StreamrNode.js +303 -0
  53. package/dist/src/logic/StreamrNode.js.map +1 -0
  54. package/dist/src/logic/createRandomGraphNode.d.ts +5 -0
  55. package/dist/src/logic/createRandomGraphNode.js +110 -0
  56. package/dist/src/logic/createRandomGraphNode.js.map +1 -0
  57. package/dist/src/logic/inspect/InspectSession.d.ts +18 -0
  58. package/dist/src/logic/inspect/InspectSession.js +38 -0
  59. package/dist/src/logic/inspect/InspectSession.js.map +1 -0
  60. package/dist/src/logic/inspect/Inspector.d.ts +33 -0
  61. package/dist/src/logic/inspect/Inspector.js +63 -0
  62. package/dist/src/logic/inspect/Inspector.js.map +1 -0
  63. package/dist/src/logic/neighbor-discovery/Handshaker.d.ts +35 -0
  64. package/dist/src/logic/neighbor-discovery/Handshaker.js +121 -0
  65. package/dist/src/logic/neighbor-discovery/Handshaker.js.map +1 -0
  66. package/dist/src/logic/neighbor-discovery/HandshakerServer.d.ts +30 -0
  67. package/dist/src/logic/neighbor-discovery/HandshakerServer.js +78 -0
  68. package/dist/src/logic/neighbor-discovery/HandshakerServer.js.map +1 -0
  69. package/dist/src/logic/neighbor-discovery/NeighborFinder.d.ts +23 -0
  70. package/dist/src/logic/neighbor-discovery/NeighborFinder.js +44 -0
  71. package/dist/src/logic/neighbor-discovery/NeighborFinder.js.map +1 -0
  72. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.d.ts +30 -0
  73. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js +42 -0
  74. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js.map +1 -0
  75. package/dist/src/logic/neighbor-discovery/NeighborUpdateManagerServer.d.ts +20 -0
  76. package/dist/src/logic/neighbor-discovery/NeighborUpdateManagerServer.js +42 -0
  77. package/dist/src/logic/neighbor-discovery/NeighborUpdateManagerServer.js.map +1 -0
  78. package/dist/src/logic/neighbor-discovery/RemoteHandshaker.d.ts +12 -0
  79. package/dist/src/logic/neighbor-discovery/RemoteHandshaker.js +54 -0
  80. package/dist/src/logic/neighbor-discovery/RemoteHandshaker.js.map +1 -0
  81. package/dist/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.d.ts +11 -0
  82. package/dist/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.js +37 -0
  83. package/dist/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.js.map +1 -0
  84. package/dist/src/logic/propagation/FifoMapWithTTL.d.ts +36 -0
  85. package/dist/src/logic/propagation/FifoMapWithTTL.js +81 -0
  86. package/dist/src/logic/propagation/FifoMapWithTTL.js.map +1 -0
  87. package/dist/src/logic/propagation/Propagation.d.ts +31 -0
  88. package/dist/src/logic/propagation/Propagation.js +64 -0
  89. package/dist/src/logic/propagation/Propagation.js.map +1 -0
  90. package/dist/src/logic/propagation/PropagationTaskStore.d.ts +21 -0
  91. package/dist/src/logic/propagation/PropagationTaskStore.js +32 -0
  92. package/dist/src/logic/propagation/PropagationTaskStore.js.map +1 -0
  93. package/dist/src/logic/protocol-integration/stream-message/ContentMessageTranslator.d.ts +5 -0
  94. package/dist/src/logic/protocol-integration/stream-message/ContentMessageTranslator.js +17 -0
  95. package/dist/src/logic/protocol-integration/stream-message/ContentMessageTranslator.js.map +1 -0
  96. package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.d.ts +6 -0
  97. package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js +27 -0
  98. package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js.map +1 -0
  99. package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.d.ts +6 -0
  100. package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js +33 -0
  101. package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js.map +1 -0
  102. package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.d.ts +6 -0
  103. package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js +109 -0
  104. package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js.map +1 -0
  105. package/dist/src/logic/proxy/ProxyStreamConnectionClient.d.ts +44 -0
  106. package/dist/src/logic/proxy/ProxyStreamConnectionClient.js +189 -0
  107. package/dist/src/logic/proxy/ProxyStreamConnectionClient.js.map +1 -0
  108. package/dist/src/logic/proxy/ProxyStreamConnectionServer.d.ts +34 -0
  109. package/dist/src/logic/proxy/ProxyStreamConnectionServer.js +64 -0
  110. package/dist/src/logic/proxy/ProxyStreamConnectionServer.js.map +1 -0
  111. package/dist/src/logic/proxy/RemoteProxyServer.d.ts +7 -0
  112. package/dist/src/logic/proxy/RemoteProxyServer.js +36 -0
  113. package/dist/src/logic/proxy/RemoteProxyServer.js.map +1 -0
  114. package/dist/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.d.ts +6 -0
  115. package/dist/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.js +28 -0
  116. package/dist/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.js.map +1 -0
  117. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcServer.d.ts +20 -0
  118. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcServer.js +29 -0
  119. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcServer.js.map +1 -0
  120. package/dist/src/logic/utils.d.ts +3 -0
  121. package/dist/src/logic/utils.js +16 -0
  122. package/dist/src/logic/utils.js.map +1 -0
  123. package/dist/src/proto/google/protobuf/any.d.ts +173 -0
  124. package/dist/src/proto/google/protobuf/any.js +155 -0
  125. package/dist/src/proto/google/protobuf/any.js.map +1 -0
  126. package/dist/src/proto/google/protobuf/empty.d.ts +32 -0
  127. package/dist/src/proto/google/protobuf/empty.js +34 -0
  128. package/dist/src/proto/google/protobuf/empty.js.map +1 -0
  129. package/dist/src/proto/google/protobuf/timestamp.d.ts +149 -0
  130. package/dist/src/proto/google/protobuf/timestamp.js +136 -0
  131. package/dist/src/proto/google/protobuf/timestamp.js.map +1 -0
  132. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +320 -0
  133. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +245 -0
  134. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -0
  135. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +1089 -0
  136. package/dist/src/proto/packages/dht/protos/DhtRpc.js +710 -0
  137. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -0
  138. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +145 -0
  139. package/dist/src/proto/packages/dht/protos/DhtRpc.server.js +3 -0
  140. package/dist/src/proto/packages/dht/protos/DhtRpc.server.js.map +1 -0
  141. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.d.ts +87 -0
  142. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +66 -0
  143. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js.map +1 -0
  144. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.d.ts +156 -0
  145. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js +122 -0
  146. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js.map +1 -0
  147. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.d.ts +524 -0
  148. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js +350 -0
  149. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js.map +1 -0
  150. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.d.ts +65 -0
  151. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.js +3 -0
  152. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.js.map +1 -0
  153. package/dist/test/benchmark/first-message.d.ts +1 -0
  154. package/dist/test/benchmark/first-message.js +137 -0
  155. package/dist/test/benchmark/first-message.js.map +1 -0
  156. package/dist/test/utils/utils.d.ts +12 -0
  157. package/dist/test/utils/utils.js +86 -0
  158. package/dist/test/utils/utils.js.map +1 -0
  159. package/jest.config.js +36 -0
  160. package/karma.config.js +20 -0
  161. package/log.txt +501 -0
  162. package/package.json +53 -0
  163. package/proto.sh +2 -0
  164. package/protos/NetworkRpc.proto +161 -0
  165. package/src/NameDirectory.ts +44 -0
  166. package/src/NetworkNode.ts +169 -0
  167. package/src/NetworkStack.ts +144 -0
  168. package/src/exports.ts +6 -0
  169. package/src/identifiers.ts +1 -0
  170. package/src/logic/DuplicateMessageDetector.ts +167 -0
  171. package/src/logic/ILayer0.ts +14 -0
  172. package/src/logic/IStreamNode.ts +17 -0
  173. package/src/logic/PeerList.ts +106 -0
  174. package/src/logic/RandomGraphNode.ts +310 -0
  175. package/src/logic/Remote.ts +19 -0
  176. package/src/logic/RemoteRandomGraphNode.ts +39 -0
  177. package/src/logic/StreamEntryPointDiscovery.ts +221 -0
  178. package/src/logic/StreamNodeServer.ts +44 -0
  179. package/src/logic/StreamrNode.ts +416 -0
  180. package/src/logic/createRandomGraphNode.ts +114 -0
  181. package/src/logic/inspect/InspectSession.ts +49 -0
  182. package/src/logic/inspect/Inspector.ts +89 -0
  183. package/src/logic/neighbor-discovery/Handshaker.ts +180 -0
  184. package/src/logic/neighbor-discovery/HandshakerServer.ts +99 -0
  185. package/src/logic/neighbor-discovery/NeighborFinder.ts +61 -0
  186. package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +67 -0
  187. package/src/logic/neighbor-discovery/NeighborUpdateManagerServer.ts +61 -0
  188. package/src/logic/neighbor-discovery/RemoteHandshaker.ts +64 -0
  189. package/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.ts +41 -0
  190. package/src/logic/propagation/FifoMapWithTTL.ts +108 -0
  191. package/src/logic/propagation/Propagation.ts +83 -0
  192. package/src/logic/propagation/PropagationTaskStore.ts +40 -0
  193. package/src/logic/protocol-integration/stream-message/ContentMessageTranslator.ts +16 -0
  194. package/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.ts +28 -0
  195. package/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.ts +38 -0
  196. package/src/logic/protocol-integration/stream-message/StreamMessageTranslator.ts +142 -0
  197. package/src/logic/proxy/ProxyStreamConnectionClient.ts +255 -0
  198. package/src/logic/proxy/ProxyStreamConnectionServer.ts +97 -0
  199. package/src/logic/proxy/RemoteProxyServer.ts +36 -0
  200. package/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.ts +27 -0
  201. package/src/logic/temporary-connection/TemporaryConnectionRpcServer.ts +50 -0
  202. package/src/logic/utils.ts +17 -0
  203. package/src/proto/google/protobuf/any.ts +319 -0
  204. package/src/proto/google/protobuf/empty.ts +84 -0
  205. package/src/proto/google/protobuf/timestamp.ts +281 -0
  206. package/src/proto/packages/dht/protos/DhtRpc.client.ts +373 -0
  207. package/src/proto/packages/dht/protos/DhtRpc.server.ts +148 -0
  208. package/src/proto/packages/dht/protos/DhtRpc.ts +1399 -0
  209. package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +108 -0
  210. package/src/proto/packages/trackerless-network/protos/NetworkRpc.client.ts +176 -0
  211. package/src/proto/packages/trackerless-network/protos/NetworkRpc.server.ts +68 -0
  212. package/src/proto/packages/trackerless-network/protos/NetworkRpc.ts +667 -0
  213. package/test/benchmark/first-message.ts +155 -0
  214. package/test/end-to-end/inspect.test.ts +119 -0
  215. package/test/end-to-end/proxy-and-full-node.test.ts +140 -0
  216. package/test/end-to-end/proxy-connections.test.ts +228 -0
  217. package/test/end-to-end/proxy-key-exchange.test.ts +142 -0
  218. package/test/end-to-end/random-graph-with-real-connections.test.ts +154 -0
  219. package/test/end-to-end/webrtc-full-node-network.test.ts +97 -0
  220. package/test/end-to-end/websocket-full-node-network.test.ts +93 -0
  221. package/test/integration/Handshakes.test.ts +167 -0
  222. package/test/integration/Inspect.test.ts +102 -0
  223. package/test/integration/NetworkNode.test.ts +99 -0
  224. package/test/integration/NetworkRpc.test.ts +61 -0
  225. package/test/integration/NetworkStack.test.ts +74 -0
  226. package/test/integration/NetworkStackStoppedDuringStart.test.ts +45 -0
  227. package/test/integration/Propagation.test.ts +79 -0
  228. package/test/integration/RandomGraphNode-Layer1Node-Latencies.test.ts +141 -0
  229. package/test/integration/RandomGraphNode-Layer1Node.test.ts +226 -0
  230. package/test/integration/RemoteHandshaker.test.ts +78 -0
  231. package/test/integration/RemoteNeighborUpdateManager.test.ts +82 -0
  232. package/test/integration/RemoteRandomGraphNode.test.ts +102 -0
  233. package/test/integration/StreamrNode.test.ts +145 -0
  234. package/test/integration/stream-without-default-entrypoints.test.ts +132 -0
  235. package/test/unit/ContentMessageTranslator.test.ts +20 -0
  236. package/test/unit/DuplicateMessageDetector.test.ts +192 -0
  237. package/test/unit/FifoMapWithTtl.test.ts +229 -0
  238. package/test/unit/GroupKeyRequestTranslator.test.ts +36 -0
  239. package/test/unit/GroupKeyResponseTranslator.test.ts +39 -0
  240. package/test/unit/Handshaker.test.ts +63 -0
  241. package/test/unit/HandshakerServer.test.ts +123 -0
  242. package/test/unit/InspectSession.test.ts +78 -0
  243. package/test/unit/Inspector.test.ts +57 -0
  244. package/test/unit/NeighborFinder.test.ts +48 -0
  245. package/test/unit/NumberPair.test.ts +22 -0
  246. package/test/unit/PeerList.test.ts +150 -0
  247. package/test/unit/Propagation.test.ts +134 -0
  248. package/test/unit/RandomGraphNode.test.ts +73 -0
  249. package/test/unit/StreamEntrypointDiscovery.test.ts +152 -0
  250. package/test/unit/StreamMessageTranslator.test.ts +67 -0
  251. package/test/unit/StreamNodeServer.test.ts +63 -0
  252. package/test/unit/StreamrNode.test.ts +74 -0
  253. package/test/utils/mock/MockHandshaker.ts +15 -0
  254. package/test/utils/mock/MockLayer0.ts +71 -0
  255. package/test/utils/mock/MockLayer1.ts +6 -0
  256. package/test/utils/mock/MockNeighborFinder.ts +19 -0
  257. package/test/utils/mock/MockNeighborUpdateManager.ts +21 -0
  258. package/test/utils/mock/Transport.ts +25 -0
  259. package/test/utils/utils.ts +104 -0
  260. package/tsconfig.browser.json +12 -0
  261. package/tsconfig.jest.json +15 -0
  262. package/tsconfig.node.json +18 -0
package/.eslintignore ADDED
@@ -0,0 +1,7 @@
1
+ node_modules/**
2
+ coverage/**
3
+ dist/**
4
+ streamr-docker-dev/**
5
+ docs/**
6
+ .idea/**
7
+ src/proto/**
package/.eslintrc ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "../../.eslintrc.js"
3
+ }
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,5 @@
1
+ import { EthereumAddress } from '@streamr/utils';
2
+ export declare class NameDirectory {
3
+ static MAX_FALLBACK_NAME_LENGTH: number;
4
+ static getName(address: EthereumAddress | string | undefined): string | undefined;
5
+ }
@@ -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":";;;AAAA,gDAAkF;AAElF,iHAA6G;AAC7G,iDAA6D;AAE7D,uFAAuF;AAEvF;;EAEE;AAEF,MAAa,WAAW;IAKpB,YAAY,IAAoB;QADxB,YAAO,GAAG,KAAK,CAAA;QAEnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,IAAI,CAAC,KAAK,GAAG,IAAI,2BAAY,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAgB;QACxB,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAClC,CAAC;IAED,gBAAgB,CAAC,QAAiC;QAC9C,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IAC1D,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAoB,EAAE,YAA0B;QAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;IAClE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,aAA4B;QACtC,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,EAAE,CAAA;QACpD,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,mBAAmB,CAAC,YAAY,EAAE,2BAAc,CAAC,SAAS,CAAC;eACpF,aAAa,CAAC,WAAW,KAAK,4BAAiB,CAAC,OAAO,EAAE;YAC5D,MAAM,IAAI,KAAK,CAAC,kCAAkC,YAAY,+CAA+C,CAAC,CAAA;SACjH;QAED,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAA;QACnD,MAAM,GAAG,GAAG,iDAAuB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;QAC7D,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,eAAe,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;IAClE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,YAA0B;QACtC,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,mBAAmB,CAAC,YAAY,EAAE,2BAAc,CAAC,OAAO,CAAC,EAAE;YACvF,MAAM,IAAI,KAAK,CAAC,uBAAuB,YAAY,6CAA6C,CAAC,CAAA;SACpG;QACD,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAA;QACnD,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAA;IAC/D,CAAC;IAED,KAAK,CAAC,UAAU,CACZ,YAA0B,EAC1B,sBAAwC,EACxC,SAAyB,EACzB,SAAgC,EAChC,eAAwB;QAExB,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,sBAAsB,EAAE;YACjD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;SACzE;QACD,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,sBAAsB,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC,CAAA;IAC7H,CAAC;IAED,kBAAkB,CAAI,EAAmC;QACrD,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE;YACjD,MAAM,UAAU,GAAG,iDAAuB,CAAC,gBAAgB,CAAI,GAAG,CAAC,CAAA;YACnE,OAAO,EAAE,CAAC,UAAU,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;IACN,CAAC;IAED,wBAAwB,CAAC,YAA0B,EAAE,sBAAwC;QACzF,IAAI,CAAC,KAAK,CAAC,cAAc,EAAG,CAAC,wBAAwB,CAAC,YAAY,EAAE,sBAAsB,CAAC,CAAA;IAC/F,CAAC;IAED,qBAAqB,CAAI,EAAmC;QACxD,IAAI,IAAI,CAAC,OAAO,EAAE;YACd,OAAM;SACT;QACD,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE;YAClD,MAAM,UAAU,GAAG,iDAAuB,CAAC,gBAAgB,CAAI,GAAG,CAAC,CAAA;YACnE,OAAO,EAAE,CAAC,UAAU,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;IACN,CAAC;IAED,KAAK,CAAC,uBAAuB,CACzB,YAA0B,EAC1B,OAAgB,EAChB,iBAA0B;QAE1B,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAG,CAAC,mBAAmB,CAAC,YAAY,EAAE,2BAAc,CAAC,OAAO,CAAC,EAAE;YACxF,MAAM,IAAI,KAAK,CAAC,uBAAuB,YAAY,6CAA6C,CAAC,CAAA;SACpG;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,uBAAuB,CAAC,YAAY,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAA;IACxG,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,aAA4B,EAAE,OAAgB;QACtE,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,EAAE,CAAA;QACpD,MAAM,GAAG,GAAG,iDAAuB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;QAE7D,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAG,CAAC,mBAAmB,CAAC,YAAY,EAAE,2BAAc,CAAC,SAAS,CAAC,EAAE;YAC1F,MAAM,IAAI,KAAK,CAAC,qBAAqB,YAAY,+CAA+C,CAAC,CAAA;SACpG;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,qBAAqB,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;IACxF,CAAC;IAED,WAAW,CAAC,YAA0B;QAClC,IAAI,IAAI,CAAC,OAAO,EAAE;YACd,OAAM;SACT;QACD,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAA;IACnE,CAAC;IAED,yBAAyB,CAAC,YAA0B;QAChD,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;YACnC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,YAAY,CAAE,CAAC,MAAM,CAAC,0BAA0B,EAAE;YAC1F,CAAC,CAAC,EAAE,CAAA;IACZ,CAAC;IAED,aAAa,CAAC,YAA0B;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;IAC9D,CAAC;IAED,kBAAkB,CAAC,YAA0B,EAAE,aAAqB,EAAE,SAAyB;QAC3F,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAG,CAAC,kBAAkB,CAAC,YAAY,EAAE,aAA0B,EAAE,SAAS,CAAC,CAAA;IAC/G,CAAC;IAED,kDAAkD;IAClD,MAAM,CAAC,OAAe;QAClB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,IAAI;QACN,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;IAC3B,CAAC;IAED,iBAAiB;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,iBAAiB,EAAE,CAAA;IAC5D,CAAC;IAED,iBAAiB;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAA;IACzC,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE,CAAA;IAClD,CAAC;IAED,eAAe;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAA;IACxD,CAAC;IAED,cAAc;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,cAAc,EAAE,CAAA;IACvD,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,YAAY,EAAE,CAAA;IACrD,CAAC;IAED,kDAAkD;IAClD,iBAAiB;QACb,OAAO,EAAE,CAAA;IACb,CAAC;CACJ;AA7JD,kCA6JC"}
@@ -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
+ }