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,43 @@
1
+ import drain from 'it-drain'
2
+ import errCode from 'err-code'
3
+ import type { DHT } from '@libp2p/interfaces/dht'
4
+ import type { ContentRouting } from '@libp2p/interfaces/content-routing'
5
+ import type { CID } from 'multiformats/cid'
6
+ import type { AbortOptions } from '@libp2p/interfaces'
7
+
8
+ /**
9
+ * Wrapper class to convert events into returned values
10
+ */
11
+ export class DHTContentRouting implements ContentRouting {
12
+ private readonly dht: DHT
13
+
14
+ constructor (dht: DHT) {
15
+ this.dht = dht
16
+ }
17
+
18
+ async provide (cid: CID) {
19
+ await drain(this.dht.provide(cid))
20
+ }
21
+
22
+ async * findProviders (cid: CID, options: AbortOptions = {}) {
23
+ for await (const event of this.dht.findProviders(cid, options)) {
24
+ if (event.name === 'PROVIDER') {
25
+ yield * event.providers
26
+ }
27
+ }
28
+ }
29
+
30
+ async put (key: Uint8Array, value: Uint8Array, options?: AbortOptions): Promise<void> {
31
+ await drain(this.dht.put(key, value, options))
32
+ }
33
+
34
+ async get (key: Uint8Array, options?: AbortOptions): Promise<Uint8Array> {
35
+ for await (const event of this.dht.get(key, options)) {
36
+ if (event.name === 'VALUE') {
37
+ return event.value
38
+ }
39
+ }
40
+
41
+ throw errCode(new Error('Not found'), 'ERR_NOT_FOUND')
42
+ }
43
+ }
@@ -0,0 +1,35 @@
1
+ import errCode from 'err-code'
2
+ import { messages, codes } from '../errors.js'
3
+ import type { PeerRouting } from '@libp2p/interfaces/peer-routing'
4
+ import type { DHT } from '@libp2p/interfaces/dht'
5
+ import type { PeerId } from '@libp2p/interfaces/peer-id'
6
+ import type { AbortOptions } from '@libp2p/interfaces'
7
+
8
+ /**
9
+ * Wrapper class to convert events into returned values
10
+ */
11
+ export class DHTPeerRouting implements PeerRouting {
12
+ private readonly dht: DHT
13
+
14
+ constructor (dht: DHT) {
15
+ this.dht = dht
16
+ }
17
+
18
+ async findPeer (peerId: PeerId, options: AbortOptions = {}) {
19
+ for await (const event of this.dht.findPeer(peerId, options)) {
20
+ if (event.name === 'FINAL_PEER') {
21
+ return event.peer
22
+ }
23
+ }
24
+
25
+ throw errCode(new Error(messages.NOT_FOUND), codes.ERR_NOT_FOUND)
26
+ }
27
+
28
+ async * getClosestPeers (key: Uint8Array, options: AbortOptions = {}) {
29
+ for await (const event of this.dht.getClosestPeers(key, options)) {
30
+ if (event.name === 'PEER_RESPONSE') {
31
+ yield * event.closer
32
+ }
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,40 @@
1
+ import type { PeerInfo } from '@libp2p/interfaces/peer-info'
2
+ import { logger } from '@libp2p/logger'
3
+ import type { Components } from '@libp2p/interfaces/components'
4
+
5
+ const log = logger('libp2p:dialer:auto-dialer')
6
+
7
+ export interface AutoDialerInit {
8
+ enabled: boolean
9
+ minConnections: number
10
+ }
11
+
12
+ export class AutoDialer {
13
+ private readonly components: Components
14
+ private readonly enabled: boolean
15
+ private readonly minConnections: number
16
+
17
+ constructor (components: Components, init: AutoDialerInit) {
18
+ this.components = components
19
+ this.enabled = init.enabled
20
+ this.minConnections = init.minConnections
21
+ }
22
+
23
+ public handle (evt: CustomEvent<PeerInfo>) {
24
+ const { detail: peer } = evt
25
+
26
+ // If auto dialing is on and we have no connection to the peer, check if we should dial
27
+ if (this.enabled && this.components.getConnectionManager().getConnection(peer.id) == null) {
28
+ const minConnections = this.minConnections ?? 0
29
+
30
+ if (minConnections > this.components.getConnectionManager().getConnectionList().length) {
31
+ log('auto-dialing discovered peer %p', peer.id)
32
+
33
+ void this.components.getDialer().dial(peer.id)
34
+ .catch(err => {
35
+ log.error('could not connect to discovered peer %p with %o', peer.id, err)
36
+ })
37
+ }
38
+ }
39
+ }
40
+ }
@@ -1,91 +1,102 @@
1
- 'use strict'
2
-
3
- const errCode = require('err-code')
4
- const { anySignal } = require('any-signal')
5
- // @ts-ignore p-fifo does not export types
6
- const FIFO = require('p-fifo')
7
- const pAny = require('p-any')
8
- // @ts-expect-error setMaxListeners is missing from the types
9
- const { setMaxListeners } = require('events')
10
- const { codes } = require('../errors')
11
-
12
- /**
13
- * @typedef {import('libp2p-interfaces/src/connection').Connection} Connection
14
- * @typedef {import('./')} Dialer
15
- * @typedef {import('multiaddr').Multiaddr} Multiaddr
16
- */
17
-
18
- /**
19
- * @typedef {Object} DialOptions
20
- * @property {AbortSignal} signal
21
- *
22
- * @typedef {Object} DialRequestOptions
23
- * @property {Multiaddr[]} addrs
24
- * @property {(m: Multiaddr, options: DialOptions) => Promise<Connection>} dialAction
25
- * @property {Dialer} dialer
26
- */
27
-
28
- class DialRequest {
1
+ import errCode from 'err-code'
2
+ import { anySignal } from 'any-signal'
3
+ import FIFO from 'p-fifo'
4
+ // @ts-expect-error setMaxListeners is missing from the node 16 types
5
+ import { setMaxListeners } from 'events'
6
+ import { codes } from '../errors.js'
7
+ import { logger } from '@libp2p/logger'
8
+ import type { Multiaddr } from '@multiformats/multiaddr'
9
+ import type { Connection } from '@libp2p/interfaces/connection'
10
+ import type { AbortOptions } from '@libp2p/interfaces'
11
+ import type { DefaultDialer } from './index.js'
12
+
13
+ const log = logger('libp2p:dialer:dial-request')
14
+
15
+ export interface DialAction {
16
+ (m: Multiaddr, options: AbortOptions): Promise<Connection>
17
+ }
18
+
19
+ export interface DialRequestOptions {
20
+ addrs: Multiaddr[]
21
+ dialAction: DialAction
22
+ dialer: DefaultDialer
23
+ }
24
+
25
+ export class DialRequest {
26
+ private readonly addrs: Multiaddr[]
27
+ private readonly dialer: DefaultDialer
28
+ private readonly dialAction: DialAction
29
+
29
30
  /**
30
31
  * Manages running the `dialAction` on multiple provided `addrs` in parallel
31
32
  * up to a maximum determined by the number of tokens returned
32
33
  * from `dialer.getTokens`. Once a DialRequest is created, it can be
33
34
  * started using `DialRequest.run(options)`. Once a single dial has succeeded,
34
35
  * all other dials in the request will be cancelled.
35
- *
36
- * @class
37
- * @param {DialRequestOptions} options
38
36
  */
39
- constructor ({
40
- addrs,
41
- dialAction,
42
- dialer
43
- }) {
37
+ constructor (options: DialRequestOptions) {
38
+ const {
39
+ addrs,
40
+ dialAction,
41
+ dialer
42
+ } = options
43
+
44
44
  this.addrs = addrs
45
45
  this.dialer = dialer
46
46
  this.dialAction = dialAction
47
47
  }
48
48
 
49
- /**
50
- * @async
51
- * @param {object} [options]
52
- * @param {AbortSignal} [options.signal] - An AbortController signal
53
- * @returns {Promise<Connection>}
54
- */
55
- async run (options = {}) {
49
+ async run (options: AbortOptions = {}): Promise<Connection> {
56
50
  const tokens = this.dialer.getTokens(this.addrs.length)
51
+
57
52
  // If no tokens are available, throw
58
53
  if (tokens.length < 1) {
59
54
  throw errCode(new Error('No dial tokens available'), codes.ERR_NO_DIAL_TOKENS)
60
55
  }
61
56
 
62
- const tokenHolder = new FIFO()
63
- tokens.forEach(token => tokenHolder.push(token))
57
+ const tokenHolder = new FIFO<number>()
58
+
59
+ for (const token of tokens) {
60
+ void tokenHolder.push(token).catch(err => {
61
+ log.error(err)
62
+ })
63
+ }
64
+
64
65
  const dialAbortControllers = this.addrs.map(() => {
65
66
  const controller = new AbortController()
66
67
  try {
67
68
  // fails on node < 15.4
68
- setMaxListeners && setMaxListeners(Infinity, controller.signal)
69
+ setMaxListeners?.(Infinity, controller.signal)
69
70
  } catch {}
70
71
 
71
72
  return controller
72
73
  })
74
+
75
+ if (options.signal != null) {
76
+ try {
77
+ // fails on node < 15.4
78
+ setMaxListeners?.(Infinity, options.signal)
79
+ } catch {}
80
+ }
81
+
73
82
  let completedDials = 0
74
83
 
75
84
  try {
76
- return await pAny(this.addrs.map(async (addr, i) => {
85
+ return await Promise.any(this.addrs.map(async (addr, i) => {
77
86
  const token = await tokenHolder.shift() // get token
78
87
  let conn
79
88
  try {
80
89
  const signal = dialAbortControllers[i].signal
81
- conn = await this.dialAction(addr, { ...options, signal: options.signal ? anySignal([signal, options.signal]) : signal })
90
+ conn = await this.dialAction(addr, { ...options, signal: (options.signal != null) ? anySignal([signal, options.signal]) : signal })
82
91
  // Remove the successful AbortController so it is not aborted
83
92
  dialAbortControllers.splice(i, 1)
84
93
  } finally {
85
94
  completedDials++
86
95
  // If we have more or equal dials remaining than tokens, recycle the token, otherwise release it
87
96
  if (this.addrs.length - completedDials >= tokens.length) {
88
- tokenHolder.push(token)
97
+ void tokenHolder.push(token).catch(err => {
98
+ log.error(err)
99
+ })
89
100
  } else {
90
101
  this.dialer.releaseToken(tokens.splice(tokens.indexOf(token), 1)[0])
91
102
  }
@@ -99,5 +110,3 @@ class DialRequest {
99
110
  }
100
111
  }
101
112
  }
102
-
103
- module.exports = DialRequest
@@ -0,0 +1,374 @@
1
+ import { logger } from '@libp2p/logger'
2
+ import all from 'it-all'
3
+ import filter from 'it-filter'
4
+ import { pipe } from 'it-pipe'
5
+ import errCode from 'err-code'
6
+ import { Multiaddr } from '@multiformats/multiaddr'
7
+ import { TimeoutController } from 'timeout-abort-controller'
8
+ import { AbortError } from '@libp2p/interfaces/errors'
9
+ import { anySignal } from 'any-signal'
10
+ // @ts-expect-error setMaxListeners is missing from the node 16 types
11
+ import { setMaxListeners } from 'events'
12
+ import { DialAction, DialRequest } from './dial-request.js'
13
+ import { publicAddressesFirst } from '@libp2p/utils/address-sort'
14
+ import { trackedMap } from '@libp2p/tracked-map'
15
+ import { codes } from '../errors.js'
16
+ import {
17
+ DIAL_TIMEOUT,
18
+ MAX_PARALLEL_DIALS,
19
+ MAX_PER_PEER_DIALS,
20
+ MAX_ADDRS_TO_DIAL
21
+ } from '../constants.js'
22
+ import type { Connection } from '@libp2p/interfaces/connection'
23
+ import type { AbortOptions, Startable } from '@libp2p/interfaces'
24
+ import type { PeerId } from '@libp2p/interfaces/peer-id'
25
+ import { getPeer } from '../get-peer.js'
26
+ import sort from 'it-sort'
27
+ import type { Components } from '@libp2p/interfaces/components'
28
+ import type { Dialer, DialerInit } from '@libp2p/interfaces/dialer'
29
+ import map from 'it-map'
30
+ import type { AddressSorter } from '@libp2p/interfaces/peer-store'
31
+
32
+ const log = logger('libp2p:dialer')
33
+
34
+ const METRICS_COMPONENT = 'dialler'
35
+ const METRICS_PENDING_DIALS = 'pending-dials'
36
+ const METRICS_PENDING_DIAL_TARGETS = 'pending-dial-targets'
37
+
38
+ export interface DialTarget {
39
+ id: string
40
+ addrs: Multiaddr[]
41
+ }
42
+
43
+ export interface PendingDial {
44
+ dialRequest: DialRequest
45
+ controller: TimeoutController
46
+ promise: Promise<Connection>
47
+ destroy: () => void
48
+ }
49
+
50
+ export interface PendingDialTarget {
51
+ resolve: (value: any) => void
52
+ reject: (err: Error) => void
53
+ }
54
+
55
+ export class DefaultDialer implements Dialer, Startable {
56
+ private readonly components: Components
57
+ private readonly addressSorter: AddressSorter
58
+ private readonly maxAddrsToDial: number
59
+ private readonly timeout: number
60
+ private readonly maxDialsPerPeer: number
61
+ public tokens: number[]
62
+ public pendingDials: Map<string, PendingDial>
63
+ public pendingDialTargets: Map<string, PendingDialTarget>
64
+ private started: boolean
65
+
66
+ constructor (components: Components, init: DialerInit = {}) {
67
+ this.components = components
68
+ this.started = false
69
+ this.addressSorter = init.addressSorter ?? publicAddressesFirst
70
+ this.maxAddrsToDial = init.maxAddrsToDial ?? MAX_ADDRS_TO_DIAL
71
+ this.timeout = init.dialTimeout ?? DIAL_TIMEOUT
72
+ this.maxDialsPerPeer = init.maxDialsPerPeer ?? MAX_PER_PEER_DIALS
73
+ this.tokens = [...new Array(init.maxParallelDials ?? MAX_PARALLEL_DIALS)].map((_, index) => index)
74
+ this.pendingDials = trackedMap({
75
+ component: METRICS_COMPONENT,
76
+ metric: METRICS_PENDING_DIALS,
77
+ metrics: init.metrics
78
+ })
79
+ this.pendingDialTargets = trackedMap({
80
+ component: METRICS_COMPONENT,
81
+ metric: METRICS_PENDING_DIAL_TARGETS,
82
+ metrics: init.metrics
83
+ })
84
+
85
+ for (const [key, value] of Object.entries(init.resolvers ?? {})) {
86
+ Multiaddr.resolvers.set(key, value)
87
+ }
88
+ }
89
+
90
+ isStarted () {
91
+ return this.started
92
+ }
93
+
94
+ async start () {
95
+ this.started = true
96
+ }
97
+
98
+ /**
99
+ * Clears any pending dials
100
+ */
101
+ async stop () {
102
+ this.started = false
103
+
104
+ for (const dial of this.pendingDials.values()) {
105
+ try {
106
+ dial.controller.abort()
107
+ } catch (err: any) {
108
+ log.error(err)
109
+ }
110
+ }
111
+ this.pendingDials.clear()
112
+
113
+ for (const pendingTarget of this.pendingDialTargets.values()) {
114
+ pendingTarget.reject(new AbortError('Dialer was destroyed'))
115
+ }
116
+ this.pendingDialTargets.clear()
117
+ }
118
+
119
+ /**
120
+ * Connects to a given `peer` by dialing all of its known addresses.
121
+ * The dial to the first address that is successfully able to upgrade a connection
122
+ * will be used.
123
+ */
124
+ async dial (peer: PeerId | Multiaddr, options: AbortOptions = {}): Promise<Connection> {
125
+ const { id, multiaddrs } = getPeer(peer)
126
+
127
+ if (this.components.getPeerId().equals(id)) {
128
+ throw errCode(new Error('Tried to dial self'), codes.ERR_DIALED_SELF)
129
+ }
130
+
131
+ log('check multiaddrs %p', id)
132
+
133
+ if (multiaddrs != null && multiaddrs.length > 0) {
134
+ log('storing multiaddrs %p', id, multiaddrs)
135
+ await this.components.getPeerStore().addressBook.add(id, multiaddrs)
136
+ }
137
+
138
+ if (await this.components.getConnectionGater().denyDialPeer(id)) {
139
+ throw errCode(new Error('The dial request is blocked by gater.allowDialPeer'), codes.ERR_PEER_DIAL_INTERCEPTED)
140
+ }
141
+
142
+ log('dial to %p', id)
143
+
144
+ const existingConnection = this.components.getConnectionManager().getConnection(id)
145
+
146
+ if (existingConnection != null) {
147
+ log('had an existing connection to %p', id)
148
+
149
+ return existingConnection
150
+ }
151
+
152
+ log('creating dial target for %p', id)
153
+
154
+ const dialTarget = await this._createCancellableDialTarget(id)
155
+
156
+ if (dialTarget.addrs.length === 0) {
157
+ throw errCode(new Error('The dial request has no valid addresses'), codes.ERR_NO_VALID_ADDRESSES)
158
+ }
159
+
160
+ const pendingDial = this.pendingDials.get(dialTarget.id) ?? this._createPendingDial(dialTarget, options)
161
+
162
+ try {
163
+ const connection = await pendingDial.promise
164
+ log('dial succeeded to %s', dialTarget.id)
165
+ return connection
166
+ } catch (err: any) {
167
+ log('dial failed to %s', dialTarget.id, err)
168
+ // Error is a timeout
169
+ if (pendingDial.controller.signal.aborted) {
170
+ err.code = codes.ERR_TIMEOUT
171
+ }
172
+ log.error(err)
173
+ throw err
174
+ } finally {
175
+ pendingDial.destroy()
176
+ }
177
+ }
178
+
179
+ async dialProtocol (peer: PeerId | Multiaddr, protocols: string | string[], options: AbortOptions = {}) {
180
+ if (protocols == null) {
181
+ throw errCode(new Error('no protocols were provided to open a stream'), codes.ERR_INVALID_PROTOCOLS_FOR_STREAM)
182
+ }
183
+
184
+ protocols = Array.isArray(protocols) ? protocols : [protocols]
185
+
186
+ if (protocols.length === 0) {
187
+ throw errCode(new Error('no protocols were provided to open a stream'), codes.ERR_INVALID_PROTOCOLS_FOR_STREAM)
188
+ }
189
+
190
+ const connection = await this.dial(peer, options)
191
+
192
+ return await connection.newStream(protocols)
193
+ }
194
+
195
+ /**
196
+ * Connects to a given `peer` by dialing all of its known addresses.
197
+ * The dial to the first address that is successfully able to upgrade a connection
198
+ * will be used.
199
+ */
200
+ async _createCancellableDialTarget (peer: PeerId): Promise<DialTarget> {
201
+ // Make dial target promise cancellable
202
+ const id = `${(parseInt(String(Math.random() * 1e9), 10)).toString()}${Date.now()}`
203
+ const cancellablePromise = new Promise<DialTarget>((resolve, reject) => {
204
+ this.pendingDialTargets.set(id, { resolve, reject })
205
+ })
206
+
207
+ try {
208
+ const dialTarget = await Promise.race([
209
+ this._createDialTarget(peer),
210
+ cancellablePromise
211
+ ])
212
+
213
+ return dialTarget
214
+ } finally {
215
+ this.pendingDialTargets.delete(id)
216
+ }
217
+ }
218
+
219
+ /**
220
+ * Creates a DialTarget. The DialTarget is used to create and track
221
+ * the DialRequest to a given peer.
222
+ * If a multiaddr is received it should be the first address attempted.
223
+ * Multiaddrs not supported by the available transports will be filtered out.
224
+ */
225
+ async _createDialTarget (peer: PeerId): Promise<DialTarget> {
226
+ const knownAddrs = await pipe(
227
+ await this.components.getPeerStore().addressBook.get(peer),
228
+ (source) => filter(source, async (address) => {
229
+ return !(await this.components.getConnectionGater().denyDialMultiaddr(peer, address.multiaddr))
230
+ }),
231
+ (source) => sort(source, this.addressSorter),
232
+ (source) => map(source, (address) => {
233
+ const ma = address.multiaddr
234
+
235
+ if (peer.toString() === ma.getPeerId()) {
236
+ return ma
237
+ }
238
+
239
+ return ma.encapsulate(`/p2p/${peer.toString()}`)
240
+ }),
241
+ async (source) => await all(source)
242
+ )
243
+
244
+ const addrs: Multiaddr[] = []
245
+ for (const a of knownAddrs) {
246
+ const resolvedAddrs = await this._resolve(a)
247
+
248
+ log('resolved %s to %s', a, resolvedAddrs)
249
+
250
+ resolvedAddrs.forEach(ra => addrs.push(ra))
251
+ }
252
+
253
+ // Multiaddrs not supported by the available transports will be filtered out.
254
+ const supportedAddrs = addrs.filter(a => this.components.getTransportManager().transportForMultiaddr(a))
255
+
256
+ if (supportedAddrs.length > this.maxAddrsToDial) {
257
+ await this.components.getPeerStore().delete(peer)
258
+ throw errCode(new Error('dial with more addresses than allowed'), codes.ERR_TOO_MANY_ADDRESSES)
259
+ }
260
+
261
+ return {
262
+ id: peer.toString(),
263
+ addrs: supportedAddrs
264
+ }
265
+ }
266
+
267
+ /**
268
+ * Creates a PendingDial that wraps the underlying DialRequest
269
+ */
270
+ _createPendingDial (dialTarget: DialTarget, options: AbortOptions = {}): PendingDial {
271
+ /**
272
+ * @param {Multiaddr} addr
273
+ * @param {{ signal: { aborted: any; }; }} options
274
+ */
275
+ const dialAction: DialAction = async (addr, options = {}) => {
276
+ if (options.signal?.aborted === true) {
277
+ throw errCode(new Error('already aborted'), codes.ERR_ALREADY_ABORTED)
278
+ }
279
+
280
+ return await this.components.getTransportManager().dial(addr, options)
281
+ }
282
+
283
+ const dialRequest = new DialRequest({
284
+ addrs: dialTarget.addrs,
285
+ dialAction,
286
+ dialer: this
287
+ })
288
+
289
+ // Combine the timeout signal and options.signal, if provided
290
+ const timeoutController = new TimeoutController(this.timeout)
291
+
292
+ const signals = [timeoutController.signal]
293
+ ;(options.signal != null) && signals.push(options.signal)
294
+ const signal = anySignal(signals)
295
+
296
+ // this signal will potentially be used while dialing lots of
297
+ // peers so prevent MaxListenersExceededWarning appearing in the console
298
+ try {
299
+ // fails on node < 15.4
300
+ setMaxListeners?.(Infinity, signal)
301
+ } catch {}
302
+
303
+ const pendingDial = {
304
+ dialRequest,
305
+ controller: timeoutController,
306
+ promise: dialRequest.run({ ...options, signal }),
307
+ destroy: () => {
308
+ timeoutController.clear()
309
+ this.pendingDials.delete(dialTarget.id)
310
+ }
311
+ }
312
+ this.pendingDials.set(dialTarget.id, pendingDial)
313
+
314
+ return pendingDial
315
+ }
316
+
317
+ getTokens (num: number) {
318
+ const total = Math.min(num, this.maxDialsPerPeer, this.tokens.length)
319
+ const tokens = this.tokens.splice(0, total)
320
+ log('%d tokens request, returning %d, %d remaining', num, total, this.tokens.length)
321
+ return tokens
322
+ }
323
+
324
+ releaseToken (token: number) {
325
+ // Guard against duplicate releases
326
+ if (this.tokens.includes(token)) {
327
+ return
328
+ }
329
+
330
+ log('token %d released', token)
331
+ this.tokens.push(token)
332
+ }
333
+
334
+ /**
335
+ * Resolve multiaddr recursively
336
+ */
337
+ async _resolve (ma: Multiaddr): Promise<Multiaddr[]> {
338
+ // TODO: recursive logic should live in multiaddr once dns4/dns6 support is in place
339
+ // Now only supporting resolve for dnsaddr
340
+ const resolvableProto = ma.protoNames().includes('dnsaddr')
341
+
342
+ // Multiaddr is not resolvable? End recursion!
343
+ if (!resolvableProto) {
344
+ return [ma]
345
+ }
346
+
347
+ const resolvedMultiaddrs = await this._resolveRecord(ma)
348
+ const recursiveMultiaddrs = await Promise.all(resolvedMultiaddrs.map(async (nm) => {
349
+ return await this._resolve(nm)
350
+ }))
351
+
352
+ const addrs = recursiveMultiaddrs.flat()
353
+ return addrs.reduce<Multiaddr[]>((array, newM) => {
354
+ if (array.find(m => m.equals(newM)) == null) {
355
+ array.push(newM)
356
+ }
357
+ return array
358
+ }, ([]))
359
+ }
360
+
361
+ /**
362
+ * Resolve a given multiaddr. If this fails, an empty array will be returned
363
+ */
364
+ async _resolveRecord (ma: Multiaddr): Promise<Multiaddr[]> {
365
+ try {
366
+ ma = new Multiaddr(ma.toString()) // Use current multiaddr module
367
+ const multiaddrs = await ma.resolve()
368
+ return multiaddrs
369
+ } catch (err) {
370
+ log.error(`multiaddr ${ma.toString()} could not be resolved`, err)
371
+ return []
372
+ }
373
+ }
374
+ }