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

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