libp2p 0.36.0 → 0.36.2-199395d

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 (398) hide show
  1. package/LICENSE +3 -21
  2. package/README.md +13 -10
  3. package/dist/src/address-manager/index.d.ts +33 -52
  4. package/dist/src/address-manager/index.d.ts.map +1 -1
  5. package/dist/src/address-manager/index.js +81 -0
  6. package/dist/src/address-manager/index.js.map +1 -0
  7. package/dist/src/circuit/auto-relay.d.ts +24 -85
  8. package/dist/src/circuit/auto-relay.d.ts.map +1 -1
  9. package/dist/src/circuit/auto-relay.js +215 -0
  10. package/dist/src/circuit/auto-relay.js.map +1 -0
  11. package/dist/src/circuit/circuit/hop.d.ts +25 -52
  12. package/dist/src/circuit/circuit/hop.d.ts.map +1 -1
  13. package/dist/src/circuit/circuit/hop.js +138 -0
  14. package/dist/src/circuit/circuit/hop.js.map +1 -0
  15. package/dist/src/circuit/circuit/stop.d.ts +16 -8
  16. package/dist/src/circuit/circuit/stop.d.ts.map +1 -1
  17. package/dist/src/circuit/circuit/stop.js +49 -0
  18. package/dist/src/circuit/circuit/stop.js.map +1 -0
  19. package/dist/src/circuit/circuit/stream-handler.d.ts +16 -35
  20. package/dist/src/circuit/circuit/stream-handler.d.ts.map +1 -1
  21. package/dist/src/circuit/circuit/stream-handler.js +60 -0
  22. package/dist/src/circuit/circuit/stream-handler.js.map +1 -0
  23. package/dist/src/circuit/circuit/utils.d.ts +3 -6
  24. package/dist/src/circuit/circuit/utils.d.ts.map +1 -1
  25. package/dist/src/circuit/circuit/utils.js +43 -0
  26. package/dist/src/circuit/circuit/utils.js.map +1 -0
  27. package/dist/src/circuit/constants.d.ts +24 -6
  28. package/dist/src/circuit/constants.d.ts.map +1 -1
  29. package/dist/src/circuit/constants.js +26 -0
  30. package/dist/src/circuit/constants.js.map +1 -0
  31. package/dist/src/circuit/index.d.ts +41 -74
  32. package/dist/src/circuit/index.d.ts.map +1 -1
  33. package/dist/src/circuit/index.js +69 -0
  34. package/dist/src/circuit/index.js.map +1 -0
  35. package/dist/src/circuit/listener.d.ts +8 -3
  36. package/dist/src/circuit/listener.d.ts.map +1 -1
  37. package/dist/src/circuit/listener.js +54 -0
  38. package/dist/src/circuit/listener.js.map +1 -0
  39. package/dist/src/circuit/multicodec.d.ts +1 -1
  40. package/dist/src/circuit/multicodec.d.ts.map +1 -1
  41. package/dist/src/circuit/multicodec.js +2 -0
  42. package/dist/src/circuit/multicodec.js.map +1 -0
  43. package/dist/src/circuit/{protocol → pb}/index.d.ts +0 -0
  44. package/{src/circuit/protocol → dist/src/circuit/pb}/index.js +7 -9
  45. package/dist/src/circuit/transport.d.ts +18 -78
  46. package/dist/src/circuit/transport.d.ts.map +1 -1
  47. package/dist/src/circuit/transport.js +190 -0
  48. package/dist/src/circuit/transport.js.map +1 -0
  49. package/dist/src/circuit/utils.d.ts +5 -2
  50. package/dist/src/circuit/utils.d.ts.map +1 -1
  51. package/dist/src/circuit/utils.js +11 -0
  52. package/dist/src/circuit/utils.js.map +1 -0
  53. package/dist/src/config.d.ts +3 -85
  54. package/dist/src/config.d.ts.map +1 -1
  55. package/dist/src/config.js +93 -0
  56. package/dist/src/config.js.map +1 -0
  57. package/dist/src/connection-manager/auto-dialler.d.ts +24 -41
  58. package/dist/src/connection-manager/auto-dialler.d.ts.map +1 -1
  59. package/dist/src/connection-manager/auto-dialler.js +105 -0
  60. package/dist/src/connection-manager/auto-dialler.js.map +1 -0
  61. package/dist/src/connection-manager/index.d.ts +79 -144
  62. package/dist/src/connection-manager/index.d.ts.map +1 -1
  63. package/dist/src/connection-manager/index.js +295 -0
  64. package/dist/src/connection-manager/index.js.map +1 -0
  65. package/dist/src/connection-manager/latency-monitor.d.ts +72 -97
  66. package/dist/src/connection-manager/latency-monitor.d.ts.map +1 -1
  67. package/dist/src/connection-manager/latency-monitor.js +220 -0
  68. package/dist/src/connection-manager/latency-monitor.js.map +1 -0
  69. package/dist/src/connection-manager/visibility-change-emitter.d.ts +15 -16
  70. package/dist/src/connection-manager/visibility-change-emitter.d.ts.map +1 -1
  71. package/dist/src/connection-manager/visibility-change-emitter.js +118 -0
  72. package/dist/src/connection-manager/visibility-change-emitter.js.map +1 -0
  73. package/dist/src/constants.d.ts +22 -10
  74. package/dist/src/constants.d.ts.map +1 -1
  75. package/dist/src/constants.js +27 -0
  76. package/dist/src/constants.js.map +1 -0
  77. package/dist/src/content-routing/index.d.ts +26 -81
  78. package/dist/src/content-routing/index.d.ts.map +1 -1
  79. package/dist/src/content-routing/index.js +99 -0
  80. package/dist/src/content-routing/index.js.map +1 -0
  81. package/dist/src/content-routing/utils.d.ts +6 -49
  82. package/dist/src/content-routing/utils.d.ts.map +1 -1
  83. package/dist/src/content-routing/utils.js +42 -0
  84. package/dist/src/content-routing/utils.js.map +1 -0
  85. package/dist/src/dht/dht-content-routing.d.ts +10 -24
  86. package/dist/src/dht/dht-content-routing.d.ts.map +1 -1
  87. package/dist/src/dht/dht-content-routing.js +32 -0
  88. package/dist/src/dht/dht-content-routing.js.map +1 -0
  89. package/dist/src/dht/dht-peer-routing.d.ts +9 -24
  90. package/dist/src/dht/dht-peer-routing.d.ts.map +1 -1
  91. package/dist/src/dht/dht-peer-routing.js +26 -0
  92. package/dist/src/dht/dht-peer-routing.js.map +1 -0
  93. package/dist/src/dialer/auto-dialer.d.ts +14 -0
  94. package/dist/src/dialer/auto-dialer.d.ts.map +1 -0
  95. package/dist/src/dialer/auto-dialer.js +24 -0
  96. package/dist/src/dialer/auto-dialer.js.map +1 -0
  97. package/dist/src/dialer/dial-request.d.ts +18 -46
  98. package/dist/src/dialer/dial-request.d.ts.map +1 -1
  99. package/dist/src/dialer/dial-request.js +83 -0
  100. package/dist/src/dialer/dial-request.js.map +1 -0
  101. package/dist/src/dialer/index.d.ts +41 -148
  102. package/dist/src/dialer/index.d.ts.map +1 -1
  103. package/dist/src/dialer/index.js +281 -0
  104. package/dist/src/dialer/index.js.map +1 -0
  105. package/dist/src/errors.d.ts +68 -63
  106. package/dist/src/errors.d.ts.map +1 -1
  107. package/dist/src/errors.js +73 -0
  108. package/dist/src/errors.js.map +1 -0
  109. package/dist/src/fetch/constants.d.ts +1 -1
  110. package/dist/src/fetch/constants.d.ts.map +1 -1
  111. package/dist/src/fetch/constants.js +3 -0
  112. package/dist/src/fetch/constants.js.map +1 -0
  113. package/dist/src/fetch/index.d.ts +30 -49
  114. package/dist/src/fetch/index.d.ts.map +1 -1
  115. package/dist/src/fetch/index.js +130 -0
  116. package/dist/src/fetch/index.js.map +1 -0
  117. package/dist/src/fetch/{proto.d.ts → pb/proto.d.ts} +0 -0
  118. package/{src/fetch → dist/src/fetch/pb}/proto.js +7 -9
  119. package/dist/src/get-peer.d.ts +4 -11
  120. package/dist/src/get-peer.d.ts.map +1 -1
  121. package/dist/src/get-peer.js +43 -0
  122. package/dist/src/get-peer.js.map +1 -0
  123. package/dist/src/identify/consts.d.ts +9 -9
  124. package/dist/src/identify/consts.d.ts.map +1 -1
  125. package/dist/src/identify/consts.js +11 -0
  126. package/dist/src/identify/consts.js.map +1 -0
  127. package/dist/src/identify/index.d.ts +40 -96
  128. package/dist/src/identify/index.d.ts.map +1 -1
  129. package/dist/src/identify/index.js +322 -0
  130. package/dist/src/identify/index.js.map +1 -0
  131. package/{src/identify → dist/src/identify/pb}/message.d.ts +20 -5
  132. package/{src/identify → dist/src/identify/pb}/message.js +83 -42
  133. package/dist/src/index.d.ts +157 -583
  134. package/dist/src/index.d.ts.map +1 -1
  135. package/dist/src/index.js +9 -0
  136. package/dist/src/index.js.map +1 -0
  137. package/dist/src/insecure/index.d.ts +9 -0
  138. package/dist/src/insecure/index.d.ts.map +1 -0
  139. package/dist/src/insecure/index.js +78 -0
  140. package/dist/src/insecure/index.js.map +1 -0
  141. package/dist/src/insecure/{proto.d.ts → pb/proto.d.ts} +7 -1
  142. package/{src/insecure → dist/src/insecure/pb}/proto.js +39 -22
  143. package/dist/src/keychain/cms.d.ts +6 -14
  144. package/dist/src/keychain/cms.d.ts.map +1 -1
  145. package/dist/src/keychain/cms.js +129 -0
  146. package/dist/src/keychain/cms.js.map +1 -0
  147. package/dist/src/keychain/index.d.ts +62 -82
  148. package/dist/src/keychain/index.d.ts.map +1 -1
  149. package/dist/src/keychain/index.js +493 -0
  150. package/dist/src/keychain/index.js.map +1 -0
  151. package/dist/src/keychain/util.d.ts +3 -6
  152. package/dist/src/keychain/util.d.ts.map +1 -1
  153. package/dist/src/keychain/util.js +79 -0
  154. package/dist/src/keychain/util.js.map +1 -0
  155. package/dist/src/libp2p.d.ts +75 -0
  156. package/dist/src/libp2p.d.ts.map +1 -0
  157. package/dist/src/libp2p.js +368 -0
  158. package/dist/src/libp2p.js.map +1 -0
  159. package/dist/src/metrics/index.d.ts +47 -104
  160. package/dist/src/metrics/index.d.ts.map +1 -1
  161. package/dist/src/metrics/index.js +231 -0
  162. package/dist/src/metrics/index.js.map +1 -0
  163. package/dist/src/metrics/moving-average.d.ts +14 -0
  164. package/dist/src/metrics/moving-average.d.ts.map +1 -0
  165. package/dist/src/metrics/moving-average.js +40 -0
  166. package/dist/src/metrics/moving-average.js.map +1 -0
  167. package/dist/src/metrics/stats.d.ts +45 -93
  168. package/dist/src/metrics/stats.d.ts.map +1 -1
  169. package/dist/src/metrics/stats.js +183 -0
  170. package/dist/src/metrics/stats.js.map +1 -0
  171. package/dist/src/nat-manager.d.ts +42 -99
  172. package/dist/src/nat-manager.d.ts.map +1 -1
  173. package/dist/src/nat-manager.js +114 -0
  174. package/dist/src/nat-manager.js.map +1 -0
  175. package/dist/src/peer-record-updater.d.ts +15 -0
  176. package/dist/src/peer-record-updater.d.ts.map +1 -0
  177. package/dist/src/peer-record-updater.js +44 -0
  178. package/dist/src/peer-record-updater.js.map +1 -0
  179. package/dist/src/peer-routing.d.ts +39 -84
  180. package/dist/src/peer-routing.d.ts.map +1 -1
  181. package/dist/src/peer-routing.js +108 -0
  182. package/dist/src/peer-routing.js.map +1 -0
  183. package/dist/src/ping/constants.d.ts +4 -4
  184. package/dist/src/ping/constants.d.ts.map +1 -1
  185. package/dist/src/ping/constants.js +5 -0
  186. package/dist/src/ping/constants.js.map +1 -0
  187. package/dist/src/ping/index.d.ts +26 -33
  188. package/dist/src/ping/index.d.ts.map +1 -1
  189. package/dist/src/ping/index.js +56 -0
  190. package/dist/src/ping/index.js.map +1 -0
  191. package/dist/src/pnet/crypto.d.ts +15 -5
  192. package/dist/src/pnet/crypto.d.ts.map +1 -1
  193. package/dist/src/pnet/crypto.js +60 -0
  194. package/dist/src/pnet/crypto.js.map +1 -0
  195. package/dist/src/pnet/errors.d.ts +5 -5
  196. package/dist/src/pnet/errors.d.ts.map +1 -1
  197. package/dist/src/pnet/errors.js +6 -0
  198. package/dist/src/pnet/errors.js.map +1 -0
  199. package/dist/src/pnet/index.d.ts +11 -20
  200. package/dist/src/pnet/index.d.ts.map +1 -1
  201. package/dist/src/pnet/index.js +66 -0
  202. package/dist/src/pnet/index.js.map +1 -0
  203. package/dist/src/pnet/key-generator.d.ts +3 -7
  204. package/dist/src/pnet/key-generator.d.ts.map +1 -1
  205. package/dist/src/pnet/key-generator.js +25 -0
  206. package/dist/src/pnet/key-generator.js.map +1 -0
  207. package/dist/src/registrar.d.ts +27 -65
  208. package/dist/src/registrar.d.ts.map +1 -1
  209. package/dist/src/registrar.js +159 -0
  210. package/dist/src/registrar.js.map +1 -0
  211. package/dist/src/transport-manager.d.ts +34 -82
  212. package/dist/src/transport-manager.d.ts.map +1 -1
  213. package/dist/src/transport-manager.js +223 -0
  214. package/dist/src/transport-manager.js.map +1 -0
  215. package/dist/src/upgrader.d.ts +49 -129
  216. package/dist/src/upgrader.d.ts.map +1 -1
  217. package/dist/src/upgrader.js +402 -0
  218. package/dist/src/upgrader.js.map +1 -0
  219. package/dist/src/version.d.ts +3 -0
  220. package/dist/src/version.d.ts.map +1 -0
  221. package/dist/src/version.js +3 -0
  222. package/dist/src/version.js.map +1 -0
  223. package/package.json +145 -197
  224. package/src/address-manager/index.ts +129 -0
  225. package/src/circuit/README.md +16 -11
  226. package/src/circuit/auto-relay.ts +284 -0
  227. package/src/circuit/circuit/hop.ts +211 -0
  228. package/src/circuit/circuit/stop.ts +78 -0
  229. package/src/circuit/circuit/stream-handler.ts +87 -0
  230. package/src/circuit/circuit/{utils.js → utils.ts} +9 -25
  231. package/src/circuit/constants.ts +31 -0
  232. package/src/circuit/index.ts +120 -0
  233. package/src/circuit/{listener.js → listener.ts} +21 -27
  234. package/src/circuit/multicodec.ts +2 -0
  235. package/src/circuit/{protocol → pb}/index.d.ts +0 -0
  236. package/src/circuit/pb/index.js +528 -0
  237. package/src/circuit/{protocol → pb}/index.proto +0 -0
  238. package/src/circuit/transport.ts +216 -0
  239. package/src/circuit/utils.ts +12 -0
  240. package/src/config.ts +101 -0
  241. package/src/connection-manager/auto-dialler.ts +154 -0
  242. package/src/connection-manager/index.ts +422 -0
  243. package/src/connection-manager/latency-monitor.ts +319 -0
  244. package/src/connection-manager/{visibility-change-emitter.js → visibility-change-emitter.ts} +48 -38
  245. package/src/constants.ts +31 -0
  246. package/src/content-routing/index.ts +143 -0
  247. package/src/content-routing/utils.ts +54 -0
  248. package/src/dht/dht-content-routing.ts +43 -0
  249. package/src/dht/dht-peer-routing.ts +35 -0
  250. package/src/dialer/auto-dialer.ts +40 -0
  251. package/src/dialer/{dial-request.js → dial-request.ts} +60 -51
  252. package/src/dialer/index.ts +374 -0
  253. package/src/errors.ts +71 -0
  254. package/src/fetch/README.md +1 -1
  255. package/src/fetch/constants.ts +3 -0
  256. package/src/fetch/{index.js → index.ts} +79 -70
  257. package/src/fetch/{proto.d.ts → pb/proto.d.ts} +0 -0
  258. package/src/fetch/pb/proto.js +331 -0
  259. package/src/fetch/{proto.proto → pb/proto.proto} +0 -0
  260. package/src/get-peer.ts +57 -0
  261. package/src/identify/consts.ts +13 -0
  262. package/src/identify/index.ts +445 -0
  263. package/{dist/src/identify → src/identify/pb}/message.d.ts +20 -5
  264. package/src/identify/pb/message.js +369 -0
  265. package/src/identify/{message.proto → pb/message.proto} +0 -0
  266. package/src/index.ts +234 -0
  267. package/src/insecure/index.ts +97 -0
  268. package/src/insecure/{proto.d.ts → pb/proto.d.ts} +7 -1
  269. package/src/insecure/pb/proto.js +388 -0
  270. package/src/insecure/{proto.proto → pb/proto.proto} +0 -0
  271. package/src/keychain/{cms.js → cms.ts} +62 -58
  272. package/src/keychain/index.ts +588 -0
  273. package/src/keychain/{util.js → util.ts} +7 -17
  274. package/src/libp2p.ts +501 -0
  275. package/src/metrics/index.ts +310 -0
  276. package/src/metrics/moving-average.ts +53 -0
  277. package/src/metrics/stats.ts +243 -0
  278. package/src/nat-manager.ts +194 -0
  279. package/src/peer-record-updater.ts +55 -0
  280. package/src/peer-routing.ts +185 -0
  281. package/src/ping/README.md +1 -1
  282. package/src/ping/constants.ts +5 -0
  283. package/src/ping/index.ts +83 -0
  284. package/src/pnet/README.md +2 -2
  285. package/src/pnet/crypto.ts +67 -0
  286. package/src/pnet/errors.ts +5 -0
  287. package/src/pnet/index.ts +95 -0
  288. package/src/pnet/key-generator.ts +28 -0
  289. package/src/registrar.ts +205 -0
  290. package/src/transport-manager.ts +279 -0
  291. package/src/upgrader.ts +499 -0
  292. package/src/version.ts +3 -0
  293. package/dist/index.min.js +0 -55
  294. package/dist/src/insecure/plaintext.d.ts +0 -12
  295. package/dist/src/insecure/plaintext.d.ts.map +0 -1
  296. package/dist/src/metrics/old-peers.d.ts +0 -3
  297. package/dist/src/metrics/old-peers.d.ts.map +0 -1
  298. package/dist/src/metrics/tracked-map.d.ts +0 -8
  299. package/dist/src/metrics/tracked-map.d.ts.map +0 -1
  300. package/dist/src/peer-store/address-book.d.ts +0 -67
  301. package/dist/src/peer-store/address-book.d.ts.map +0 -1
  302. package/dist/src/peer-store/index.d.ts +0 -58
  303. package/dist/src/peer-store/index.d.ts.map +0 -1
  304. package/dist/src/peer-store/key-book.d.ts +0 -40
  305. package/dist/src/peer-store/key-book.d.ts.map +0 -1
  306. package/dist/src/peer-store/metadata-book.d.ts +0 -58
  307. package/dist/src/peer-store/metadata-book.d.ts.map +0 -1
  308. package/dist/src/peer-store/pb/peer.d.ts +0 -222
  309. package/dist/src/peer-store/proto-book.d.ts +0 -43
  310. package/dist/src/peer-store/proto-book.d.ts.map +0 -1
  311. package/dist/src/peer-store/store.d.ts +0 -73
  312. package/dist/src/peer-store/store.d.ts.map +0 -1
  313. package/dist/src/peer-store/types.d.ts +0 -202
  314. package/dist/src/peer-store/types.d.ts.map +0 -1
  315. package/dist/src/ping/util.d.ts +0 -5
  316. package/dist/src/ping/util.d.ts.map +0 -1
  317. package/dist/src/pubsub-adapter.d.ts +0 -22
  318. package/dist/src/pubsub-adapter.d.ts.map +0 -1
  319. package/dist/src/record/envelope/envelope.d.ts +0 -77
  320. package/dist/src/record/envelope/index.d.ts +0 -80
  321. package/dist/src/record/envelope/index.d.ts.map +0 -1
  322. package/dist/src/record/peer-record/consts.d.ts +0 -4
  323. package/dist/src/record/peer-record/consts.d.ts.map +0 -1
  324. package/dist/src/record/peer-record/index.d.ts +0 -60
  325. package/dist/src/record/peer-record/index.d.ts.map +0 -1
  326. package/dist/src/record/peer-record/peer-record.d.ts +0 -133
  327. package/dist/src/record/utils.d.ts +0 -12
  328. package/dist/src/record/utils.d.ts.map +0 -1
  329. package/dist/src/types.d.ts +0 -90
  330. package/dist/src/types.d.ts.map +0 -1
  331. package/src/address-manager/index.js +0 -96
  332. package/src/circuit/auto-relay.js +0 -302
  333. package/src/circuit/circuit/hop.js +0 -205
  334. package/src/circuit/circuit/stop.js +0 -81
  335. package/src/circuit/circuit/stream-handler.js +0 -94
  336. package/src/circuit/constants.js +0 -12
  337. package/src/circuit/index.js +0 -102
  338. package/src/circuit/multicodec.js +0 -5
  339. package/src/circuit/transport.js +0 -229
  340. package/src/circuit/utils.js +0 -17
  341. package/src/config.js +0 -114
  342. package/src/connection-manager/auto-dialler.js +0 -132
  343. package/src/connection-manager/index.js +0 -363
  344. package/src/connection-manager/latency-monitor.js +0 -264
  345. package/src/constants.js +0 -18
  346. package/src/content-routing/index.js +0 -163
  347. package/src/content-routing/utils.js +0 -89
  348. package/src/dht/dht-content-routing.js +0 -44
  349. package/src/dht/dht-peer-routing.js +0 -51
  350. package/src/dialer/index.js +0 -376
  351. package/src/errors.js +0 -66
  352. package/src/fetch/constants.js +0 -6
  353. package/src/get-peer.js +0 -49
  354. package/src/identify/consts.js +0 -15
  355. package/src/identify/index.js +0 -384
  356. package/src/index.js +0 -811
  357. package/src/insecure/plaintext.js +0 -95
  358. package/src/keychain/index.js +0 -561
  359. package/src/metrics/index.js +0 -290
  360. package/src/metrics/old-peers.js +0 -16
  361. package/src/metrics/stats.js +0 -270
  362. package/src/metrics/tracked-map.js +0 -94
  363. package/src/nat-manager.js +0 -197
  364. package/src/peer-routing.js +0 -176
  365. package/src/peer-store/README.md +0 -145
  366. package/src/peer-store/address-book.js +0 -382
  367. package/src/peer-store/index.js +0 -121
  368. package/src/peer-store/key-book.js +0 -141
  369. package/src/peer-store/metadata-book.js +0 -250
  370. package/src/peer-store/pb/peer.d.ts +0 -222
  371. package/src/peer-store/pb/peer.js +0 -643
  372. package/src/peer-store/pb/peer.proto +0 -31
  373. package/src/peer-store/proto-book.js +0 -237
  374. package/src/peer-store/store.js +0 -263
  375. package/src/peer-store/types.ts +0 -245
  376. package/src/ping/constants.js +0 -8
  377. package/src/ping/index.js +0 -85
  378. package/src/ping/util.js +0 -18
  379. package/src/pnet/crypto.js +0 -84
  380. package/src/pnet/errors.js +0 -7
  381. package/src/pnet/index.js +0 -86
  382. package/src/pnet/key-generator.js +0 -33
  383. package/src/pubsub-adapter.js +0 -61
  384. package/src/record/README.md +0 -130
  385. package/src/record/envelope/envelope.d.ts +0 -77
  386. package/src/record/envelope/envelope.js +0 -243
  387. package/src/record/envelope/envelope.proto +0 -19
  388. package/src/record/envelope/index.js +0 -183
  389. package/src/record/peer-record/consts.js +0 -14
  390. package/src/record/peer-record/index.js +0 -113
  391. package/src/record/peer-record/peer-record.d.ts +0 -133
  392. package/src/record/peer-record/peer-record.js +0 -367
  393. package/src/record/peer-record/peer-record.proto +0 -18
  394. package/src/record/utils.js +0 -25
  395. package/src/registrar.js +0 -127
  396. package/src/transport-manager.js +0 -269
  397. package/src/types.ts +0 -98
  398. package/src/upgrader.js +0 -492
@@ -0,0 +1,422 @@
1
+ import { logger } from '@libp2p/logger'
2
+ import errCode from 'err-code'
3
+ import mergeOptions from 'merge-options'
4
+ import { LatencyMonitor, SummaryObject } from './latency-monitor.js'
5
+ // @ts-expect-error retimer does not have types
6
+ import retimer from 'retimer'
7
+ import { CustomEvent, EventEmitter, Startable } from '@libp2p/interfaces'
8
+ import { trackedMap } from '@libp2p/tracked-map'
9
+ import { codes } from '../errors.js'
10
+ import { isPeerId, PeerId } from '@libp2p/interfaces/peer-id'
11
+ // @ts-expect-error setMaxListeners is missing from the node 16 types
12
+ import { setMaxListeners } from 'events'
13
+ import type { Connection } from '@libp2p/interfaces/connection'
14
+ import type { ConnectionManager } from '@libp2p/interfaces/registrar'
15
+ import type { Components } from '@libp2p/interfaces/components'
16
+ import * as STATUS from '@libp2p/interfaces/connection/status'
17
+
18
+ const log = logger('libp2p:connection-manager')
19
+
20
+ const defaultOptions: Partial<ConnectionManagerInit> = {
21
+ maxConnections: Infinity,
22
+ minConnections: 0,
23
+ maxData: Infinity,
24
+ maxSentData: Infinity,
25
+ maxReceivedData: Infinity,
26
+ maxEventLoopDelay: Infinity,
27
+ pollInterval: 2000,
28
+ autoDialInterval: 10000,
29
+ movingAverageInterval: 60000,
30
+ defaultPeerValue: 1
31
+ }
32
+
33
+ const METRICS_COMPONENT = 'connection-manager'
34
+ const METRICS_PEER_CONNECTIONS = 'peer-connections'
35
+ const METRICS_PEER_VALUES = 'peer-values'
36
+
37
+ export interface ConnectionManagerEvents {
38
+ 'peer:connect': CustomEvent<PeerId>
39
+ 'peer:disconnect': CustomEvent<PeerId>
40
+ }
41
+
42
+ export interface ConnectionManagerInit {
43
+ /**
44
+ * The maximum number of connections allowed
45
+ */
46
+ maxConnections?: number
47
+
48
+ /**
49
+ * The minimum number of connections to avoid pruning
50
+ */
51
+ minConnections?: number
52
+
53
+ /**
54
+ * The max data (in and out), per average interval to allow
55
+ */
56
+ maxData?: number
57
+
58
+ /**
59
+ * The max outgoing data, per average interval to allow
60
+ */
61
+ maxSentData?: number
62
+
63
+ /**
64
+ * The max incoming data, per average interval to allow
65
+ */
66
+ maxReceivedData?: number
67
+
68
+ /**
69
+ * The upper limit the event loop can take to run
70
+ */
71
+ maxEventLoopDelay?: number
72
+
73
+ /**
74
+ * How often, in milliseconds, metrics and latency should be checked
75
+ */
76
+ pollInterval?: number
77
+
78
+ /**
79
+ * How often, in milliseconds, to compute averages
80
+ */
81
+ movingAverageInterval?: number
82
+
83
+ /**
84
+ * The value of the peer
85
+ */
86
+ defaultPeerValue?: number
87
+
88
+ /**
89
+ * Should preemptively guarantee connections are above the low watermark
90
+ */
91
+ autoDial?: boolean
92
+
93
+ /**
94
+ * How often, in milliseconds, it should preemptively guarantee connections are above the low watermark
95
+ */
96
+ autoDialInterval?: number
97
+ }
98
+
99
+ /**
100
+ * Responsible for managing known connections.
101
+ */
102
+ export class DefaultConnectionManager extends EventEmitter<ConnectionManagerEvents> implements ConnectionManager, Startable {
103
+ private readonly components: Components
104
+ private readonly init: Required<ConnectionManagerInit>
105
+ private readonly peerValues: Map<string, number>
106
+ private readonly connections: Map<string, Connection[]>
107
+ private started: boolean
108
+ private timer?: ReturnType<retimer>
109
+ private readonly latencyMonitor: LatencyMonitor
110
+
111
+ constructor (components: Components, init: ConnectionManagerInit = {}) {
112
+ super()
113
+
114
+ this.components = components
115
+ this.init = mergeOptions.call({ ignoreUndefined: true }, defaultOptions, init)
116
+
117
+ if (this.init.maxConnections < this.init.minConnections) {
118
+ throw errCode(new Error('Connection Manager maxConnections must be greater than minConnections'), codes.ERR_INVALID_PARAMETERS)
119
+ }
120
+
121
+ log('options: %o', this.init)
122
+
123
+ /**
124
+ * Map of peer identifiers to their peer value for pruning connections.
125
+ *
126
+ * @type {Map<string, number>}
127
+ */
128
+ this.peerValues = trackedMap({
129
+ component: METRICS_COMPONENT,
130
+ metric: METRICS_PEER_VALUES,
131
+ metrics: this.components.getMetrics()
132
+ })
133
+
134
+ /**
135
+ * Map of connections per peer
136
+ */
137
+ this.connections = trackedMap({
138
+ component: METRICS_COMPONENT,
139
+ metric: METRICS_PEER_CONNECTIONS,
140
+ metrics: this.components.getMetrics()
141
+ })
142
+
143
+ this.started = false
144
+ this._checkMetrics = this._checkMetrics.bind(this)
145
+
146
+ this.latencyMonitor = new LatencyMonitor({
147
+ latencyCheckIntervalMs: init.pollInterval,
148
+ dataEmitIntervalMs: init.pollInterval
149
+ })
150
+
151
+ try {
152
+ // This emitter gets listened to a lot
153
+ setMaxListeners?.(Infinity, this)
154
+ } catch {}
155
+
156
+ this.components.getUpgrader().addEventListener('connection', (evt) => {
157
+ void this.onConnect(evt).catch(err => {
158
+ log.error(err)
159
+ })
160
+ })
161
+ this.components.getUpgrader().addEventListener('connectionEnd', this.onDisconnect.bind(this))
162
+ }
163
+
164
+ isStarted () {
165
+ return this.started
166
+ }
167
+
168
+ /**
169
+ * Starts the Connection Manager. If Metrics are not enabled on libp2p
170
+ * only event loop and connection limits will be monitored.
171
+ */
172
+ async start () {
173
+ if (this.components.getMetrics() != null) {
174
+ this.timer = this.timer ?? retimer(this._checkMetrics, this.init.pollInterval)
175
+ }
176
+
177
+ // latency monitor
178
+ this.latencyMonitor.start()
179
+ this._onLatencyMeasure = this._onLatencyMeasure.bind(this)
180
+ this.latencyMonitor.addEventListener('data', this._onLatencyMeasure)
181
+
182
+ this.started = true
183
+ log('started')
184
+ }
185
+
186
+ /**
187
+ * Stops the Connection Manager
188
+ */
189
+ async stop () {
190
+ this.timer?.clear()
191
+
192
+ this.latencyMonitor.removeEventListener('data', this._onLatencyMeasure)
193
+ this.latencyMonitor.stop()
194
+
195
+ this.started = false
196
+ await this._close()
197
+ log('stopped')
198
+ }
199
+
200
+ /**
201
+ * Cleans up the connections
202
+ */
203
+ async _close () {
204
+ // Close all connections we're tracking
205
+ const tasks = []
206
+ for (const connectionList of this.connections.values()) {
207
+ for (const connection of connectionList) {
208
+ tasks.push(connection.close())
209
+ }
210
+ }
211
+
212
+ log('closing %d connections', tasks.length)
213
+ await Promise.all(tasks)
214
+ this.connections.clear()
215
+ }
216
+
217
+ /**
218
+ * Sets the value of the given peer. Peers with lower values
219
+ * will be disconnected first.
220
+ */
221
+ setPeerValue (peerId: PeerId, value: number) {
222
+ if (value < 0 || value > 1) {
223
+ throw new Error('value should be a number between 0 and 1')
224
+ }
225
+
226
+ this.peerValues.set(peerId.toString(), value)
227
+ }
228
+
229
+ /**
230
+ * Checks the libp2p metrics to determine if any values have exceeded
231
+ * the configured maximums.
232
+ *
233
+ * @private
234
+ */
235
+ async _checkMetrics () {
236
+ const metrics = this.components.getMetrics()
237
+
238
+ if (metrics != null) {
239
+ try {
240
+ const movingAverages = metrics.getGlobal().getMovingAverages()
241
+ const received = movingAverages.dataReceived[this.init.movingAverageInterval].movingAverage
242
+ await this._checkMaxLimit('maxReceivedData', received)
243
+ const sent = movingAverages.dataSent[this.init.movingAverageInterval].movingAverage
244
+ await this._checkMaxLimit('maxSentData', sent)
245
+ const total = received + sent
246
+ await this._checkMaxLimit('maxData', total)
247
+ log('metrics update', total)
248
+ } finally {
249
+ this.timer = retimer(this._checkMetrics, this.init.pollInterval)
250
+ }
251
+ }
252
+ }
253
+
254
+ /**
255
+ * Tracks the incoming connection and check the connection limit
256
+ */
257
+ async onConnect (evt: CustomEvent<Connection>) {
258
+ const { detail: connection } = evt
259
+
260
+ if (!this.started) {
261
+ // This can happen when we are in the process of shutting down the node
262
+ await connection.close()
263
+ return
264
+ }
265
+
266
+ const peerId = connection.remotePeer
267
+ const peerIdStr = peerId.toString()
268
+ const storedConns = this.connections.get(peerIdStr)
269
+
270
+ this.dispatchEvent(new CustomEvent<Connection>('peer:connect', { detail: connection }))
271
+
272
+ if (storedConns != null) {
273
+ storedConns.push(connection)
274
+ } else {
275
+ this.connections.set(peerIdStr, [connection])
276
+ }
277
+
278
+ if (peerId.publicKey != null) {
279
+ await this.components.getPeerStore().keyBook.set(peerId, peerId.publicKey)
280
+ }
281
+
282
+ if (!this.peerValues.has(peerIdStr)) {
283
+ this.peerValues.set(peerIdStr, this.init.defaultPeerValue)
284
+ }
285
+
286
+ await this._checkMaxLimit('maxConnections', this.getConnectionList().length)
287
+ }
288
+
289
+ /**
290
+ * Removes the connection from tracking
291
+ */
292
+ onDisconnect (evt: CustomEvent<Connection>) {
293
+ const { detail: connection } = evt
294
+
295
+ if (!this.started) {
296
+ // This can happen when we are in the process of shutting down the node
297
+ return
298
+ }
299
+
300
+ const peerId = connection.remotePeer.toString()
301
+ let storedConn = this.connections.get(peerId)
302
+
303
+ if (storedConn != null && storedConn.length > 1) {
304
+ storedConn = storedConn.filter((conn) => conn.id !== connection.id)
305
+ this.connections.set(peerId, storedConn)
306
+ } else if (storedConn != null) {
307
+ this.connections.delete(peerId)
308
+ this.peerValues.delete(connection.remotePeer.toString())
309
+ this.dispatchEvent(new CustomEvent<Connection>('peer:disconnect', { detail: connection }))
310
+
311
+ this.components.getMetrics()?.onPeerDisconnected(connection.remotePeer)
312
+ }
313
+ }
314
+
315
+ getConnectionMap (): Map<string, Connection[]> {
316
+ return this.connections
317
+ }
318
+
319
+ getConnectionList (): Connection[] {
320
+ let output: Connection[] = []
321
+
322
+ for (const connections of this.connections.values()) {
323
+ output = output.concat(connections)
324
+ }
325
+
326
+ return output
327
+ }
328
+
329
+ getConnections (peerId: PeerId): Connection[] {
330
+ return this.connections.get(peerId.toString()) ?? []
331
+ }
332
+
333
+ /**
334
+ * Get a connection with a peer
335
+ */
336
+ getConnection (peerId: PeerId): Connection | undefined {
337
+ const connections = this.getAll(peerId)
338
+
339
+ if (connections.length > 0) {
340
+ return connections[0]
341
+ }
342
+
343
+ return undefined
344
+ }
345
+
346
+ /**
347
+ * Get all open connections with a peer
348
+ */
349
+ getAll (peerId: PeerId): Connection[] {
350
+ if (!isPeerId(peerId)) {
351
+ throw errCode(new Error('peerId must be an instance of peer-id'), codes.ERR_INVALID_PARAMETERS)
352
+ }
353
+
354
+ const id = peerId.toString()
355
+ const connections = this.connections.get(id)
356
+
357
+ // Return all open connections
358
+ if (connections != null) {
359
+ return connections.filter(connection => connection.stat.status === STATUS.OPEN)
360
+ }
361
+
362
+ return []
363
+ }
364
+
365
+ /**
366
+ * If the event loop is slow, maybe close a connection
367
+ */
368
+ _onLatencyMeasure (evt: CustomEvent<SummaryObject>) {
369
+ const { detail: summary } = evt
370
+
371
+ this._checkMaxLimit('maxEventLoopDelay', summary.avgMs)
372
+ .catch(err => {
373
+ log.error(err)
374
+ })
375
+ }
376
+
377
+ /**
378
+ * If the `value` of `name` has exceeded its limit, maybe close a connection
379
+ */
380
+ async _checkMaxLimit (name: keyof ConnectionManagerInit, value: number) {
381
+ const limit = this.init[name]
382
+ log.trace('checking limit of %s. current value: %d of %d', name, value, limit)
383
+ if (value > limit) {
384
+ log('%s: limit exceeded: %p, %d', this.components.getPeerId(), name, value)
385
+ await this._maybeDisconnectOne()
386
+ }
387
+ }
388
+
389
+ /**
390
+ * If we have more connections than our maximum, close a connection
391
+ * to the lowest valued peer.
392
+ */
393
+ async _maybeDisconnectOne () {
394
+ if (this.init.minConnections < this.connections.size) {
395
+ const peerValues = Array.from(new Map([...this.peerValues.entries()].sort((a, b) => a[1] - b[1])))
396
+
397
+ log('%p: sorted peer values: %j', this.components.getPeerId(), peerValues)
398
+ const disconnectPeer = peerValues[0]
399
+
400
+ if (disconnectPeer != null) {
401
+ const peerId = disconnectPeer[0]
402
+ log('%p: lowest value peer is %s', this.components.getPeerId(), peerId)
403
+ log('%p: closing a connection to %j', this.components.getPeerId(), peerId)
404
+
405
+ for (const connections of this.connections.values()) {
406
+ if (connections[0].remotePeer.toString() === peerId) {
407
+ void connections[0].close()
408
+ .catch(err => {
409
+ log.error(err)
410
+ })
411
+
412
+ // TODO: should not need to invoke this manually
413
+ this.onDisconnect(new CustomEvent<Connection>('connectionEnd', {
414
+ detail: connections[0]
415
+ }))
416
+ break
417
+ }
418
+ }
419
+ }
420
+ }
421
+ }
422
+ }