libp2p 0.36.0 → 0.36.2-1473044

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 (415) 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 +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 +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/pb/index.d.ts +51 -0
  44. package/dist/src/circuit/pb/index.d.ts.map +1 -0
  45. package/dist/src/circuit/pb/index.js +72 -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 +190 -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 +93 -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/index.d.ts +79 -144
  64. package/dist/src/connection-manager/index.d.ts.map +1 -1
  65. package/dist/src/connection-manager/index.js +295 -0
  66. package/dist/src/connection-manager/index.js.map +1 -0
  67. package/dist/src/connection-manager/latency-monitor.d.ts +72 -97
  68. package/dist/src/connection-manager/latency-monitor.d.ts.map +1 -1
  69. package/dist/src/connection-manager/latency-monitor.js +220 -0
  70. package/dist/src/connection-manager/latency-monitor.js.map +1 -0
  71. package/dist/src/connection-manager/visibility-change-emitter.d.ts +15 -16
  72. package/dist/src/connection-manager/visibility-change-emitter.d.ts.map +1 -1
  73. package/dist/src/connection-manager/visibility-change-emitter.js +118 -0
  74. package/dist/src/connection-manager/visibility-change-emitter.js.map +1 -0
  75. package/dist/src/constants.d.ts +22 -10
  76. package/dist/src/constants.d.ts.map +1 -1
  77. package/dist/src/constants.js +27 -0
  78. package/dist/src/constants.js.map +1 -0
  79. package/dist/src/content-routing/index.d.ts +26 -81
  80. package/dist/src/content-routing/index.d.ts.map +1 -1
  81. package/dist/src/content-routing/index.js +99 -0
  82. package/dist/src/content-routing/index.js.map +1 -0
  83. package/dist/src/content-routing/utils.d.ts +6 -49
  84. package/dist/src/content-routing/utils.d.ts.map +1 -1
  85. package/dist/src/content-routing/utils.js +42 -0
  86. package/dist/src/content-routing/utils.js.map +1 -0
  87. package/dist/src/dht/dht-content-routing.d.ts +10 -24
  88. package/dist/src/dht/dht-content-routing.d.ts.map +1 -1
  89. package/dist/src/dht/dht-content-routing.js +32 -0
  90. package/dist/src/dht/dht-content-routing.js.map +1 -0
  91. package/dist/src/dht/dht-peer-routing.d.ts +9 -24
  92. package/dist/src/dht/dht-peer-routing.d.ts.map +1 -1
  93. package/dist/src/dht/dht-peer-routing.js +26 -0
  94. package/dist/src/dht/dht-peer-routing.js.map +1 -0
  95. package/dist/src/dialer/auto-dialer.d.ts +14 -0
  96. package/dist/src/dialer/auto-dialer.d.ts.map +1 -0
  97. package/dist/src/dialer/auto-dialer.js +24 -0
  98. package/dist/src/dialer/auto-dialer.js.map +1 -0
  99. package/dist/src/dialer/dial-request.d.ts +18 -46
  100. package/dist/src/dialer/dial-request.d.ts.map +1 -1
  101. package/dist/src/dialer/dial-request.js +83 -0
  102. package/dist/src/dialer/dial-request.js.map +1 -0
  103. package/dist/src/dialer/index.d.ts +41 -148
  104. package/dist/src/dialer/index.d.ts.map +1 -1
  105. package/dist/src/dialer/index.js +280 -0
  106. package/dist/src/dialer/index.js.map +1 -0
  107. package/dist/src/errors.d.ts +68 -63
  108. package/dist/src/errors.d.ts.map +1 -1
  109. package/dist/src/errors.js +73 -0
  110. package/dist/src/errors.js.map +1 -0
  111. package/dist/src/fetch/constants.d.ts +1 -1
  112. package/dist/src/fetch/constants.d.ts.map +1 -1
  113. package/dist/src/fetch/constants.js +3 -0
  114. package/dist/src/fetch/constants.js.map +1 -0
  115. package/dist/src/fetch/index.d.ts +30 -49
  116. package/dist/src/fetch/index.d.ts.map +1 -1
  117. package/dist/src/fetch/index.js +129 -0
  118. package/dist/src/fetch/index.js.map +1 -0
  119. package/dist/src/fetch/pb/proto.d.ts +26 -0
  120. package/dist/src/fetch/pb/proto.d.ts.map +1 -0
  121. package/dist/src/fetch/pb/proto.js +44 -0
  122. package/dist/src/fetch/pb/proto.js.map +1 -0
  123. package/dist/src/get-peer.d.ts +4 -11
  124. package/dist/src/get-peer.d.ts.map +1 -1
  125. package/dist/src/get-peer.js +43 -0
  126. package/dist/src/get-peer.js.map +1 -0
  127. package/dist/src/identify/consts.d.ts +9 -9
  128. package/dist/src/identify/consts.d.ts.map +1 -1
  129. package/dist/src/identify/consts.js +11 -0
  130. package/dist/src/identify/consts.js.map +1 -0
  131. package/dist/src/identify/index.d.ts +42 -96
  132. package/dist/src/identify/index.d.ts.map +1 -1
  133. package/dist/src/identify/index.js +322 -0
  134. package/dist/src/identify/index.js.map +1 -0
  135. package/dist/src/identify/pb/message.d.ts +15 -0
  136. package/dist/src/identify/pb/message.d.ts.map +1 -0
  137. package/dist/src/identify/pb/message.js +24 -0
  138. package/dist/src/identify/pb/message.js.map +1 -0
  139. package/dist/src/index.d.ts +162 -581
  140. package/dist/src/index.d.ts.map +1 -1
  141. package/dist/src/index.js +9 -0
  142. package/dist/src/index.js.map +1 -0
  143. package/dist/src/insecure/index.d.ts +9 -0
  144. package/dist/src/insecure/index.d.ts.map +1 -0
  145. package/dist/src/insecure/index.js +81 -0
  146. package/dist/src/insecure/index.js.map +1 -0
  147. package/dist/src/insecure/pb/proto.d.ts +28 -0
  148. package/dist/src/insecure/pb/proto.d.ts.map +1 -0
  149. package/dist/src/insecure/pb/proto.js +46 -0
  150. package/dist/src/insecure/pb/proto.js.map +1 -0
  151. package/dist/src/keychain/cms.d.ts +6 -14
  152. package/dist/src/keychain/cms.d.ts.map +1 -1
  153. package/dist/src/keychain/cms.js +129 -0
  154. package/dist/src/keychain/cms.js.map +1 -0
  155. package/dist/src/keychain/index.d.ts +61 -81
  156. package/dist/src/keychain/index.d.ts.map +1 -1
  157. package/dist/src/keychain/index.js +493 -0
  158. package/dist/src/keychain/index.js.map +1 -0
  159. package/dist/src/keychain/util.d.ts +3 -6
  160. package/dist/src/keychain/util.d.ts.map +1 -1
  161. package/dist/src/keychain/util.js +79 -0
  162. package/dist/src/keychain/util.js.map +1 -0
  163. package/dist/src/libp2p.d.ts +78 -0
  164. package/dist/src/libp2p.d.ts.map +1 -0
  165. package/dist/src/libp2p.js +375 -0
  166. package/dist/src/libp2p.js.map +1 -0
  167. package/dist/src/metrics/index.d.ts +47 -104
  168. package/dist/src/metrics/index.d.ts.map +1 -1
  169. package/dist/src/metrics/index.js +231 -0
  170. package/dist/src/metrics/index.js.map +1 -0
  171. package/dist/src/metrics/moving-average.d.ts +14 -0
  172. package/dist/src/metrics/moving-average.d.ts.map +1 -0
  173. package/dist/src/metrics/moving-average.js +40 -0
  174. package/dist/src/metrics/moving-average.js.map +1 -0
  175. package/dist/src/metrics/stats.d.ts +41 -93
  176. package/dist/src/metrics/stats.d.ts.map +1 -1
  177. package/dist/src/metrics/stats.js +183 -0
  178. package/dist/src/metrics/stats.js.map +1 -0
  179. package/dist/src/nat-manager.d.ts +42 -99
  180. package/dist/src/nat-manager.d.ts.map +1 -1
  181. package/dist/src/nat-manager.js +114 -0
  182. package/dist/src/nat-manager.js.map +1 -0
  183. package/dist/src/peer-record-updater.d.ts +15 -0
  184. package/dist/src/peer-record-updater.d.ts.map +1 -0
  185. package/dist/src/peer-record-updater.js +44 -0
  186. package/dist/src/peer-record-updater.js.map +1 -0
  187. package/dist/src/peer-routing.d.ts +39 -84
  188. package/dist/src/peer-routing.d.ts.map +1 -1
  189. package/dist/src/peer-routing.js +108 -0
  190. package/dist/src/peer-routing.js.map +1 -0
  191. package/dist/src/ping/constants.d.ts +4 -4
  192. package/dist/src/ping/constants.d.ts.map +1 -1
  193. package/dist/src/ping/constants.js +5 -0
  194. package/dist/src/ping/constants.js.map +1 -0
  195. package/dist/src/ping/index.d.ts +26 -33
  196. package/dist/src/ping/index.d.ts.map +1 -1
  197. package/dist/src/ping/index.js +56 -0
  198. package/dist/src/ping/index.js.map +1 -0
  199. package/dist/src/pnet/crypto.d.ts +15 -5
  200. package/dist/src/pnet/crypto.d.ts.map +1 -1
  201. package/dist/src/pnet/crypto.js +60 -0
  202. package/dist/src/pnet/crypto.js.map +1 -0
  203. package/dist/src/pnet/errors.d.ts +5 -5
  204. package/dist/src/pnet/errors.d.ts.map +1 -1
  205. package/dist/src/pnet/errors.js +6 -0
  206. package/dist/src/pnet/errors.js.map +1 -0
  207. package/dist/src/pnet/index.d.ts +11 -20
  208. package/dist/src/pnet/index.d.ts.map +1 -1
  209. package/dist/src/pnet/index.js +66 -0
  210. package/dist/src/pnet/index.js.map +1 -0
  211. package/dist/src/pnet/key-generator.d.ts +3 -7
  212. package/dist/src/pnet/key-generator.d.ts.map +1 -1
  213. package/dist/src/pnet/key-generator.js +25 -0
  214. package/dist/src/pnet/key-generator.js.map +1 -0
  215. package/dist/src/registrar.d.ts +27 -65
  216. package/dist/src/registrar.d.ts.map +1 -1
  217. package/dist/src/registrar.js +159 -0
  218. package/dist/src/registrar.js.map +1 -0
  219. package/dist/src/transport-manager.d.ts +34 -82
  220. package/dist/src/transport-manager.d.ts.map +1 -1
  221. package/dist/src/transport-manager.js +223 -0
  222. package/dist/src/transport-manager.js.map +1 -0
  223. package/dist/src/upgrader.d.ts +49 -129
  224. package/dist/src/upgrader.d.ts.map +1 -1
  225. package/dist/src/upgrader.js +402 -0
  226. package/dist/src/upgrader.js.map +1 -0
  227. package/dist/src/version.d.ts +3 -0
  228. package/dist/src/version.d.ts.map +1 -0
  229. package/dist/src/version.js +3 -0
  230. package/dist/src/version.js.map +1 -0
  231. package/package.json +150 -197
  232. package/src/address-manager/index.ts +129 -0
  233. package/src/circuit/README.md +16 -11
  234. package/src/circuit/auto-relay.ts +284 -0
  235. package/src/circuit/circuit/hop.ts +211 -0
  236. package/src/circuit/circuit/stop.ts +78 -0
  237. package/src/circuit/circuit/stream-handler.ts +86 -0
  238. package/src/circuit/circuit/{utils.js → utils.ts} +9 -25
  239. package/src/circuit/constants.ts +31 -0
  240. package/src/circuit/index.ts +120 -0
  241. package/src/circuit/{listener.js → listener.ts} +21 -27
  242. package/src/circuit/multicodec.ts +2 -0
  243. package/src/circuit/{protocol → pb}/index.proto +1 -1
  244. package/src/circuit/pb/index.ts +88 -0
  245. package/src/circuit/transport.ts +216 -0
  246. package/src/circuit/utils.ts +12 -0
  247. package/src/config.ts +101 -0
  248. package/src/connection-manager/auto-dialler.ts +154 -0
  249. package/src/connection-manager/index.ts +422 -0
  250. package/src/connection-manager/latency-monitor.ts +319 -0
  251. package/src/connection-manager/{visibility-change-emitter.js → visibility-change-emitter.ts} +48 -38
  252. package/src/constants.ts +31 -0
  253. package/src/content-routing/index.ts +143 -0
  254. package/src/content-routing/utils.ts +54 -0
  255. package/src/dht/dht-content-routing.ts +43 -0
  256. package/src/dht/dht-peer-routing.ts +35 -0
  257. package/src/dialer/auto-dialer.ts +40 -0
  258. package/src/dialer/{dial-request.js → dial-request.ts} +60 -51
  259. package/src/dialer/index.ts +371 -0
  260. package/src/errors.ts +71 -0
  261. package/src/fetch/README.md +1 -1
  262. package/src/fetch/constants.ts +3 -0
  263. package/src/fetch/index.ts +167 -0
  264. package/src/fetch/{proto.proto → pb/proto.proto} +0 -0
  265. package/src/fetch/pb/proto.ts +58 -0
  266. package/src/get-peer.ts +57 -0
  267. package/src/identify/consts.ts +13 -0
  268. package/src/identify/index.ts +445 -0
  269. package/src/identify/{message.proto → pb/message.proto} +0 -0
  270. package/src/identify/pb/message.ts +36 -0
  271. package/src/index.ts +242 -0
  272. package/src/insecure/index.ts +101 -0
  273. package/src/insecure/{proto.proto → pb/proto.proto} +0 -0
  274. package/src/insecure/pb/proto.ts +61 -0
  275. package/src/keychain/{cms.js → cms.ts} +62 -58
  276. package/src/keychain/index.ts +588 -0
  277. package/src/keychain/{util.js → util.ts} +7 -17
  278. package/src/libp2p.ts +513 -0
  279. package/src/metrics/index.ts +310 -0
  280. package/src/metrics/moving-average.ts +53 -0
  281. package/src/metrics/stats.ts +238 -0
  282. package/src/nat-manager.ts +194 -0
  283. package/src/peer-record-updater.ts +55 -0
  284. package/src/peer-routing.ts +185 -0
  285. package/src/ping/README.md +1 -1
  286. package/src/ping/constants.ts +5 -0
  287. package/src/ping/index.ts +83 -0
  288. package/src/pnet/README.md +2 -2
  289. package/src/pnet/crypto.ts +67 -0
  290. package/src/pnet/errors.ts +5 -0
  291. package/src/pnet/index.ts +95 -0
  292. package/src/pnet/key-generator.ts +28 -0
  293. package/src/registrar.ts +205 -0
  294. package/src/transport-manager.ts +279 -0
  295. package/src/upgrader.ts +499 -0
  296. package/src/version.ts +3 -0
  297. package/dist/index.min.js +0 -55
  298. package/dist/src/circuit/protocol/index.d.ts +0 -173
  299. package/dist/src/fetch/proto.d.ts +0 -134
  300. package/dist/src/identify/message.d.ts +0 -95
  301. package/dist/src/insecure/plaintext.d.ts +0 -12
  302. package/dist/src/insecure/plaintext.d.ts.map +0 -1
  303. package/dist/src/insecure/proto.d.ts +0 -128
  304. package/dist/src/metrics/old-peers.d.ts +0 -3
  305. package/dist/src/metrics/old-peers.d.ts.map +0 -1
  306. package/dist/src/metrics/tracked-map.d.ts +0 -8
  307. package/dist/src/metrics/tracked-map.d.ts.map +0 -1
  308. package/dist/src/peer-store/address-book.d.ts +0 -67
  309. package/dist/src/peer-store/address-book.d.ts.map +0 -1
  310. package/dist/src/peer-store/index.d.ts +0 -58
  311. package/dist/src/peer-store/index.d.ts.map +0 -1
  312. package/dist/src/peer-store/key-book.d.ts +0 -40
  313. package/dist/src/peer-store/key-book.d.ts.map +0 -1
  314. package/dist/src/peer-store/metadata-book.d.ts +0 -58
  315. package/dist/src/peer-store/metadata-book.d.ts.map +0 -1
  316. package/dist/src/peer-store/pb/peer.d.ts +0 -222
  317. package/dist/src/peer-store/proto-book.d.ts +0 -43
  318. package/dist/src/peer-store/proto-book.d.ts.map +0 -1
  319. package/dist/src/peer-store/store.d.ts +0 -73
  320. package/dist/src/peer-store/store.d.ts.map +0 -1
  321. package/dist/src/peer-store/types.d.ts +0 -202
  322. package/dist/src/peer-store/types.d.ts.map +0 -1
  323. package/dist/src/ping/util.d.ts +0 -5
  324. package/dist/src/ping/util.d.ts.map +0 -1
  325. package/dist/src/pubsub-adapter.d.ts +0 -22
  326. package/dist/src/pubsub-adapter.d.ts.map +0 -1
  327. package/dist/src/record/envelope/envelope.d.ts +0 -77
  328. package/dist/src/record/envelope/index.d.ts +0 -80
  329. package/dist/src/record/envelope/index.d.ts.map +0 -1
  330. package/dist/src/record/peer-record/consts.d.ts +0 -4
  331. package/dist/src/record/peer-record/consts.d.ts.map +0 -1
  332. package/dist/src/record/peer-record/index.d.ts +0 -60
  333. package/dist/src/record/peer-record/index.d.ts.map +0 -1
  334. package/dist/src/record/peer-record/peer-record.d.ts +0 -133
  335. package/dist/src/record/utils.d.ts +0 -12
  336. package/dist/src/record/utils.d.ts.map +0 -1
  337. package/dist/src/types.d.ts +0 -90
  338. package/dist/src/types.d.ts.map +0 -1
  339. package/src/address-manager/index.js +0 -96
  340. package/src/circuit/auto-relay.js +0 -302
  341. package/src/circuit/circuit/hop.js +0 -205
  342. package/src/circuit/circuit/stop.js +0 -81
  343. package/src/circuit/circuit/stream-handler.js +0 -94
  344. package/src/circuit/constants.js +0 -12
  345. package/src/circuit/index.js +0 -102
  346. package/src/circuit/multicodec.js +0 -5
  347. package/src/circuit/protocol/index.d.ts +0 -173
  348. package/src/circuit/protocol/index.js +0 -530
  349. package/src/circuit/transport.js +0 -229
  350. package/src/circuit/utils.js +0 -17
  351. package/src/config.js +0 -114
  352. package/src/connection-manager/auto-dialler.js +0 -132
  353. package/src/connection-manager/index.js +0 -363
  354. package/src/connection-manager/latency-monitor.js +0 -264
  355. package/src/constants.js +0 -18
  356. package/src/content-routing/index.js +0 -163
  357. package/src/content-routing/utils.js +0 -89
  358. package/src/dht/dht-content-routing.js +0 -44
  359. package/src/dht/dht-peer-routing.js +0 -51
  360. package/src/dialer/index.js +0 -376
  361. package/src/errors.js +0 -66
  362. package/src/fetch/constants.js +0 -6
  363. package/src/fetch/index.js +0 -159
  364. package/src/fetch/proto.d.ts +0 -134
  365. package/src/fetch/proto.js +0 -333
  366. package/src/get-peer.js +0 -49
  367. package/src/identify/consts.js +0 -15
  368. package/src/identify/index.js +0 -384
  369. package/src/identify/message.d.ts +0 -95
  370. package/src/identify/message.js +0 -328
  371. package/src/index.js +0 -811
  372. package/src/insecure/plaintext.js +0 -95
  373. package/src/insecure/proto.d.ts +0 -128
  374. package/src/insecure/proto.js +0 -371
  375. package/src/keychain/index.js +0 -561
  376. package/src/metrics/index.js +0 -290
  377. package/src/metrics/old-peers.js +0 -16
  378. package/src/metrics/stats.js +0 -270
  379. package/src/metrics/tracked-map.js +0 -94
  380. package/src/nat-manager.js +0 -197
  381. package/src/peer-routing.js +0 -176
  382. package/src/peer-store/README.md +0 -145
  383. package/src/peer-store/address-book.js +0 -382
  384. package/src/peer-store/index.js +0 -121
  385. package/src/peer-store/key-book.js +0 -141
  386. package/src/peer-store/metadata-book.js +0 -250
  387. package/src/peer-store/pb/peer.d.ts +0 -222
  388. package/src/peer-store/pb/peer.js +0 -643
  389. package/src/peer-store/pb/peer.proto +0 -31
  390. package/src/peer-store/proto-book.js +0 -237
  391. package/src/peer-store/store.js +0 -263
  392. package/src/peer-store/types.ts +0 -245
  393. package/src/ping/constants.js +0 -8
  394. package/src/ping/index.js +0 -85
  395. package/src/ping/util.js +0 -18
  396. package/src/pnet/crypto.js +0 -84
  397. package/src/pnet/errors.js +0 -7
  398. package/src/pnet/index.js +0 -86
  399. package/src/pnet/key-generator.js +0 -33
  400. package/src/pubsub-adapter.js +0 -61
  401. package/src/record/README.md +0 -130
  402. package/src/record/envelope/envelope.d.ts +0 -77
  403. package/src/record/envelope/envelope.js +0 -243
  404. package/src/record/envelope/envelope.proto +0 -19
  405. package/src/record/envelope/index.js +0 -183
  406. package/src/record/peer-record/consts.js +0 -14
  407. package/src/record/peer-record/index.js +0 -113
  408. package/src/record/peer-record/peer-record.d.ts +0 -133
  409. package/src/record/peer-record/peer-record.js +0 -367
  410. package/src/record/peer-record/peer-record.proto +0 -18
  411. package/src/record/utils.js +0 -25
  412. package/src/registrar.js +0 -127
  413. package/src/transport-manager.js +0 -269
  414. package/src/types.ts +0 -98
  415. 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,371 @@
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
+ resolvedAddrs.forEach(ra => addrs.push(ra))
248
+ }
249
+
250
+ // Multiaddrs not supported by the available transports will be filtered out.
251
+ const supportedAddrs = addrs.filter(a => this.components.getTransportManager().transportForMultiaddr(a))
252
+
253
+ if (supportedAddrs.length > this.maxAddrsToDial) {
254
+ await this.components.getPeerStore().delete(peer)
255
+ throw errCode(new Error('dial with more addresses than allowed'), codes.ERR_TOO_MANY_ADDRESSES)
256
+ }
257
+
258
+ return {
259
+ id: peer.toString(),
260
+ addrs: supportedAddrs
261
+ }
262
+ }
263
+
264
+ /**
265
+ * Creates a PendingDial that wraps the underlying DialRequest
266
+ */
267
+ _createPendingDial (dialTarget: DialTarget, options: AbortOptions = {}): PendingDial {
268
+ /**
269
+ * @param {Multiaddr} addr
270
+ * @param {{ signal: { aborted: any; }; }} options
271
+ */
272
+ const dialAction: DialAction = async (addr, options = {}) => {
273
+ if (options.signal?.aborted === true) {
274
+ throw errCode(new Error('already aborted'), codes.ERR_ALREADY_ABORTED)
275
+ }
276
+
277
+ return await this.components.getTransportManager().dial(addr, options)
278
+ }
279
+
280
+ const dialRequest = new DialRequest({
281
+ addrs: dialTarget.addrs,
282
+ dialAction,
283
+ dialer: this
284
+ })
285
+
286
+ // Combine the timeout signal and options.signal, if provided
287
+ const timeoutController = new TimeoutController(this.timeout)
288
+
289
+ const signals = [timeoutController.signal]
290
+ ;(options.signal != null) && signals.push(options.signal)
291
+ const signal = anySignal(signals)
292
+
293
+ // this signal will potentially be used while dialing lots of
294
+ // peers so prevent MaxListenersExceededWarning appearing in the console
295
+ try {
296
+ // fails on node < 15.4
297
+ setMaxListeners?.(Infinity, signal)
298
+ } catch {}
299
+
300
+ const pendingDial = {
301
+ dialRequest,
302
+ controller: timeoutController,
303
+ promise: dialRequest.run({ ...options, signal }),
304
+ destroy: () => {
305
+ timeoutController.clear()
306
+ this.pendingDials.delete(dialTarget.id)
307
+ }
308
+ }
309
+ this.pendingDials.set(dialTarget.id, pendingDial)
310
+
311
+ return pendingDial
312
+ }
313
+
314
+ getTokens (num: number) {
315
+ const total = Math.min(num, this.maxDialsPerPeer, this.tokens.length)
316
+ const tokens = this.tokens.splice(0, total)
317
+ log('%d tokens request, returning %d, %d remaining', num, total, this.tokens.length)
318
+ return tokens
319
+ }
320
+
321
+ releaseToken (token: number) {
322
+ // Guard against duplicate releases
323
+ if (this.tokens.includes(token)) {
324
+ return
325
+ }
326
+
327
+ log('token %d released', token)
328
+ this.tokens.push(token)
329
+ }
330
+
331
+ /**
332
+ * Resolve multiaddr recursively
333
+ */
334
+ async _resolve (ma: Multiaddr): Promise<Multiaddr[]> {
335
+ // TODO: recursive logic should live in multiaddr once dns4/dns6 support is in place
336
+ // Now only supporting resolve for dnsaddr
337
+ const resolvableProto = ma.protoNames().includes('dnsaddr')
338
+
339
+ // Multiaddr is not resolvable? End recursion!
340
+ if (!resolvableProto) {
341
+ return [ma]
342
+ }
343
+
344
+ const resolvedMultiaddrs = await this._resolveRecord(ma)
345
+ const recursiveMultiaddrs = await Promise.all(resolvedMultiaddrs.map(async (nm) => {
346
+ return await this._resolve(nm)
347
+ }))
348
+
349
+ const addrs = recursiveMultiaddrs.flat()
350
+ return addrs.reduce<Multiaddr[]>((array, newM) => {
351
+ if (array.find(m => m.equals(newM)) == null) {
352
+ array.push(newM)
353
+ }
354
+ return array
355
+ }, ([]))
356
+ }
357
+
358
+ /**
359
+ * Resolve a given multiaddr. If this fails, an empty array will be returned
360
+ */
361
+ async _resolveRecord (ma: Multiaddr): Promise<Multiaddr[]> {
362
+ try {
363
+ ma = new Multiaddr(ma.toString()) // Use current multiaddr module
364
+ const multiaddrs = await ma.resolve()
365
+ return multiaddrs
366
+ } catch (err) {
367
+ log.error(`multiaddr ${ma.toString()} could not be resolved`, err)
368
+ return []
369
+ }
370
+ }
371
+ }