@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
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NetworkStack = void 0;
4
+ const dht_1 = require("@streamr/dht");
5
+ const StreamrNode_1 = require("./logic/StreamrNode");
6
+ const utils_1 = require("@streamr/utils");
7
+ const eventemitter3_1 = require("eventemitter3");
8
+ class ReadynessListener {
9
+ constructor(networkStack, dhtNode) {
10
+ this.emitter = new eventemitter3_1.EventEmitter();
11
+ this.onConnected = () => {
12
+ this.networkStack.off('stopped', this.onStopped);
13
+ this.dhtNode.off('connected', this.onConnected);
14
+ this.emitter.emit('done');
15
+ };
16
+ this.onStopped = () => {
17
+ this.networkStack.off('stopped', this.onStopped);
18
+ this.dhtNode.off('connected', this.onConnected);
19
+ this.emitter.emit('done');
20
+ };
21
+ this.networkStack = networkStack;
22
+ this.dhtNode = dhtNode;
23
+ this.networkStack.on('stopped', this.onStopped);
24
+ this.dhtNode.on('connected', this.onConnected);
25
+ }
26
+ async waitUntilReady(timeout) {
27
+ if (this.dhtNode.getNumberOfConnections() > 0) {
28
+ return;
29
+ }
30
+ else {
31
+ await (0, utils_1.waitForEvent3)(this.emitter, 'done', timeout);
32
+ }
33
+ }
34
+ }
35
+ class NetworkStack extends eventemitter3_1.EventEmitter {
36
+ constructor(options) {
37
+ super();
38
+ this.dhtJoinRequired = true;
39
+ this.options = options;
40
+ this.metricsContext = options.metricsContext ?? new utils_1.MetricsContext();
41
+ this.layer0DhtNode = new dht_1.DhtNode({
42
+ ...options.layer0,
43
+ metricsContext: this.metricsContext
44
+ });
45
+ this.streamrNode = new StreamrNode_1.StreamrNode({
46
+ ...options.networkNode,
47
+ nodeName: options.networkNode.nodeName ?? options.layer0.nodeName,
48
+ metricsContext: this.metricsContext
49
+ });
50
+ this.firstConnectionTimeout = options.networkNode.firstConnectionTimeout ?? 5000;
51
+ }
52
+ async start(doJoin = true) {
53
+ await this.layer0DhtNode.start();
54
+ this.connectionManager = this.layer0DhtNode.getTransport();
55
+ if (this.options.layer0.entryPoints.some((entryPoint) => (0, dht_1.isSamePeerDescriptor)(entryPoint, this.layer0DhtNode.getPeerDescriptor()))) {
56
+ this.dhtJoinRequired = false;
57
+ await this.layer0DhtNode?.joinDht(this.options.layer0.entryPoints);
58
+ await this.streamrNode?.start(this.layer0DhtNode, this.connectionManager, this.connectionManager);
59
+ }
60
+ else {
61
+ if (doJoin) {
62
+ this.dhtJoinRequired = false;
63
+ await this.joinDht();
64
+ }
65
+ await this.streamrNode?.start(this.layer0DhtNode, this.connectionManager, this.connectionManager);
66
+ }
67
+ }
68
+ async joinDht() {
69
+ setImmediate(() => {
70
+ this.layer0DhtNode?.joinDht(this.options.layer0.entryPoints);
71
+ });
72
+ await this.waitForFirstConnection();
73
+ }
74
+ async waitForFirstConnection() {
75
+ const readynessListener = new ReadynessListener(this, this.layer0DhtNode);
76
+ await readynessListener.waitUntilReady(this.firstConnectionTimeout);
77
+ }
78
+ async joinLayer0IfRequired(streamPartId) {
79
+ if (this.isJoinRequired(streamPartId)) {
80
+ this.dhtJoinRequired = false;
81
+ await this.joinDht();
82
+ }
83
+ else if (this.layer0DhtNode.getNumberOfConnections() < 1) {
84
+ await this.waitForFirstConnection();
85
+ }
86
+ }
87
+ isJoinRequired(streamPartId) {
88
+ return this.dhtJoinRequired && !this.layer0DhtNode.hasJoined() && this.streamrNode.isJoinRequired(streamPartId);
89
+ }
90
+ getStreamrNode() {
91
+ return this.streamrNode;
92
+ }
93
+ getLayer0DhtNode() {
94
+ return this.layer0DhtNode;
95
+ }
96
+ getMetricsContext() {
97
+ return this.metricsContext;
98
+ }
99
+ async stop() {
100
+ await this.streamrNode.destroy();
101
+ this.streamrNode = undefined;
102
+ this.layer0DhtNode = undefined;
103
+ this.connectionManager = undefined;
104
+ this.emit('stopped');
105
+ }
106
+ }
107
+ exports.NetworkStack = NetworkStack;
108
+ //# sourceMappingURL=NetworkStack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NetworkStack.js","sourceRoot":"","sources":["../../src/NetworkStack.ts"],"names":[],"mappings":"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"}
@@ -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,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProxyDirection = exports.NameDirectory = exports.NetworkNode = exports.NetworkStack = void 0;
4
+ var NetworkStack_1 = require("./NetworkStack");
5
+ Object.defineProperty(exports, "NetworkStack", { enumerable: true, get: function () { return NetworkStack_1.NetworkStack; } });
6
+ var NetworkNode_1 = require("./NetworkNode");
7
+ Object.defineProperty(exports, "NetworkNode", { enumerable: true, get: function () { return NetworkNode_1.NetworkNode; } });
8
+ var NameDirectory_1 = require("./NameDirectory");
9
+ Object.defineProperty(exports, "NameDirectory", { enumerable: true, get: function () { return NameDirectory_1.NameDirectory; } });
10
+ var NetworkRpc_1 = require("./proto/packages/trackerless-network/protos/NetworkRpc");
11
+ Object.defineProperty(exports, "ProxyDirection", { enumerable: true, get: function () { return NetworkRpc_1.ProxyDirection; } });
12
+ //# sourceMappingURL=exports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exports.js","sourceRoot":"","sources":["../../src/exports.ts"],"names":[],"mappings":";;;AAAA,+CAA6D;AAApD,4GAAA,YAAY,OAAA;AACrB,6CAA2C;AAAlC,0GAAA,WAAW,OAAA;AAEpB,iDAA+C;AAAtC,8GAAA,aAAa,OAAA;AAEtB,qFAAuF;AAA9E,4GAAA,cAAc,OAAA"}
@@ -0,0 +1 @@
1
+ export type NodeId = string;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=identifiers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifiers.js","sourceRoot":"","sources":["../../src/identifiers.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Represent a pair of numbers (a,b). Ordering between two pairs is defined as
3
+ * follows. First compare first numbers. Compare second numbers if first are
4
+ * equal.
5
+ */
6
+ export declare class NumberPair {
7
+ private readonly a;
8
+ private readonly b;
9
+ constructor(a: number, b: number);
10
+ greaterThanOrEqual(otherPair: NumberPair): boolean;
11
+ greaterThan(otherPair: NumberPair): boolean;
12
+ equalTo(otherPair: NumberPair): boolean;
13
+ private compareTo;
14
+ toString(): string;
15
+ }
16
+ export declare class InvalidNumberingError extends Error {
17
+ constructor();
18
+ }
19
+ export declare class GapMisMatchError extends Error {
20
+ constructor(state: string, previousNumber: NumberPair, number: NumberPair);
21
+ }
22
+ /**
23
+ *
24
+ * Keeps track of a stream's message numbers and reports already seen numbers
25
+ * as duplicates.
26
+ *
27
+ * Leverages the fact that message are assigned numbers from a strictly
28
+ * increasing integer sequence for lowered space complexity. For example,
29
+ * if we know that all messages up to number N have been seen, we can only
30
+ * store the number N to provide message identity check. This is because
31
+ * anything less than N can be deemed a duplicate.
32
+ *
33
+ * Messages arriving out-of-order makes this a bit harder since gaps form.
34
+ * Most of the code in this class is built to deal with this complexity.
35
+ * Basically, we need to keep track of which intervals [N,M] could still
36
+ * contain unseen messages. We should also remove intervals after we are sure
37
+ * that they contain no unseen messages.
38
+ *
39
+ * In addition to the above, there needs to be a limit to the number of
40
+ * intervals we store, as it could well be that some messages never
41
+ * arrive. The strategy is to start removing the lowest numbered
42
+ * intervals when storage limits are hit.
43
+ *
44
+ */
45
+ export declare class DuplicateMessageDetector {
46
+ private readonly maxNumberOfGaps;
47
+ private readonly gaps;
48
+ constructor(maxNumberOfGaps?: number);
49
+ /**
50
+ * returns true if number has not yet been seen (i.e. is not a duplicate)
51
+ */
52
+ markAndCheck(previousNumber: NumberPair | null, number: NumberPair): boolean | never;
53
+ private dropLowestGapIfOverMaxNumberOfGaps;
54
+ toString(): string;
55
+ }
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DuplicateMessageDetector = exports.GapMisMatchError = exports.InvalidNumberingError = exports.NumberPair = void 0;
4
+ /**
5
+ * Represent a pair of numbers (a,b). Ordering between two pairs is defined as
6
+ * follows. First compare first numbers. Compare second numbers if first are
7
+ * equal.
8
+ */
9
+ class NumberPair {
10
+ constructor(a, b) {
11
+ this.a = a;
12
+ this.b = b;
13
+ }
14
+ greaterThanOrEqual(otherPair) {
15
+ return this.greaterThan(otherPair) || this.equalTo(otherPair);
16
+ }
17
+ greaterThan(otherPair) {
18
+ return this.compareTo(otherPair) === 1;
19
+ }
20
+ equalTo(otherPair) {
21
+ return this.compareTo(otherPair) === 0;
22
+ }
23
+ compareTo(otherPair) {
24
+ if (this.a > otherPair.a) {
25
+ return 1;
26
+ }
27
+ if (this.a < otherPair.a) {
28
+ return -1;
29
+ }
30
+ if (this.b > otherPair.b) {
31
+ return 1;
32
+ }
33
+ if (this.b < otherPair.b) {
34
+ return -1;
35
+ }
36
+ return 0;
37
+ }
38
+ toString() {
39
+ return `${this.a}|${this.b}`;
40
+ }
41
+ }
42
+ exports.NumberPair = NumberPair;
43
+ class InvalidNumberingError extends Error {
44
+ constructor() {
45
+ super('pre-condition: previousNumber < number');
46
+ }
47
+ }
48
+ exports.InvalidNumberingError = InvalidNumberingError;
49
+ class GapMisMatchError extends Error {
50
+ constructor(state, previousNumber, number) {
51
+ super('pre-condition: gap overlap in given numbers:'
52
+ + ` previousNumber=${previousNumber}, number=${number}, state=${state}`);
53
+ }
54
+ }
55
+ exports.GapMisMatchError = GapMisMatchError;
56
+ /**
57
+ *
58
+ * Keeps track of a stream's message numbers and reports already seen numbers
59
+ * as duplicates.
60
+ *
61
+ * Leverages the fact that message are assigned numbers from a strictly
62
+ * increasing integer sequence for lowered space complexity. For example,
63
+ * if we know that all messages up to number N have been seen, we can only
64
+ * store the number N to provide message identity check. This is because
65
+ * anything less than N can be deemed a duplicate.
66
+ *
67
+ * Messages arriving out-of-order makes this a bit harder since gaps form.
68
+ * Most of the code in this class is built to deal with this complexity.
69
+ * Basically, we need to keep track of which intervals [N,M] could still
70
+ * contain unseen messages. We should also remove intervals after we are sure
71
+ * that they contain no unseen messages.
72
+ *
73
+ * In addition to the above, there needs to be a limit to the number of
74
+ * intervals we store, as it could well be that some messages never
75
+ * arrive. The strategy is to start removing the lowest numbered
76
+ * intervals when storage limits are hit.
77
+ *
78
+ */
79
+ class DuplicateMessageDetector {
80
+ constructor(maxNumberOfGaps = 10000) {
81
+ this.maxNumberOfGaps = maxNumberOfGaps;
82
+ this.gaps = []; // ascending order of half-closed intervals (x,y] representing gaps that contain unseen message(s)
83
+ }
84
+ /**
85
+ * returns true if number has not yet been seen (i.e. is not a duplicate)
86
+ */
87
+ markAndCheck(previousNumber, number) {
88
+ if (previousNumber && previousNumber.greaterThanOrEqual(number)) {
89
+ throw new InvalidNumberingError();
90
+ }
91
+ if (this.gaps.length === 0) {
92
+ this.gaps.push([number, new NumberPair(Infinity, Infinity)]);
93
+ return true;
94
+ }
95
+ // Handle special case where previousNumber is not provided. Only
96
+ // minimal duplicate detection is provided (comparing against latest
97
+ // known message number).
98
+ if (previousNumber === null) {
99
+ if (number.greaterThan(this.gaps[this.gaps.length - 1][0])) {
100
+ this.gaps[this.gaps.length - 1][0] = number;
101
+ return true;
102
+ }
103
+ return false;
104
+ }
105
+ for (let i = this.gaps.length - 1; i >= 0; --i) {
106
+ const [lowerBound, upperBound] = this.gaps[i]; // invariant: upperBound > lowerBound
107
+ // implies number > upperBound (would've been handled in previous iteration if gap exists)
108
+ if (previousNumber.greaterThanOrEqual(upperBound)) {
109
+ return false;
110
+ }
111
+ if (previousNumber.greaterThanOrEqual(lowerBound)) {
112
+ if (number.greaterThan(upperBound)) {
113
+ throw new GapMisMatchError(this.toString(), previousNumber, number);
114
+ }
115
+ if (previousNumber.equalTo(lowerBound)) {
116
+ if (number.equalTo(upperBound)) {
117
+ this.gaps.splice(i, 1);
118
+ }
119
+ else {
120
+ this.gaps[i] = [number, upperBound];
121
+ }
122
+ }
123
+ else if (number.equalTo(upperBound)) {
124
+ this.gaps[i] = [lowerBound, previousNumber];
125
+ }
126
+ else {
127
+ this.gaps.splice(i, 1, [lowerBound, previousNumber], [number, upperBound]);
128
+ }
129
+ // invariants after:
130
+ // - gaps are in ascending order
131
+ // - the intersection between any two gaps is empty
132
+ // - there are no gaps that define the empty set
133
+ // - last gap is [n, Infinity]
134
+ // - anything not covered by a gap is considered seen
135
+ this.dropLowestGapIfOverMaxNumberOfGaps();
136
+ return true;
137
+ }
138
+ if (number.greaterThan(lowerBound)) {
139
+ throw new GapMisMatchError(this.toString(), previousNumber, number);
140
+ }
141
+ }
142
+ return false;
143
+ }
144
+ dropLowestGapIfOverMaxNumberOfGaps() {
145
+ // invariant: this.gaps.length <= this.maxNumberOfGaps + 1
146
+ if (this.gaps.length > this.maxNumberOfGaps) {
147
+ this.gaps.shift();
148
+ }
149
+ }
150
+ toString() {
151
+ return this.gaps.map(([lower, upper]) => `(${lower}, ${upper}]`).join(', ');
152
+ }
153
+ }
154
+ exports.DuplicateMessageDetector = DuplicateMessageDetector;
155
+ //# sourceMappingURL=DuplicateMessageDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DuplicateMessageDetector.js","sourceRoot":"","sources":["../../../src/logic/DuplicateMessageDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { DataEntry, ITransport, PeerDescriptor, PeerID, RecursiveFindResult } from '@streamr/dht';
2
+ import { Any } from '../proto/google/protobuf/any';
3
+ export interface ILayer0 extends ITransport {
4
+ getPeerDescriptor(): PeerDescriptor;
5
+ getNodeId(): PeerID;
6
+ getDataFromDht(key: Uint8Array): Promise<RecursiveFindResult>;
7
+ findDataViaPeer(key: Uint8Array, peer: PeerDescriptor): Promise<DataEntry[]>;
8
+ storeDataToDht(key: Uint8Array, data: Any): Promise<PeerDescriptor[]>;
9
+ deleteDataFromDht(key: Uint8Array): Promise<void>;
10
+ getKnownEntryPoints(): PeerDescriptor[];
11
+ isJoinOngoing(): boolean;
12
+ stop(): Promise<void>;
13
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ILayer0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ILayer0.js","sourceRoot":"","sources":["../../../src/logic/ILayer0.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { PeerIDKey } from '@streamr/dht';
2
+ import { ProxyDirection, StreamMessage } from '../proto/packages/trackerless-network/protos/NetworkRpc';
3
+ export interface IStreamNode {
4
+ on(event: 'message', listener: (message: StreamMessage) => void): this;
5
+ once(event: 'message', listener: (message: StreamMessage) => void): this;
6
+ off(event: 'message', listener: (message: StreamMessage) => void): void;
7
+ broadcast(msg: StreamMessage, previousPeer?: string): void;
8
+ hasProxyConnection(peerKey: PeerIDKey, direction: ProxyDirection): boolean;
9
+ stop(): void;
10
+ start(): Promise<void>;
11
+ getTargetNeighborStringIds(): string[];
12
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IStreamNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IStreamNode.js","sourceRoot":"","sources":["../../../src/logic/IStreamNode.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import { PeerDescriptor, PeerID } from '@streamr/dht';
2
+ import { RemoteRandomGraphNode } from './RemoteRandomGraphNode';
3
+ import { EventEmitter } from 'eventemitter3';
4
+ export interface Events {
5
+ peerAdded: (id: string, remote: RemoteRandomGraphNode) => any;
6
+ }
7
+ export declare class PeerList extends EventEmitter<Events> {
8
+ private readonly peers;
9
+ private readonly limit;
10
+ private ownPeerID;
11
+ constructor(ownPeerId: PeerID, limit: number);
12
+ add(remote: RemoteRandomGraphNode): void;
13
+ remove(peerDescriptor: PeerDescriptor): void;
14
+ removeById(stringId: string): void;
15
+ hasPeer(peerDescriptor: PeerDescriptor): boolean;
16
+ hasPeerWithStringId(stringId: string): boolean;
17
+ replaceAll(neighbors: RemoteRandomGraphNode[]): void;
18
+ getStringIds(): string[];
19
+ getNeighborById(id: string): RemoteRandomGraphNode | undefined;
20
+ size(exclude?: string[]): number;
21
+ getRandom(exclude: string[]): RemoteRandomGraphNode | undefined;
22
+ getClosest(exclude: string[]): RemoteRandomGraphNode | undefined;
23
+ getClosestAndFurthest(exclude: string[]): RemoteRandomGraphNode[];
24
+ getFurthest(exclude: string[]): RemoteRandomGraphNode | undefined;
25
+ getPeers(): RemoteRandomGraphNode[];
26
+ stop(): void;
27
+ }
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PeerList = void 0;
4
+ const dht_1 = require("@streamr/dht");
5
+ const lodash_1 = require("lodash");
6
+ const eventemitter3_1 = require("eventemitter3");
7
+ const getValuesOfIncludedKeys = (peers, exclude) => {
8
+ return Array.from(peers.entries())
9
+ .filter(([id, _peer]) => !exclude.includes(id))
10
+ .map(([_id, peer]) => peer);
11
+ };
12
+ class PeerList extends eventemitter3_1.EventEmitter {
13
+ constructor(ownPeerId, limit) {
14
+ super();
15
+ this.peers = new Map();
16
+ this.limit = limit;
17
+ this.ownPeerID = ownPeerId;
18
+ }
19
+ add(remote) {
20
+ if (!this.ownPeerID.equals((0, dht_1.peerIdFromPeerDescriptor)(remote.getPeerDescriptor())) && this.peers.size < this.limit) {
21
+ const stringId = (0, dht_1.keyFromPeerDescriptor)(remote.getPeerDescriptor());
22
+ const isExistingPeer = this.peers.has(stringId);
23
+ this.peers.set(stringId, remote);
24
+ if (!isExistingPeer) {
25
+ this.emit('peerAdded', stringId, remote);
26
+ }
27
+ }
28
+ }
29
+ remove(peerDescriptor) {
30
+ this.peers.delete((0, dht_1.keyFromPeerDescriptor)(peerDescriptor));
31
+ }
32
+ removeById(stringId) {
33
+ this.peers.delete(stringId);
34
+ }
35
+ hasPeer(peerDescriptor) {
36
+ return this.peers.has((0, dht_1.keyFromPeerDescriptor)(peerDescriptor));
37
+ }
38
+ hasPeerWithStringId(stringId) {
39
+ return this.peers.has(stringId);
40
+ }
41
+ replaceAll(neighbors) {
42
+ this.peers.clear();
43
+ const limited = neighbors.splice(0, this.limit);
44
+ limited.forEach((remote) => {
45
+ this.add(remote);
46
+ });
47
+ }
48
+ getStringIds() {
49
+ return Array.from(this.peers.keys());
50
+ }
51
+ getNeighborById(id) {
52
+ return this.peers.get(id);
53
+ }
54
+ size(exclude = []) {
55
+ return Array.from(this.peers.keys()).filter((peer) => !exclude.includes(peer)).length;
56
+ }
57
+ getRandom(exclude) {
58
+ return (0, lodash_1.sample)(getValuesOfIncludedKeys(this.peers, exclude));
59
+ }
60
+ getClosest(exclude) {
61
+ const included = getValuesOfIncludedKeys(this.peers, exclude);
62
+ return included[0];
63
+ }
64
+ getClosestAndFurthest(exclude) {
65
+ const included = getValuesOfIncludedKeys(this.peers, exclude);
66
+ if (included.length === 0) {
67
+ return [];
68
+ }
69
+ return included.length > 1 ? [this.getClosest(exclude), this.getFurthest(exclude)] : [this.getClosest(exclude)];
70
+ }
71
+ getFurthest(exclude) {
72
+ const included = getValuesOfIncludedKeys(this.peers, exclude);
73
+ return included[included.length - 1];
74
+ }
75
+ getPeers() {
76
+ return Array.from(this.peers.values());
77
+ }
78
+ stop() {
79
+ this.peers.clear();
80
+ this.removeAllListeners();
81
+ }
82
+ }
83
+ exports.PeerList = PeerList;
84
+ //# sourceMappingURL=PeerList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PeerList.js","sourceRoot":"","sources":["../../../src/logic/PeerList.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import { EventEmitter } from 'eventemitter3';
2
+ import { DhtNode, PeerDescriptor, ListeningRpcCommunicator, ITransport, ConnectionLocker, PeerIDKey } from '@streamr/dht';
3
+ import { StreamMessage } from '../proto/packages/trackerless-network/protos/NetworkRpc';
4
+ import { PeerList } from './PeerList';
5
+ import { IHandshaker } from './neighbor-discovery/Handshaker';
6
+ import { Propagation } from './propagation/Propagation';
7
+ import { INeighborFinder } from './neighbor-discovery/NeighborFinder';
8
+ import { INeighborUpdateManager } from './neighbor-discovery/NeighborUpdateManager';
9
+ import { IStreamNode } from './IStreamNode';
10
+ import { ProxyStreamConnectionServer } from './proxy/ProxyStreamConnectionServer';
11
+ import { IInspector } from './inspect/Inspector';
12
+ import { TemporaryConnectionRpcServer } from './temporary-connection/TemporaryConnectionRpcServer';
13
+ export interface Events {
14
+ message: (message: StreamMessage) => void;
15
+ targetNeighborConnected: (stringId: string) => void;
16
+ nearbyContactPoolIdAdded: () => void;
17
+ }
18
+ export interface StrictRandomGraphNodeConfig {
19
+ randomGraphId: string;
20
+ layer1: DhtNode;
21
+ P2PTransport: ITransport;
22
+ connectionLocker: ConnectionLocker;
23
+ ownPeerDescriptor: PeerDescriptor;
24
+ peerViewSize: number;
25
+ nearbyContactPool: PeerList;
26
+ randomContactPool: PeerList;
27
+ targetNeighbors: PeerList;
28
+ handshaker: IHandshaker;
29
+ neighborFinder: INeighborFinder;
30
+ neighborUpdateManager: INeighborUpdateManager;
31
+ propagation: Propagation;
32
+ rpcCommunicator: ListeningRpcCommunicator;
33
+ numOfTargetNeighbors: number;
34
+ maxNumberOfContacts: number;
35
+ minPropagationTargets: number;
36
+ name: string;
37
+ acceptProxyConnections: boolean;
38
+ neighborUpdateInterval: number;
39
+ inspector: IInspector;
40
+ temporaryConnectionServer: TemporaryConnectionRpcServer;
41
+ proxyConnectionServer?: ProxyStreamConnectionServer;
42
+ }
43
+ export declare class RandomGraphNode extends EventEmitter<Events> implements IStreamNode {
44
+ private stopped;
45
+ private started;
46
+ private readonly duplicateDetectors;
47
+ private config;
48
+ private readonly server;
49
+ constructor(config: StrictRandomGraphNodeConfig);
50
+ start(): Promise<void>;
51
+ private registerDefaultServerMethods;
52
+ private newContact;
53
+ private removedContact;
54
+ private newRandomContact;
55
+ private removedRandomContact;
56
+ private onPeerDisconnected;
57
+ private getNewNeighborCandidates;
58
+ hasProxyConnection(peerKey: PeerIDKey): boolean;
59
+ stop(): void;
60
+ broadcast(msg: StreamMessage, previousPeer?: string): void;
61
+ inspect(peerDescriptor: PeerDescriptor): Promise<boolean>;
62
+ private getPropagationTargets;
63
+ getOwnStringId(): PeerIDKey;
64
+ getNumberOfOutgoingHandshakes(): number;
65
+ getTargetNeighborStringIds(): string[];
66
+ getNearbyContactPoolIds(): string[];
67
+ getRandomContactPoolIds(): string[];
68
+ }