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