@streamr/dht 100.0.0-pretestnet.2 → 100.0.0-pretestnet.4

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 (325) hide show
  1. package/dist/src/connection/ConnectionLockHandler.d.ts +7 -8
  2. package/dist/src/connection/ConnectionLockHandler.js +16 -14
  3. package/dist/src/connection/ConnectionLockHandler.js.map +1 -1
  4. package/dist/src/connection/ConnectionLockRpcLocal.d.ts +20 -0
  5. package/dist/src/connection/ConnectionLockRpcLocal.js +47 -0
  6. package/dist/src/connection/ConnectionLockRpcLocal.js.map +1 -0
  7. package/dist/src/connection/ConnectionLockRpcRemote.d.ts +4 -3
  8. package/dist/src/connection/ConnectionLockRpcRemote.js +9 -9
  9. package/dist/src/connection/ConnectionLockRpcRemote.js.map +1 -1
  10. package/dist/src/connection/ConnectionManager.d.ts +9 -16
  11. package/dist/src/connection/ConnectionManager.js +101 -132
  12. package/dist/src/connection/ConnectionManager.js.map +1 -1
  13. package/dist/src/connection/ConnectivityChecker.d.ts +7 -10
  14. package/dist/src/connection/ConnectivityChecker.js +30 -32
  15. package/dist/src/connection/ConnectivityChecker.js.map +1 -1
  16. package/dist/src/connection/ConnectorFacade.d.ts +19 -13
  17. package/dist/src/connection/ConnectorFacade.js +74 -29
  18. package/dist/src/connection/ConnectorFacade.js.map +1 -1
  19. package/dist/src/connection/Handshaker.d.ts +8 -8
  20. package/dist/src/connection/Handshaker.js +30 -33
  21. package/dist/src/connection/Handshaker.js.map +1 -1
  22. package/dist/src/connection/IConnection.d.ts +5 -6
  23. package/dist/src/connection/IConnection.js.map +1 -1
  24. package/dist/src/connection/ManagedConnection.d.ts +9 -13
  25. package/dist/src/connection/ManagedConnection.js +63 -99
  26. package/dist/src/connection/ManagedConnection.js.map +1 -1
  27. package/dist/src/connection/ManagedWebrtcConnection.d.ts +7 -0
  28. package/dist/src/connection/ManagedWebrtcConnection.js +20 -0
  29. package/dist/src/connection/ManagedWebrtcConnection.js.map +1 -0
  30. package/dist/src/connection/{Simulator → simulator}/Simulator.js +3 -3
  31. package/dist/src/connection/{Simulator → simulator}/Simulator.js.map +1 -1
  32. package/dist/src/connection/{Simulator → simulator}/SimulatorConnection.d.ts +3 -4
  33. package/dist/src/connection/{Simulator → simulator}/SimulatorConnection.js +25 -24
  34. package/dist/src/connection/simulator/SimulatorConnection.js.map +1 -0
  35. package/dist/src/connection/{Simulator → simulator}/SimulatorConnector.d.ts +3 -3
  36. package/dist/src/connection/{Simulator → simulator}/SimulatorConnector.js +17 -18
  37. package/dist/src/connection/simulator/SimulatorConnector.js.map +1 -0
  38. package/dist/src/connection/{Simulator → simulator}/SimulatorTransport.d.ts +1 -1
  39. package/dist/src/connection/{Simulator → simulator}/SimulatorTransport.js +2 -2
  40. package/dist/src/connection/simulator/SimulatorTransport.js.map +1 -0
  41. package/dist/src/connection/{Simulator → simulator}/pings.js.map +1 -1
  42. package/dist/src/connection/{WebRTC/IWebRtcConnection.d.ts → webrtc/IWebrtcConnection.d.ts} +2 -2
  43. package/dist/src/connection/{WebRTC/IWebRtcConnection.js → webrtc/IWebrtcConnection.js} +1 -1
  44. package/dist/src/connection/webrtc/IWebrtcConnection.js.map +1 -0
  45. package/dist/src/connection/{WebRTC/NodeWebRtcConnection.d.ts → webrtc/NodeWebrtcConnection.d.ts} +6 -7
  46. package/dist/src/connection/{WebRTC/NodeWebRtcConnection.js → webrtc/NodeWebrtcConnection.js} +41 -42
  47. package/dist/src/connection/webrtc/NodeWebrtcConnection.js.map +1 -0
  48. package/dist/src/connection/webrtc/WebrtcConnector.d.ts +38 -0
  49. package/dist/src/connection/webrtc/WebrtcConnector.js +178 -0
  50. package/dist/src/connection/webrtc/WebrtcConnector.js.map +1 -0
  51. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.d.ts +26 -0
  52. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js +99 -0
  53. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js.map +1 -0
  54. package/dist/src/connection/{WebRTC/WebRtcConnectorRpcRemote.d.ts → webrtc/WebrtcConnectorRpcRemote.d.ts} +4 -4
  55. package/dist/src/connection/{WebRTC/WebRtcConnectorRpcRemote.js → webrtc/WebrtcConnectorRpcRemote.js} +6 -8
  56. package/dist/src/connection/webrtc/WebrtcConnectorRpcRemote.js.map +1 -0
  57. package/dist/src/connection/{WebRTC → webrtc}/iceServerAsString.d.ts +1 -1
  58. package/dist/src/connection/{WebRTC → webrtc}/iceServerAsString.js.map +1 -1
  59. package/dist/src/connection/websocket/AutoCertifierClientFacade.d.ts +26 -0
  60. package/dist/src/connection/websocket/AutoCertifierClientFacade.js +37 -0
  61. package/dist/src/connection/websocket/AutoCertifierClientFacade.js.map +1 -0
  62. package/dist/src/connection/{WebSocket/ClientWebSocket.d.ts → websocket/ClientWebsocket.d.ts} +5 -4
  63. package/dist/src/connection/{WebSocket/ClientWebSocket.js → websocket/ClientWebsocket.js} +23 -16
  64. package/dist/src/connection/websocket/ClientWebsocket.js.map +1 -0
  65. package/dist/src/connection/{WebSocket/ServerWebSocket.d.ts → websocket/ServerWebsocket.d.ts} +2 -2
  66. package/dist/src/connection/{WebSocket/ServerWebSocket.js → websocket/ServerWebsocket.js} +25 -27
  67. package/dist/src/connection/websocket/ServerWebsocket.js.map +1 -0
  68. package/dist/src/connection/websocket/WebsocketConnector.d.ts +53 -0
  69. package/dist/src/connection/websocket/WebsocketConnector.js +242 -0
  70. package/dist/src/connection/websocket/WebsocketConnector.js.map +1 -0
  71. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.d.ts +17 -0
  72. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js +26 -0
  73. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js.map +1 -0
  74. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcRemote.d.ts → websocket/WebsocketConnectorRpcRemote.d.ts} +3 -3
  75. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcRemote.js → websocket/WebsocketConnectorRpcRemote.js} +6 -11
  76. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.js.map +1 -0
  77. package/dist/src/connection/{WebSocket/WebSocketServer.d.ts → websocket/WebsocketServer.d.ts} +6 -3
  78. package/dist/src/connection/{WebSocket/WebSocketServer.js → websocket/WebsocketServer.js} +39 -19
  79. package/dist/src/connection/websocket/WebsocketServer.js.map +1 -0
  80. package/dist/src/dht/DhtNode.d.ts +11 -19
  81. package/dist/src/dht/DhtNode.js +135 -163
  82. package/dist/src/dht/DhtNode.js.map +1 -1
  83. package/dist/src/dht/DhtNodeRpcLocal.d.ts +22 -0
  84. package/dist/src/dht/DhtNodeRpcLocal.js +42 -0
  85. package/dist/src/dht/DhtNodeRpcLocal.js.map +1 -0
  86. package/dist/src/dht/{RemoteDhtNode.d.ts → DhtNodeRpcRemote.d.ts} +5 -3
  87. package/dist/src/dht/{RemoteDhtNode.js → DhtNodeRpcRemote.js} +20 -24
  88. package/dist/src/dht/DhtNodeRpcRemote.js.map +1 -0
  89. package/dist/src/dht/ExternalApiRpcLocal.d.ts +16 -0
  90. package/dist/src/dht/ExternalApiRpcLocal.js +30 -0
  91. package/dist/src/dht/ExternalApiRpcLocal.js.map +1 -0
  92. package/dist/src/dht/ExternalApiRpcRemote.d.ts +1 -1
  93. package/dist/src/dht/ExternalApiRpcRemote.js +2 -2
  94. package/dist/src/dht/ExternalApiRpcRemote.js.map +1 -1
  95. package/dist/src/dht/contact/Remote.d.ts +4 -1
  96. package/dist/src/dht/contact/Remote.js +28 -2
  97. package/dist/src/dht/contact/Remote.js.map +1 -1
  98. package/dist/src/dht/contact/SortedContactList.d.ts +2 -2
  99. package/dist/src/dht/contact/SortedContactList.js +3 -3
  100. package/dist/src/dht/contact/SortedContactList.js.map +1 -1
  101. package/dist/src/dht/discovery/DiscoverySession.d.ts +9 -7
  102. package/dist/src/dht/discovery/DiscoverySession.js +9 -9
  103. package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
  104. package/dist/src/dht/discovery/PeerDiscovery.d.ts +7 -10
  105. package/dist/src/dht/discovery/PeerDiscovery.js +6 -6
  106. package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
  107. package/dist/src/dht/find/FindRpcLocal.d.ts +14 -0
  108. package/dist/src/dht/find/FindRpcLocal.js +25 -0
  109. package/dist/src/dht/find/FindRpcLocal.js.map +1 -0
  110. package/dist/src/dht/find/{RecursiveFindSession.d.ts → FindSession.d.ts} +12 -13
  111. package/dist/src/dht/find/{RecursiveFindSession.js → FindSession.js} +17 -15
  112. package/dist/src/dht/find/FindSession.js.map +1 -0
  113. package/dist/src/dht/find/FindSessionRpcLocal.d.ts +12 -0
  114. package/dist/src/dht/find/FindSessionRpcLocal.js +17 -0
  115. package/dist/src/dht/find/FindSessionRpcLocal.js.map +1 -0
  116. package/dist/src/dht/find/{RemoteRecursiveFindSession.d.ts → FindSessionRpcRemote.d.ts} +2 -2
  117. package/dist/src/dht/find/{RemoteRecursiveFindSession.js → FindSessionRpcRemote.js} +5 -5
  118. package/dist/src/dht/find/FindSessionRpcRemote.js.map +1 -0
  119. package/dist/src/dht/find/{RecursiveFinder.d.ts → Finder.d.ts} +16 -19
  120. package/dist/src/dht/find/{RecursiveFinder.js → Finder.js} +50 -46
  121. package/dist/src/dht/find/Finder.js.map +1 -0
  122. package/dist/src/dht/routing/FindRpcRemote.d.ts +6 -0
  123. package/dist/src/dht/routing/FindRpcRemote.js +41 -0
  124. package/dist/src/dht/routing/FindRpcRemote.js.map +1 -0
  125. package/dist/src/dht/routing/Router.d.ts +10 -17
  126. package/dist/src/dht/routing/Router.js +50 -93
  127. package/dist/src/dht/routing/Router.js.map +1 -1
  128. package/dist/src/dht/routing/RouterRpcLocal.d.ts +22 -0
  129. package/dist/src/dht/routing/RouterRpcLocal.js +66 -0
  130. package/dist/src/dht/routing/RouterRpcLocal.js.map +1 -0
  131. package/dist/src/dht/routing/RouterRpcRemote.d.ts +0 -1
  132. package/dist/src/dht/routing/RouterRpcRemote.js +17 -45
  133. package/dist/src/dht/routing/RouterRpcRemote.js.map +1 -1
  134. package/dist/src/dht/routing/RoutingSession.d.ts +17 -8
  135. package/dist/src/dht/routing/RoutingSession.js +124 -131
  136. package/dist/src/dht/routing/RoutingSession.js.map +1 -1
  137. package/dist/src/dht/routing/getPreviousPeer.d.ts +2 -0
  138. package/dist/src/dht/routing/getPreviousPeer.js +9 -0
  139. package/dist/src/dht/routing/getPreviousPeer.js.map +1 -0
  140. package/dist/src/dht/store/StoreRpcLocal.d.ts +11 -8
  141. package/dist/src/dht/store/StoreRpcLocal.js +26 -25
  142. package/dist/src/dht/store/StoreRpcLocal.js.map +1 -1
  143. package/dist/src/dht/store/StoreRpcRemote.js +6 -10
  144. package/dist/src/dht/store/StoreRpcRemote.js.map +1 -1
  145. package/dist/src/exports.d.ts +11 -5
  146. package/dist/src/exports.js +17 -4
  147. package/dist/src/exports.js.map +1 -1
  148. package/dist/src/helpers/Connectivity.d.ts +4 -0
  149. package/dist/src/helpers/Connectivity.js +24 -0
  150. package/dist/src/helpers/Connectivity.js.map +1 -0
  151. package/dist/src/helpers/errors.d.ts +3 -3
  152. package/dist/src/helpers/errors.js +7 -7
  153. package/dist/src/helpers/peerIdFromPeerDescriptor.d.ts +1 -0
  154. package/dist/src/helpers/peerIdFromPeerDescriptor.js +7 -1
  155. package/dist/src/helpers/peerIdFromPeerDescriptor.js.map +1 -1
  156. package/dist/src/helpers/protoClasses.js +3 -3
  157. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +56 -39
  158. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +49 -36
  159. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
  160. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +85 -96
  161. package/dist/src/proto/packages/dht/protos/DhtRpc.js +82 -71
  162. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  163. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +26 -21
  164. package/dist/src/rpc-protocol/DhtCallContext.d.ts +0 -1
  165. package/dist/src/rpc-protocol/DhtCallContext.js.map +1 -1
  166. package/dist/src/transport/ITransport.d.ts +5 -6
  167. package/dist/src/transport/ListeningRpcCommunicator.d.ts +2 -1
  168. package/dist/src/transport/ListeningRpcCommunicator.js.map +1 -1
  169. package/dist/src/transport/RoutingRpcCommunicator.d.ts +2 -1
  170. package/dist/src/transport/RoutingRpcCommunicator.js +0 -1
  171. package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -1
  172. package/dist/src/types/ServiceID.d.ts +1 -0
  173. package/dist/src/types/ServiceID.js +3 -0
  174. package/dist/src/types/ServiceID.js.map +1 -0
  175. package/karma.config.js +4 -4
  176. package/package.json +10 -8
  177. package/protos/DhtRpc.proto +41 -40
  178. package/src/connection/ConnectionLockHandler.ts +19 -17
  179. package/src/connection/ConnectionLockRpcLocal.ts +74 -0
  180. package/src/connection/ConnectionLockRpcRemote.ts +11 -11
  181. package/src/connection/ConnectionManager.ts +88 -130
  182. package/src/connection/ConnectivityChecker.ts +36 -34
  183. package/src/connection/ConnectorFacade.ts +91 -40
  184. package/src/connection/Handshaker.ts +20 -23
  185. package/src/connection/IConnection.ts +5 -6
  186. package/src/connection/ManagedConnection.ts +76 -101
  187. package/src/connection/{ManagedWebRtcConnection.ts → ManagedWebrtcConnection.ts} +12 -10
  188. package/src/connection/{Simulator → simulator}/Simulator.ts +4 -4
  189. package/src/connection/{Simulator → simulator}/SimulatorConnection.ts +27 -27
  190. package/src/connection/{Simulator → simulator}/SimulatorConnector.ts +22 -23
  191. package/src/connection/{Simulator → simulator}/SimulatorTransport.ts +2 -2
  192. package/src/connection/{WebRTC/BrowserWebRtcConnection.ts → webrtc/BrowserWebrtcConnection.ts} +13 -14
  193. package/src/connection/{WebRTC/IWebRtcConnection.ts → webrtc/IWebrtcConnection.ts} +2 -2
  194. package/src/connection/{WebRTC/NodeWebRtcConnection.ts → webrtc/NodeWebrtcConnection.ts} +38 -40
  195. package/src/connection/webrtc/WebrtcConnector.ts +226 -0
  196. package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +132 -0
  197. package/src/connection/{WebRTC/WebRtcConnectorRpcRemote.ts → webrtc/WebrtcConnectorRpcRemote.ts} +6 -7
  198. package/src/connection/{WebRTC → webrtc}/iceServerAsString.ts +1 -1
  199. package/src/connection/websocket/AutoCertifierClientFacade.ts +91 -0
  200. package/src/connection/{WebSocket/ClientWebSocket.ts → websocket/ClientWebsocket.ts} +22 -17
  201. package/src/connection/{WebSocket/ServerWebSocket.ts → websocket/ServerWebsocket.ts} +23 -27
  202. package/src/connection/websocket/WebsocketConnector.ts +328 -0
  203. package/src/connection/websocket/WebsocketConnectorRpcLocal.ts +41 -0
  204. package/src/connection/{WebSocket/WebSocketConnectorRpcRemote.ts → websocket/WebsocketConnectorRpcRemote.ts} +8 -14
  205. package/src/connection/{WebSocket/WebSocketServer.ts → websocket/WebsocketServer.ts} +40 -22
  206. package/src/dht/DhtNode.ts +166 -193
  207. package/src/dht/DhtNodeRpcLocal.ts +68 -0
  208. package/src/dht/{RemoteDhtNode.ts → DhtNodeRpcRemote.ts} +17 -18
  209. package/src/dht/ExternalApiRpcLocal.ts +46 -0
  210. package/src/dht/ExternalApiRpcRemote.ts +4 -4
  211. package/src/dht/contact/Remote.ts +32 -4
  212. package/src/dht/contact/SortedContactList.ts +4 -4
  213. package/src/dht/discovery/DiscoverySession.ts +25 -22
  214. package/src/dht/discovery/PeerDiscovery.ts +16 -19
  215. package/src/dht/find/FindRpcLocal.ts +35 -0
  216. package/src/dht/find/{RecursiveFindSession.ts → FindSession.ts} +25 -25
  217. package/src/dht/find/FindSessionRpcLocal.ts +25 -0
  218. package/src/dht/find/{RemoteRecursiveFindSession.ts → FindSessionRpcRemote.ts} +9 -5
  219. package/src/dht/find/{RecursiveFinder.ts → Finder.ts} +77 -71
  220. package/src/dht/routing/FindRpcRemote.ts +40 -0
  221. package/src/dht/routing/Router.ts +78 -109
  222. package/src/dht/routing/RouterRpcLocal.ts +81 -0
  223. package/src/dht/routing/RouterRpcRemote.ts +18 -49
  224. package/src/dht/routing/RoutingSession.ts +58 -63
  225. package/src/dht/routing/getPreviousPeer.ts +6 -0
  226. package/src/dht/store/StoreRpcLocal.ts +46 -39
  227. package/src/dht/store/StoreRpcRemote.ts +8 -12
  228. package/src/exports.ts +11 -5
  229. package/src/helpers/Connectivity.ts +19 -0
  230. package/src/helpers/errors.ts +3 -3
  231. package/src/helpers/peerIdFromPeerDescriptor.ts +6 -0
  232. package/src/helpers/protoClasses.ts +6 -6
  233. package/src/proto/packages/dht/protos/DhtRpc.client.ts +75 -59
  234. package/src/proto/packages/dht/protos/DhtRpc.server.ts +26 -21
  235. package/src/proto/packages/dht/protos/DhtRpc.ts +112 -131
  236. package/src/rpc-protocol/DhtCallContext.ts +0 -1
  237. package/src/transport/ITransport.ts +5 -8
  238. package/src/transport/ListeningRpcCommunicator.ts +2 -1
  239. package/src/transport/RoutingRpcCommunicator.ts +3 -4
  240. package/src/types/ServiceID.ts +1 -0
  241. package/test/benchmark/{RecursiveFind.test.ts → Find.test.ts} +7 -7
  242. package/test/benchmark/KademliaCorrectness.test.ts +3 -3
  243. package/test/benchmark/kademlia-simulation/SimulationNode.ts +3 -3
  244. package/test/end-to-end/Layer0-Layer1.test.ts +13 -5
  245. package/test/end-to-end/Layer0.test.ts +35 -17
  246. package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +28 -9
  247. package/test/end-to-end/{Layer0WebRTC-Layer1.test.ts → Layer0Webrtc-Layer1.test.ts} +1 -1
  248. package/test/end-to-end/{Layer0WebRTC.test.ts → Layer0Webrtc.test.ts} +14 -10
  249. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +8 -4
  250. package/test/end-to-end/{Layer1-Scale-WebRTC.test.ts → Layer1-Scale-Webrtc.test.ts} +2 -2
  251. package/test/end-to-end/RecoveryFromFailedAutoCertification.test.ts +52 -0
  252. package/test/end-to-end/{WebSocketConnectionRequest.test.ts → WebsocketConnectionRequest.test.ts} +16 -8
  253. package/test/end-to-end/memory-leak.test.ts +85 -0
  254. package/test/integration/ConnectionLocking.test.ts +10 -7
  255. package/test/integration/ConnectionManager.test.ts +107 -30
  256. package/test/integration/DhtJoinPeerDiscovery.test.ts +2 -2
  257. package/test/integration/DhtNodeExternalAPI.test.ts +10 -10
  258. package/test/integration/{RemoteDhtNode.test.ts → DhtNodeRpcRemote.test.ts} +10 -10
  259. package/test/integration/DhtRpc.test.ts +5 -5
  260. package/test/integration/{RecursiveFind.test.ts → Find.test.ts} +6 -9
  261. package/test/integration/Layer1-scale.test.ts +1 -1
  262. package/test/integration/MigrateData.test.ts +8 -7
  263. package/test/integration/Mock-Layer1-Layer0.test.ts +1 -1
  264. package/test/integration/MultipleEntryPointJoining.test.ts +8 -8
  265. package/test/integration/RouteMessage.test.ts +26 -26
  266. package/test/integration/RpcErrors.test.ts +10 -10
  267. package/test/integration/ScaleDownDht.test.ts +6 -6
  268. package/test/integration/SimultaneousConnections.test.ts +10 -7
  269. package/test/integration/Store.test.ts +4 -7
  270. package/test/integration/StoreAndDelete.test.ts +4 -7
  271. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +12 -12
  272. package/test/integration/{WebRtcConnectionManagement.test.ts → WebrtcConnectionManagement.test.ts} +5 -5
  273. package/test/integration/{WebRtcConnectorRpc.test.ts → WebrtcConnectorRpc.test.ts} +7 -8
  274. package/test/integration/{WebSocket.test.ts → Websocket.test.ts} +14 -13
  275. package/test/integration/{WebSocketConnectionManagement.test.ts → WebsocketConnectionManagement.test.ts} +4 -4
  276. package/test/integration/{WebSocketConnectorRpc.test.ts → WebsocketConnectorRpc.test.ts} +15 -15
  277. package/test/unit/AutoCertifierClientFacade.test.ts +58 -0
  278. package/test/unit/ConnectivityHelpers.test.ts +69 -0
  279. package/test/unit/{RecursiveFinder.test.ts → Finder.test.ts} +19 -17
  280. package/test/unit/Router.test.ts +26 -26
  281. package/test/unit/UUID.test.ts +1 -1
  282. package/test/unit/{WebSocketConnectorRpcLocal.test.ts → WebsocketConnector.test.ts} +8 -8
  283. package/test/unit/{WebSocketServer.test.ts → WebsocketServer.test.ts} +20 -14
  284. package/test/unit/webrtcReplaceInternalIpWithExternalIp.test.ts +1 -1
  285. package/test/utils/FakeRpcCommunicator.ts +23 -0
  286. package/test/utils/mock/Transport.ts +1 -1
  287. package/test/utils/utils.ts +22 -26
  288. package/tsconfig.browser.json +1 -1
  289. package/tsconfig.jest.json +3 -2
  290. package/tsconfig.node.json +3 -2
  291. package/dist/src/connection/ManagedWebRtcConnection.d.ts +0 -7
  292. package/dist/src/connection/ManagedWebRtcConnection.js +0 -20
  293. package/dist/src/connection/ManagedWebRtcConnection.js.map +0 -1
  294. package/dist/src/connection/Simulator/SimulatorConnection.js.map +0 -1
  295. package/dist/src/connection/Simulator/SimulatorConnector.js.map +0 -1
  296. package/dist/src/connection/Simulator/SimulatorTransport.js.map +0 -1
  297. package/dist/src/connection/WebRTC/IWebRtcConnection.js.map +0 -1
  298. package/dist/src/connection/WebRTC/NodeWebRtcConnection.js.map +0 -1
  299. package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.d.ts +0 -51
  300. package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.js +0 -249
  301. package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.js.map +0 -1
  302. package/dist/src/connection/WebRTC/WebRtcConnectorRpcRemote.js.map +0 -1
  303. package/dist/src/connection/WebSocket/ClientWebSocket.js.map +0 -1
  304. package/dist/src/connection/WebSocket/ServerWebSocket.js.map +0 -1
  305. package/dist/src/connection/WebSocket/WebSocketConnectorRpcLocal.d.ts +0 -45
  306. package/dist/src/connection/WebSocket/WebSocketConnectorRpcLocal.js +0 -234
  307. package/dist/src/connection/WebSocket/WebSocketConnectorRpcLocal.js.map +0 -1
  308. package/dist/src/connection/WebSocket/WebSocketConnectorRpcRemote.js.map +0 -1
  309. package/dist/src/connection/WebSocket/WebSocketServer.js.map +0 -1
  310. package/dist/src/dht/RemoteDhtNode.js.map +0 -1
  311. package/dist/src/dht/find/RecursiveFindSession.js.map +0 -1
  312. package/dist/src/dht/find/RecursiveFinder.js.map +0 -1
  313. package/dist/src/dht/find/RemoteRecursiveFindSession.js.map +0 -1
  314. package/dist/src/dht/registerExternalApiRpcMethods.d.ts +0 -2
  315. package/dist/src/dht/registerExternalApiRpcMethods.js +0 -32
  316. package/dist/src/dht/registerExternalApiRpcMethods.js.map +0 -1
  317. package/src/connection/WebRTC/WebRtcConnectorRpcLocal.ts +0 -335
  318. package/src/connection/WebSocket/WebSocketConnectorRpcLocal.ts +0 -295
  319. package/src/dht/registerExternalApiRpcMethods.ts +0 -44
  320. package/test/utils/mock/RecursiveFinder.ts +0 -19
  321. /package/dist/src/connection/{Simulator → simulator}/Simulator.d.ts +0 -0
  322. /package/dist/src/connection/{Simulator → simulator}/pings.d.ts +0 -0
  323. /package/dist/src/connection/{Simulator → simulator}/pings.js +0 -0
  324. /package/dist/src/connection/{WebRTC → webrtc}/iceServerAsString.js +0 -0
  325. /package/src/connection/{Simulator → simulator}/pings.ts +0 -0
@@ -1,6 +1,7 @@
1
1
  import { ConnectionType } from '../IConnection'
2
2
 
3
3
  import {
4
+ HandshakeError,
4
5
  PeerDescriptor,
5
6
  } from '../../proto/packages/dht/protos/DhtRpc'
6
7
  import { Logger } from '@streamr/utils'
@@ -8,7 +9,7 @@ import { ManagedConnection } from '../ManagedConnection'
8
9
  import { PeerIDKey } from '../../helpers/PeerID'
9
10
  import { Simulator } from './Simulator'
10
11
  import { SimulatorConnection } from './SimulatorConnection'
11
- import { keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
12
+ import { getNodeIdFromPeerDescriptor, keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
12
13
 
13
14
  const logger = new Logger(module)
14
15
 
@@ -16,32 +17,32 @@ export class SimulatorConnector {
16
17
 
17
18
  private connectingConnections: Map<PeerIDKey, ManagedConnection> = new Map()
18
19
  private stopped = false
19
- private ownPeerDescriptor: PeerDescriptor
20
+ private localPeerDescriptor: PeerDescriptor
20
21
  private simulator: Simulator
21
- private onIncomingConnection: (connection: ManagedConnection) => boolean
22
+ private onNewConnection: (connection: ManagedConnection) => boolean
22
23
 
23
24
  constructor(
24
- ownPeerDescriptor: PeerDescriptor,
25
+ localPeerDescriptor: PeerDescriptor,
25
26
  simulator: Simulator,
26
- onIncomingConnection: (connection: ManagedConnection) => boolean
27
+ onNewConnection: (connection: ManagedConnection) => boolean
27
28
  ) {
28
- this.ownPeerDescriptor = ownPeerDescriptor
29
+ this.localPeerDescriptor = localPeerDescriptor
29
30
  this.simulator = simulator
30
- this.onIncomingConnection = onIncomingConnection
31
+ this.onNewConnection = onNewConnection
31
32
  }
32
33
 
33
34
  public connect(targetPeerDescriptor: PeerDescriptor): ManagedConnection {
34
- logger.trace('connect() ' + keyFromPeerDescriptor(targetPeerDescriptor))
35
+ logger.trace('connect() ' + getNodeIdFromPeerDescriptor(targetPeerDescriptor))
35
36
  const peerKey = keyFromPeerDescriptor(targetPeerDescriptor)
36
37
  const existingConnection = this.connectingConnections.get(peerKey)
37
38
  if (existingConnection) {
38
39
  return existingConnection
39
40
  }
40
41
 
41
- const connection = new SimulatorConnection(this.ownPeerDescriptor, targetPeerDescriptor, ConnectionType.SIMULATOR_CLIENT, this.simulator)
42
+ const connection = new SimulatorConnection(this.localPeerDescriptor, targetPeerDescriptor, ConnectionType.SIMULATOR_CLIENT, this.simulator)
42
43
 
43
- const managedConnection = new ManagedConnection(this.ownPeerDescriptor, ConnectionType.SIMULATOR_CLIENT, connection, undefined)
44
- managedConnection.setPeerDescriptor(targetPeerDescriptor)
44
+ const managedConnection = new ManagedConnection(this.localPeerDescriptor, ConnectionType.SIMULATOR_CLIENT, connection, undefined)
45
+ managedConnection.setRemotePeerDescriptor(targetPeerDescriptor)
45
46
 
46
47
  this.connectingConnections.set(peerKey, managedConnection)
47
48
  connection.once('disconnected', () => {
@@ -57,31 +58,29 @@ export class SimulatorConnector {
57
58
  }
58
59
 
59
60
  public getPeerDescriptor(): PeerDescriptor {
60
- return this.ownPeerDescriptor
61
+ return this.localPeerDescriptor
61
62
  }
62
63
 
63
64
  public handleIncomingConnection(sourceConnection: SimulatorConnection): void {
64
- logger.trace(keyFromPeerDescriptor(sourceConnection.ownPeerDescriptor) + ' incoming connection, stopped: ' + this.stopped)
65
+ logger.trace(getNodeIdFromPeerDescriptor(sourceConnection.localPeerDescriptor) + ' incoming connection, stopped: ' + this.stopped)
65
66
  if (this.stopped) {
66
67
  return
67
68
  }
68
- const connection = new SimulatorConnection(this.ownPeerDescriptor,
69
- sourceConnection.ownPeerDescriptor, ConnectionType.SIMULATOR_SERVER, this.simulator)
69
+ const connection = new SimulatorConnection(this.localPeerDescriptor,
70
+ sourceConnection.localPeerDescriptor, ConnectionType.SIMULATOR_SERVER, this.simulator)
70
71
 
71
- const managedConnection = new ManagedConnection(this.ownPeerDescriptor, ConnectionType.SIMULATOR_SERVER, undefined, connection)
72
+ const managedConnection = new ManagedConnection(this.localPeerDescriptor, ConnectionType.SIMULATOR_SERVER, undefined, connection)
72
73
 
73
74
  logger.trace('connected')
74
75
 
75
76
  managedConnection.once('handshakeRequest', () => {
76
- logger.trace(keyFromPeerDescriptor(sourceConnection.ownPeerDescriptor) + ' incoming handshake request')
77
- logger.trace('incoming handshake request')
77
+ logger.trace(getNodeIdFromPeerDescriptor(sourceConnection.localPeerDescriptor) + ' incoming handshake request')
78
78
 
79
- if (this.onIncomingConnection(managedConnection)) {
80
- logger.trace(keyFromPeerDescriptor(sourceConnection.ownPeerDescriptor) + ' calling acceptHandshake')
79
+ if (this.onNewConnection(managedConnection)) {
80
+ logger.trace(getNodeIdFromPeerDescriptor(sourceConnection.localPeerDescriptor) + ' calling acceptHandshake')
81
81
  managedConnection.acceptHandshake()
82
82
  } else {
83
- managedConnection.rejectHandshake('Duplicate connection')
84
- managedConnection.destroy()
83
+ managedConnection.rejectHandshake(HandshakeError.DUPLICATE_CONNECTION)
85
84
  }
86
85
  })
87
86
 
@@ -92,7 +91,7 @@ export class SimulatorConnector {
92
91
  this.stopped = true
93
92
  const conns = Array.from(this.connectingConnections.values())
94
93
  await Promise.allSettled(conns.map((conn) =>
95
- conn.close('OTHER')
94
+ conn.close(false)
96
95
  ))
97
96
  }
98
97
  }
@@ -5,9 +5,9 @@ import { Simulator } from './Simulator'
5
5
  import { SimulatorConnectorFacade } from '../ConnectorFacade'
6
6
 
7
7
  export class SimulatorTransport extends ConnectionManager {
8
- constructor(ownPeerDescriptor: PeerDescriptor, simulator: Simulator) {
8
+ constructor(localPeerDescriptor: PeerDescriptor, simulator: Simulator) {
9
9
  super({
10
- createConnectorFacade: () => new SimulatorConnectorFacade(ownPeerDescriptor, simulator),
10
+ createConnectorFacade: () => new SimulatorConnectorFacade(localPeerDescriptor, simulator),
11
11
  metricsContext: new MetricsContext()
12
12
  })
13
13
  }
@@ -1,27 +1,26 @@
1
1
  import EventEmitter from 'eventemitter3'
2
- import { WebRtcConnectionEvents, IWebRtcConnection, RtcDescription } from './IWebRtcConnection'
2
+ import { WebrtcConnectionEvents, IWebrtcConnection, RtcDescription } from './IWebrtcConnection'
3
3
  import { IConnection, ConnectionID, ConnectionEvents, ConnectionType } from '../IConnection'
4
4
  import { Logger } from '@streamr/utils'
5
- import { DisconnectionType } from '../../transport/ITransport'
6
- import { IceServer } from './WebRtcConnectorRpcLocal'
5
+ import { IceServer } from './WebrtcConnector'
7
6
 
8
7
  const logger = new Logger(module)
9
8
 
10
- export const WEB_RTC_CLEANUP = new class {
9
+ export const WEBRTC_CLEANUP = new class {
11
10
  // eslint-disable-next-line class-methods-use-this
12
11
  cleanUp(): void {
13
12
  }
14
13
  }
15
14
 
16
- type Events = WebRtcConnectionEvents & ConnectionEvents
15
+ type Events = WebrtcConnectionEvents & ConnectionEvents
17
16
 
18
17
  interface Params {
19
18
  iceServers?: IceServer[]
20
19
  }
21
20
 
22
- export class NodeWebRtcConnection extends EventEmitter<Events> implements IWebRtcConnection, IConnection {
21
+ export class NodeWebrtcConnection extends EventEmitter<Events> implements IWebrtcConnection, IConnection {
23
22
 
24
- public readonly connectionId: ConnectionID
23
+ public connectionId: ConnectionID
25
24
  public readonly connectionType: ConnectionType = ConnectionType.WEBRTC
26
25
 
27
26
  // We need to keep track of connection state ourselves because
@@ -39,7 +38,7 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IWebRt
39
38
  constructor(params: Params) {
40
39
  super()
41
40
  this.connectionId = new ConnectionID()
42
- this.iceServers = params.iceServers || []
41
+ this.iceServers = params.iceServers ?? []
43
42
  }
44
43
 
45
44
  public start(isOffering: boolean): void {
@@ -135,17 +134,17 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IWebRt
135
134
 
136
135
  // IConnection implementation
137
136
 
138
- public async close(disconnectionType: DisconnectionType, reason?: string): Promise<void> {
139
- this.doClose(disconnectionType, reason)
137
+ public async close(gracefulLeave: boolean, reason?: string): Promise<void> {
138
+ this.doClose(gracefulLeave, reason)
140
139
  }
141
140
 
142
- private doClose(disconnectionType: DisconnectionType, reason?: string): void {
141
+ private doClose(gracefulLeave: boolean, reason?: string): void {
143
142
  if (!this.closed) {
144
143
  this.closed = true
145
144
  this.lastState = 'closed'
146
145
 
147
146
  this.stopListening()
148
- this.emit('disconnected', disconnectionType, undefined, reason)
147
+ this.emit('disconnected', gracefulLeave, undefined, reason)
149
148
 
150
149
  this.removeAllListeners()
151
150
 
@@ -173,7 +172,7 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IWebRt
173
172
 
174
173
  public destroy(): void {
175
174
  this.removeAllListeners()
176
- this.doClose('OTHER')
175
+ this.doClose(false)
177
176
  }
178
177
 
179
178
  public send(data: Uint8Array): void {
@@ -192,7 +191,7 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IWebRt
192
191
 
193
192
  dataChannel.onclose = () => {
194
193
  logger.trace('dc.onClosed')
195
- this.doClose('OTHER')
194
+ this.doClose(false)
196
195
  }
197
196
 
198
197
  dataChannel.onerror = (err) => {
@@ -1,4 +1,4 @@
1
- export interface WebRtcConnectionEvents {
1
+ export interface WebrtcConnectionEvents {
2
2
  localDescription: (description: string, type: string) => void
3
3
  localCandidate: (candidate: string, mid: string) => void
4
4
  }
@@ -8,7 +8,7 @@ export enum RtcDescription {
8
8
  ANSWER = 'answer'
9
9
  }
10
10
 
11
- export interface IWebRtcConnection {
11
+ export interface IWebrtcConnection {
12
12
  start(isOffering: boolean): void
13
13
 
14
14
  on(event: 'localDescription', listener: (description: string, type: string) => void): this
@@ -1,19 +1,18 @@
1
- import { IWebRtcConnection, WebRtcConnectionEvents } from './IWebRtcConnection'
1
+ import { IWebrtcConnection, WebrtcConnectionEvents } from './IWebrtcConnection'
2
2
  import { ConnectionType, IConnection, ConnectionID, ConnectionEvents } from '../IConnection'
3
3
  import { PeerDescriptor } from '../../proto/packages/dht/protos/DhtRpc'
4
4
  import EventEmitter from 'eventemitter3'
5
5
  import nodeDatachannel, { DataChannel, DescriptionType, PeerConnection } from 'node-datachannel'
6
6
  import { Logger } from '@streamr/utils'
7
- import { IllegalRTCPeerConnectionState } from '../../helpers/errors'
8
- import { keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
9
- import { DisconnectionType } from '../../transport/ITransport'
7
+ import { IllegalRtcPeerConnectionState } from '../../helpers/errors'
8
+ import { getNodeIdFromPeerDescriptor, keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
10
9
  import { iceServerAsString } from './iceServerAsString'
11
- import { IceServer } from './WebRtcConnectorRpcLocal'
10
+ import { IceServer } from './WebrtcConnector'
12
11
  import { PortRange } from '../ConnectionManager'
13
12
 
14
13
  const logger = new Logger(module)
15
14
 
16
- export const WEB_RTC_CLEANUP = new class {
15
+ export const WEBRTC_CLEANUP = new class {
17
16
  // eslint-disable-next-line class-methods-use-this
18
17
  cleanUp(): void {
19
18
  nodeDatachannel.cleanup()
@@ -33,7 +32,7 @@ export interface Params {
33
32
  // Re-defined accoring to https://github.com/microsoft/TypeScript/blob/main/src/lib/dom.generated.d.ts
34
33
  // because importing single dom definitions in not possible
35
34
 
36
- enum RTCPeerConnectionStateEnum {
35
+ enum RtcPeerConnectionStateEnum {
37
36
  closed = 'closed',
38
37
  connected = 'connected',
39
38
  connecting = 'connecting',
@@ -44,16 +43,16 @@ enum RTCPeerConnectionStateEnum {
44
43
 
45
44
  nodeDatachannel.initLogger('Fatal')
46
45
 
47
- type RTCPeerConnectionState = keyof typeof RTCPeerConnectionStateEnum
46
+ type RtcPeerConnectionState = keyof typeof RtcPeerConnectionStateEnum
48
47
 
49
- type Events = WebRtcConnectionEvents & ConnectionEvents
48
+ type Events = WebrtcConnectionEvents & ConnectionEvents
50
49
 
51
- export class NodeWebRtcConnection extends EventEmitter<Events> implements IConnection, IWebRtcConnection {
50
+ export class NodeWebrtcConnection extends EventEmitter<Events> implements IConnection, IWebrtcConnection {
52
51
 
53
52
  public connectionId: ConnectionID
54
53
  private connection?: PeerConnection
55
54
  private dataChannel?: DataChannel
56
- private lastState: RTCPeerConnectionState = 'connecting'
55
+ private lastState: RtcPeerConnectionState = 'connecting'
57
56
  private remoteDescriptionSet = false
58
57
  private connectingTimeoutRef?: NodeJS.Timeout
59
58
 
@@ -81,9 +80,8 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
81
80
  }
82
81
 
83
82
  public start(isOffering: boolean): void {
84
- logger.trace(`Staring new connection for peer: ${keyFromPeerDescriptor(this.remotePeerDescriptor)}`)
85
83
  const peerIdKey = keyFromPeerDescriptor(this.remotePeerDescriptor)
86
- logger.trace(`Staring new connection for peer: ${peerIdKey} offering: ${isOffering}`)
84
+ logger.trace(`Starting new connection for peer ${getNodeIdFromPeerDescriptor(this.remotePeerDescriptor)}`, { isOffering })
87
85
  this.connection = new PeerConnection(peerIdKey, {
88
86
  iceServers: this.iceServers.map(iceServerAsString),
89
87
  maxMessageSize: this.maxMessageSize,
@@ -93,7 +91,7 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
93
91
 
94
92
  this.connectingTimeoutRef = setTimeout(() => {
95
93
  logger.trace('connectingTimeout, this.closed === ' + this.closed)
96
- this.doClose('OTHER')
94
+ this.doClose(false)
97
95
  }, this.connectingTimeout)
98
96
 
99
97
  this.connection.onStateChange((state: string) => this.onStateChange(state))
@@ -116,14 +114,14 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
116
114
  public async setRemoteDescription(description: string, type: string): Promise<void> {
117
115
  if (this.connection) {
118
116
  try {
119
- logger.trace(`Setting remote descriptor for peer: ${keyFromPeerDescriptor(this.remotePeerDescriptor)}`)
117
+ logger.trace(`Setting remote descriptor for peer: ${getNodeIdFromPeerDescriptor(this.remotePeerDescriptor)}`)
120
118
  this.connection.setRemoteDescription(description, type as DescriptionType)
121
119
  this.remoteDescriptionSet = true
122
120
  } catch (err) {
123
- logger.warn(`Failed to set remote descriptor for peer ${keyFromPeerDescriptor(this.remotePeerDescriptor)}`)
121
+ logger.debug(`Failed to set remote descriptor for peer ${getNodeIdFromPeerDescriptor(this.remotePeerDescriptor)}`)
124
122
  }
125
123
  } else {
126
- this.doClose('OTHER', `Tried to set description for non-existent connection`)
124
+ this.doClose(false, `Tried to set description for non-existent connection`)
127
125
  }
128
126
  }
129
127
 
@@ -131,17 +129,17 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
131
129
  if (this.connection) {
132
130
  if (this.remoteDescriptionSet) {
133
131
  try {
134
- logger.trace(`Setting remote candidate for peer: ${keyFromPeerDescriptor(this.remotePeerDescriptor)}`)
132
+ logger.trace(`Setting remote candidate for peer: ${getNodeIdFromPeerDescriptor(this.remotePeerDescriptor)}`)
135
133
  this.connection.addRemoteCandidate(candidate, mid)
136
134
  } catch (err) {
137
- logger.warn(`Failed to set remote candidate for peer ${keyFromPeerDescriptor(this.remotePeerDescriptor)}`)
138
- this.doClose('OTHER')
135
+ logger.debug(`Failed to set remote candidate for peer ${getNodeIdFromPeerDescriptor(this.remotePeerDescriptor)}`)
139
136
  }
140
137
  } else {
141
- this.doClose('OTHER', `Tried to set candidate before description`)
138
+ // TODO: should queue candidates until remote description is set?
139
+ this.doClose(false, `Tried to set candidate before description`)
142
140
  }
143
141
  } else {
144
- this.doClose('OTHER', `Tried to set candidate for non-existent connection`)
142
+ this.doClose(false, `Tried to set candidate for non-existent connection`)
145
143
  }
146
144
  }
147
145
 
@@ -150,25 +148,25 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
150
148
  try {
151
149
  this.dataChannel!.sendMessageBinary(data as Buffer)
152
150
  } catch (err) {
153
- logger.warn('Failed to send binary message to ' + keyFromPeerDescriptor(this.remotePeerDescriptor) + err)
151
+ logger.debug('Failed to send binary message to ' + getNodeIdFromPeerDescriptor(this.remotePeerDescriptor) + err)
154
152
  }
155
153
  }
156
154
  }
157
155
 
158
- public async close(disconnectionType: DisconnectionType, reason?: string): Promise<void> {
159
- this.doClose(disconnectionType, reason)
156
+ public async close(gracefulLeave: boolean, reason?: string): Promise<void> {
157
+ this.doClose(gracefulLeave, reason)
160
158
  }
161
159
 
162
- private doClose(disconnectionType: DisconnectionType, reason?: string): void {
160
+ private doClose(gracefulLeave: boolean, reason?: string): void {
163
161
  if (!this.closed) {
164
162
  logger.trace(
165
- `Closing Node WebRTC Connection to ${keyFromPeerDescriptor(this.remotePeerDescriptor)}`
163
+ `Closing Node WebRTC Connection to ${getNodeIdFromPeerDescriptor(this.remotePeerDescriptor)}`
166
164
  + `${reason ? `, reason: ${reason}` : ''}`
167
165
  )
168
166
 
169
167
  this.closed = true
170
168
 
171
- this.emit('disconnected', disconnectionType, undefined, reason)
169
+ this.emit('disconnected', gracefulLeave, undefined, reason)
172
170
  this.removeAllListeners()
173
171
 
174
172
  if (this.connectingTimeoutRef) {
@@ -180,7 +178,7 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
180
178
  logger.trace('closing datachannel')
181
179
  this.dataChannel.close()
182
180
  } catch (e) {
183
- logger.warn('dc.close() errored: %s', e)
181
+ logger.trace('dc.close() errored: %s', e)
184
182
  }
185
183
  }
186
184
 
@@ -188,7 +186,7 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
188
186
  try {
189
187
  this.connection.close()
190
188
  } catch (e) {
191
- logger.warn('conn.close() errored: %s', e)
189
+ logger.trace('conn.close() errored: %s', e)
192
190
  }
193
191
  }
194
192
  }
@@ -196,7 +194,7 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
196
194
 
197
195
  public destroy(): void {
198
196
  this.removeAllListeners()
199
- this.doClose('OTHER')
197
+ this.doClose(false)
200
198
  }
201
199
 
202
200
  private onDataChannel(dataChannel: DataChannel): void {
@@ -213,7 +211,7 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
213
211
 
214
212
  dataChannel.onClosed(() => {
215
213
  logger.trace(`dc.closed`)
216
- this.doClose('OTHER', 'DataChannel closed')
214
+ this.doClose(false, 'DataChannel closed')
217
215
  })
218
216
 
219
217
  dataChannel.onError((err) => logger.error('error', { err }))
@@ -233,23 +231,23 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
233
231
  clearTimeout(this.connectingTimeoutRef)
234
232
  }
235
233
  this.dataChannel = dataChannel
236
- logger.trace(`DataChannel opened for peer ${keyFromPeerDescriptor(this.remotePeerDescriptor)}`)
234
+ logger.trace(`DataChannel opened for peer ${getNodeIdFromPeerDescriptor(this.remotePeerDescriptor)}`)
237
235
  this.emit('connected')
238
236
  }
239
237
 
240
238
  private onStateChange(state: string): void {
241
239
  logger.trace('onStateChange ' + state)
242
- if (!Object.keys(RTCPeerConnectionStateEnum).filter((s) => isNaN(+s)).includes(state)) {
243
- throw new IllegalRTCPeerConnectionState('NodeWebRtcConnection used an unknown state: ' + state)
240
+ if (!Object.keys(RtcPeerConnectionStateEnum).filter((s) => isNaN(+s)).includes(state)) {
241
+ throw new IllegalRtcPeerConnectionState('NodeWebrtcConnection used an unknown state: ' + state)
244
242
  } else {
245
- this.lastState = state as RTCPeerConnectionState
243
+ this.lastState = state as RtcPeerConnectionState
246
244
  }
247
245
 
248
- if (state === RTCPeerConnectionStateEnum.closed
249
- || state === RTCPeerConnectionStateEnum.disconnected
250
- || state === RTCPeerConnectionStateEnum.failed
246
+ if (state === RtcPeerConnectionStateEnum.closed
247
+ || state === RtcPeerConnectionStateEnum.disconnected
248
+ || state === RtcPeerConnectionStateEnum.failed
251
249
  ) {
252
- this.doClose('OTHER')
250
+ this.doClose(false)
253
251
  }
254
252
 
255
253
  }
@@ -0,0 +1,226 @@
1
+ import {
2
+ IceCandidate,
3
+ PeerDescriptor,
4
+ RtcAnswer,
5
+ RtcOffer, WebrtcConnectionRequest
6
+ } from '../../proto/packages/dht/protos/DhtRpc'
7
+ import { ITransport } from '../../transport/ITransport'
8
+ import { ListeningRpcCommunicator } from '../../transport/ListeningRpcCommunicator'
9
+ import { NodeWebrtcConnection } from './NodeWebrtcConnection'
10
+ import { WebrtcConnectorRpcRemote } from './WebrtcConnectorRpcRemote'
11
+ import { WebrtcConnectorRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
12
+ import { PeerIDKey } from '../../helpers/PeerID'
13
+ import { ManagedWebrtcConnection } from '../ManagedWebrtcConnection'
14
+ import { Logger } from '@streamr/utils'
15
+ import * as Err from '../../helpers/errors'
16
+ import { ManagedConnection } from '../ManagedConnection'
17
+ import { toProtoRpcClient } from '@streamr/proto-rpc'
18
+ import {
19
+ areEqualPeerDescriptors,
20
+ getNodeIdFromPeerDescriptor,
21
+ keyFromPeerDescriptor,
22
+ peerIdFromPeerDescriptor
23
+ } from '../../helpers/peerIdFromPeerDescriptor'
24
+ import { PortRange } from '../ConnectionManager'
25
+ import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
26
+ import { WebrtcConnectorRpcLocal } from './WebrtcConnectorRpcLocal'
27
+
28
+ const logger = new Logger(module)
29
+
30
+ export const replaceInternalIpWithExternalIp = (candidate: string, ip: string): string => {
31
+ const parsed = candidate.split(' ')
32
+ const type = parsed[7]
33
+ if (type === 'host') {
34
+ parsed[4] = ip
35
+ }
36
+ return parsed.join(' ')
37
+ }
38
+
39
+ export interface WebrtcConnectorConfig {
40
+ transport: ITransport
41
+ iceServers?: IceServer[]
42
+ allowPrivateAddresses?: boolean
43
+ bufferThresholdLow?: number
44
+ bufferThresholdHigh?: number
45
+ maxMessageSize?: number
46
+ connectionTimeout?: number
47
+ externalIp?: string
48
+ portRange?: PortRange
49
+ }
50
+
51
+ export interface IceServer {
52
+ url: string
53
+ port: number
54
+ username?: string
55
+ password?: string
56
+ tcp?: boolean
57
+ }
58
+
59
+ export class WebrtcConnector {
60
+
61
+ private static readonly WEBRTC_CONNECTOR_SERVICE_ID = 'system/webrtc-connector'
62
+ private readonly rpcCommunicator: ListeningRpcCommunicator
63
+ private readonly ongoingConnectAttempts: Map<PeerIDKey, ManagedWebrtcConnection> = new Map()
64
+ private localPeerDescriptor?: PeerDescriptor
65
+ private stopped = false
66
+ private iceServers: IceServer[]
67
+ private config: WebrtcConnectorConfig
68
+
69
+ constructor(
70
+ config: WebrtcConnectorConfig,
71
+ onNewConnection: (connection: ManagedConnection) => boolean
72
+ ) {
73
+ this.config = config
74
+ this.iceServers = config.iceServers ?? []
75
+ this.rpcCommunicator = new ListeningRpcCommunicator(WebrtcConnector.WEBRTC_CONNECTOR_SERVICE_ID, config.transport, {
76
+ rpcRequestTimeout: 15000
77
+ })
78
+ this.registerLocalRpcMethods(config, onNewConnection)
79
+ }
80
+
81
+ private registerLocalRpcMethods(
82
+ config: WebrtcConnectorConfig,
83
+ onNewConnection: (connection: ManagedConnection) => boolean
84
+ ) {
85
+ const localRpc = new WebrtcConnectorRpcLocal({
86
+ connect: (targetPeerDescriptor: PeerDescriptor) => this.connect(targetPeerDescriptor),
87
+ onNewConnection,
88
+ ongoingConnectAttempts: this.ongoingConnectAttempts,
89
+ rpcCommunicator: this.rpcCommunicator,
90
+ getLocalPeerDescriptor: () => this.localPeerDescriptor!,
91
+ allowPrivateAddresses: config.allowPrivateAddresses ?? true
92
+ })
93
+ this.rpcCommunicator.registerRpcNotification(WebrtcConnectionRequest, 'requestConnection',
94
+ async (_req: WebrtcConnectionRequest, context: ServerCallContext) => {
95
+ if (!this.stopped) {
96
+ return localRpc.requestConnection(context)
97
+ } else {
98
+ return {}
99
+ }
100
+ }
101
+ )
102
+ this.rpcCommunicator.registerRpcNotification(RtcOffer, 'rtcOffer',
103
+ async (req: RtcOffer, context: ServerCallContext) => {
104
+ if (!this.stopped) {
105
+ return localRpc.rtcOffer(req, context)
106
+ } else {
107
+ return {}
108
+ }
109
+ }
110
+ )
111
+ this.rpcCommunicator.registerRpcNotification(RtcAnswer, 'rtcAnswer',
112
+ async (req: RtcAnswer, context: ServerCallContext) => {
113
+ if (!this.stopped) {
114
+ return localRpc.rtcAnswer(req, context)
115
+ } else {
116
+ return {}
117
+ }
118
+ }
119
+ )
120
+ this.rpcCommunicator.registerRpcNotification(IceCandidate, 'iceCandidate',
121
+ async (req: IceCandidate, context: ServerCallContext) => {
122
+ if (!this.stopped) {
123
+ return localRpc.iceCandidate(req, context)
124
+ } else {
125
+ return {}
126
+ }
127
+ }
128
+ )
129
+ }
130
+
131
+ connect(targetPeerDescriptor: PeerDescriptor): ManagedConnection {
132
+ if (areEqualPeerDescriptors(targetPeerDescriptor, this.localPeerDescriptor!)) {
133
+ throw new Err.CannotConnectToSelf('Cannot open WebRTC Connection to self')
134
+ }
135
+
136
+ logger.trace(`Opening WebRTC connection to ${getNodeIdFromPeerDescriptor(targetPeerDescriptor)}`)
137
+
138
+ const peerKey = keyFromPeerDescriptor(targetPeerDescriptor)
139
+ const existingConnection = this.ongoingConnectAttempts.get(peerKey)
140
+ if (existingConnection) {
141
+ return existingConnection
142
+ }
143
+
144
+ const connection = new NodeWebrtcConnection({
145
+ remotePeerDescriptor: targetPeerDescriptor,
146
+ iceServers: this.iceServers,
147
+ bufferThresholdLow: this.config.bufferThresholdLow,
148
+ bufferThresholdHigh: this.config.bufferThresholdHigh,
149
+ connectingTimeout: this.config.connectionTimeout,
150
+ portRange: this.config.portRange
151
+ })
152
+
153
+ const offering = this.isOffering(targetPeerDescriptor)
154
+ let managedConnection: ManagedWebrtcConnection
155
+
156
+ if (offering) {
157
+ managedConnection = new ManagedWebrtcConnection(this.localPeerDescriptor!, connection)
158
+ } else {
159
+ managedConnection = new ManagedWebrtcConnection(this.localPeerDescriptor!, undefined, connection)
160
+ }
161
+
162
+ managedConnection.setRemotePeerDescriptor(targetPeerDescriptor)
163
+
164
+ this.ongoingConnectAttempts.set(keyFromPeerDescriptor(targetPeerDescriptor), managedConnection)
165
+
166
+ const delFunc = () => {
167
+ this.ongoingConnectAttempts.delete(peerKey)
168
+ connection.off('disconnected', delFunc)
169
+ managedConnection.off('handshakeCompleted', delFunc)
170
+ }
171
+ connection.on('disconnected', delFunc)
172
+ managedConnection.on('handshakeCompleted', delFunc)
173
+
174
+ const remoteConnector = new WebrtcConnectorRpcRemote(
175
+ this.localPeerDescriptor!,
176
+ targetPeerDescriptor,
177
+ toProtoRpcClient(new WebrtcConnectorRpcClient(this.rpcCommunicator.getRpcClientTransport()))
178
+ )
179
+
180
+ connection.on('localCandidate', (candidate: string, mid: string) => {
181
+ if (this.config.externalIp) {
182
+ candidate = replaceInternalIpWithExternalIp(candidate, this.config.externalIp)
183
+ logger.debug(`onLocalCandidate injected external ip ${candidate} ${mid}`)
184
+ }
185
+ remoteConnector.sendIceCandidate(candidate, mid, connection.connectionId.toString())
186
+ })
187
+
188
+ if (offering) {
189
+ connection.once('localDescription', (description: string) => {
190
+ remoteConnector.sendRtcOffer(description, connection.connectionId.toString())
191
+ })
192
+ } else {
193
+ connection.once('localDescription', (description: string) => {
194
+ remoteConnector.sendRtcAnswer(description, connection.connectionId.toString())
195
+ })
196
+ }
197
+
198
+ connection.start(offering)
199
+
200
+ if (!offering) {
201
+ remoteConnector.requestConnection()
202
+ }
203
+
204
+ return managedConnection
205
+ }
206
+
207
+ setLocalPeerDescriptor(peerDescriptor: PeerDescriptor): void {
208
+ this.localPeerDescriptor = peerDescriptor
209
+ }
210
+
211
+ public async stop(): Promise<void> {
212
+ logger.trace('stop()')
213
+ this.stopped = true
214
+
215
+ const attempts = Array.from(this.ongoingConnectAttempts.values())
216
+ await Promise.allSettled(attempts.map((conn) => conn.close(false)))
217
+
218
+ this.rpcCommunicator.destroy()
219
+ }
220
+
221
+ public isOffering(targetPeerDescriptor: PeerDescriptor): boolean {
222
+ const myId = peerIdFromPeerDescriptor(this.localPeerDescriptor!)
223
+ const theirId = peerIdFromPeerDescriptor(targetPeerDescriptor)
224
+ return myId.hasSmallerHashThan(theirId)
225
+ }
226
+ }