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,310 @@
1
+ import { pipe } from 'it-pipe'
2
+ import each from 'it-foreach'
3
+ import LRU from 'hashlru'
4
+ import { METRICS as defaultOptions } from '../constants.js'
5
+ import { DefaultStats, StatsInit } from './stats.js'
6
+ import type { ComponentMetricsUpdate, Metrics, Stats, TrackStreamOptions } from '@libp2p/interfaces/metrics'
7
+ import type { PeerId } from '@libp2p/interfaces/peer-id'
8
+ import type { Startable } from '@libp2p/interfaces'
9
+ import type { Duplex } from 'it-stream-types'
10
+
11
+ const initialCounters: ['dataReceived', 'dataSent'] = [
12
+ 'dataReceived',
13
+ 'dataSent'
14
+ ]
15
+
16
+ const directionToEvent = {
17
+ in: 'dataReceived',
18
+ out: 'dataSent'
19
+ }
20
+
21
+ export interface OnMessageOptions {
22
+ remotePeer: PeerId
23
+ protocol?: string
24
+ direction: 'in' | 'out'
25
+ dataLength: number
26
+ }
27
+
28
+ export interface MetricsInit {
29
+ enabled: boolean
30
+ computeThrottleMaxQueueSize: number
31
+ computeThrottleTimeout: number
32
+ movingAverageIntervals: number[]
33
+ maxOldPeersRetention: number
34
+ }
35
+
36
+ export class DefaultMetrics implements Metrics, Startable {
37
+ public globalStats: DefaultStats
38
+
39
+ private readonly enabled: boolean
40
+ private readonly peerStats: Map<string, DefaultStats>
41
+ private readonly protocolStats: Map<string, DefaultStats>
42
+ private readonly oldPeers: ReturnType<typeof LRU>
43
+ private running: boolean
44
+ private readonly systems: Map<string, Map<string, Map<string, number>>>
45
+ private readonly statsInit: StatsInit
46
+
47
+ constructor (init: MetricsInit) {
48
+ this.enabled = init.enabled
49
+ this.statsInit = {
50
+ ...init,
51
+ initialCounters
52
+ }
53
+ this.globalStats = new DefaultStats(this.statsInit)
54
+ this.peerStats = new Map()
55
+ this.protocolStats = new Map()
56
+ this.oldPeers = LRU(init.maxOldPeersRetention ?? defaultOptions.maxOldPeersRetention)
57
+ this.running = false
58
+ this._onMessage = this._onMessage.bind(this)
59
+ this.systems = new Map()
60
+ }
61
+
62
+ isStarted () {
63
+ return this.running
64
+ }
65
+
66
+ /**
67
+ * Must be called for stats to saved. Any data pushed for tracking
68
+ * will be ignored.
69
+ */
70
+ async start () {
71
+ if (!this.enabled) {
72
+ return
73
+ }
74
+
75
+ this.running = true
76
+ }
77
+
78
+ /**
79
+ * Stops all averages timers and prevents new data from being tracked.
80
+ * Once `stop` is called, `start` must be called to resume stats tracking.
81
+ */
82
+ async stop () {
83
+ if (!this.running) {
84
+ return
85
+ }
86
+
87
+ this.running = false
88
+ this.globalStats.stop()
89
+
90
+ for (const stats of this.peerStats.values()) {
91
+ stats.stop()
92
+ }
93
+
94
+ for (const stats of this.protocolStats.values()) {
95
+ stats.stop()
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Gets the global `Stats` object
101
+ */
102
+ getGlobal () {
103
+ return this.globalStats
104
+ }
105
+
106
+ /**
107
+ * Returns a list of `PeerId` strings currently being tracked
108
+ */
109
+ getPeers () {
110
+ return Array.from(this.peerStats.keys())
111
+ }
112
+
113
+ getComponentMetrics () {
114
+ return this.systems
115
+ }
116
+
117
+ updateComponentMetric (update: ComponentMetricsUpdate) {
118
+ const { system = 'libp2p', component, metric, value } = update
119
+
120
+ if (!this.systems.has(system)) {
121
+ this.systems.set(system, new Map())
122
+ }
123
+
124
+ const systemMetrics = this.systems.get(system)
125
+
126
+ if (systemMetrics == null) {
127
+ throw new Error('Unknown metric system')
128
+ }
129
+
130
+ if (!systemMetrics.has(component)) {
131
+ systemMetrics.set(component, new Map())
132
+ }
133
+
134
+ const componentMetrics = systemMetrics.get(component)
135
+
136
+ if (componentMetrics == null) {
137
+ throw new Error('Unknown metric component')
138
+ }
139
+
140
+ componentMetrics.set(metric, value)
141
+ }
142
+
143
+ /**
144
+ * Returns the `Stats` object for the given `PeerId` whether it
145
+ * is a live peer, or in the disconnected peer LRU cache.
146
+ */
147
+ forPeer (peerId: PeerId): Stats | undefined {
148
+ const idString = peerId.toString()
149
+ return this.peerStats.get(idString) ?? this.oldPeers.get(idString)
150
+ }
151
+
152
+ /**
153
+ * Returns a list of all protocol strings currently being tracked
154
+ */
155
+ getProtocols (): string[] {
156
+ return Array.from(this.protocolStats.keys())
157
+ }
158
+
159
+ /**
160
+ * Returns the `Stats` object for the given `protocol`
161
+ */
162
+ forProtocol (protocol: string): Stats | undefined {
163
+ return this.protocolStats.get(protocol)
164
+ }
165
+
166
+ /**
167
+ * Should be called when all connections to a given peer
168
+ * have closed. The `Stats` collection for the peer will
169
+ * be stopped and moved to an LRU for temporary retention.
170
+ */
171
+ onPeerDisconnected (peerId: PeerId) {
172
+ const idString = peerId.toString()
173
+ const peerStats = this.peerStats.get(idString)
174
+
175
+ if (peerStats != null) {
176
+ peerStats.stop()
177
+
178
+ this.peerStats.delete(idString)
179
+ this.oldPeers.set(idString, peerStats)
180
+ }
181
+ }
182
+
183
+ /**
184
+ * Takes the metadata for a message and tracks it in the
185
+ * appropriate categories. If the protocol is present, protocol
186
+ * stats will also be tracked.
187
+ */
188
+ _onMessage (opts: OnMessageOptions) {
189
+ if (!this.running) {
190
+ return
191
+ }
192
+
193
+ const { remotePeer, protocol, direction, dataLength } = opts
194
+
195
+ const key = directionToEvent[direction]
196
+
197
+ let peerStats = this.forPeer(remotePeer)
198
+ if (peerStats == null) {
199
+ const stats = new DefaultStats(this.statsInit)
200
+ this.peerStats.set(remotePeer.toString(), stats)
201
+ peerStats = stats
202
+ }
203
+
204
+ // Peer and global stats
205
+ peerStats.push(key, dataLength)
206
+ this.globalStats.push(key, dataLength)
207
+
208
+ // Protocol specific stats
209
+ if (protocol != null) {
210
+ let protocolStats = this.forProtocol(protocol)
211
+
212
+ if (protocolStats == null) {
213
+ const stats = new DefaultStats(this.statsInit)
214
+ this.protocolStats.set(protocol, stats)
215
+ protocolStats = stats
216
+ }
217
+
218
+ protocolStats.push(key, dataLength)
219
+ }
220
+ }
221
+
222
+ /**
223
+ * Replaces the `PeerId` string with the given `peerId`.
224
+ * If stats are already being tracked for the given `peerId`, the
225
+ * placeholder stats will be merged with the existing stats.
226
+ *
227
+ * @param {PeerId} placeholder - A peerId string
228
+ * @param {PeerId} peerId
229
+ * @returns {void}
230
+ */
231
+ updatePlaceholder (placeholder: PeerId, peerId: PeerId) {
232
+ if (!this.running) {
233
+ return
234
+ }
235
+
236
+ const placeholderString = placeholder.toString()
237
+ const placeholderStats = this.peerStats.get(placeholderString) ?? this.oldPeers.get(placeholderString)
238
+ const peerIdString = peerId.toString()
239
+ const existingStats = this.peerStats.get(peerIdString) ?? this.oldPeers.get(peerIdString)
240
+ let mergedStats = placeholderStats
241
+
242
+ // If we already have stats, merge the two
243
+ if (existingStats != null) {
244
+ // If existing, merge
245
+ mergedStats = mergeStats(existingStats, mergedStats)
246
+ // Attempt to delete from the old peers list just in case it was tracked there
247
+ this.oldPeers.remove(peerIdString)
248
+ }
249
+
250
+ this.peerStats.delete(placeholder.toString())
251
+ this.peerStats.set(peerIdString, mergedStats)
252
+ mergedStats.start()
253
+ }
254
+
255
+ /**
256
+ * Tracks data running through a given Duplex Iterable `stream`. If
257
+ * the `peerId` is not provided, a placeholder string will be created and
258
+ * returned. This allows lazy tracking of a peer when the peer is not yet known.
259
+ * When the `PeerId` is known, `Metrics.updatePlaceholder` should be called
260
+ * with the placeholder string returned from here, and the known `PeerId`.
261
+ */
262
+ trackStream <T extends Duplex<Uint8Array>> (opts: TrackStreamOptions<T>): T {
263
+ const { stream, remotePeer, protocol } = opts
264
+
265
+ if (!this.running) {
266
+ return stream
267
+ }
268
+
269
+ const source = stream.source
270
+ stream.source = each(source, chunk => this._onMessage({
271
+ remotePeer,
272
+ protocol,
273
+ direction: 'in',
274
+ dataLength: chunk.length
275
+ }))
276
+
277
+ const sink = stream.sink
278
+ stream.sink = async source => {
279
+ return await pipe(
280
+ source,
281
+ (source) => each(source, chunk => {
282
+ this._onMessage({
283
+ remotePeer,
284
+ protocol,
285
+ direction: 'out',
286
+ dataLength: chunk.length
287
+ })
288
+ }),
289
+ sink
290
+ )
291
+ }
292
+
293
+ return stream
294
+ }
295
+ }
296
+
297
+ /**
298
+ * Merges `other` into `target`. `target` will be modified
299
+ * and returned
300
+ */
301
+ function mergeStats (target: DefaultStats, other: DefaultStats) {
302
+ target.stop()
303
+ other.stop()
304
+
305
+ // Merge queues
306
+ target.queue = [...target.queue, ...other.queue]
307
+
308
+ // TODO: how to merge moving averages?
309
+ return target
310
+ }
@@ -0,0 +1,53 @@
1
+ import type { MovingAverage } from '@libp2p/interfaces/metrics'
2
+
3
+ export class DefaultMovingAverage {
4
+ public movingAverage: number
5
+ public variance: number
6
+ public deviation: number
7
+ public forecast: number
8
+ private readonly timespan: number
9
+ private previousTime?: number
10
+
11
+ constructor (timespan: number) {
12
+ if (typeof timespan !== 'number') {
13
+ throw new Error('must provide a timespan to the moving average constructor')
14
+ }
15
+
16
+ if (timespan <= 0) {
17
+ throw new Error('must provide a timespan > 0 to the moving average constructor')
18
+ }
19
+
20
+ this.timespan = timespan
21
+ this.movingAverage = 0
22
+ this.variance = 0
23
+ this.deviation = 0
24
+ this.forecast = 0
25
+ }
26
+
27
+ alpha (t: number, pt: number) {
28
+ return 1 - (Math.exp(-(t - pt) / this.timespan))
29
+ }
30
+
31
+ push (time: number, value: number) {
32
+ if (this.previousTime != null) {
33
+ // calculate moving average
34
+ const a = this.alpha(time, this.previousTime)
35
+ const diff = value - this.movingAverage
36
+ const incr = a * diff
37
+ this.movingAverage = a * value + (1 - a) * this.movingAverage
38
+ // calculate variance & deviation
39
+ this.variance = (1 - a) * (this.variance + diff * incr)
40
+ this.deviation = Math.sqrt(this.variance)
41
+ // calculate forecast
42
+ this.forecast = this.movingAverage + a * diff
43
+ } else {
44
+ this.movingAverage = value
45
+ }
46
+
47
+ this.previousTime = time
48
+ }
49
+ }
50
+
51
+ export function createMovingAverage (timespan: number): MovingAverage {
52
+ return new DefaultMovingAverage(timespan)
53
+ }
@@ -0,0 +1,243 @@
1
+ import { CustomEvent, EventEmitter } from '@libp2p/interfaces'
2
+ import { createMovingAverage } from './moving-average.js'
3
+ // @ts-expect-error no types
4
+ import retimer from 'retimer'
5
+ import type { MovingAverages, Stats } from '@libp2p/interfaces/metrics'
6
+
7
+ export interface StatsEvents {
8
+ 'update': CustomEvent<TransferStats>
9
+ }
10
+
11
+ export interface StatsInit {
12
+ enabled: boolean
13
+ initialCounters: ['dataReceived', 'dataSent']
14
+ movingAverageIntervals: number[]
15
+ computeThrottleMaxQueueSize: number
16
+ computeThrottleTimeout: number
17
+ }
18
+
19
+ export interface TransferStats {
20
+ dataReceived: BigInt
21
+ dataSent: BigInt
22
+ }
23
+
24
+ export class DefaultStats extends EventEmitter<StatsEvents> implements Stats {
25
+ private readonly enabled: boolean
26
+ public queue: Array<[string, number, number]>
27
+ private stats: TransferStats
28
+ private frequencyLastTime: number
29
+ private frequencyAccumulators: Record<string, number>
30
+ private movingAverages: MovingAverages
31
+ private timeout?: any
32
+ private readonly computeThrottleMaxQueueSize: number
33
+ private readonly computeThrottleTimeout: number
34
+ private readonly movingAverageIntervals: number[]
35
+
36
+ /**
37
+ * A queue based manager for stat processing
38
+ */
39
+ constructor (init: StatsInit) {
40
+ super()
41
+
42
+ this.enabled = init.enabled
43
+ this.queue = []
44
+ this.stats = {
45
+ dataReceived: 0n,
46
+ dataSent: 0n
47
+ }
48
+ this.frequencyLastTime = Date.now()
49
+ this.frequencyAccumulators = {}
50
+ this.movingAverages = {
51
+ dataReceived: [],
52
+ dataSent: []
53
+ }
54
+ this.computeThrottleMaxQueueSize = init.computeThrottleMaxQueueSize
55
+ this.computeThrottleTimeout = init.computeThrottleTimeout
56
+
57
+ this._update = this._update.bind(this)
58
+
59
+ this.movingAverageIntervals = init.movingAverageIntervals
60
+
61
+ for (let i = 0; i < init.initialCounters.length; i++) {
62
+ const key = init.initialCounters[i]
63
+ this.stats[key] = 0n
64
+ this.movingAverages[key] = []
65
+
66
+ for (let k = 0; k < this.movingAverageIntervals.length; k++) {
67
+ const interval = this.movingAverageIntervals[k]
68
+ const ma = this.movingAverages[key][interval] = createMovingAverage(interval)
69
+ ma.push(this.frequencyLastTime, 0)
70
+ }
71
+ }
72
+ }
73
+
74
+ /**
75
+ * Initializes the internal timer if there are items in the queue. This
76
+ * should only need to be called if `Stats.stop` was previously called, as
77
+ * `Stats.push` will also start the processing
78
+ */
79
+ start () {
80
+ if (!this.enabled) {
81
+ return
82
+ }
83
+
84
+ if (this.queue.length > 0) {
85
+ this._resetComputeTimeout()
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Stops processing and computing of stats by clearing the internal
91
+ * timer
92
+ */
93
+ stop () {
94
+ if (this.timeout != null) {
95
+ this.timeout.clear()
96
+ this.timeout = null
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Returns a clone of the current stats.
102
+ */
103
+ getSnapshot () {
104
+ return Object.assign({}, this.stats)
105
+ }
106
+
107
+ /**
108
+ * Returns a clone of the internal movingAverages
109
+ */
110
+ getMovingAverages (): MovingAverages {
111
+ return Object.assign({}, this.movingAverages)
112
+ }
113
+
114
+ /**
115
+ * Pushes the given operation data to the queue, along with the
116
+ * current Timestamp, then resets the update timer.
117
+ */
118
+ push (counter: string, inc: number) {
119
+ this.queue.push([counter, inc, Date.now()])
120
+ this._resetComputeTimeout()
121
+ }
122
+
123
+ /**
124
+ * Resets the timeout for triggering updates.
125
+ */
126
+ _resetComputeTimeout () {
127
+ this.timeout = retimer(this._update, this._nextTimeout())
128
+ }
129
+
130
+ /**
131
+ * Calculates and returns the timeout for the next update based on
132
+ * the urgency of the update.
133
+ */
134
+ _nextTimeout () {
135
+ // calculate the need for an update, depending on the queue length
136
+ const urgency = this.queue.length / this.computeThrottleMaxQueueSize
137
+ const timeout = Math.max(this.computeThrottleTimeout * (1 - urgency), 0)
138
+ return timeout
139
+ }
140
+
141
+ /**
142
+ * If there are items in the queue, they will will be processed and
143
+ * the frequency for all items will be updated based on the Timestamp
144
+ * of the last item in the queue. The `update` event will also be emitted
145
+ * with the latest stats.
146
+ *
147
+ * If there are no items in the queue, no action is taken.
148
+ */
149
+ _update () {
150
+ this.timeout = null
151
+ if (this.queue.length > 0) {
152
+ let last: [string, number, number] = ['', 0, 0]
153
+
154
+ for (last of this.queue) {
155
+ this._applyOp(last)
156
+ }
157
+
158
+ this.queue = []
159
+
160
+ if (last.length > 2 && last[0] !== '') {
161
+ this._updateFrequency(last[2]) // contains timestamp of last op
162
+ }
163
+
164
+ this.dispatchEvent(new CustomEvent<TransferStats>('update', {
165
+ detail: this.stats
166
+ }))
167
+ }
168
+ }
169
+
170
+ /**
171
+ * For each key in the stats, the frequency and moving averages
172
+ * will be updated via Stats._updateFrequencyFor based on the time
173
+ * difference between calls to this method.
174
+ */
175
+ _updateFrequency (latestTime: number) {
176
+ const timeDiff = latestTime - this.frequencyLastTime
177
+
178
+ this._updateFrequencyFor('dataReceived', timeDiff, latestTime)
179
+ this._updateFrequencyFor('dataSent', timeDiff, latestTime)
180
+
181
+ this.frequencyLastTime = latestTime
182
+ }
183
+
184
+ /**
185
+ * Updates the `movingAverages` for the given `key` and also
186
+ * resets the `frequencyAccumulator` for the `key`.
187
+ */
188
+ _updateFrequencyFor (key: 'dataReceived' | 'dataSent', timeDiffMS: number, latestTime: number) {
189
+ const count = this.frequencyAccumulators[key] ?? 0
190
+ this.frequencyAccumulators[key] = 0
191
+ // if `timeDiff` is zero, `hz` becomes Infinity, so we fallback to 1ms
192
+ const safeTimeDiff = timeDiffMS ?? 1
193
+ const hz = (count / safeTimeDiff) * 1000
194
+
195
+ let movingAverages = this.movingAverages[key]
196
+ if (movingAverages == null) {
197
+ movingAverages = this.movingAverages[key] = []
198
+ }
199
+
200
+ const intervals = this.movingAverageIntervals
201
+
202
+ for (let i = 0; i < intervals.length; i++) {
203
+ const movingAverageInterval = intervals[i]
204
+ let movingAverage = movingAverages[movingAverageInterval]
205
+ if (movingAverage == null) {
206
+ movingAverage = movingAverages[movingAverageInterval] = createMovingAverage(movingAverageInterval)
207
+ }
208
+ movingAverage.push(latestTime, hz)
209
+ }
210
+ }
211
+
212
+ /**
213
+ * For the given operation, `op`, the stats and `frequencyAccumulator`
214
+ * will be updated or initialized if they don't already exist.
215
+ */
216
+ _applyOp (op: [string, number, number]) {
217
+ const key = op[0]
218
+ const inc = op[1]
219
+
220
+ if (typeof inc !== 'number') {
221
+ throw new Error('invalid increment number')
222
+ }
223
+
224
+ let n: bigint
225
+
226
+ if (!Object.prototype.hasOwnProperty.call(this.stats, key)) {
227
+ // @ts-expect-error cannot index type with key
228
+ n = this.stats[key] = 0n
229
+ } else {
230
+ // @ts-expect-error cannot index type with key
231
+ n = this.stats[key]
232
+ }
233
+
234
+ // @ts-expect-error cannot index type with key
235
+ this.stats[key] = n + BigInt(inc)
236
+
237
+ if (this.frequencyAccumulators[key] == null) {
238
+ this.frequencyAccumulators[key] = 0
239
+ }
240
+
241
+ this.frequencyAccumulators[key] += inc
242
+ }
243
+ }