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,284 @@
1
+ import { logger } from '@libp2p/logger'
2
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
3
+ import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
4
+ import { RELAY_CODEC } from './multicodec.js'
5
+ import { canHop } from './circuit/hop.js'
6
+ import { namespaceToCid } from './utils.js'
7
+ import {
8
+ CIRCUIT_PROTO_CODE,
9
+ HOP_METADATA_KEY,
10
+ HOP_METADATA_VALUE,
11
+ RELAY_RENDEZVOUS_NS
12
+ } from './constants.js'
13
+ import type { PeerId } from '@libp2p/interfaces/peer-id'
14
+ import type { AddressSorter, PeerProtocolsChangeData } from '@libp2p/interfaces/peer-store'
15
+ import type { Connection } from '@libp2p/interfaces/connection'
16
+ import type { Components } from '@libp2p/interfaces/components'
17
+ import sort from 'it-sort'
18
+ import all from 'it-all'
19
+ import { pipe } from 'it-pipe'
20
+ import { publicAddressesFirst } from '@libp2p/utils/address-sort'
21
+
22
+ const log = logger('libp2p:auto-relay')
23
+
24
+ const noop = () => {}
25
+
26
+ export interface AutoRelayInit {
27
+ addressSorter?: AddressSorter
28
+ maxListeners?: number
29
+ onError?: (error: Error, msg?: string) => void
30
+ }
31
+
32
+ export class AutoRelay {
33
+ private readonly components: Components
34
+ private readonly addressSorter: AddressSorter
35
+ private readonly maxListeners: number
36
+ private readonly listenRelays: Set<string>
37
+ private readonly onError: (error: Error, msg?: string) => void
38
+
39
+ constructor (components: Components, init: AutoRelayInit) {
40
+ this.components = components
41
+ this.addressSorter = init.addressSorter ?? publicAddressesFirst
42
+ this.maxListeners = init.maxListeners ?? 1
43
+ this.listenRelays = new Set()
44
+ this.onError = init.onError ?? noop
45
+
46
+ this._onProtocolChange = this._onProtocolChange.bind(this)
47
+ this._onPeerDisconnected = this._onPeerDisconnected.bind(this)
48
+
49
+ this.components.getPeerStore().addEventListener('change:protocols', (evt) => {
50
+ void this._onProtocolChange(evt).catch(err => {
51
+ log.error(err)
52
+ })
53
+ })
54
+ this.components.getConnectionManager().addEventListener('peer:disconnect', this._onPeerDisconnected)
55
+ }
56
+
57
+ /**
58
+ * Check if a peer supports the relay protocol.
59
+ * If the protocol is not supported, check if it was supported before and remove it as a listen relay.
60
+ * If the protocol is supported, check if the peer supports **HOP** and add it as a listener if
61
+ * inside the threshold.
62
+ */
63
+ async _onProtocolChange (evt: CustomEvent<PeerProtocolsChangeData>) {
64
+ const {
65
+ peerId,
66
+ protocols
67
+ } = evt.detail
68
+ const id = peerId.toString()
69
+
70
+ // Check if it has the protocol
71
+ const hasProtocol = protocols.find(protocol => protocol === RELAY_CODEC)
72
+
73
+ // If no protocol, check if we were keeping the peer before as a listenRelay
74
+ if (hasProtocol == null) {
75
+ if (this.listenRelays.has(id)) {
76
+ await this._removeListenRelay(id)
77
+ }
78
+
79
+ return
80
+ }
81
+
82
+ if (this.listenRelays.has(id)) {
83
+ return
84
+ }
85
+
86
+ // If protocol, check if can hop, store info in the metadataBook and listen on it
87
+ try {
88
+ const connection = this.components.getConnectionManager().getConnection(peerId)
89
+
90
+ if (connection == null) {
91
+ return
92
+ }
93
+
94
+ // Do not hop on a relayed connection
95
+ if (connection.remoteAddr.protoCodes().includes(CIRCUIT_PROTO_CODE)) {
96
+ log(`relayed connection to ${id} will not be used to hop on`)
97
+ return
98
+ }
99
+
100
+ const supportsHop = await canHop({ connection })
101
+
102
+ if (supportsHop) {
103
+ await this.components.getPeerStore().metadataBook.setValue(peerId, HOP_METADATA_KEY, uint8ArrayFromString(HOP_METADATA_VALUE))
104
+ await this._addListenRelay(connection, id)
105
+ }
106
+ } catch (err: any) {
107
+ this.onError(err)
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Peer disconnects
113
+ */
114
+ _onPeerDisconnected (evt: CustomEvent<Connection>) {
115
+ const connection = evt.detail
116
+ const peerId = connection.remotePeer
117
+ const id = peerId.toString()
118
+
119
+ // Not listening on this relay
120
+ if (!this.listenRelays.has(id)) {
121
+ return
122
+ }
123
+
124
+ this._removeListenRelay(id).catch(err => {
125
+ log.error(err)
126
+ })
127
+ }
128
+
129
+ /**
130
+ * Attempt to listen on the given relay connection
131
+ */
132
+ async _addListenRelay (connection: Connection, id: string): Promise<void> {
133
+ try {
134
+ // Check if already listening on enough relays
135
+ if (this.listenRelays.size >= this.maxListeners) {
136
+ return
137
+ }
138
+
139
+ // Get peer known addresses and sort them with public addresses first
140
+ const remoteAddrs = await pipe(
141
+ await this.components.getPeerStore().addressBook.get(connection.remotePeer),
142
+ (source) => sort(source, this.addressSorter),
143
+ async (source) => await all(source)
144
+ )
145
+
146
+ // Attempt to listen on relay
147
+ const result = await Promise.all(
148
+ remoteAddrs.map(async addr => {
149
+ try {
150
+ let multiaddr = addr.multiaddr
151
+
152
+ if (multiaddr.getPeerId() == null) {
153
+ multiaddr = multiaddr.encapsulate(`/p2p/${connection.remotePeer.toString()}`)
154
+ }
155
+
156
+ multiaddr = multiaddr.encapsulate('/p2p-circuit')
157
+
158
+ // Announce multiaddrs will update on listen success by TransportManager event being triggered
159
+ await this.components.getTransportManager().listen([multiaddr])
160
+ return true
161
+ } catch (err: any) {
162
+ log.error('error listening on circuit address', err)
163
+ this.onError(err)
164
+ }
165
+
166
+ return false
167
+ })
168
+ )
169
+
170
+ if (result.includes(true)) {
171
+ this.listenRelays.add(id)
172
+ }
173
+ } catch (err: any) {
174
+ this.onError(err)
175
+ this.listenRelays.delete(id)
176
+ }
177
+ }
178
+
179
+ /**
180
+ * Remove listen relay
181
+ */
182
+ async _removeListenRelay (id: string) {
183
+ if (this.listenRelays.delete(id)) {
184
+ // TODO: this should be responsibility of the connMgr
185
+ await this._listenOnAvailableHopRelays([id])
186
+ }
187
+ }
188
+
189
+ /**
190
+ * Try to listen on available hop relay connections.
191
+ * The following order will happen while we do not have enough relays.
192
+ * 1. Check the metadata store for known relays, try to listen on the ones we are already connected.
193
+ * 2. Dial and try to listen on the peers we know that support hop but are not connected.
194
+ * 3. Search the network.
195
+ */
196
+ async _listenOnAvailableHopRelays (peersToIgnore: string[] = []) {
197
+ // TODO: The peer redial issue on disconnect should be handled by connection gating
198
+ // Check if already listening on enough relays
199
+ if (this.listenRelays.size >= this.maxListeners) {
200
+ return
201
+ }
202
+
203
+ const knownHopsToDial = []
204
+ const peers = await this.components.getPeerStore().all()
205
+
206
+ // Check if we have known hop peers to use and attempt to listen on the already connected
207
+ for (const { id, metadata } of peers) {
208
+ const idStr = id.toString()
209
+
210
+ // Continue to next if listening on this or peer to ignore
211
+ if (this.listenRelays.has(idStr)) {
212
+ continue
213
+ }
214
+
215
+ if (peersToIgnore.includes(idStr)) {
216
+ continue
217
+ }
218
+
219
+ const supportsHop = metadata.get(HOP_METADATA_KEY)
220
+
221
+ // Continue to next if it does not support Hop
222
+ if ((supportsHop == null) || uint8ArrayToString(supportsHop) !== HOP_METADATA_VALUE) {
223
+ continue
224
+ }
225
+
226
+ const connection = this.components.getConnectionManager().getConnection(id)
227
+
228
+ // If not connected, store for possible later use.
229
+ if (connection == null) {
230
+ knownHopsToDial.push(id)
231
+ continue
232
+ }
233
+
234
+ await this._addListenRelay(connection, idStr)
235
+
236
+ // Check if already listening on enough relays
237
+ if (this.listenRelays.size >= this.maxListeners) {
238
+ return
239
+ }
240
+ }
241
+
242
+ // Try to listen on known peers that are not connected
243
+ for (const peerId of knownHopsToDial) {
244
+ await this._tryToListenOnRelay(peerId)
245
+
246
+ // Check if already listening on enough relays
247
+ if (this.listenRelays.size >= this.maxListeners) {
248
+ return
249
+ }
250
+ }
251
+
252
+ // Try to find relays to hop on the network
253
+ try {
254
+ const cid = await namespaceToCid(RELAY_RENDEZVOUS_NS)
255
+ for await (const provider of this.components.getContentRouting().findProviders(cid)) {
256
+ if (provider.multiaddrs.length === 0) {
257
+ continue
258
+ }
259
+
260
+ const peerId = provider.id
261
+ await this.components.getPeerStore().addressBook.add(peerId, provider.multiaddrs)
262
+
263
+ await this._tryToListenOnRelay(peerId)
264
+
265
+ // Check if already listening on enough relays
266
+ if (this.listenRelays.size >= this.maxListeners) {
267
+ return
268
+ }
269
+ }
270
+ } catch (err: any) {
271
+ this.onError(err)
272
+ }
273
+ }
274
+
275
+ async _tryToListenOnRelay (peerId: PeerId) {
276
+ try {
277
+ const connection = await this.components.getDialer().dial(peerId)
278
+ await this._addListenRelay(connection, peerId.toString())
279
+ } catch (err: any) {
280
+ log.error('Could not use %p as relay', peerId, err)
281
+ this.onError(err, `could not connect and listen on known hop relay ${peerId.toString()}`)
282
+ }
283
+ }
284
+ }
@@ -0,0 +1,211 @@
1
+ import { logger } from '@libp2p/logger'
2
+ import errCode from 'err-code'
3
+ import { validateAddrs } from './utils.js'
4
+ import { StreamHandler } from './stream-handler.js'
5
+ import { CircuitRelay as CircuitPB, ICircuitRelay } from '../pb/index.js'
6
+ import { pipe } from 'it-pipe'
7
+ import { codes as Errors } from '../../errors.js'
8
+ import { stop } from './stop.js'
9
+ import { RELAY_CODEC } from '../multicodec.js'
10
+ import type { Connection } from '@libp2p/interfaces/connection'
11
+ import { peerIdFromBytes } from '@libp2p/peer-id'
12
+ import type { Duplex } from 'it-stream-types'
13
+ import type { Circuit } from '../transport.js'
14
+ import type { ConnectionManager } from '@libp2p/interfaces/registrar'
15
+
16
+ const log = logger('libp2p:circuit:hop')
17
+
18
+ export interface HopRequest {
19
+ connection: Connection
20
+ request: ICircuitRelay
21
+ streamHandler: StreamHandler
22
+ circuit: Circuit
23
+ connectionManager: ConnectionManager
24
+ }
25
+
26
+ export async function handleHop (hopRequest: HopRequest) {
27
+ const {
28
+ connection,
29
+ request,
30
+ streamHandler,
31
+ circuit,
32
+ connectionManager
33
+ } = hopRequest
34
+
35
+ // Ensure hop is enabled
36
+ if (!circuit.hopEnabled()) {
37
+ log('HOP request received but we are not acting as a relay')
38
+ return streamHandler.end({
39
+ type: CircuitPB.Type.STATUS,
40
+ code: CircuitPB.Status.HOP_CANT_SPEAK_RELAY
41
+ })
42
+ }
43
+
44
+ // Validate the HOP request has the required input
45
+ try {
46
+ validateAddrs(request, streamHandler)
47
+ } catch (err: any) {
48
+ log.error('invalid hop request via peer %p %o', connection.remotePeer, err)
49
+
50
+ return
51
+ }
52
+
53
+ if (request.dstPeer == null) {
54
+ log('HOP request received but we do not receive a dstPeer')
55
+ return
56
+ }
57
+
58
+ // Get the connection to the destination (stop) peer
59
+ const destinationPeer = peerIdFromBytes(request.dstPeer.id)
60
+
61
+ const destinationConnection = connectionManager.getConnection(destinationPeer)
62
+ if (destinationConnection == null && !circuit.hopActive()) {
63
+ log('HOP request received but we are not connected to the destination peer')
64
+ return streamHandler.end({
65
+ type: CircuitPB.Type.STATUS,
66
+ code: CircuitPB.Status.HOP_NO_CONN_TO_DST
67
+ })
68
+ }
69
+
70
+ // TODO: Handle being an active relay
71
+ if (destinationConnection == null) {
72
+ log('did not have connection to remote peer')
73
+ return streamHandler.end({
74
+ type: CircuitPB.Type.STATUS,
75
+ code: CircuitPB.Status.HOP_NO_CONN_TO_DST
76
+ })
77
+ }
78
+
79
+ // Handle the incoming HOP request by performing a STOP request
80
+ const stopRequest = {
81
+ type: CircuitPB.Type.STOP,
82
+ dstPeer: request.dstPeer,
83
+ srcPeer: request.srcPeer
84
+ }
85
+
86
+ let destinationStream: Duplex<Uint8Array>
87
+ try {
88
+ log('performing STOP request')
89
+ const result = await stop({
90
+ connection: destinationConnection,
91
+ request: stopRequest
92
+ })
93
+
94
+ if (result == null) {
95
+ throw new Error('Could not stop')
96
+ }
97
+
98
+ destinationStream = result
99
+ } catch (err: any) {
100
+ log.error(err)
101
+
102
+ return
103
+ }
104
+
105
+ log('hop request from %p is valid', connection.remotePeer)
106
+ streamHandler.write({
107
+ type: CircuitPB.Type.STATUS,
108
+ code: CircuitPB.Status.SUCCESS
109
+ })
110
+ const sourceStream = streamHandler.rest()
111
+
112
+ log('creating related connections')
113
+ // Short circuit the two streams to create the relayed connection
114
+ return await pipe(
115
+ sourceStream,
116
+ destinationStream,
117
+ sourceStream
118
+ )
119
+ }
120
+
121
+ export interface HopConfig {
122
+ connection: Connection
123
+ request: ICircuitRelay
124
+ }
125
+
126
+ /**
127
+ * Performs a HOP request to a relay peer, to request a connection to another
128
+ * peer. A new, virtual, connection will be created between the two via the relay.
129
+ */
130
+ export async function hop (options: HopConfig): Promise<Duplex<Uint8Array>> {
131
+ const {
132
+ connection,
133
+ request
134
+ } = options
135
+
136
+ // Create a new stream to the relay
137
+ const { stream } = await connection.newStream(RELAY_CODEC)
138
+ // Send the HOP request
139
+ const streamHandler = new StreamHandler({ stream })
140
+ streamHandler.write(request)
141
+
142
+ const response = await streamHandler.read()
143
+
144
+ if (response == null) {
145
+ throw errCode(new Error('HOP request had no response'), Errors.ERR_HOP_REQUEST_FAILED)
146
+ }
147
+
148
+ if (response.code === CircuitPB.Status.SUCCESS) {
149
+ log('hop request was successful')
150
+ return streamHandler.rest()
151
+ }
152
+
153
+ log('hop request failed with code %d, closing stream', response.code)
154
+ streamHandler.close()
155
+
156
+ throw errCode(new Error(`HOP request failed with code ${response.code}`), Errors.ERR_HOP_REQUEST_FAILED)
157
+ }
158
+
159
+ export interface CanHopOptions {
160
+ connection: Connection
161
+ }
162
+
163
+ /**
164
+ * Performs a CAN_HOP request to a relay peer, in order to understand its capabilities
165
+ */
166
+ export async function canHop (options: CanHopOptions) {
167
+ const {
168
+ connection
169
+ } = options
170
+
171
+ // Create a new stream to the relay
172
+ const { stream } = await connection.newStream(RELAY_CODEC)
173
+
174
+ // Send the HOP request
175
+ const streamHandler = new StreamHandler({ stream })
176
+ streamHandler.write({
177
+ type: CircuitPB.Type.CAN_HOP
178
+ })
179
+
180
+ const response = await streamHandler.read()
181
+ await streamHandler.close()
182
+
183
+ if (response == null || response.code !== CircuitPB.Status.SUCCESS) {
184
+ return false
185
+ }
186
+
187
+ return true
188
+ }
189
+
190
+ export interface HandleCanHopOptions {
191
+ connection: Connection
192
+ streamHandler: StreamHandler
193
+ circuit: Circuit
194
+ }
195
+
196
+ /**
197
+ * Creates an unencoded CAN_HOP response based on the Circuits configuration
198
+ */
199
+ export function handleCanHop (options: HandleCanHopOptions) {
200
+ const {
201
+ connection,
202
+ streamHandler,
203
+ circuit
204
+ } = options
205
+ const canHop = circuit.hopEnabled()
206
+ log('can hop (%s) request from %p', canHop, connection.remotePeer)
207
+ streamHandler.end({
208
+ type: CircuitPB.Type.STATUS,
209
+ code: canHop ? CircuitPB.Status.SUCCESS : CircuitPB.Status.HOP_CANT_SPEAK_RELAY
210
+ })
211
+ }
@@ -0,0 +1,78 @@
1
+ import { logger } from '@libp2p/logger'
2
+ import { CircuitRelay as CircuitPB, ICircuitRelay } from '../pb/index.js'
3
+ import { RELAY_CODEC } from '../multicodec.js'
4
+ import { StreamHandler } from './stream-handler.js'
5
+ import { validateAddrs } from './utils.js'
6
+ import type { Connection } from '@libp2p/interfaces/connection'
7
+ import type { Duplex } from 'it-stream-types'
8
+
9
+ const log = logger('libp2p:circuit:stop')
10
+
11
+ export interface HandleStopOptions {
12
+ connection: Connection
13
+ request: ICircuitRelay
14
+ streamHandler: StreamHandler
15
+ }
16
+
17
+ /**
18
+ * Handles incoming STOP requests
19
+ */
20
+ export function handleStop (options: HandleStopOptions): Duplex<Uint8Array> | undefined {
21
+ const {
22
+ connection,
23
+ request,
24
+ streamHandler
25
+ } = options
26
+
27
+ // Validate the STOP request has the required input
28
+ try {
29
+ validateAddrs(request, streamHandler)
30
+ } catch (err: any) {
31
+ log.error('invalid stop request via peer %p %o', connection.remotePeer, err)
32
+ return
33
+ }
34
+
35
+ // The request is valid
36
+ log('stop request is valid')
37
+ streamHandler.write({
38
+ type: CircuitPB.Type.STATUS,
39
+ code: CircuitPB.Status.SUCCESS
40
+ })
41
+
42
+ return streamHandler.rest()
43
+ }
44
+
45
+ export interface StopOptions {
46
+ connection: Connection
47
+ request: ICircuitRelay
48
+ }
49
+
50
+ /**
51
+ * Creates a STOP request
52
+ */
53
+ export async function stop (options: StopOptions) {
54
+ const {
55
+ connection,
56
+ request
57
+ } = options
58
+
59
+ const { stream } = await connection.newStream([RELAY_CODEC])
60
+ log('starting stop request to %p', connection.remotePeer)
61
+ const streamHandler = new StreamHandler({ stream })
62
+
63
+ streamHandler.write(request)
64
+ const response = await streamHandler.read()
65
+
66
+ if (response == null) {
67
+ streamHandler.close()
68
+ return
69
+ }
70
+
71
+ if (response.code === CircuitPB.Status.SUCCESS) {
72
+ log('stop request to %p was successful', connection.remotePeer)
73
+ return streamHandler.rest()
74
+ }
75
+
76
+ log('stop request failed with code %d', response.code)
77
+ streamHandler.close()
78
+ }
@@ -0,0 +1,87 @@
1
+ import { logger } from '@libp2p/logger'
2
+ import * as lp from 'it-length-prefixed'
3
+ import { Handshake, handshake } from 'it-handshake'
4
+ import { CircuitRelay, ICircuitRelay } from '../pb/index.js'
5
+ import type { Stream } from '@libp2p/interfaces/connection'
6
+ import type { Source } from 'it-stream-types'
7
+
8
+ const log = logger('libp2p:circuit:stream-handler')
9
+
10
+ export interface StreamHandlerOptions {
11
+ /**
12
+ * A duplex iterable
13
+ */
14
+ stream: Stream
15
+
16
+ /**
17
+ * max bytes length of message
18
+ */
19
+ maxLength?: number
20
+ }
21
+
22
+ export class StreamHandler {
23
+ private readonly stream: Stream
24
+ private readonly shake: Handshake
25
+ private readonly decoder: Source<Uint8Array>
26
+
27
+ constructor (options: StreamHandlerOptions) {
28
+ const { stream, maxLength = 4096 } = options
29
+
30
+ this.stream = stream
31
+ this.shake = handshake(this.stream)
32
+ this.decoder = lp.decode.fromReader(this.shake.reader, { maxDataLength: maxLength })
33
+ }
34
+
35
+ /**
36
+ * Read and decode message
37
+ */
38
+ async read () {
39
+ // @ts-expect-error FIXME is a source, needs to be a generator
40
+ const msg = await this.decoder.next()
41
+
42
+ if (msg.value != null) {
43
+ const value = CircuitRelay.decode(msg.value.slice())
44
+ log('read message type', value.type)
45
+ return value
46
+ }
47
+
48
+ log('read received no value, closing stream')
49
+ // End the stream, we didn't get data
50
+ this.close()
51
+ }
52
+
53
+ /**
54
+ * Encode and write array of buffers
55
+ */
56
+ write (msg: ICircuitRelay) {
57
+ log('write message type %s', msg.type)
58
+ // @ts-expect-error lp.encode expects type type 'Buffer | BufferList', not 'Uint8Array'
59
+ this.shake.write(lp.encode.single(CircuitRelay.encode(msg).finish()))
60
+ }
61
+
62
+ /**
63
+ * Return the handshake rest stream and invalidate handler
64
+ */
65
+ rest () {
66
+ this.shake.rest()
67
+ return this.shake.stream
68
+ }
69
+
70
+ /**
71
+ * @param {ICircuitRelay} msg - An unencoded CircuitRelay protobuf message
72
+ */
73
+ end (msg: ICircuitRelay) {
74
+ this.write(msg)
75
+ this.close()
76
+ }
77
+
78
+ /**
79
+ * Close the stream
80
+ */
81
+ close () {
82
+ log('closing the stream')
83
+ void this.rest().sink([]).catch(err => {
84
+ log.error(err)
85
+ })
86
+ }
87
+ }