libp2p 0.36.2 → 0.37.0

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 (430) hide show
  1. package/LICENSE +3 -21
  2. package/README.md +13 -10
  3. package/dist/src/address-manager/index.d.ts +34 -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 +216 -0
  10. package/dist/src/circuit/auto-relay.js.map +1 -0
  11. package/dist/src/circuit/circuit/hop.d.ts +26 -53
  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 +18 -10
  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 +19 -38
  20. package/dist/src/circuit/circuit/stream-handler.d.ts.map +1 -1
  21. package/dist/src/circuit/circuit/stream-handler.js +59 -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 +62 -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/pb/index.d.ts +52 -0
  44. package/dist/src/circuit/pb/index.d.ts.map +1 -0
  45. package/dist/src/circuit/pb/index.js +98 -0
  46. package/dist/src/circuit/pb/index.js.map +1 -0
  47. package/dist/src/circuit/transport.d.ts +18 -78
  48. package/dist/src/circuit/transport.d.ts.map +1 -1
  49. package/dist/src/circuit/transport.js +192 -0
  50. package/dist/src/circuit/transport.js.map +1 -0
  51. package/dist/src/circuit/utils.d.ts +5 -2
  52. package/dist/src/circuit/utils.d.ts.map +1 -1
  53. package/dist/src/circuit/utils.js +11 -0
  54. package/dist/src/circuit/utils.js.map +1 -0
  55. package/dist/src/config.d.ts +3 -85
  56. package/dist/src/config.d.ts.map +1 -1
  57. package/dist/src/config.js +91 -0
  58. package/dist/src/config.js.map +1 -0
  59. package/dist/src/connection-manager/auto-dialler.d.ts +24 -41
  60. package/dist/src/connection-manager/auto-dialler.d.ts.map +1 -1
  61. package/dist/src/connection-manager/auto-dialler.js +105 -0
  62. package/dist/src/connection-manager/auto-dialler.js.map +1 -0
  63. package/dist/src/connection-manager/dialer/auto-dialer.d.ts +16 -0
  64. package/dist/src/connection-manager/dialer/auto-dialer.d.ts.map +1 -0
  65. package/dist/src/connection-manager/dialer/auto-dialer.js +37 -0
  66. package/dist/src/connection-manager/dialer/auto-dialer.js.map +1 -0
  67. package/dist/src/connection-manager/dialer/dial-request.d.ts +27 -0
  68. package/dist/src/connection-manager/dialer/dial-request.d.ts.map +1 -0
  69. package/dist/src/connection-manager/dialer/dial-request.js +83 -0
  70. package/dist/src/connection-manager/dialer/dial-request.js.map +1 -0
  71. package/dist/src/connection-manager/dialer/index.d.ts +104 -0
  72. package/dist/src/connection-manager/dialer/index.d.ts.map +1 -0
  73. package/dist/src/connection-manager/dialer/index.js +267 -0
  74. package/dist/src/connection-manager/dialer/index.js.map +1 -0
  75. package/dist/src/connection-manager/index.d.ts +102 -136
  76. package/dist/src/connection-manager/index.d.ts.map +1 -1
  77. package/dist/src/connection-manager/index.js +333 -0
  78. package/dist/src/connection-manager/index.js.map +1 -0
  79. package/dist/src/connection-manager/latency-monitor.d.ts +72 -97
  80. package/dist/src/connection-manager/latency-monitor.d.ts.map +1 -1
  81. package/dist/src/connection-manager/latency-monitor.js +220 -0
  82. package/dist/src/connection-manager/latency-monitor.js.map +1 -0
  83. package/dist/src/connection-manager/visibility-change-emitter.d.ts +15 -16
  84. package/dist/src/connection-manager/visibility-change-emitter.d.ts.map +1 -1
  85. package/dist/src/connection-manager/visibility-change-emitter.js +118 -0
  86. package/dist/src/connection-manager/visibility-change-emitter.js.map +1 -0
  87. package/dist/src/constants.d.ts +22 -10
  88. package/dist/src/constants.d.ts.map +1 -1
  89. package/dist/src/constants.js +27 -0
  90. package/dist/src/constants.js.map +1 -0
  91. package/dist/src/content-routing/index.d.ts +27 -81
  92. package/dist/src/content-routing/index.d.ts.map +1 -1
  93. package/dist/src/content-routing/index.js +99 -0
  94. package/dist/src/content-routing/index.js.map +1 -0
  95. package/dist/src/content-routing/utils.d.ts +6 -49
  96. package/dist/src/content-routing/utils.d.ts.map +1 -1
  97. package/dist/src/content-routing/utils.js +42 -0
  98. package/dist/src/content-routing/utils.js.map +1 -0
  99. package/dist/src/dht/dht-content-routing.d.ts +10 -24
  100. package/dist/src/dht/dht-content-routing.d.ts.map +1 -1
  101. package/dist/src/dht/dht-content-routing.js +32 -0
  102. package/dist/src/dht/dht-content-routing.js.map +1 -0
  103. package/dist/src/dht/dht-peer-routing.d.ts +9 -24
  104. package/dist/src/dht/dht-peer-routing.d.ts.map +1 -1
  105. package/dist/src/dht/dht-peer-routing.js +26 -0
  106. package/dist/src/dht/dht-peer-routing.js.map +1 -0
  107. package/dist/src/dht/dummy-dht.d.ts +20 -0
  108. package/dist/src/dht/dummy-dht.d.ts.map +1 -0
  109. package/dist/src/dht/dummy-dht.js +46 -0
  110. package/dist/src/dht/dummy-dht.js.map +1 -0
  111. package/dist/src/errors.d.ts +70 -63
  112. package/dist/src/errors.d.ts.map +1 -1
  113. package/dist/src/errors.js +75 -0
  114. package/dist/src/errors.js.map +1 -0
  115. package/dist/src/fetch/constants.d.ts +1 -1
  116. package/dist/src/fetch/constants.d.ts.map +1 -1
  117. package/dist/src/fetch/constants.js +3 -0
  118. package/dist/src/fetch/constants.js.map +1 -0
  119. package/dist/src/fetch/index.d.ts +30 -49
  120. package/dist/src/fetch/index.d.ts.map +1 -1
  121. package/dist/src/fetch/index.js +129 -0
  122. package/dist/src/fetch/index.js.map +1 -0
  123. package/dist/src/fetch/pb/proto.d.ts +27 -0
  124. package/dist/src/fetch/pb/proto.d.ts.map +1 -0
  125. package/dist/src/fetch/pb/proto.js +50 -0
  126. package/dist/src/fetch/pb/proto.js.map +1 -0
  127. package/dist/src/get-peer.d.ts +4 -11
  128. package/dist/src/get-peer.d.ts.map +1 -1
  129. package/dist/src/get-peer.js +43 -0
  130. package/dist/src/get-peer.js.map +1 -0
  131. package/dist/src/identify/consts.d.ts +9 -9
  132. package/dist/src/identify/consts.d.ts.map +1 -1
  133. package/dist/src/identify/consts.js +11 -0
  134. package/dist/src/identify/consts.js.map +1 -0
  135. package/dist/src/identify/index.d.ts +42 -96
  136. package/dist/src/identify/index.d.ts.map +1 -1
  137. package/dist/src/identify/index.js +322 -0
  138. package/dist/src/identify/index.js.map +1 -0
  139. package/dist/src/identify/pb/message.d.ts +16 -0
  140. package/dist/src/identify/pb/message.d.ts.map +1 -0
  141. package/dist/src/identify/pb/message.js +24 -0
  142. package/dist/src/identify/pb/message.js.map +1 -0
  143. package/dist/src/index.d.ts +150 -496
  144. package/dist/src/index.d.ts.map +1 -1
  145. package/dist/src/index.js +9 -0
  146. package/dist/src/index.js.map +1 -0
  147. package/dist/src/insecure/index.d.ts +9 -0
  148. package/dist/src/insecure/index.d.ts.map +1 -0
  149. package/dist/src/insecure/index.js +81 -0
  150. package/dist/src/insecure/index.js.map +1 -0
  151. package/dist/src/insecure/pb/proto.d.ts +29 -0
  152. package/dist/src/insecure/pb/proto.d.ts.map +1 -0
  153. package/dist/src/insecure/pb/proto.js +53 -0
  154. package/dist/src/insecure/pb/proto.js.map +1 -0
  155. package/dist/src/keychain/cms.d.ts +6 -14
  156. package/dist/src/keychain/cms.d.ts.map +1 -1
  157. package/dist/src/keychain/cms.js +129 -0
  158. package/dist/src/keychain/cms.js.map +1 -0
  159. package/dist/src/keychain/index.d.ts +60 -81
  160. package/dist/src/keychain/index.d.ts.map +1 -1
  161. package/dist/src/keychain/index.js +492 -0
  162. package/dist/src/keychain/index.js.map +1 -0
  163. package/dist/src/keychain/util.d.ts +3 -6
  164. package/dist/src/keychain/util.d.ts.map +1 -1
  165. package/dist/src/keychain/util.js +79 -0
  166. package/dist/src/keychain/util.js.map +1 -0
  167. package/dist/src/libp2p.d.ts +80 -0
  168. package/dist/src/libp2p.d.ts.map +1 -0
  169. package/dist/src/libp2p.js +397 -0
  170. package/dist/src/libp2p.js.map +1 -0
  171. package/dist/src/metrics/index.d.ts +47 -104
  172. package/dist/src/metrics/index.d.ts.map +1 -1
  173. package/dist/src/metrics/index.js +231 -0
  174. package/dist/src/metrics/index.js.map +1 -0
  175. package/dist/src/metrics/moving-average.d.ts +14 -0
  176. package/dist/src/metrics/moving-average.d.ts.map +1 -0
  177. package/dist/src/metrics/moving-average.js +40 -0
  178. package/dist/src/metrics/moving-average.js.map +1 -0
  179. package/dist/src/metrics/stats.d.ts +41 -93
  180. package/dist/src/metrics/stats.d.ts.map +1 -1
  181. package/dist/src/metrics/stats.js +183 -0
  182. package/dist/src/metrics/stats.js.map +1 -0
  183. package/dist/src/nat-manager.d.ts +42 -99
  184. package/dist/src/nat-manager.d.ts.map +1 -1
  185. package/dist/src/nat-manager.js +114 -0
  186. package/dist/src/nat-manager.js.map +1 -0
  187. package/dist/src/peer-record-updater.d.ts +15 -0
  188. package/dist/src/peer-record-updater.d.ts.map +1 -0
  189. package/dist/src/peer-record-updater.js +44 -0
  190. package/dist/src/peer-record-updater.js.map +1 -0
  191. package/dist/src/peer-routing.d.ts +40 -84
  192. package/dist/src/peer-routing.d.ts.map +1 -1
  193. package/dist/src/peer-routing.js +108 -0
  194. package/dist/src/peer-routing.js.map +1 -0
  195. package/dist/src/ping/constants.d.ts +4 -4
  196. package/dist/src/ping/constants.d.ts.map +1 -1
  197. package/dist/src/ping/constants.js +5 -0
  198. package/dist/src/ping/constants.js.map +1 -0
  199. package/dist/src/ping/index.d.ts +17 -31
  200. package/dist/src/ping/index.d.ts.map +1 -1
  201. package/dist/src/ping/index.js +57 -0
  202. package/dist/src/ping/index.js.map +1 -0
  203. package/dist/src/pnet/crypto.d.ts +15 -5
  204. package/dist/src/pnet/crypto.d.ts.map +1 -1
  205. package/dist/src/pnet/crypto.js +60 -0
  206. package/dist/src/pnet/crypto.js.map +1 -0
  207. package/dist/src/pnet/errors.d.ts +5 -5
  208. package/dist/src/pnet/errors.d.ts.map +1 -1
  209. package/dist/src/pnet/errors.js +6 -0
  210. package/dist/src/pnet/errors.js.map +1 -0
  211. package/dist/src/pnet/index.d.ts +12 -20
  212. package/dist/src/pnet/index.d.ts.map +1 -1
  213. package/dist/src/pnet/index.js +67 -0
  214. package/dist/src/pnet/index.js.map +1 -0
  215. package/dist/src/pnet/key-generator.d.ts +3 -7
  216. package/dist/src/pnet/key-generator.d.ts.map +1 -1
  217. package/dist/src/pnet/key-generator.js +25 -0
  218. package/dist/src/pnet/key-generator.js.map +1 -0
  219. package/dist/src/pubsub/dummy-pubsub.d.ts +17 -0
  220. package/dist/src/pubsub/dummy-pubsub.d.ts.map +1 -0
  221. package/dist/src/pubsub/dummy-pubsub.js +37 -0
  222. package/dist/src/pubsub/dummy-pubsub.js.map +1 -0
  223. package/dist/src/registrar.d.ts +26 -65
  224. package/dist/src/registrar.d.ts.map +1 -1
  225. package/dist/src/registrar.js +144 -0
  226. package/dist/src/registrar.js.map +1 -0
  227. package/dist/src/transport-manager.d.ts +36 -82
  228. package/dist/src/transport-manager.d.ts.map +1 -1
  229. package/dist/src/transport-manager.js +223 -0
  230. package/dist/src/transport-manager.js.map +1 -0
  231. package/dist/src/upgrader.d.ts +49 -129
  232. package/dist/src/upgrader.d.ts.map +1 -1
  233. package/dist/src/upgrader.js +402 -0
  234. package/dist/src/upgrader.js.map +1 -0
  235. package/dist/src/version.d.ts +3 -0
  236. package/dist/src/version.d.ts.map +1 -0
  237. package/dist/src/version.js +3 -0
  238. package/dist/src/version.js.map +1 -0
  239. package/package.json +144 -201
  240. package/src/address-manager/index.ts +130 -0
  241. package/src/circuit/README.md +16 -11
  242. package/src/circuit/auto-relay.ts +286 -0
  243. package/src/circuit/circuit/hop.ts +211 -0
  244. package/src/circuit/circuit/stop.ts +78 -0
  245. package/src/circuit/circuit/stream-handler.ts +86 -0
  246. package/src/circuit/circuit/{utils.js → utils.ts} +9 -25
  247. package/src/circuit/constants.ts +31 -0
  248. package/src/circuit/index.ts +120 -0
  249. package/src/circuit/listener.ts +82 -0
  250. package/src/circuit/multicodec.ts +2 -0
  251. package/src/circuit/{protocol → pb}/index.proto +1 -1
  252. package/src/circuit/pb/index.ts +117 -0
  253. package/src/circuit/transport.ts +219 -0
  254. package/src/circuit/utils.ts +12 -0
  255. package/src/config.ts +99 -0
  256. package/src/connection-manager/auto-dialler.ts +154 -0
  257. package/src/connection-manager/dialer/auto-dialer.ts +59 -0
  258. package/src/{dialer/dial-request.js → connection-manager/dialer/dial-request.ts} +60 -51
  259. package/src/connection-manager/dialer/index.ts +382 -0
  260. package/src/connection-manager/index.ts +508 -0
  261. package/src/connection-manager/latency-monitor.ts +319 -0
  262. package/src/connection-manager/{visibility-change-emitter.js → visibility-change-emitter.ts} +48 -38
  263. package/src/constants.ts +31 -0
  264. package/src/content-routing/index.ts +144 -0
  265. package/src/content-routing/utils.ts +54 -0
  266. package/src/dht/dht-content-routing.ts +43 -0
  267. package/src/dht/dht-peer-routing.ts +35 -0
  268. package/src/dht/dummy-dht.ts +60 -0
  269. package/src/errors.ts +73 -0
  270. package/src/fetch/README.md +1 -1
  271. package/src/fetch/constants.ts +3 -0
  272. package/src/fetch/index.ts +167 -0
  273. package/src/fetch/{proto.proto → pb/proto.proto} +0 -0
  274. package/src/fetch/pb/proto.ts +65 -0
  275. package/src/get-peer.ts +57 -0
  276. package/src/identify/consts.ts +13 -0
  277. package/src/identify/index.ts +445 -0
  278. package/src/identify/{message.proto → pb/message.proto} +0 -0
  279. package/src/identify/pb/message.ts +37 -0
  280. package/src/index.ts +220 -0
  281. package/src/insecure/index.ts +101 -0
  282. package/src/insecure/{proto.proto → pb/proto.proto} +0 -0
  283. package/src/insecure/pb/proto.ts +68 -0
  284. package/src/keychain/{cms.js → cms.ts} +62 -58
  285. package/src/keychain/index.ts +587 -0
  286. package/src/keychain/{util.js → util.ts} +7 -17
  287. package/src/libp2p.ts +538 -0
  288. package/src/metrics/index.ts +310 -0
  289. package/src/metrics/moving-average.ts +53 -0
  290. package/src/metrics/stats.ts +238 -0
  291. package/src/nat-manager.ts +194 -0
  292. package/src/peer-record-updater.ts +55 -0
  293. package/src/peer-routing.ts +186 -0
  294. package/src/ping/README.md +1 -1
  295. package/src/ping/constants.ts +5 -0
  296. package/src/ping/index.ts +84 -0
  297. package/src/pnet/README.md +2 -2
  298. package/src/pnet/crypto.ts +67 -0
  299. package/src/pnet/errors.ts +5 -0
  300. package/src/pnet/index.ts +97 -0
  301. package/src/pnet/key-generator.ts +28 -0
  302. package/src/pubsub/dummy-pubsub.ts +51 -0
  303. package/src/registrar.ts +189 -0
  304. package/src/transport-manager.ts +281 -0
  305. package/src/upgrader.ts +499 -0
  306. package/src/version.ts +3 -0
  307. package/dist/index.min.js +0 -55
  308. package/dist/src/circuit/protocol/index.d.ts +0 -173
  309. package/dist/src/dialer/dial-request.d.ts +0 -55
  310. package/dist/src/dialer/dial-request.d.ts.map +0 -1
  311. package/dist/src/dialer/index.d.ts +0 -182
  312. package/dist/src/dialer/index.d.ts.map +0 -1
  313. package/dist/src/fetch/proto.d.ts +0 -134
  314. package/dist/src/identify/message.d.ts +0 -95
  315. package/dist/src/insecure/plaintext.d.ts +0 -12
  316. package/dist/src/insecure/plaintext.d.ts.map +0 -1
  317. package/dist/src/insecure/proto.d.ts +0 -128
  318. package/dist/src/metrics/old-peers.d.ts +0 -3
  319. package/dist/src/metrics/old-peers.d.ts.map +0 -1
  320. package/dist/src/metrics/tracked-map.d.ts +0 -8
  321. package/dist/src/metrics/tracked-map.d.ts.map +0 -1
  322. package/dist/src/peer-store/address-book.d.ts +0 -67
  323. package/dist/src/peer-store/address-book.d.ts.map +0 -1
  324. package/dist/src/peer-store/index.d.ts +0 -58
  325. package/dist/src/peer-store/index.d.ts.map +0 -1
  326. package/dist/src/peer-store/key-book.d.ts +0 -40
  327. package/dist/src/peer-store/key-book.d.ts.map +0 -1
  328. package/dist/src/peer-store/metadata-book.d.ts +0 -58
  329. package/dist/src/peer-store/metadata-book.d.ts.map +0 -1
  330. package/dist/src/peer-store/pb/peer.d.ts +0 -222
  331. package/dist/src/peer-store/proto-book.d.ts +0 -43
  332. package/dist/src/peer-store/proto-book.d.ts.map +0 -1
  333. package/dist/src/peer-store/store.d.ts +0 -73
  334. package/dist/src/peer-store/store.d.ts.map +0 -1
  335. package/dist/src/peer-store/types.d.ts +0 -202
  336. package/dist/src/peer-store/types.d.ts.map +0 -1
  337. package/dist/src/ping/util.d.ts +0 -5
  338. package/dist/src/ping/util.d.ts.map +0 -1
  339. package/dist/src/pubsub-adapter.d.ts +0 -22
  340. package/dist/src/pubsub-adapter.d.ts.map +0 -1
  341. package/dist/src/record/envelope/envelope.d.ts +0 -77
  342. package/dist/src/record/envelope/index.d.ts +0 -80
  343. package/dist/src/record/envelope/index.d.ts.map +0 -1
  344. package/dist/src/record/peer-record/consts.d.ts +0 -4
  345. package/dist/src/record/peer-record/consts.d.ts.map +0 -1
  346. package/dist/src/record/peer-record/index.d.ts +0 -60
  347. package/dist/src/record/peer-record/index.d.ts.map +0 -1
  348. package/dist/src/record/peer-record/peer-record.d.ts +0 -133
  349. package/dist/src/record/utils.d.ts +0 -12
  350. package/dist/src/record/utils.d.ts.map +0 -1
  351. package/dist/src/types.d.ts +0 -90
  352. package/dist/src/types.d.ts.map +0 -1
  353. package/src/address-manager/index.js +0 -96
  354. package/src/circuit/auto-relay.js +0 -302
  355. package/src/circuit/circuit/hop.js +0 -205
  356. package/src/circuit/circuit/stop.js +0 -81
  357. package/src/circuit/circuit/stream-handler.js +0 -94
  358. package/src/circuit/constants.js +0 -12
  359. package/src/circuit/index.js +0 -102
  360. package/src/circuit/listener.js +0 -75
  361. package/src/circuit/multicodec.js +0 -5
  362. package/src/circuit/protocol/index.d.ts +0 -173
  363. package/src/circuit/protocol/index.js +0 -530
  364. package/src/circuit/transport.js +0 -229
  365. package/src/circuit/utils.js +0 -17
  366. package/src/config.js +0 -114
  367. package/src/connection-manager/auto-dialler.js +0 -132
  368. package/src/connection-manager/index.js +0 -374
  369. package/src/connection-manager/latency-monitor.js +0 -264
  370. package/src/constants.js +0 -18
  371. package/src/content-routing/index.js +0 -163
  372. package/src/content-routing/utils.js +0 -89
  373. package/src/dht/dht-content-routing.js +0 -44
  374. package/src/dht/dht-peer-routing.js +0 -51
  375. package/src/dialer/index.js +0 -376
  376. package/src/errors.js +0 -66
  377. package/src/fetch/constants.js +0 -6
  378. package/src/fetch/index.js +0 -159
  379. package/src/fetch/proto.d.ts +0 -134
  380. package/src/fetch/proto.js +0 -333
  381. package/src/get-peer.js +0 -49
  382. package/src/identify/consts.js +0 -15
  383. package/src/identify/index.js +0 -384
  384. package/src/identify/message.d.ts +0 -95
  385. package/src/identify/message.js +0 -328
  386. package/src/index.js +0 -813
  387. package/src/insecure/plaintext.js +0 -95
  388. package/src/insecure/proto.d.ts +0 -128
  389. package/src/insecure/proto.js +0 -371
  390. package/src/keychain/index.js +0 -561
  391. package/src/metrics/index.js +0 -290
  392. package/src/metrics/old-peers.js +0 -16
  393. package/src/metrics/stats.js +0 -270
  394. package/src/metrics/tracked-map.js +0 -94
  395. package/src/nat-manager.js +0 -197
  396. package/src/peer-routing.js +0 -176
  397. package/src/peer-store/README.md +0 -145
  398. package/src/peer-store/address-book.js +0 -382
  399. package/src/peer-store/index.js +0 -121
  400. package/src/peer-store/key-book.js +0 -141
  401. package/src/peer-store/metadata-book.js +0 -250
  402. package/src/peer-store/pb/peer.d.ts +0 -222
  403. package/src/peer-store/pb/peer.js +0 -643
  404. package/src/peer-store/pb/peer.proto +0 -31
  405. package/src/peer-store/proto-book.js +0 -237
  406. package/src/peer-store/store.js +0 -263
  407. package/src/peer-store/types.ts +0 -245
  408. package/src/ping/constants.js +0 -8
  409. package/src/ping/index.js +0 -84
  410. package/src/ping/util.js +0 -18
  411. package/src/pnet/crypto.js +0 -84
  412. package/src/pnet/errors.js +0 -7
  413. package/src/pnet/index.js +0 -86
  414. package/src/pnet/key-generator.js +0 -33
  415. package/src/pubsub-adapter.js +0 -61
  416. package/src/record/README.md +0 -130
  417. package/src/record/envelope/envelope.d.ts +0 -77
  418. package/src/record/envelope/envelope.js +0 -243
  419. package/src/record/envelope/envelope.proto +0 -19
  420. package/src/record/envelope/index.js +0 -183
  421. package/src/record/peer-record/consts.js +0 -14
  422. package/src/record/peer-record/index.js +0 -113
  423. package/src/record/peer-record/peer-record.d.ts +0 -133
  424. package/src/record/peer-record/peer-record.js +0 -367
  425. package/src/record/peer-record/peer-record.proto +0 -18
  426. package/src/record/utils.js +0 -25
  427. package/src/registrar.js +0 -127
  428. package/src/transport-manager.js +0 -269
  429. package/src/types.ts +0 -98
  430. package/src/upgrader.js +0 -492
@@ -0,0 +1,319 @@
1
+ /**
2
+ * This code is based on `latency-monitor` (https://github.com/mlucool/latency-monitor) by `mlucool` (https://github.com/mlucool), available under Apache License 2.0 (https://github.com/mlucool/latency-monitor/blob/master/LICENSE)
3
+ */
4
+
5
+ import { CustomEvent, EventEmitter } from '@libp2p/interfaces/events'
6
+ import { VisibilityChangeEmitter } from './visibility-change-emitter.js'
7
+ import { logger } from '@libp2p/logger'
8
+
9
+ const log = logger('libp2p:connection-manager:latency-monitor')
10
+
11
+ export interface LatencyMonitorEvents {
12
+ 'data': CustomEvent<SummaryObject>
13
+ }
14
+
15
+ export interface LatencyMonitorInit {
16
+ /**
17
+ * How often to add a latency check event (ms)
18
+ */
19
+ latencyCheckIntervalMs?: number
20
+
21
+ /**
22
+ * How often to summarize latency check events. null or 0 disables event firing
23
+ */
24
+ dataEmitIntervalMs?: number
25
+
26
+ /**
27
+ * What cb-style async function to use
28
+ */
29
+ asyncTestFn?: (cb: () => void) => void
30
+
31
+ /**
32
+ * What percent (+/-) of latencyCheckIntervalMs should we randomly use? This helps avoid alignment to other events.
33
+ */
34
+ latencyRandomPercentage?: number
35
+ }
36
+
37
+ export interface SummaryObject {
38
+ /**
39
+ * How many events were called
40
+ */
41
+ events: number
42
+
43
+ /**
44
+ * What was the min time for a cb to be called
45
+ */
46
+ minMs: number
47
+
48
+ /**
49
+ * What was the max time for a cb to be called
50
+ */
51
+ maxMs: number
52
+
53
+ /**
54
+ * What was the average time for a cb to be called
55
+ */
56
+ avgMs: number
57
+
58
+ /**
59
+ * How long this interval was in ms
60
+ */
61
+ lengthMs: number
62
+ }
63
+
64
+ interface LatencyData {
65
+ startTime: number
66
+ events: number
67
+ minMs: number
68
+ maxMs: number
69
+ totalMs: number
70
+ }
71
+
72
+ /**
73
+ * A class to monitor latency of any async function which works in a browser or node. This works by periodically calling
74
+ * the asyncTestFn and timing how long it takes the callback to be called. It can also periodically emit stats about this.
75
+ * This can be disabled and stats can be pulled via setting dataEmitIntervalMs = 0.
76
+ *
77
+ * @extends {EventEmitter}
78
+ *
79
+ * The default implementation is an event loop latency monitor. This works by firing periodic events into the event loop
80
+ * and timing how long it takes to get back.
81
+ *
82
+ * @example
83
+ * const monitor = new LatencyMonitor();
84
+ * monitor.on('data', (summary) => console.log('Event Loop Latency: %O', summary));
85
+ *
86
+ * @example
87
+ * const monitor = new LatencyMonitor({latencyCheckIntervalMs: 1000, dataEmitIntervalMs: 60000, asyncTestFn:ping});
88
+ * monitor.on('data', (summary) => console.log('Ping Pong Latency: %O', summary));
89
+ */
90
+ export class LatencyMonitor extends EventEmitter<LatencyMonitorEvents> {
91
+ private readonly latencyCheckIntervalMs: number
92
+ private readonly latencyRandomPercentage: number
93
+ private readonly latencyCheckMultiply: number
94
+ private readonly latencyCheckSubtract: number
95
+ private readonly dataEmitIntervalMs?: number
96
+ private readonly asyncTestFn?: (cb: () => void) => void
97
+
98
+ private readonly now: (num?: any) => any
99
+ private readonly getDeltaMS: (num: number) => number
100
+ private visibilityChangeEmitter?: VisibilityChangeEmitter
101
+ private latencyData: LatencyData
102
+ private checkLatencyID?: NodeJS.Timeout
103
+ private emitIntervalID?: NodeJS.Timeout
104
+
105
+ constructor (init: LatencyMonitorInit = {}) {
106
+ super()
107
+
108
+ const { latencyCheckIntervalMs, dataEmitIntervalMs, asyncTestFn, latencyRandomPercentage } = init
109
+
110
+ // 0 isn't valid here, so its ok to use ||
111
+ this.latencyCheckIntervalMs = latencyCheckIntervalMs ?? 500 // 0.5s
112
+ this.latencyRandomPercentage = latencyRandomPercentage ?? 10
113
+ this.latencyCheckMultiply = 2 * (this.latencyRandomPercentage / 100.0) * this.latencyCheckIntervalMs
114
+ this.latencyCheckSubtract = this.latencyCheckMultiply / 2
115
+
116
+ this.dataEmitIntervalMs = (dataEmitIntervalMs === null || dataEmitIntervalMs === 0)
117
+ ? undefined
118
+ : dataEmitIntervalMs ?? 5 * 1000 // 5s
119
+ log('latencyCheckIntervalMs: %s dataEmitIntervalMs: %s',
120
+ this.latencyCheckIntervalMs, this.dataEmitIntervalMs)
121
+ if (this.dataEmitIntervalMs != null) {
122
+ log('Expecting ~%s events per summary', this.latencyCheckIntervalMs / this.dataEmitIntervalMs)
123
+ } else {
124
+ log('Not emitting summaries')
125
+ }
126
+
127
+ this.asyncTestFn = asyncTestFn // If there is no asyncFn, we measure latency
128
+
129
+ // If process: use high resolution timer
130
+ if (globalThis.process?.hrtime != null) {
131
+ log('Using process.hrtime for timing')
132
+ this.now = globalThis.process.hrtime // eslint-disable-line no-undef
133
+ this.getDeltaMS = (startTime) => {
134
+ const hrtime = this.now(startTime)
135
+ return (hrtime[0] * 1000) + (hrtime[1] / 1000000)
136
+ }
137
+ // Let's try for a timer that only monotonically increases
138
+ } else if (typeof window !== 'undefined' && window.performance?.now != null) {
139
+ log('Using performance.now for timing')
140
+ this.now = window.performance.now.bind(window.performance)
141
+ this.getDeltaMS = (startTime) => Math.round(this.now() - startTime)
142
+ } else {
143
+ log('Using Date.now for timing')
144
+ this.now = Date.now
145
+ this.getDeltaMS = (startTime) => this.now() - startTime
146
+ }
147
+
148
+ this.latencyData = this.initLatencyData()
149
+ }
150
+
151
+ start () {
152
+ // We check for isBrowser because of browsers set max rates of timeouts when a page is hidden,
153
+ // so we fall back to another library
154
+ // See: http://stackoverflow.com/questions/6032429/chrome-timeouts-interval-suspended-in-background-tabs
155
+ if (isBrowser()) {
156
+ this.visibilityChangeEmitter = new VisibilityChangeEmitter()
157
+
158
+ this.visibilityChangeEmitter.addEventListener('visibilityChange', (evt) => {
159
+ const { detail: pageInFocus } = evt
160
+
161
+ if (pageInFocus) {
162
+ this._startTimers()
163
+ } else {
164
+ this._emitSummary()
165
+ this._stopTimers()
166
+ }
167
+ })
168
+ }
169
+
170
+ if (this.visibilityChangeEmitter?.isVisible() === true) {
171
+ this._startTimers()
172
+ }
173
+ }
174
+
175
+ stop () {
176
+ this._stopTimers()
177
+ }
178
+
179
+ /**
180
+ * Start internal timers
181
+ *
182
+ * @private
183
+ */
184
+ _startTimers () {
185
+ // Timer already started, ignore this
186
+ if (this.checkLatencyID != null) {
187
+ return
188
+ }
189
+
190
+ this.checkLatency()
191
+
192
+ if (this.dataEmitIntervalMs != null) {
193
+ this.emitIntervalID = setInterval(() => this._emitSummary(), this.dataEmitIntervalMs)
194
+ if (typeof this.emitIntervalID.unref === 'function') {
195
+ this.emitIntervalID.unref() // Doesn't block exit
196
+ }
197
+ }
198
+ }
199
+
200
+ /**
201
+ * Stop internal timers
202
+ *
203
+ * @private
204
+ */
205
+ _stopTimers () {
206
+ if (this.checkLatencyID != null) {
207
+ clearTimeout(this.checkLatencyID)
208
+ this.checkLatencyID = undefined
209
+ }
210
+ if (this.emitIntervalID != null) {
211
+ clearInterval(this.emitIntervalID)
212
+ this.emitIntervalID = undefined
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Emit summary only if there were events. It might not have any events if it was forced via a page hidden/show
218
+ *
219
+ * @private
220
+ */
221
+ _emitSummary () {
222
+ const summary = this.getSummary()
223
+ if (summary.events > 0) {
224
+ this.dispatchEvent(new CustomEvent<SummaryObject>('data', {
225
+ detail: summary
226
+ }))
227
+ }
228
+ }
229
+
230
+ /**
231
+ * Calling this function will end the collection period. If a timing event was already fired and somewhere in the queue,
232
+ * it will not count for this time period
233
+ */
234
+ getSummary (): SummaryObject {
235
+ // We might want to adjust for the number of expected events
236
+ // Example: first 1 event it comes back, then such a long blocker that the next emit check comes
237
+ // Then this fires - looks like no latency!!
238
+ const latency = {
239
+ events: this.latencyData.events,
240
+ minMs: this.latencyData.minMs,
241
+ maxMs: this.latencyData.maxMs,
242
+ avgMs: this.latencyData.events > 0
243
+ ? this.latencyData.totalMs / this.latencyData.events
244
+ : Number.POSITIVE_INFINITY,
245
+ lengthMs: this.getDeltaMS(this.latencyData.startTime)
246
+ }
247
+ this.latencyData = this.initLatencyData() // Clear
248
+
249
+ log.trace('Summary: %O', latency)
250
+ return latency
251
+ }
252
+
253
+ /**
254
+ * Randomly calls an async fn every roughly latencyCheckIntervalMs (plus some randomness). If no async fn is found,
255
+ * it will simply report on event loop latency.
256
+ */
257
+ checkLatency () {
258
+ // Randomness is needed to avoid alignment by accident to regular things in the event loop
259
+ const randomness = (Math.random() * this.latencyCheckMultiply) - this.latencyCheckSubtract
260
+
261
+ // We use this to ensure that in case some overlap somehow, we don't take the wrong startTime/offset
262
+ const localData = {
263
+ deltaOffset: Math.ceil(this.latencyCheckIntervalMs + randomness),
264
+ startTime: this.now()
265
+ }
266
+
267
+ const cb = () => {
268
+ // We are already stopped, ignore this datapoint
269
+ if (this.checkLatencyID == null) {
270
+ return
271
+ }
272
+ const deltaMS = this.getDeltaMS(localData.startTime) - localData.deltaOffset
273
+ this.checkLatency() // Start again ASAP
274
+
275
+ // Add the data point. If this gets complex, refactor it
276
+ this.latencyData.events++
277
+ this.latencyData.minMs = Math.min(this.latencyData.minMs, deltaMS)
278
+ this.latencyData.maxMs = Math.max(this.latencyData.maxMs, deltaMS)
279
+ this.latencyData.totalMs += deltaMS
280
+ log.trace('MS: %s Data: %O', deltaMS, this.latencyData)
281
+ }
282
+ log.trace('localData: %O', localData)
283
+
284
+ this.checkLatencyID = setTimeout(() => {
285
+ // This gets rid of including event loop
286
+ if (this.asyncTestFn != null) {
287
+ // Clear timing related things
288
+ localData.deltaOffset = 0
289
+ localData.startTime = this.now()
290
+ this.asyncTestFn(cb)
291
+ } else {
292
+ // setTimeout is not more accurate than 1ms, so this will ensure positive numbers. Add 1 to emitted data to remove.
293
+ // This is not the best, but for now it'll be just fine. This isn't meant to be sub ms accurate.
294
+ localData.deltaOffset -= 1
295
+ // If there is no function to test, we mean check latency which is a special case that is really cb => cb()
296
+ // We avoid that for the few extra function all overheads. Also, we want to keep the timers different
297
+ cb()
298
+ }
299
+ }, localData.deltaOffset)
300
+
301
+ if (typeof this.checkLatencyID.unref === 'function') {
302
+ this.checkLatencyID.unref() // Doesn't block exit
303
+ }
304
+ }
305
+
306
+ initLatencyData (): LatencyData {
307
+ return {
308
+ startTime: this.now(),
309
+ minMs: Number.POSITIVE_INFINITY,
310
+ maxMs: Number.NEGATIVE_INFINITY,
311
+ events: 0,
312
+ totalMs: 0
313
+ }
314
+ }
315
+ }
316
+
317
+ function isBrowser () {
318
+ return typeof globalThis.window !== 'undefined'
319
+ }
@@ -1,14 +1,17 @@
1
- // @ts-nocheck
2
- /* global document */
3
-
4
1
  /**
5
2
  * This code is based on `latency-monitor` (https://github.com/mlucool/latency-monitor) by `mlucool` (https://github.com/mlucool), available under Apache License 2.0 (https://github.com/mlucool/latency-monitor/blob/master/LICENSE)
6
3
  */
7
- 'use strict'
8
4
 
9
- const { EventEmitter } = require('events')
5
+ import { CustomEvent, EventEmitter } from '@libp2p/interfaces/events'
6
+ import { logger } from '@libp2p/logger'
7
+
8
+ const log = logger('libp2p:connection-manager:latency-monitor:visibility-change-emitter')
9
+
10
+ interface VisibilityChangeEmitterEvents {
11
+ 'visibilityChange': CustomEvent<boolean>
12
+ }
10
13
 
11
- const debug = require('debug')('latency-monitor:VisibilityChangeEmitter')
14
+ type Hidden = 'hidden' | 'mozHidden' | 'msHidden' | 'webkitHidden'
12
15
 
13
16
  /**
14
17
  * Listen to page visibility change events (i.e. when the page is focused / blurred) by an event emitter.
@@ -32,20 +35,20 @@ const debug = require('debug')('latency-monitor:VisibilityChangeEmitter')
32
35
  * // To access the visibility state directly, call:
33
36
  * console.log('Am I focused now? ' + myVisibilityEmitter.isVisible());
34
37
  */
35
- class VisibilityChangeEmitter extends EventEmitter {
36
- /**
37
- * Creates a VisibilityChangeEmitter
38
- *
39
- * @class
40
- */
38
+ export class VisibilityChangeEmitter extends EventEmitter<VisibilityChangeEmitterEvents> {
39
+ private hidden: Hidden
40
+ private visibilityChange: string
41
+
41
42
  constructor () {
42
43
  super()
43
- if (typeof document === 'undefined') {
44
- debug('This is not a browser, no "document" found. Stopping.')
45
- return
44
+
45
+ this.hidden = 'hidden'
46
+ this.visibilityChange = 'visibilityChange'
47
+
48
+ if (globalThis.document != null) {
49
+ this._initializeVisibilityVarNames()
50
+ this._addVisibilityChangeListener()
46
51
  }
47
- this._initializeVisibilityVarNames()
48
- this._addVisibilityChangeListener()
49
52
  }
50
53
 
51
54
  /**
@@ -58,23 +61,28 @@ class VisibilityChangeEmitter extends EventEmitter {
58
61
  * @private
59
62
  */
60
63
  _initializeVisibilityVarNames () {
61
- let hidden
62
- let visibilityChange
63
- if (typeof document.hidden !== 'undefined') { // Opera 12.10 and Firefox 18 and later support
64
+ let hidden: Hidden = 'hidden'
65
+ let visibilityChange = 'visibilitychange'
66
+
67
+ if (typeof globalThis.document.hidden !== 'undefined') { // Opera 12.10 and Firefox 18 and later support
64
68
  hidden = 'hidden'
65
69
  visibilityChange = 'visibilitychange'
66
- } else if (typeof document.mozHidden !== 'undefined') {
70
+ // @ts-expect-error mozHidden is a non-standard field name
71
+ } else if (typeof globalThis.document.mozHidden !== 'undefined') {
67
72
  hidden = 'mozHidden'
68
73
  visibilityChange = 'mozvisibilitychange'
69
- } else if (typeof document.msHidden !== 'undefined') {
74
+ // @ts-expect-error msHidden is a non-standard field name
75
+ } else if (typeof globalThis.document.msHidden !== 'undefined') {
70
76
  hidden = 'msHidden'
71
77
  visibilityChange = 'msvisibilitychange'
72
- } else if (typeof document.webkitHidden !== 'undefined') {
78
+ // @ts-expect-error webkitHidden is a non-standard field name
79
+ } else if (typeof globalThis.document.webkitHidden !== 'undefined') {
73
80
  hidden = 'webkitHidden'
74
81
  visibilityChange = 'webkitvisibilitychange'
75
82
  }
76
- this._hidden = hidden
77
- this._visibilityChange = visibilityChange
83
+
84
+ this.hidden = hidden
85
+ this.visibilityChange = visibilityChange
78
86
  }
79
87
 
80
88
  /**
@@ -84,27 +92,27 @@ class VisibilityChangeEmitter extends EventEmitter {
84
92
  * @private
85
93
  */
86
94
  _addVisibilityChangeListener () {
87
- if (typeof document.addEventListener === 'undefined' ||
88
- typeof document[this._hidden] === 'undefined') {
89
- debug('Checking page visibility requires a browser that supports the Page Visibility API.')
95
+ // @ts-expect-error cannot index document object with string key
96
+ if (typeof globalThis.document.addEventListener === 'undefined' || typeof document[this.hidden] === 'undefined') {
97
+ log('Checking page visibility requires a browser that supports the Page Visibility API.')
90
98
  } else {
91
99
  // Handle page visibility change
92
- document.addEventListener(this._visibilityChange, this._handleVisibilityChange.bind(this), false)
100
+ globalThis.document.addEventListener(this.visibilityChange, this._handleVisibilityChange.bind(this), false)
93
101
  }
94
102
  }
95
103
 
96
104
  /**
97
105
  * The function returns ```true``` if the page is visible or ```false``` if the page is not visible and
98
106
  * ```undefined``` if the page visibility API is not supported by the browser.
99
- *
100
- * @returns {boolean | void} whether the page is now visible or not (undefined is unknown)
101
107
  */
102
108
  isVisible () {
103
- if (this._hidden === undefined || document[this._hidden] === undefined) {
109
+ // @ts-expect-error cannot index document object with string key
110
+ if (this.hidden === undefined || document[this.hidden] === undefined) {
104
111
  return undefined
105
112
  }
106
113
 
107
- return !document[this._hidden]
114
+ // @ts-expect-error cannot index document object with string key
115
+ return document[this.hidden] == null
108
116
  }
109
117
 
110
118
  /**
@@ -115,11 +123,13 @@ class VisibilityChangeEmitter extends EventEmitter {
115
123
  * @private
116
124
  */
117
125
  _handleVisibilityChange () {
118
- const visible = !document[this._hidden]
119
- debug(visible ? 'Page Visible' : 'Page Hidden')
126
+ // @ts-expect-error cannot index document object with string key
127
+ const visible = globalThis.document[this.hidden] === false
128
+ log(visible ? 'Page Visible' : 'Page Hidden')
129
+
120
130
  // Emit the event
121
- this.emit('visibilityChange', visible)
131
+ this.dispatchEvent(new CustomEvent<boolean>('visibilityChange', {
132
+ detail: visible
133
+ }))
122
134
  }
123
135
  }
124
-
125
- module.exports = VisibilityChangeEmitter
@@ -0,0 +1,31 @@
1
+
2
+ /**
3
+ * How long in ms a dial attempt is allowed to take
4
+ */
5
+ export const DIAL_TIMEOUT = 30e3
6
+
7
+ /**
8
+ * Maximum allowed concurrent dials
9
+ */
10
+ export const MAX_PARALLEL_DIALS = 100
11
+
12
+ /**
13
+ * Allowed parallel dials per DialRequest
14
+ */
15
+ export const MAX_PER_PEER_DIALS = 4
16
+
17
+ /**
18
+ * Maximum number of allowed addresses to attempt to dial
19
+ */
20
+ export const MAX_ADDRS_TO_DIAL = 25
21
+
22
+ export const METRICS = {
23
+ computeThrottleMaxQueueSize: 1000,
24
+ computeThrottleTimeout: 2000,
25
+ movingAverageIntervals: [
26
+ 60 * 1000, // 1 minute
27
+ 5 * 60 * 1000, // 5 minutes
28
+ 15 * 60 * 1000 // 15 minutes
29
+ ],
30
+ maxOldPeersRetention: 50
31
+ }
@@ -0,0 +1,144 @@
1
+ import errCode from 'err-code'
2
+ import { messages, codes } from '../errors.js'
3
+ import {
4
+ storeAddresses,
5
+ uniquePeers,
6
+ requirePeers
7
+ } from './utils.js'
8
+ import drain from 'it-drain'
9
+ import merge from 'it-merge'
10
+ import { pipe } from 'it-pipe'
11
+ import type { ContentRouting } from '@libp2p/interfaces/content-routing'
12
+ import type { AbortOptions } from '@libp2p/interfaces'
13
+ import type { Startable } from '@libp2p/interfaces/startable'
14
+ import type { CID } from 'multiformats/cid'
15
+ import type { Components } from '@libp2p/interfaces/components'
16
+
17
+ export interface CompoundContentRoutingInit {
18
+ routers: ContentRouting[]
19
+ }
20
+
21
+ export class CompoundContentRouting implements ContentRouting, Startable {
22
+ private readonly routers: ContentRouting[]
23
+ private started: boolean
24
+ private readonly components: Components
25
+
26
+ constructor (components: Components, init: CompoundContentRoutingInit) {
27
+ this.routers = init.routers ?? []
28
+ this.started = false
29
+ this.components = components
30
+ }
31
+
32
+ isStarted () {
33
+ return this.started
34
+ }
35
+
36
+ async start () {
37
+ this.started = true
38
+ }
39
+
40
+ async stop () {
41
+ this.started = false
42
+ }
43
+
44
+ /**
45
+ * Iterates over all content routers in parallel to find providers of the given key
46
+ */
47
+ async * findProviders (key: CID, options: AbortOptions = {}) {
48
+ if (this.routers.length === 0) {
49
+ throw errCode(new Error('No content this.routers available'), codes.ERR_NO_ROUTERS_AVAILABLE)
50
+ }
51
+
52
+ yield * pipe(
53
+ merge(
54
+ ...this.routers.map(router => router.findProviders(key, options))
55
+ ),
56
+ (source) => storeAddresses(source, this.components.getPeerStore()),
57
+ (source) => uniquePeers(source),
58
+ (source) => requirePeers(source)
59
+ )
60
+ }
61
+
62
+ /**
63
+ * Iterates over all content routers in parallel to notify it is
64
+ * a provider of the given key
65
+ */
66
+ async provide (key: CID, options: AbortOptions = {}) {
67
+ if (this.routers.length === 0) {
68
+ throw errCode(new Error('No content routers available'), codes.ERR_NO_ROUTERS_AVAILABLE)
69
+ }
70
+
71
+ await Promise.all(this.routers.map(async (router) => await router.provide(key, options)))
72
+ }
73
+
74
+ /**
75
+ * Store the given key/value pair in the available content routings
76
+ */
77
+ async put (key: Uint8Array, value: Uint8Array, options?: AbortOptions) {
78
+ if (!this.isStarted()) {
79
+ throw errCode(new Error(messages.NOT_STARTED_YET), codes.DHT_NOT_STARTED)
80
+ }
81
+
82
+ const dht = this.components.getDHT()
83
+
84
+ if (dht != null) {
85
+ await drain(dht.put(key, value, options))
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Get the value to the given key.
91
+ * Times out after 1 minute by default.
92
+ */
93
+ async get (key: Uint8Array, options?: AbortOptions): Promise<Uint8Array> {
94
+ if (!this.isStarted()) {
95
+ throw errCode(new Error(messages.NOT_STARTED_YET), codes.DHT_NOT_STARTED)
96
+ }
97
+
98
+ const dht = this.components.getDHT()
99
+
100
+ if (dht != null) {
101
+ for await (const event of dht.get(key, options)) {
102
+ if (event.name === 'VALUE') {
103
+ return event.value
104
+ }
105
+ }
106
+ }
107
+
108
+ throw errCode(new Error(messages.NOT_FOUND), codes.ERR_NOT_FOUND)
109
+ }
110
+
111
+ /**
112
+ * Get the `n` values to the given key without sorting
113
+ */
114
+ async * getMany (key: Uint8Array, nVals: number, options: AbortOptions) { // eslint-disable-line require-await
115
+ if (!this.isStarted()) {
116
+ throw errCode(new Error(messages.NOT_STARTED_YET), codes.DHT_NOT_STARTED)
117
+ }
118
+
119
+ if (nVals == null || nVals === 0) {
120
+ return
121
+ }
122
+
123
+ let gotValues = 0
124
+ const dht = this.components.getDHT()
125
+
126
+ if (dht != null) {
127
+ for await (const event of dht.get(key, options)) {
128
+ if (event.name === 'VALUE') {
129
+ yield { from: event.from, val: event.value }
130
+
131
+ gotValues++
132
+
133
+ if (gotValues === nVals) {
134
+ break
135
+ }
136
+ }
137
+ }
138
+ }
139
+
140
+ if (gotValues === 0) {
141
+ throw errCode(new Error(messages.NOT_FOUND), codes.ERR_NOT_FOUND)
142
+ }
143
+ }
144
+ }
@@ -0,0 +1,54 @@
1
+ import errCode from 'err-code'
2
+ import filter from 'it-filter'
3
+ import map from 'it-map'
4
+ import type { Source } from 'it-stream-types'
5
+ import type { PeerInfo } from '@libp2p/interfaces/peer-info'
6
+ import type { PeerStore } from '@libp2p/interfaces/peer-store'
7
+
8
+ /**
9
+ * Store the multiaddrs from every peer in the passed peer store
10
+ */
11
+ export async function * storeAddresses (source: Source<PeerInfo>, peerStore: PeerStore) {
12
+ yield * map(source, async (peer) => {
13
+ // ensure we have the addresses for a given peer
14
+ await peerStore.addressBook.add(peer.id, peer.multiaddrs)
15
+
16
+ return peer
17
+ })
18
+ }
19
+
20
+ /**
21
+ * Filter peers by unique peer id
22
+ */
23
+ export function uniquePeers (source: Source<PeerInfo>) {
24
+ /** @type Set<string> */
25
+ const seen = new Set()
26
+
27
+ return filter(source, (peer) => {
28
+ // dedupe by peer id
29
+ if (seen.has(peer.id.toString())) {
30
+ return false
31
+ }
32
+
33
+ seen.add(peer.id.toString())
34
+
35
+ return true
36
+ })
37
+ }
38
+
39
+ /**
40
+ * Require at least `min` peers to be yielded from `source`
41
+ */
42
+ export async function * requirePeers (source: Source<PeerInfo>, min: number = 1) {
43
+ let seen = 0
44
+
45
+ for await (const peer of source) {
46
+ seen++
47
+
48
+ yield peer
49
+ }
50
+
51
+ if (seen < min) {
52
+ throw errCode(new Error('not found'), 'NOT_FOUND')
53
+ }
54
+ }