libp2p 0.42.2 → 0.43.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 (295) hide show
  1. package/README.md +4 -4
  2. package/dist/index.min.js +29 -29
  3. package/dist/src/address-manager/index.d.ts +1 -10
  4. package/dist/src/address-manager/index.d.ts.map +1 -1
  5. package/dist/src/address-manager/index.js +46 -29
  6. package/dist/src/address-manager/index.js.map +1 -1
  7. package/dist/src/autonat/constants.d.ts +4 -0
  8. package/dist/src/autonat/constants.d.ts.map +1 -0
  9. package/dist/src/autonat/constants.js +4 -0
  10. package/dist/src/autonat/constants.js.map +1 -0
  11. package/dist/src/autonat/index.d.ts +64 -0
  12. package/dist/src/autonat/index.d.ts.map +1 -0
  13. package/dist/src/autonat/index.js +417 -0
  14. package/dist/src/autonat/index.js.map +1 -0
  15. package/dist/src/autonat/pb/index.d.ts +57 -0
  16. package/dist/src/autonat/pb/index.d.ts.map +1 -0
  17. package/dist/src/autonat/pb/index.js +250 -0
  18. package/dist/src/autonat/pb/index.js.map +1 -0
  19. package/dist/src/circuit/constants.d.ts +31 -6
  20. package/dist/src/circuit/constants.d.ts.map +1 -1
  21. package/dist/src/circuit/constants.js +37 -7
  22. package/dist/src/circuit/constants.js.map +1 -1
  23. package/dist/src/circuit/index.d.ts +16 -61
  24. package/dist/src/circuit/index.d.ts.map +1 -1
  25. package/dist/src/circuit/index.js +2 -68
  26. package/dist/src/circuit/index.js.map +1 -1
  27. package/dist/src/circuit/pb/index.d.ts +83 -43
  28. package/dist/src/circuit/pb/index.d.ts.map +1 -1
  29. package/dist/src/circuit/pb/index.js +363 -127
  30. package/dist/src/circuit/pb/index.js.map +1 -1
  31. package/dist/src/circuit/server/advert-service.d.ts +43 -0
  32. package/dist/src/circuit/server/advert-service.d.ts.map +1 -0
  33. package/dist/src/circuit/server/advert-service.js +69 -0
  34. package/dist/src/circuit/server/advert-service.js.map +1 -0
  35. package/dist/src/circuit/server/index.d.ts +60 -0
  36. package/dist/src/circuit/server/index.d.ts.map +1 -0
  37. package/dist/src/circuit/server/index.js +287 -0
  38. package/dist/src/circuit/server/index.js.map +1 -0
  39. package/dist/src/circuit/server/reservation-store.d.ts +49 -0
  40. package/dist/src/circuit/server/reservation-store.d.ts.map +1 -0
  41. package/dist/src/circuit/server/reservation-store.js +57 -0
  42. package/dist/src/circuit/server/reservation-store.js.map +1 -0
  43. package/dist/src/circuit/server/reservation-voucher.d.ts +18 -0
  44. package/dist/src/circuit/server/reservation-voucher.d.ts.map +1 -0
  45. package/dist/src/circuit/server/reservation-voucher.js +33 -0
  46. package/dist/src/circuit/server/reservation-voucher.js.map +1 -0
  47. package/dist/src/circuit/transport/discovery.d.ts +45 -0
  48. package/dist/src/circuit/transport/discovery.d.ts.map +1 -0
  49. package/dist/src/circuit/transport/discovery.js +82 -0
  50. package/dist/src/circuit/transport/discovery.js.map +1 -0
  51. package/dist/src/circuit/transport/index.d.ts +33 -0
  52. package/dist/src/circuit/transport/index.d.ts.map +1 -0
  53. package/dist/src/circuit/transport/index.js +225 -0
  54. package/dist/src/circuit/transport/index.js.map +1 -0
  55. package/dist/src/circuit/transport/listener.d.ts +9 -0
  56. package/dist/src/circuit/transport/listener.d.ts.map +1 -0
  57. package/dist/src/circuit/transport/listener.js +76 -0
  58. package/dist/src/circuit/transport/listener.js.map +1 -0
  59. package/dist/src/circuit/transport/reservation-store.d.ts +60 -0
  60. package/dist/src/circuit/transport/reservation-store.d.ts.map +1 -0
  61. package/dist/src/circuit/transport/reservation-store.js +165 -0
  62. package/dist/src/circuit/transport/reservation-store.js.map +1 -0
  63. package/dist/src/circuit/utils.d.ts +7 -0
  64. package/dist/src/circuit/utils.d.ts.map +1 -1
  65. package/dist/src/circuit/utils.js +87 -0
  66. package/dist/src/circuit/utils.js.map +1 -1
  67. package/dist/src/components.d.ts +2 -1
  68. package/dist/src/components.d.ts.map +1 -1
  69. package/dist/src/components.js +13 -13
  70. package/dist/src/components.js.map +1 -1
  71. package/dist/src/config.d.ts.map +1 -1
  72. package/dist/src/config.js +21 -25
  73. package/dist/src/config.js.map +1 -1
  74. package/dist/src/connection/index.d.ts +2 -2
  75. package/dist/src/connection/index.d.ts.map +1 -1
  76. package/dist/src/connection/index.js +4 -4
  77. package/dist/src/connection/index.js.map +1 -1
  78. package/dist/src/connection-manager/auto-dialler.d.ts +0 -4
  79. package/dist/src/connection-manager/auto-dialler.d.ts.map +1 -1
  80. package/dist/src/connection-manager/auto-dialler.js +18 -18
  81. package/dist/src/connection-manager/auto-dialler.js.map +1 -1
  82. package/dist/src/connection-manager/dialer/dial-request.d.ts.map +1 -1
  83. package/dist/src/connection-manager/dialer/dial-request.js +13 -6
  84. package/dist/src/connection-manager/dialer/dial-request.js.map +1 -1
  85. package/dist/src/connection-manager/dialer/index.d.ts +10 -1
  86. package/dist/src/connection-manager/dialer/index.d.ts.map +1 -1
  87. package/dist/src/connection-manager/dialer/index.js +24 -9
  88. package/dist/src/connection-manager/dialer/index.js.map +1 -1
  89. package/dist/src/connection-manager/index.d.ts +1 -4
  90. package/dist/src/connection-manager/index.d.ts.map +1 -1
  91. package/dist/src/connection-manager/index.js +8 -5
  92. package/dist/src/connection-manager/index.js.map +1 -1
  93. package/dist/src/connection-manager/latency-monitor.d.ts.map +1 -1
  94. package/dist/src/connection-manager/latency-monitor.js +1 -1
  95. package/dist/src/connection-manager/latency-monitor.js.map +1 -1
  96. package/dist/src/connection-manager/visibility-change-emitter.d.ts.map +1 -1
  97. package/dist/src/content-routing/index.d.ts +6 -4
  98. package/dist/src/content-routing/index.d.ts.map +1 -1
  99. package/dist/src/content-routing/index.js +9 -9
  100. package/dist/src/content-routing/index.js.map +1 -1
  101. package/dist/src/content-routing/utils.d.ts +3 -3
  102. package/dist/src/content-routing/utils.d.ts.map +1 -1
  103. package/dist/src/content-routing/utils.js +2 -2
  104. package/dist/src/content-routing/utils.js.map +1 -1
  105. package/dist/src/dht/dht-content-routing.d.ts +2 -1
  106. package/dist/src/dht/dht-content-routing.d.ts.map +1 -1
  107. package/dist/src/dht/dht-content-routing.js +2 -2
  108. package/dist/src/dht/dht-content-routing.js.map +1 -1
  109. package/dist/src/dht/dht-peer-routing.d.ts +3 -2
  110. package/dist/src/dht/dht-peer-routing.d.ts.map +1 -1
  111. package/dist/src/dht/dht-peer-routing.js +2 -2
  112. package/dist/src/dht/dht-peer-routing.js.map +1 -1
  113. package/dist/src/dht/dummy-dht.d.ts +1 -1
  114. package/dist/src/dht/dummy-dht.d.ts.map +1 -1
  115. package/dist/src/dht/dummy-dht.js +12 -12
  116. package/dist/src/dht/dummy-dht.js.map +1 -1
  117. package/dist/src/errors.d.ts +2 -1
  118. package/dist/src/errors.d.ts.map +1 -1
  119. package/dist/src/errors.js +1 -0
  120. package/dist/src/errors.js.map +1 -1
  121. package/dist/src/fetch/index.d.ts.map +1 -1
  122. package/dist/src/fetch/index.js +6 -6
  123. package/dist/src/fetch/index.js.map +1 -1
  124. package/dist/src/fetch/pb/proto.d.ts +3 -3
  125. package/dist/src/fetch/pb/proto.d.ts.map +1 -1
  126. package/dist/src/fetch/pb/proto.js +4 -3
  127. package/dist/src/fetch/pb/proto.js.map +1 -1
  128. package/dist/src/get-peer.js +2 -2
  129. package/dist/src/get-peer.js.map +1 -1
  130. package/dist/src/identify/index.d.ts +3 -1
  131. package/dist/src/identify/index.d.ts.map +1 -1
  132. package/dist/src/identify/index.js +19 -14
  133. package/dist/src/identify/index.js.map +1 -1
  134. package/dist/src/identify/pb/message.d.ts +2 -2
  135. package/dist/src/identify/pb/message.d.ts.map +1 -1
  136. package/dist/src/identify/pb/message.js +1 -0
  137. package/dist/src/identify/pb/message.js.map +1 -1
  138. package/dist/src/index.d.ts +14 -8
  139. package/dist/src/index.d.ts.map +1 -1
  140. package/dist/src/index.js.map +1 -1
  141. package/dist/src/insecure/index.d.ts.map +1 -1
  142. package/dist/src/insecure/index.js.map +1 -1
  143. package/dist/src/insecure/pb/proto.d.ts +3 -3
  144. package/dist/src/insecure/pb/proto.d.ts.map +1 -1
  145. package/dist/src/insecure/pb/proto.js +4 -5
  146. package/dist/src/insecure/pb/proto.js.map +1 -1
  147. package/dist/src/libp2p.d.ts +7 -3
  148. package/dist/src/libp2p.d.ts.map +1 -1
  149. package/dist/src/libp2p.js +35 -35
  150. package/dist/src/libp2p.js.map +1 -1
  151. package/dist/src/nat-manager.d.ts.map +1 -1
  152. package/dist/src/nat-manager.js +5 -3
  153. package/dist/src/nat-manager.js.map +1 -1
  154. package/dist/src/peer-record-updater.d.ts.map +1 -1
  155. package/dist/src/peer-routing.d.ts.map +1 -1
  156. package/dist/src/peer-routing.js +5 -5
  157. package/dist/src/peer-routing.js.map +1 -1
  158. package/dist/src/ping/index.d.ts.map +1 -1
  159. package/dist/src/ping/index.js +2 -2
  160. package/dist/src/ping/index.js.map +1 -1
  161. package/dist/src/pnet/crypto.d.ts +1 -1
  162. package/dist/src/pnet/crypto.d.ts.map +1 -1
  163. package/dist/src/pnet/crypto.js +1 -1
  164. package/dist/src/pnet/crypto.js.map +1 -1
  165. package/dist/src/pnet/index.js +3 -3
  166. package/dist/src/pnet/index.js.map +1 -1
  167. package/dist/src/pnet/key-generator.d.ts.map +1 -1
  168. package/dist/src/pubsub/dummy-pubsub.js +9 -9
  169. package/dist/src/pubsub/dummy-pubsub.js.map +1 -1
  170. package/dist/src/registrar.d.ts.map +1 -1
  171. package/dist/src/registrar.js +4 -4
  172. package/dist/src/registrar.js.map +1 -1
  173. package/dist/src/transport-manager.d.ts.map +1 -1
  174. package/dist/src/transport-manager.js +8 -9
  175. package/dist/src/transport-manager.js.map +1 -1
  176. package/dist/src/upgrader.d.ts +2 -1
  177. package/dist/src/upgrader.d.ts.map +1 -1
  178. package/dist/src/upgrader.js +38 -33
  179. package/dist/src/upgrader.js.map +1 -1
  180. package/dist/typedoc-urls.json +19 -6
  181. package/package.json +36 -33
  182. package/src/address-manager/index.ts +62 -35
  183. package/src/autonat/constants.ts +4 -0
  184. package/src/autonat/index.ts +567 -0
  185. package/src/autonat/pb/index.proto +35 -0
  186. package/src/autonat/pb/index.ts +320 -0
  187. package/src/circuit/constants.ts +48 -7
  188. package/src/circuit/index.ts +17 -129
  189. package/src/circuit/pb/index.proto +57 -32
  190. package/src/circuit/pb/index.ts +448 -138
  191. package/src/circuit/server/advert-service.ts +108 -0
  192. package/src/circuit/server/index.ts +421 -0
  193. package/src/circuit/server/reservation-store.ts +111 -0
  194. package/src/circuit/server/reservation-voucher.ts +51 -0
  195. package/src/circuit/transport/discovery.ts +127 -0
  196. package/src/circuit/transport/index.ts +325 -0
  197. package/src/circuit/transport/listener.ts +99 -0
  198. package/src/circuit/transport/reservation-store.ts +249 -0
  199. package/src/circuit/utils.ts +108 -0
  200. package/src/components.ts +22 -21
  201. package/src/config.ts +21 -25
  202. package/src/connection/index.ts +10 -10
  203. package/src/connection-manager/auto-dialler.ts +36 -40
  204. package/src/connection-manager/dialer/dial-request.ts +13 -6
  205. package/src/connection-manager/dialer/index.ts +34 -15
  206. package/src/connection-manager/index.ts +22 -23
  207. package/src/connection-manager/latency-monitor.ts +9 -9
  208. package/src/connection-manager/visibility-change-emitter.ts +4 -4
  209. package/src/content-routing/index.ts +18 -16
  210. package/src/content-routing/utils.ts +5 -5
  211. package/src/dht/dht-content-routing.ts +5 -4
  212. package/src/dht/dht-peer-routing.ts +5 -4
  213. package/src/dht/dummy-dht.ts +13 -13
  214. package/src/errors.ts +2 -1
  215. package/src/fetch/index.ts +13 -13
  216. package/src/fetch/pb/proto.ts +8 -7
  217. package/src/get-peer.ts +3 -3
  218. package/src/identify/index.ts +29 -24
  219. package/src/identify/pb/message.ts +3 -2
  220. package/src/index.ts +15 -8
  221. package/src/insecure/index.ts +2 -1
  222. package/src/insecure/pb/proto.ts +8 -9
  223. package/src/libp2p.ts +52 -46
  224. package/src/nat-manager.ts +11 -9
  225. package/src/peer-record-updater.ts +4 -4
  226. package/src/peer-routing.ts +9 -9
  227. package/src/ping/index.ts +6 -6
  228. package/src/pnet/crypto.ts +3 -3
  229. package/src/pnet/index.ts +3 -3
  230. package/src/pnet/key-generator.ts +1 -1
  231. package/src/pubsub/dummy-pubsub.ts +9 -9
  232. package/src/registrar.ts +12 -12
  233. package/src/transport-manager.ts +17 -18
  234. package/src/upgrader.ts +43 -42
  235. package/src/version.ts +1 -1
  236. package/dist/src/circuit/auto-relay.d.ts +0 -46
  237. package/dist/src/circuit/auto-relay.d.ts.map +0 -1
  238. package/dist/src/circuit/auto-relay.js +0 -220
  239. package/dist/src/circuit/auto-relay.js.map +0 -1
  240. package/dist/src/circuit/circuit/hop.d.ts +0 -42
  241. package/dist/src/circuit/circuit/hop.d.ts.map +0 -1
  242. package/dist/src/circuit/circuit/hop.js +0 -142
  243. package/dist/src/circuit/circuit/hop.js.map +0 -1
  244. package/dist/src/circuit/circuit/stop.d.ts +0 -24
  245. package/dist/src/circuit/circuit/stop.d.ts.map +0 -1
  246. package/dist/src/circuit/circuit/stop.js +0 -51
  247. package/dist/src/circuit/circuit/stop.js.map +0 -1
  248. package/dist/src/circuit/circuit/stream-handler.d.ts +0 -40
  249. package/dist/src/circuit/circuit/stream-handler.d.ts.map +0 -1
  250. package/dist/src/circuit/circuit/stream-handler.js +0 -59
  251. package/dist/src/circuit/circuit/stream-handler.js.map +0 -1
  252. package/dist/src/circuit/circuit/utils.d.ts +0 -7
  253. package/dist/src/circuit/circuit/utils.d.ts.map +0 -1
  254. package/dist/src/circuit/circuit/utils.js +0 -43
  255. package/dist/src/circuit/circuit/utils.js.map +0 -1
  256. package/dist/src/circuit/listener.d.ts +0 -9
  257. package/dist/src/circuit/listener.d.ts.map +0 -1
  258. package/dist/src/circuit/listener.js +0 -62
  259. package/dist/src/circuit/listener.js.map +0 -1
  260. package/dist/src/circuit/multicodec.d.ts +0 -2
  261. package/dist/src/circuit/multicodec.d.ts.map +0 -1
  262. package/dist/src/circuit/multicodec.js +0 -2
  263. package/dist/src/circuit/multicodec.js.map +0 -1
  264. package/dist/src/circuit/transport.d.ts +0 -51
  265. package/dist/src/circuit/transport.d.ts.map +0 -1
  266. package/dist/src/circuit/transport.js +0 -223
  267. package/dist/src/circuit/transport.js.map +0 -1
  268. package/dist/src/keychain/cms.d.ts +0 -33
  269. package/dist/src/keychain/cms.d.ts.map +0 -1
  270. package/dist/src/keychain/cms.js +0 -129
  271. package/dist/src/keychain/cms.js.map +0 -1
  272. package/dist/src/keychain/index.d.ts +0 -151
  273. package/dist/src/keychain/index.d.ts.map +0 -1
  274. package/dist/src/keychain/index.js +0 -519
  275. package/dist/src/keychain/index.js.map +0 -1
  276. package/dist/src/keychain/util.d.ts +0 -21
  277. package/dist/src/keychain/util.d.ts.map +0 -1
  278. package/dist/src/keychain/util.js +0 -79
  279. package/dist/src/keychain/util.js.map +0 -1
  280. package/src/circuit/IMPLEMENTATION_NOTES.md +0 -128
  281. package/src/circuit/README.md +0 -111
  282. package/src/circuit/auto-relay.ts +0 -292
  283. package/src/circuit/circuit/hop.ts +0 -220
  284. package/src/circuit/circuit/stop.ts +0 -83
  285. package/src/circuit/circuit/stream-handler.ts +0 -87
  286. package/src/circuit/circuit/utils.ts +0 -44
  287. package/src/circuit/listener.ts +0 -83
  288. package/src/circuit/multicodec.ts +0 -2
  289. package/src/circuit/transport.ts +0 -278
  290. package/src/keychain/README.md +0 -55
  291. package/src/keychain/cms.ts +0 -150
  292. package/src/keychain/doc/private-key.png +0 -0
  293. package/src/keychain/doc/private-key.xml +0 -1
  294. package/src/keychain/index.ts +0 -629
  295. package/src/keychain/util.ts +0 -82
@@ -60,19 +60,10 @@ export declare class DefaultAddressManager extends EventEmitter<AddressManagerEv
60
60
  getObservedAddrs(): Multiaddr[];
61
61
  /**
62
62
  * Add peer observed addresses
63
- * Signal that we have confidence an observed multiaddr is publicly dialable -
64
- * this will make it appear in the output of getAddresses()
65
63
  */
64
+ addObservedAddr(addr: Multiaddr): void;
66
65
  confirmObservedAddr(addr: Multiaddr): void;
67
- /**
68
- * Signal that we do not have confidence an observed multiaddr is publicly dialable -
69
- * this will remove it from the output of getObservedAddrs()
70
- */
71
66
  removeObservedAddr(addr: Multiaddr): void;
72
- /**
73
- * Add peer observed addresses
74
- */
75
- addObservedAddr(addr: string | Multiaddr): void;
76
67
  getAddresses(): Multiaddr[];
77
68
  }
78
69
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/address-manager/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AAC7E,OAAO,EAAe,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAGxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAEnE,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,cAAc,CAAC,EAAE,aAAa,CAAA;IAE9B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IAEjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IAEnB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,gBAAgB,CAAA;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAAA;CAClC;AAID,qBAAa,qBAAsB,SAAQ,YAAY,CAAC,oBAAoB,CAAC;IAC3E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAE5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAe;IAE9C;;;;;OAKG;gBACU,UAAU,EAAE,+BAA+B,EAAE,IAAI,EAAE,kBAAkB;IAYlF;;OAEG;IACH,cAAc,IAAK,SAAS,EAAE;IAI9B;;OAEG;IACH,gBAAgB,IAAK,SAAS,EAAE;IAIhC;;OAEG;IACH,gBAAgB,IAAK,SAAS,EAAE;IAIhC;;;;OAIG;IACH,mBAAmB,CAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAI3C;;;OAGG;IACH,kBAAkB,CAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAI1C;;OAEG;IACH,eAAe,CAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAyBhD,YAAY,IAAK,SAAS,EAAE;CA6B7B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/address-manager/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AAC7E,OAAO,EAAe,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAGxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAEnE,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,cAAc,CAAC,EAAE,aAAa,CAAA;IAE9B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IAEjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IAEnB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,gBAAgB,CAAA;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAAA;CAClC;AA2BD,qBAAa,qBAAsB,SAAQ,YAAY,CAAC,oBAAoB,CAAC;IAC3E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAE5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAC/D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAe;IAE9C;;;;;OAKG;gBACU,UAAU,EAAE,+BAA+B,EAAE,IAAI,EAAE,kBAAkB;IAYlF;;OAEG;IACH,cAAc,IAAK,SAAS,EAAE;IAI9B;;OAEG;IACH,gBAAgB,IAAK,SAAS,EAAE;IAIhC;;OAEG;IACH,gBAAgB,IAAK,SAAS,EAAE;IAIhC;;OAEG;IACH,eAAe,CAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAcvC,mBAAmB,CAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAoB3C,kBAAkB,CAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAO1C,YAAY,IAAK,SAAS,EAAE;CAkC7B"}
@@ -2,6 +2,21 @@ import { CustomEvent, EventEmitter } from '@libp2p/interfaces/events';
2
2
  import { multiaddr } from '@multiformats/multiaddr';
3
3
  import { peerIdFromString } from '@libp2p/peer-id';
4
4
  const defaultAddressFilter = (addrs) => addrs;
5
+ /**
6
+ * If the passed multiaddr contains the passed peer id, remove it
7
+ */
8
+ function stripPeerId(ma, peerId) {
9
+ const observedPeerIdStr = ma.getPeerId();
10
+ // strip our peer id if it has been passed
11
+ if (observedPeerIdStr != null) {
12
+ const observedPeerId = peerIdFromString(observedPeerIdStr);
13
+ // use same encoding for comparison
14
+ if (observedPeerId.equals(peerId)) {
15
+ ma = ma.decapsulate(multiaddr(`/p2p/${peerId.toString()}`));
16
+ }
17
+ }
18
+ return ma;
19
+ }
5
20
  export class DefaultAddressManager extends EventEmitter {
6
21
  /**
7
22
  * Responsible for managing the peer addresses.
@@ -15,7 +30,7 @@ export class DefaultAddressManager extends EventEmitter {
15
30
  this.components = components;
16
31
  this.listen = listen.map(ma => ma.toString());
17
32
  this.announce = new Set(announce.map(ma => ma.toString()));
18
- this.observed = new Set();
33
+ this.observed = new Map();
19
34
  this.announceFilter = init.announceFilter ?? defaultAddressFilter;
20
35
  }
21
36
  /**
@@ -34,42 +49,41 @@ export class DefaultAddressManager extends EventEmitter {
34
49
  * Get observed multiaddrs
35
50
  */
36
51
  getObservedAddrs() {
37
- return Array.from(this.observed).map((a) => multiaddr(a));
38
- }
39
- /**
40
- * Add peer observed addresses
41
- * Signal that we have confidence an observed multiaddr is publicly dialable -
42
- * this will make it appear in the output of getAddresses()
43
- */
44
- confirmObservedAddr(addr) {
45
- }
46
- /**
47
- * Signal that we do not have confidence an observed multiaddr is publicly dialable -
48
- * this will remove it from the output of getObservedAddrs()
49
- */
50
- removeObservedAddr(addr) {
52
+ return Array.from(this.observed).map(([a]) => multiaddr(a));
51
53
  }
52
54
  /**
53
55
  * Add peer observed addresses
54
56
  */
55
57
  addObservedAddr(addr) {
56
- let ma = multiaddr(addr);
57
- const remotePeer = ma.getPeerId();
58
- // strip our peer id if it has been passed
59
- if (remotePeer != null) {
60
- const remotePeerId = peerIdFromString(remotePeer);
61
- // use same encoding for comparison
62
- if (remotePeerId.equals(this.components.peerId)) {
63
- ma = ma.decapsulate(multiaddr(`/p2p/${this.components.peerId.toString()}`));
64
- }
65
- }
66
- const addrString = ma.toString();
58
+ addr = stripPeerId(addr, this.components.peerId);
59
+ const addrString = addr.toString();
67
60
  // do not trigger the change:addresses event if we already know about this address
68
61
  if (this.observed.has(addrString)) {
69
62
  return;
70
63
  }
71
- this.observed.add(addrString);
72
- this.dispatchEvent(new CustomEvent('change:addresses'));
64
+ this.observed.set(addrString, {
65
+ confident: false
66
+ });
67
+ }
68
+ confirmObservedAddr(addr) {
69
+ addr = stripPeerId(addr, this.components.peerId);
70
+ const addrString = addr.toString();
71
+ const metadata = this.observed.get(addrString) ?? {
72
+ confident: false
73
+ };
74
+ const startingConfidence = metadata.confident;
75
+ this.observed.set(addrString, {
76
+ confident: true
77
+ });
78
+ // only trigger the change:addresses event if our confidence in an address has changed
79
+ if (!startingConfidence) {
80
+ this.dispatchEvent(new CustomEvent('change:addresses'));
81
+ }
82
+ }
83
+ removeObservedAddr(addr) {
84
+ addr = stripPeerId(addr, this.components.peerId);
85
+ const addrString = addr.toString();
86
+ this.observed.delete(addrString);
73
87
  }
74
88
  getAddresses() {
75
89
  let addrs = this.getAnnounceAddrs().map(ma => ma.toString());
@@ -77,7 +91,10 @@ export class DefaultAddressManager extends EventEmitter {
77
91
  // no configured announce addrs, add configured listen addresses
78
92
  addrs = this.components.transportManager.getAddrs().map(ma => ma.toString());
79
93
  }
80
- addrs = addrs.concat(this.getObservedAddrs().map(ma => ma.toString()));
94
+ // add observed addresses we are confident in
95
+ addrs = addrs.concat(Array.from(this.observed)
96
+ .filter(([ma, metadata]) => metadata.confident)
97
+ .map(([ma]) => ma));
81
98
  // dedupe multiaddrs
82
99
  const addrSet = new Set(addrs);
83
100
  // Create advertising list
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/address-manager/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAErE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAwClD,MAAM,oBAAoB,GAAG,CAAC,KAAkB,EAAe,EAAE,CAAC,KAAK,CAAA;AAEvE,MAAM,OAAO,qBAAsB,SAAQ,YAAkC;IAQ3E;;;;;OAKG;IACH,YAAa,UAA2C,EAAE,IAAwB;QAChF,KAAK,EAAE,CAAA;QAEP,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,GAAG,EAAE,EAAE,GAAG,IAAI,CAAA;QAE3C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC7C,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QAC1D,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAA;QACzB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,oBAAoB,CAAA;IACnE,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IACzD,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3D,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3D,CAAC;IAED;;;;OAIG;IACH,mBAAmB,CAAE,IAAe;IAEpC,CAAC;IAED;;;OAGG;IACH,kBAAkB,CAAE,IAAe;IAEnC,CAAC;IAED;;OAEG;IACH,eAAe,CAAE,IAAwB;QACvC,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;QACxB,MAAM,UAAU,GAAG,EAAE,CAAC,SAAS,EAAE,CAAA;QAEjC,0CAA0C;QAC1C,IAAI,UAAU,IAAI,IAAI,EAAE;YACtB,MAAM,YAAY,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAA;YAEjD,mCAAmC;YACnC,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;gBAC/C,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAA;aAC5E;SACF;QAED,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA;QAEhC,kFAAkF;QAClF,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YACjC,OAAM;SACP;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAA;IACzD,CAAC;IAED,YAAY;QACV,IAAI,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;QAE5D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YACtB,gEAAgE;YAChE,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;SAC7E;QAED,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QAEtE,oBAAoB;QACpB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;QAE9B,0BAA0B;QAC1B,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;aAC3C,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;aAC3B,GAAG,CAAC,EAAE,CAAC,EAAE;YACR,0EAA0E;YAC1E,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,IAAI,KAAK,IAAI,EAAE;gBACpC,OAAO,EAAE,CAAA;aACV;YAED,IAAI,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE;gBACxD,OAAO,EAAE,CAAA;aACV;YAED,OAAO,EAAE,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QACpE,CAAC,CAAC,CAAA;IACN,CAAC;CACF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/address-manager/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const PROTOCOL = "/libp2p/autonat/1.0.0";
2
+ export declare const PROTOCOL_VERSION = "1.0.0";
3
+ export declare const PROTOCOL_NAME = "autonat";
4
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/autonat/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,QAAQ,0BAA0B,CAAA;AAC/C,eAAO,MAAM,gBAAgB,UAAU,CAAA;AACvC,eAAO,MAAM,aAAa,YAAY,CAAA"}
@@ -0,0 +1,4 @@
1
+ export const PROTOCOL = '/libp2p/autonat/1.0.0';
2
+ export const PROTOCOL_VERSION = '1.0.0';
3
+ export const PROTOCOL_NAME = 'autonat';
4
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/autonat/constants.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,QAAQ,GAAG,uBAAuB,CAAA;AAC/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAA;AACvC,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAA"}
@@ -0,0 +1,64 @@
1
+ import type { AddressManager } from '@libp2p/interface-address-manager';
2
+ import type { ConnectionManager, Dialer } from '@libp2p/interface-connection-manager';
3
+ import type { PeerId } from '@libp2p/interface-peer-id';
4
+ import type { PeerRouting } from '@libp2p/interface-peer-routing';
5
+ import type { IncomingStreamData, Registrar } from '@libp2p/interface-registrar';
6
+ import type { TransportManager } from '@libp2p/interface-transport';
7
+ import type { Startable } from '@libp2p/interfaces/startable';
8
+ export interface AutonatServiceInit {
9
+ /**
10
+ * Allows overriding the protocol prefix used
11
+ */
12
+ protocolPrefix: string;
13
+ /**
14
+ * How long we should wait for a remote peer to verify our external address
15
+ */
16
+ timeout: number;
17
+ /**
18
+ * How long to wait after startup before trying to verify our external address
19
+ */
20
+ startupDelay: number;
21
+ /**
22
+ * Verify our external addresses this often
23
+ */
24
+ refreshInterval: number;
25
+ /**
26
+ * How many parallel inbound autonat streams we allow per-connection
27
+ */
28
+ maxInboundStreams: number;
29
+ /**
30
+ * How many parallel outbound autonat streams we allow per-connection
31
+ */
32
+ maxOutboundStreams: number;
33
+ }
34
+ export interface DefaultAutonatComponents {
35
+ registrar: Registrar;
36
+ addressManager: AddressManager;
37
+ transportManager: TransportManager;
38
+ dialer: Dialer;
39
+ peerId: PeerId;
40
+ connectionManager: ConnectionManager;
41
+ peerRouting: PeerRouting;
42
+ }
43
+ export declare class AutonatService implements Startable {
44
+ private readonly components;
45
+ private readonly _init;
46
+ private readonly startupDelay;
47
+ private readonly refreshInterval;
48
+ private verifyAddressTimeout?;
49
+ private started;
50
+ constructor(components: DefaultAutonatComponents, init: AutonatServiceInit);
51
+ isStarted(): boolean;
52
+ start(): Promise<void>;
53
+ stop(): Promise<void>;
54
+ /**
55
+ * Handle an incoming autonat request
56
+ */
57
+ handleIncomingAutonatStream(data: IncomingStreamData): Promise<void>;
58
+ _verifyExternalAddresses(): void;
59
+ /**
60
+ * Our multicodec topology noticed a new peer that supports autonat
61
+ */
62
+ verifyExternalAddresses(): Promise<void>;
63
+ }
64
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/autonat/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AAEvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAA;AACrF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAgC7D,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAA;IAEtB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf;;OAEG;IACH,YAAY,EAAE,MAAM,CAAA;IAEpB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAA;IAEvB;;OAEG;IACH,iBAAiB,EAAE,MAAM,CAAA;IAEzB;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,SAAS,CAAA;IACpB,cAAc,EAAE,cAAc,CAAA;IAC9B,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,WAAW,EAAE,WAAW,CAAA;CACzB;AAED,qBAAa,cAAe,YAAW,SAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,oBAAoB,CAAC,CAA+B;IAC5D,OAAO,CAAC,OAAO,CAAS;gBAEX,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,kBAAkB;IAU3E,SAAS,IAAK,OAAO;IAIf,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAoBvB,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;IACG,2BAA2B,CAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8O3E,wBAAwB,IAAK,IAAI;IAOjC;;OAEG;IACG,uBAAuB,IAAK,OAAO,CAAC,IAAI,CAAC;CAwLhD"}
@@ -0,0 +1,417 @@
1
+ import { logger } from '@libp2p/logger';
2
+ import { peerIdFromBytes } from '@libp2p/peer-id';
3
+ import { createEd25519PeerId } from '@libp2p/peer-id-factory';
4
+ import { multiaddr, protocols } from '@multiformats/multiaddr';
5
+ import { abortableDuplex } from 'abortable-iterator';
6
+ import { setMaxListeners } from 'events';
7
+ import first from 'it-first';
8
+ import * as lp from 'it-length-prefixed';
9
+ import map from 'it-map';
10
+ import parallel from 'it-parallel';
11
+ import { pipe } from 'it-pipe';
12
+ import isPrivateIp from 'private-ip';
13
+ import { TimeoutController } from 'timeout-abort-controller';
14
+ import { PROTOCOL } from './constants.js';
15
+ import { Message } from './pb/index.js';
16
+ const log = logger('libp2p:autonat');
17
+ // if more than 3 peers manage to dial us on what we believe to be our external
18
+ // IP then we are convinced that it is, in fact, our external IP
19
+ // https://github.com/libp2p/specs/blob/master/autonat/README.md#autonat-protocol
20
+ const REQUIRED_SUCCESSFUL_DIALS = 4;
21
+ // Wait this long before we start to query autonat nodes
22
+ const AUTONAT_STARTUP_DELAY = 5000;
23
+ // Only try to verify our external address this often
24
+ const AUTONAT_REFRESH_INTERVAL = 60000;
25
+ export class AutonatService {
26
+ constructor(components, init) {
27
+ this.components = components;
28
+ this.started = false;
29
+ this._init = init;
30
+ this.startupDelay = init.startupDelay ?? AUTONAT_STARTUP_DELAY;
31
+ this.refreshInterval = init.refreshInterval ?? AUTONAT_REFRESH_INTERVAL;
32
+ this._verifyExternalAddresses = this._verifyExternalAddresses.bind(this);
33
+ }
34
+ isStarted() {
35
+ return this.started;
36
+ }
37
+ async start() {
38
+ if (this.started) {
39
+ return;
40
+ }
41
+ await this.components.registrar.handle(PROTOCOL, (data) => {
42
+ void this.handleIncomingAutonatStream(data)
43
+ .catch(err => {
44
+ log.error(err);
45
+ });
46
+ }, {
47
+ maxInboundStreams: this._init.maxInboundStreams,
48
+ maxOutboundStreams: this._init.maxOutboundStreams
49
+ });
50
+ this.verifyAddressTimeout = setTimeout(this._verifyExternalAddresses, this.startupDelay);
51
+ this.started = true;
52
+ }
53
+ async stop() {
54
+ await this.components.registrar.unhandle(PROTOCOL);
55
+ clearTimeout(this.verifyAddressTimeout);
56
+ this.started = false;
57
+ }
58
+ /**
59
+ * Handle an incoming autonat request
60
+ */
61
+ async handleIncomingAutonatStream(data) {
62
+ const controller = new TimeoutController(this._init.timeout);
63
+ // this controller may be used while dialing lots of peers so prevent MaxListenersExceededWarning
64
+ // appearing in the console
65
+ try {
66
+ // fails on node < 15.4
67
+ setMaxListeners?.(Infinity, controller.signal);
68
+ }
69
+ catch { }
70
+ const ourHosts = this.components.addressManager.getAddresses()
71
+ .map(ma => ma.toOptions().host);
72
+ try {
73
+ const source = abortableDuplex(data.stream, controller.signal);
74
+ const self = this;
75
+ await pipe(source, lp.decode(), async function* (stream) {
76
+ const buf = await first(stream);
77
+ if (buf == null) {
78
+ log('No message received');
79
+ yield Message.encode({
80
+ type: Message.MessageType.DIAL_RESPONSE,
81
+ dialResponse: {
82
+ status: Message.ResponseStatus.E_BAD_REQUEST,
83
+ statusText: 'No message was sent'
84
+ }
85
+ });
86
+ return;
87
+ }
88
+ let request;
89
+ try {
90
+ request = Message.decode(buf);
91
+ }
92
+ catch (err) {
93
+ log.error('Could not decode message', err);
94
+ yield Message.encode({
95
+ type: Message.MessageType.DIAL_RESPONSE,
96
+ dialResponse: {
97
+ status: Message.ResponseStatus.E_BAD_REQUEST,
98
+ statusText: 'Could not decode message'
99
+ }
100
+ });
101
+ return;
102
+ }
103
+ const dialRequest = request.dial;
104
+ if (dialRequest == null) {
105
+ log.error('Dial was missing from message');
106
+ yield Message.encode({
107
+ type: Message.MessageType.DIAL_RESPONSE,
108
+ dialResponse: {
109
+ status: Message.ResponseStatus.E_BAD_REQUEST,
110
+ statusText: 'No Dial message found in message'
111
+ }
112
+ });
113
+ return;
114
+ }
115
+ let peerId;
116
+ const peer = dialRequest.peer;
117
+ if (peer == null || peer.id == null) {
118
+ log.error('PeerId missing from message');
119
+ yield Message.encode({
120
+ type: Message.MessageType.DIAL_RESPONSE,
121
+ dialResponse: {
122
+ status: Message.ResponseStatus.E_BAD_REQUEST,
123
+ statusText: 'missing peer info'
124
+ }
125
+ });
126
+ return;
127
+ }
128
+ try {
129
+ peerId = peerIdFromBytes(peer.id);
130
+ }
131
+ catch (err) {
132
+ log.error('Invalid PeerId', err);
133
+ yield Message.encode({
134
+ type: Message.MessageType.DIAL_RESPONSE,
135
+ dialResponse: {
136
+ status: Message.ResponseStatus.E_BAD_REQUEST,
137
+ statusText: 'bad peer id'
138
+ }
139
+ });
140
+ return;
141
+ }
142
+ log('Incoming request from %p', peerId);
143
+ // reject any dial requests that arrive via relays
144
+ if (!data.connection.remotePeer.equals(peerId)) {
145
+ log('Target peer %p did not equal sending peer %p', peerId, data.connection.remotePeer);
146
+ yield Message.encode({
147
+ type: Message.MessageType.DIAL_RESPONSE,
148
+ dialResponse: {
149
+ status: Message.ResponseStatus.E_BAD_REQUEST,
150
+ statusText: 'peer id mismatch'
151
+ }
152
+ });
153
+ return;
154
+ }
155
+ // get a list of multiaddrs to dial
156
+ const multiaddrs = peer.addrs
157
+ .map(buf => multiaddr(buf))
158
+ .filter(ma => {
159
+ const isFromSameHost = ma.toOptions().host === data.connection.remoteAddr.toOptions().host;
160
+ log.trace('Request to dial %s was sent from %s is same host %s', ma, data.connection.remoteAddr, isFromSameHost);
161
+ // skip any Multiaddrs where the target node's IP does not match the sending node's IP
162
+ return isFromSameHost;
163
+ })
164
+ .filter(ma => {
165
+ const host = ma.toOptions().host;
166
+ const isPublicIp = !(isPrivateIp(host) ?? false);
167
+ log.trace('Host %s was public %s', host, isPublicIp);
168
+ // don't try to dial private addresses
169
+ return isPublicIp;
170
+ })
171
+ .filter(ma => {
172
+ const host = ma.toOptions().host;
173
+ const isNotOurHost = !ourHosts.includes(host);
174
+ log.trace('Host %s was not our host %s', host, isNotOurHost);
175
+ // don't try to dial nodes on the same host as us
176
+ return isNotOurHost;
177
+ })
178
+ .filter(ma => {
179
+ const isSupportedTransport = Boolean(self.components.transportManager.transportForMultiaddr(ma));
180
+ log.trace('Transport for %s is supported %s', ma, isSupportedTransport);
181
+ // skip any Multiaddrs that have transports we do not support
182
+ return isSupportedTransport;
183
+ })
184
+ .map(ma => {
185
+ if (ma.getPeerId() == null) {
186
+ // make sure we have the PeerId as part of the Multiaddr
187
+ ma = ma.encapsulate(`/p2p/${peerId.toString()}`);
188
+ }
189
+ return ma;
190
+ });
191
+ // make sure we have something to dial
192
+ if (multiaddrs.length === 0) {
193
+ log('No valid multiaddrs for %p in message', peerId);
194
+ yield Message.encode({
195
+ type: Message.MessageType.DIAL_RESPONSE,
196
+ dialResponse: {
197
+ status: Message.ResponseStatus.E_DIAL_REFUSED,
198
+ statusText: 'no dialable addresses'
199
+ }
200
+ });
201
+ return;
202
+ }
203
+ log('Dial multiaddrs %s for peer %p', multiaddrs.map(ma => ma.toString()).join(', '), peerId);
204
+ let errorMessage = '';
205
+ let lastMultiaddr = multiaddrs[0];
206
+ for await (const multiaddr of multiaddrs) {
207
+ let connection;
208
+ lastMultiaddr = multiaddr;
209
+ try {
210
+ // use the dialer so we can dial a specific multiaddr instead of every known
211
+ // multiaddr for the peer
212
+ connection = await self.components.dialer.dial(multiaddr, {
213
+ signal: controller.signal
214
+ });
215
+ if (!connection.remoteAddr.equals(multiaddr)) {
216
+ log.error('Tried to dial %s but dialed %s', multiaddr, connection.remoteAddr);
217
+ throw new Error('Unexpected remote address');
218
+ }
219
+ log('Success %p', peerId);
220
+ yield Message.encode({
221
+ type: Message.MessageType.DIAL_RESPONSE,
222
+ dialResponse: {
223
+ status: Message.ResponseStatus.OK,
224
+ addr: connection.remoteAddr.decapsulateCode(protocols('p2p').code).bytes
225
+ }
226
+ });
227
+ return;
228
+ }
229
+ catch (err) {
230
+ log('Could not dial %p', peerId, err);
231
+ errorMessage = err.message;
232
+ }
233
+ finally {
234
+ if (connection != null) {
235
+ await connection.close();
236
+ }
237
+ }
238
+ }
239
+ yield Message.encode({
240
+ type: Message.MessageType.DIAL_RESPONSE,
241
+ dialResponse: {
242
+ status: Message.ResponseStatus.E_DIAL_ERROR,
243
+ statusText: errorMessage,
244
+ addr: lastMultiaddr.bytes
245
+ }
246
+ });
247
+ }, lp.encode(),
248
+ // pipe to the stream, not the abortable source other wise we
249
+ // can't tell the remote when a dial timed out..
250
+ data.stream);
251
+ }
252
+ finally {
253
+ controller.clear();
254
+ }
255
+ }
256
+ _verifyExternalAddresses() {
257
+ void this.verifyExternalAddresses()
258
+ .catch(err => {
259
+ log.error(err);
260
+ });
261
+ }
262
+ /**
263
+ * Our multicodec topology noticed a new peer that supports autonat
264
+ */
265
+ async verifyExternalAddresses() {
266
+ clearTimeout(this.verifyAddressTimeout);
267
+ // Do not try to push if we are not running
268
+ if (!this.isStarted()) {
269
+ return;
270
+ }
271
+ const addressManager = this.components.addressManager;
272
+ const multiaddrs = addressManager.getObservedAddrs()
273
+ .filter(ma => {
274
+ const options = ma.toOptions();
275
+ return !(isPrivateIp(options.host) ?? false);
276
+ });
277
+ if (multiaddrs.length === 0) {
278
+ log('No public addresses found, not requesting verification');
279
+ this.verifyAddressTimeout = setTimeout(this._verifyExternalAddresses, this.refreshInterval);
280
+ return;
281
+ }
282
+ const controller = new TimeoutController(this._init.timeout);
283
+ // this controller may be used while dialing lots of peers so prevent MaxListenersExceededWarning
284
+ // appearing in the console
285
+ try {
286
+ // fails on node < 15.4
287
+ setMaxListeners?.(Infinity, controller.signal);
288
+ }
289
+ catch { }
290
+ const self = this;
291
+ try {
292
+ log('verify multiaddrs %s', multiaddrs.map(ma => ma.toString()).join(', '));
293
+ const request = Message.encode({
294
+ type: Message.MessageType.DIAL,
295
+ dial: {
296
+ peer: {
297
+ id: this.components.peerId.toBytes(),
298
+ addrs: multiaddrs.map(map => map.bytes)
299
+ }
300
+ }
301
+ });
302
+ // find some random peers
303
+ const randomPeer = await createEd25519PeerId();
304
+ const randomCid = randomPeer.toBytes();
305
+ const results = {};
306
+ const networkSegments = [];
307
+ async function verifyAddress(peer) {
308
+ try {
309
+ log('Asking %p to verify multiaddr', peer.id);
310
+ const connection = await self.components.connectionManager.openConnection(peer.id, {
311
+ signal: controller.signal
312
+ });
313
+ const stream = await connection.newStream(PROTOCOL, {
314
+ signal: controller.signal
315
+ });
316
+ const source = abortableDuplex(stream, controller.signal);
317
+ const buf = await pipe([request], lp.encode(), source, lp.decode(), async (stream) => await first(stream));
318
+ if (buf == null) {
319
+ log('No response received from %s', connection.remotePeer);
320
+ return undefined;
321
+ }
322
+ const response = Message.decode(buf);
323
+ if (response.type !== Message.MessageType.DIAL_RESPONSE || response.dialResponse == null) {
324
+ log('Invalid autonat response from %s', connection.remotePeer);
325
+ return undefined;
326
+ }
327
+ if (response.dialResponse.status === Message.ResponseStatus.OK) {
328
+ // make sure we use different network segments
329
+ const options = connection.remoteAddr.toOptions();
330
+ let segment;
331
+ if (options.family === 4) {
332
+ const octets = options.host.split('.');
333
+ segment = octets[0];
334
+ }
335
+ else if (options.family === 6) {
336
+ const octets = options.host.split(':');
337
+ segment = octets[0];
338
+ }
339
+ else {
340
+ log('Remote address "%s" was not IP4 or IP6?', options.host);
341
+ return undefined;
342
+ }
343
+ if (networkSegments.includes(segment)) {
344
+ log('Already have response from network segment %d - %s', segment, options.host);
345
+ return undefined;
346
+ }
347
+ networkSegments.push(segment);
348
+ }
349
+ return response.dialResponse;
350
+ }
351
+ catch (err) {
352
+ log.error(err);
353
+ }
354
+ }
355
+ for await (const dialResponse of parallel(map(this.components.peerRouting.getClosestPeers(randomCid, {
356
+ signal: controller.signal
357
+ }), (peer) => async () => await verifyAddress(peer)), {
358
+ concurrency: REQUIRED_SUCCESSFUL_DIALS
359
+ })) {
360
+ try {
361
+ if (dialResponse == null) {
362
+ continue;
363
+ }
364
+ // they either told us which address worked/didn't work, or we only sent them one address
365
+ const addr = dialResponse.addr == null ? multiaddrs[0] : multiaddr(dialResponse.addr);
366
+ log('Autonat response for %s is %s', addr, dialResponse.status);
367
+ if (dialResponse.status === Message.ResponseStatus.E_BAD_REQUEST) {
368
+ // the remote could not parse our request
369
+ continue;
370
+ }
371
+ if (dialResponse.status === Message.ResponseStatus.E_DIAL_REFUSED) {
372
+ // the remote could not honour our request
373
+ continue;
374
+ }
375
+ if (dialResponse.addr == null && multiaddrs.length > 1) {
376
+ // we sent the remote multiple addrs but they didn't tell us which ones worked/didn't work
377
+ continue;
378
+ }
379
+ if (!multiaddrs.some(ma => ma.equals(addr))) {
380
+ log('Peer reported %s as %s but it was not in our observed address list', addr, dialResponse.status);
381
+ continue;
382
+ }
383
+ const addrStr = addr.toString();
384
+ if (results[addrStr] == null) {
385
+ results[addrStr] = { success: 0, failure: 0 };
386
+ }
387
+ if (dialResponse.status === Message.ResponseStatus.OK) {
388
+ results[addrStr].success++;
389
+ }
390
+ else if (dialResponse.status === Message.ResponseStatus.E_DIAL_ERROR) {
391
+ results[addrStr].failure++;
392
+ }
393
+ if (results[addrStr].success === REQUIRED_SUCCESSFUL_DIALS) {
394
+ // we are now convinced
395
+ log('%s is externally dialable', addr);
396
+ addressManager.confirmObservedAddr(addr);
397
+ return;
398
+ }
399
+ if (results[addrStr].failure === REQUIRED_SUCCESSFUL_DIALS) {
400
+ // we are now unconvinced
401
+ log('%s is not externally dialable', addr);
402
+ addressManager.removeObservedAddr(addr);
403
+ return;
404
+ }
405
+ }
406
+ catch (err) {
407
+ log.error('Could not verify external address', err);
408
+ }
409
+ }
410
+ }
411
+ finally {
412
+ controller.clear();
413
+ this.verifyAddressTimeout = setTimeout(this._verifyExternalAddresses, this.refreshInterval);
414
+ }
415
+ }
416
+ }
417
+ //# sourceMappingURL=index.js.map