libp2p 0.36.2 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/LICENSE +3 -21
  2. package/README.md +13 -10
  3. package/dist/src/address-manager/index.d.ts +34 -52
  4. package/dist/src/address-manager/index.d.ts.map +1 -1
  5. package/dist/src/address-manager/index.js +81 -0
  6. package/dist/src/address-manager/index.js.map +1 -0
  7. package/dist/src/circuit/auto-relay.d.ts +24 -85
  8. package/dist/src/circuit/auto-relay.d.ts.map +1 -1
  9. package/dist/src/circuit/auto-relay.js +216 -0
  10. package/dist/src/circuit/auto-relay.js.map +1 -0
  11. package/dist/src/circuit/circuit/hop.d.ts +26 -53
  12. package/dist/src/circuit/circuit/hop.d.ts.map +1 -1
  13. package/dist/src/circuit/circuit/hop.js +138 -0
  14. package/dist/src/circuit/circuit/hop.js.map +1 -0
  15. package/dist/src/circuit/circuit/stop.d.ts +18 -10
  16. package/dist/src/circuit/circuit/stop.d.ts.map +1 -1
  17. package/dist/src/circuit/circuit/stop.js +49 -0
  18. package/dist/src/circuit/circuit/stop.js.map +1 -0
  19. package/dist/src/circuit/circuit/stream-handler.d.ts +19 -38
  20. package/dist/src/circuit/circuit/stream-handler.d.ts.map +1 -1
  21. package/dist/src/circuit/circuit/stream-handler.js +59 -0
  22. package/dist/src/circuit/circuit/stream-handler.js.map +1 -0
  23. package/dist/src/circuit/circuit/utils.d.ts +3 -6
  24. package/dist/src/circuit/circuit/utils.d.ts.map +1 -1
  25. package/dist/src/circuit/circuit/utils.js +43 -0
  26. package/dist/src/circuit/circuit/utils.js.map +1 -0
  27. package/dist/src/circuit/constants.d.ts +24 -6
  28. package/dist/src/circuit/constants.d.ts.map +1 -1
  29. package/dist/src/circuit/constants.js +26 -0
  30. package/dist/src/circuit/constants.js.map +1 -0
  31. package/dist/src/circuit/index.d.ts +41 -74
  32. package/dist/src/circuit/index.d.ts.map +1 -1
  33. package/dist/src/circuit/index.js +69 -0
  34. package/dist/src/circuit/index.js.map +1 -0
  35. package/dist/src/circuit/listener.d.ts +8 -3
  36. package/dist/src/circuit/listener.d.ts.map +1 -1
  37. package/dist/src/circuit/listener.js +62 -0
  38. package/dist/src/circuit/listener.js.map +1 -0
  39. package/dist/src/circuit/multicodec.d.ts +1 -1
  40. package/dist/src/circuit/multicodec.d.ts.map +1 -1
  41. package/dist/src/circuit/multicodec.js +2 -0
  42. package/dist/src/circuit/multicodec.js.map +1 -0
  43. package/dist/src/circuit/pb/index.d.ts +52 -0
  44. package/dist/src/circuit/pb/index.d.ts.map +1 -0
  45. package/dist/src/circuit/pb/index.js +98 -0
  46. package/dist/src/circuit/pb/index.js.map +1 -0
  47. package/dist/src/circuit/transport.d.ts +18 -78
  48. package/dist/src/circuit/transport.d.ts.map +1 -1
  49. package/dist/src/circuit/transport.js +192 -0
  50. package/dist/src/circuit/transport.js.map +1 -0
  51. package/dist/src/circuit/utils.d.ts +5 -2
  52. package/dist/src/circuit/utils.d.ts.map +1 -1
  53. package/dist/src/circuit/utils.js +11 -0
  54. package/dist/src/circuit/utils.js.map +1 -0
  55. package/dist/src/config.d.ts +3 -85
  56. package/dist/src/config.d.ts.map +1 -1
  57. package/dist/src/config.js +91 -0
  58. package/dist/src/config.js.map +1 -0
  59. package/dist/src/connection-manager/auto-dialler.d.ts +24 -41
  60. package/dist/src/connection-manager/auto-dialler.d.ts.map +1 -1
  61. package/dist/src/connection-manager/auto-dialler.js +105 -0
  62. package/dist/src/connection-manager/auto-dialler.js.map +1 -0
  63. package/dist/src/connection-manager/dialer/auto-dialer.d.ts +16 -0
  64. package/dist/src/connection-manager/dialer/auto-dialer.d.ts.map +1 -0
  65. package/dist/src/connection-manager/dialer/auto-dialer.js +37 -0
  66. package/dist/src/connection-manager/dialer/auto-dialer.js.map +1 -0
  67. package/dist/src/connection-manager/dialer/dial-request.d.ts +27 -0
  68. package/dist/src/connection-manager/dialer/dial-request.d.ts.map +1 -0
  69. package/dist/src/connection-manager/dialer/dial-request.js +83 -0
  70. package/dist/src/connection-manager/dialer/dial-request.js.map +1 -0
  71. package/dist/src/connection-manager/dialer/index.d.ts +104 -0
  72. package/dist/src/connection-manager/dialer/index.d.ts.map +1 -0
  73. package/dist/src/connection-manager/dialer/index.js +267 -0
  74. package/dist/src/connection-manager/dialer/index.js.map +1 -0
  75. package/dist/src/connection-manager/index.d.ts +102 -136
  76. package/dist/src/connection-manager/index.d.ts.map +1 -1
  77. package/dist/src/connection-manager/index.js +333 -0
  78. package/dist/src/connection-manager/index.js.map +1 -0
  79. package/dist/src/connection-manager/latency-monitor.d.ts +72 -97
  80. package/dist/src/connection-manager/latency-monitor.d.ts.map +1 -1
  81. package/dist/src/connection-manager/latency-monitor.js +220 -0
  82. package/dist/src/connection-manager/latency-monitor.js.map +1 -0
  83. package/dist/src/connection-manager/visibility-change-emitter.d.ts +15 -16
  84. package/dist/src/connection-manager/visibility-change-emitter.d.ts.map +1 -1
  85. package/dist/src/connection-manager/visibility-change-emitter.js +118 -0
  86. package/dist/src/connection-manager/visibility-change-emitter.js.map +1 -0
  87. package/dist/src/constants.d.ts +22 -10
  88. package/dist/src/constants.d.ts.map +1 -1
  89. package/dist/src/constants.js +27 -0
  90. package/dist/src/constants.js.map +1 -0
  91. package/dist/src/content-routing/index.d.ts +27 -81
  92. package/dist/src/content-routing/index.d.ts.map +1 -1
  93. package/dist/src/content-routing/index.js +99 -0
  94. package/dist/src/content-routing/index.js.map +1 -0
  95. package/dist/src/content-routing/utils.d.ts +6 -49
  96. package/dist/src/content-routing/utils.d.ts.map +1 -1
  97. package/dist/src/content-routing/utils.js +42 -0
  98. package/dist/src/content-routing/utils.js.map +1 -0
  99. package/dist/src/dht/dht-content-routing.d.ts +10 -24
  100. package/dist/src/dht/dht-content-routing.d.ts.map +1 -1
  101. package/dist/src/dht/dht-content-routing.js +32 -0
  102. package/dist/src/dht/dht-content-routing.js.map +1 -0
  103. package/dist/src/dht/dht-peer-routing.d.ts +9 -24
  104. package/dist/src/dht/dht-peer-routing.d.ts.map +1 -1
  105. package/dist/src/dht/dht-peer-routing.js +26 -0
  106. package/dist/src/dht/dht-peer-routing.js.map +1 -0
  107. package/dist/src/dht/dummy-dht.d.ts +20 -0
  108. package/dist/src/dht/dummy-dht.d.ts.map +1 -0
  109. package/dist/src/dht/dummy-dht.js +46 -0
  110. package/dist/src/dht/dummy-dht.js.map +1 -0
  111. package/dist/src/errors.d.ts +70 -63
  112. package/dist/src/errors.d.ts.map +1 -1
  113. package/dist/src/errors.js +75 -0
  114. package/dist/src/errors.js.map +1 -0
  115. package/dist/src/fetch/constants.d.ts +1 -1
  116. package/dist/src/fetch/constants.d.ts.map +1 -1
  117. package/dist/src/fetch/constants.js +3 -0
  118. package/dist/src/fetch/constants.js.map +1 -0
  119. package/dist/src/fetch/index.d.ts +30 -49
  120. package/dist/src/fetch/index.d.ts.map +1 -1
  121. package/dist/src/fetch/index.js +129 -0
  122. package/dist/src/fetch/index.js.map +1 -0
  123. package/dist/src/fetch/pb/proto.d.ts +27 -0
  124. package/dist/src/fetch/pb/proto.d.ts.map +1 -0
  125. package/dist/src/fetch/pb/proto.js +50 -0
  126. package/dist/src/fetch/pb/proto.js.map +1 -0
  127. package/dist/src/get-peer.d.ts +4 -11
  128. package/dist/src/get-peer.d.ts.map +1 -1
  129. package/dist/src/get-peer.js +43 -0
  130. package/dist/src/get-peer.js.map +1 -0
  131. package/dist/src/identify/consts.d.ts +9 -9
  132. package/dist/src/identify/consts.d.ts.map +1 -1
  133. package/dist/src/identify/consts.js +11 -0
  134. package/dist/src/identify/consts.js.map +1 -0
  135. package/dist/src/identify/index.d.ts +42 -96
  136. package/dist/src/identify/index.d.ts.map +1 -1
  137. package/dist/src/identify/index.js +322 -0
  138. package/dist/src/identify/index.js.map +1 -0
  139. package/dist/src/identify/pb/message.d.ts +16 -0
  140. package/dist/src/identify/pb/message.d.ts.map +1 -0
  141. package/dist/src/identify/pb/message.js +24 -0
  142. package/dist/src/identify/pb/message.js.map +1 -0
  143. package/dist/src/index.d.ts +150 -496
  144. package/dist/src/index.d.ts.map +1 -1
  145. package/dist/src/index.js +9 -0
  146. package/dist/src/index.js.map +1 -0
  147. package/dist/src/insecure/index.d.ts +9 -0
  148. package/dist/src/insecure/index.d.ts.map +1 -0
  149. package/dist/src/insecure/index.js +81 -0
  150. package/dist/src/insecure/index.js.map +1 -0
  151. package/dist/src/insecure/pb/proto.d.ts +29 -0
  152. package/dist/src/insecure/pb/proto.d.ts.map +1 -0
  153. package/dist/src/insecure/pb/proto.js +53 -0
  154. package/dist/src/insecure/pb/proto.js.map +1 -0
  155. package/dist/src/keychain/cms.d.ts +6 -14
  156. package/dist/src/keychain/cms.d.ts.map +1 -1
  157. package/dist/src/keychain/cms.js +129 -0
  158. package/dist/src/keychain/cms.js.map +1 -0
  159. package/dist/src/keychain/index.d.ts +60 -81
  160. package/dist/src/keychain/index.d.ts.map +1 -1
  161. package/dist/src/keychain/index.js +492 -0
  162. package/dist/src/keychain/index.js.map +1 -0
  163. package/dist/src/keychain/util.d.ts +3 -6
  164. package/dist/src/keychain/util.d.ts.map +1 -1
  165. package/dist/src/keychain/util.js +79 -0
  166. package/dist/src/keychain/util.js.map +1 -0
  167. package/dist/src/libp2p.d.ts +80 -0
  168. package/dist/src/libp2p.d.ts.map +1 -0
  169. package/dist/src/libp2p.js +397 -0
  170. package/dist/src/libp2p.js.map +1 -0
  171. package/dist/src/metrics/index.d.ts +47 -104
  172. package/dist/src/metrics/index.d.ts.map +1 -1
  173. package/dist/src/metrics/index.js +231 -0
  174. package/dist/src/metrics/index.js.map +1 -0
  175. package/dist/src/metrics/moving-average.d.ts +14 -0
  176. package/dist/src/metrics/moving-average.d.ts.map +1 -0
  177. package/dist/src/metrics/moving-average.js +40 -0
  178. package/dist/src/metrics/moving-average.js.map +1 -0
  179. package/dist/src/metrics/stats.d.ts +41 -93
  180. package/dist/src/metrics/stats.d.ts.map +1 -1
  181. package/dist/src/metrics/stats.js +183 -0
  182. package/dist/src/metrics/stats.js.map +1 -0
  183. package/dist/src/nat-manager.d.ts +42 -99
  184. package/dist/src/nat-manager.d.ts.map +1 -1
  185. package/dist/src/nat-manager.js +114 -0
  186. package/dist/src/nat-manager.js.map +1 -0
  187. package/dist/src/peer-record-updater.d.ts +15 -0
  188. package/dist/src/peer-record-updater.d.ts.map +1 -0
  189. package/dist/src/peer-record-updater.js +44 -0
  190. package/dist/src/peer-record-updater.js.map +1 -0
  191. package/dist/src/peer-routing.d.ts +40 -84
  192. package/dist/src/peer-routing.d.ts.map +1 -1
  193. package/dist/src/peer-routing.js +108 -0
  194. package/dist/src/peer-routing.js.map +1 -0
  195. package/dist/src/ping/constants.d.ts +4 -4
  196. package/dist/src/ping/constants.d.ts.map +1 -1
  197. package/dist/src/ping/constants.js +5 -0
  198. package/dist/src/ping/constants.js.map +1 -0
  199. package/dist/src/ping/index.d.ts +17 -31
  200. package/dist/src/ping/index.d.ts.map +1 -1
  201. package/dist/src/ping/index.js +57 -0
  202. package/dist/src/ping/index.js.map +1 -0
  203. package/dist/src/pnet/crypto.d.ts +15 -5
  204. package/dist/src/pnet/crypto.d.ts.map +1 -1
  205. package/dist/src/pnet/crypto.js +60 -0
  206. package/dist/src/pnet/crypto.js.map +1 -0
  207. package/dist/src/pnet/errors.d.ts +5 -5
  208. package/dist/src/pnet/errors.d.ts.map +1 -1
  209. package/dist/src/pnet/errors.js +6 -0
  210. package/dist/src/pnet/errors.js.map +1 -0
  211. package/dist/src/pnet/index.d.ts +12 -20
  212. package/dist/src/pnet/index.d.ts.map +1 -1
  213. package/dist/src/pnet/index.js +67 -0
  214. package/dist/src/pnet/index.js.map +1 -0
  215. package/dist/src/pnet/key-generator.d.ts +3 -7
  216. package/dist/src/pnet/key-generator.d.ts.map +1 -1
  217. package/dist/src/pnet/key-generator.js +25 -0
  218. package/dist/src/pnet/key-generator.js.map +1 -0
  219. package/dist/src/pubsub/dummy-pubsub.d.ts +17 -0
  220. package/dist/src/pubsub/dummy-pubsub.d.ts.map +1 -0
  221. package/dist/src/pubsub/dummy-pubsub.js +37 -0
  222. package/dist/src/pubsub/dummy-pubsub.js.map +1 -0
  223. package/dist/src/registrar.d.ts +26 -65
  224. package/dist/src/registrar.d.ts.map +1 -1
  225. package/dist/src/registrar.js +144 -0
  226. package/dist/src/registrar.js.map +1 -0
  227. package/dist/src/transport-manager.d.ts +36 -82
  228. package/dist/src/transport-manager.d.ts.map +1 -1
  229. package/dist/src/transport-manager.js +223 -0
  230. package/dist/src/transport-manager.js.map +1 -0
  231. package/dist/src/upgrader.d.ts +49 -129
  232. package/dist/src/upgrader.d.ts.map +1 -1
  233. package/dist/src/upgrader.js +402 -0
  234. package/dist/src/upgrader.js.map +1 -0
  235. package/dist/src/version.d.ts +3 -0
  236. package/dist/src/version.d.ts.map +1 -0
  237. package/dist/src/version.js +3 -0
  238. package/dist/src/version.js.map +1 -0
  239. package/package.json +144 -201
  240. package/src/address-manager/index.ts +130 -0
  241. package/src/circuit/README.md +16 -11
  242. package/src/circuit/auto-relay.ts +286 -0
  243. package/src/circuit/circuit/hop.ts +211 -0
  244. package/src/circuit/circuit/stop.ts +78 -0
  245. package/src/circuit/circuit/stream-handler.ts +86 -0
  246. package/src/circuit/circuit/{utils.js → utils.ts} +9 -25
  247. package/src/circuit/constants.ts +31 -0
  248. package/src/circuit/index.ts +120 -0
  249. package/src/circuit/listener.ts +82 -0
  250. package/src/circuit/multicodec.ts +2 -0
  251. package/src/circuit/{protocol → pb}/index.proto +1 -1
  252. package/src/circuit/pb/index.ts +117 -0
  253. package/src/circuit/transport.ts +219 -0
  254. package/src/circuit/utils.ts +12 -0
  255. package/src/config.ts +99 -0
  256. package/src/connection-manager/auto-dialler.ts +154 -0
  257. package/src/connection-manager/dialer/auto-dialer.ts +59 -0
  258. package/src/{dialer/dial-request.js → connection-manager/dialer/dial-request.ts} +60 -51
  259. package/src/connection-manager/dialer/index.ts +382 -0
  260. package/src/connection-manager/index.ts +508 -0
  261. package/src/connection-manager/latency-monitor.ts +319 -0
  262. package/src/connection-manager/{visibility-change-emitter.js → visibility-change-emitter.ts} +48 -38
  263. package/src/constants.ts +31 -0
  264. package/src/content-routing/index.ts +144 -0
  265. package/src/content-routing/utils.ts +54 -0
  266. package/src/dht/dht-content-routing.ts +43 -0
  267. package/src/dht/dht-peer-routing.ts +35 -0
  268. package/src/dht/dummy-dht.ts +60 -0
  269. package/src/errors.ts +73 -0
  270. package/src/fetch/README.md +1 -1
  271. package/src/fetch/constants.ts +3 -0
  272. package/src/fetch/index.ts +167 -0
  273. package/src/fetch/{proto.proto → pb/proto.proto} +0 -0
  274. package/src/fetch/pb/proto.ts +65 -0
  275. package/src/get-peer.ts +57 -0
  276. package/src/identify/consts.ts +13 -0
  277. package/src/identify/index.ts +445 -0
  278. package/src/identify/{message.proto → pb/message.proto} +0 -0
  279. package/src/identify/pb/message.ts +37 -0
  280. package/src/index.ts +220 -0
  281. package/src/insecure/index.ts +101 -0
  282. package/src/insecure/{proto.proto → pb/proto.proto} +0 -0
  283. package/src/insecure/pb/proto.ts +68 -0
  284. package/src/keychain/{cms.js → cms.ts} +62 -58
  285. package/src/keychain/index.ts +587 -0
  286. package/src/keychain/{util.js → util.ts} +7 -17
  287. package/src/libp2p.ts +538 -0
  288. package/src/metrics/index.ts +310 -0
  289. package/src/metrics/moving-average.ts +53 -0
  290. package/src/metrics/stats.ts +238 -0
  291. package/src/nat-manager.ts +194 -0
  292. package/src/peer-record-updater.ts +55 -0
  293. package/src/peer-routing.ts +186 -0
  294. package/src/ping/README.md +1 -1
  295. package/src/ping/constants.ts +5 -0
  296. package/src/ping/index.ts +84 -0
  297. package/src/pnet/README.md +2 -2
  298. package/src/pnet/crypto.ts +67 -0
  299. package/src/pnet/errors.ts +5 -0
  300. package/src/pnet/index.ts +97 -0
  301. package/src/pnet/key-generator.ts +28 -0
  302. package/src/pubsub/dummy-pubsub.ts +51 -0
  303. package/src/registrar.ts +189 -0
  304. package/src/transport-manager.ts +281 -0
  305. package/src/upgrader.ts +499 -0
  306. package/src/version.ts +3 -0
  307. package/dist/index.min.js +0 -55
  308. package/dist/src/circuit/protocol/index.d.ts +0 -173
  309. package/dist/src/dialer/dial-request.d.ts +0 -55
  310. package/dist/src/dialer/dial-request.d.ts.map +0 -1
  311. package/dist/src/dialer/index.d.ts +0 -182
  312. package/dist/src/dialer/index.d.ts.map +0 -1
  313. package/dist/src/fetch/proto.d.ts +0 -134
  314. package/dist/src/identify/message.d.ts +0 -95
  315. package/dist/src/insecure/plaintext.d.ts +0 -12
  316. package/dist/src/insecure/plaintext.d.ts.map +0 -1
  317. package/dist/src/insecure/proto.d.ts +0 -128
  318. package/dist/src/metrics/old-peers.d.ts +0 -3
  319. package/dist/src/metrics/old-peers.d.ts.map +0 -1
  320. package/dist/src/metrics/tracked-map.d.ts +0 -8
  321. package/dist/src/metrics/tracked-map.d.ts.map +0 -1
  322. package/dist/src/peer-store/address-book.d.ts +0 -67
  323. package/dist/src/peer-store/address-book.d.ts.map +0 -1
  324. package/dist/src/peer-store/index.d.ts +0 -58
  325. package/dist/src/peer-store/index.d.ts.map +0 -1
  326. package/dist/src/peer-store/key-book.d.ts +0 -40
  327. package/dist/src/peer-store/key-book.d.ts.map +0 -1
  328. package/dist/src/peer-store/metadata-book.d.ts +0 -58
  329. package/dist/src/peer-store/metadata-book.d.ts.map +0 -1
  330. package/dist/src/peer-store/pb/peer.d.ts +0 -222
  331. package/dist/src/peer-store/proto-book.d.ts +0 -43
  332. package/dist/src/peer-store/proto-book.d.ts.map +0 -1
  333. package/dist/src/peer-store/store.d.ts +0 -73
  334. package/dist/src/peer-store/store.d.ts.map +0 -1
  335. package/dist/src/peer-store/types.d.ts +0 -202
  336. package/dist/src/peer-store/types.d.ts.map +0 -1
  337. package/dist/src/ping/util.d.ts +0 -5
  338. package/dist/src/ping/util.d.ts.map +0 -1
  339. package/dist/src/pubsub-adapter.d.ts +0 -22
  340. package/dist/src/pubsub-adapter.d.ts.map +0 -1
  341. package/dist/src/record/envelope/envelope.d.ts +0 -77
  342. package/dist/src/record/envelope/index.d.ts +0 -80
  343. package/dist/src/record/envelope/index.d.ts.map +0 -1
  344. package/dist/src/record/peer-record/consts.d.ts +0 -4
  345. package/dist/src/record/peer-record/consts.d.ts.map +0 -1
  346. package/dist/src/record/peer-record/index.d.ts +0 -60
  347. package/dist/src/record/peer-record/index.d.ts.map +0 -1
  348. package/dist/src/record/peer-record/peer-record.d.ts +0 -133
  349. package/dist/src/record/utils.d.ts +0 -12
  350. package/dist/src/record/utils.d.ts.map +0 -1
  351. package/dist/src/types.d.ts +0 -90
  352. package/dist/src/types.d.ts.map +0 -1
  353. package/src/address-manager/index.js +0 -96
  354. package/src/circuit/auto-relay.js +0 -302
  355. package/src/circuit/circuit/hop.js +0 -205
  356. package/src/circuit/circuit/stop.js +0 -81
  357. package/src/circuit/circuit/stream-handler.js +0 -94
  358. package/src/circuit/constants.js +0 -12
  359. package/src/circuit/index.js +0 -102
  360. package/src/circuit/listener.js +0 -75
  361. package/src/circuit/multicodec.js +0 -5
  362. package/src/circuit/protocol/index.d.ts +0 -173
  363. package/src/circuit/protocol/index.js +0 -530
  364. package/src/circuit/transport.js +0 -229
  365. package/src/circuit/utils.js +0 -17
  366. package/src/config.js +0 -114
  367. package/src/connection-manager/auto-dialler.js +0 -132
  368. package/src/connection-manager/index.js +0 -374
  369. package/src/connection-manager/latency-monitor.js +0 -264
  370. package/src/constants.js +0 -18
  371. package/src/content-routing/index.js +0 -163
  372. package/src/content-routing/utils.js +0 -89
  373. package/src/dht/dht-content-routing.js +0 -44
  374. package/src/dht/dht-peer-routing.js +0 -51
  375. package/src/dialer/index.js +0 -376
  376. package/src/errors.js +0 -66
  377. package/src/fetch/constants.js +0 -6
  378. package/src/fetch/index.js +0 -159
  379. package/src/fetch/proto.d.ts +0 -134
  380. package/src/fetch/proto.js +0 -333
  381. package/src/get-peer.js +0 -49
  382. package/src/identify/consts.js +0 -15
  383. package/src/identify/index.js +0 -384
  384. package/src/identify/message.d.ts +0 -95
  385. package/src/identify/message.js +0 -328
  386. package/src/index.js +0 -813
  387. package/src/insecure/plaintext.js +0 -95
  388. package/src/insecure/proto.d.ts +0 -128
  389. package/src/insecure/proto.js +0 -371
  390. package/src/keychain/index.js +0 -561
  391. package/src/metrics/index.js +0 -290
  392. package/src/metrics/old-peers.js +0 -16
  393. package/src/metrics/stats.js +0 -270
  394. package/src/metrics/tracked-map.js +0 -94
  395. package/src/nat-manager.js +0 -197
  396. package/src/peer-routing.js +0 -176
  397. package/src/peer-store/README.md +0 -145
  398. package/src/peer-store/address-book.js +0 -382
  399. package/src/peer-store/index.js +0 -121
  400. package/src/peer-store/key-book.js +0 -141
  401. package/src/peer-store/metadata-book.js +0 -250
  402. package/src/peer-store/pb/peer.d.ts +0 -222
  403. package/src/peer-store/pb/peer.js +0 -643
  404. package/src/peer-store/pb/peer.proto +0 -31
  405. package/src/peer-store/proto-book.js +0 -237
  406. package/src/peer-store/store.js +0 -263
  407. package/src/peer-store/types.ts +0 -245
  408. package/src/ping/constants.js +0 -8
  409. package/src/ping/index.js +0 -84
  410. package/src/ping/util.js +0 -18
  411. package/src/pnet/crypto.js +0 -84
  412. package/src/pnet/errors.js +0 -7
  413. package/src/pnet/index.js +0 -86
  414. package/src/pnet/key-generator.js +0 -33
  415. package/src/pubsub-adapter.js +0 -61
  416. package/src/record/README.md +0 -130
  417. package/src/record/envelope/envelope.d.ts +0 -77
  418. package/src/record/envelope/envelope.js +0 -243
  419. package/src/record/envelope/envelope.proto +0 -19
  420. package/src/record/envelope/index.js +0 -183
  421. package/src/record/peer-record/consts.js +0 -14
  422. package/src/record/peer-record/index.js +0 -113
  423. package/src/record/peer-record/peer-record.d.ts +0 -133
  424. package/src/record/peer-record/peer-record.js +0 -367
  425. package/src/record/peer-record/peer-record.proto +0 -18
  426. package/src/record/utils.js +0 -25
  427. package/src/registrar.js +0 -127
  428. package/src/transport-manager.js +0 -269
  429. package/src/types.ts +0 -98
  430. package/src/upgrader.js +0 -492
@@ -1,20 +1,11 @@
1
- 'use strict'
2
-
3
- const { Multiaddr } = require('multiaddr')
4
- const { CircuitRelay } = require('../protocol')
5
-
6
- /**
7
- * @typedef {import('./stream-handler')} StreamHandler
8
- * @typedef {import('../protocol').ICircuitRelay} ICircuitRelay
9
- */
1
+ import { Multiaddr } from '@multiformats/multiaddr'
2
+ import { CircuitRelay } from '../pb/index.js'
3
+ import type { StreamHandler } from './stream-handler.js'
10
4
 
11
5
  /**
12
6
  * Write a response
13
- *
14
- * @param {StreamHandler} streamHandler
15
- * @param {import('../protocol').CircuitRelay.Status} status
16
7
  */
17
- function writeResponse (streamHandler, status) {
8
+ function writeResponse (streamHandler: StreamHandler, status: CircuitRelay.Status) {
18
9
  streamHandler.write({
19
10
  type: CircuitRelay.Type.STATUS,
20
11
  code: status
@@ -23,18 +14,15 @@ function writeResponse (streamHandler, status) {
23
14
 
24
15
  /**
25
16
  * Validate incomming HOP/STOP message
26
- *
27
- * @param {ICircuitRelay} msg - A CircuitRelay unencoded protobuf message
28
- * @param {StreamHandler} streamHandler
29
17
  */
30
- function validateAddrs (msg, streamHandler) {
18
+ export function validateAddrs (msg: CircuitRelay, streamHandler: StreamHandler) {
31
19
  try {
32
- if (msg.dstPeer && msg.dstPeer.addrs) {
20
+ if (msg.dstPeer?.addrs != null) {
33
21
  msg.dstPeer.addrs.forEach((addr) => {
34
22
  return new Multiaddr(addr)
35
23
  })
36
24
  }
37
- } catch (/** @type {any} */ err) {
25
+ } catch (err: any) {
38
26
  writeResponse(streamHandler, msg.type === CircuitRelay.Type.HOP
39
27
  ? CircuitRelay.Status.HOP_DST_MULTIADDR_INVALID
40
28
  : CircuitRelay.Status.STOP_DST_MULTIADDR_INVALID)
@@ -42,19 +30,15 @@ function validateAddrs (msg, streamHandler) {
42
30
  }
43
31
 
44
32
  try {
45
- if (msg.srcPeer && msg.srcPeer.addrs) {
33
+ if (msg.srcPeer?.addrs != null) {
46
34
  msg.srcPeer.addrs.forEach((addr) => {
47
35
  return new Multiaddr(addr)
48
36
  })
49
37
  }
50
- } catch (/** @type {any} */ err) {
38
+ } catch (err: any) {
51
39
  writeResponse(streamHandler, msg.type === CircuitRelay.Type.HOP
52
40
  ? CircuitRelay.Status.HOP_SRC_MULTIADDR_INVALID
53
41
  : CircuitRelay.Status.STOP_SRC_MULTIADDR_INVALID)
54
42
  throw err
55
43
  }
56
44
  }
57
-
58
- module.exports = {
59
- validateAddrs
60
- }
@@ -0,0 +1,31 @@
1
+ const minute = 60 * 1000
2
+
3
+ /**
4
+ * Delay before HOP relay service is advertised on the network
5
+ */
6
+ export const ADVERTISE_BOOT_DELAY = 15 * minute
7
+
8
+ /**
9
+ * Delay Between HOP relay service advertisements on the network
10
+ */
11
+ export const ADVERTISE_TTL = 30 * minute
12
+
13
+ /**
14
+ * Multicodec code
15
+ */
16
+ export const CIRCUIT_PROTO_CODE = 290
17
+
18
+ /**
19
+ * PeerStore metadaBook key for HOP relay service
20
+ */
21
+ export const HOP_METADATA_KEY = 'hop_relay'
22
+
23
+ /**
24
+ * PeerStore metadaBook value for HOP relay service
25
+ */
26
+ export const HOP_METADATA_VALUE = 'true'
27
+
28
+ /**
29
+ * Relay HOP relay service namespace for discovery
30
+ */
31
+ export const RELAY_RENDEZVOUS_NS = '/libp2p/relay'
@@ -0,0 +1,120 @@
1
+ import { logger } from '@libp2p/logger'
2
+ import { codes } from '../errors.js'
3
+ import {
4
+ setDelayedInterval,
5
+ clearDelayedInterval
6
+ // @ts-expect-error set-delayed-interval does not export types
7
+ } from 'set-delayed-interval'
8
+ import { AutoRelay } from './auto-relay.js'
9
+ import { namespaceToCid } from './utils.js'
10
+ import {
11
+ RELAY_RENDEZVOUS_NS
12
+ } from './constants.js'
13
+ import type { AddressSorter } from '@libp2p/interfaces/peer-store'
14
+ import type { Startable } from '@libp2p/interfaces/startable'
15
+ import type { Components } from '@libp2p/interfaces/components'
16
+
17
+ const log = logger('libp2p:relay')
18
+
19
+ export interface RelayAdvertiseConfig {
20
+ bootDelay?: number
21
+ enabled?: boolean
22
+ ttl?: number
23
+ }
24
+
25
+ export interface HopConfig {
26
+ enabled?: boolean
27
+ active?: boolean
28
+ }
29
+
30
+ export interface AutoRelayConfig {
31
+ enabled?: boolean
32
+
33
+ /**
34
+ * maximum number of relays to listen
35
+ */
36
+ maxListeners: number
37
+ }
38
+
39
+ export interface RelayInit {
40
+ addressSorter?: AddressSorter
41
+ maxListeners?: number
42
+ onError?: (error: Error, msg?: string) => void
43
+ hop: HopConfig
44
+ advertise: RelayAdvertiseConfig
45
+ autoRelay: AutoRelayConfig
46
+ }
47
+
48
+ export class Relay implements Startable {
49
+ private readonly components: Components
50
+ private readonly init: RelayInit
51
+ // @ts-expect-error this field isn't used anywhere?
52
+ private readonly autoRelay?: AutoRelay
53
+ private timeout?: any
54
+ private started: boolean
55
+
56
+ /**
57
+ * Creates an instance of Relay
58
+ */
59
+ constructor (components: Components, init: RelayInit) {
60
+ this.components = components
61
+ // Create autoRelay if enabled
62
+ this.autoRelay = init.autoRelay?.enabled !== false
63
+ ? new AutoRelay(components, {
64
+ addressSorter: init.addressSorter,
65
+ ...init.autoRelay
66
+ })
67
+ : undefined
68
+
69
+ this.started = false
70
+ this.init = init
71
+ this._advertiseService = this._advertiseService.bind(this)
72
+ }
73
+
74
+ isStarted () {
75
+ return this.started
76
+ }
77
+
78
+ /**
79
+ * Start Relay service
80
+ */
81
+ async start () {
82
+ // Advertise service if HOP enabled
83
+ if (this.init.hop.enabled !== false && this.init.advertise.enabled !== false) {
84
+ this.timeout = setDelayedInterval(
85
+ this._advertiseService, this.init.advertise.ttl, this.init.advertise.bootDelay
86
+ )
87
+ }
88
+
89
+ this.started = true
90
+ }
91
+
92
+ /**
93
+ * Stop Relay service
94
+ */
95
+ async stop () {
96
+ if (this.timeout != null) {
97
+ clearDelayedInterval(this.timeout)
98
+ }
99
+
100
+ this.started = false
101
+ }
102
+
103
+ /**
104
+ * Advertise hop relay service in the network.
105
+ */
106
+ async _advertiseService () {
107
+ try {
108
+ const cid = await namespaceToCid(RELAY_RENDEZVOUS_NS)
109
+ await this.components.getContentRouting().provide(cid)
110
+ } catch (err: any) {
111
+ if (err.code === codes.ERR_NO_ROUTERS_AVAILABLE) {
112
+ log.error('a content router, such as a DHT, must be provided in order to advertise the relay service', err)
113
+ // Stop the advertise
114
+ await this.stop()
115
+ } else {
116
+ log.error(err)
117
+ }
118
+ }
119
+ }
120
+ }
@@ -0,0 +1,82 @@
1
+ import { CustomEvent, EventEmitter } from '@libp2p/interfaces/events'
2
+ import type { ConnectionManager } from '@libp2p/interfaces/connection-manager'
3
+ import type { PeerStore } from '@libp2p/interfaces/peer-store'
4
+ import type { Listener } from '@libp2p/interfaces/transport'
5
+ import { peerIdFromString } from '@libp2p/peer-id'
6
+ import { Multiaddr } from '@multiformats/multiaddr'
7
+
8
+ export interface ListenerOptions {
9
+ peerStore: PeerStore
10
+ connectionManager: ConnectionManager
11
+ }
12
+
13
+ export function createListener (options: ListenerOptions): Listener {
14
+ const listeningAddrs = new Map()
15
+
16
+ /**
17
+ * Add swarm handler and listen for incoming connections
18
+ */
19
+ async function listen (addr: Multiaddr): Promise<void> {
20
+ const addrString = addr.toString().split('/p2p-circuit').find(a => a !== '')
21
+ const ma = new Multiaddr(addrString)
22
+
23
+ const relayPeerStr = ma.getPeerId()
24
+
25
+ if (relayPeerStr == null) {
26
+ throw new Error('Could not determine relay peer from multiaddr')
27
+ }
28
+
29
+ const relayPeerId = peerIdFromString(relayPeerStr)
30
+
31
+ await options.peerStore.addressBook.add(relayPeerId, [ma])
32
+
33
+ const relayConn = await options.connectionManager.openConnection(relayPeerId)
34
+ const relayedAddr = relayConn.remoteAddr.encapsulate('/p2p-circuit')
35
+
36
+ listeningAddrs.set(relayConn.remotePeer.toString(), relayedAddr)
37
+ listener.dispatchEvent(new CustomEvent('listening'))
38
+ }
39
+
40
+ /**
41
+ * Get fixed up multiaddrs
42
+ *
43
+ * NOTE: This method will grab the peers multiaddrs and expand them such that:
44
+ *
45
+ * a) If it's an existing /p2p-circuit address for a specific relay i.e.
46
+ * `/ip4/0.0.0.0/tcp/0/ipfs/QmRelay/p2p-circuit` this method will expand the
47
+ * address to `/ip4/0.0.0.0/tcp/0/ipfs/QmRelay/p2p-circuit/ipfs/QmPeer` where
48
+ * `QmPeer` is this peers id
49
+ * b) If it's not a /p2p-circuit address, it will encapsulate the address as a /p2p-circuit
50
+ * addr, such when dialing over a relay with this address, it will create the circuit using
51
+ * the encapsulated transport address. This is useful when for example, a peer should only
52
+ * be dialed over TCP rather than any other transport
53
+ *
54
+ * @returns {Multiaddr[]}
55
+ */
56
+ function getAddrs () {
57
+ const addrs = []
58
+ for (const addr of listeningAddrs.values()) {
59
+ addrs.push(addr)
60
+ }
61
+ return addrs
62
+ }
63
+
64
+ const listener: Listener = Object.assign(new EventEmitter(), {
65
+ close: async () => await Promise.resolve(),
66
+ listen,
67
+ getAddrs
68
+ })
69
+
70
+ // Remove listeningAddrs when a peer disconnects
71
+ options.connectionManager.addEventListener('peer:disconnect', (evt) => {
72
+ const { detail: connection } = evt
73
+ const deleted = listeningAddrs.delete(connection.remotePeer.toString())
74
+
75
+ if (deleted) {
76
+ // Announce listen addresses change
77
+ listener.dispatchEvent(new CustomEvent('close'))
78
+ }
79
+ })
80
+
81
+ return listener
82
+ }
@@ -0,0 +1,2 @@
1
+
2
+ export const RELAY_CODEC = '/libp2p/circuit/relay/0.1.0'
@@ -1,4 +1,4 @@
1
- syntax = "proto2";
1
+ syntax = "proto3";
2
2
 
3
3
  message CircuitRelay {
4
4
 
@@ -0,0 +1,117 @@
1
+ /* eslint-disable import/export */
2
+ /* eslint-disable @typescript-eslint/no-namespace */
3
+
4
+ import { enumeration, encodeMessage, decodeMessage, message, bytes } from 'protons-runtime'
5
+ import type { Codec } from 'protons-runtime'
6
+
7
+ export interface CircuitRelay {
8
+ type?: CircuitRelay.Type
9
+ srcPeer?: CircuitRelay.Peer
10
+ dstPeer?: CircuitRelay.Peer
11
+ code?: CircuitRelay.Status
12
+ }
13
+
14
+ export namespace CircuitRelay {
15
+ export enum Status {
16
+ SUCCESS = 'SUCCESS',
17
+ HOP_SRC_ADDR_TOO_LONG = 'HOP_SRC_ADDR_TOO_LONG',
18
+ HOP_DST_ADDR_TOO_LONG = 'HOP_DST_ADDR_TOO_LONG',
19
+ HOP_SRC_MULTIADDR_INVALID = 'HOP_SRC_MULTIADDR_INVALID',
20
+ HOP_DST_MULTIADDR_INVALID = 'HOP_DST_MULTIADDR_INVALID',
21
+ HOP_NO_CONN_TO_DST = 'HOP_NO_CONN_TO_DST',
22
+ HOP_CANT_DIAL_DST = 'HOP_CANT_DIAL_DST',
23
+ HOP_CANT_OPEN_DST_STREAM = 'HOP_CANT_OPEN_DST_STREAM',
24
+ HOP_CANT_SPEAK_RELAY = 'HOP_CANT_SPEAK_RELAY',
25
+ HOP_CANT_RELAY_TO_SELF = 'HOP_CANT_RELAY_TO_SELF',
26
+ STOP_SRC_ADDR_TOO_LONG = 'STOP_SRC_ADDR_TOO_LONG',
27
+ STOP_DST_ADDR_TOO_LONG = 'STOP_DST_ADDR_TOO_LONG',
28
+ STOP_SRC_MULTIADDR_INVALID = 'STOP_SRC_MULTIADDR_INVALID',
29
+ STOP_DST_MULTIADDR_INVALID = 'STOP_DST_MULTIADDR_INVALID',
30
+ STOP_RELAY_REFUSED = 'STOP_RELAY_REFUSED',
31
+ MALFORMED_MESSAGE = 'MALFORMED_MESSAGE'
32
+ }
33
+
34
+ enum __StatusValues {
35
+ SUCCESS = 100,
36
+ HOP_SRC_ADDR_TOO_LONG = 220,
37
+ HOP_DST_ADDR_TOO_LONG = 221,
38
+ HOP_SRC_MULTIADDR_INVALID = 250,
39
+ HOP_DST_MULTIADDR_INVALID = 251,
40
+ HOP_NO_CONN_TO_DST = 260,
41
+ HOP_CANT_DIAL_DST = 261,
42
+ HOP_CANT_OPEN_DST_STREAM = 262,
43
+ HOP_CANT_SPEAK_RELAY = 270,
44
+ HOP_CANT_RELAY_TO_SELF = 280,
45
+ STOP_SRC_ADDR_TOO_LONG = 320,
46
+ STOP_DST_ADDR_TOO_LONG = 321,
47
+ STOP_SRC_MULTIADDR_INVALID = 350,
48
+ STOP_DST_MULTIADDR_INVALID = 351,
49
+ STOP_RELAY_REFUSED = 390,
50
+ MALFORMED_MESSAGE = 400
51
+ }
52
+
53
+ export namespace Status {
54
+ export const codec = () => {
55
+ return enumeration<typeof Status>(__StatusValues)
56
+ }
57
+ }
58
+
59
+ export enum Type {
60
+ HOP = 'HOP',
61
+ STOP = 'STOP',
62
+ STATUS = 'STATUS',
63
+ CAN_HOP = 'CAN_HOP'
64
+ }
65
+
66
+ enum __TypeValues {
67
+ HOP = 1,
68
+ STOP = 2,
69
+ STATUS = 3,
70
+ CAN_HOP = 4
71
+ }
72
+
73
+ export namespace Type {
74
+ export const codec = () => {
75
+ return enumeration<typeof Type>(__TypeValues)
76
+ }
77
+ }
78
+
79
+ export interface Peer {
80
+ id: Uint8Array
81
+ addrs: Uint8Array[]
82
+ }
83
+
84
+ export namespace Peer {
85
+ export const codec = (): Codec<Peer> => {
86
+ return message<Peer>({
87
+ 1: { name: 'id', codec: bytes },
88
+ 2: { name: 'addrs', codec: bytes, repeats: true }
89
+ })
90
+ }
91
+
92
+ export const encode = (obj: Peer): Uint8Array => {
93
+ return encodeMessage(obj, Peer.codec())
94
+ }
95
+
96
+ export const decode = (buf: Uint8Array): Peer => {
97
+ return decodeMessage(buf, Peer.codec())
98
+ }
99
+ }
100
+
101
+ export const codec = (): Codec<CircuitRelay> => {
102
+ return message<CircuitRelay>({
103
+ 1: { name: 'type', codec: CircuitRelay.Type.codec(), optional: true },
104
+ 2: { name: 'srcPeer', codec: CircuitRelay.Peer.codec(), optional: true },
105
+ 3: { name: 'dstPeer', codec: CircuitRelay.Peer.codec(), optional: true },
106
+ 4: { name: 'code', codec: CircuitRelay.Status.codec(), optional: true }
107
+ })
108
+ }
109
+
110
+ export const encode = (obj: CircuitRelay): Uint8Array => {
111
+ return encodeMessage(obj, CircuitRelay.codec())
112
+ }
113
+
114
+ export const decode = (buf: Uint8Array): CircuitRelay => {
115
+ return decodeMessage(buf, CircuitRelay.codec())
116
+ }
117
+ }
@@ -0,0 +1,219 @@
1
+ import { logger } from '@libp2p/logger'
2
+ import errCode from 'err-code'
3
+ import * as mafmt from '@multiformats/mafmt'
4
+ import { Multiaddr } from '@multiformats/multiaddr'
5
+ import { CircuitRelay as CircuitPB } from './pb/index.js'
6
+ import { codes } from '../errors.js'
7
+ import { streamToMaConnection } from '@libp2p/utils/stream-to-ma-conn'
8
+ import { RELAY_CODEC } from './multicodec.js'
9
+ import { createListener } from './listener.js'
10
+ import { handleCanHop, handleHop, hop } from './circuit/hop.js'
11
+ import { handleStop } from './circuit/stop.js'
12
+ import { StreamHandler } from './circuit/stream-handler.js'
13
+ import { symbol } from '@libp2p/interfaces/transport'
14
+ import { peerIdFromString } from '@libp2p/peer-id'
15
+ import { Components, Initializable } from '@libp2p/interfaces/components'
16
+ import type { AbortOptions } from '@libp2p/interfaces'
17
+ import type { IncomingStreamData } from '@libp2p/interfaces/registrar'
18
+ import type { Listener, Transport, CreateListenerOptions, ConnectionHandler } from '@libp2p/interfaces/transport'
19
+ import type { Connection } from '@libp2p/interfaces/connection'
20
+
21
+ const log = logger('libp2p:circuit')
22
+
23
+ export class Circuit implements Transport, Initializable {
24
+ private handler?: ConnectionHandler
25
+ private components: Components = new Components()
26
+
27
+ init (components: Components): void {
28
+ this.components = components
29
+ void this.components.getRegistrar().handle(RELAY_CODEC, (data) => {
30
+ void this._onProtocol(data).catch(err => {
31
+ log.error(err)
32
+ })
33
+ })
34
+ .catch(err => {
35
+ log.error(err)
36
+ })
37
+ }
38
+
39
+ hopEnabled () {
40
+ return true
41
+ }
42
+
43
+ hopActive () {
44
+ return true
45
+ }
46
+
47
+ get [symbol] (): true {
48
+ return true
49
+ }
50
+
51
+ get [Symbol.toStringTag] () {
52
+ return 'libp2p/circuit-relay-v1'
53
+ }
54
+
55
+ async _onProtocol (data: IncomingStreamData) {
56
+ const { connection, stream } = data
57
+ const streamHandler = new StreamHandler({ stream })
58
+ const request = await streamHandler.read()
59
+
60
+ if (request == null) {
61
+ log('request was invalid, could not read from stream')
62
+ streamHandler.write({
63
+ type: CircuitPB.Type.STATUS,
64
+ code: CircuitPB.Status.MALFORMED_MESSAGE
65
+ })
66
+ streamHandler.close()
67
+ return
68
+ }
69
+
70
+ let virtualConnection
71
+
72
+ switch (request.type) {
73
+ case CircuitPB.Type.CAN_HOP: {
74
+ log('received CAN_HOP request from %p', connection.remotePeer)
75
+ await handleCanHop({ circuit: this, connection, streamHandler })
76
+ break
77
+ }
78
+ case CircuitPB.Type.HOP: {
79
+ log('received HOP request from %p', connection.remotePeer)
80
+ virtualConnection = await handleHop({
81
+ connection,
82
+ request,
83
+ streamHandler,
84
+ circuit: this,
85
+ connectionManager: this.components.getConnectionManager()
86
+ })
87
+ break
88
+ }
89
+ case CircuitPB.Type.STOP: {
90
+ log('received STOP request from %p', connection.remotePeer)
91
+ virtualConnection = await handleStop({
92
+ connection,
93
+ request,
94
+ streamHandler
95
+ })
96
+ break
97
+ }
98
+ default: {
99
+ log('Request of type %s not supported', request.type)
100
+ streamHandler.write({
101
+ type: CircuitPB.Type.STATUS,
102
+ code: CircuitPB.Status.MALFORMED_MESSAGE
103
+ })
104
+ streamHandler.close()
105
+ return
106
+ }
107
+ }
108
+
109
+ if (virtualConnection != null) {
110
+ // @ts-expect-error dst peer will not be undefined
111
+ const remoteAddr = new Multiaddr(request.dstPeer.addrs[0])
112
+ // @ts-expect-error dst peer will not be undefined
113
+ const localAddr = new Multiaddr(request.srcPeer.addrs[0])
114
+ const maConn = streamToMaConnection({
115
+ stream: virtualConnection,
116
+ remoteAddr,
117
+ localAddr
118
+ })
119
+ const type = request.type === CircuitPB.Type.HOP ? 'relay' : 'inbound'
120
+ log('new %s connection %s', type, maConn.remoteAddr)
121
+
122
+ const conn = await this.components.getUpgrader().upgradeInbound(maConn)
123
+ log('%s connection %s upgraded', type, maConn.remoteAddr)
124
+
125
+ if (this.handler != null) {
126
+ this.handler(conn)
127
+ }
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Dial a peer over a relay
133
+ */
134
+ async dial (ma: Multiaddr, options: AbortOptions = {}): Promise<Connection> {
135
+ // Check the multiaddr to see if it contains a relay and a destination peer
136
+ const addrs = ma.toString().split('/p2p-circuit')
137
+ const relayAddr = new Multiaddr(addrs[0])
138
+ const destinationAddr = new Multiaddr(addrs[addrs.length - 1])
139
+ const relayId = relayAddr.getPeerId()
140
+ const destinationId = destinationAddr.getPeerId()
141
+
142
+ if (relayId == null || destinationId == null) {
143
+ const errMsg = 'Circuit relay dial failed as addresses did not have peer id'
144
+ log.error(errMsg)
145
+ throw errCode(new Error(errMsg), codes.ERR_RELAYED_DIAL)
146
+ }
147
+
148
+ const relayPeer = peerIdFromString(relayId)
149
+ const destinationPeer = peerIdFromString(destinationId)
150
+
151
+ let disconnectOnFailure = false
152
+ const relayConnections = this.components.getConnectionManager().getConnections(relayPeer)
153
+ let relayConnection = relayConnections[0]
154
+
155
+ if (relayConnection == null) {
156
+ await this.components.getPeerStore().addressBook.add(relayPeer, [relayAddr])
157
+ relayConnection = await this.components.getConnectionManager().openConnection(relayPeer, options)
158
+ disconnectOnFailure = true
159
+ }
160
+
161
+ try {
162
+ const virtualConnection = await hop({
163
+ connection: relayConnection,
164
+ request: {
165
+ type: CircuitPB.Type.HOP,
166
+ srcPeer: {
167
+ id: this.components.getPeerId().toBytes(),
168
+ addrs: this.components.getAddressManager().getAddresses().map(addr => addr.bytes)
169
+ },
170
+ dstPeer: {
171
+ id: destinationPeer.toBytes(),
172
+ addrs: [new Multiaddr(destinationAddr).bytes]
173
+ }
174
+ }
175
+ })
176
+
177
+ const localAddr = relayAddr.encapsulate(`/p2p-circuit/p2p/${this.components.getPeerId().toString()}`)
178
+ const maConn = streamToMaConnection({
179
+ stream: virtualConnection,
180
+ remoteAddr: ma,
181
+ localAddr
182
+ })
183
+ log('new outbound connection %s', maConn.remoteAddr)
184
+
185
+ return await this.components.getUpgrader().upgradeOutbound(maConn)
186
+ } catch (err: any) {
187
+ log.error('Circuit relay dial failed', err)
188
+ disconnectOnFailure && await relayConnection.close()
189
+ throw err
190
+ }
191
+ }
192
+
193
+ /**
194
+ * Create a listener
195
+ */
196
+ createListener (options: CreateListenerOptions): Listener {
197
+ // Called on successful HOP and STOP requests
198
+ this.handler = options.handler
199
+
200
+ return createListener({
201
+ connectionManager: this.components.getConnectionManager(),
202
+ peerStore: this.components.getPeerStore()
203
+ })
204
+ }
205
+
206
+ /**
207
+ * Filter check for all Multiaddrs that this transport can dial on
208
+ *
209
+ * @param {Multiaddr[]} multiaddrs
210
+ * @returns {Multiaddr[]}
211
+ */
212
+ filter (multiaddrs: Multiaddr[]): Multiaddr[] {
213
+ multiaddrs = Array.isArray(multiaddrs) ? multiaddrs : [multiaddrs]
214
+
215
+ return multiaddrs.filter((ma) => {
216
+ return mafmt.Circuit.matches(ma)
217
+ })
218
+ }
219
+ }
@@ -0,0 +1,12 @@
1
+ import { CID } from 'multiformats/cid'
2
+ import { sha256 } from 'multiformats/hashes/sha2'
3
+
4
+ /**
5
+ * Convert a namespace string into a cid
6
+ */
7
+ export async function namespaceToCid (namespace: string): Promise<CID> {
8
+ const bytes = new TextEncoder().encode(namespace)
9
+ const hash = await sha256.digest(bytes)
10
+
11
+ return CID.createV0(hash)
12
+ }