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,312 +0,0 @@
1
- import { TypedEventEmitter, type TypedEventTarget } from '@libp2p/interface/events'
2
- import { logger } from '@libp2p/logger'
3
- import { PeerMap } from '@libp2p/peer-collections'
4
- import { multiaddr } from '@multiformats/multiaddr'
5
- import { pbStream } from 'it-protobuf-stream'
6
- import { PeerJobQueue } from '../../utils/peer-job-queue.js'
7
- import { DEFAULT_RESERVATION_CONCURRENCY, RELAY_TAG, RELAY_V2_HOP_CODEC } from '../constants.js'
8
- import { HopMessage, Status } from '../pb/index.js'
9
- import { getExpirationMilliseconds } from '../utils.js'
10
- import type { Reservation } from '../pb/index.js'
11
- import type { Libp2pEvents, AbortOptions } from '@libp2p/interface'
12
- import type { Connection } from '@libp2p/interface/connection'
13
- import type { PeerId } from '@libp2p/interface/peer-id'
14
- import type { PeerStore } from '@libp2p/interface/peer-store'
15
- import type { Startable } from '@libp2p/interface/startable'
16
- import type { ConnectionManager } from '@libp2p/interface-internal/connection-manager'
17
- import type { TransportManager } from '@libp2p/interface-internal/transport-manager'
18
-
19
- const log = logger('libp2p:circuit-relay:transport:reservation-store')
20
-
21
- // allow refreshing a relay reservation if it will expire in the next 10 minutes
22
- const REFRESH_WINDOW = (60 * 1000) * 10
23
-
24
- // try to refresh relay reservations 5 minutes before expiry
25
- const REFRESH_TIMEOUT = (60 * 1000) * 5
26
-
27
- // minimum duration before which a reservation must not be refreshed
28
- const REFRESH_TIMEOUT_MIN = 30 * 1000
29
-
30
- export interface RelayStoreComponents {
31
- peerId: PeerId
32
- connectionManager: ConnectionManager
33
- transportManager: TransportManager
34
- peerStore: PeerStore
35
- events: TypedEventTarget<Libp2pEvents>
36
- }
37
-
38
- export interface RelayStoreInit {
39
- /**
40
- * Multiple relays may be discovered simultaneously - to prevent listening
41
- * on too many relays, this value controls how many to attempt to reserve a
42
- * slot on at once. If set to more than one, we may end up listening on
43
- * more relays than the `maxReservations` value, but on networks with poor
44
- * connectivity the user may wish to attempt to reserve on multiple relays
45
- * simultaneously. (default: 1)
46
- */
47
- reservationConcurrency?: number
48
-
49
- /**
50
- * How many discovered relays to allow in the reservation store
51
- */
52
- discoverRelays?: number
53
-
54
- /**
55
- * Limit the number of potential relays we will dial (default: 100)
56
- */
57
- maxReservationQueueLength?: number
58
-
59
- /**
60
- * When creating a reservation it must complete within this number of ms
61
- * (default: 5000)
62
- */
63
- reservationCompletionTimeout?: number
64
- }
65
-
66
- export type RelayType = 'discovered' | 'configured'
67
-
68
- interface RelayEntry {
69
- timeout: ReturnType<typeof setTimeout>
70
- type: RelayType
71
- reservation: Reservation
72
- }
73
-
74
- export interface ReservationStoreEvents {
75
- 'relay:not-enough-relays': CustomEvent
76
- 'relay:removed': CustomEvent<PeerId>
77
- }
78
-
79
- export class ReservationStore extends TypedEventEmitter<ReservationStoreEvents> implements Startable {
80
- private readonly peerId: PeerId
81
- private readonly connectionManager: ConnectionManager
82
- private readonly transportManager: TransportManager
83
- private readonly peerStore: PeerStore
84
- private readonly events: TypedEventTarget<Libp2pEvents>
85
- private readonly reserveQueue: PeerJobQueue
86
- private readonly reservations: PeerMap<RelayEntry>
87
- private readonly maxDiscoveredRelays: number
88
- private readonly maxReservationQueueLength: number
89
- private readonly reservationCompletionTimeout: number
90
- private started: boolean
91
-
92
- constructor (components: RelayStoreComponents, init?: RelayStoreInit) {
93
- super()
94
-
95
- this.peerId = components.peerId
96
- this.connectionManager = components.connectionManager
97
- this.transportManager = components.transportManager
98
- this.peerStore = components.peerStore
99
- this.events = components.events
100
- this.reservations = new PeerMap()
101
- this.maxDiscoveredRelays = init?.discoverRelays ?? 0
102
- this.maxReservationQueueLength = init?.maxReservationQueueLength ?? 100
103
- this.reservationCompletionTimeout = init?.reservationCompletionTimeout ?? 10000
104
- this.started = false
105
-
106
- // ensure we don't listen on multiple relays simultaneously
107
- this.reserveQueue = new PeerJobQueue({
108
- concurrency: init?.reservationConcurrency ?? DEFAULT_RESERVATION_CONCURRENCY
109
- })
110
-
111
- // When a peer disconnects, if we had a reservation on that peer
112
- // remove the reservation and multiaddr and maybe trigger search
113
- // for new relays
114
- this.events.addEventListener('peer:disconnect', (evt) => {
115
- this.#removeRelay(evt.detail)
116
- })
117
- }
118
-
119
- isStarted (): boolean {
120
- return this.started
121
- }
122
-
123
- async start (): Promise<void> {
124
- this.started = true
125
- }
126
-
127
- async stop (): Promise<void> {
128
- this.reserveQueue.clear()
129
- this.reservations.forEach(({ timeout }) => {
130
- clearTimeout(timeout)
131
- })
132
- this.reservations.clear()
133
- this.started = false
134
- }
135
-
136
- /**
137
- * If the number of current relays is beneath the configured `maxReservations`
138
- * value, and the passed peer id is not our own, and we have a non-relayed connection
139
- * to the remote, and the remote peer speaks the hop protocol, try to reserve a slot
140
- * on the remote peer
141
- */
142
- async addRelay (peerId: PeerId, type: RelayType): Promise<void> {
143
- if (this.peerId.equals(peerId)) {
144
- log('not trying to use self as relay')
145
- return
146
- }
147
-
148
- if (this.reserveQueue.size > this.maxReservationQueueLength) {
149
- log('not adding relay as the queue is full')
150
- return
151
- }
152
-
153
- if (this.reserveQueue.hasJob(peerId)) {
154
- log('relay peer is already in the reservation queue')
155
- return
156
- }
157
-
158
- log('add relay %p', peerId)
159
-
160
- await this.reserveQueue.add(async () => {
161
- try {
162
- // allow refresh of an existing reservation if it is about to expire
163
- const existingReservation = this.reservations.get(peerId)
164
-
165
- if (existingReservation != null) {
166
- if (getExpirationMilliseconds(existingReservation.reservation.expire) > REFRESH_WINDOW) {
167
- log('already have reservation on relay peer %p and it expires in more than 10 minutes', peerId)
168
- return
169
- }
170
-
171
- clearTimeout(existingReservation.timeout)
172
- this.reservations.delete(peerId)
173
- }
174
-
175
- if (type === 'discovered' && [...this.reservations.values()].reduce((acc, curr) => {
176
- if (curr.type === 'discovered') {
177
- acc++
178
- }
179
-
180
- return acc
181
- }, 0) >= this.maxDiscoveredRelays) {
182
- log('already have enough discovered relays')
183
- return
184
- }
185
-
186
- const signal = AbortSignal.timeout(this.reservationCompletionTimeout)
187
-
188
- const connection = await this.connectionManager.openConnection(peerId, {
189
- signal
190
- })
191
-
192
- if (connection.remoteAddr.protoNames().includes('p2p-circuit')) {
193
- log('not creating reservation over relayed connection')
194
- return
195
- }
196
-
197
- const reservation = await this.#createReservation(connection, {
198
- signal
199
- })
200
-
201
- log('created reservation on relay peer %p', peerId)
202
-
203
- const expiration = getExpirationMilliseconds(reservation.expire)
204
-
205
- // sets a lower bound on the timeout, and also don't let it go over
206
- // 2^31 - 1 (setTimeout will only accept signed 32 bit integers)
207
- const timeoutDuration = Math.min(Math.max(expiration - REFRESH_TIMEOUT, REFRESH_TIMEOUT_MIN), Math.pow(2, 31) - 1)
208
-
209
- const timeout = setTimeout(() => {
210
- this.addRelay(peerId, type).catch(err => {
211
- log.error('could not refresh reservation to relay %p', peerId, err)
212
- })
213
- }, timeoutDuration)
214
-
215
- // we've managed to create a reservation successfully
216
- this.reservations.set(peerId, {
217
- timeout,
218
- reservation,
219
- type
220
- })
221
-
222
- // ensure we don't close the connection to the relay
223
- await this.peerStore.merge(peerId, {
224
- tags: {
225
- [RELAY_TAG]: {
226
- value: 1,
227
- ttl: expiration
228
- }
229
- }
230
- })
231
-
232
- // listen on multiaddr that only the circuit transport is listening for
233
- await this.transportManager.listen([multiaddr(`/p2p/${peerId.toString()}/p2p-circuit`)])
234
- } catch (err) {
235
- log.error('could not reserve slot on %p', peerId, err)
236
-
237
- // cancel the renewal timeout if it's been set
238
- const reservation = this.reservations.get(peerId)
239
-
240
- if (reservation != null) {
241
- clearTimeout(reservation.timeout)
242
- }
243
-
244
- // if listening failed, remove the reservation
245
- this.reservations.delete(peerId)
246
- }
247
- }, {
248
- peerId
249
- })
250
- }
251
-
252
- hasReservation (peerId: PeerId): boolean {
253
- return this.reservations.has(peerId)
254
- }
255
-
256
- getReservation (peerId: PeerId): Reservation | undefined {
257
- return this.reservations.get(peerId)?.reservation
258
- }
259
-
260
- async #createReservation (connection: Connection, options: AbortOptions): Promise<Reservation> {
261
- options.signal?.throwIfAborted()
262
-
263
- log('requesting reservation from %p', connection.remotePeer)
264
- const stream = await connection.newStream(RELAY_V2_HOP_CODEC, options)
265
- const pbstr = pbStream(stream)
266
- const hopstr = pbstr.pb(HopMessage)
267
- await hopstr.write({ type: HopMessage.Type.RESERVE }, options)
268
-
269
- let response: HopMessage
270
-
271
- try {
272
- response = await hopstr.read(options)
273
- } catch (err: any) {
274
- log.error('error parsing reserve message response from %p because', connection.remotePeer, err)
275
- throw err
276
- } finally {
277
- await stream.close()
278
- }
279
-
280
- if (response.status === Status.OK && (response.reservation != null)) {
281
- return response.reservation
282
- }
283
-
284
- const errMsg = `reservation failed with status ${response.status ?? 'undefined'}`
285
- log.error(errMsg)
286
-
287
- throw new Error(errMsg)
288
- }
289
-
290
- /**
291
- * Remove listen relay
292
- */
293
- #removeRelay (peerId: PeerId): void {
294
- const existingReservation = this.reservations.get(peerId)
295
-
296
- if (existingReservation == null) {
297
- return
298
- }
299
-
300
- log('connection to relay %p closed, removing reservation from local store', peerId)
301
-
302
- clearTimeout(existingReservation.timeout)
303
- this.reservations.delete(peerId)
304
-
305
- this.safeDispatchEvent('relay:removed', { detail: peerId })
306
-
307
- if (this.reservations.size < this.maxDiscoveredRelays) {
308
- log('not enough relays %d/%d', this.reservations.size, this.maxDiscoveredRelays)
309
- this.safeDispatchEvent('relay:not-enough-relays', {})
310
- }
311
- }
312
- }
@@ -1,136 +0,0 @@
1
- import { CodeError } from '@libp2p/interface/errors'
2
- import { logger } from '@libp2p/logger'
3
- import { anySignal } from 'any-signal'
4
- import { CID } from 'multiformats/cid'
5
- import { sha256 } from 'multiformats/hashes/sha2'
6
- import { codes } from '../errors.js'
7
- import type { Limit } from './pb/index.js'
8
- import type { Stream } from '@libp2p/interface/connection'
9
- import type { Source } from 'it-stream-types'
10
- import type { Uint8ArrayList } from 'uint8arraylist'
11
-
12
- const log = logger('libp2p:circuit-relay:utils')
13
-
14
- async function * countStreamBytes (source: Source<Uint8Array | Uint8ArrayList>, limit: { remaining: bigint }): AsyncGenerator<Uint8Array | Uint8ArrayList, void, unknown> {
15
- const limitBytes = limit.remaining
16
-
17
- for await (const buf of source) {
18
- const len = BigInt(buf.byteLength)
19
-
20
- if ((limit.remaining - len) < 0) {
21
- // this is a safe downcast since len is guarantee to be in the range for a number
22
- const remaining = Number(limit.remaining)
23
- limit.remaining = 0n
24
-
25
- try {
26
- if (remaining !== 0) {
27
- yield buf.subarray(0, remaining)
28
- }
29
- } catch (err: any) {
30
- log.error(err)
31
- }
32
-
33
- throw new CodeError(`data limit of ${limitBytes} bytes exceeded`, codes.ERR_TRANSFER_LIMIT_EXCEEDED)
34
- }
35
-
36
- limit.remaining -= len
37
- yield buf
38
- }
39
- }
40
-
41
- export function createLimitedRelay (src: Stream, dst: Stream, abortSignal: AbortSignal, limit?: Limit): void {
42
- function abortStreams (err: Error): void {
43
- src.abort(err)
44
- dst.abort(err)
45
- clearTimeout(timeout)
46
- }
47
-
48
- const abortController = new AbortController()
49
- const signal = anySignal([abortSignal, abortController.signal])
50
-
51
- let timeout: ReturnType<typeof setTimeout> | undefined
52
-
53
- if (limit?.duration != null) {
54
- timeout = setTimeout(() => {
55
- abortController.abort()
56
- }, limit.duration)
57
- }
58
-
59
- let srcDstFinished = false
60
- let dstSrcFinished = false
61
-
62
- let dataLimit: { remaining: bigint } | undefined
63
-
64
- if (limit?.data != null) {
65
- dataLimit = {
66
- remaining: limit.data
67
- }
68
- }
69
-
70
- queueMicrotask(() => {
71
- const onAbort = (): void => {
72
- dst.abort(new CodeError(`duration limit of ${limit?.duration} ms exceeded`, codes.ERR_TRANSFER_LIMIT_EXCEEDED))
73
- }
74
-
75
- signal.addEventListener('abort', onAbort, { once: true })
76
-
77
- void dst.sink(dataLimit == null ? src.source : countStreamBytes(src.source, dataLimit))
78
- .catch(err => {
79
- log.error('error while relaying streams src -> dst', err)
80
- abortStreams(err)
81
- })
82
- .finally(() => {
83
- srcDstFinished = true
84
-
85
- if (dstSrcFinished) {
86
- signal.removeEventListener('abort', onAbort)
87
- signal.clear()
88
- clearTimeout(timeout)
89
- }
90
- })
91
- })
92
-
93
- queueMicrotask(() => {
94
- const onAbort = (): void => {
95
- src.abort(new CodeError(`duration limit of ${limit?.duration} ms exceeded`, codes.ERR_TRANSFER_LIMIT_EXCEEDED))
96
- }
97
-
98
- signal.addEventListener('abort', onAbort, { once: true })
99
-
100
- void src.sink(dataLimit == null ? dst.source : countStreamBytes(dst.source, dataLimit))
101
- .catch(err => {
102
- log.error('error while relaying streams dst -> src', err)
103
- abortStreams(err)
104
- })
105
- .finally(() => {
106
- dstSrcFinished = true
107
-
108
- if (srcDstFinished) {
109
- signal.removeEventListener('abort', onAbort)
110
- signal.clear()
111
- clearTimeout(timeout)
112
- }
113
- })
114
- })
115
- }
116
-
117
- /**
118
- * Convert a namespace string into a cid
119
- */
120
- export async function namespaceToCid (namespace: string): Promise<CID> {
121
- const bytes = new TextEncoder().encode(namespace)
122
- const hash = await sha256.digest(bytes)
123
-
124
- return CID.createV0(hash)
125
- }
126
-
127
- /**
128
- * returns number of ms between now and expiration time
129
- */
130
- export function getExpirationMilliseconds (expireTimeSeconds: bigint): number {
131
- const expireTimeMillis = expireTimeSeconds * BigInt(1000)
132
- const currentTime = new Date().getTime()
133
-
134
- // downcast to number to use with setTimeout
135
- return Number(expireTimeMillis - BigInt(currentTime))
136
- }