libp2p 0.46.21 → 1.0.0-551622a96

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/package.json +37 -106
  89. package/src/address-manager/index.ts +6 -9
  90. package/src/components.ts +5 -16
  91. package/src/config/connection-gater.browser.ts +1 -1
  92. package/src/config/connection-gater.ts +1 -1
  93. package/src/config.ts +1 -2
  94. package/src/connection/index.ts +12 -17
  95. package/src/connection-manager/auto-dial.ts +23 -26
  96. package/src/connection-manager/connection-pruner.ts +10 -12
  97. package/src/connection-manager/constants.defaults.ts +0 -5
  98. package/src/connection-manager/dial-queue.ts +31 -46
  99. package/src/connection-manager/index.ts +19 -36
  100. package/src/connection-manager/utils.ts +1 -1
  101. package/src/content-routing/index.ts +3 -7
  102. package/src/content-routing/utils.ts +2 -3
  103. package/src/errors.ts +0 -2
  104. package/src/get-peer.ts +2 -7
  105. package/src/index.ts +6 -17
  106. package/src/libp2p.ts +32 -80
  107. package/src/peer-routing.ts +16 -15
  108. package/src/registrar.ts +8 -12
  109. package/src/transport-manager.ts +15 -22
  110. package/src/upgrader.ts +110 -64
  111. package/src/version.ts +1 -1
  112. package/dist/src/autonat/constants.d.ts +0 -18
  113. package/dist/src/autonat/constants.d.ts.map +0 -1
  114. package/dist/src/autonat/constants.js +0 -18
  115. package/dist/src/autonat/constants.js.map +0 -1
  116. package/dist/src/autonat/index.d.ts +0 -62
  117. package/dist/src/autonat/index.d.ts.map +0 -1
  118. package/dist/src/autonat/index.js +0 -447
  119. package/dist/src/autonat/index.js.map +0 -1
  120. package/dist/src/autonat/pb/index.d.ts +0 -57
  121. package/dist/src/autonat/pb/index.d.ts.map +0 -1
  122. package/dist/src/autonat/pb/index.js +0 -250
  123. package/dist/src/autonat/pb/index.js.map +0 -1
  124. package/dist/src/circuit-relay/constants.d.ts +0 -50
  125. package/dist/src/circuit-relay/constants.d.ts.map +0 -1
  126. package/dist/src/circuit-relay/constants.js +0 -56
  127. package/dist/src/circuit-relay/constants.js.map +0 -1
  128. package/dist/src/circuit-relay/index.d.ts +0 -55
  129. package/dist/src/circuit-relay/index.d.ts.map +0 -1
  130. package/dist/src/circuit-relay/index.js +0 -38
  131. package/dist/src/circuit-relay/index.js.map +0 -1
  132. package/dist/src/circuit-relay/pb/index.d.ts +0 -93
  133. package/dist/src/circuit-relay/pb/index.d.ts.map +0 -1
  134. package/dist/src/circuit-relay/pb/index.js +0 -425
  135. package/dist/src/circuit-relay/pb/index.js.map +0 -1
  136. package/dist/src/circuit-relay/server/advert-service.d.ts +0 -43
  137. package/dist/src/circuit-relay/server/advert-service.d.ts.map +0 -1
  138. package/dist/src/circuit-relay/server/advert-service.js +0 -73
  139. package/dist/src/circuit-relay/server/advert-service.js.map +0 -1
  140. package/dist/src/circuit-relay/server/index.d.ts +0 -65
  141. package/dist/src/circuit-relay/server/index.d.ts.map +0 -1
  142. package/dist/src/circuit-relay/server/index.js +0 -312
  143. package/dist/src/circuit-relay/server/index.js.map +0 -1
  144. package/dist/src/circuit-relay/server/reservation-store.d.ts +0 -49
  145. package/dist/src/circuit-relay/server/reservation-store.d.ts.map +0 -1
  146. package/dist/src/circuit-relay/server/reservation-store.js +0 -65
  147. package/dist/src/circuit-relay/server/reservation-store.js.map +0 -1
  148. package/dist/src/circuit-relay/server/reservation-voucher.d.ts +0 -18
  149. package/dist/src/circuit-relay/server/reservation-voucher.d.ts.map +0 -1
  150. package/dist/src/circuit-relay/server/reservation-voucher.js +0 -36
  151. package/dist/src/circuit-relay/server/reservation-voucher.js.map +0 -1
  152. package/dist/src/circuit-relay/transport/discovery.d.ts +0 -45
  153. package/dist/src/circuit-relay/transport/discovery.d.ts.map +0 -1
  154. package/dist/src/circuit-relay/transport/discovery.js +0 -97
  155. package/dist/src/circuit-relay/transport/discovery.js.map +0 -1
  156. package/dist/src/circuit-relay/transport/index.d.ts +0 -57
  157. package/dist/src/circuit-relay/transport/index.d.ts.map +0 -1
  158. package/dist/src/circuit-relay/transport/index.js +0 -276
  159. package/dist/src/circuit-relay/transport/index.js.map +0 -1
  160. package/dist/src/circuit-relay/transport/listener.d.ts +0 -9
  161. package/dist/src/circuit-relay/transport/listener.d.ts.map +0 -1
  162. package/dist/src/circuit-relay/transport/listener.js +0 -66
  163. package/dist/src/circuit-relay/transport/listener.js.map +0 -1
  164. package/dist/src/circuit-relay/transport/reservation-store.d.ts +0 -72
  165. package/dist/src/circuit-relay/transport/reservation-store.d.ts.map +0 -1
  166. package/dist/src/circuit-relay/transport/reservation-store.js +0 -209
  167. package/dist/src/circuit-relay/transport/reservation-store.js.map +0 -1
  168. package/dist/src/circuit-relay/utils.d.ts +0 -13
  169. package/dist/src/circuit-relay/utils.d.ts.map +0 -1
  170. package/dist/src/circuit-relay/utils.js +0 -108
  171. package/dist/src/circuit-relay/utils.js.map +0 -1
  172. package/dist/src/dcutr/dcutr.d.ts +0 -43
  173. package/dist/src/dcutr/dcutr.d.ts.map +0 -1
  174. package/dist/src/dcutr/dcutr.js +0 -313
  175. package/dist/src/dcutr/dcutr.js.map +0 -1
  176. package/dist/src/dcutr/index.d.ts +0 -92
  177. package/dist/src/dcutr/index.d.ts.map +0 -1
  178. package/dist/src/dcutr/index.js +0 -63
  179. package/dist/src/dcutr/index.js.map +0 -1
  180. package/dist/src/dcutr/pb/message.d.ts +0 -20
  181. package/dist/src/dcutr/pb/message.d.ts.map +0 -1
  182. package/dist/src/dcutr/pb/message.js +0 -77
  183. package/dist/src/dcutr/pb/message.js.map +0 -1
  184. package/dist/src/dcutr/utils.d.ts +0 -8
  185. package/dist/src/dcutr/utils.d.ts.map +0 -1
  186. package/dist/src/dcutr/utils.js +0 -27
  187. package/dist/src/dcutr/utils.js.map +0 -1
  188. package/dist/src/fetch/constants.d.ts +0 -3
  189. package/dist/src/fetch/constants.d.ts.map +0 -1
  190. package/dist/src/fetch/constants.js +0 -4
  191. package/dist/src/fetch/constants.js.map +0 -1
  192. package/dist/src/fetch/index.d.ts +0 -61
  193. package/dist/src/fetch/index.d.ts.map +0 -1
  194. package/dist/src/fetch/index.js +0 -205
  195. package/dist/src/fetch/index.js.map +0 -1
  196. package/dist/src/fetch/pb/proto.d.ts +0 -28
  197. package/dist/src/fetch/pb/proto.d.ts.map +0 -1
  198. package/dist/src/fetch/pb/proto.js +0 -120
  199. package/dist/src/fetch/pb/proto.js.map +0 -1
  200. package/dist/src/identify/consts.d.ts +0 -10
  201. package/dist/src/identify/consts.d.ts.map +0 -1
  202. package/dist/src/identify/consts.js +0 -11
  203. package/dist/src/identify/consts.js.map +0 -1
  204. package/dist/src/identify/identify.d.ts +0 -54
  205. package/dist/src/identify/identify.d.ts.map +0 -1
  206. package/dist/src/identify/identify.js +0 -447
  207. package/dist/src/identify/identify.js.map +0 -1
  208. package/dist/src/identify/index.d.ts +0 -72
  209. package/dist/src/identify/index.d.ts.map +0 -1
  210. package/dist/src/identify/index.js +0 -15
  211. package/dist/src/identify/index.js.map +0 -1
  212. package/dist/src/identify/pb/message.d.ts +0 -17
  213. package/dist/src/identify/pb/message.d.ts.map +0 -1
  214. package/dist/src/identify/pb/message.js +0 -98
  215. package/dist/src/identify/pb/message.js.map +0 -1
  216. package/dist/src/insecure/index.d.ts +0 -26
  217. package/dist/src/insecure/index.d.ts.map +0 -1
  218. package/dist/src/insecure/index.js +0 -110
  219. package/dist/src/insecure/index.js.map +0 -1
  220. package/dist/src/insecure/pb/proto.d.ts +0 -30
  221. package/dist/src/insecure/pb/proto.d.ts.map +0 -1
  222. package/dist/src/insecure/pb/proto.js +0 -127
  223. package/dist/src/insecure/pb/proto.js.map +0 -1
  224. package/dist/src/ping/constants.d.ts +0 -9
  225. package/dist/src/ping/constants.d.ts.map +0 -1
  226. package/dist/src/ping/constants.js +0 -15
  227. package/dist/src/ping/constants.js.map +0 -1
  228. package/dist/src/ping/index.d.ts +0 -24
  229. package/dist/src/ping/index.d.ts.map +0 -1
  230. package/dist/src/ping/index.js +0 -115
  231. package/dist/src/ping/index.js.map +0 -1
  232. package/dist/src/pnet/crypto.d.ts +0 -18
  233. package/dist/src/pnet/crypto.d.ts.map +0 -1
  234. package/dist/src/pnet/crypto.js +0 -60
  235. package/dist/src/pnet/crypto.js.map +0 -1
  236. package/dist/src/pnet/errors.d.ts +0 -6
  237. package/dist/src/pnet/errors.d.ts.map +0 -1
  238. package/dist/src/pnet/errors.js +0 -6
  239. package/dist/src/pnet/errors.js.map +0 -1
  240. package/dist/src/pnet/index.d.ts +0 -31
  241. package/dist/src/pnet/index.d.ts.map +0 -1
  242. package/dist/src/pnet/index.js +0 -97
  243. package/dist/src/pnet/index.js.map +0 -1
  244. package/dist/src/pnet/key-generator.d.ts +0 -11
  245. package/dist/src/pnet/key-generator.d.ts.map +0 -1
  246. package/dist/src/pnet/key-generator.js +0 -22
  247. package/dist/src/pnet/key-generator.js.map +0 -1
  248. package/dist/src/upnp-nat/index.d.ts +0 -71
  249. package/dist/src/upnp-nat/index.d.ts.map +0 -1
  250. package/dist/src/upnp-nat/index.js +0 -136
  251. package/dist/src/upnp-nat/index.js.map +0 -1
  252. package/dist/src/utils/peer-job-queue.d.ts +0 -33
  253. package/dist/src/utils/peer-job-queue.d.ts.map +0 -1
  254. package/dist/src/utils/peer-job-queue.js +0 -82
  255. package/dist/src/utils/peer-job-queue.js.map +0 -1
  256. package/dist/typedoc-urls.json +0 -71
  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,136 +0,0 @@
1
- import { TypedEventEmitter } from '@libp2p/interface/events'
2
- import { logger } from '@libp2p/logger'
3
- import {
4
- RELAY_RENDEZVOUS_NS,
5
- RELAY_V2_HOP_CODEC
6
- } from '../constants.js'
7
- import { namespaceToCid } from '../utils.js'
8
- import type { ContentRouting } from '@libp2p/interface/content-routing'
9
- import type { PeerId } from '@libp2p/interface/peer-id'
10
- import type { PeerStore } from '@libp2p/interface/peer-store'
11
- import type { Startable } from '@libp2p/interface/startable'
12
- import type { ConnectionManager } from '@libp2p/interface-internal/connection-manager'
13
- import type { Registrar } from '@libp2p/interface-internal/registrar'
14
- import type { TransportManager } from '@libp2p/interface-internal/transport-manager'
15
-
16
- const log = logger('libp2p:circuit-relay:discover-relays')
17
-
18
- export interface RelayDiscoveryEvents {
19
- 'relay:discover': CustomEvent<PeerId>
20
- }
21
-
22
- export interface RelayDiscoveryComponents {
23
- peerId: PeerId
24
- peerStore: PeerStore
25
- connectionManager: ConnectionManager
26
- transportManager: TransportManager
27
- contentRouting: ContentRouting
28
- registrar: Registrar
29
- }
30
-
31
- /**
32
- * ReservationManager automatically makes a circuit v2 reservation on any connected
33
- * peers that support the circuit v2 HOP protocol.
34
- */
35
- export class RelayDiscovery extends TypedEventEmitter<RelayDiscoveryEvents> implements Startable {
36
- private readonly peerId: PeerId
37
- private readonly peerStore: PeerStore
38
- private readonly contentRouting: ContentRouting
39
- private readonly registrar: Registrar
40
- private started: boolean
41
- private topologyId?: string
42
-
43
- constructor (components: RelayDiscoveryComponents) {
44
- super()
45
- this.started = false
46
- this.peerId = components.peerId
47
- this.peerStore = components.peerStore
48
- this.contentRouting = components.contentRouting
49
- this.registrar = components.registrar
50
- }
51
-
52
- isStarted (): boolean {
53
- return this.started
54
- }
55
-
56
- async start (): Promise<void> {
57
- // register a topology listener for when new peers are encountered
58
- // that support the hop protocol
59
- this.topologyId = await this.registrar.register(RELAY_V2_HOP_CODEC, {
60
- notifyOnTransient: true,
61
- onConnect: (peerId) => {
62
- this.safeDispatchEvent('relay:discover', { detail: peerId })
63
- }
64
- })
65
-
66
- void this.discover()
67
- .catch(err => {
68
- log.error('error listening on relays', err)
69
- })
70
-
71
- this.started = true
72
- }
73
-
74
- stop (): void {
75
- if (this.topologyId != null) {
76
- this.registrar.unregister(this.topologyId)
77
- }
78
-
79
- this.started = false
80
- }
81
-
82
- /**
83
- * Try to listen on available hop relay connections.
84
- * The following order will happen while we do not have enough relays:
85
- *
86
- * 1. Check the metadata store for known relays, try to listen on the ones we are already connected
87
- * 2. Dial and try to listen on the peers we know that support hop but are not connected
88
- * 3. Search the network
89
- */
90
- async discover (): Promise<void> {
91
- log('searching peer store for relays')
92
- const peers = (await this.peerStore.all({
93
- filters: [
94
- // filter by a list of peers supporting RELAY_V2_HOP and ones we are not listening on
95
- (peer) => {
96
- return peer.protocols.includes(RELAY_V2_HOP_CODEC)
97
- }
98
- ],
99
- orders: [
100
- () => Math.random() < 0.5 ? 1 : -1
101
- ]
102
- }))
103
-
104
- for (const peer of peers) {
105
- log('found relay peer %p in content peer store', peer.id)
106
- this.safeDispatchEvent('relay:discover', { detail: peer.id })
107
- }
108
-
109
- log('found %d relay peers in peer store', peers.length)
110
-
111
- try {
112
- log('searching content routing for relays')
113
- const cid = await namespaceToCid(RELAY_RENDEZVOUS_NS)
114
-
115
- let found = 0
116
-
117
- for await (const provider of this.contentRouting.findProviders(cid)) {
118
- if (provider.multiaddrs.length > 0 && !provider.id.equals(this.peerId)) {
119
- const peerId = provider.id
120
-
121
- found++
122
- await this.peerStore.merge(peerId, {
123
- multiaddrs: provider.multiaddrs
124
- })
125
-
126
- log('found relay peer %p in content routing', peerId)
127
- this.safeDispatchEvent('relay:discover', { detail: peerId })
128
- }
129
- }
130
-
131
- log('found %d relay peers in content routing', found)
132
- } catch (err: any) {
133
- log.error('failed when finding relays on the network', err)
134
- }
135
- }
136
- }
@@ -1,396 +0,0 @@
1
- import { CodeError } from '@libp2p/interface/errors'
2
- import { symbol, type Transport, type CreateListenerOptions, type Listener, type Upgrader } from '@libp2p/interface/transport'
3
- import { logger } from '@libp2p/logger'
4
- import { peerIdFromBytes, peerIdFromString } from '@libp2p/peer-id'
5
- import { streamToMaConnection } from '@libp2p/utils/stream-to-ma-conn'
6
- import * as mafmt from '@multiformats/mafmt'
7
- import { multiaddr } from '@multiformats/multiaddr'
8
- import { pbStream } from 'it-protobuf-stream'
9
- import { MAX_CONNECTIONS } from '../../connection-manager/constants.js'
10
- import { codes } from '../../errors.js'
11
- import { CIRCUIT_PROTO_CODE, RELAY_V2_HOP_CODEC, RELAY_V2_STOP_CODEC } from '../constants.js'
12
- import { StopMessage, HopMessage, Status } from '../pb/index.js'
13
- import { RelayDiscovery, type RelayDiscoveryComponents } from './discovery.js'
14
- import { createListener } from './listener.js'
15
- import { type RelayStoreInit, ReservationStore } from './reservation-store.js'
16
- import type { Libp2pEvents, AbortOptions } from '@libp2p/interface'
17
- import type { Connection, Stream } from '@libp2p/interface/connection'
18
- import type { ConnectionGater } from '@libp2p/interface/connection-gater'
19
- import type { ContentRouting } from '@libp2p/interface/content-routing'
20
- import type { TypedEventTarget } from '@libp2p/interface/events'
21
- import type { PeerId } from '@libp2p/interface/peer-id'
22
- import type { PeerStore } from '@libp2p/interface/peer-store'
23
- import type { AddressManager } from '@libp2p/interface-internal/address-manager'
24
- import type { ConnectionManager } from '@libp2p/interface-internal/connection-manager'
25
- import type { IncomingStreamData, Registrar } from '@libp2p/interface-internal/registrar'
26
- import type { Multiaddr } from '@multiformats/multiaddr'
27
-
28
- const log = logger('libp2p:circuit-relay:transport')
29
-
30
- const isValidStop = (request: StopMessage): request is Required<StopMessage> => {
31
- if (request.peer == null) {
32
- return false
33
- }
34
-
35
- try {
36
- request.peer.addrs.forEach(multiaddr)
37
- } catch {
38
- return false
39
- }
40
-
41
- return true
42
- }
43
-
44
- export interface CircuitRelayTransportComponents extends RelayDiscoveryComponents {
45
- peerId: PeerId
46
- peerStore: PeerStore
47
- registrar: Registrar
48
- connectionManager: ConnectionManager
49
- upgrader: Upgrader
50
- addressManager: AddressManager
51
- contentRouting: ContentRouting
52
- connectionGater: ConnectionGater
53
- events: TypedEventTarget<Libp2pEvents>
54
- }
55
-
56
- interface ConnectOptions {
57
- stream: Stream
58
- connection: Connection
59
- destinationPeer: PeerId
60
- destinationAddr: Multiaddr
61
- relayAddr: Multiaddr
62
- ma: Multiaddr
63
- disconnectOnFailure: boolean
64
- }
65
-
66
- /**
67
- * RelayConfig configures the circuit v2 relay transport.
68
- */
69
- export interface CircuitRelayTransportInit extends RelayStoreInit {
70
- /**
71
- * The number of peers running diable relays to search for and
72
- * connect to. (default: 0)
73
- */
74
- discoverRelays?: number
75
-
76
- /**
77
- * The maximum number of simultaneous STOP inbound streams that can be open at
78
- * once - each inbound relayed connection uses a STOP stream (default: 300)
79
- */
80
- maxInboundStopStreams?: number
81
-
82
- /**
83
- * The maximum number of simultaneous STOP outbound streams that can be open at
84
- * once. If this transport is used along with the relay server these settings
85
- * should be set to the same value (default: 300)
86
- */
87
- maxOutboundStopStreams?: number
88
-
89
- /**
90
- * Incoming STOP requests (e.g. when a remote peer wants to dial us via a relay)
91
- * must finish the initial protocol negotiation within this timeout in ms
92
- * (default: 30000)
93
- */
94
- stopTimeout?: number
95
-
96
- /**
97
- * When creating a reservation it must complete within this number of ms
98
- * (default: 10000)
99
- */
100
- reservationCompletionTimeout?: number
101
- }
102
-
103
- const defaults = {
104
- maxInboundStopStreams: MAX_CONNECTIONS,
105
- maxOutboundStopStreams: MAX_CONNECTIONS,
106
- stopTimeout: 30000
107
- }
108
-
109
- class CircuitRelayTransport implements Transport {
110
- private readonly discovery?: RelayDiscovery
111
- private readonly registrar: Registrar
112
- private readonly peerStore: PeerStore
113
- private readonly connectionManager: ConnectionManager
114
- private readonly peerId: PeerId
115
- private readonly upgrader: Upgrader
116
- private readonly addressManager: AddressManager
117
- private readonly connectionGater: ConnectionGater
118
- private readonly reservationStore: ReservationStore
119
- private readonly maxInboundStopStreams: number
120
- private readonly maxOutboundStopStreams?: number
121
- private readonly stopTimeout: number
122
- private started: boolean
123
-
124
- constructor (components: CircuitRelayTransportComponents, init: CircuitRelayTransportInit) {
125
- this.registrar = components.registrar
126
- this.peerStore = components.peerStore
127
- this.connectionManager = components.connectionManager
128
- this.peerId = components.peerId
129
- this.upgrader = components.upgrader
130
- this.addressManager = components.addressManager
131
- this.connectionGater = components.connectionGater
132
- this.maxInboundStopStreams = init.maxInboundStopStreams ?? defaults.maxInboundStopStreams
133
- this.maxOutboundStopStreams = init.maxOutboundStopStreams ?? defaults.maxOutboundStopStreams
134
- this.stopTimeout = init.stopTimeout ?? defaults.stopTimeout
135
-
136
- if (init.discoverRelays != null && init.discoverRelays > 0) {
137
- this.discovery = new RelayDiscovery(components)
138
- this.discovery.addEventListener('relay:discover', (evt) => {
139
- this.reservationStore.addRelay(evt.detail, 'discovered')
140
- .catch(err => {
141
- log.error('could not add discovered relay %p', evt.detail, err)
142
- })
143
- })
144
- }
145
-
146
- this.reservationStore = new ReservationStore(components, init)
147
- this.reservationStore.addEventListener('relay:not-enough-relays', () => {
148
- this.discovery?.discover()
149
- .catch(err => {
150
- log.error('could not discover relays', err)
151
- })
152
- })
153
-
154
- this.started = false
155
- }
156
-
157
- isStarted (): boolean {
158
- return this.started
159
- }
160
-
161
- async start (): Promise<void> {
162
- await this.reservationStore.start()
163
- await this.discovery?.start()
164
-
165
- await this.registrar.handle(RELAY_V2_STOP_CODEC, (data) => {
166
- void this.onStop(data).catch(err => {
167
- log.error('error while handling STOP protocol', err)
168
- data.stream.abort(err)
169
- })
170
- }, {
171
- maxInboundStreams: this.maxInboundStopStreams,
172
- maxOutboundStreams: this.maxOutboundStopStreams,
173
- runOnTransientConnection: true
174
- })
175
-
176
- this.started = true
177
- }
178
-
179
- async stop (): Promise<void> {
180
- this.discovery?.stop()
181
- await this.reservationStore.stop()
182
- await this.registrar.unhandle(RELAY_V2_STOP_CODEC)
183
-
184
- this.started = false
185
- }
186
-
187
- readonly [symbol] = true
188
-
189
- readonly [Symbol.toStringTag] = 'libp2p/circuit-relay-v2'
190
-
191
- /**
192
- * Dial a peer over a relay
193
- */
194
- async dial (ma: Multiaddr, options: AbortOptions = {}): Promise<Connection> {
195
- if (ma.protoCodes().filter(code => code === CIRCUIT_PROTO_CODE).length !== 1) {
196
- const errMsg = 'Invalid circuit relay address'
197
- log.error(errMsg, ma)
198
- throw new CodeError(errMsg, codes.ERR_RELAYED_DIAL)
199
- }
200
-
201
- // Check the multiaddr to see if it contains a relay and a destination peer
202
- const addrs = ma.toString().split('/p2p-circuit')
203
- const relayAddr = multiaddr(addrs[0])
204
- const destinationAddr = multiaddr(addrs[addrs.length - 1])
205
- const relayId = relayAddr.getPeerId()
206
- const destinationId = destinationAddr.getPeerId()
207
-
208
- if (relayId == null || destinationId == null) {
209
- const errMsg = `Circuit relay dial to ${ma.toString()} failed as address did not have peer ids`
210
- log.error(errMsg)
211
- throw new CodeError(errMsg, codes.ERR_RELAYED_DIAL)
212
- }
213
-
214
- const relayPeer = peerIdFromString(relayId)
215
- const destinationPeer = peerIdFromString(destinationId)
216
-
217
- let disconnectOnFailure = false
218
- const relayConnections = this.connectionManager.getConnections(relayPeer)
219
- let relayConnection = relayConnections[0]
220
-
221
- if (relayConnection == null) {
222
- await this.peerStore.merge(relayPeer, {
223
- multiaddrs: [relayAddr]
224
- })
225
- relayConnection = await this.connectionManager.openConnection(relayPeer, options)
226
- disconnectOnFailure = true
227
- }
228
-
229
- let stream: Stream | undefined
230
-
231
- try {
232
- stream = await relayConnection.newStream([RELAY_V2_HOP_CODEC])
233
-
234
- return await this.connectV2({
235
- stream,
236
- connection: relayConnection,
237
- destinationPeer,
238
- destinationAddr,
239
- relayAddr,
240
- ma,
241
- disconnectOnFailure
242
- })
243
- } catch (err: any) {
244
- log.error('circuit relay dial to destination %p via relay %p failed', destinationPeer, relayPeer, err)
245
-
246
- if (stream != null) {
247
- stream.abort(err)
248
- }
249
-
250
- disconnectOnFailure && await relayConnection.close()
251
- throw err
252
- }
253
- }
254
-
255
- async connectV2 (
256
- {
257
- stream, connection, destinationPeer,
258
- destinationAddr, relayAddr, ma,
259
- disconnectOnFailure
260
- }: ConnectOptions
261
- ): Promise<Connection> {
262
- try {
263
- const pbstr = pbStream(stream)
264
- const hopstr = pbstr.pb(HopMessage)
265
- await hopstr.write({
266
- type: HopMessage.Type.CONNECT,
267
- peer: {
268
- id: destinationPeer.toBytes(),
269
- addrs: [multiaddr(destinationAddr).bytes]
270
- }
271
- })
272
-
273
- const status = await hopstr.read()
274
-
275
- if (status.status !== Status.OK) {
276
- throw new CodeError(`failed to connect via relay with status ${status?.status?.toString() ?? 'undefined'}`, codes.ERR_HOP_REQUEST_FAILED)
277
- }
278
-
279
- const maConn = streamToMaConnection({
280
- stream: pbstr.unwrap(),
281
- remoteAddr: ma,
282
- localAddr: relayAddr.encapsulate(`/p2p-circuit/p2p/${this.peerId.toString()}`)
283
- })
284
-
285
- log('new outbound transient connection %a', maConn.remoteAddr)
286
- return await this.upgrader.upgradeOutbound(maConn, {
287
- transient: true
288
- })
289
- } catch (err) {
290
- log.error(`Circuit relay dial to destination ${destinationPeer.toString()} via relay ${connection.remotePeer.toString()} failed`, err)
291
- disconnectOnFailure && await connection.close()
292
- throw err
293
- }
294
- }
295
-
296
- /**
297
- * Create a listener
298
- */
299
- createListener (options: CreateListenerOptions): Listener {
300
- return createListener({
301
- connectionManager: this.connectionManager,
302
- relayStore: this.reservationStore
303
- })
304
- }
305
-
306
- /**
307
- * Filter check for all Multiaddrs that this transport can dial on
308
- *
309
- * @param {Multiaddr[]} multiaddrs
310
- * @returns {Multiaddr[]}
311
- */
312
- filter (multiaddrs: Multiaddr[]): Multiaddr[] {
313
- multiaddrs = Array.isArray(multiaddrs) ? multiaddrs : [multiaddrs]
314
-
315
- return multiaddrs.filter((ma) => {
316
- return mafmt.Circuit.matches(ma)
317
- })
318
- }
319
-
320
- /**
321
- * An incoming STOP request means a remote peer wants to dial us via a relay
322
- */
323
- async onStop ({ connection, stream }: IncomingStreamData): Promise<void> {
324
- const signal = AbortSignal.timeout(this.stopTimeout)
325
- const pbstr = pbStream(stream).pb(StopMessage)
326
- const request = await pbstr.read({
327
- signal
328
- })
329
-
330
- log('new circuit relay v2 stop stream from %p with type %s', connection.remotePeer, request.type)
331
-
332
- if (request?.type === undefined) {
333
- log.error('type was missing from circuit v2 stop protocol request from %s', connection.remotePeer)
334
- await pbstr.write({ type: StopMessage.Type.STATUS, status: Status.MALFORMED_MESSAGE }, {
335
- signal
336
- })
337
- await stream.close()
338
- return
339
- }
340
-
341
- // Validate the STOP request has the required input
342
- if (request.type !== StopMessage.Type.CONNECT) {
343
- log.error('invalid stop connect request via peer %p', connection.remotePeer)
344
- await pbstr.write({ type: StopMessage.Type.STATUS, status: Status.UNEXPECTED_MESSAGE }, {
345
- signal
346
- })
347
- await stream.close()
348
- return
349
- }
350
-
351
- if (!isValidStop(request)) {
352
- log.error('invalid stop connect request via peer %p', connection.remotePeer)
353
- await pbstr.write({ type: StopMessage.Type.STATUS, status: Status.MALFORMED_MESSAGE }, {
354
- signal
355
- })
356
- await stream.close()
357
- return
358
- }
359
-
360
- const remotePeerId = peerIdFromBytes(request.peer.id)
361
-
362
- if ((await this.connectionGater.denyInboundRelayedConnection?.(connection.remotePeer, remotePeerId)) === true) {
363
- log.error('connection gater denied inbound relayed connection from %p', connection.remotePeer)
364
- await pbstr.write({ type: StopMessage.Type.STATUS, status: Status.PERMISSION_DENIED }, {
365
- signal
366
- })
367
- await stream.close()
368
- return
369
- }
370
-
371
- log.trace('sending success response to %p', connection.remotePeer)
372
- await pbstr.write({ type: StopMessage.Type.STATUS, status: Status.OK }, {
373
- signal
374
- })
375
-
376
- const remoteAddr = connection.remoteAddr.encapsulate(`/p2p-circuit/p2p/${remotePeerId.toString()}`)
377
- const localAddr = this.addressManager.getAddresses()[0]
378
- const maConn = streamToMaConnection({
379
- stream: pbstr.unwrap().unwrap(),
380
- remoteAddr,
381
- localAddr
382
- })
383
-
384
- log('new inbound transient connection %a', maConn.remoteAddr)
385
- await this.upgrader.upgradeInbound(maConn, {
386
- transient: true
387
- })
388
- log('%s connection %a upgraded', 'inbound', maConn.remoteAddr)
389
- }
390
- }
391
-
392
- export function circuitRelayTransport (init: CircuitRelayTransportInit = {}): (components: CircuitRelayTransportComponents) => Transport {
393
- return (components) => {
394
- return new CircuitRelayTransport(components, init)
395
- }
396
- }
@@ -1,97 +0,0 @@
1
- import { CodeError } from '@libp2p/interface/errors'
2
- import { TypedEventEmitter } from '@libp2p/interface/events'
3
- import { logger } from '@libp2p/logger'
4
- import { PeerMap } from '@libp2p/peer-collections'
5
- import { multiaddr } from '@multiformats/multiaddr'
6
- import type { ReservationStore } from './reservation-store.js'
7
- import type { PeerId } from '@libp2p/interface/peer-id'
8
- import type { Listener, ListenerEvents } from '@libp2p/interface/transport'
9
- import type { ConnectionManager } from '@libp2p/interface-internal/connection-manager'
10
- import type { Multiaddr } from '@multiformats/multiaddr'
11
-
12
- const log = logger('libp2p:circuit-relay:transport:listener')
13
-
14
- export interface CircuitRelayTransportListenerComponents {
15
- connectionManager: ConnectionManager
16
- relayStore: ReservationStore
17
- }
18
-
19
- class CircuitRelayTransportListener extends TypedEventEmitter<ListenerEvents> implements Listener {
20
- private readonly connectionManager: ConnectionManager
21
- private readonly relayStore: ReservationStore
22
- private readonly listeningAddrs: PeerMap<Multiaddr[]>
23
-
24
- constructor (components: CircuitRelayTransportListenerComponents) {
25
- super()
26
-
27
- this.connectionManager = components.connectionManager
28
- this.relayStore = components.relayStore
29
- this.listeningAddrs = new PeerMap()
30
-
31
- // remove listening addrs when a relay is removed
32
- this.relayStore.addEventListener('relay:removed', this._onRemoveRelayPeer)
33
- }
34
-
35
- _onRemoveRelayPeer = (evt: CustomEvent<PeerId>): void => {
36
- this.#removeRelayPeer(evt.detail)
37
- }
38
-
39
- async listen (addr: Multiaddr): Promise<void> {
40
- log('listen on %a', addr)
41
-
42
- // remove the circuit part to get the peer id of the relay
43
- const relayAddr = addr.decapsulate('/p2p-circuit')
44
- const relayConn = await this.connectionManager.openConnection(relayAddr)
45
-
46
- if (!this.relayStore.hasReservation(relayConn.remotePeer)) {
47
- // addRelay calls transportManager.listen which calls this listen method
48
- await this.relayStore.addRelay(relayConn.remotePeer, 'configured')
49
- return
50
- }
51
-
52
- const reservation = this.relayStore.getReservation(relayConn.remotePeer)
53
-
54
- if (reservation == null) {
55
- throw new CodeError('Did not have reservation after making reservation', 'ERR_NO_RESERVATION')
56
- }
57
-
58
- if (this.listeningAddrs.has(relayConn.remotePeer)) {
59
- log('already listening on relay %p', relayConn.remotePeer)
60
- return
61
- }
62
-
63
- // add all addresses from the relay reservation
64
- this.listeningAddrs.set(relayConn.remotePeer, reservation.addrs.map(buf => {
65
- return multiaddr(buf).encapsulate('/p2p-circuit')
66
- }))
67
-
68
- this.safeDispatchEvent('listening', {})
69
- }
70
-
71
- getAddrs (): Multiaddr[] {
72
- return [...this.listeningAddrs.values()].flat()
73
- }
74
-
75
- async close (): Promise<void> {
76
-
77
- }
78
-
79
- #removeRelayPeer (peerId: PeerId): void {
80
- const had = this.listeningAddrs.has(peerId)
81
-
82
- log('relay peer removed %p - had reservation', peerId, had)
83
-
84
- this.listeningAddrs.delete(peerId)
85
-
86
- if (had) {
87
- log.trace('removing relay event listener for peer %p', peerId)
88
- this.relayStore.removeEventListener('relay:removed', this._onRemoveRelayPeer)
89
- // Announce listen addresses change
90
- this.safeDispatchEvent('close', {})
91
- }
92
- }
93
- }
94
-
95
- export function createListener (options: CircuitRelayTransportListenerComponents): Listener {
96
- return new CircuitRelayTransportListener(options)
97
- }