@streamr/dht 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 (344) hide show
  1. package/.eslintignore +5 -0
  2. package/.eslintrc +3 -0
  3. package/README.md +38 -0
  4. package/dist/src/connection/Connection.d.ts +11 -0
  5. package/dist/src/connection/Connection.js +23 -0
  6. package/dist/src/connection/Connection.js.map +1 -0
  7. package/dist/src/connection/ConnectionLockHandler.d.ts +23 -0
  8. package/dist/src/connection/ConnectionLockHandler.js +94 -0
  9. package/dist/src/connection/ConnectionLockHandler.js.map +1 -0
  10. package/dist/src/connection/ConnectionManager.d.ts +94 -0
  11. package/dist/src/connection/ConnectionManager.js +554 -0
  12. package/dist/src/connection/ConnectionManager.js.map +1 -0
  13. package/dist/src/connection/ConnectivityChecker.d.ts +17 -0
  14. package/dist/src/connection/ConnectivityChecker.js +187 -0
  15. package/dist/src/connection/ConnectivityChecker.js.map +1 -0
  16. package/dist/src/connection/Handshaker.d.ts +19 -0
  17. package/dist/src/connection/Handshaker.js +77 -0
  18. package/dist/src/connection/Handshaker.js.map +1 -0
  19. package/dist/src/connection/IConnection.d.ts +38 -0
  20. package/dist/src/connection/IConnection.js +19 -0
  21. package/dist/src/connection/IConnection.js.map +1 -0
  22. package/dist/src/connection/IConnectionSource.d.ts +4 -0
  23. package/dist/src/connection/IConnectionSource.js +3 -0
  24. package/dist/src/connection/IConnectionSource.js.map +1 -0
  25. package/dist/src/connection/ManagedConnection.d.ts +60 -0
  26. package/dist/src/connection/ManagedConnection.js +352 -0
  27. package/dist/src/connection/ManagedConnection.js.map +1 -0
  28. package/dist/src/connection/ManagedWebRtcConnection.d.ts +7 -0
  29. package/dist/src/connection/ManagedWebRtcConnection.js +20 -0
  30. package/dist/src/connection/ManagedWebRtcConnection.js.map +1 -0
  31. package/dist/src/connection/RemoteConnectionLocker.d.ts +14 -0
  32. package/dist/src/connection/RemoteConnectionLocker.js +93 -0
  33. package/dist/src/connection/RemoteConnectionLocker.js.map +1 -0
  34. package/dist/src/connection/Simulator/Simulator.d.ts +42 -0
  35. package/dist/src/connection/Simulator/Simulator.js +325 -0
  36. package/dist/src/connection/Simulator/Simulator.js.map +1 -0
  37. package/dist/src/connection/Simulator/SimulatorConnection.d.ts +19 -0
  38. package/dist/src/connection/Simulator/SimulatorConnection.js +118 -0
  39. package/dist/src/connection/Simulator/SimulatorConnection.js.map +1 -0
  40. package/dist/src/connection/Simulator/SimulatorConnector.d.ts +17 -0
  41. package/dist/src/connection/Simulator/SimulatorConnector.js +72 -0
  42. package/dist/src/connection/Simulator/SimulatorConnector.js.map +1 -0
  43. package/dist/src/connection/Simulator/SimulatorTransport.d.ts +6 -0
  44. package/dist/src/connection/Simulator/SimulatorTransport.js +11 -0
  45. package/dist/src/connection/Simulator/SimulatorTransport.js.map +1 -0
  46. package/dist/src/connection/Simulator/pings.d.ts +21 -0
  47. package/dist/src/connection/Simulator/pings.js +61 -0
  48. package/dist/src/connection/Simulator/pings.js.map +1 -0
  49. package/dist/src/connection/WebRTC/IWebRtcConnection.d.ts +20 -0
  50. package/dist/src/connection/WebRTC/IWebRtcConnection.js +9 -0
  51. package/dist/src/connection/WebRTC/IWebRtcConnection.js.map +1 -0
  52. package/dist/src/connection/WebRTC/NodeWebRtcConnection.d.ts +47 -0
  53. package/dist/src/connection/WebRTC/NodeWebRtcConnection.js +233 -0
  54. package/dist/src/connection/WebRTC/NodeWebRtcConnection.js.map +1 -0
  55. package/dist/src/connection/WebRTC/RemoteWebrtcConnector.d.ts +12 -0
  56. package/dist/src/connection/WebRTC/RemoteWebrtcConnector.js +74 -0
  57. package/dist/src/connection/WebRTC/RemoteWebrtcConnector.js.map +1 -0
  58. package/dist/src/connection/WebRTC/WebRtcConnector.d.ts +47 -0
  59. package/dist/src/connection/WebRTC/WebRtcConnector.js +227 -0
  60. package/dist/src/connection/WebRTC/WebRtcConnector.js.map +1 -0
  61. package/dist/src/connection/WebRTC/iceServerAsString.d.ts +2 -0
  62. package/dist/src/connection/WebRTC/iceServerAsString.js +18 -0
  63. package/dist/src/connection/WebRTC/iceServerAsString.js.map +1 -0
  64. package/dist/src/connection/WebSocket/ClientWebSocket.d.ts +15 -0
  65. package/dist/src/connection/WebSocket/ClientWebSocket.js +113 -0
  66. package/dist/src/connection/WebSocket/ClientWebSocket.js.map +1 -0
  67. package/dist/src/connection/WebSocket/RemoteWebSocketConnector.d.ts +9 -0
  68. package/dist/src/connection/WebSocket/RemoteWebSocketConnector.js +63 -0
  69. package/dist/src/connection/WebSocket/RemoteWebSocketConnector.js.map +1 -0
  70. package/dist/src/connection/WebSocket/ServerWebSocket.d.ts +18 -0
  71. package/dist/src/connection/WebSocket/ServerWebSocket.js +103 -0
  72. package/dist/src/connection/WebSocket/ServerWebSocket.js.map +1 -0
  73. package/dist/src/connection/WebSocket/WebSocketConnector.d.ts +31 -0
  74. package/dist/src/connection/WebSocket/WebSocketConnector.js +202 -0
  75. package/dist/src/connection/WebSocket/WebSocketConnector.js.map +1 -0
  76. package/dist/src/connection/WebSocket/WebSocketServer.d.ts +9 -0
  77. package/dist/src/connection/WebSocket/WebSocketServer.js +101 -0
  78. package/dist/src/connection/WebSocket/WebSocketServer.js.map +1 -0
  79. package/dist/src/dht/DhtNode.d.ts +153 -0
  80. package/dist/src/dht/DhtNode.js +599 -0
  81. package/dist/src/dht/DhtNode.js.map +1 -0
  82. package/dist/src/dht/DhtPeer.d.ts +18 -0
  83. package/dist/src/dht/DhtPeer.js +74 -0
  84. package/dist/src/dht/DhtPeer.js.map +1 -0
  85. package/dist/src/dht/ExternalApi.d.ts +8 -0
  86. package/dist/src/dht/ExternalApi.js +26 -0
  87. package/dist/src/dht/ExternalApi.js.map +1 -0
  88. package/dist/src/dht/RemoteExternalApi.d.ts +6 -0
  89. package/dist/src/dht/RemoteExternalApi.js +26 -0
  90. package/dist/src/dht/RemoteExternalApi.js.map +1 -0
  91. package/dist/src/dht/contact/Contact.d.ts +22 -0
  92. package/dist/src/dht/contact/Contact.js +25 -0
  93. package/dist/src/dht/contact/Contact.js.map +1 -0
  94. package/dist/src/dht/contact/RandomContactList.d.ts +20 -0
  95. package/dist/src/dht/contact/RandomContactList.js +78 -0
  96. package/dist/src/dht/contact/RandomContactList.js.map +1 -0
  97. package/dist/src/dht/contact/Remote.d.ts +15 -0
  98. package/dist/src/dht/contact/Remote.js +24 -0
  99. package/dist/src/dht/contact/Remote.js.map +1 -0
  100. package/dist/src/dht/contact/SortedContactList.d.ts +35 -0
  101. package/dist/src/dht/contact/SortedContactList.js +156 -0
  102. package/dist/src/dht/contact/SortedContactList.js.map +1 -0
  103. package/dist/src/dht/discovery/DiscoverySession.d.ts +36 -0
  104. package/dist/src/dht/discovery/DiscoverySession.js +116 -0
  105. package/dist/src/dht/discovery/DiscoverySession.js.map +1 -0
  106. package/dist/src/dht/discovery/PeerDiscovery.d.ts +42 -0
  107. package/dist/src/dht/discovery/PeerDiscovery.js +157 -0
  108. package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -0
  109. package/dist/src/dht/find/RecursiveFindSession.d.ts +46 -0
  110. package/dist/src/dht/find/RecursiveFindSession.js +142 -0
  111. package/dist/src/dht/find/RecursiveFindSession.js.map +1 -0
  112. package/dist/src/dht/find/RecursiveFinder.d.ts +54 -0
  113. package/dist/src/dht/find/RecursiveFinder.js +180 -0
  114. package/dist/src/dht/find/RecursiveFinder.js.map +1 -0
  115. package/dist/src/dht/find/RemoteRecursiveFindSession.d.ts +6 -0
  116. package/dist/src/dht/find/RemoteRecursiveFindSession.js +25 -0
  117. package/dist/src/dht/find/RemoteRecursiveFindSession.js.map +1 -0
  118. package/dist/src/dht/routing/DuplicateDetector.d.ts +13 -0
  119. package/dist/src/dht/routing/DuplicateDetector.js +41 -0
  120. package/dist/src/dht/routing/DuplicateDetector.js.map +1 -0
  121. package/dist/src/dht/routing/RemoteRouter.d.ts +8 -0
  122. package/dist/src/dht/routing/RemoteRouter.js +106 -0
  123. package/dist/src/dht/routing/RemoteRouter.js.map +1 -0
  124. package/dist/src/dht/routing/Router.d.ts +60 -0
  125. package/dist/src/dht/routing/Router.js +207 -0
  126. package/dist/src/dht/routing/Router.js.map +1 -0
  127. package/dist/src/dht/routing/RoutingSession.d.ts +42 -0
  128. package/dist/src/dht/routing/RoutingSession.js +178 -0
  129. package/dist/src/dht/routing/RoutingSession.js.map +1 -0
  130. package/dist/src/dht/store/DataStore.d.ts +45 -0
  131. package/dist/src/dht/store/DataStore.js +244 -0
  132. package/dist/src/dht/store/DataStore.js.map +1 -0
  133. package/dist/src/dht/store/LocalDataStore.d.ts +19 -0
  134. package/dist/src/dht/store/LocalDataStore.js +104 -0
  135. package/dist/src/dht/store/LocalDataStore.js.map +1 -0
  136. package/dist/src/dht/store/RemoteStore.d.ts +8 -0
  137. package/dist/src/dht/store/RemoteStore.js +44 -0
  138. package/dist/src/dht/store/RemoteStore.js.map +1 -0
  139. package/dist/src/exports.d.ts +19 -0
  140. package/dist/src/exports.js +41 -0
  141. package/dist/src/exports.js.map +1 -0
  142. package/dist/src/helpers/AddressTools.d.ts +2 -0
  143. package/dist/src/helpers/AddressTools.js +31 -0
  144. package/dist/src/helpers/AddressTools.js.map +1 -0
  145. package/dist/src/helpers/PeerID.d.ts +25 -0
  146. package/dist/src/helpers/PeerID.js +84 -0
  147. package/dist/src/helpers/PeerID.js.map +1 -0
  148. package/dist/src/helpers/UUID.d.ts +7 -0
  149. package/dist/src/helpers/UUID.js +32 -0
  150. package/dist/src/helpers/UUID.js.map +1 -0
  151. package/dist/src/helpers/debugHelpers.d.ts +3 -0
  152. package/dist/src/helpers/debugHelpers.js +11 -0
  153. package/dist/src/helpers/debugHelpers.js.map +1 -0
  154. package/dist/src/helpers/errors.d.ts +72 -0
  155. package/dist/src/helpers/errors.js +95 -0
  156. package/dist/src/helpers/errors.js.map +1 -0
  157. package/dist/src/helpers/peerIdFromPeerDescriptor.d.ts +5 -0
  158. package/dist/src/helpers/peerIdFromPeerDescriptor.js +17 -0
  159. package/dist/src/helpers/peerIdFromPeerDescriptor.js.map +1 -0
  160. package/dist/src/helpers/protoClasses.d.ts +2 -0
  161. package/dist/src/helpers/protoClasses.js +35 -0
  162. package/dist/src/helpers/protoClasses.js.map +1 -0
  163. package/dist/src/helpers/protoToString.d.ts +2 -0
  164. package/dist/src/helpers/protoToString.js +20 -0
  165. package/dist/src/helpers/protoToString.js.map +1 -0
  166. package/dist/src/proto/google/protobuf/any.d.ts +173 -0
  167. package/dist/src/proto/google/protobuf/any.js +155 -0
  168. package/dist/src/proto/google/protobuf/any.js.map +1 -0
  169. package/dist/src/proto/google/protobuf/empty.d.ts +32 -0
  170. package/dist/src/proto/google/protobuf/empty.js +34 -0
  171. package/dist/src/proto/google/protobuf/empty.js.map +1 -0
  172. package/dist/src/proto/google/protobuf/timestamp.d.ts +149 -0
  173. package/dist/src/proto/google/protobuf/timestamp.js +136 -0
  174. package/dist/src/proto/google/protobuf/timestamp.js.map +1 -0
  175. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +320 -0
  176. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +245 -0
  177. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -0
  178. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +1089 -0
  179. package/dist/src/proto/packages/dht/protos/DhtRpc.js +710 -0
  180. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -0
  181. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +145 -0
  182. package/dist/src/proto/packages/dht/protos/DhtRpc.server.js +3 -0
  183. package/dist/src/proto/packages/dht/protos/DhtRpc.server.js.map +1 -0
  184. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.d.ts +87 -0
  185. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +66 -0
  186. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js.map +1 -0
  187. package/dist/src/proto/tests.d.ts +39 -0
  188. package/dist/src/proto/tests.js +34 -0
  189. package/dist/src/proto/tests.js.map +1 -0
  190. package/dist/src/rpc-protocol/DhtCallContext.d.ts +12 -0
  191. package/dist/src/rpc-protocol/DhtCallContext.js +8 -0
  192. package/dist/src/rpc-protocol/DhtCallContext.js.map +1 -0
  193. package/dist/src/rpc-protocol/DhtRpcOptions.d.ts +8 -0
  194. package/dist/src/rpc-protocol/DhtRpcOptions.js +3 -0
  195. package/dist/src/rpc-protocol/DhtRpcOptions.js.map +1 -0
  196. package/dist/src/transport/ITransport.d.ts +22 -0
  197. package/dist/src/transport/ITransport.js +3 -0
  198. package/dist/src/transport/ITransport.js.map +1 -0
  199. package/dist/src/transport/ListeningRpcCommunicator.d.ts +6 -0
  200. package/dist/src/transport/ListeningRpcCommunicator.js +14 -0
  201. package/dist/src/transport/ListeningRpcCommunicator.js.map +1 -0
  202. package/dist/src/transport/RoutingRpcCommunicator.d.ts +8 -0
  203. package/dist/src/transport/RoutingRpcCommunicator.js +52 -0
  204. package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -0
  205. package/jest.config.js +2 -0
  206. package/karma.config.js +20 -0
  207. package/package.json +64 -0
  208. package/proto.sh +3 -0
  209. package/protos/DhtRpc.proto +330 -0
  210. package/protos/tests.proto +16 -0
  211. package/src/connection/Connection.ts +23 -0
  212. package/src/connection/ConnectionLockHandler.ts +105 -0
  213. package/src/connection/ConnectionManager.ts +676 -0
  214. package/src/connection/ConnectivityChecker.ts +173 -0
  215. package/src/connection/Handshaker.ts +92 -0
  216. package/src/connection/IConnection.ts +47 -0
  217. package/src/connection/IConnectionSource.ts +6 -0
  218. package/src/connection/ManagedConnection.ts +398 -0
  219. package/src/connection/ManagedWebRtcConnection.ts +27 -0
  220. package/src/connection/RemoteConnectionLocker.ts +88 -0
  221. package/src/connection/Simulator/Simulator.ts +399 -0
  222. package/src/connection/Simulator/SimulatorConnection.ts +137 -0
  223. package/src/connection/Simulator/SimulatorConnector.ts +104 -0
  224. package/src/connection/Simulator/SimulatorTransport.ts +9 -0
  225. package/src/connection/Simulator/pings.ts +42 -0
  226. package/src/connection/WebRTC/BrowserWebRtcConnection.ts +227 -0
  227. package/src/connection/WebRTC/IWebRtcConnection.ts +24 -0
  228. package/src/connection/WebRTC/NodeWebRtcConnection.ts +256 -0
  229. package/src/connection/WebRTC/RemoteWebrtcConnector.ts +93 -0
  230. package/src/connection/WebRTC/WebRtcConnector.ts +306 -0
  231. package/src/connection/WebRTC/iceServerAsString.ts +15 -0
  232. package/src/connection/WebSocket/ClientWebSocket.ts +118 -0
  233. package/src/connection/WebSocket/RemoteWebSocketConnector.ts +49 -0
  234. package/src/connection/WebSocket/ServerWebSocket.ts +119 -0
  235. package/src/connection/WebSocket/WebSocketConnector.ts +264 -0
  236. package/src/connection/WebSocket/WebSocketServer.ts +97 -0
  237. package/src/dht/DhtNode.ts +776 -0
  238. package/src/dht/DhtPeer.ts +96 -0
  239. package/src/dht/ExternalApi.ts +29 -0
  240. package/src/dht/RemoteExternalApi.ts +25 -0
  241. package/src/dht/contact/Contact.ts +36 -0
  242. package/src/dht/contact/RandomContactList.ts +92 -0
  243. package/src/dht/contact/Remote.ts +40 -0
  244. package/src/dht/contact/SortedContactList.ts +196 -0
  245. package/src/dht/discovery/DiscoverySession.ts +150 -0
  246. package/src/dht/discovery/PeerDiscovery.ts +162 -0
  247. package/src/dht/find/RecursiveFindSession.ts +178 -0
  248. package/src/dht/find/RecursiveFinder.ts +272 -0
  249. package/src/dht/find/RemoteRecursiveFindSession.ts +33 -0
  250. package/src/dht/routing/DuplicateDetector.ts +53 -0
  251. package/src/dht/routing/RemoteRouter.ts +115 -0
  252. package/src/dht/routing/Router.ts +266 -0
  253. package/src/dht/routing/RoutingSession.ts +222 -0
  254. package/src/dht/store/DataStore.ts +321 -0
  255. package/src/dht/store/LocalDataStore.ts +114 -0
  256. package/src/dht/store/RemoteStore.ts +58 -0
  257. package/src/exports.ts +19 -0
  258. package/src/helpers/AddressTools.ts +26 -0
  259. package/src/helpers/PeerID.ts +95 -0
  260. package/src/helpers/UUID.ts +30 -0
  261. package/src/helpers/debugHelpers.ts +9 -0
  262. package/src/helpers/errors.ts +49 -0
  263. package/src/helpers/peerIdFromPeerDescriptor.ts +14 -0
  264. package/src/helpers/protoClasses.ts +63 -0
  265. package/src/helpers/protoToString.ts +21 -0
  266. package/src/proto/google/protobuf/any.ts +319 -0
  267. package/src/proto/google/protobuf/empty.ts +84 -0
  268. package/src/proto/google/protobuf/timestamp.ts +281 -0
  269. package/src/proto/packages/dht/protos/DhtRpc.client.ts +373 -0
  270. package/src/proto/packages/dht/protos/DhtRpc.server.ts +148 -0
  271. package/src/proto/packages/dht/protos/DhtRpc.ts +1399 -0
  272. package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +108 -0
  273. package/src/proto/tests.ts +52 -0
  274. package/src/rpc-protocol/DhtCallContext.ts +15 -0
  275. package/src/rpc-protocol/DhtRpcOptions.ts +9 -0
  276. package/src/transport/ITransport.ts +31 -0
  277. package/src/transport/ListeningRpcCommunicator.ts +14 -0
  278. package/src/transport/RoutingRpcCommunicator.ts +59 -0
  279. package/src/types/glogal.d.ts +1 -0
  280. package/src/types/textencoding.d.ts +7 -0
  281. package/test/RandomGraphSimulation.ts +52 -0
  282. package/test/benchmark/KademliaCorrectness.test.ts +115 -0
  283. package/test/benchmark/RecursiveFind.test.ts +87 -0
  284. package/test/benchmark/any.test.ts +28 -0
  285. package/test/benchmark/kademlia-simulation/Contact.ts +32 -0
  286. package/test/benchmark/kademlia-simulation/KademliaSimulation.ts +94 -0
  287. package/test/benchmark/kademlia-simulation/SimulationNode.ts +125 -0
  288. package/test/data/generateGroundTruthData.ts +70 -0
  289. package/test/end-to-end/Layer0-Layer1.test.ts +87 -0
  290. package/test/end-to-end/Layer0.test.ts +60 -0
  291. package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +94 -0
  292. package/test/end-to-end/Layer0WebRTC-Layer1.test.ts +134 -0
  293. package/test/end-to-end/Layer0WebRTC.test.ts +98 -0
  294. package/test/end-to-end/Layer1-Scale-WebRTC.test.ts +69 -0
  295. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +73 -0
  296. package/test/end-to-end/WebSocketConnectionRequest.test.ts +62 -0
  297. package/test/integration/ConnectionLocking.test.ts +166 -0
  298. package/test/integration/ConnectionManager.test.ts +291 -0
  299. package/test/integration/DhtNodeExternalAPI.test.ts +43 -0
  300. package/test/integration/DhtPeer.test.ts +73 -0
  301. package/test/integration/DhtRpc.test.ts +131 -0
  302. package/test/integration/DhtWithMockConnectionLatencies.test.ts +46 -0
  303. package/test/integration/DhtWithMockConnections.test.ts +46 -0
  304. package/test/integration/DhtWithRealConnectionLatencies.test.ts +47 -0
  305. package/test/integration/Layer1-scale.test.ts +200 -0
  306. package/test/integration/MigrateData.test.ts +203 -0
  307. package/test/integration/Mock-Layer1-Layer0.test.ts +106 -0
  308. package/test/integration/MultipleEntryPointJoining.test.ts +105 -0
  309. package/test/integration/RecursiveFind.test.ts +50 -0
  310. package/test/integration/RemoteRouter.test.ts +83 -0
  311. package/test/integration/RemoteStore.test.ts +66 -0
  312. package/test/integration/RouteMessage.test.ts +254 -0
  313. package/test/integration/RpcErrors.test.ts +153 -0
  314. package/test/integration/ScaleDownDht.test.ts +66 -0
  315. package/test/integration/SimultaneousConnections.test.ts +308 -0
  316. package/test/integration/Store.test.ts +72 -0
  317. package/test/integration/StoreAndDelete.test.ts +93 -0
  318. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +71 -0
  319. package/test/integration/WebRtcConnectionManagement.test.ts +205 -0
  320. package/test/integration/WebRtcConnectorRpc.test.ts +145 -0
  321. package/test/integration/WebSocket.test.ts +64 -0
  322. package/test/integration/WebSocketConnectionManagement.test.ts +131 -0
  323. package/test/integration/WebSocketConnectorRpc.test.ts +86 -0
  324. package/test/kademlia-simulation/data/nodeids.json +13002 -0
  325. package/test/kademlia-simulation/data/orderedneighbors.json +1001 -0
  326. package/test/unit/AddressTools.test.ts +40 -0
  327. package/test/unit/DuplicateDetector.test.ts +29 -0
  328. package/test/unit/LocalDataStore.test.ts +107 -0
  329. package/test/unit/PeerID.test.ts +22 -0
  330. package/test/unit/ProtobufMessage.test.ts +21 -0
  331. package/test/unit/RandomContactList.test.ts +87 -0
  332. package/test/unit/RecursiveFinder.test.ts +112 -0
  333. package/test/unit/Router.test.ts +124 -0
  334. package/test/unit/SortedContactList.test.ts +127 -0
  335. package/test/unit/UUID.test.ts +49 -0
  336. package/test/unit/WebSocketServer.test.ts +42 -0
  337. package/test/utils/mock/RecursiveFinder.ts +19 -0
  338. package/test/utils/mock/Router.ts +53 -0
  339. package/test/utils/mock/Transport.ts +26 -0
  340. package/test/utils/utils.ts +311 -0
  341. package/tsconfig.browser.json +15 -0
  342. package/tsconfig.jest.json +19 -0
  343. package/tsconfig.json +3 -0
  344. package/tsconfig.node.json +18 -0
@@ -0,0 +1,264 @@
1
+ import { ClientWebSocket } from './ClientWebSocket'
2
+ import { IConnection, ConnectionType } from '../IConnection'
3
+ import { ITransport } from '../../transport/ITransport'
4
+ import { ListeningRpcCommunicator } from '../../transport/ListeningRpcCommunicator'
5
+ import { RemoteWebSocketConnector } from './RemoteWebSocketConnector'
6
+ import {
7
+ ConnectivityResponse,
8
+ PeerDescriptor,
9
+ WebSocketConnectionRequest,
10
+ WebSocketConnectionResponse
11
+ } from '../../proto/packages/dht/protos/DhtRpc'
12
+ import { WebSocketConnectorServiceClient } from '../../proto/packages/dht/protos/DhtRpc.client'
13
+ import { Logger, wait } from '@streamr/utils'
14
+ import { IWebSocketConnectorService } from '../../proto/packages/dht/protos/DhtRpc.server'
15
+ import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
16
+ import { ManagedConnection } from '../ManagedConnection'
17
+ import { WebSocketServer } from './WebSocketServer'
18
+ import { ConnectivityChecker } from '../ConnectivityChecker'
19
+ import { NatType } from '../ConnectionManager'
20
+ import { PeerIDKey } from '../../helpers/PeerID'
21
+ import { ServerWebSocket } from './ServerWebSocket'
22
+ import { toProtoRpcClient } from '@streamr/proto-rpc'
23
+ import { Handshaker } from '../Handshaker'
24
+ import { keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
25
+ import { ParsedUrlQuery } from 'querystring'
26
+
27
+ const logger = new Logger(module)
28
+
29
+ export class WebSocketConnector implements IWebSocketConnectorService {
30
+ private static readonly WEBSOCKET_CONNECTOR_SERVICE_ID = 'system/websocketconnector'
31
+ private readonly rpcCommunicator: ListeningRpcCommunicator
32
+ private readonly canConnectFunction: (peerDescriptor: PeerDescriptor, _ip: string, port: number) => boolean
33
+ private readonly webSocketServer?: WebSocketServer
34
+ private readonly connectivityChecker: ConnectivityChecker
35
+ private readonly ongoingConnectRequests: Map<PeerIDKey, ManagedConnection> = new Map()
36
+ private incomingConnectionCallback: (connection: ManagedConnection) => boolean
37
+ private webSocketPort?: number
38
+ private webSocketHost?: string
39
+ private entrypoints?: PeerDescriptor[]
40
+
41
+ private readonly protocolVersion: string
42
+ private ownPeerDescriptor?: PeerDescriptor
43
+ private connectingConnections: Map<PeerIDKey, ManagedConnection> = new Map()
44
+ private stopped = false
45
+
46
+ constructor(
47
+ protocolVersion: string,
48
+ rpcTransport: ITransport,
49
+ fnCanConnect: (peerDescriptor: PeerDescriptor, _ip: string, port: number) => boolean,
50
+ incomingConnectionCallback: (connection: ManagedConnection) => boolean,
51
+ webSocketPort?: number,
52
+ webSocketHost?: string,
53
+ entrypoints?: PeerDescriptor[]
54
+ ) {
55
+ this.protocolVersion = protocolVersion
56
+ this.webSocketServer = webSocketPort ? new WebSocketServer() : undefined
57
+ this.connectivityChecker = new ConnectivityChecker(webSocketPort)
58
+ this.incomingConnectionCallback = incomingConnectionCallback
59
+ this.webSocketPort = webSocketPort
60
+ this.webSocketHost = webSocketHost
61
+ this.entrypoints = entrypoints
62
+
63
+ this.canConnectFunction = fnCanConnect.bind(this)
64
+
65
+ this.rpcCommunicator = new ListeningRpcCommunicator(WebSocketConnector.WEBSOCKET_CONNECTOR_SERVICE_ID, rpcTransport, {
66
+ rpcRequestTimeout: 15000
67
+ })
68
+
69
+ this.rpcCommunicator.registerRpcMethod(
70
+ WebSocketConnectionRequest,
71
+ WebSocketConnectionResponse,
72
+ 'requestConnection',
73
+ (req: WebSocketConnectionRequest, context) => this.requestConnection(req, context)
74
+ )
75
+ }
76
+
77
+ private attachHandshaker(connection: IConnection) {
78
+ const handshaker = new Handshaker(this.ownPeerDescriptor!, this.protocolVersion, connection)
79
+
80
+ handshaker.once('handshakeRequest', (peerDescriptor: PeerDescriptor) => {
81
+ this.onServerSocketHandshakeRequest(peerDescriptor, connection)
82
+ })
83
+ }
84
+
85
+ public async start(): Promise<void> {
86
+ if (this.webSocketServer) {
87
+ this.webSocketServer.on('connected', (connection: IConnection) => {
88
+
89
+ const serverSocket = connection as unknown as ServerWebSocket
90
+ if (serverSocket.resourceURL &&
91
+ serverSocket.resourceURL.query) {
92
+ const query = serverSocket.resourceURL.query as unknown as ParsedUrlQuery
93
+ if (query.connectivityRequest) {
94
+ logger.trace('Received connectivity request connection')
95
+ this.connectivityChecker.listenToIncomingConnectivityRequests(serverSocket)
96
+ } else if (query.connectivityProbe) {
97
+ logger.trace('Received connectivity probe connection')
98
+ } else {
99
+ this.attachHandshaker(connection)
100
+ }
101
+ } else {
102
+ this.attachHandshaker(connection)
103
+ }
104
+ })
105
+ await this.webSocketServer.start(this.webSocketPort!, this.webSocketHost)
106
+ }
107
+ }
108
+
109
+ public async checkConnectivity(reattempt = 0): Promise<ConnectivityResponse> {
110
+ try {
111
+ const noServerConnectivityResponse: ConnectivityResponse = {
112
+ openInternet: false,
113
+ ip: '127.0.0.1',
114
+ natType: NatType.UNKNOWN
115
+ }
116
+
117
+ if (!this.webSocketServer) {
118
+ // If no websocket server, return openInternet: false
119
+ return noServerConnectivityResponse
120
+ } else {
121
+ if (!this.entrypoints || this.entrypoints.length < 1) {
122
+ // return connectivity info given in config
123
+
124
+ const preconfiguredConnectivityResponse: ConnectivityResponse = {
125
+ openInternet: true,
126
+ ip: this.webSocketHost!,
127
+ natType: NatType.OPEN_INTERNET,
128
+ websocket: { ip: this.webSocketHost!, port: this.webSocketPort! }
129
+ }
130
+ return preconfiguredConnectivityResponse
131
+ } else {
132
+ // Do real connectivity checking
133
+
134
+ let response = noServerConnectivityResponse
135
+
136
+ response = await this.connectivityChecker.sendConnectivityRequest(this.entrypoints[0])
137
+
138
+ return response
139
+ }
140
+ }
141
+ } catch (err) {
142
+ if (reattempt < 5) {
143
+ await wait(2000)
144
+ return this.checkConnectivity(reattempt + 1)
145
+ } else {
146
+ throw err
147
+ }
148
+ }
149
+
150
+ }
151
+
152
+ public connect(targetPeerDescriptor: PeerDescriptor): ManagedConnection {
153
+ if (this.stopped) {
154
+ logger.info('connect called on closed websocketconnector')
155
+ }
156
+ const peerKey = keyFromPeerDescriptor(targetPeerDescriptor)
157
+ const existingConnection = this.connectingConnections.get(peerKey)
158
+ if (existingConnection) {
159
+ return existingConnection
160
+ }
161
+
162
+ if (this.ownPeerDescriptor!.websocket && !targetPeerDescriptor.websocket) {
163
+ return this.requestConnectionFromPeer(this.ownPeerDescriptor!, targetPeerDescriptor)
164
+ } else {
165
+ const socket = new ClientWebSocket()
166
+
167
+ const address = 'ws://' + targetPeerDescriptor.websocket!.ip + ':' +
168
+ targetPeerDescriptor.websocket!.port
169
+
170
+ const managedConnection = new ManagedConnection(this.ownPeerDescriptor!, this.protocolVersion,
171
+ ConnectionType.WEBSOCKET_CLIENT, socket, undefined)
172
+ managedConnection.setPeerDescriptor(targetPeerDescriptor!)
173
+
174
+ this.connectingConnections.set(keyFromPeerDescriptor(targetPeerDescriptor), managedConnection)
175
+
176
+ const delFunc = () => {
177
+ if (this.connectingConnections.has(peerKey)) {
178
+ this.connectingConnections.delete(peerKey)
179
+ }
180
+ socket.off('disconnected', delFunc)
181
+ managedConnection.off('handshakeCompleted', delFunc)
182
+ }
183
+ socket.on('disconnected', delFunc)
184
+ managedConnection.on('handshakeCompleted', delFunc)
185
+
186
+ socket.connect(address)
187
+
188
+ return managedConnection
189
+ }
190
+ }
191
+
192
+ public requestConnectionFromPeer(ownPeerDescriptor: PeerDescriptor, targetPeerDescriptor: PeerDescriptor): ManagedConnection {
193
+ setImmediate(() => {
194
+ const remoteConnector = new RemoteWebSocketConnector(
195
+ targetPeerDescriptor,
196
+ toProtoRpcClient(new WebSocketConnectorServiceClient(this.rpcCommunicator.getRpcClientTransport()))
197
+ )
198
+ remoteConnector.requestConnection(ownPeerDescriptor, ownPeerDescriptor.websocket!.ip, ownPeerDescriptor.websocket!.port)
199
+ })
200
+ const managedConnection = new ManagedConnection(this.ownPeerDescriptor!, this.protocolVersion, ConnectionType.WEBSOCKET_SERVER)
201
+ managedConnection.on('disconnected', () => this.ongoingConnectRequests.delete(keyFromPeerDescriptor(targetPeerDescriptor)))
202
+ managedConnection.setPeerDescriptor(targetPeerDescriptor)
203
+ this.ongoingConnectRequests.set(keyFromPeerDescriptor(targetPeerDescriptor), managedConnection)
204
+ return managedConnection
205
+ }
206
+
207
+ private onServerSocketHandshakeRequest = (peerDescriptor: PeerDescriptor, serverWebSocket: IConnection) => {
208
+
209
+ const peerId = peerIdFromPeerDescriptor(peerDescriptor)
210
+
211
+ if (this.ongoingConnectRequests.has(peerId.toKey())) {
212
+ const ongoingConnectReguest = this.ongoingConnectRequests.get(peerId.toKey())!
213
+ ongoingConnectReguest.attachImplementation(serverWebSocket, peerDescriptor)
214
+ ongoingConnectReguest.acceptHandshake()
215
+ this.ongoingConnectRequests.delete(peerId.toKey())
216
+ } else {
217
+ const managedConnection = new ManagedConnection(this.ownPeerDescriptor!, this.protocolVersion,
218
+ ConnectionType.WEBSOCKET_SERVER, undefined, serverWebSocket)
219
+
220
+ managedConnection.setPeerDescriptor(peerDescriptor)
221
+
222
+ if (this.incomingConnectionCallback(managedConnection)) {
223
+ managedConnection.acceptHandshake()
224
+ } else {
225
+ managedConnection.rejectHandshake('Duplicate connection')
226
+ managedConnection.destroy()
227
+ }
228
+ }
229
+ }
230
+
231
+ public setOwnPeerDescriptor(ownPeerDescriptor: PeerDescriptor): void {
232
+ this.ownPeerDescriptor = ownPeerDescriptor
233
+ }
234
+
235
+ public async stop(): Promise<void> {
236
+ this.stopped = true
237
+ this.rpcCommunicator.stop()
238
+
239
+ const requests = Array.from(this.ongoingConnectRequests.values())
240
+ await Promise.allSettled(requests.map((conn) => conn.close('OTHER')))
241
+
242
+ const attempts = Array.from(this.connectingConnections.values())
243
+ await Promise.allSettled(attempts.map((conn) => conn.close('OTHER')))
244
+
245
+ await this.webSocketServer?.stop()
246
+ }
247
+
248
+ // IWebSocketConnectorService implementation
249
+ public async requestConnection(request: WebSocketConnectionRequest, _context: ServerCallContext): Promise<WebSocketConnectionResponse> {
250
+ if (!this.stopped && this.canConnectFunction(request.requester!, request.ip, request.port)) {
251
+ setImmediate(() => {
252
+ const connection = this.connect(request.requester!)
253
+ this.incomingConnectionCallback(connection)
254
+ })
255
+ const res: WebSocketConnectionResponse = {
256
+ accepted: true
257
+ }
258
+ return res
259
+ }
260
+ return {
261
+ accepted: false
262
+ }
263
+ }
264
+ }
@@ -0,0 +1,97 @@
1
+ import * as http from 'http'
2
+ import EventEmitter from 'eventemitter3'
3
+ import { server as WsServer } from 'websocket'
4
+ import { ServerWebSocket } from './ServerWebSocket'
5
+ import {
6
+ ConnectionSourceEvents
7
+ } from '../IConnectionSource'
8
+
9
+ import { Logger } from '@streamr/utils'
10
+ import { StartingWebSocketServerFailed } from '../../helpers/errors'
11
+
12
+ const logger = new Logger(module)
13
+
14
+ // NodeJsWsServer is declared as a global in test-browser Electron tests
15
+ // in preload.js using "window.NodeJsWsServer = require('websocket').server".
16
+ // This is done in order to use the real nodejs websocket server in tests
17
+ // instead of a dummy polyfill.
18
+
19
+ declare class NodeJsWsServer extends WsServer { }
20
+
21
+ export class WebSocketServer extends EventEmitter<ConnectionSourceEvents> {
22
+
23
+ private httpServer?: http.Server
24
+ private wsServer?: WsServer
25
+
26
+ public start(port: number, host?: string): Promise<void> {
27
+ return new Promise((resolve, reject) => {
28
+ this.httpServer = http.createServer((request, response) => {
29
+ logger.trace('Received request for ' + request.url)
30
+ response.writeHead(404)
31
+ response.end()
32
+ })
33
+
34
+ function originIsAllowed(_uorigin: string) {
35
+ return true
36
+ }
37
+
38
+ this.wsServer = this.createWsServer(this.httpServer)
39
+
40
+ this.wsServer.on('request', (request) => {
41
+ if (!originIsAllowed(request.origin)) {
42
+ // Make sure we only accept requests from an allowed origin
43
+ request.reject()
44
+ logger.trace('IConnection from origin ' + request.origin + ' rejected.')
45
+ return
46
+ }
47
+
48
+ const connection = request.accept(undefined, request.origin)
49
+
50
+ logger.trace('IConnection accepted.')
51
+
52
+ this.emit('connected', new ServerWebSocket(connection, request.resourceURL))
53
+ })
54
+
55
+ this.httpServer.once('error', (err: Error) => {
56
+ reject(new StartingWebSocketServerFailed('Starting Websocket server failed', err))
57
+ })
58
+
59
+ this.httpServer.once('listening', () => {
60
+ logger.debug('Websocket server is listening on port ' + port)
61
+ resolve()
62
+ })
63
+
64
+ try {
65
+ this.httpServer.listen(port, host)
66
+ } catch (e) {
67
+ reject(new StartingWebSocketServerFailed('Websocket server threw an exception', e))
68
+ }
69
+ })
70
+ }
71
+
72
+ public stop(): Promise<void> {
73
+ this.removeAllListeners()
74
+ return new Promise((resolve, _reject) => {
75
+ this.wsServer?.shutDown()
76
+ this.httpServer?.close(() => {
77
+ resolve()
78
+ })
79
+ })
80
+ }
81
+
82
+ private createWsServer(httpServer: http.Server): WsServer {
83
+ // Use the real nodejs WebSocket server in Electron tests
84
+
85
+ if (typeof NodeJsWsServer !== 'undefined') {
86
+ return new NodeJsWsServer({
87
+ httpServer: httpServer,
88
+ autoAcceptConnections: false
89
+ })
90
+ } else {
91
+ return this.wsServer = new WsServer({
92
+ httpServer: httpServer,
93
+ autoAcceptConnections: false
94
+ })
95
+ }
96
+ }
97
+ }