@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,398 @@
1
+ import { ConnectionEvents, ConnectionID, ConnectionType, IConnection } from './IConnection'
2
+ import * as Err from '../helpers/errors'
3
+ import { Handshaker } from './Handshaker'
4
+ import { PeerDescriptor } from '../proto/packages/dht/protos/DhtRpc'
5
+ import { Logger, raceEvents3, runAndRaceEvents3, RunAndRaceEventsReturnType } from '@streamr/utils'
6
+ import EventEmitter from 'eventemitter3'
7
+ import { PeerIDKey } from '../helpers/PeerID'
8
+ import { keyFromPeerDescriptor } from '../helpers/peerIdFromPeerDescriptor'
9
+ import { DisconnectionType } from '../transport/ITransport'
10
+
11
+ export interface ManagedConnectionEvents {
12
+ managedData: (bytes: Uint8Array, remotePeerDescriptor: PeerDescriptor) => void
13
+ handshakeRequest: (peerDescriptor: PeerDescriptor) => void
14
+ handshakeCompleted: (peerDescriptor: PeerDescriptor) => void
15
+ handshakeFailed: () => void
16
+ bufferSentByOtherConnection: () => void
17
+ closing: () => void
18
+ internal_disconnected: () => void
19
+ }
20
+
21
+ const logger = new Logger(module)
22
+
23
+ export type Events = ManagedConnectionEvents & ConnectionEvents
24
+ export class ManagedConnection extends EventEmitter<Events> {
25
+
26
+ private static objectCounter = 0
27
+ public objectId = 0
28
+ private implementation?: IConnection
29
+
30
+ private outputBuffer: Uint8Array[] = []
31
+ private inputBuffer: Uint8Array[] = []
32
+
33
+ public connectionId: ConnectionID
34
+ private peerDescriptor?: PeerDescriptor
35
+ public connectionType: ConnectionType
36
+
37
+ private handshaker?: Handshaker
38
+ private handshakeCompleted = false
39
+ private doNotEmitDisconnected = false
40
+
41
+ private lastUsed: number = Date.now()
42
+ private stopped = false
43
+ public offeredAsIncoming = false
44
+ public rejectedAsIncoming = false
45
+ private bufferSentbyOtherConnection = false
46
+ private closing = false
47
+ public replacedByOtherConnection = false
48
+ private ownPeerDescriptor: PeerDescriptor
49
+ private protocolVersion: string
50
+ protected outgoingConnection?: IConnection
51
+ protected incomingConnection?: IConnection
52
+
53
+ constructor(
54
+ ownPeerDescriptor: PeerDescriptor,
55
+ protocolVersion: string,
56
+ connectionType: ConnectionType,
57
+ outgoingConnection?: IConnection,
58
+ incomingConnection?: IConnection,
59
+ ) {
60
+ super()
61
+ this.objectId = ManagedConnection.objectCounter
62
+ ManagedConnection.objectCounter++
63
+
64
+ this.send = this.send.bind(this)
65
+
66
+ this.ownPeerDescriptor = ownPeerDescriptor
67
+ this.protocolVersion = protocolVersion
68
+ this.outgoingConnection = outgoingConnection
69
+ this.incomingConnection = incomingConnection
70
+ this.connectionType = connectionType
71
+ this.connectionId = new ConnectionID()
72
+
73
+ this.onDisconnected = this.onDisconnected.bind(this)
74
+
75
+ logger.trace('creating ManagedConnection of type: ' + connectionType + ' objectId: ' + this.objectId)
76
+ if (incomingConnection && outgoingConnection) {
77
+ throw new Err.IllegalArguments('Managed connection constructor only accepts either an incoming connection OR a outgoing connection')
78
+ }
79
+
80
+ if (outgoingConnection) {
81
+ this.handshaker = new Handshaker(this.ownPeerDescriptor, this.protocolVersion, outgoingConnection)
82
+
83
+ this.handshaker.once('handshakeFailed', (errorMessage) => {
84
+ logger.trace('IL handshake failed for outgoing connection ' + errorMessage + ' ' +
85
+ this.ownPeerDescriptor.nodeName + ', ' + this.peerDescriptor?.nodeName + ' objectid: ' + this.objectId
86
+ + ' outputBuffer.length: ' + this.outputBuffer.length)
87
+ logger.trace(' ' + this.ownPeerDescriptor.nodeName + ', ' + this.peerDescriptor?.nodeName + ' emitting handshakeFailed')
88
+ this.emit('handshakeFailed')
89
+ })
90
+
91
+ this.handshaker.on('handshakeCompleted', (peerDescriptor: PeerDescriptor) => {
92
+ logger.trace('handshake completed for outgoing connection ' + this.ownPeerDescriptor.nodeName +
93
+ ', ' + this.peerDescriptor?.nodeName + ' objectid: ' + this.objectId
94
+ + ' outputBuffer.length: ' + this.outputBuffer.length)
95
+
96
+ this.attachImplementation(outgoingConnection!)
97
+ this.onHandshakeCompleted(peerDescriptor)
98
+ })
99
+
100
+ outgoingConnection.once('connected', () => {
101
+ this.handshaker!.sendHandshakeRequest()
102
+ this.emit('connected')
103
+ })
104
+ outgoingConnection.once('disconnected', this.onDisconnected)
105
+
106
+ } else {
107
+ if (incomingConnection) {
108
+ this.handshaker = new Handshaker(this.ownPeerDescriptor, this.protocolVersion, incomingConnection!)
109
+ this.handshaker.on('handshakeRequest', (peerDescriptor: PeerDescriptor) => {
110
+ this.setPeerDescriptor(peerDescriptor)
111
+ this.emit('handshakeRequest', peerDescriptor)
112
+ })
113
+
114
+ incomingConnection.on('disconnected', this.onDisconnected)
115
+
116
+ }
117
+ }
118
+ }
119
+
120
+ // eventemitter3 does not implement the standard 'newListener' event, so we need to override
121
+
122
+ override on(
123
+ event: keyof Events,
124
+ fn: (...args: any) => void,
125
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
126
+ context?: any
127
+ ): this {
128
+ if (event === 'managedData' && this.listenerCount('managedData') === 0) {
129
+ while (this.inputBuffer.length > 0) {
130
+ logger.trace('emptying inputBuffer objectId: ' + this.objectId)
131
+ const data = this.inputBuffer.shift()!
132
+ fn(data, this.getPeerDescriptor())
133
+ }
134
+ }
135
+ super.on(event, fn, context)
136
+ return this
137
+ }
138
+
139
+ override once(
140
+ event: keyof Events,
141
+ fn: (...args: any) => void,
142
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
143
+ context?: any
144
+ ): this {
145
+ if (event === 'managedData' && this.listenerCount('managedData') === 0) {
146
+ if (this.inputBuffer.length > 0) {
147
+ while (this.inputBuffer.length > 0) {
148
+ logger.trace('emptying inputBuffer objectId: ' + this.objectId)
149
+ const data = this.inputBuffer.shift()!
150
+ fn(data, this.getPeerDescriptor())
151
+ }
152
+ } else {
153
+ super.once(event, fn, context)
154
+ }
155
+ } else {
156
+ super.once(event, fn, context)
157
+ }
158
+
159
+ return this
160
+ }
161
+
162
+ public get peerIdKey(): PeerIDKey {
163
+ return keyFromPeerDescriptor(this.peerDescriptor!)
164
+ }
165
+
166
+ public getLastUsed(): number {
167
+ return this.lastUsed
168
+ }
169
+
170
+ public setPeerDescriptor(peerDescriptor: PeerDescriptor): void {
171
+ this.peerDescriptor = peerDescriptor
172
+ }
173
+
174
+ public getPeerDescriptor(): PeerDescriptor | undefined {
175
+ return this.peerDescriptor
176
+ }
177
+
178
+ private onHandshakeCompleted = (peerDescriptor: PeerDescriptor) => {
179
+ this.lastUsed = Date.now()
180
+
181
+ this.setPeerDescriptor(peerDescriptor)
182
+ this.handshakeCompleted = true
183
+
184
+ while (this.outputBuffer.length > 0) {
185
+ logger.trace('emptying outputBuffer objectId: ' + this.objectId)
186
+
187
+ this.implementation!.send(this.outputBuffer.shift()!)
188
+ }
189
+
190
+ logger.trace('emitting handshake_completed, objectId: ' + this.objectId)
191
+ this.emit('handshakeCompleted', peerDescriptor)
192
+ }
193
+
194
+ public attachImplementation(impl: IConnection, _peerDescriptor?: PeerDescriptor): void {
195
+ logger.trace('attachImplementation() objectId: ' + this.objectId)
196
+ this.implementation = impl
197
+
198
+ impl.on('data', (bytes: Uint8Array) => {
199
+ this.lastUsed = Date.now()
200
+ if (this.listenerCount('managedData') < 1) {
201
+
202
+ this.inputBuffer.push(bytes)
203
+ } else {
204
+ this.emit('managedData', bytes, this.getPeerDescriptor()!)
205
+ }
206
+ })
207
+
208
+ impl.on('error', (name: string) => {
209
+ this.emit('error', name)
210
+ })
211
+ impl.on('connected', () => {
212
+ this.lastUsed = Date.now()
213
+ logger.trace('connected emitted')
214
+ this.emit('connected')
215
+ })
216
+
217
+ impl.off('disconnected', this.onDisconnected)
218
+ impl.on('disconnected', this.onDisconnected)
219
+ }
220
+
221
+ private onDisconnected(disconnectionType: DisconnectionType, _code?: number, _reason?: string): void {
222
+ logger.trace(' ' + this.ownPeerDescriptor.nodeName + ', ' + this.peerDescriptor?.nodeName + ' onDisconnected() ' + disconnectionType)
223
+ if (this.bufferSentbyOtherConnection) {
224
+ return
225
+ }
226
+ this.emit('internal_disconnected')
227
+ this.doDisconnect(disconnectionType)
228
+ }
229
+
230
+ async send(data: Uint8Array, doNotConnect = false): Promise<void> {
231
+ if (this.stopped) {
232
+ return
233
+ }
234
+ if (this.closing) {
235
+ return
236
+ }
237
+ this.lastUsed = Date.now()
238
+
239
+ if (doNotConnect && !this.implementation) {
240
+ throw new Err.ConnectionNotOpen('Connection not open when calling send() with doNotConnect flag')
241
+ } else if (this.implementation) {
242
+ this.implementation.send(data)
243
+ } else {
244
+ logger.trace('adding data to outputBuffer objectId: ' + this.objectId)
245
+
246
+ let result: RunAndRaceEventsReturnType<Events>
247
+
248
+ this.doNotEmitDisconnected = true
249
+
250
+ try {
251
+ result = await runAndRaceEvents3<Events>([() => { this.outputBuffer.push(data) }], this, ['handshakeCompleted', 'handshakeFailed',
252
+ 'bufferSentByOtherConnection', 'closing', 'internal_disconnected'], 15000)
253
+ } catch (e) {
254
+ logger.debug(`Connection from ${this.ownPeerDescriptor.nodeName} to ${this.peerDescriptor?.nodeName} timed out`)
255
+ throw e
256
+ }
257
+
258
+ if (result.winnerName === 'internal_disconnected') {
259
+ this.doNotEmitDisconnected = false
260
+ this.doDisconnect('OTHER')
261
+ } else if (result.winnerName === 'handshakeFailed') {
262
+ logger.trace(' ' + this.ownPeerDescriptor.nodeName + ', ' + this.peerDescriptor?.nodeName + ' handshakeFailed received')
263
+
264
+ if (this.bufferSentbyOtherConnection) {
265
+ logger.trace('bufferSentByOtherConnection already true')
266
+ this.doNotEmitDisconnected = false
267
+ this.doDisconnect('OTHER')
268
+ } else {
269
+ let result2: RunAndRaceEventsReturnType<Events>
270
+
271
+ try {
272
+ result2 = await raceEvents3<Events>(this,
273
+ ['bufferSentByOtherConnection', 'closing', 'disconnected'], 15000)
274
+ } catch (ex) {
275
+ logger.debug(' ' + this.ownPeerDescriptor.nodeName + ', ' + this.peerDescriptor?.nodeName +
276
+ ' Exception from raceEvents3 while waiting bufferSentByOtherConnection or closing ' + ex)
277
+ logger.trace(this.connectionId + ' Exception from raceEvents3 while waiting bufferSentByOtherConnection')
278
+ throw ex
279
+ }
280
+ if (result2.winnerName === 'bufferSentByOtherConnection') {
281
+ logger.trace('bufferSentByOtherConnection received')
282
+ this.doNotEmitDisconnected = false
283
+ this.doDisconnect('OTHER')
284
+ } else if (result2.winnerName === 'closing') {
285
+ logger.trace('bufferSentByOtherConnection not received, instead received a closing event')
286
+ } else if (result2.winnerName === 'disconnected') {
287
+ logger.trace('disconnected while in raceEvents3')
288
+ }
289
+ }
290
+ } else {
291
+ this.doNotEmitDisconnected = false
292
+ }
293
+ }
294
+ }
295
+
296
+ public sendNoWait(data: Uint8Array): void {
297
+ this.lastUsed = Date.now()
298
+ if (this.implementation) {
299
+ this.implementation.send(data)
300
+ } else {
301
+ logger.trace('adding data to outputBuffer objectId: ' + this.objectId)
302
+ this.outputBuffer.push(data)
303
+ }
304
+ }
305
+
306
+ public reportBufferSentByOtherConnection(): void {
307
+ logger.trace(' ' + this.ownPeerDescriptor.nodeName + ', ' + this.peerDescriptor?.nodeName + ' reportBufferSentByOtherConnection')
308
+ if (this.handshaker) {
309
+ this.handshaker.removeAllListeners()
310
+ }
311
+ logger.trace('bufferSentByOtherConnection reported')
312
+ this.bufferSentbyOtherConnection = true
313
+ this.emit('bufferSentByOtherConnection')
314
+ }
315
+
316
+ public reportBufferSendingByOtherConnectionFailed(): void {
317
+ logger.trace('reportBufferSendingByOtherConnectionFailed')
318
+ this.doDisconnect('OTHER')
319
+ }
320
+
321
+ public acceptHandshake(): void {
322
+ // This happens when connectionRequest has been made and answered
323
+ if (this.implementation) {
324
+ if (!this.handshaker) {
325
+ this.handshaker = new Handshaker(this.ownPeerDescriptor, this.protocolVersion, this.implementation)
326
+ }
327
+
328
+ this.handshaker!.sendHandshakeResponse()
329
+
330
+ } else { // This happens to when there is a regular incoming connection
331
+ this.handshaker!.sendHandshakeResponse()
332
+ this.attachImplementation(this.incomingConnection!)
333
+ }
334
+
335
+ this.onHandshakeCompleted(this.peerDescriptor!)
336
+ }
337
+
338
+ public rejectHandshake(errorMessage: string): void {
339
+ this.handshaker!.sendHandshakeResponse(errorMessage)
340
+ }
341
+
342
+ private doDisconnect(disconnectionType: DisconnectionType) {
343
+ logger.trace(' ' + this.ownPeerDescriptor.nodeName + ', ' + this.peerDescriptor?.nodeName + ' doDisconnect() emitting')
344
+
345
+ if (!this.doNotEmitDisconnected) {
346
+ logger.trace(' ' + this.ownPeerDescriptor.nodeName + ', ' + this.peerDescriptor?.nodeName + ' emitting disconnected')
347
+ this.emit('disconnected', disconnectionType)
348
+ } else {
349
+ logger.trace(' ' + this.ownPeerDescriptor.nodeName + ', ' + this.peerDescriptor?.nodeName +
350
+ ' not emitting disconnected because doNotEmitDisconnected flag is set')
351
+ }
352
+ }
353
+
354
+ public async close(disconnectionType: DisconnectionType): Promise<void> {
355
+ if (this.replacedByOtherConnection) {
356
+ logger.trace('close() called on replaced connection')
357
+ }
358
+ this.closing = true
359
+ this.emit('closing')
360
+ this.doNotEmitDisconnected = false
361
+ if (this.implementation) {
362
+ await this.implementation?.close(disconnectionType)
363
+ } else if (this.outgoingConnection) {
364
+ await this.outgoingConnection?.close(disconnectionType)
365
+ } else if (this.incomingConnection) {
366
+ await this.incomingConnection?.close(disconnectionType)
367
+ } else {
368
+ this.doDisconnect(disconnectionType)
369
+ }
370
+ }
371
+
372
+ public destroy(): void {
373
+ this.closing = true
374
+ this.emit('closing')
375
+ if (!this.stopped) {
376
+ this.stopped = true
377
+
378
+ this.removeAllListeners()
379
+ if (this.implementation) {
380
+ this.implementation?.destroy()
381
+ } else if (this.outgoingConnection) {
382
+ this.outgoingConnection?.destroy()
383
+ } else if (this.incomingConnection) {
384
+ this.incomingConnection?.destroy()
385
+ }
386
+ }
387
+ }
388
+
389
+ isHandshakeCompleted(): boolean {
390
+ return this.handshakeCompleted
391
+ }
392
+
393
+ stealOutputBuffer(): Uint8Array[] {
394
+ const ret = this.outputBuffer
395
+ this.outputBuffer = []
396
+ return ret
397
+ }
398
+ }
@@ -0,0 +1,27 @@
1
+ import { PeerDescriptor } from '../proto/packages/dht/protos/DhtRpc'
2
+ import { ConnectionType } from './IConnection'
3
+ import { ManagedConnection } from './ManagedConnection'
4
+ import { NodeWebRtcConnection } from './WebRTC/NodeWebRtcConnection'
5
+
6
+ export class ManagedWebRtcConnection extends ManagedConnection {
7
+
8
+ constructor(ownPeerDescriptor: PeerDescriptor,
9
+ protocolVersion: string,
10
+ connectingConnection?: NodeWebRtcConnection,
11
+ connectedConnection?: NodeWebRtcConnection) {
12
+ super(
13
+ ownPeerDescriptor,
14
+ protocolVersion,
15
+ ConnectionType.WEBRTC,
16
+ connectingConnection,
17
+ connectedConnection)
18
+ }
19
+
20
+ public getWebRtcConnection(): NodeWebRtcConnection {
21
+ if (this.outgoingConnection) {
22
+ return this.outgoingConnection as unknown as NodeWebRtcConnection
23
+ } else {
24
+ return this.incomingConnection as unknown as NodeWebRtcConnection
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,88 @@
1
+ import { Logger } from '@streamr/utils'
2
+ import { ProtoRpcClient } from '@streamr/proto-rpc'
3
+ import { IConnectionLockerClient } from '../proto/packages/dht/protos/DhtRpc.client'
4
+ import { LockRequest, UnlockRequest, PeerDescriptor, DisconnectNotice, DisconnectMode } from '../proto/packages/dht/protos/DhtRpc'
5
+ import { DhtRpcOptions } from '../rpc-protocol/DhtRpcOptions'
6
+ import { PeerID } from '../helpers/PeerID'
7
+
8
+ import * as Err from '../helpers/errors'
9
+ import { peerIdFromPeerDescriptor } from '../helpers/peerIdFromPeerDescriptor'
10
+
11
+ const logger = new Logger(module)
12
+
13
+ export class RemoteConnectionLocker {
14
+ private peerId: PeerID
15
+ private ownPeerDescriptor: PeerDescriptor
16
+ private targetPeerDescriptor: PeerDescriptor
17
+ private protocolVersion: string
18
+ private client: ProtoRpcClient<IConnectionLockerClient>
19
+
20
+ constructor(
21
+ ownPeerDescriptor: PeerDescriptor,
22
+ targetPeerDescriptor: PeerDescriptor,
23
+ protocolVersion: string,
24
+ client: ProtoRpcClient<IConnectionLockerClient>
25
+ ) {
26
+ this.peerId = peerIdFromPeerDescriptor(targetPeerDescriptor)
27
+ this.ownPeerDescriptor = ownPeerDescriptor
28
+ this.targetPeerDescriptor = targetPeerDescriptor
29
+ this.protocolVersion = protocolVersion
30
+ this.client = client
31
+ }
32
+
33
+ public async lockRequest(serviceId: string): Promise<boolean> {
34
+ logger.trace(`Requesting locked connection to ${this.targetPeerDescriptor.kademliaId.toString()}`)
35
+ const request: LockRequest = {
36
+ peerDescriptor: this.ownPeerDescriptor,
37
+ protocolVersion: this.protocolVersion,
38
+ serviceId
39
+ }
40
+ const options: DhtRpcOptions = {
41
+ sourceDescriptor: this.ownPeerDescriptor,
42
+ targetDescriptor: this.targetPeerDescriptor
43
+ }
44
+ try {
45
+ const res = await this.client.lockRequest(request, options)
46
+ return res.accepted
47
+ } catch (err) {
48
+ logger.debug(new Err.ConnectionLocker('Connection lock rejected', err).stack!)
49
+ return false
50
+ }
51
+ }
52
+
53
+ public unlockRequest(serviceId: string): void {
54
+ logger.trace(`Requesting connection to be unlocked from ${this.targetPeerDescriptor.kademliaId.toString()}`)
55
+ const request: UnlockRequest = {
56
+ peerDescriptor: this.ownPeerDescriptor,
57
+ protocolVersion: this.protocolVersion,
58
+ serviceId
59
+ }
60
+ const options: DhtRpcOptions = {
61
+ sourceDescriptor: this.ownPeerDescriptor as PeerDescriptor,
62
+ targetDescriptor: this.targetPeerDescriptor as PeerDescriptor,
63
+ notification: true
64
+ }
65
+
66
+ this.client.unlockRequest(request, options).catch((_e) => {
67
+ logger.trace('failed to send unlockRequest')
68
+ })
69
+
70
+ }
71
+
72
+ public async gracefulDisconnect(disconnecMode: DisconnectMode): Promise<void> {
73
+ logger.trace(`Notifying a graceful disconnect to ${this.targetPeerDescriptor.nodeName} from ${this.ownPeerDescriptor.nodeName}`)
74
+ const request: DisconnectNotice = {
75
+ peerDescriptor: this.ownPeerDescriptor,
76
+ protocolVersion: this.protocolVersion,
77
+ disconnecMode: disconnecMode
78
+ }
79
+ const options = {
80
+ sourceDescriptor: this.ownPeerDescriptor,
81
+ targetDescriptor: this.targetPeerDescriptor,
82
+ doNotConnect: true,
83
+ doNotMindStopped: true,
84
+ timeout: 2000
85
+ }
86
+ await this.client.gracefulDisconnect(request, options)
87
+ }
88
+ }