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,588 @@
1
+ /* eslint max-nested-callbacks: ["error", 5] */
2
+
3
+ import { logger } from '@libp2p/logger'
4
+ import sanitize from 'sanitize-filename'
5
+ import mergeOptions from 'merge-options'
6
+ import { Key } from 'interface-datastore/key'
7
+ import { CMS } from './cms.js'
8
+ import errCode from 'err-code'
9
+ import { codes } from '../errors.js'
10
+ import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
11
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
12
+ import 'node-forge/lib/sha512.js'
13
+ import { generateKeyPair, importKey, unmarshalPrivateKey } from '@libp2p/crypto/keys'
14
+ import type { PeerId } from '@libp2p/interfaces/peer-id'
15
+ import type { Components } from '@libp2p/interfaces/components'
16
+ import { pbkdf2, randomBytes } from '@libp2p/crypto'
17
+
18
+ const log = logger('libp2p:keychain')
19
+
20
+ export interface DekOptions {
21
+ hash: string
22
+ salt: string
23
+ iterationCount: number
24
+ keyLength: number
25
+ }
26
+
27
+ export interface KeyChainInit {
28
+ pass?: string
29
+ dek?: DekOptions
30
+ }
31
+
32
+ /**
33
+ * Information about a key.
34
+ */
35
+ export interface KeyInfo {
36
+ /**
37
+ * The universally unique key id
38
+ */
39
+ id: string
40
+
41
+ /**
42
+ * The local key name.
43
+ */
44
+ name: string
45
+ }
46
+
47
+ const keyPrefix = '/pkcs8/'
48
+ const infoPrefix = '/info/'
49
+ const privates = new WeakMap<object, { dek: string }>()
50
+
51
+ // NIST SP 800-132
52
+ const NIST = {
53
+ minKeyLength: 112 / 8,
54
+ minSaltLength: 128 / 8,
55
+ minIterationCount: 1000
56
+ }
57
+
58
+ const defaultOptions = {
59
+ // See https://cryptosense.com/parametesr-choice-for-pbkdf2/
60
+ dek: {
61
+ keyLength: 512 / 8,
62
+ iterationCount: 10000,
63
+ salt: 'you should override this value with a crypto secure random number',
64
+ hash: 'sha2-512'
65
+ }
66
+ }
67
+
68
+ function validateKeyName (name: string) {
69
+ if (name == null) {
70
+ return false
71
+ }
72
+ if (typeof name !== 'string') {
73
+ return false
74
+ }
75
+ return name === sanitize(name.trim()) && name.length > 0
76
+ }
77
+
78
+ /**
79
+ * Throws an error after a delay
80
+ *
81
+ * This assumes than an error indicates that the keychain is under attack. Delay returning an
82
+ * error to make brute force attacks harder.
83
+ */
84
+ async function randomDelay () {
85
+ const min = 200
86
+ const max = 1000
87
+ const delay = Math.random() * (max - min) + min
88
+
89
+ await new Promise(resolve => setTimeout(resolve, delay))
90
+ }
91
+
92
+ /**
93
+ * Converts a key name into a datastore name
94
+ */
95
+ function DsName (name: string) {
96
+ return new Key(keyPrefix + name)
97
+ }
98
+
99
+ /**
100
+ * Converts a key name into a datastore info name
101
+ */
102
+ function DsInfoName (name: string) {
103
+ return new Key(infoPrefix + name)
104
+ }
105
+
106
+ /**
107
+ * Manages the lifecycle of a key. Keys are encrypted at rest using PKCS #8.
108
+ *
109
+ * A key in the store has two entries
110
+ * - '/info/*key-name*', contains the KeyInfo for the key
111
+ * - '/pkcs8/*key-name*', contains the PKCS #8 for the key
112
+ *
113
+ */
114
+ export class KeyChain {
115
+ private readonly components: Components
116
+ private init: KeyChainInit
117
+
118
+ /**
119
+ * Creates a new instance of a key chain
120
+ */
121
+ constructor (components: Components, init: KeyChainInit) {
122
+ this.components = components
123
+ this.init = mergeOptions(defaultOptions, init)
124
+
125
+ // Enforce NIST SP 800-132
126
+ if (this.init.pass != null && this.init.pass?.length < 20) {
127
+ throw new Error('pass must be least 20 characters')
128
+ }
129
+ if (this.init.dek?.keyLength != null && this.init.dek.keyLength < NIST.minKeyLength) {
130
+ throw new Error(`dek.keyLength must be least ${NIST.minKeyLength} bytes`)
131
+ }
132
+ if (this.init.dek?.salt?.length != null && this.init.dek.salt.length < NIST.minSaltLength) {
133
+ throw new Error(`dek.saltLength must be least ${NIST.minSaltLength} bytes`)
134
+ }
135
+ if (this.init.dek?.iterationCount != null && this.init.dek.iterationCount < NIST.minIterationCount) {
136
+ throw new Error(`dek.iterationCount must be least ${NIST.minIterationCount}`)
137
+ }
138
+
139
+ const dek = this.init.pass != null && this.init.dek?.salt != null
140
+ ? pbkdf2(
141
+ this.init.pass,
142
+ this.init.dek?.salt,
143
+ this.init.dek?.iterationCount,
144
+ this.init.dek?.keyLength,
145
+ this.init.dek?.hash)
146
+ : ''
147
+
148
+ privates.set(this, { dek })
149
+ }
150
+
151
+ /**
152
+ * Gets an object that can encrypt/decrypt protected data
153
+ * using the Cryptographic Message Syntax (CMS).
154
+ *
155
+ * CMS describes an encapsulation syntax for data protection. It
156
+ * is used to digitally sign, digest, authenticate, or encrypt
157
+ * arbitrary message content
158
+ */
159
+ get cms () {
160
+ const cached = privates.get(this)
161
+
162
+ if (cached == null) {
163
+ throw errCode(new Error('dek missing'), codes.ERR_INVALID_PARAMETERS)
164
+ }
165
+
166
+ const dek = cached.dek
167
+
168
+ return new CMS(this, dek)
169
+ }
170
+
171
+ /**
172
+ * Generates the options for a keychain. A random salt is produced.
173
+ *
174
+ * @returns {Object}
175
+ */
176
+ static generateOptions (): KeyChainInit {
177
+ const options = Object.assign({}, defaultOptions)
178
+ const saltLength = Math.ceil(NIST.minSaltLength / 3) * 3 // no base64 padding
179
+ options.dek.salt = uint8ArrayToString(randomBytes(saltLength), 'base64')
180
+ return options
181
+ }
182
+
183
+ /**
184
+ * Gets an object that can encrypt/decrypt protected data.
185
+ * The default options for a keychain.
186
+ *
187
+ * @returns {Object}
188
+ */
189
+ static get options () {
190
+ return defaultOptions
191
+ }
192
+
193
+ /**
194
+ * Create a new key.
195
+ *
196
+ * @param {string} name - The local key name; cannot already exist.
197
+ * @param {string} type - One of the key types; 'rsa'.
198
+ * @param {number} [size = 2048] - The key size in bits. Used for rsa keys only
199
+ */
200
+ async createKey (name: string, type: 'RSA' | 'Ed25519', size = 2048): Promise<KeyInfo> {
201
+ if (!validateKeyName(name) || name === 'self') {
202
+ await randomDelay()
203
+ throw errCode(new Error('Invalid key name'), codes.ERR_INVALID_KEY_NAME)
204
+ }
205
+
206
+ if (typeof type !== 'string') {
207
+ await randomDelay()
208
+ throw errCode(new Error('Invalid key type'), codes.ERR_INVALID_KEY_TYPE)
209
+ }
210
+
211
+ const dsname = DsName(name)
212
+ const exists = await this.components.getDatastore().has(dsname)
213
+ if (exists) {
214
+ await randomDelay()
215
+ throw errCode(new Error('Key name already exists'), codes.ERR_KEY_ALREADY_EXISTS)
216
+ }
217
+
218
+ switch (type.toLowerCase()) {
219
+ case 'rsa':
220
+ if (!Number.isSafeInteger(size) || size < 2048) {
221
+ await randomDelay()
222
+ throw errCode(new Error('Invalid RSA key size'), codes.ERR_INVALID_KEY_SIZE)
223
+ }
224
+ break
225
+ default:
226
+ break
227
+ }
228
+
229
+ let keyInfo
230
+ try {
231
+ const keypair = await generateKeyPair(type, size)
232
+ const kid = await keypair.id()
233
+ const cached = privates.get(this)
234
+
235
+ if (cached == null) {
236
+ throw errCode(new Error('dek missing'), codes.ERR_INVALID_PARAMETERS)
237
+ }
238
+
239
+ const dek = cached.dek
240
+ const pem = await keypair.export(dek)
241
+ keyInfo = {
242
+ name: name,
243
+ id: kid
244
+ }
245
+ const batch = this.components.getDatastore().batch()
246
+ batch.put(dsname, uint8ArrayFromString(pem))
247
+ batch.put(DsInfoName(name), uint8ArrayFromString(JSON.stringify(keyInfo)))
248
+
249
+ await batch.commit()
250
+ } catch (err: any) {
251
+ await randomDelay()
252
+ throw err
253
+ }
254
+
255
+ return keyInfo
256
+ }
257
+
258
+ /**
259
+ * List all the keys.
260
+ *
261
+ * @returns {Promise<KeyInfo[]>}
262
+ */
263
+ async listKeys () {
264
+ const query = {
265
+ prefix: infoPrefix
266
+ }
267
+
268
+ const info = []
269
+ for await (const value of this.components.getDatastore().query(query)) {
270
+ info.push(JSON.parse(uint8ArrayToString(value.value)))
271
+ }
272
+
273
+ return info
274
+ }
275
+
276
+ /**
277
+ * Find a key by it's id
278
+ */
279
+ async findKeyById (id: string): Promise<KeyInfo> {
280
+ try {
281
+ const keys = await this.listKeys()
282
+ return keys.find((k) => k.id === id)
283
+ } catch (err: any) {
284
+ await randomDelay()
285
+ throw err
286
+ }
287
+ }
288
+
289
+ /**
290
+ * Find a key by it's name.
291
+ *
292
+ * @param {string} name - The local key name.
293
+ * @returns {Promise<KeyInfo>}
294
+ */
295
+ async findKeyByName (name: string): Promise<KeyInfo> {
296
+ if (!validateKeyName(name)) {
297
+ await randomDelay()
298
+ throw errCode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME)
299
+ }
300
+
301
+ const dsname = DsInfoName(name)
302
+ try {
303
+ const res = await this.components.getDatastore().get(dsname)
304
+ return JSON.parse(uint8ArrayToString(res))
305
+ } catch (err: any) {
306
+ await randomDelay()
307
+ log.error(err)
308
+ throw errCode(new Error(`Key '${name}' does not exist.`), codes.ERR_KEY_NOT_FOUND)
309
+ }
310
+ }
311
+
312
+ /**
313
+ * Remove an existing key.
314
+ *
315
+ * @param {string} name - The local key name; must already exist.
316
+ * @returns {Promise<KeyInfo>}
317
+ */
318
+ async removeKey (name: string) {
319
+ if (!validateKeyName(name) || name === 'self') {
320
+ await randomDelay()
321
+ throw errCode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME)
322
+ }
323
+ const dsname = DsName(name)
324
+ const keyInfo = await this.findKeyByName(name)
325
+ const batch = this.components.getDatastore().batch()
326
+ batch.delete(dsname)
327
+ batch.delete(DsInfoName(name))
328
+ await batch.commit()
329
+ return keyInfo
330
+ }
331
+
332
+ /**
333
+ * Rename a key
334
+ *
335
+ * @param {string} oldName - The old local key name; must already exist.
336
+ * @param {string} newName - The new local key name; must not already exist.
337
+ * @returns {Promise<KeyInfo>}
338
+ */
339
+ async renameKey (oldName: string, newName: string): Promise<KeyInfo> {
340
+ if (!validateKeyName(oldName) || oldName === 'self') {
341
+ await randomDelay()
342
+ throw errCode(new Error(`Invalid old key name '${oldName}'`), codes.ERR_OLD_KEY_NAME_INVALID)
343
+ }
344
+ if (!validateKeyName(newName) || newName === 'self') {
345
+ await randomDelay()
346
+ throw errCode(new Error(`Invalid new key name '${newName}'`), codes.ERR_NEW_KEY_NAME_INVALID)
347
+ }
348
+ const oldDsname = DsName(oldName)
349
+ const newDsname = DsName(newName)
350
+ const oldInfoName = DsInfoName(oldName)
351
+ const newInfoName = DsInfoName(newName)
352
+
353
+ const exists = await this.components.getDatastore().has(newDsname)
354
+ if (exists) {
355
+ await randomDelay()
356
+ throw errCode(new Error(`Key '${newName}' already exists`), codes.ERR_KEY_ALREADY_EXISTS)
357
+ }
358
+
359
+ try {
360
+ const pem = await this.components.getDatastore().get(oldDsname)
361
+ const res = await this.components.getDatastore().get(oldInfoName)
362
+
363
+ const keyInfo = JSON.parse(uint8ArrayToString(res))
364
+ keyInfo.name = newName
365
+ const batch = this.components.getDatastore().batch()
366
+ batch.put(newDsname, pem)
367
+ batch.put(newInfoName, uint8ArrayFromString(JSON.stringify(keyInfo)))
368
+ batch.delete(oldDsname)
369
+ batch.delete(oldInfoName)
370
+ await batch.commit()
371
+ return keyInfo
372
+ } catch (err: any) {
373
+ await randomDelay()
374
+ throw err
375
+ }
376
+ }
377
+
378
+ /**
379
+ * Export an existing key as a PEM encrypted PKCS #8 string
380
+ */
381
+ async exportKey (name: string, password: string) {
382
+ if (!validateKeyName(name)) {
383
+ await randomDelay()
384
+ throw errCode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME)
385
+ }
386
+ if (password == null) {
387
+ await randomDelay()
388
+ throw errCode(new Error('Password is required'), codes.ERR_PASSWORD_REQUIRED)
389
+ }
390
+
391
+ const dsname = DsName(name)
392
+ try {
393
+ const res = await this.components.getDatastore().get(dsname)
394
+ const pem = uint8ArrayToString(res)
395
+ const cached = privates.get(this)
396
+
397
+ if (cached == null) {
398
+ throw errCode(new Error('dek missing'), codes.ERR_INVALID_PARAMETERS)
399
+ }
400
+
401
+ const dek = cached.dek
402
+ const privateKey = await importKey(pem, dek)
403
+ return await privateKey.export(password)
404
+ } catch (err: any) {
405
+ await randomDelay()
406
+ throw err
407
+ }
408
+ }
409
+
410
+ /**
411
+ * Import a new key from a PEM encoded PKCS #8 string
412
+ *
413
+ * @param {string} name - The local key name; must not already exist.
414
+ * @param {string} pem - The PEM encoded PKCS #8 string
415
+ * @param {string} password - The password.
416
+ * @returns {Promise<KeyInfo>}
417
+ */
418
+ async importKey (name: string, pem: string, password: string): Promise<KeyInfo> {
419
+ if (!validateKeyName(name) || name === 'self') {
420
+ await randomDelay()
421
+ throw errCode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME)
422
+ }
423
+ if (pem == null) {
424
+ await randomDelay()
425
+ throw errCode(new Error('PEM encoded key is required'), codes.ERR_PEM_REQUIRED)
426
+ }
427
+ const dsname = DsName(name)
428
+ const exists = await this.components.getDatastore().has(dsname)
429
+ if (exists) {
430
+ await randomDelay()
431
+ throw errCode(new Error(`Key '${name}' already exists`), codes.ERR_KEY_ALREADY_EXISTS)
432
+ }
433
+
434
+ let privateKey
435
+ try {
436
+ privateKey = await importKey(pem, password)
437
+ } catch (err: any) {
438
+ await randomDelay()
439
+ throw errCode(new Error('Cannot read the key, most likely the password is wrong'), codes.ERR_CANNOT_READ_KEY)
440
+ }
441
+
442
+ let kid
443
+ try {
444
+ kid = await privateKey.id()
445
+ const cached = privates.get(this)
446
+
447
+ if (cached == null) {
448
+ throw errCode(new Error('dek missing'), codes.ERR_INVALID_PARAMETERS)
449
+ }
450
+
451
+ const dek = cached.dek
452
+ pem = await privateKey.export(dek)
453
+ } catch (err: any) {
454
+ await randomDelay()
455
+ throw err
456
+ }
457
+
458
+ const keyInfo = {
459
+ name: name,
460
+ id: kid
461
+ }
462
+ const batch = this.components.getDatastore().batch()
463
+ batch.put(dsname, uint8ArrayFromString(pem))
464
+ batch.put(DsInfoName(name), uint8ArrayFromString(JSON.stringify(keyInfo)))
465
+ await batch.commit()
466
+
467
+ return keyInfo
468
+ }
469
+
470
+ /**
471
+ * Import a peer key
472
+ */
473
+ async importPeer (name: string, peer: PeerId): Promise<KeyInfo> {
474
+ try {
475
+ if (!validateKeyName(name)) {
476
+ throw errCode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME)
477
+ }
478
+ if (peer == null || peer.privateKey == null) {
479
+ throw errCode(new Error('Peer.privKey is required'), codes.ERR_MISSING_PRIVATE_KEY)
480
+ }
481
+
482
+ const privateKey = await unmarshalPrivateKey(peer.privateKey)
483
+
484
+ const dsname = DsName(name)
485
+ const exists = await this.components.getDatastore().has(dsname)
486
+ if (exists) {
487
+ await randomDelay()
488
+ throw errCode(new Error(`Key '${name}' already exists`), codes.ERR_KEY_ALREADY_EXISTS)
489
+ }
490
+
491
+ const cached = privates.get(this)
492
+
493
+ if (cached == null) {
494
+ throw errCode(new Error('dek missing'), codes.ERR_INVALID_PARAMETERS)
495
+ }
496
+
497
+ const dek = cached.dek
498
+ const pem = await privateKey.export(dek)
499
+ const keyInfo: KeyInfo = {
500
+ name: name,
501
+ id: peer.toString()
502
+ }
503
+ const batch = this.components.getDatastore().batch()
504
+ batch.put(dsname, uint8ArrayFromString(pem))
505
+ batch.put(DsInfoName(name), uint8ArrayFromString(JSON.stringify(keyInfo)))
506
+ await batch.commit()
507
+ return keyInfo
508
+ } catch (err: any) {
509
+ await randomDelay()
510
+ throw err
511
+ }
512
+ }
513
+
514
+ /**
515
+ * Gets the private key as PEM encoded PKCS #8 string
516
+ */
517
+ async getPrivateKey (name: string): Promise<string> {
518
+ if (!validateKeyName(name)) {
519
+ await randomDelay()
520
+ throw errCode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME)
521
+ }
522
+
523
+ try {
524
+ const dsname = DsName(name)
525
+ const res = await this.components.getDatastore().get(dsname)
526
+ return uint8ArrayToString(res)
527
+ } catch (err: any) {
528
+ await randomDelay()
529
+ log.error(err)
530
+ throw errCode(new Error(`Key '${name}' does not exist.`), codes.ERR_KEY_NOT_FOUND)
531
+ }
532
+ }
533
+
534
+ /**
535
+ * Rotate keychain password and re-encrypt all associated keys
536
+ */
537
+ async rotateKeychainPass (oldPass: string, newPass: string) {
538
+ if (typeof oldPass !== 'string') {
539
+ await randomDelay()
540
+ throw errCode(new Error(`Invalid old pass type '${typeof oldPass}'`), codes.ERR_INVALID_OLD_PASS_TYPE)
541
+ }
542
+ if (typeof newPass !== 'string') {
543
+ await randomDelay()
544
+ throw errCode(new Error(`Invalid new pass type '${typeof newPass}'`), codes.ERR_INVALID_NEW_PASS_TYPE)
545
+ }
546
+ if (newPass.length < 20) {
547
+ await randomDelay()
548
+ throw errCode(new Error(`Invalid pass length ${newPass.length}`), codes.ERR_INVALID_PASS_LENGTH)
549
+ }
550
+ log('recreating keychain')
551
+ const cached = privates.get(this)
552
+
553
+ if (cached == null) {
554
+ throw errCode(new Error('dek missing'), codes.ERR_INVALID_PARAMETERS)
555
+ }
556
+
557
+ const oldDek = cached.dek
558
+ this.init.pass = newPass
559
+ const newDek = newPass != null && this.init.dek?.salt != null
560
+ ? pbkdf2(
561
+ newPass,
562
+ this.init.dek.salt,
563
+ this.init.dek?.iterationCount,
564
+ this.init.dek?.keyLength,
565
+ this.init.dek?.hash)
566
+ : ''
567
+ privates.set(this, { dek: newDek })
568
+ const keys = await this.listKeys()
569
+ for (const key of keys) {
570
+ const res = await this.components.getDatastore().get(DsName(key.name))
571
+ const pem = uint8ArrayToString(res)
572
+ const privateKey = await importKey(pem, oldDek)
573
+ const password = newDek.toString()
574
+ const keyAsPEM = await privateKey.export(password)
575
+
576
+ // Update stored key
577
+ const batch = this.components.getDatastore().batch()
578
+ const keyInfo = {
579
+ name: key.name,
580
+ id: key.id
581
+ }
582
+ batch.put(DsName(key.name), uint8ArrayFromString(keyAsPEM))
583
+ batch.put(DsInfoName(key.name), uint8ArrayFromString(JSON.stringify(keyInfo)))
584
+ await batch.commit()
585
+ }
586
+ log('keychain reconstructed')
587
+ }
588
+ }
@@ -1,8 +1,7 @@
1
- // @ts-nocheck
2
- 'use strict'
1
+ import 'node-forge/lib/x509.js'
2
+ // @ts-expect-error types are missing
3
+ import forge from 'node-forge/lib/forge.js'
3
4
 
4
- require('node-forge/lib/x509')
5
- const forge = require('node-forge/lib/forge')
6
5
  const pki = forge.pki
7
6
 
8
7
  /**
@@ -11,19 +10,15 @@ const pki = forge.pki
11
10
  * The output Uint8Array contains the PKCS #7 message in DER.
12
11
  *
13
12
  * TODO: move to libp2p-crypto package
14
- *
15
- * @param {KeyInfo} key - The id and name of the key
16
- * @param {RsaPrivateKey} privateKey - The naked key
17
- * @returns {Uint8Array}
18
13
  */
19
- const certificateForKey = (key, privateKey) => {
20
- const publicKey = pki.setRsaPublicKey(privateKey.n, privateKey.e)
14
+ export const certificateForKey = (key: any, privateKey: forge.pki.rsa.PrivateKey) => {
15
+ const publicKey = pki.rsa.setPublicKey(privateKey.n, privateKey.e)
21
16
  const cert = pki.createCertificate()
22
17
  cert.publicKey = publicKey
23
18
  cert.serialNumber = '01'
24
19
  cert.validity.notBefore = new Date()
25
20
  cert.validity.notAfter = new Date()
26
- cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 10)
21
+ cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 10) // eslint-disable-line @typescript-eslint/restrict-plus-operands
27
22
  const attrs = [{
28
23
  name: 'organizationName',
29
24
  value: 'ipfs'
@@ -79,14 +74,9 @@ const certificateForKey = (key, privateKey) => {
79
74
  * @param {Array} array
80
75
  * @param {function(*)} asyncCompare - An async function that returns a boolean
81
76
  */
82
- async function findAsync (array, asyncCompare) {
77
+ export async function findAsync <T> (array: T[], asyncCompare: (val: T) => Promise<any>) {
83
78
  const promises = array.map(asyncCompare)
84
79
  const results = await Promise.all(promises)
85
80
  const index = results.findIndex(result => result)
86
81
  return array[index]
87
82
  }
88
-
89
- module.exports = {
90
- certificateForKey,
91
- findAsync
92
- }