libp2p 0.42.2-593deefe → 0.42.2-5e63ee2d

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 (228) hide show
  1. package/dist/index.min.js +30 -30
  2. package/dist/src/address-manager/index.d.ts +1 -10
  3. package/dist/src/address-manager/index.d.ts.map +1 -1
  4. package/dist/src/address-manager/index.js +46 -29
  5. package/dist/src/address-manager/index.js.map +1 -1
  6. package/dist/src/autonat/constants.d.ts +4 -0
  7. package/dist/src/autonat/constants.d.ts.map +1 -0
  8. package/dist/src/autonat/constants.js +4 -0
  9. package/dist/src/autonat/constants.js.map +1 -0
  10. package/dist/src/autonat/index.d.ts +64 -0
  11. package/dist/src/autonat/index.d.ts.map +1 -0
  12. package/dist/src/autonat/index.js +417 -0
  13. package/dist/src/autonat/index.js.map +1 -0
  14. package/dist/src/autonat/pb/index.d.ts +57 -0
  15. package/dist/src/autonat/pb/index.d.ts.map +1 -0
  16. package/dist/src/autonat/pb/index.js +250 -0
  17. package/dist/src/autonat/pb/index.js.map +1 -0
  18. package/dist/src/circuit/constants.d.ts +29 -3
  19. package/dist/src/circuit/constants.d.ts.map +1 -1
  20. package/dist/src/circuit/constants.js +32 -5
  21. package/dist/src/circuit/constants.js.map +1 -1
  22. package/dist/src/circuit/index.d.ts +16 -61
  23. package/dist/src/circuit/index.d.ts.map +1 -1
  24. package/dist/src/circuit/index.js +2 -1
  25. package/dist/src/circuit/index.js.map +1 -1
  26. package/dist/src/circuit/server/advert-service.d.ts +43 -0
  27. package/dist/src/circuit/server/advert-service.d.ts.map +1 -0
  28. package/dist/src/circuit/server/advert-service.js +69 -0
  29. package/dist/src/circuit/server/advert-service.js.map +1 -0
  30. package/dist/src/circuit/server/index.d.ts +60 -0
  31. package/dist/src/circuit/server/index.d.ts.map +1 -0
  32. package/dist/src/circuit/server/index.js +287 -0
  33. package/dist/src/circuit/server/index.js.map +1 -0
  34. package/dist/src/circuit/{reservation-store.d.ts → server/reservation-store.d.ts} +17 -10
  35. package/dist/src/circuit/server/reservation-store.d.ts.map +1 -0
  36. package/dist/src/circuit/server/reservation-store.js +57 -0
  37. package/dist/src/circuit/server/reservation-store.js.map +1 -0
  38. package/dist/src/circuit/server/reservation-voucher.d.ts.map +1 -0
  39. package/dist/src/circuit/{reservation-voucher.js → server/reservation-voucher.js} +1 -1
  40. package/dist/src/circuit/server/reservation-voucher.js.map +1 -0
  41. package/dist/src/circuit/transport/discovery.d.ts +45 -0
  42. package/dist/src/circuit/transport/discovery.d.ts.map +1 -0
  43. package/dist/src/circuit/transport/discovery.js +82 -0
  44. package/dist/src/circuit/transport/discovery.js.map +1 -0
  45. package/dist/src/circuit/transport/index.d.ts +33 -0
  46. package/dist/src/circuit/transport/index.d.ts.map +1 -0
  47. package/dist/src/circuit/transport/index.js +225 -0
  48. package/dist/src/circuit/transport/index.js.map +1 -0
  49. package/dist/src/circuit/transport/listener.d.ts +9 -0
  50. package/dist/src/circuit/transport/listener.d.ts.map +1 -0
  51. package/dist/src/circuit/transport/listener.js +76 -0
  52. package/dist/src/circuit/transport/listener.js.map +1 -0
  53. package/dist/src/circuit/transport/reservation-store.d.ts +60 -0
  54. package/dist/src/circuit/transport/reservation-store.d.ts.map +1 -0
  55. package/dist/src/circuit/transport/reservation-store.js +165 -0
  56. package/dist/src/circuit/transport/reservation-store.js.map +1 -0
  57. package/dist/src/circuit/utils.d.ts +4 -2
  58. package/dist/src/circuit/utils.d.ts.map +1 -1
  59. package/dist/src/circuit/utils.js +75 -102
  60. package/dist/src/circuit/utils.js.map +1 -1
  61. package/dist/src/components.d.ts +2 -1
  62. package/dist/src/components.d.ts.map +1 -1
  63. package/dist/src/components.js.map +1 -1
  64. package/dist/src/config.d.ts.map +1 -1
  65. package/dist/src/config.js +17 -20
  66. package/dist/src/config.js.map +1 -1
  67. package/dist/src/connection/index.d.ts +2 -2
  68. package/dist/src/connection/index.d.ts.map +1 -1
  69. package/dist/src/connection/index.js +1 -1
  70. package/dist/src/connection/index.js.map +1 -1
  71. package/dist/src/connection-manager/auto-dialler.d.ts +0 -4
  72. package/dist/src/connection-manager/auto-dialler.d.ts.map +1 -1
  73. package/dist/src/connection-manager/auto-dialler.js +0 -9
  74. package/dist/src/connection-manager/auto-dialler.js.map +1 -1
  75. package/dist/src/connection-manager/dialer/dial-request.js +1 -1
  76. package/dist/src/connection-manager/dialer/dial-request.js.map +1 -1
  77. package/dist/src/connection-manager/dialer/index.d.ts +2 -1
  78. package/dist/src/connection-manager/dialer/index.d.ts.map +1 -1
  79. package/dist/src/connection-manager/dialer/index.js +3 -3
  80. package/dist/src/connection-manager/dialer/index.js.map +1 -1
  81. package/dist/src/connection-manager/index.d.ts +0 -4
  82. package/dist/src/connection-manager/index.d.ts.map +1 -1
  83. package/dist/src/connection-manager/index.js +1 -1
  84. package/dist/src/connection-manager/index.js.map +1 -1
  85. package/dist/src/connection-manager/latency-monitor.d.ts.map +1 -1
  86. package/dist/src/connection-manager/latency-monitor.js +1 -1
  87. package/dist/src/connection-manager/latency-monitor.js.map +1 -1
  88. package/dist/src/connection-manager/visibility-change-emitter.d.ts.map +1 -1
  89. package/dist/src/content-routing/index.d.ts +6 -4
  90. package/dist/src/content-routing/index.d.ts.map +1 -1
  91. package/dist/src/content-routing/index.js +1 -1
  92. package/dist/src/content-routing/index.js.map +1 -1
  93. package/dist/src/content-routing/utils.d.ts +3 -3
  94. package/dist/src/content-routing/utils.d.ts.map +1 -1
  95. package/dist/src/dht/dht-content-routing.d.ts +2 -1
  96. package/dist/src/dht/dht-content-routing.d.ts.map +1 -1
  97. package/dist/src/dht/dht-content-routing.js.map +1 -1
  98. package/dist/src/dht/dht-peer-routing.d.ts +3 -2
  99. package/dist/src/dht/dht-peer-routing.d.ts.map +1 -1
  100. package/dist/src/dht/dht-peer-routing.js.map +1 -1
  101. package/dist/src/dht/dummy-dht.d.ts +1 -1
  102. package/dist/src/dht/dummy-dht.d.ts.map +1 -1
  103. package/dist/src/fetch/index.d.ts.map +1 -1
  104. package/dist/src/identify/index.d.ts +3 -1
  105. package/dist/src/identify/index.d.ts.map +1 -1
  106. package/dist/src/identify/index.js +12 -7
  107. package/dist/src/identify/index.js.map +1 -1
  108. package/dist/src/index.d.ts +13 -7
  109. package/dist/src/index.d.ts.map +1 -1
  110. package/dist/src/index.js.map +1 -1
  111. package/dist/src/insecure/index.d.ts.map +1 -1
  112. package/dist/src/insecure/index.js.map +1 -1
  113. package/dist/src/libp2p.d.ts +6 -4
  114. package/dist/src/libp2p.d.ts.map +1 -1
  115. package/dist/src/libp2p.js +19 -28
  116. package/dist/src/libp2p.js.map +1 -1
  117. package/dist/src/nat-manager.d.ts.map +1 -1
  118. package/dist/src/nat-manager.js +3 -1
  119. package/dist/src/nat-manager.js.map +1 -1
  120. package/dist/src/peer-record-updater.d.ts.map +1 -1
  121. package/dist/src/peer-routing.d.ts.map +1 -1
  122. package/dist/src/ping/index.d.ts.map +1 -1
  123. package/dist/src/pnet/crypto.d.ts +1 -1
  124. package/dist/src/pnet/crypto.d.ts.map +1 -1
  125. package/dist/src/pnet/crypto.js +1 -1
  126. package/dist/src/pnet/crypto.js.map +1 -1
  127. package/dist/src/pnet/key-generator.d.ts.map +1 -1
  128. package/dist/src/registrar.d.ts.map +1 -1
  129. package/dist/src/transport-manager.d.ts.map +1 -1
  130. package/dist/src/transport-manager.js +1 -1
  131. package/dist/src/transport-manager.js.map +1 -1
  132. package/dist/src/upgrader.d.ts +2 -1
  133. package/dist/src/upgrader.d.ts.map +1 -1
  134. package/dist/src/upgrader.js +19 -14
  135. package/dist/src/upgrader.js.map +1 -1
  136. package/package.json +23 -18
  137. package/src/address-manager/index.ts +62 -35
  138. package/src/autonat/constants.ts +4 -0
  139. package/src/autonat/index.ts +567 -0
  140. package/src/autonat/pb/index.proto +35 -0
  141. package/src/autonat/pb/index.ts +320 -0
  142. package/src/circuit/constants.ts +40 -5
  143. package/src/circuit/index.ts +17 -67
  144. package/src/circuit/server/advert-service.ts +108 -0
  145. package/src/circuit/server/index.ts +421 -0
  146. package/src/circuit/server/reservation-store.ts +111 -0
  147. package/src/circuit/{reservation-voucher.ts → server/reservation-voucher.ts} +3 -3
  148. package/src/circuit/transport/discovery.ts +127 -0
  149. package/src/circuit/transport/index.ts +325 -0
  150. package/src/circuit/transport/listener.ts +99 -0
  151. package/src/circuit/transport/reservation-store.ts +249 -0
  152. package/src/circuit/utils.ts +78 -115
  153. package/src/components.ts +9 -8
  154. package/src/config.ts +17 -20
  155. package/src/connection/index.ts +7 -7
  156. package/src/connection-manager/auto-dialler.ts +4 -20
  157. package/src/connection-manager/dialer/dial-request.ts +1 -1
  158. package/src/connection-manager/dialer/index.ts +10 -9
  159. package/src/connection-manager/index.ts +14 -19
  160. package/src/connection-manager/latency-monitor.ts +9 -9
  161. package/src/connection-manager/visibility-change-emitter.ts +4 -4
  162. package/src/content-routing/index.ts +10 -8
  163. package/src/content-routing/utils.ts +3 -3
  164. package/src/dht/dht-content-routing.ts +3 -2
  165. package/src/dht/dht-peer-routing.ts +3 -2
  166. package/src/dht/dummy-dht.ts +1 -1
  167. package/src/fetch/index.ts +7 -7
  168. package/src/identify/index.ts +22 -17
  169. package/src/index.ts +14 -7
  170. package/src/insecure/index.ts +2 -1
  171. package/src/libp2p.ts +33 -41
  172. package/src/nat-manager.ts +9 -7
  173. package/src/peer-record-updater.ts +4 -4
  174. package/src/peer-routing.ts +4 -4
  175. package/src/ping/index.ts +4 -4
  176. package/src/pnet/crypto.ts +3 -3
  177. package/src/pnet/key-generator.ts +1 -1
  178. package/src/registrar.ts +8 -8
  179. package/src/transport-manager.ts +10 -10
  180. package/src/upgrader.ts +20 -19
  181. package/src/version.ts +1 -1
  182. package/dist/src/circuit/client.d.ts +0 -81
  183. package/dist/src/circuit/client.d.ts.map +0 -1
  184. package/dist/src/circuit/client.js +0 -285
  185. package/dist/src/circuit/client.js.map +0 -1
  186. package/dist/src/circuit/hop.d.ts +0 -23
  187. package/dist/src/circuit/hop.d.ts.map +0 -1
  188. package/dist/src/circuit/hop.js +0 -167
  189. package/dist/src/circuit/hop.js.map +0 -1
  190. package/dist/src/circuit/interfaces.d.ts +0 -27
  191. package/dist/src/circuit/interfaces.d.ts.map +0 -1
  192. package/dist/src/circuit/interfaces.js +0 -2
  193. package/dist/src/circuit/interfaces.js.map +0 -1
  194. package/dist/src/circuit/listener.d.ts +0 -9
  195. package/dist/src/circuit/listener.d.ts.map +0 -1
  196. package/dist/src/circuit/listener.js +0 -62
  197. package/dist/src/circuit/listener.js.map +0 -1
  198. package/dist/src/circuit/multicodec.d.ts +0 -3
  199. package/dist/src/circuit/multicodec.d.ts.map +0 -1
  200. package/dist/src/circuit/multicodec.js +0 -3
  201. package/dist/src/circuit/multicodec.js.map +0 -1
  202. package/dist/src/circuit/relay.d.ts +0 -34
  203. package/dist/src/circuit/relay.d.ts.map +0 -1
  204. package/dist/src/circuit/relay.js +0 -61
  205. package/dist/src/circuit/relay.js.map +0 -1
  206. package/dist/src/circuit/reservation-store.d.ts.map +0 -1
  207. package/dist/src/circuit/reservation-store.js +0 -59
  208. package/dist/src/circuit/reservation-store.js.map +0 -1
  209. package/dist/src/circuit/reservation-voucher.d.ts.map +0 -1
  210. package/dist/src/circuit/reservation-voucher.js.map +0 -1
  211. package/dist/src/circuit/stop.d.ts +0 -19
  212. package/dist/src/circuit/stop.d.ts.map +0 -1
  213. package/dist/src/circuit/stop.js +0 -67
  214. package/dist/src/circuit/stop.js.map +0 -1
  215. package/dist/src/circuit/transport.d.ts +0 -66
  216. package/dist/src/circuit/transport.d.ts.map +0 -1
  217. package/dist/src/circuit/transport.js +0 -238
  218. package/dist/src/circuit/transport.js.map +0 -1
  219. package/src/circuit/client.ts +0 -381
  220. package/src/circuit/hop.ts +0 -210
  221. package/src/circuit/interfaces.ts +0 -28
  222. package/src/circuit/listener.ts +0 -83
  223. package/src/circuit/multicodec.ts +0 -3
  224. package/src/circuit/relay.ts +0 -87
  225. package/src/circuit/reservation-store.ts +0 -106
  226. package/src/circuit/stop.ts +0 -92
  227. package/src/circuit/transport.ts +0 -313
  228. /package/dist/src/circuit/{reservation-voucher.d.ts → server/reservation-voucher.d.ts} +0 -0
@@ -1,3 +0,0 @@
1
-
2
- export const RELAY_V2_HOP_CODEC = '/libp2p/circuit/relay/0.2.0/hop'
3
- export const RELAY_V2_STOP_CODEC = '/libp2p/circuit/relay/0.2.0/stop'
@@ -1,87 +0,0 @@
1
- import { logger } from '@libp2p/logger'
2
- import { codes } from '../errors.js'
3
- import {
4
- setDelayedInterval,
5
- clearDelayedInterval
6
- // @ts-expect-error set-delayed-interval does not export types
7
- } from 'set-delayed-interval'
8
- import { namespaceToCid } from './utils.js'
9
- import {
10
- RELAY_RENDEZVOUS_NS
11
- } from './constants.js'
12
- import type { AddressSorter } from '@libp2p/interface-peer-store'
13
- import type { Startable } from '@libp2p/interfaces/startable'
14
- import type { Components } from '../components.js'
15
- import type { HopConfig, RelayAdvertiseConfig } from './index.js'
16
-
17
- const log = logger('libp2p:circuit:relay')
18
-
19
- export interface RelayInit {
20
- addressSorter?: AddressSorter
21
- maxListeners?: number
22
- hop: HopConfig
23
- advertise: RelayAdvertiseConfig
24
- }
25
-
26
- export class Relay implements Startable {
27
- private readonly components: Components
28
- private readonly init: RelayInit
29
- private timeout?: any
30
- private started: boolean
31
-
32
- /**
33
- * Creates an instance of Relay
34
- */
35
- constructor (components: Components, init: RelayInit) {
36
- this.components = components
37
- this.started = false
38
- this.init = init
39
- this._advertiseService = this._advertiseService.bind(this)
40
- }
41
-
42
- isStarted () {
43
- return this.started
44
- }
45
-
46
- /**
47
- * Start Relay service
48
- */
49
- async start () {
50
- // Advertise service if HOP enabled and advertising enabled
51
- if (this.init.hop.enabled === true && this.init.advertise.enabled === true) {
52
- this.timeout = setDelayedInterval(
53
- this._advertiseService, this.init.advertise.ttl, this.init.advertise.bootDelay
54
- )
55
- }
56
-
57
- this.started = true
58
- }
59
-
60
- /**
61
- * Stop Relay service
62
- */
63
- async stop () {
64
- try {
65
- clearDelayedInterval(this.timeout)
66
- } catch (err) { }
67
-
68
- this.started = false
69
- }
70
-
71
- /**
72
- * Advertise hop relay service in the network.
73
- */
74
- async _advertiseService () {
75
- try {
76
- const cid = await namespaceToCid(RELAY_RENDEZVOUS_NS)
77
- await this.components.contentRouting.provide(cid)
78
- } catch (err: any) {
79
- if (err.code === codes.ERR_NO_ROUTERS_AVAILABLE) {
80
- log.error('a content router, such as a DHT, must be provided in order to advertise the relay service', err)
81
- await this.stop()
82
- } else {
83
- log.error('could not advertise service: ', err)
84
- }
85
- }
86
- }
87
- }
@@ -1,106 +0,0 @@
1
- import { Limit, Status } from './pb/index.js'
2
- import type { ReservationStore as IReservationStore, ReservationStatus, Reservation } from './interfaces.js'
3
- import type { Multiaddr } from '@multiformats/multiaddr'
4
- import type { PeerId } from '@libp2p/interface-peer-id'
5
- import type { Startable } from '@libp2p/interfaces/startable'
6
- import { PeerMap } from '@libp2p/peer-collections'
7
- import type { RecursivePartial } from '@libp2p/interfaces'
8
- import { DEFAULT_DATA_LIMIT, DEFAULT_DURATION_LIMIT } from './constants.js'
9
-
10
- export interface ReservationStoreInit {
11
- /*
12
- * maximum number of reservations allowed, default: 15
13
- */
14
- maxReservations: number
15
- /*
16
- * interval after which stale reservations are cleared, default: 300s
17
- */
18
- reservationClearInterval: number
19
- /*
20
- * apply default relay limits to a new reservation, default: true
21
- */
22
- applyDefaultLimit: boolean
23
- /**
24
- * reservation ttl, default: 2 hours
25
- */
26
- reservationTtl: number
27
- /**
28
- * The maximum time a relayed connection can be open for
29
- */
30
- defaultDurationLimit?: number
31
- /**
32
- * The maximum amount of data allowed to be transferred over a relayed connection
33
- */
34
- defaultDataLimit?: bigint
35
- }
36
-
37
- export type ReservationStoreOptions = RecursivePartial<ReservationStoreInit>
38
-
39
- export class ReservationStore implements IReservationStore, Startable {
40
- private readonly reservations = new PeerMap<Reservation>()
41
- private _started = false;
42
- private interval: any
43
- private readonly init: ReservationStoreInit
44
-
45
- constructor (options?: ReservationStoreOptions) {
46
- this.init = {
47
- maxReservations: options?.maxReservations ?? 15,
48
- reservationClearInterval: options?.reservationClearInterval ?? 300 * 1000,
49
- applyDefaultLimit: options?.applyDefaultLimit !== false,
50
- reservationTtl: options?.reservationTtl ?? 2 * 60 * 60 * 1000,
51
- defaultDurationLimit: options?.defaultDurationLimit ?? DEFAULT_DURATION_LIMIT,
52
- defaultDataLimit: options?.defaultDataLimit ?? DEFAULT_DATA_LIMIT
53
- }
54
- }
55
-
56
- isStarted () {
57
- return this._started
58
- }
59
-
60
- start () {
61
- if (this._started) {
62
- return
63
- }
64
- this._started = true
65
- this.interval = setInterval(
66
- () => {
67
- const now = (new Date()).getTime()
68
- this.reservations.forEach((r, k) => {
69
- if (r.expire.getTime() < now) {
70
- this.reservations.delete(k)
71
- }
72
- })
73
- },
74
- this.init.reservationClearInterval
75
- )
76
- }
77
-
78
- stop () {
79
- clearInterval(this.interval)
80
- }
81
-
82
- reserve (peer: PeerId, addr: Multiaddr, limit?: Limit): { status: ReservationStatus, expire?: number } {
83
- if (this.reservations.size >= this.init.maxReservations && !this.reservations.has(peer)) {
84
- return { status: Status.RESERVATION_REFUSED }
85
- }
86
- const expire = new Date(Date.now() + this.init.reservationTtl)
87
- let checkedLimit: Limit | undefined
88
- if (this.init.applyDefaultLimit) {
89
- checkedLimit = limit ?? { data: this.init.defaultDataLimit, duration: this.init.defaultDurationLimit }
90
- }
91
- this.reservations.set(peer, { addr, expire, limit: checkedLimit })
92
- return { status: Status.OK, expire: expire.getTime() }
93
- }
94
-
95
- removeReservation (peer: PeerId): void {
96
- this.reservations.delete(peer)
97
- }
98
-
99
- hasReservation (dst: PeerId): boolean {
100
- return this.reservations.has(dst)
101
- }
102
-
103
- get (peer: PeerId): Reservation | undefined {
104
- return this.reservations.get(peer)
105
- }
106
- }
@@ -1,92 +0,0 @@
1
-
2
- import { Status, StopMessage } from './pb/index.js'
3
- import type { Connection, Stream } from '@libp2p/interface-connection'
4
-
5
- import { logger } from '@libp2p/logger'
6
- import { RELAY_V2_STOP_CODEC } from './multicodec.js'
7
- import { multiaddr } from '@multiformats/multiaddr'
8
- import { pbStream, ProtobufStream } from 'it-pb-stream'
9
-
10
- const log = logger('libp2p:circuit:v2:stop')
11
-
12
- export interface HandleStopOptions {
13
- connection: Connection
14
- request: StopMessage
15
- pbstr: ProtobufStream<Stream>
16
- }
17
-
18
- const isValidStop = (request: StopMessage): boolean => {
19
- if (request.peer == null) {
20
- return false
21
- }
22
- try {
23
- request.peer.addrs.forEach(multiaddr)
24
- } catch (_err) {
25
- return false
26
- }
27
- return true
28
- }
29
- export async function handleStop ({
30
- connection,
31
- request,
32
- pbstr
33
- }: HandleStopOptions) {
34
- const stopstr = pbstr.pb(StopMessage)
35
- log('new circuit relay v2 stop stream from %s', connection.remotePeer)
36
- // Validate the STOP request has the required input
37
- if (request.type !== StopMessage.Type.CONNECT) {
38
- log.error('invalid stop connect request via peer %s', connection.remotePeer)
39
- stopstr.write({ type: StopMessage.Type.STATUS, status: Status.UNEXPECTED_MESSAGE })
40
- return
41
- }
42
- if (!isValidStop(request)) {
43
- log.error('invalid stop connect request via peer %s', connection.remotePeer)
44
- stopstr.write({ type: StopMessage.Type.STATUS, status: Status.MALFORMED_MESSAGE })
45
- return
46
- }
47
-
48
- // TODO: go-libp2p marks connection transient if there is limit field present in request.
49
- // Cannot find any reference to transient connections in js-libp2p
50
-
51
- stopstr.write({ type: StopMessage.Type.STATUS, status: Status.OK })
52
- return pbstr.unwrap()
53
- }
54
-
55
- export interface StopOptions {
56
- connection: Connection
57
- request: StopMessage
58
- }
59
-
60
- /**
61
- * Creates a STOP request
62
- *
63
- */
64
- export async function stop ({
65
- connection,
66
- request
67
- }: StopOptions): Promise<Stream | undefined> {
68
- const stream = await connection.newStream([RELAY_V2_STOP_CODEC])
69
- log('starting circuit relay v2 stop request to %s', connection.remotePeer)
70
- const pbstr = pbStream(stream)
71
- const stopstr = pbstr.pb(StopMessage)
72
- stopstr.write(request)
73
- let response
74
- try {
75
- response = await stopstr.read()
76
- } catch (err) {
77
- log.error('error parsing stop message response from %s', connection.remotePeer)
78
- }
79
-
80
- if (response == null) {
81
- log.error('could not read response from %s', connection.remotePeer)
82
- stream.close()
83
- return
84
- }
85
- if (response.status === Status.OK) {
86
- log('stop request to %s was successful', connection.remotePeer)
87
- return pbstr.unwrap()
88
- }
89
-
90
- log('stop request failed with code %d', response.status)
91
- stream.close()
92
- }
@@ -1,313 +0,0 @@
1
- import * as CircuitV2 from './pb/index.js'
2
- import { ReservationStore } from './reservation-store.js'
3
- import { logger } from '@libp2p/logger'
4
- import createError from 'err-code'
5
- import * as mafmt from '@multiformats/mafmt'
6
- import { multiaddr } from '@multiformats/multiaddr'
7
- import { codes } from '../errors.js'
8
- import { streamToMaConnection } from '@libp2p/utils/stream-to-ma-conn'
9
- import { RELAY_V2_HOP_CODEC, RELAY_V2_STOP_CODEC } from './multicodec.js'
10
- import { createListener } from './listener.js'
11
- import { symbol, TransportManager, Upgrader } from '@libp2p/interface-transport'
12
- import { peerIdFromString } from '@libp2p/peer-id'
13
- import type { AbortOptions } from '@libp2p/interfaces'
14
- import type { IncomingStreamData, Registrar } from '@libp2p/interface-registrar'
15
- import type { Listener, Transport, CreateListenerOptions, ConnectionHandler } from '@libp2p/interface-transport'
16
- import type { Connection, Stream } from '@libp2p/interface-connection'
17
- import type { RelayConfig } from './index.js'
18
- import type { PeerId } from '@libp2p/interface-peer-id'
19
- import { handleHopProtocol } from './hop.js'
20
- import { handleStop } from './stop.js'
21
- import type { Multiaddr } from '@multiformats/multiaddr'
22
- import type { PeerStore } from '@libp2p/interface-peer-store'
23
- import type { Startable } from '@libp2p/interfaces/dist/src/startable'
24
- import type { ConnectionManager } from '@libp2p/interface-connection-manager'
25
- import type { AddressManager } from '@libp2p/interface-address-manager'
26
- import { pbStream } from 'it-pb-stream'
27
- import pDefer from 'p-defer'
28
-
29
- const log = logger('libp2p:circuit')
30
-
31
- export interface CircuitOptions {
32
- limit?: number
33
- }
34
-
35
- export interface CircuitComponents {
36
- peerId: PeerId
37
- peerStore: PeerStore
38
- registrar: Registrar
39
- connectionManager: ConnectionManager
40
- upgrader: Upgrader
41
- addressManager: AddressManager
42
- transportManager: TransportManager
43
- }
44
-
45
- interface ConnectOptions {
46
- stream: Stream
47
- connection: Connection
48
- destinationPeer: PeerId
49
- destinationAddr: Multiaddr
50
- relayAddr: Multiaddr
51
- ma: Multiaddr
52
- disconnectOnFailure: boolean
53
- }
54
-
55
- export class Circuit implements Transport, Startable {
56
- private handler?: ConnectionHandler
57
- private readonly components: CircuitComponents
58
- private readonly reservationStore: ReservationStore
59
- private readonly _init: RelayConfig
60
- private _started: boolean
61
-
62
- constructor (components: CircuitComponents, options: RelayConfig) {
63
- this.components = components
64
- this._init = options
65
- this.reservationStore = new ReservationStore({
66
- defaultDataLimit: options.hop?.limit?.data,
67
- defaultDurationLimit: options.hop?.limit?.duration
68
- })
69
- this._started = false
70
- }
71
-
72
- isStarted () {
73
- return this._started
74
- }
75
-
76
- async start (): Promise<void> {
77
- if (this._started) {
78
- return
79
- }
80
-
81
- this._started = true
82
-
83
- // only handle hop if enabled
84
- if (this._init.hop.enabled === true) {
85
- void this.components.registrar.handle(RELAY_V2_HOP_CODEC, (data) => {
86
- void this.onHop(data).catch(err => {
87
- log.error(err)
88
- })
89
- })
90
- .catch(err => {
91
- log.error(err)
92
- })
93
- }
94
-
95
- void this.components.registrar.handle(RELAY_V2_STOP_CODEC, (data) => {
96
- void this.onStop(data).catch(err => {
97
- log.error(err)
98
- })
99
- })
100
- .catch(err => {
101
- log.error(err)
102
- })
103
-
104
- if (this._init.hop.enabled === true) {
105
- void this.reservationStore.start()
106
- }
107
- }
108
-
109
- async stop () {
110
- if (this._init.hop.enabled === true) {
111
- this.reservationStore.stop()
112
- await this.components.registrar.unhandle(RELAY_V2_HOP_CODEC)
113
- }
114
- await this.components.registrar.unhandle(RELAY_V2_STOP_CODEC)
115
- }
116
-
117
- get [symbol] (): true {
118
- return true
119
- }
120
-
121
- get [Symbol.toStringTag] () {
122
- return 'libp2p/circuit-relay-v2'
123
- }
124
-
125
- async onHop ({ connection, stream }: IncomingStreamData) {
126
- log('received circuit v2 hop protocol stream from %s', connection.remotePeer)
127
-
128
- const hopTimeoutPromise = pDefer()
129
- const timeout = setTimeout(() => {
130
- hopTimeoutPromise.reject('timed out')
131
- }, this._init.hop.timeout)
132
- const pbstr = pbStream(stream)
133
-
134
- try {
135
- const request: CircuitV2.HopMessage = await Promise.race([
136
- pbstr.pb(CircuitV2.HopMessage).read(),
137
- hopTimeoutPromise.promise as any
138
- ])
139
-
140
- if (request?.type == null) {
141
- throw new Error('request was invalid, could not read from stream')
142
- }
143
-
144
- await Promise.race([
145
- handleHopProtocol({
146
- connection,
147
- stream: pbstr,
148
- connectionManager: this.components.connectionManager,
149
- relayPeer: this.components.peerId,
150
- relayAddrs: this.components.addressManager.getListenAddrs(),
151
- reservationStore: this.reservationStore,
152
- peerStore: this.components.peerStore,
153
- request
154
- }),
155
- hopTimeoutPromise.promise
156
- ])
157
- } catch (_err) {
158
- pbstr.pb(CircuitV2.HopMessage).write({
159
- type: CircuitV2.HopMessage.Type.STATUS,
160
- status: CircuitV2.Status.MALFORMED_MESSAGE
161
- })
162
- stream.abort(_err as Error)
163
- } finally {
164
- clearTimeout(timeout)
165
- }
166
- }
167
-
168
- async onStop ({ connection, stream }: IncomingStreamData) {
169
- const pbstr = pbStream(stream)
170
- const request = await pbstr.readPB(CircuitV2.StopMessage)
171
- log('received circuit v2 stop protocol request from %s', connection.remotePeer)
172
- if (request?.type === undefined) {
173
- return
174
- }
175
-
176
- const mStream = await handleStop({
177
- connection,
178
- pbstr,
179
- request
180
- })
181
-
182
- if (mStream != null) {
183
- const remoteAddr = multiaddr(request.peer?.addrs?.[0])
184
- const localAddr = this.components.transportManager.getAddrs()[0]
185
- const maConn = streamToMaConnection({
186
- stream: mStream as any,
187
- remoteAddr,
188
- localAddr
189
- })
190
- log('new inbound connection %s', maConn.remoteAddr)
191
- const conn = await this.components.upgrader.upgradeInbound(maConn)
192
- log('%s connection %s upgraded', 'inbound', maConn.remoteAddr)
193
- this.handler?.(conn)
194
- }
195
- }
196
-
197
- /**
198
- * Dial a peer over a relay
199
- */
200
- async dial (ma: Multiaddr, options: AbortOptions = {}): Promise<Connection> {
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 failed as addresses did not have peer id'
210
- log.error(errMsg)
211
- throw createError(new Error(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.components.connectionManager.getConnections(relayPeer)
219
- let relayConnection = relayConnections[0]
220
-
221
- if (relayConnection == null) {
222
- await this.components.peerStore.addressBook.add(relayPeer, [relayAddr])
223
- relayConnection = await this.components.connectionManager.openConnection(relayPeer, options)
224
- disconnectOnFailure = true
225
- }
226
-
227
- try {
228
- const stream = await relayConnection.newStream([RELAY_V2_HOP_CODEC])
229
- return await this.connectV2({
230
- stream,
231
- connection: relayConnection,
232
- destinationPeer,
233
- destinationAddr,
234
- relayAddr,
235
- ma,
236
- disconnectOnFailure
237
- })
238
- } catch (err: any) {
239
- log.error('Circuit relay dial failed', err)
240
- disconnectOnFailure && await relayConnection.close()
241
- throw err
242
- }
243
- }
244
-
245
- async connectV2 (
246
- {
247
- stream, connection, destinationPeer,
248
- destinationAddr, relayAddr, ma,
249
- disconnectOnFailure
250
- }: ConnectOptions
251
- ) {
252
- try {
253
- const pbstr = pbStream(stream)
254
- const hopstr = pbstr.pb(CircuitV2.HopMessage)
255
- hopstr.write({
256
- type: CircuitV2.HopMessage.Type.CONNECT,
257
- peer: {
258
- id: destinationPeer.toBytes(),
259
- addrs: [multiaddr(destinationAddr).bytes]
260
- }
261
- })
262
-
263
- const status = await hopstr.read()
264
- if (status.status !== CircuitV2.Status.OK) {
265
- throw createError(new Error(`failed to connect via relay with status ${status?.status?.toString() ?? 'undefined'}`), codes.ERR_HOP_REQUEST_FAILED)
266
- }
267
-
268
- // TODO: do something with limit and transient connection
269
-
270
- let localAddr = relayAddr
271
- localAddr = localAddr.encapsulate(`/p2p-circuit/p2p/${this.components.peerId.toString()}`)
272
- const maConn = streamToMaConnection({
273
- stream: pbstr.unwrap(),
274
- remoteAddr: ma,
275
- localAddr
276
- })
277
- log('new outbound connection %s', maConn.remoteAddr)
278
- const conn = await this.components.upgrader.upgradeOutbound(maConn)
279
- return conn
280
- } catch (err) {
281
- log.error('Circuit relay dial failed', err)
282
- disconnectOnFailure && await connection.close()
283
- throw err
284
- }
285
- }
286
-
287
- /**
288
- * Create a listener
289
- */
290
- createListener (options: CreateListenerOptions): Listener {
291
- // Called on successful HOP and STOP requests
292
- this.handler = options.handler
293
-
294
- return createListener({
295
- connectionManager: this.components.connectionManager,
296
- peerStore: this.components.peerStore
297
- })
298
- }
299
-
300
- /**
301
- * Filter check for all Multiaddrs that this transport can dial on
302
- *
303
- * @param {Multiaddr[]} multiaddrs
304
- * @returns {Multiaddr[]}
305
- */
306
- filter (multiaddrs: Multiaddr[]): Multiaddr[] {
307
- multiaddrs = Array.isArray(multiaddrs) ? multiaddrs : [multiaddrs]
308
-
309
- return multiaddrs.filter((ma) => {
310
- return mafmt.Circuit.matches(ma)
311
- })
312
- }
313
- }