@streamr/dht 100.0.0-pretestnet.6 → 100.0.0-rc.1

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 (444) hide show
  1. package/README.md +90 -8
  2. package/dist/package.json +70 -0
  3. package/dist/src/connection/Connection.d.ts +1 -0
  4. package/dist/src/connection/Connection.js +10 -3
  5. package/dist/src/connection/Connection.js.map +1 -1
  6. package/dist/src/connection/ConnectionLockHandler.d.ts +14 -14
  7. package/dist/src/connection/ConnectionLockHandler.js +22 -16
  8. package/dist/src/connection/ConnectionLockHandler.js.map +1 -1
  9. package/dist/src/connection/ConnectionLockRpcLocal.d.ts +3 -3
  10. package/dist/src/connection/ConnectionLockRpcLocal.js +7 -6
  11. package/dist/src/connection/ConnectionLockRpcLocal.js.map +1 -1
  12. package/dist/src/connection/ConnectionLockRpcRemote.d.ts +4 -6
  13. package/dist/src/connection/ConnectionLockRpcRemote.js +10 -37
  14. package/dist/src/connection/ConnectionLockRpcRemote.js.map +1 -1
  15. package/dist/src/connection/ConnectionManager.d.ts +19 -20
  16. package/dist/src/connection/ConnectionManager.js +132 -117
  17. package/dist/src/connection/ConnectionManager.js.map +1 -1
  18. package/dist/src/connection/ConnectorFacade.d.ts +3 -2
  19. package/dist/src/connection/ConnectorFacade.js +10 -3
  20. package/dist/src/connection/ConnectorFacade.js.map +1 -1
  21. package/dist/src/connection/Handshaker.d.ts +3 -1
  22. package/dist/src/connection/Handshaker.js +19 -10
  23. package/dist/src/connection/Handshaker.js.map +1 -1
  24. package/dist/src/connection/IConnection.d.ts +2 -7
  25. package/dist/src/connection/IConnection.js +1 -8
  26. package/dist/src/connection/IConnection.js.map +1 -1
  27. package/dist/src/connection/ManagedConnection.d.ts +5 -7
  28. package/dist/src/connection/ManagedConnection.js +42 -26
  29. package/dist/src/connection/ManagedConnection.js.map +1 -1
  30. package/dist/src/connection/ManagedWebrtcConnection.js.map +1 -1
  31. package/dist/src/connection/connectivityChecker.d.ts +9 -0
  32. package/dist/src/connection/connectivityChecker.js +130 -0
  33. package/dist/src/connection/connectivityChecker.js.map +1 -0
  34. package/dist/src/connection/connectivityRequestHandler.d.ts +3 -0
  35. package/dist/src/connection/connectivityRequestHandler.js +101 -0
  36. package/dist/src/connection/connectivityRequestHandler.js.map +1 -0
  37. package/dist/src/connection/simulator/Simulator.d.ts +0 -3
  38. package/dist/src/connection/simulator/Simulator.js +34 -69
  39. package/dist/src/connection/simulator/Simulator.js.map +1 -1
  40. package/dist/src/connection/simulator/SimulatorConnection.js +27 -25
  41. package/dist/src/connection/simulator/SimulatorConnection.js.map +1 -1
  42. package/dist/src/connection/simulator/SimulatorConnector.js +16 -12
  43. package/dist/src/connection/simulator/SimulatorConnector.js.map +1 -1
  44. package/dist/src/connection/simulator/pings.js.map +1 -1
  45. package/dist/src/connection/webrtc/NodeWebrtcConnection.d.ts +2 -3
  46. package/dist/src/connection/webrtc/NodeWebrtcConnection.js +40 -27
  47. package/dist/src/connection/webrtc/NodeWebrtcConnection.js.map +1 -1
  48. package/dist/src/connection/webrtc/WebrtcConnector.d.ts +1 -2
  49. package/dist/src/connection/webrtc/WebrtcConnector.js +36 -32
  50. package/dist/src/connection/webrtc/WebrtcConnector.js.map +1 -1
  51. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.d.ts +4 -2
  52. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js +28 -22
  53. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js.map +1 -1
  54. package/dist/src/connection/webrtc/WebrtcConnectorRpcRemote.d.ts +3 -6
  55. package/dist/src/connection/webrtc/WebrtcConnectorRpcRemote.js +2 -5
  56. package/dist/src/connection/webrtc/WebrtcConnectorRpcRemote.js.map +1 -1
  57. package/dist/src/connection/webrtc/iceServerAsString.js +1 -1
  58. package/dist/src/connection/webrtc/iceServerAsString.js.map +1 -1
  59. package/dist/src/connection/websocket/AutoCertifierClientFacade.d.ts +1 -2
  60. package/dist/src/connection/websocket/AutoCertifierClientFacade.js +6 -4
  61. package/dist/src/connection/websocket/AutoCertifierClientFacade.js.map +1 -1
  62. package/dist/src/connection/websocket/ClientWebsocket.d.ts +1 -0
  63. package/dist/src/connection/websocket/ClientWebsocket.js +14 -7
  64. package/dist/src/connection/websocket/ClientWebsocket.js.map +1 -1
  65. package/dist/src/connection/websocket/WebsocketConnector.d.ts +3 -9
  66. package/dist/src/connection/websocket/WebsocketConnector.js +142 -74
  67. package/dist/src/connection/websocket/WebsocketConnector.js.map +1 -1
  68. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.d.ts +5 -3
  69. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js +9 -12
  70. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js.map +1 -1
  71. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.d.ts +4 -7
  72. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.js +7 -44
  73. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.js.map +1 -1
  74. package/dist/src/connection/websocket/WebsocketServer.d.ts +1 -4
  75. package/dist/src/connection/websocket/WebsocketServer.js +49 -40
  76. package/dist/src/connection/websocket/WebsocketServer.js.map +1 -1
  77. package/dist/src/connection/websocket/{ServerWebsocket.d.ts → WebsocketServerConnection.d.ts} +8 -4
  78. package/dist/src/connection/websocket/WebsocketServerConnection.js +97 -0
  79. package/dist/src/connection/websocket/WebsocketServerConnection.js.map +1 -0
  80. package/dist/src/dht/DhtNode.d.ts +45 -49
  81. package/dist/src/dht/DhtNode.js +229 -317
  82. package/dist/src/dht/DhtNode.js.map +1 -1
  83. package/dist/src/dht/DhtNodeRpcLocal.d.ts +10 -9
  84. package/dist/src/dht/DhtNodeRpcLocal.js +19 -11
  85. package/dist/src/dht/DhtNodeRpcLocal.js.map +1 -1
  86. package/dist/src/dht/DhtNodeRpcRemote.d.ts +15 -10
  87. package/dist/src/dht/DhtNodeRpcRemote.js +38 -21
  88. package/dist/src/dht/DhtNodeRpcRemote.js.map +1 -1
  89. package/dist/src/dht/ExternalApiRpcLocal.d.ts +7 -6
  90. package/dist/src/dht/ExternalApiRpcLocal.js +9 -13
  91. package/dist/src/dht/ExternalApiRpcLocal.js.map +1 -1
  92. package/dist/src/dht/ExternalApiRpcRemote.d.ts +6 -5
  93. package/dist/src/dht/ExternalApiRpcRemote.js +10 -7
  94. package/dist/src/dht/ExternalApiRpcRemote.js.map +1 -1
  95. package/dist/src/dht/PeerManager.d.ts +61 -0
  96. package/dist/src/dht/PeerManager.js +288 -0
  97. package/dist/src/dht/PeerManager.js.map +1 -0
  98. package/dist/src/dht/contact/Contact.d.ts +2 -2
  99. package/dist/src/dht/contact/Contact.js +4 -3
  100. package/dist/src/dht/contact/Contact.js.map +1 -1
  101. package/dist/src/dht/contact/ContactList.d.ts +8 -8
  102. package/dist/src/dht/contact/ContactList.js +12 -7
  103. package/dist/src/dht/contact/ContactList.js.map +1 -1
  104. package/dist/src/dht/contact/RandomContactList.d.ts +4 -4
  105. package/dist/src/dht/contact/RandomContactList.js +13 -12
  106. package/dist/src/dht/contact/RandomContactList.js.map +1 -1
  107. package/dist/src/dht/contact/RingContactList.d.ts +31 -0
  108. package/dist/src/dht/contact/RingContactList.js +133 -0
  109. package/dist/src/dht/contact/RingContactList.js.map +1 -0
  110. package/dist/src/dht/contact/{Remote.d.ts → RpcRemote.d.ts} +8 -7
  111. package/dist/src/dht/contact/{Remote.js → RpcRemote.js} +16 -13
  112. package/dist/src/dht/contact/RpcRemote.js.map +1 -0
  113. package/dist/src/dht/contact/SortedContactList.d.ts +29 -15
  114. package/dist/src/dht/contact/SortedContactList.js +79 -42
  115. package/dist/src/dht/contact/SortedContactList.js.map +1 -1
  116. package/dist/src/dht/contact/ringIdentifiers.d.ts +16 -0
  117. package/dist/src/dht/contact/ringIdentifiers.js +54 -0
  118. package/dist/src/dht/contact/ringIdentifiers.js.map +1 -0
  119. package/dist/src/dht/discovery/DiscoverySession.d.ts +8 -18
  120. package/dist/src/dht/discovery/DiscoverySession.js +32 -48
  121. package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
  122. package/dist/src/dht/discovery/PeerDiscovery.d.ts +16 -12
  123. package/dist/src/dht/discovery/PeerDiscovery.js +82 -39
  124. package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
  125. package/dist/src/dht/discovery/RingDiscoverySession.d.ts +29 -0
  126. package/dist/src/dht/discovery/RingDiscoverySession.js +123 -0
  127. package/dist/src/dht/discovery/RingDiscoverySession.js.map +1 -0
  128. package/dist/src/dht/recursive-operation/RecursiveOperationManager.d.ts +36 -0
  129. package/dist/src/dht/recursive-operation/RecursiveOperationManager.js +166 -0
  130. package/dist/src/dht/recursive-operation/RecursiveOperationManager.js.map +1 -0
  131. package/dist/src/dht/recursive-operation/RecursiveOperationRpcLocal.d.ts +14 -0
  132. package/dist/src/dht/recursive-operation/RecursiveOperationRpcLocal.js +26 -0
  133. package/dist/src/dht/recursive-operation/RecursiveOperationRpcLocal.js.map +1 -0
  134. package/dist/src/dht/recursive-operation/RecursiveOperationRpcRemote.d.ts +6 -0
  135. package/dist/src/dht/recursive-operation/RecursiveOperationRpcRemote.js +44 -0
  136. package/dist/src/dht/recursive-operation/RecursiveOperationRpcRemote.js.map +1 -0
  137. package/dist/src/dht/recursive-operation/RecursiveOperationSession.d.ts +44 -0
  138. package/dist/src/dht/recursive-operation/RecursiveOperationSession.js +187 -0
  139. package/dist/src/dht/recursive-operation/RecursiveOperationSession.js.map +1 -0
  140. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.d.ts +14 -0
  141. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.js +20 -0
  142. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.js.map +1 -0
  143. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.d.ts +6 -0
  144. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.js +21 -0
  145. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.js.map +1 -0
  146. package/dist/src/dht/routing/DuplicateDetector.d.ts +2 -4
  147. package/dist/src/dht/routing/DuplicateDetector.js +10 -15
  148. package/dist/src/dht/routing/DuplicateDetector.js.map +1 -1
  149. package/dist/src/dht/routing/Router.d.ts +11 -27
  150. package/dist/src/dht/routing/Router.js +92 -58
  151. package/dist/src/dht/routing/Router.js.map +1 -1
  152. package/dist/src/dht/routing/RouterRpcLocal.d.ts +3 -4
  153. package/dist/src/dht/routing/RouterRpcLocal.js +17 -16
  154. package/dist/src/dht/routing/RouterRpcLocal.js.map +1 -1
  155. package/dist/src/dht/routing/RouterRpcRemote.d.ts +3 -3
  156. package/dist/src/dht/routing/RouterRpcRemote.js +29 -20
  157. package/dist/src/dht/routing/RouterRpcRemote.js.map +1 -1
  158. package/dist/src/dht/routing/RoutingSession.d.ts +29 -21
  159. package/dist/src/dht/routing/RoutingSession.js +93 -68
  160. package/dist/src/dht/routing/RoutingSession.js.map +1 -1
  161. package/dist/src/dht/routing/RoutingTablesCache.d.ts +24 -0
  162. package/dist/src/dht/routing/RoutingTablesCache.js +46 -0
  163. package/dist/src/dht/routing/RoutingTablesCache.js.map +1 -0
  164. package/dist/src/dht/routing/getPreviousPeer.js.map +1 -1
  165. package/dist/src/dht/store/LocalDataStore.d.ts +9 -14
  166. package/dist/src/dht/store/LocalDataStore.js +46 -72
  167. package/dist/src/dht/store/LocalDataStore.js.map +1 -1
  168. package/dist/src/dht/store/StoreManager.d.ts +33 -0
  169. package/dist/src/dht/store/StoreManager.js +182 -0
  170. package/dist/src/dht/store/StoreManager.js.map +1 -0
  171. package/dist/src/dht/store/StoreRpcLocal.d.ts +11 -41
  172. package/dist/src/dht/store/StoreRpcLocal.js +27 -234
  173. package/dist/src/dht/store/StoreRpcLocal.js.map +1 -1
  174. package/dist/src/dht/store/StoreRpcRemote.d.ts +6 -7
  175. package/dist/src/dht/store/StoreRpcRemote.js +10 -20
  176. package/dist/src/dht/store/StoreRpcRemote.js.map +1 -1
  177. package/dist/src/exports.d.ts +5 -3
  178. package/dist/src/exports.js +10 -8
  179. package/dist/src/exports.js.map +1 -1
  180. package/dist/src/helpers/AddressTools.js +2 -0
  181. package/dist/src/helpers/AddressTools.js.map +1 -1
  182. package/dist/src/helpers/Connectivity.js.map +1 -1
  183. package/dist/src/helpers/MapWithTtl.d.ts +14 -0
  184. package/dist/src/helpers/MapWithTtl.js +60 -0
  185. package/dist/src/helpers/MapWithTtl.js.map +1 -0
  186. package/dist/src/helpers/createPeerDescriptor.d.ts +3 -0
  187. package/dist/src/helpers/createPeerDescriptor.js +57 -0
  188. package/dist/src/helpers/createPeerDescriptor.js.map +1 -0
  189. package/dist/src/helpers/createPeerDescriptorSignaturePayload.d.ts +2 -0
  190. package/dist/src/helpers/createPeerDescriptorSignaturePayload.js +30 -0
  191. package/dist/src/helpers/createPeerDescriptorSignaturePayload.js.map +1 -0
  192. package/dist/src/helpers/debugHelpers.js.map +1 -1
  193. package/dist/src/helpers/errors.js +2 -0
  194. package/dist/src/helpers/errors.js.map +1 -1
  195. package/dist/src/helpers/offering.d.ts +4 -0
  196. package/dist/src/helpers/offering.js +18 -0
  197. package/dist/src/helpers/offering.js.map +1 -0
  198. package/dist/src/helpers/protoClasses.js +2 -3
  199. package/dist/src/helpers/protoClasses.js.map +1 -1
  200. package/dist/src/helpers/protoToString.js.map +1 -1
  201. package/dist/src/helpers/version.d.ts +6 -0
  202. package/dist/src/helpers/version.js +38 -0
  203. package/dist/src/helpers/version.js.map +1 -0
  204. package/dist/src/identifiers.d.ts +10 -0
  205. package/dist/src/identifiers.js +31 -0
  206. package/dist/src/identifiers.js.map +1 -0
  207. package/dist/src/proto/google/protobuf/any.js +8 -8
  208. package/dist/src/proto/google/protobuf/any.js.map +1 -1
  209. package/dist/src/proto/google/protobuf/empty.js +2 -4
  210. package/dist/src/proto/google/protobuf/empty.js.map +1 -1
  211. package/dist/src/proto/google/protobuf/timestamp.js +10 -10
  212. package/dist/src/proto/google/protobuf/timestamp.js.map +1 -1
  213. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +46 -49
  214. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +63 -54
  215. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
  216. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +226 -232
  217. package/dist/src/proto/packages/dht/protos/DhtRpc.js +146 -168
  218. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  219. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +26 -29
  220. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +1 -1
  221. package/dist/src/rpc-protocol/DhtCallContext.d.ts +2 -2
  222. package/dist/src/rpc-protocol/DhtCallContext.js +8 -0
  223. package/dist/src/rpc-protocol/DhtCallContext.js.map +1 -1
  224. package/dist/src/rpc-protocol/DhtRpcOptions.d.ts +2 -1
  225. package/dist/src/transport/ITransport.d.ts +10 -2
  226. package/dist/src/transport/ITransport.js +5 -0
  227. package/dist/src/transport/ITransport.js.map +1 -1
  228. package/dist/src/transport/ListeningRpcCommunicator.js +3 -1
  229. package/dist/src/transport/ListeningRpcCommunicator.js.map +1 -1
  230. package/dist/src/transport/RoutingRpcCommunicator.d.ts +4 -2
  231. package/dist/src/transport/RoutingRpcCommunicator.js +19 -12
  232. package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -1
  233. package/jest.config.js +4 -1
  234. package/karma-setup.js +2 -0
  235. package/karma.config.js +13 -9
  236. package/package.json +17 -14
  237. package/protos/DhtRpc.proto +76 -76
  238. package/src/connection/Connection.ts +6 -1
  239. package/src/connection/ConnectionLockHandler.ts +30 -22
  240. package/src/connection/ConnectionLockRpcLocal.ts +7 -12
  241. package/src/connection/ConnectionLockRpcRemote.ts +9 -19
  242. package/src/connection/ConnectionManager.ts +132 -138
  243. package/src/connection/ConnectorFacade.ts +10 -9
  244. package/src/connection/Handshaker.ts +24 -12
  245. package/src/connection/IConnection.ts +2 -8
  246. package/src/connection/ManagedConnection.ts +34 -35
  247. package/src/connection/connectivityChecker.ts +109 -0
  248. package/src/connection/connectivityRequestHandler.ts +103 -0
  249. package/src/connection/simulator/Simulator.ts +6 -37
  250. package/src/connection/simulator/SimulatorConnection.ts +23 -25
  251. package/src/connection/simulator/SimulatorConnector.ts +11 -11
  252. package/src/connection/webrtc/BrowserWebrtcConnection.ts +17 -25
  253. package/src/connection/webrtc/NodeWebrtcConnection.ts +25 -27
  254. package/src/connection/webrtc/WebrtcConnector.ts +31 -36
  255. package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +31 -25
  256. package/src/connection/webrtc/WebrtcConnectorRpcRemote.ts +4 -14
  257. package/src/connection/webrtc/iceServerAsString.ts +1 -1
  258. package/src/connection/websocket/AutoCertifierClientFacade.ts +4 -6
  259. package/src/connection/websocket/ClientWebsocket.ts +10 -4
  260. package/src/connection/websocket/WebsocketConnector.ts +120 -97
  261. package/src/connection/websocket/WebsocketConnectorRpcLocal.ts +13 -15
  262. package/src/connection/websocket/WebsocketConnectorRpcRemote.ts +7 -27
  263. package/src/connection/websocket/WebsocketServer.ts +50 -53
  264. package/src/connection/websocket/WebsocketServerConnection.ts +104 -0
  265. package/src/dht/DhtNode.ts +289 -410
  266. package/src/dht/DhtNodeRpcLocal.ts +25 -17
  267. package/src/dht/DhtNodeRpcRemote.ts +43 -27
  268. package/src/dht/ExternalApiRpcLocal.ts +30 -17
  269. package/src/dht/ExternalApiRpcRemote.ts +14 -11
  270. package/src/dht/PeerManager.ts +339 -0
  271. package/src/dht/contact/Contact.ts +4 -4
  272. package/src/dht/contact/ContactList.ts +11 -10
  273. package/src/dht/contact/RandomContactList.ts +15 -15
  274. package/src/dht/contact/RingContactList.ts +151 -0
  275. package/src/dht/contact/{Remote.ts → RpcRemote.ts} +16 -19
  276. package/src/dht/contact/SortedContactList.ts +120 -72
  277. package/src/dht/contact/ringIdentifiers.ts +62 -0
  278. package/src/dht/discovery/DiscoverySession.ts +36 -61
  279. package/src/dht/discovery/PeerDiscovery.ts +98 -43
  280. package/src/dht/discovery/RingDiscoverySession.ts +160 -0
  281. package/src/dht/recursive-operation/RecursiveOperationManager.ts +246 -0
  282. package/src/dht/recursive-operation/RecursiveOperationRpcLocal.ts +34 -0
  283. package/src/dht/recursive-operation/RecursiveOperationRpcRemote.ts +43 -0
  284. package/src/dht/recursive-operation/RecursiveOperationSession.ts +232 -0
  285. package/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.ts +35 -0
  286. package/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.ts +30 -0
  287. package/src/dht/routing/DuplicateDetector.ts +9 -21
  288. package/src/dht/routing/Router.ts +95 -92
  289. package/src/dht/routing/RouterRpcLocal.ts +16 -18
  290. package/src/dht/routing/RouterRpcRemote.ts +26 -24
  291. package/src/dht/routing/RoutingSession.ts +119 -98
  292. package/src/dht/routing/RoutingTablesCache.ts +58 -0
  293. package/src/dht/routing/getPreviousPeer.ts +1 -1
  294. package/src/dht/store/LocalDataStore.ts +47 -77
  295. package/src/dht/store/StoreManager.ts +209 -0
  296. package/src/dht/store/StoreRpcLocal.ts +39 -308
  297. package/src/dht/store/StoreRpcRemote.ts +13 -31
  298. package/src/exports.ts +13 -3
  299. package/src/helpers/AddressTools.ts +2 -0
  300. package/src/helpers/MapWithTtl.ts +71 -0
  301. package/src/helpers/createPeerDescriptor.ts +57 -0
  302. package/src/helpers/createPeerDescriptorSignaturePayload.ts +28 -0
  303. package/src/helpers/offering.ts +15 -0
  304. package/src/helpers/protoClasses.ts +4 -6
  305. package/src/helpers/version.ts +32 -0
  306. package/src/identifiers.ts +29 -0
  307. package/src/proto/google/protobuf/any.ts +4 -4
  308. package/src/proto/google/protobuf/empty.ts +2 -4
  309. package/src/proto/google/protobuf/timestamp.ts +4 -4
  310. package/src/proto/packages/dht/protos/DhtRpc.client.ts +65 -68
  311. package/src/proto/packages/dht/protos/DhtRpc.server.ts +27 -30
  312. package/src/proto/packages/dht/protos/DhtRpc.ts +297 -313
  313. package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +1 -1
  314. package/src/rpc-protocol/DhtCallContext.ts +2 -2
  315. package/src/rpc-protocol/DhtRpcOptions.ts +2 -1
  316. package/src/transport/ITransport.ts +11 -2
  317. package/src/transport/ListeningRpcCommunicator.ts +1 -1
  318. package/src/transport/RoutingRpcCommunicator.ts +21 -14
  319. package/test/RandomGraphSimulation.ts +3 -2
  320. package/test/benchmark/Find.test.ts +13 -28
  321. package/test/benchmark/KademliaCorrectness.test.ts +24 -28
  322. package/test/benchmark/RingCorrectness.test.ts +157 -0
  323. package/test/benchmark/SortedContactListBenchmark.test.ts +151 -0
  324. package/test/benchmark/WebsocketServerMemoryLeak.test.ts +41 -0
  325. package/test/benchmark/hybrid-network-simulation/RingContactList.test.ts +72 -0
  326. package/test/benchmark/kademlia-simulation/Contact.ts +9 -9
  327. package/test/benchmark/kademlia-simulation/KademliaSimulation.ts +11 -11
  328. package/test/benchmark/kademlia-simulation/SimulationNode.ts +29 -25
  329. package/test/data/generateGroundTruthData.ts +7 -6
  330. package/test/end-to-end/Layer0-Layer1.test.ts +11 -15
  331. package/test/end-to-end/Layer0.test.ts +19 -22
  332. package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +19 -21
  333. package/test/end-to-end/Layer0Webrtc-Layer1.test.ts +26 -28
  334. package/test/end-to-end/Layer0Webrtc.test.ts +19 -19
  335. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +10 -18
  336. package/test/end-to-end/Layer1-Scale-Webrtc.test.ts +8 -15
  337. package/test/end-to-end/RecoveryFromFailedAutoCertification.test.ts +2 -2
  338. package/test/end-to-end/WebsocketConnectionRequest.test.ts +8 -9
  339. package/test/end-to-end/memory-leak.test.ts +19 -24
  340. package/test/integration/ConnectionLocking.test.ts +66 -60
  341. package/test/integration/ConnectionManager.test.ts +43 -63
  342. package/test/integration/ConnectivityChecking.test.ts +52 -0
  343. package/test/integration/DhtJoinPeerDiscovery.test.ts +8 -12
  344. package/test/integration/DhtNodeExternalAPI.test.ts +17 -21
  345. package/test/integration/DhtNodeRpcRemote.test.ts +19 -26
  346. package/test/integration/DhtRpc.test.ts +20 -24
  347. package/test/integration/Find.test.ts +10 -12
  348. package/test/integration/Layer1-scale.test.ts +25 -37
  349. package/test/integration/Mock-Layer1-Layer0.test.ts +39 -59
  350. package/test/integration/MultipleEntryPointJoining.test.ts +14 -14
  351. package/test/integration/ReplicateData.test.ts +106 -0
  352. package/test/integration/RouteMessage.test.ts +42 -68
  353. package/test/integration/RouterRpcRemote.test.ts +19 -24
  354. package/test/integration/ScaleDownDht.test.ts +14 -12
  355. package/test/integration/SimultaneousConnections.test.ts +112 -111
  356. package/test/integration/Store.test.ts +43 -27
  357. package/test/integration/StoreAndDelete.test.ts +36 -48
  358. package/test/integration/StoreOnDhtWithThreeNodes.test.ts +59 -0
  359. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +17 -37
  360. package/test/integration/StoreRpcRemote.test.ts +20 -32
  361. package/test/integration/WebrtcConnectionManagement.test.ts +39 -25
  362. package/test/integration/WebrtcConnectorRpc.test.ts +6 -11
  363. package/test/integration/WebsocketConnectionManagement.test.ts +87 -22
  364. package/test/integration/WebsocketConnectorRpc.test.ts +14 -24
  365. package/test/integration/{RpcErrors.test.ts → rpc-connections-over-webrpc.test.ts} +15 -26
  366. package/test/unit/AddressTools.test.ts +4 -0
  367. package/test/unit/ConnectivityHelpers.test.ts +9 -17
  368. package/test/unit/DuplicateDetector.test.ts +8 -5
  369. package/test/unit/LocalDataStore.test.ts +78 -75
  370. package/test/unit/PeerManager.test.ts +33 -0
  371. package/test/unit/RandomContactList.test.ts +12 -9
  372. package/test/unit/RecursiveOperationManager.test.ts +157 -0
  373. package/test/unit/RecursiveOperationSession.test.ts +68 -0
  374. package/test/unit/Router.test.ts +52 -35
  375. package/test/unit/RoutingSession.test.ts +79 -0
  376. package/test/unit/SortedContactList.test.ts +61 -30
  377. package/test/unit/StoreManager.test.ts +138 -0
  378. package/test/unit/WebsocketConnector.test.ts +27 -35
  379. package/test/unit/connectivityRequestHandler.test.ts +104 -0
  380. package/test/unit/createPeerDescriptor.test.ts +69 -0
  381. package/test/unit/customMatchers.test.ts +16 -0
  382. package/test/unit/version.test.ts +18 -0
  383. package/test/utils/FakeTransport.ts +47 -0
  384. package/test/utils/customMatchers.ts +71 -0
  385. package/test/utils/mock/MockRpcCommunicator.ts +7 -0
  386. package/test/utils/mock/Router.ts +13 -3
  387. package/test/utils/mock/Transport.ts +1 -1
  388. package/test/utils/mock/mockDataEntry.ts +38 -0
  389. package/test/utils/utils.ts +104 -107
  390. package/tsconfig.browser.json +2 -1
  391. package/tsconfig.jest.json +4 -2
  392. package/tsconfig.node.json +4 -2
  393. package/dist/src/connection/ConnectivityChecker.d.ts +0 -17
  394. package/dist/src/connection/ConnectivityChecker.js +0 -208
  395. package/dist/src/connection/ConnectivityChecker.js.map +0 -1
  396. package/dist/src/connection/websocket/ServerWebsocket.js +0 -100
  397. package/dist/src/connection/websocket/ServerWebsocket.js.map +0 -1
  398. package/dist/src/dht/contact/Remote.js.map +0 -1
  399. package/dist/src/dht/find/FindRpcLocal.d.ts +0 -14
  400. package/dist/src/dht/find/FindRpcLocal.js +0 -25
  401. package/dist/src/dht/find/FindRpcLocal.js.map +0 -1
  402. package/dist/src/dht/find/FindSession.d.ts +0 -44
  403. package/dist/src/dht/find/FindSession.js +0 -145
  404. package/dist/src/dht/find/FindSession.js.map +0 -1
  405. package/dist/src/dht/find/FindSessionRpcLocal.d.ts +0 -12
  406. package/dist/src/dht/find/FindSessionRpcLocal.js +0 -17
  407. package/dist/src/dht/find/FindSessionRpcLocal.js.map +0 -1
  408. package/dist/src/dht/find/FindSessionRpcRemote.d.ts +0 -6
  409. package/dist/src/dht/find/FindSessionRpcRemote.js +0 -21
  410. package/dist/src/dht/find/FindSessionRpcRemote.js.map +0 -1
  411. package/dist/src/dht/find/Finder.d.ts +0 -49
  412. package/dist/src/dht/find/Finder.js +0 -184
  413. package/dist/src/dht/find/Finder.js.map +0 -1
  414. package/dist/src/dht/routing/FindRpcRemote.d.ts +0 -6
  415. package/dist/src/dht/routing/FindRpcRemote.js +0 -41
  416. package/dist/src/dht/routing/FindRpcRemote.js.map +0 -1
  417. package/dist/src/helpers/PeerID.d.ts +0 -24
  418. package/dist/src/helpers/PeerID.js +0 -78
  419. package/dist/src/helpers/PeerID.js.map +0 -1
  420. package/dist/src/helpers/UUID.d.ts +0 -8
  421. package/dist/src/helpers/UUID.js +0 -36
  422. package/dist/src/helpers/UUID.js.map +0 -1
  423. package/dist/src/helpers/kademliaId.d.ts +0 -1
  424. package/dist/src/helpers/kademliaId.js +0 -14
  425. package/dist/src/helpers/kademliaId.js.map +0 -1
  426. package/dist/src/helpers/peerIdFromPeerDescriptor.d.ts +0 -6
  427. package/dist/src/helpers/peerIdFromPeerDescriptor.js +0 -23
  428. package/dist/src/helpers/peerIdFromPeerDescriptor.js.map +0 -1
  429. package/src/connection/ConnectivityChecker.ts +0 -199
  430. package/src/connection/websocket/ServerWebsocket.ts +0 -114
  431. package/src/dht/find/FindRpcLocal.ts +0 -35
  432. package/src/dht/find/FindSession.ts +0 -178
  433. package/src/dht/find/FindSessionRpcLocal.ts +0 -25
  434. package/src/dht/find/FindSessionRpcRemote.ts +0 -30
  435. package/src/dht/find/Finder.ts +0 -275
  436. package/src/dht/routing/FindRpcRemote.ts +0 -40
  437. package/src/helpers/PeerID.ts +0 -88
  438. package/src/helpers/UUID.ts +0 -35
  439. package/src/helpers/kademliaId.ts +0 -8
  440. package/src/helpers/peerIdFromPeerDescriptor.ts +0 -20
  441. package/test/integration/MigrateData.test.ts +0 -204
  442. package/test/unit/Finder.test.ts +0 -110
  443. package/test/unit/PeerID.test.ts +0 -22
  444. package/test/unit/UUID.test.ts +0 -55
@@ -1,16 +1,18 @@
1
1
  import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
2
2
  import {
3
3
  PeerDescriptor,
4
- WebsocketConnectionRequest,
5
- WebsocketConnectionResponse
4
+ WebsocketConnectionRequest
6
5
  } from '../../proto/packages/dht/protos/DhtRpc'
7
6
  import { IWebsocketConnectorRpc } from '../../proto/packages/dht/protos/DhtRpc.server'
8
7
  import { DhtCallContext } from '../../rpc-protocol/DhtCallContext'
9
8
  import { ManagedConnection } from '../ManagedConnection'
9
+ import { Empty } from '../../proto/google/protobuf/empty'
10
+ import { getNodeIdFromPeerDescriptor } from '../../identifiers'
11
+ import { DhtAddress } from '../../identifiers'
10
12
 
11
13
  interface WebsocketConnectorRpcLocalConfig {
12
- canConnect: (peerDescriptor: PeerDescriptor) => boolean
13
14
  connect: (targetPeerDescriptor: PeerDescriptor) => ManagedConnection
15
+ hasConnection: (nodeId: DhtAddress) => boolean
14
16
  onNewConnection: (connection: ManagedConnection) => boolean
15
17
  abortSignal: AbortSignal
16
18
  }
@@ -23,19 +25,15 @@ export class WebsocketConnectorRpcLocal implements IWebsocketConnectorRpc {
23
25
  this.config = config
24
26
  }
25
27
 
26
- public async requestConnection(_request: WebsocketConnectionRequest, context: ServerCallContext): Promise<WebsocketConnectionResponse> {
28
+ public async requestConnection(_request: WebsocketConnectionRequest, context: ServerCallContext): Promise<Empty> {
29
+ if (this.config.abortSignal.aborted) {
30
+ return {}
31
+ }
27
32
  const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
28
- if (this.config.canConnect(senderPeerDescriptor)) {
29
- setImmediate(() => {
30
- if (this.config.abortSignal.aborted) {
31
- return
32
- }
33
- const connection = this.config.connect(senderPeerDescriptor)
34
- this.config.onNewConnection(connection)
35
- })
36
- return { accepted: true }
37
- } else {
38
- return { accepted: false }
33
+ if (!this.config.hasConnection(getNodeIdFromPeerDescriptor(senderPeerDescriptor))) {
34
+ const connection = this.config.connect(senderPeerDescriptor)
35
+ this.config.onNewConnection(connection)
39
36
  }
37
+ return {}
40
38
  }
41
39
  }
@@ -1,39 +1,19 @@
1
1
  import {
2
- PeerDescriptor,
3
2
  WebsocketConnectionRequest
4
3
  } from '../../proto/packages/dht/protos/DhtRpc'
5
- import { IWebsocketConnectorRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
6
4
  import { Logger } from '@streamr/utils'
7
- import * as Err from '../../helpers/errors'
8
- import { ProtoRpcClient } from '@streamr/proto-rpc'
9
- import { getNodeIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
10
- import { Remote } from '../../dht/contact/Remote'
5
+ import { RpcRemote } from '../../dht/contact/RpcRemote'
6
+ import { WebsocketConnectorRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
7
+ import { getNodeIdFromPeerDescriptor } from '../../identifiers'
11
8
 
12
9
  const logger = new Logger(module)
13
10
 
14
- export class WebsocketConnectorRpcRemote extends Remote<IWebsocketConnectorRpcClient> {
11
+ export class WebsocketConnectorRpcRemote extends RpcRemote<WebsocketConnectorRpcClient> {
15
12
 
16
- constructor(
17
- localPeerDescriptor: PeerDescriptor,
18
- remotePeerDescriptor: PeerDescriptor,
19
- client: ProtoRpcClient<IWebsocketConnectorRpcClient>
20
- ) {
21
- super(localPeerDescriptor, remotePeerDescriptor, 'DUMMY', client)
22
- }
23
-
24
- async requestConnection(ip: string, port: number): Promise<boolean> {
13
+ async requestConnection(): Promise<void> {
25
14
  logger.trace(`Requesting WebSocket connection from ${getNodeIdFromPeerDescriptor(this.getLocalPeerDescriptor())}`)
26
- const request: WebsocketConnectionRequest = {
27
- ip,
28
- port
29
- }
15
+ const request: WebsocketConnectionRequest = {}
30
16
  const options = this.formDhtRpcOptions()
31
- try {
32
- const res = await this.getClient().requestConnection(request, options)
33
- return res.accepted
34
- } catch (err) {
35
- logger.debug(new Err.WebsocketConnectionRequestRejected('WebsocketConnectionRequest rejected', err).stack!)
36
- return false
37
- }
17
+ return this.getClient().requestConnection(request, options)
38
18
  }
39
19
  }
@@ -1,8 +1,8 @@
1
1
  import { createServer as createHttpServer, Server as HttpServer, IncomingMessage, ServerResponse } from 'http'
2
2
  import { createServer as createHttpsServer, Server as HttpsServer } from 'https'
3
3
  import EventEmitter from 'eventemitter3'
4
- import { server as WsServer } from 'websocket'
5
- import { ServerWebsocket } from './ServerWebsocket'
4
+ import WebSocket from 'ws'
5
+ import { WebsocketServerConnection } from './WebsocketServerConnection'
6
6
  import { ConnectionSourceEvents } from '../IConnectionSource'
7
7
  import { Logger, asAbortable } from '@streamr/utils'
8
8
  import { createSelfSignedCertificate } from '@streamr/autocertifier-client'
@@ -10,17 +10,11 @@ import { WebsocketServerStartError } from '../../helpers/errors'
10
10
  import { PortRange, TlsCertificate } from '../ConnectionManager'
11
11
  import { range } from 'lodash'
12
12
  import fs from 'fs'
13
- import { UUID } from '../../helpers/UUID'
13
+ import { v4 as uuid } from 'uuid'
14
+ import { parse } from 'url'
14
15
 
15
16
  const logger = new Logger(module)
16
17
 
17
- // NodeJsWsServer is declared as a global in test-browser Electron tests
18
- // in preload.js using "window.NodeJsWsServer = require('websocket').server".
19
- // This is done in order to use the real nodejs websocket server in tests
20
- // instead of a dummy polyfill.
21
-
22
- declare class NodeJsWsServer extends WsServer { }
23
-
24
18
  interface WebsocketServerConfig {
25
19
  portRange: PortRange
26
20
  enableTls: boolean
@@ -31,26 +25,20 @@ interface WebsocketServerConfig {
31
25
  export class WebsocketServer extends EventEmitter<ConnectionSourceEvents> {
32
26
 
33
27
  private httpServer?: HttpServer | HttpsServer
34
- private wsServer?: WsServer
28
+ private wsServer?: WebSocket.Server
35
29
  private readonly abortController = new AbortController()
36
- private readonly portRange: PortRange
37
- private readonly tlsCertificate?: TlsCertificate
38
- private readonly enableTls: boolean
39
- private readonly maxMessageSize: number
30
+ private readonly config: WebsocketServerConfig
40
31
 
41
32
  constructor(config: WebsocketServerConfig) {
42
33
  super()
43
- this.portRange = config.portRange
44
- this.enableTls = config.enableTls
45
- this.tlsCertificate = config.tlsCertificate
46
- this.maxMessageSize = config.maxMessageSize ?? 1048576
34
+ this.config = config
47
35
  }
48
36
 
49
37
  public async start(): Promise<number> {
50
- const ports = range(this.portRange.min, this.portRange.max + 1)
38
+ const ports = range(this.config.portRange.min, this.config.portRange.max + 1)
51
39
  for (const port of ports) {
52
40
  try {
53
- await asAbortable(this.startServer(port, this.enableTls), this.abortController.signal)
41
+ await asAbortable(this.startServer(port, this.config.enableTls), this.abortController.signal)
54
42
  return port
55
43
  } catch (err) {
56
44
  if (err.originalError?.code === 'EADDRINUSE') {
@@ -60,7 +48,9 @@ export class WebsocketServer extends EventEmitter<ConnectionSourceEvents> {
60
48
  }
61
49
  }
62
50
  }
63
- throw new WebsocketServerStartError(`Failed to start WebSocket server on any port in range: ${this.portRange.min}-${this.portRange.min}`)
51
+ throw new WebsocketServerStartError(
52
+ `Failed to start WebSocket server on any port in range: ${this.config.portRange.min}-${this.config.portRange.min}`
53
+ )
64
54
  }
65
55
 
66
56
  // If tlsCertificate has been given the tls boolean is ignored
@@ -72,15 +62,16 @@ export class WebsocketServer extends EventEmitter<ConnectionSourceEvents> {
72
62
  response.end()
73
63
  }
74
64
  return new Promise((resolve, reject) => {
75
- if (this.tlsCertificate) {
65
+ if (this.config.tlsCertificate) {
76
66
  this.httpServer = createHttpsServer({
77
- key: fs.readFileSync(this.tlsCertificate.privateKeyFileName),
78
- cert: fs.readFileSync(this.tlsCertificate.certFileName)
67
+ key: fs.readFileSync(this.config.tlsCertificate.privateKeyFileName),
68
+ cert: fs.readFileSync(this.config.tlsCertificate.certFileName)
79
69
  }, requestListener)
80
70
  } else if (!tls) {
81
71
  this.httpServer = createHttpServer(requestListener)
82
72
  } else {
83
- const certificate = createSelfSignedCertificate('streamr-self-signed-' + new UUID().toString(), 1000)
73
+ // TODO use config option or named constant?
74
+ const certificate = createSelfSignedCertificate('streamr-self-signed-' + uuid(), 1000)
84
75
  this.httpServer = createHttpsServer({
85
76
  key: certificate.serverKey,
86
77
  cert: certificate.serverCert
@@ -91,22 +82,26 @@ export class WebsocketServer extends EventEmitter<ConnectionSourceEvents> {
91
82
  return true
92
83
  }
93
84
 
94
- this.wsServer = this.createWsServer(this.httpServer)
85
+ this.wsServer = this.createWsServer()
95
86
 
96
- this.wsServer.on('request', (request) => {
87
+ this.wsServer.on('connection', (ws: WebSocket, request: IncomingMessage) => {
88
+ logger.trace(`New connection from ${request.socket.remoteAddress}`)
97
89
  if (!originIsAllowed()) {
98
90
  // Make sure we only accept requests from an allowed origin
99
- request.reject()
100
- logger.trace('IConnection from origin ' + request.origin + ' rejected.')
91
+ ws.close()
92
+ logger.trace('IConnection from origin ' + request.headers.origin + ' rejected.')
101
93
  return
102
94
  }
103
-
104
- const connection = request.accept(undefined, request.origin)
105
-
106
- logger.trace('IConnection accepted.')
95
+ this.emit('connected', new WebsocketServerConnection(ws, parse(request.url!), request.socket.remoteAddress!))
96
+ })
107
97
 
108
- this.emit('connected', new ServerWebsocket(connection, request.resourceURL))
98
+ this.httpServer.on('upgrade', (request, socket, head) => {
99
+ logger.trace('Received upgrade request for ' + request.url)
100
+ this.wsServer!.handleUpgrade(request, socket, head, (ws: WebSocket) => {
101
+ this.wsServer!.emit('connection', ws, request)
102
+ })
109
103
  })
104
+
110
105
  this.httpServer.once('error', (err: Error) => {
111
106
  reject(new WebsocketServerStartError('Starting Websocket server failed', err))
112
107
  })
@@ -136,28 +131,30 @@ export class WebsocketServer extends EventEmitter<ConnectionSourceEvents> {
136
131
  this.abortController.abort()
137
132
  this.removeAllListeners()
138
133
  return new Promise((resolve, _reject) => {
139
- this.wsServer?.shutDown()
140
- this.httpServer?.close(() => {
134
+ this.wsServer!.close()
135
+ for (const ws of this.wsServer!.clients) {
136
+ ws.terminate()
137
+ }
138
+ this.httpServer?.once('close', () => {
139
+ // removeAllListeners is maybe not needed?
140
+ this.httpServer?.removeAllListeners()
141
141
  resolve()
142
142
  })
143
+ this.httpServer?.close()
144
+ // the close method "Stops the server from accepting new connections and closes all
145
+ // connections connected to this server which are not sending a request or waiting for a
146
+ // response." (https://nodejs.org/api/http.html#serverclosecallback)
147
+ // i.e. we need to call closeAllConnections() to close the rest of the connections
148
+ // (in practice this closes the active websocket connections)
149
+ this.httpServer?.closeAllConnections()
143
150
  })
144
151
  }
145
152
 
146
- private createWsServer(httpServer: HttpServer | HttpsServer): WsServer {
147
- // Use the real nodejs WebSocket server in Electron tests
148
-
149
- if (typeof NodeJsWsServer !== 'undefined') {
150
- return new NodeJsWsServer({
151
- httpServer,
152
- autoAcceptConnections: false,
153
- maxReceivedMessageSize: this.maxMessageSize
154
- })
155
- } else {
156
- return this.wsServer = new WsServer({
157
- httpServer,
158
- autoAcceptConnections: false,
159
- maxReceivedMessageSize: this.maxMessageSize
160
- })
161
- }
153
+ private createWsServer(): WebSocket.Server {
154
+ const maxPayload = this.config.maxMessageSize ?? 1048576
155
+ return this.wsServer = new WebSocket.Server({
156
+ noServer: true,
157
+ maxPayload
158
+ })
162
159
  }
163
160
  }
@@ -0,0 +1,104 @@
1
+ import EventEmitter from 'eventemitter3'
2
+ import { IConnection, ConnectionID, ConnectionEvents, ConnectionType } from '../IConnection'
3
+ import WebSocket from 'ws'
4
+ import { Logger } from '@streamr/utils'
5
+ import { Url } from 'url'
6
+ import { CUSTOM_GOING_AWAY, GOING_AWAY } from './ClientWebsocket'
7
+ import { createRandomConnectionId } from '../Connection'
8
+
9
+ const logger = new Logger(module)
10
+
11
+ export class WebsocketServerConnection extends EventEmitter<ConnectionEvents> implements IConnection {
12
+
13
+ public readonly connectionId: ConnectionID
14
+ public readonly connectionType = ConnectionType.WEBSOCKET_SERVER
15
+ public readonly resourceURL: Url
16
+ public readonly remoteIpAddress: string
17
+ private socket?: WebSocket
18
+ private stopped = false
19
+
20
+ constructor(socket: WebSocket, resourceURL: Url, remoteAddress: string) {
21
+ super()
22
+
23
+ this.onMessage = this.onMessage.bind(this)
24
+ this.onClose = this.onClose.bind(this)
25
+ this.onError = this.onError.bind(this)
26
+
27
+ this.resourceURL = resourceURL
28
+ this.connectionId = createRandomConnectionId()
29
+ this.remoteIpAddress = remoteAddress
30
+
31
+ socket.on('message', this.onMessage)
32
+ socket.on('close', this.onClose)
33
+ socket.on('error', this.onError)
34
+
35
+ this.socket = socket
36
+ }
37
+
38
+ private onMessage(message: WebSocket.RawData, isBinary: boolean): void {
39
+ if (!isBinary) {
40
+ logger.trace('Received string Message')
41
+ } else {
42
+ logger.trace('Websocket server received Message')
43
+ this.emit('data', new Uint8Array(message as Buffer))
44
+ }
45
+ }
46
+
47
+ private onClose(reasonCode: number, description: string): void {
48
+ logger.trace('Peer ' + this.remoteIpAddress + ' disconnected.')
49
+ this.doDisconnect(reasonCode, description)
50
+ }
51
+
52
+ private onError(error: Error): void {
53
+ this.emit('error', error.name)
54
+ }
55
+
56
+ private stopListening(): void {
57
+ this.socket?.off('message', this.onMessage)
58
+ this.socket?.off('close', this.onClose)
59
+ this.socket?.off('error', this.onError)
60
+ }
61
+
62
+ private doDisconnect(reasonCode: number, description: string): void {
63
+ this.stopped = true
64
+ this.stopListening()
65
+ this.socket = undefined
66
+ const gracefulLeave = (reasonCode === GOING_AWAY) || (reasonCode === CUSTOM_GOING_AWAY)
67
+ this.emit('disconnected', gracefulLeave, reasonCode, description)
68
+ }
69
+
70
+ public send(data: Uint8Array): void {
71
+ // TODO: no need to check this.socket as it is always defined when stopped is false?
72
+ if (!this.stopped && this.socket) {
73
+ this.socket.send(data, { binary: true })
74
+ } else {
75
+ logger.debug('Tried to call send() on a stopped socket')
76
+ }
77
+
78
+ }
79
+
80
+ public async close(gracefulLeave: boolean): Promise<void> {
81
+ this.emit('disconnected', gracefulLeave, undefined, 'close() called')
82
+ this.removeAllListeners()
83
+ if (!this.stopped) {
84
+ this.socket?.close(gracefulLeave ? GOING_AWAY : undefined)
85
+ } else {
86
+ logger.debug('Tried to close a stopped connection')
87
+ }
88
+ }
89
+
90
+ // TODO could rename to "closeSilently?"
91
+ public destroy(): void {
92
+ if (!this.stopped) {
93
+ this.removeAllListeners()
94
+ if (this.socket) {
95
+ this.stopListening()
96
+ this.socket.close()
97
+ this.socket = undefined
98
+ }
99
+ this.stopped = true
100
+ } else {
101
+ logger.debug('Tried to destroy() a stopped connection')
102
+ }
103
+ }
104
+ }