libp2p 0.46.21 → 1.0.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 (301) hide show
  1. package/README.md +51 -47
  2. package/dist/index.min.js +40 -28
  3. package/dist/src/address-manager/index.d.ts +4 -5
  4. package/dist/src/address-manager/index.d.ts.map +1 -1
  5. package/dist/src/address-manager/index.js +3 -3
  6. package/dist/src/address-manager/index.js.map +1 -1
  7. package/dist/src/components.d.ts +4 -15
  8. package/dist/src/components.d.ts.map +1 -1
  9. package/dist/src/components.js +2 -2
  10. package/dist/src/components.js.map +1 -1
  11. package/dist/src/config/connection-gater.browser.d.ts +1 -1
  12. package/dist/src/config/connection-gater.browser.d.ts.map +1 -1
  13. package/dist/src/config/connection-gater.browser.js.map +1 -1
  14. package/dist/src/config/connection-gater.d.ts +1 -1
  15. package/dist/src/config/connection-gater.d.ts.map +1 -1
  16. package/dist/src/config.d.ts.map +1 -1
  17. package/dist/src/config.js +1 -2
  18. package/dist/src/config.js.map +1 -1
  19. package/dist/src/connection/index.d.ts +4 -6
  20. package/dist/src/connection/index.d.ts.map +1 -1
  21. package/dist/src/connection/index.js +11 -13
  22. package/dist/src/connection/index.js.map +1 -1
  23. package/dist/src/connection-manager/auto-dial.d.ts +3 -6
  24. package/dist/src/connection-manager/auto-dial.d.ts.map +1 -1
  25. package/dist/src/connection-manager/auto-dial.js +21 -21
  26. package/dist/src/connection-manager/auto-dial.js.map +1 -1
  27. package/dist/src/connection-manager/connection-pruner.d.ts +3 -5
  28. package/dist/src/connection-manager/connection-pruner.d.ts.map +1 -1
  29. package/dist/src/connection-manager/connection-pruner.js +8 -8
  30. package/dist/src/connection-manager/connection-pruner.js.map +1 -1
  31. package/dist/src/connection-manager/constants.defaults.d.ts +0 -4
  32. package/dist/src/connection-manager/constants.defaults.d.ts.map +1 -1
  33. package/dist/src/connection-manager/constants.defaults.js +0 -4
  34. package/dist/src/connection-manager/constants.defaults.js.map +1 -1
  35. package/dist/src/connection-manager/dial-queue.d.ts +3 -10
  36. package/dist/src/connection-manager/dial-queue.d.ts.map +1 -1
  37. package/dist/src/connection-manager/dial-queue.js +30 -38
  38. package/dist/src/connection-manager/dial-queue.js.map +1 -1
  39. package/dist/src/connection-manager/index.d.ts +3 -18
  40. package/dist/src/connection-manager/index.d.ts.map +1 -1
  41. package/dist/src/connection-manager/index.js +17 -18
  42. package/dist/src/connection-manager/index.js.map +1 -1
  43. package/dist/src/connection-manager/utils.js +1 -1
  44. package/dist/src/connection-manager/utils.js.map +1 -1
  45. package/dist/src/content-routing/index.d.ts +1 -5
  46. package/dist/src/content-routing/index.d.ts.map +1 -1
  47. package/dist/src/content-routing/index.js +2 -2
  48. package/dist/src/content-routing/index.js.map +1 -1
  49. package/dist/src/content-routing/utils.d.ts +1 -2
  50. package/dist/src/content-routing/utils.d.ts.map +1 -1
  51. package/dist/src/content-routing/utils.js +1 -1
  52. package/dist/src/content-routing/utils.js.map +1 -1
  53. package/dist/src/errors.d.ts +0 -2
  54. package/dist/src/errors.d.ts.map +1 -1
  55. package/dist/src/errors.js +0 -2
  56. package/dist/src/errors.js.map +1 -1
  57. package/dist/src/get-peer.d.ts +1 -1
  58. package/dist/src/get-peer.d.ts.map +1 -1
  59. package/dist/src/get-peer.js +1 -5
  60. package/dist/src/get-peer.js.map +1 -1
  61. package/dist/src/index.d.ts +5 -16
  62. package/dist/src/index.d.ts.map +1 -1
  63. package/dist/src/index.js.map +1 -1
  64. package/dist/src/libp2p.d.ts +4 -12
  65. package/dist/src/libp2p.d.ts.map +1 -1
  66. package/dist/src/libp2p.js +31 -65
  67. package/dist/src/libp2p.js.map +1 -1
  68. package/dist/src/peer-routing.d.ts +6 -6
  69. package/dist/src/peer-routing.d.ts.map +1 -1
  70. package/dist/src/peer-routing.js +12 -9
  71. package/dist/src/peer-routing.js.map +1 -1
  72. package/dist/src/registrar.d.ts +5 -7
  73. package/dist/src/registrar.d.ts.map +1 -1
  74. package/dist/src/registrar.js +4 -4
  75. package/dist/src/registrar.js.map +1 -1
  76. package/dist/src/transport-manager.d.ts +5 -9
  77. package/dist/src/transport-manager.d.ts.map +1 -1
  78. package/dist/src/transport-manager.js +12 -13
  79. package/dist/src/transport-manager.js.map +1 -1
  80. package/dist/src/upgrader.d.ts +8 -19
  81. package/dist/src/upgrader.d.ts.map +1 -1
  82. package/dist/src/upgrader.js +75 -38
  83. package/dist/src/upgrader.js.map +1 -1
  84. package/dist/src/version.d.ts +1 -1
  85. package/dist/src/version.d.ts.map +1 -1
  86. package/dist/src/version.js +1 -1
  87. package/dist/src/version.js.map +1 -1
  88. package/dist/typedoc-urls.json +8 -69
  89. package/package.json +37 -106
  90. package/src/address-manager/index.ts +6 -9
  91. package/src/components.ts +5 -16
  92. package/src/config/connection-gater.browser.ts +1 -1
  93. package/src/config/connection-gater.ts +1 -1
  94. package/src/config.ts +1 -2
  95. package/src/connection/index.ts +12 -17
  96. package/src/connection-manager/auto-dial.ts +23 -26
  97. package/src/connection-manager/connection-pruner.ts +10 -12
  98. package/src/connection-manager/constants.defaults.ts +0 -5
  99. package/src/connection-manager/dial-queue.ts +31 -46
  100. package/src/connection-manager/index.ts +19 -36
  101. package/src/connection-manager/utils.ts +1 -1
  102. package/src/content-routing/index.ts +3 -7
  103. package/src/content-routing/utils.ts +2 -3
  104. package/src/errors.ts +0 -2
  105. package/src/get-peer.ts +2 -7
  106. package/src/index.ts +6 -17
  107. package/src/libp2p.ts +32 -80
  108. package/src/peer-routing.ts +16 -15
  109. package/src/registrar.ts +8 -12
  110. package/src/transport-manager.ts +15 -22
  111. package/src/upgrader.ts +110 -64
  112. package/src/version.ts +1 -1
  113. package/dist/src/autonat/constants.d.ts +0 -18
  114. package/dist/src/autonat/constants.d.ts.map +0 -1
  115. package/dist/src/autonat/constants.js +0 -18
  116. package/dist/src/autonat/constants.js.map +0 -1
  117. package/dist/src/autonat/index.d.ts +0 -62
  118. package/dist/src/autonat/index.d.ts.map +0 -1
  119. package/dist/src/autonat/index.js +0 -447
  120. package/dist/src/autonat/index.js.map +0 -1
  121. package/dist/src/autonat/pb/index.d.ts +0 -57
  122. package/dist/src/autonat/pb/index.d.ts.map +0 -1
  123. package/dist/src/autonat/pb/index.js +0 -250
  124. package/dist/src/autonat/pb/index.js.map +0 -1
  125. package/dist/src/circuit-relay/constants.d.ts +0 -50
  126. package/dist/src/circuit-relay/constants.d.ts.map +0 -1
  127. package/dist/src/circuit-relay/constants.js +0 -56
  128. package/dist/src/circuit-relay/constants.js.map +0 -1
  129. package/dist/src/circuit-relay/index.d.ts +0 -55
  130. package/dist/src/circuit-relay/index.d.ts.map +0 -1
  131. package/dist/src/circuit-relay/index.js +0 -38
  132. package/dist/src/circuit-relay/index.js.map +0 -1
  133. package/dist/src/circuit-relay/pb/index.d.ts +0 -93
  134. package/dist/src/circuit-relay/pb/index.d.ts.map +0 -1
  135. package/dist/src/circuit-relay/pb/index.js +0 -425
  136. package/dist/src/circuit-relay/pb/index.js.map +0 -1
  137. package/dist/src/circuit-relay/server/advert-service.d.ts +0 -43
  138. package/dist/src/circuit-relay/server/advert-service.d.ts.map +0 -1
  139. package/dist/src/circuit-relay/server/advert-service.js +0 -73
  140. package/dist/src/circuit-relay/server/advert-service.js.map +0 -1
  141. package/dist/src/circuit-relay/server/index.d.ts +0 -65
  142. package/dist/src/circuit-relay/server/index.d.ts.map +0 -1
  143. package/dist/src/circuit-relay/server/index.js +0 -312
  144. package/dist/src/circuit-relay/server/index.js.map +0 -1
  145. package/dist/src/circuit-relay/server/reservation-store.d.ts +0 -49
  146. package/dist/src/circuit-relay/server/reservation-store.d.ts.map +0 -1
  147. package/dist/src/circuit-relay/server/reservation-store.js +0 -65
  148. package/dist/src/circuit-relay/server/reservation-store.js.map +0 -1
  149. package/dist/src/circuit-relay/server/reservation-voucher.d.ts +0 -18
  150. package/dist/src/circuit-relay/server/reservation-voucher.d.ts.map +0 -1
  151. package/dist/src/circuit-relay/server/reservation-voucher.js +0 -36
  152. package/dist/src/circuit-relay/server/reservation-voucher.js.map +0 -1
  153. package/dist/src/circuit-relay/transport/discovery.d.ts +0 -45
  154. package/dist/src/circuit-relay/transport/discovery.d.ts.map +0 -1
  155. package/dist/src/circuit-relay/transport/discovery.js +0 -97
  156. package/dist/src/circuit-relay/transport/discovery.js.map +0 -1
  157. package/dist/src/circuit-relay/transport/index.d.ts +0 -57
  158. package/dist/src/circuit-relay/transport/index.d.ts.map +0 -1
  159. package/dist/src/circuit-relay/transport/index.js +0 -276
  160. package/dist/src/circuit-relay/transport/index.js.map +0 -1
  161. package/dist/src/circuit-relay/transport/listener.d.ts +0 -9
  162. package/dist/src/circuit-relay/transport/listener.d.ts.map +0 -1
  163. package/dist/src/circuit-relay/transport/listener.js +0 -66
  164. package/dist/src/circuit-relay/transport/listener.js.map +0 -1
  165. package/dist/src/circuit-relay/transport/reservation-store.d.ts +0 -72
  166. package/dist/src/circuit-relay/transport/reservation-store.d.ts.map +0 -1
  167. package/dist/src/circuit-relay/transport/reservation-store.js +0 -209
  168. package/dist/src/circuit-relay/transport/reservation-store.js.map +0 -1
  169. package/dist/src/circuit-relay/utils.d.ts +0 -13
  170. package/dist/src/circuit-relay/utils.d.ts.map +0 -1
  171. package/dist/src/circuit-relay/utils.js +0 -108
  172. package/dist/src/circuit-relay/utils.js.map +0 -1
  173. package/dist/src/dcutr/dcutr.d.ts +0 -43
  174. package/dist/src/dcutr/dcutr.d.ts.map +0 -1
  175. package/dist/src/dcutr/dcutr.js +0 -313
  176. package/dist/src/dcutr/dcutr.js.map +0 -1
  177. package/dist/src/dcutr/index.d.ts +0 -92
  178. package/dist/src/dcutr/index.d.ts.map +0 -1
  179. package/dist/src/dcutr/index.js +0 -63
  180. package/dist/src/dcutr/index.js.map +0 -1
  181. package/dist/src/dcutr/pb/message.d.ts +0 -20
  182. package/dist/src/dcutr/pb/message.d.ts.map +0 -1
  183. package/dist/src/dcutr/pb/message.js +0 -77
  184. package/dist/src/dcutr/pb/message.js.map +0 -1
  185. package/dist/src/dcutr/utils.d.ts +0 -8
  186. package/dist/src/dcutr/utils.d.ts.map +0 -1
  187. package/dist/src/dcutr/utils.js +0 -27
  188. package/dist/src/dcutr/utils.js.map +0 -1
  189. package/dist/src/fetch/constants.d.ts +0 -3
  190. package/dist/src/fetch/constants.d.ts.map +0 -1
  191. package/dist/src/fetch/constants.js +0 -4
  192. package/dist/src/fetch/constants.js.map +0 -1
  193. package/dist/src/fetch/index.d.ts +0 -61
  194. package/dist/src/fetch/index.d.ts.map +0 -1
  195. package/dist/src/fetch/index.js +0 -205
  196. package/dist/src/fetch/index.js.map +0 -1
  197. package/dist/src/fetch/pb/proto.d.ts +0 -28
  198. package/dist/src/fetch/pb/proto.d.ts.map +0 -1
  199. package/dist/src/fetch/pb/proto.js +0 -120
  200. package/dist/src/fetch/pb/proto.js.map +0 -1
  201. package/dist/src/identify/consts.d.ts +0 -10
  202. package/dist/src/identify/consts.d.ts.map +0 -1
  203. package/dist/src/identify/consts.js +0 -11
  204. package/dist/src/identify/consts.js.map +0 -1
  205. package/dist/src/identify/identify.d.ts +0 -54
  206. package/dist/src/identify/identify.d.ts.map +0 -1
  207. package/dist/src/identify/identify.js +0 -447
  208. package/dist/src/identify/identify.js.map +0 -1
  209. package/dist/src/identify/index.d.ts +0 -72
  210. package/dist/src/identify/index.d.ts.map +0 -1
  211. package/dist/src/identify/index.js +0 -15
  212. package/dist/src/identify/index.js.map +0 -1
  213. package/dist/src/identify/pb/message.d.ts +0 -17
  214. package/dist/src/identify/pb/message.d.ts.map +0 -1
  215. package/dist/src/identify/pb/message.js +0 -98
  216. package/dist/src/identify/pb/message.js.map +0 -1
  217. package/dist/src/insecure/index.d.ts +0 -26
  218. package/dist/src/insecure/index.d.ts.map +0 -1
  219. package/dist/src/insecure/index.js +0 -110
  220. package/dist/src/insecure/index.js.map +0 -1
  221. package/dist/src/insecure/pb/proto.d.ts +0 -30
  222. package/dist/src/insecure/pb/proto.d.ts.map +0 -1
  223. package/dist/src/insecure/pb/proto.js +0 -127
  224. package/dist/src/insecure/pb/proto.js.map +0 -1
  225. package/dist/src/ping/constants.d.ts +0 -9
  226. package/dist/src/ping/constants.d.ts.map +0 -1
  227. package/dist/src/ping/constants.js +0 -15
  228. package/dist/src/ping/constants.js.map +0 -1
  229. package/dist/src/ping/index.d.ts +0 -24
  230. package/dist/src/ping/index.d.ts.map +0 -1
  231. package/dist/src/ping/index.js +0 -115
  232. package/dist/src/ping/index.js.map +0 -1
  233. package/dist/src/pnet/crypto.d.ts +0 -18
  234. package/dist/src/pnet/crypto.d.ts.map +0 -1
  235. package/dist/src/pnet/crypto.js +0 -60
  236. package/dist/src/pnet/crypto.js.map +0 -1
  237. package/dist/src/pnet/errors.d.ts +0 -6
  238. package/dist/src/pnet/errors.d.ts.map +0 -1
  239. package/dist/src/pnet/errors.js +0 -6
  240. package/dist/src/pnet/errors.js.map +0 -1
  241. package/dist/src/pnet/index.d.ts +0 -31
  242. package/dist/src/pnet/index.d.ts.map +0 -1
  243. package/dist/src/pnet/index.js +0 -97
  244. package/dist/src/pnet/index.js.map +0 -1
  245. package/dist/src/pnet/key-generator.d.ts +0 -11
  246. package/dist/src/pnet/key-generator.d.ts.map +0 -1
  247. package/dist/src/pnet/key-generator.js +0 -22
  248. package/dist/src/pnet/key-generator.js.map +0 -1
  249. package/dist/src/upnp-nat/index.d.ts +0 -71
  250. package/dist/src/upnp-nat/index.d.ts.map +0 -1
  251. package/dist/src/upnp-nat/index.js +0 -136
  252. package/dist/src/upnp-nat/index.js.map +0 -1
  253. package/dist/src/utils/peer-job-queue.d.ts +0 -33
  254. package/dist/src/utils/peer-job-queue.d.ts.map +0 -1
  255. package/dist/src/utils/peer-job-queue.js +0 -82
  256. package/dist/src/utils/peer-job-queue.js.map +0 -1
  257. package/src/autonat/constants.ts +0 -19
  258. package/src/autonat/index.ts +0 -597
  259. package/src/autonat/pb/index.proto +0 -35
  260. package/src/autonat/pb/index.ts +0 -320
  261. package/src/circuit-relay/constants.ts +0 -72
  262. package/src/circuit-relay/index.ts +0 -59
  263. package/src/circuit-relay/pb/index.proto +0 -67
  264. package/src/circuit-relay/pb/index.ts +0 -539
  265. package/src/circuit-relay/server/advert-service.ts +0 -108
  266. package/src/circuit-relay/server/index.ts +0 -443
  267. package/src/circuit-relay/server/reservation-store.ts +0 -116
  268. package/src/circuit-relay/server/reservation-voucher.ts +0 -51
  269. package/src/circuit-relay/transport/discovery.ts +0 -136
  270. package/src/circuit-relay/transport/index.ts +0 -396
  271. package/src/circuit-relay/transport/listener.ts +0 -97
  272. package/src/circuit-relay/transport/reservation-store.ts +0 -312
  273. package/src/circuit-relay/utils.ts +0 -136
  274. package/src/dcutr/dcutr.ts +0 -378
  275. package/src/dcutr/index.ts +0 -102
  276. package/src/dcutr/pb/message.proto +0 -12
  277. package/src/dcutr/pb/message.ts +0 -96
  278. package/src/dcutr/utils.ts +0 -33
  279. package/src/fetch/README.md +0 -41
  280. package/src/fetch/constants.ts +0 -3
  281. package/src/fetch/index.ts +0 -315
  282. package/src/fetch/pb/proto.proto +0 -15
  283. package/src/fetch/pb/proto.ts +0 -153
  284. package/src/identify/README.md +0 -13
  285. package/src/identify/consts.ts +0 -12
  286. package/src/identify/identify.ts +0 -561
  287. package/src/identify/index.ts +0 -90
  288. package/src/identify/pb/message.proto +0 -30
  289. package/src/identify/pb/message.ts +0 -126
  290. package/src/insecure/index.ts +0 -138
  291. package/src/insecure/pb/proto.proto +0 -18
  292. package/src/insecure/pb/proto.ts +0 -161
  293. package/src/ping/constants.ts +0 -15
  294. package/src/ping/index.ts +0 -170
  295. package/src/pnet/README.md +0 -68
  296. package/src/pnet/crypto.ts +0 -67
  297. package/src/pnet/errors.ts +0 -5
  298. package/src/pnet/index.ts +0 -126
  299. package/src/pnet/key-generator.ts +0 -23
  300. package/src/upnp-nat/index.ts +0 -212
  301. package/src/utils/peer-job-queue.ts +0 -119
@@ -1,597 +0,0 @@
1
- /**
2
- * @packageDocumentation
3
- *
4
- * Use the `autoNATService` function to add support for the [AutoNAT protocol](https://docs.libp2p.io/concepts/nat/autonat/)
5
- * to libp2p.
6
- *
7
- * @example
8
- *
9
- * ```typescript
10
- * import { createLibp2p } from 'libp2p'
11
- * import { autoNATService } from 'libp2p/autonat'
12
- *
13
- * const node = await createLibp2p({
14
- * // ...other options
15
- * services: {
16
- * autoNAT: autoNATService()
17
- * }
18
- * })
19
- * ```
20
- */
21
-
22
- import { CodeError } from '@libp2p/interface/errors'
23
- import { setMaxListeners } from '@libp2p/interface/events'
24
- import { logger } from '@libp2p/logger'
25
- import { peerIdFromBytes } from '@libp2p/peer-id'
26
- import { createEd25519PeerId } from '@libp2p/peer-id-factory'
27
- import { multiaddr, protocols } from '@multiformats/multiaddr'
28
- import first from 'it-first'
29
- import * as lp from 'it-length-prefixed'
30
- import map from 'it-map'
31
- import parallel from 'it-parallel'
32
- import { pipe } from 'it-pipe'
33
- import isPrivateIp from 'private-ip'
34
- import { codes } from '../errors.js'
35
- import {
36
- MAX_INBOUND_STREAMS,
37
- MAX_OUTBOUND_STREAMS,
38
- PROTOCOL_NAME, PROTOCOL_PREFIX, PROTOCOL_VERSION, REFRESH_INTERVAL, STARTUP_DELAY, TIMEOUT
39
- } from './constants.js'
40
- import { Message } from './pb/index.js'
41
- import type { Connection } from '@libp2p/interface/connection'
42
- import type { PeerId } from '@libp2p/interface/peer-id'
43
- import type { PeerInfo } from '@libp2p/interface/peer-info'
44
- import type { PeerRouting } from '@libp2p/interface/peer-routing'
45
- import type { Startable } from '@libp2p/interface/startable'
46
- import type { AddressManager } from '@libp2p/interface-internal/address-manager'
47
- import type { ConnectionManager } from '@libp2p/interface-internal/connection-manager'
48
- import type { IncomingStreamData, Registrar } from '@libp2p/interface-internal/registrar'
49
- import type { TransportManager } from '@libp2p/interface-internal/transport-manager'
50
-
51
- const log = logger('libp2p:autonat')
52
-
53
- // if more than 3 peers manage to dial us on what we believe to be our external
54
- // IP then we are convinced that it is, in fact, our external IP
55
- // https://github.com/libp2p/specs/blob/master/autonat/README.md#autonat-protocol
56
- const REQUIRED_SUCCESSFUL_DIALS = 4
57
-
58
- export interface AutoNATServiceInit {
59
- /**
60
- * Allows overriding the protocol prefix used
61
- */
62
- protocolPrefix?: string
63
-
64
- /**
65
- * How long we should wait for a remote peer to verify our external address
66
- */
67
- timeout?: number
68
-
69
- /**
70
- * How long to wait after startup before trying to verify our external address
71
- */
72
- startupDelay?: number
73
-
74
- /**
75
- * Verify our external addresses this often
76
- */
77
- refreshInterval?: number
78
-
79
- /**
80
- * How many parallel inbound autoNAT streams we allow per-connection
81
- */
82
- maxInboundStreams?: number
83
-
84
- /**
85
- * How many parallel outbound autoNAT streams we allow per-connection
86
- */
87
- maxOutboundStreams?: number
88
- }
89
-
90
- export interface AutoNATComponents {
91
- registrar: Registrar
92
- addressManager: AddressManager
93
- transportManager: TransportManager
94
- peerId: PeerId
95
- connectionManager: ConnectionManager
96
- peerRouting: PeerRouting
97
- }
98
-
99
- class DefaultAutoNATService implements Startable {
100
- private readonly components: AutoNATComponents
101
- private readonly startupDelay: number
102
- private readonly refreshInterval: number
103
- private readonly protocol: string
104
- private readonly timeout: number
105
- private readonly maxInboundStreams: number
106
- private readonly maxOutboundStreams: number
107
- private verifyAddressTimeout?: ReturnType<typeof setTimeout>
108
- private started: boolean
109
-
110
- constructor (components: AutoNATComponents, init: AutoNATServiceInit) {
111
- this.components = components
112
- this.started = false
113
- this.protocol = `/${init.protocolPrefix ?? PROTOCOL_PREFIX}/${PROTOCOL_NAME}/${PROTOCOL_VERSION}`
114
- this.timeout = init.timeout ?? TIMEOUT
115
- this.maxInboundStreams = init.maxInboundStreams ?? MAX_INBOUND_STREAMS
116
- this.maxOutboundStreams = init.maxOutboundStreams ?? MAX_OUTBOUND_STREAMS
117
- this.startupDelay = init.startupDelay ?? STARTUP_DELAY
118
- this.refreshInterval = init.refreshInterval ?? REFRESH_INTERVAL
119
- this._verifyExternalAddresses = this._verifyExternalAddresses.bind(this)
120
- }
121
-
122
- isStarted (): boolean {
123
- return this.started
124
- }
125
-
126
- async start (): Promise<void> {
127
- if (this.started) {
128
- return
129
- }
130
-
131
- await this.components.registrar.handle(this.protocol, (data) => {
132
- void this.handleIncomingAutonatStream(data)
133
- .catch(err => {
134
- log.error('error handling incoming autonat stream', err)
135
- })
136
- }, {
137
- maxInboundStreams: this.maxInboundStreams,
138
- maxOutboundStreams: this.maxOutboundStreams
139
- })
140
-
141
- this.verifyAddressTimeout = setTimeout(this._verifyExternalAddresses, this.startupDelay)
142
-
143
- this.started = true
144
- }
145
-
146
- async stop (): Promise<void> {
147
- await this.components.registrar.unhandle(this.protocol)
148
- clearTimeout(this.verifyAddressTimeout)
149
-
150
- this.started = false
151
- }
152
-
153
- /**
154
- * Handle an incoming AutoNAT request
155
- */
156
- async handleIncomingAutonatStream (data: IncomingStreamData): Promise<void> {
157
- const signal = AbortSignal.timeout(this.timeout)
158
-
159
- const onAbort = (): void => {
160
- data.stream.abort(new CodeError('handleIncomingAutonatStream timeout', codes.ERR_TIMEOUT))
161
- }
162
-
163
- signal.addEventListener('abort', onAbort, { once: true })
164
-
165
- // this controller may be used while dialing lots of peers so prevent MaxListenersExceededWarning
166
- // appearing in the console
167
- setMaxListeners(Infinity, signal)
168
-
169
- const ourHosts = this.components.addressManager.getAddresses()
170
- .map(ma => ma.toOptions().host)
171
-
172
- try {
173
- const self = this
174
-
175
- await pipe(
176
- data.stream,
177
- (source) => lp.decode(source),
178
- async function * (stream) {
179
- const buf = await first(stream)
180
-
181
- if (buf == null) {
182
- log('no message received')
183
- yield Message.encode({
184
- type: Message.MessageType.DIAL_RESPONSE,
185
- dialResponse: {
186
- status: Message.ResponseStatus.E_BAD_REQUEST,
187
- statusText: 'No message was sent'
188
- }
189
- })
190
-
191
- return
192
- }
193
-
194
- let request: Message
195
-
196
- try {
197
- request = Message.decode(buf)
198
- } catch (err) {
199
- log.error('could not decode message', err)
200
-
201
- yield Message.encode({
202
- type: Message.MessageType.DIAL_RESPONSE,
203
- dialResponse: {
204
- status: Message.ResponseStatus.E_BAD_REQUEST,
205
- statusText: 'Could not decode message'
206
- }
207
- })
208
-
209
- return
210
- }
211
-
212
- const dialRequest = request.dial
213
-
214
- if (dialRequest == null) {
215
- log.error('dial was missing from message')
216
-
217
- yield Message.encode({
218
- type: Message.MessageType.DIAL_RESPONSE,
219
- dialResponse: {
220
- status: Message.ResponseStatus.E_BAD_REQUEST,
221
- statusText: 'No Dial message found in message'
222
- }
223
- })
224
-
225
- return
226
- }
227
-
228
- let peerId: PeerId
229
- const peer = dialRequest.peer
230
-
231
- if (peer == null || peer.id == null) {
232
- log.error('PeerId missing from message')
233
-
234
- yield Message.encode({
235
- type: Message.MessageType.DIAL_RESPONSE,
236
- dialResponse: {
237
- status: Message.ResponseStatus.E_BAD_REQUEST,
238
- statusText: 'missing peer info'
239
- }
240
- })
241
-
242
- return
243
- }
244
-
245
- try {
246
- peerId = peerIdFromBytes(peer.id)
247
- } catch (err) {
248
- log.error('invalid PeerId', err)
249
-
250
- yield Message.encode({
251
- type: Message.MessageType.DIAL_RESPONSE,
252
- dialResponse: {
253
- status: Message.ResponseStatus.E_BAD_REQUEST,
254
- statusText: 'bad peer id'
255
- }
256
- })
257
-
258
- return
259
- }
260
-
261
- log('incoming request from %p', peerId)
262
-
263
- // reject any dial requests that arrive via relays
264
- if (!data.connection.remotePeer.equals(peerId)) {
265
- log('target peer %p did not equal sending peer %p', peerId, data.connection.remotePeer)
266
-
267
- yield Message.encode({
268
- type: Message.MessageType.DIAL_RESPONSE,
269
- dialResponse: {
270
- status: Message.ResponseStatus.E_BAD_REQUEST,
271
- statusText: 'peer id mismatch'
272
- }
273
- })
274
-
275
- return
276
- }
277
-
278
- // get a list of multiaddrs to dial
279
- const multiaddrs = peer.addrs
280
- .map(buf => multiaddr(buf))
281
- .filter(ma => {
282
- const isFromSameHost = ma.toOptions().host === data.connection.remoteAddr.toOptions().host
283
-
284
- log.trace('request to dial %a was sent from %a is same host %s', ma, data.connection.remoteAddr, isFromSameHost)
285
- // skip any Multiaddrs where the target node's IP does not match the sending node's IP
286
- return isFromSameHost
287
- })
288
- .filter(ma => {
289
- const host = ma.toOptions().host
290
- const isPublicIp = !(isPrivateIp(host) ?? false)
291
-
292
- log.trace('host %s was public %s', host, isPublicIp)
293
- // don't try to dial private addresses
294
- return isPublicIp
295
- })
296
- .filter(ma => {
297
- const host = ma.toOptions().host
298
- const isNotOurHost = !ourHosts.includes(host)
299
-
300
- log.trace('host %s was not our host %s', host, isNotOurHost)
301
- // don't try to dial nodes on the same host as us
302
- return isNotOurHost
303
- })
304
- .filter(ma => {
305
- const isSupportedTransport = Boolean(self.components.transportManager.transportForMultiaddr(ma))
306
-
307
- log.trace('transport for %a is supported %s', ma, isSupportedTransport)
308
- // skip any Multiaddrs that have transports we do not support
309
- return isSupportedTransport
310
- })
311
- .map(ma => {
312
- if (ma.getPeerId() == null) {
313
- // make sure we have the PeerId as part of the Multiaddr
314
- ma = ma.encapsulate(`/p2p/${peerId.toString()}`)
315
- }
316
-
317
- return ma
318
- })
319
-
320
- // make sure we have something to dial
321
- if (multiaddrs.length === 0) {
322
- log('no valid multiaddrs for %p in message', peerId)
323
-
324
- yield Message.encode({
325
- type: Message.MessageType.DIAL_RESPONSE,
326
- dialResponse: {
327
- status: Message.ResponseStatus.E_DIAL_REFUSED,
328
- statusText: 'no dialable addresses'
329
- }
330
- })
331
-
332
- return
333
- }
334
-
335
- log('dial multiaddrs %s for peer %p', multiaddrs.map(ma => ma.toString()).join(', '), peerId)
336
-
337
- let errorMessage = ''
338
- let lastMultiaddr = multiaddrs[0]
339
-
340
- for await (const multiaddr of multiaddrs) {
341
- let connection: Connection | undefined
342
- lastMultiaddr = multiaddr
343
-
344
- try {
345
- connection = await self.components.connectionManager.openConnection(multiaddr, {
346
- signal
347
- })
348
-
349
- if (!connection.remoteAddr.equals(multiaddr)) {
350
- log.error('tried to dial %a but dialed %a', multiaddr, connection.remoteAddr)
351
- throw new Error('Unexpected remote address')
352
- }
353
-
354
- log('Success %p', peerId)
355
-
356
- yield Message.encode({
357
- type: Message.MessageType.DIAL_RESPONSE,
358
- dialResponse: {
359
- status: Message.ResponseStatus.OK,
360
- addr: connection.remoteAddr.decapsulateCode(protocols('p2p').code).bytes
361
- }
362
- })
363
-
364
- return
365
- } catch (err: any) {
366
- log('could not dial %p', peerId, err)
367
- errorMessage = err.message
368
- } finally {
369
- if (connection != null) {
370
- await connection.close()
371
- }
372
- }
373
- }
374
-
375
- yield Message.encode({
376
- type: Message.MessageType.DIAL_RESPONSE,
377
- dialResponse: {
378
- status: Message.ResponseStatus.E_DIAL_ERROR,
379
- statusText: errorMessage,
380
- addr: lastMultiaddr.bytes
381
- }
382
- })
383
- },
384
- (source) => lp.encode(source),
385
- data.stream
386
- )
387
- } catch (err) {
388
- log.error('error handling incoming autonat stream', err)
389
- } finally {
390
- signal.removeEventListener('abort', onAbort)
391
- }
392
- }
393
-
394
- _verifyExternalAddresses (): void {
395
- void this.verifyExternalAddresses()
396
- .catch(err => {
397
- log.error('error verifying external address', err)
398
- })
399
- }
400
-
401
- /**
402
- * Our multicodec topology noticed a new peer that supports autonat
403
- */
404
- async verifyExternalAddresses (): Promise<void> {
405
- clearTimeout(this.verifyAddressTimeout)
406
-
407
- // Do not try to push if we are not running
408
- if (!this.isStarted()) {
409
- return
410
- }
411
-
412
- const addressManager = this.components.addressManager
413
-
414
- const multiaddrs = addressManager.getObservedAddrs()
415
- .filter(ma => {
416
- const options = ma.toOptions()
417
-
418
- return !(isPrivateIp(options.host) ?? false)
419
- })
420
-
421
- if (multiaddrs.length === 0) {
422
- log('no public addresses found, not requesting verification')
423
- this.verifyAddressTimeout = setTimeout(this._verifyExternalAddresses, this.refreshInterval)
424
-
425
- return
426
- }
427
-
428
- const signal = AbortSignal.timeout(this.timeout)
429
-
430
- // this controller may be used while dialing lots of peers so prevent MaxListenersExceededWarning
431
- // appearing in the console
432
- setMaxListeners(Infinity, signal)
433
-
434
- const self = this
435
-
436
- try {
437
- log('verify multiaddrs %s', multiaddrs.map(ma => ma.toString()).join(', '))
438
-
439
- const request = Message.encode({
440
- type: Message.MessageType.DIAL,
441
- dial: {
442
- peer: {
443
- id: this.components.peerId.toBytes(),
444
- addrs: multiaddrs.map(map => map.bytes)
445
- }
446
- }
447
- })
448
- // find some random peers
449
- const randomPeer = await createEd25519PeerId()
450
- const randomCid = randomPeer.toBytes()
451
-
452
- const results: Record<string, { success: number, failure: number }> = {}
453
- const networkSegments: string[] = []
454
-
455
- const verifyAddress = async (peer: PeerInfo): Promise<Message.DialResponse | undefined> => {
456
- let onAbort = (): void => {}
457
-
458
- try {
459
- log('asking %p to verify multiaddr', peer.id)
460
-
461
- const connection = await self.components.connectionManager.openConnection(peer.id, {
462
- signal
463
- })
464
-
465
- const stream = await connection.newStream(this.protocol, {
466
- signal
467
- })
468
-
469
- onAbort = () => { stream.abort(new CodeError('verifyAddress timeout', codes.ERR_TIMEOUT)) }
470
-
471
- signal.addEventListener('abort', onAbort, { once: true })
472
-
473
- const buf = await pipe(
474
- [request],
475
- (source) => lp.encode(source),
476
- stream,
477
- (source) => lp.decode(source),
478
- async (stream) => first(stream)
479
- )
480
- if (buf == null) {
481
- log('no response received from %p', connection.remotePeer)
482
- return undefined
483
- }
484
- const response = Message.decode(buf)
485
-
486
- if (response.type !== Message.MessageType.DIAL_RESPONSE || response.dialResponse == null) {
487
- log('invalid autonat response from %p', connection.remotePeer)
488
- return undefined
489
- }
490
-
491
- if (response.dialResponse.status === Message.ResponseStatus.OK) {
492
- // make sure we use different network segments
493
- const options = connection.remoteAddr.toOptions()
494
- let segment: string
495
-
496
- if (options.family === 4) {
497
- const octets = options.host.split('.')
498
- segment = octets[0]
499
- } else if (options.family === 6) {
500
- const octets = options.host.split(':')
501
- segment = octets[0]
502
- } else {
503
- log('remote address "%s" was not IP4 or IP6?', options.host)
504
- return undefined
505
- }
506
-
507
- if (networkSegments.includes(segment)) {
508
- log('already have response from network segment %d - %s', segment, options.host)
509
- return undefined
510
- }
511
-
512
- networkSegments.push(segment)
513
- }
514
-
515
- return response.dialResponse
516
- } catch (err) {
517
- log.error('error asking remote to verify multiaddr', err)
518
- } finally {
519
- signal.removeEventListener('abort', onAbort)
520
- }
521
- }
522
-
523
- for await (const dialResponse of parallel(map(this.components.peerRouting.getClosestPeers(randomCid, {
524
- signal
525
- }), (peer) => async () => verifyAddress(peer)), {
526
- concurrency: REQUIRED_SUCCESSFUL_DIALS
527
- })) {
528
- try {
529
- if (dialResponse == null) {
530
- continue
531
- }
532
-
533
- // they either told us which address worked/didn't work, or we only sent them one address
534
- const addr = dialResponse.addr == null ? multiaddrs[0] : multiaddr(dialResponse.addr)
535
-
536
- log('autonat response for %a is %s', addr, dialResponse.status)
537
-
538
- if (dialResponse.status === Message.ResponseStatus.E_BAD_REQUEST) {
539
- // the remote could not parse our request
540
- continue
541
- }
542
-
543
- if (dialResponse.status === Message.ResponseStatus.E_DIAL_REFUSED) {
544
- // the remote could not honour our request
545
- continue
546
- }
547
-
548
- if (dialResponse.addr == null && multiaddrs.length > 1) {
549
- // we sent the remote multiple addrs but they didn't tell us which ones worked/didn't work
550
- continue
551
- }
552
-
553
- if (!multiaddrs.some(ma => ma.equals(addr))) {
554
- log('peer reported %a as %s but it was not in our observed address list', addr, dialResponse.status)
555
- continue
556
- }
557
-
558
- const addrStr = addr.toString()
559
-
560
- if (results[addrStr] == null) {
561
- results[addrStr] = { success: 0, failure: 0 }
562
- }
563
-
564
- if (dialResponse.status === Message.ResponseStatus.OK) {
565
- results[addrStr].success++
566
- } else if (dialResponse.status === Message.ResponseStatus.E_DIAL_ERROR) {
567
- results[addrStr].failure++
568
- }
569
-
570
- if (results[addrStr].success === REQUIRED_SUCCESSFUL_DIALS) {
571
- // we are now convinced
572
- log('%a is externally dialable', addr)
573
- addressManager.confirmObservedAddr(addr)
574
- return
575
- }
576
-
577
- if (results[addrStr].failure === REQUIRED_SUCCESSFUL_DIALS) {
578
- // we are now unconvinced
579
- log('%a is not externally dialable', addr)
580
- addressManager.removeObservedAddr(addr)
581
- return
582
- }
583
- } catch (err) {
584
- log.error('could not verify external address', err)
585
- }
586
- }
587
- } finally {
588
- this.verifyAddressTimeout = setTimeout(this._verifyExternalAddresses, this.refreshInterval)
589
- }
590
- }
591
- }
592
-
593
- export function autoNATService (init: AutoNATServiceInit = {}): (components: AutoNATComponents) => unknown {
594
- return (components) => {
595
- return new DefaultAutoNATService(components, init)
596
- }
597
- }
@@ -1,35 +0,0 @@
1
- syntax = "proto3";
2
-
3
- message Message {
4
- enum MessageType {
5
- DIAL = 0;
6
- DIAL_RESPONSE = 1;
7
- }
8
-
9
- enum ResponseStatus {
10
- OK = 0;
11
- E_DIAL_ERROR = 100;
12
- E_DIAL_REFUSED = 101;
13
- E_BAD_REQUEST = 200;
14
- E_INTERNAL_ERROR = 300;
15
- }
16
-
17
- message PeerInfo {
18
- optional bytes id = 1;
19
- repeated bytes addrs = 2;
20
- }
21
-
22
- message Dial {
23
- optional PeerInfo peer = 1;
24
- }
25
-
26
- message DialResponse {
27
- optional ResponseStatus status = 1;
28
- optional string statusText = 2;
29
- optional bytes addr = 3;
30
- }
31
-
32
- optional MessageType type = 1;
33
- optional Dial dial = 2;
34
- optional DialResponse dialResponse = 3;
35
- }