libp2p 0.46.21 → 1.0.0-06e6d235f

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 +52 -48
  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 -19
  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 +30 -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 +41 -110
  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 -37
  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,443 +0,0 @@
1
- import { TypedEventEmitter, setMaxListeners } from '@libp2p/interface/events'
2
- import { logger } from '@libp2p/logger'
3
- import { peerIdFromBytes } from '@libp2p/peer-id'
4
- import { RecordEnvelope } from '@libp2p/peer-record'
5
- import { type Multiaddr, multiaddr } from '@multiformats/multiaddr'
6
- import { pbStream, type ProtobufStream } from 'it-protobuf-stream'
7
- import pDefer from 'p-defer'
8
- import { MAX_CONNECTIONS } from '../../connection-manager/constants.js'
9
- import {
10
- CIRCUIT_PROTO_CODE,
11
- DEFAULT_HOP_TIMEOUT,
12
- RELAY_SOURCE_TAG,
13
- RELAY_V2_HOP_CODEC,
14
- RELAY_V2_STOP_CODEC
15
- } from '../constants.js'
16
- import { HopMessage, type Reservation, Status, StopMessage } from '../pb/index.js'
17
- import { createLimitedRelay } from '../utils.js'
18
- import { AdvertService, type AdvertServiceComponents, type AdvertServiceInit } from './advert-service.js'
19
- import { ReservationStore, type ReservationStoreInit } from './reservation-store.js'
20
- import { ReservationVoucherRecord } from './reservation-voucher.js'
21
- import type { CircuitRelayService, RelayReservation } from '../index.js'
22
- import type { Connection, Stream } from '@libp2p/interface/connection'
23
- import type { ConnectionGater } from '@libp2p/interface/connection-gater'
24
- import type { PeerId } from '@libp2p/interface/peer-id'
25
- import type { PeerStore } from '@libp2p/interface/peer-store'
26
- import type { Startable } from '@libp2p/interface/startable'
27
- import type { AddressManager } from '@libp2p/interface-internal/address-manager'
28
- import type { ConnectionManager } from '@libp2p/interface-internal/connection-manager'
29
- import type { IncomingStreamData, Registrar } from '@libp2p/interface-internal/registrar'
30
- import type { PeerMap } from '@libp2p/peer-collections'
31
-
32
- const log = logger('libp2p:circuit-relay:server')
33
-
34
- const isRelayAddr = (ma: Multiaddr): boolean => ma.protoCodes().includes(CIRCUIT_PROTO_CODE)
35
-
36
- export interface CircuitRelayServerInit {
37
- /**
38
- * Incoming hop requests must complete within this time in ms otherwise
39
- * the stream will be reset (default: 30s)
40
- */
41
- hopTimeout?: number
42
-
43
- /**
44
- * If true, advertise this service via libp2p content routing to allow
45
- * peers to locate us on the network (default: false)
46
- */
47
- advertise?: boolean | AdvertServiceInit
48
-
49
- /**
50
- * Configuration of reservations
51
- */
52
- reservations?: ReservationStoreInit
53
-
54
- /**
55
- * The maximum number of simultaneous HOP inbound streams that can be open at once
56
- */
57
- maxInboundHopStreams?: number
58
-
59
- /**
60
- * The maximum number of simultaneous HOP outbound streams that can be open at once
61
- */
62
- maxOutboundHopStreams?: number
63
-
64
- /**
65
- * The maximum number of simultaneous STOP outbound streams that can be open at
66
- * once. (default: 300)
67
- */
68
- maxOutboundStopStreams?: number
69
- }
70
-
71
- export interface HopProtocolOptions {
72
- connection: Connection
73
- request: HopMessage
74
- stream: ProtobufStream<Stream>
75
- }
76
-
77
- export interface StopOptions {
78
- connection: Connection
79
- request: StopMessage
80
- }
81
-
82
- export interface CircuitRelayServerComponents extends AdvertServiceComponents {
83
- registrar: Registrar
84
- peerStore: PeerStore
85
- addressManager: AddressManager
86
- peerId: PeerId
87
- connectionManager: ConnectionManager
88
- connectionGater: ConnectionGater
89
- }
90
-
91
- export interface RelayServerEvents {
92
- 'relay:reservation': CustomEvent<RelayReservation>
93
- 'relay:advert:success': CustomEvent<unknown>
94
- 'relay:advert:error': CustomEvent<Error>
95
- }
96
-
97
- const defaults = {
98
- maxOutboundStopStreams: MAX_CONNECTIONS
99
- }
100
-
101
- class CircuitRelayServer extends TypedEventEmitter<RelayServerEvents> implements Startable, CircuitRelayService {
102
- private readonly registrar: Registrar
103
- private readonly peerStore: PeerStore
104
- private readonly addressManager: AddressManager
105
- private readonly peerId: PeerId
106
- private readonly connectionManager: ConnectionManager
107
- private readonly connectionGater: ConnectionGater
108
- private readonly reservationStore: ReservationStore
109
- private readonly advertService: AdvertService | undefined
110
- private started: boolean
111
- private readonly hopTimeout: number
112
- private readonly shutdownController: AbortController
113
- private readonly maxInboundHopStreams?: number
114
- private readonly maxOutboundHopStreams?: number
115
- private readonly maxOutboundStopStreams: number
116
-
117
- /**
118
- * Creates an instance of Relay
119
- */
120
- constructor (components: CircuitRelayServerComponents, init: CircuitRelayServerInit = {}) {
121
- super()
122
-
123
- this.registrar = components.registrar
124
- this.peerStore = components.peerStore
125
- this.addressManager = components.addressManager
126
- this.peerId = components.peerId
127
- this.connectionManager = components.connectionManager
128
- this.connectionGater = components.connectionGater
129
- this.started = false
130
- this.hopTimeout = init?.hopTimeout ?? DEFAULT_HOP_TIMEOUT
131
- this.shutdownController = new AbortController()
132
- this.maxInboundHopStreams = init.maxInboundHopStreams
133
- this.maxOutboundHopStreams = init.maxOutboundHopStreams
134
- this.maxOutboundStopStreams = init.maxOutboundStopStreams ?? defaults.maxOutboundStopStreams
135
-
136
- setMaxListeners(Infinity, this.shutdownController.signal)
137
-
138
- if (init.advertise != null && init.advertise !== false) {
139
- this.advertService = new AdvertService(components, init.advertise === true ? undefined : init.advertise)
140
- this.advertService.addEventListener('advert:success', () => {
141
- this.safeDispatchEvent('relay:advert:success', {})
142
- })
143
- this.advertService.addEventListener('advert:error', (evt) => {
144
- this.safeDispatchEvent('relay:advert:error', { detail: evt.detail })
145
- })
146
- }
147
-
148
- this.reservationStore = new ReservationStore(init.reservations)
149
- }
150
-
151
- isStarted (): boolean {
152
- return this.started
153
- }
154
-
155
- /**
156
- * Start Relay service
157
- */
158
- async start (): Promise<void> {
159
- if (this.started) {
160
- return
161
- }
162
-
163
- // Advertise service if HOP enabled and advertising enabled
164
- this.advertService?.start()
165
-
166
- await this.registrar.handle(RELAY_V2_HOP_CODEC, (data) => {
167
- void this.onHop(data).catch(err => {
168
- log.error(err)
169
- })
170
- }, {
171
- maxInboundStreams: this.maxInboundHopStreams,
172
- maxOutboundStreams: this.maxOutboundHopStreams,
173
- runOnTransientConnection: true
174
- })
175
-
176
- this.reservationStore.start()
177
-
178
- this.started = true
179
- }
180
-
181
- /**
182
- * Stop Relay service
183
- */
184
- async stop (): Promise<void> {
185
- this.advertService?.stop()
186
- this.reservationStore.stop()
187
- this.shutdownController.abort()
188
- await this.registrar.unhandle(RELAY_V2_HOP_CODEC)
189
-
190
- this.started = false
191
- }
192
-
193
- async onHop ({ connection, stream }: IncomingStreamData): Promise<void> {
194
- log('received circuit v2 hop protocol stream from %p', connection.remotePeer)
195
-
196
- const hopTimeoutPromise = pDefer<HopMessage>()
197
- const timeout = setTimeout(() => {
198
- hopTimeoutPromise.reject('timed out')
199
- }, this.hopTimeout)
200
- const pbstr = pbStream(stream)
201
-
202
- try {
203
- const request: HopMessage = await Promise.race([
204
- pbstr.pb(HopMessage).read(),
205
- hopTimeoutPromise.promise
206
- ])
207
-
208
- if (request?.type == null) {
209
- throw new Error('request was invalid, could not read from stream')
210
- }
211
-
212
- log('received', request.type)
213
-
214
- await Promise.race([
215
- this.handleHopProtocol({
216
- connection,
217
- stream: pbstr,
218
- request
219
- }),
220
- hopTimeoutPromise.promise
221
- ])
222
- } catch (err: any) {
223
- log.error('error while handling hop', err)
224
- await pbstr.pb(HopMessage).write({
225
- type: HopMessage.Type.STATUS,
226
- status: Status.MALFORMED_MESSAGE
227
- })
228
- stream.abort(err)
229
- } finally {
230
- clearTimeout(timeout)
231
- }
232
- }
233
-
234
- async handleHopProtocol ({ stream, request, connection }: HopProtocolOptions): Promise<void> {
235
- log('received hop message')
236
- switch (request.type) {
237
- case HopMessage.Type.RESERVE: await this.handleReserve({ stream, request, connection }); break
238
- case HopMessage.Type.CONNECT: await this.handleConnect({ stream, request, connection }); break
239
- default: {
240
- log.error('invalid hop request type %s via peer %p', request.type, connection.remotePeer)
241
- await stream.pb(HopMessage).write({ type: HopMessage.Type.STATUS, status: Status.UNEXPECTED_MESSAGE })
242
- }
243
- }
244
- }
245
-
246
- async handleReserve ({ stream, request, connection }: HopProtocolOptions): Promise<void> {
247
- const hopstr = stream.pb(HopMessage)
248
- log('hop reserve request from %p', connection.remotePeer)
249
-
250
- if (isRelayAddr(connection.remoteAddr)) {
251
- log.error('relay reservation over circuit connection denied for peer: %p', connection.remotePeer)
252
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED })
253
- return
254
- }
255
-
256
- if ((await this.connectionGater.denyInboundRelayReservation?.(connection.remotePeer)) === true) {
257
- log.error('reservation for %p denied by connection gater', connection.remotePeer)
258
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED })
259
- return
260
- }
261
-
262
- const result = this.reservationStore.reserve(connection.remotePeer, connection.remoteAddr)
263
-
264
- if (result.status !== Status.OK) {
265
- await hopstr.write({ type: HopMessage.Type.STATUS, status: result.status })
266
- return
267
- }
268
-
269
- try {
270
- // tag relay target peer
271
- // result.expire is non-null if `ReservationStore.reserve` returns with status == OK
272
- if (result.expire != null) {
273
- const ttl = (result.expire * 1000) - Date.now()
274
- await this.peerStore.merge(connection.remotePeer, {
275
- tags: {
276
- [RELAY_SOURCE_TAG]: { value: 1, ttl }
277
- }
278
- })
279
- }
280
-
281
- await hopstr.write({
282
- type: HopMessage.Type.STATUS,
283
- status: Status.OK,
284
- reservation: await this.makeReservation(connection.remotePeer, BigInt(result.expire ?? 0)),
285
- limit: this.reservationStore.get(connection.remotePeer)?.limit
286
- })
287
- log('sent confirmation response to %s', connection.remotePeer)
288
- } catch (err) {
289
- log.error('failed to send confirmation response to %p', connection.remotePeer, err)
290
- this.reservationStore.removeReservation(connection.remotePeer)
291
- }
292
- }
293
-
294
- async makeReservation (
295
- remotePeer: PeerId,
296
- expire: bigint
297
- ): Promise<Reservation> {
298
- const addrs = []
299
-
300
- for (const relayAddr of this.addressManager.getAddresses()) {
301
- if (relayAddr.toString().includes('/p2p-circuit')) {
302
- continue
303
- }
304
-
305
- addrs.push(relayAddr.bytes)
306
- }
307
-
308
- const voucher = await RecordEnvelope.seal(new ReservationVoucherRecord({
309
- peer: remotePeer,
310
- relay: this.peerId,
311
- expiration: Number(expire)
312
- }), this.peerId)
313
-
314
- return {
315
- addrs,
316
- expire,
317
- voucher: voucher.marshal()
318
- }
319
- }
320
-
321
- async handleConnect ({ stream, request, connection }: HopProtocolOptions): Promise<void> {
322
- const hopstr = stream.pb(HopMessage)
323
-
324
- if (isRelayAddr(connection.remoteAddr)) {
325
- log.error('relay reservation over circuit connection denied for peer: %p', connection.remotePeer)
326
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED })
327
- return
328
- }
329
-
330
- log('hop connect request from %p', connection.remotePeer)
331
-
332
- let dstPeer: PeerId
333
-
334
- try {
335
- if (request.peer == null) {
336
- log.error('no peer info in hop connect request')
337
- throw new Error('no peer info in request')
338
- }
339
-
340
- request.peer.addrs.forEach(multiaddr)
341
- dstPeer = peerIdFromBytes(request.peer.id)
342
- } catch (err) {
343
- log.error('invalid hop connect request via peer %p %s', connection.remotePeer, err)
344
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.MALFORMED_MESSAGE })
345
- return
346
- }
347
-
348
- if (!this.reservationStore.hasReservation(dstPeer)) {
349
- log.error('hop connect denied for destination peer %p not having a reservation for %p with status %s', dstPeer, connection.remotePeer, Status.NO_RESERVATION)
350
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.NO_RESERVATION })
351
- return
352
- }
353
-
354
- if ((await this.connectionGater.denyOutboundRelayedConnection?.(connection.remotePeer, dstPeer)) === true) {
355
- log.error('hop connect for %p to %p denied by connection gater', connection.remotePeer, dstPeer)
356
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED })
357
- return
358
- }
359
-
360
- const connections = this.connectionManager.getConnections(dstPeer)
361
-
362
- if (connections.length === 0) {
363
- log('hop connect denied for destination peer %p not having a connection for %p as there is no destination connection', dstPeer, connection.remotePeer)
364
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.NO_RESERVATION })
365
- return
366
- }
367
-
368
- const destinationConnection = connections[0]
369
-
370
- const destinationStream = await this.stopHop({
371
- connection: destinationConnection,
372
- request: {
373
- type: StopMessage.Type.CONNECT,
374
- peer: {
375
- id: connection.remotePeer.toBytes(),
376
- addrs: []
377
- }
378
- }
379
- })
380
-
381
- if (destinationStream == null) {
382
- log.error('failed to open stream to destination peer %p', destinationConnection?.remotePeer)
383
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.CONNECTION_FAILED })
384
- return
385
- }
386
-
387
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.OK })
388
- const sourceStream = stream.unwrap()
389
-
390
- log('connection from %p to %p established - merging streams', connection.remotePeer, dstPeer)
391
- const limit = this.reservationStore.get(dstPeer)?.limit
392
- // Short circuit the two streams to create the relayed connection
393
- createLimitedRelay(sourceStream, destinationStream, this.shutdownController.signal, limit)
394
- }
395
-
396
- /**
397
- * Send a STOP request to the target peer that the dialing peer wants to contact
398
- */
399
- async stopHop ({
400
- connection,
401
- request
402
- }: StopOptions): Promise<Stream | undefined> {
403
- log('starting circuit relay v2 stop request to %s', connection.remotePeer)
404
- const stream = await connection.newStream([RELAY_V2_STOP_CODEC], {
405
- maxOutboundStreams: this.maxOutboundStopStreams,
406
- runOnTransientConnection: true
407
- })
408
- const pbstr = pbStream(stream)
409
- const stopstr = pbstr.pb(StopMessage)
410
- await stopstr.write(request)
411
- let response
412
-
413
- try {
414
- response = await stopstr.read()
415
- } catch (err) {
416
- log.error('error parsing stop message response from %p', connection.remotePeer)
417
- }
418
-
419
- if (response == null) {
420
- log.error('could not read response from %p', connection.remotePeer)
421
- await stream.close()
422
- return
423
- }
424
-
425
- if (response.status === Status.OK) {
426
- log('stop request to %p was successful', connection.remotePeer)
427
- return pbstr.unwrap()
428
- }
429
-
430
- log('stop request failed with code %d', response.status)
431
- await stream.close()
432
- }
433
-
434
- get reservations (): PeerMap<RelayReservation> {
435
- return this.reservationStore.reservations
436
- }
437
- }
438
-
439
- export function circuitRelayServer (init: CircuitRelayServerInit = {}): (components: CircuitRelayServerComponents) => CircuitRelayService {
440
- return (components) => {
441
- return new CircuitRelayServer(components, init)
442
- }
443
- }
@@ -1,116 +0,0 @@
1
- import { PeerMap } from '@libp2p/peer-collections'
2
- import { DEFAULT_DATA_LIMIT, DEFAULT_DURATION_LIMIT, DEFAULT_MAX_RESERVATION_CLEAR_INTERVAL, DEFAULT_MAX_RESERVATION_STORE_SIZE, DEFAULT_MAX_RESERVATION_TTL } from '../constants.js'
3
- import { type Limit, Status } from '../pb/index.js'
4
- import type { RelayReservation } from '../index.js'
5
- import type { RecursivePartial } from '@libp2p/interface'
6
- import type { PeerId } from '@libp2p/interface/peer-id'
7
- import type { Startable } from '@libp2p/interface/startable'
8
- import type { Multiaddr } from '@multiformats/multiaddr'
9
-
10
- export type ReservationStatus = Status.OK | Status.PERMISSION_DENIED | Status.RESERVATION_REFUSED
11
-
12
- export interface ReservationStoreInit {
13
- /*
14
- * maximum number of reservations allowed, default: 15
15
- */
16
- maxReservations?: number
17
- /*
18
- * interval after which stale reservations are cleared, default: 300s
19
- */
20
- reservationClearInterval?: number
21
- /*
22
- * apply default relay limits to a new reservation, default: true
23
- */
24
- applyDefaultLimit?: boolean
25
- /**
26
- * reservation ttl, default: 2 hours
27
- */
28
- reservationTtl?: number
29
- /**
30
- * The maximum time a relayed connection can be open for
31
- */
32
- defaultDurationLimit?: number
33
- /**
34
- * The maximum amount of data allowed to be transferred over a relayed connection
35
- */
36
- defaultDataLimit?: bigint
37
- }
38
-
39
- export type ReservationStoreOptions = RecursivePartial<ReservationStoreInit>
40
-
41
- export class ReservationStore implements Startable {
42
- public readonly reservations = new PeerMap<RelayReservation>()
43
- private _started = false
44
- private interval: any
45
- private readonly maxReservations: number
46
- private readonly reservationClearInterval: number
47
- private readonly applyDefaultLimit: boolean
48
- private readonly reservationTtl: number
49
- private readonly defaultDurationLimit: number
50
- private readonly defaultDataLimit: bigint
51
-
52
- constructor (options: ReservationStoreOptions = {}) {
53
- this.maxReservations = options.maxReservations ?? DEFAULT_MAX_RESERVATION_STORE_SIZE
54
- this.reservationClearInterval = options.reservationClearInterval ?? DEFAULT_MAX_RESERVATION_CLEAR_INTERVAL
55
- this.applyDefaultLimit = options.applyDefaultLimit !== false
56
- this.reservationTtl = options.reservationTtl ?? DEFAULT_MAX_RESERVATION_TTL
57
- this.defaultDurationLimit = options.defaultDurationLimit ?? DEFAULT_DURATION_LIMIT
58
- this.defaultDataLimit = options.defaultDataLimit ?? DEFAULT_DATA_LIMIT
59
- }
60
-
61
- isStarted (): boolean {
62
- return this._started
63
- }
64
-
65
- start (): void {
66
- if (this._started) {
67
- return
68
- }
69
- this._started = true
70
- this.interval = setInterval(
71
- () => {
72
- const now = (new Date()).getTime()
73
- this.reservations.forEach((r, k) => {
74
- if (r.expire.getTime() < now) {
75
- this.reservations.delete(k)
76
- }
77
- })
78
- },
79
- this.reservationClearInterval
80
- )
81
- }
82
-
83
- stop (): void {
84
- clearInterval(this.interval)
85
- }
86
-
87
- reserve (peer: PeerId, addr: Multiaddr, limit?: Limit): { status: ReservationStatus, expire?: number } {
88
- if (this.reservations.size >= this.maxReservations && !this.reservations.has(peer)) {
89
- return { status: Status.RESERVATION_REFUSED }
90
- }
91
-
92
- const expire = new Date(Date.now() + this.reservationTtl)
93
- let checkedLimit: Limit | undefined
94
-
95
- if (this.applyDefaultLimit) {
96
- checkedLimit = limit ?? { data: this.defaultDataLimit, duration: this.defaultDurationLimit }
97
- }
98
-
99
- this.reservations.set(peer, { addr, expire, limit: checkedLimit })
100
-
101
- // return expiry time in seconds
102
- return { status: Status.OK, expire: Math.round(expire.getTime() / 1000) }
103
- }
104
-
105
- removeReservation (peer: PeerId): void {
106
- this.reservations.delete(peer)
107
- }
108
-
109
- hasReservation (dst: PeerId): boolean {
110
- return this.reservations.has(dst)
111
- }
112
-
113
- get (peer: PeerId): RelayReservation | undefined {
114
- return this.reservations.get(peer)
115
- }
116
- }
@@ -1,51 +0,0 @@
1
- import { ReservationVoucher } from '../pb/index.js'
2
- import type { PeerId } from '@libp2p/interface/peer-id'
3
- import type { Record } from '@libp2p/interface/record'
4
-
5
- export interface ReservationVoucherOptions {
6
- relay: PeerId
7
- peer: PeerId
8
- expiration: number
9
- }
10
-
11
- export class ReservationVoucherRecord implements Record {
12
- public readonly domain = 'libp2p-relay-rsvp'
13
- public readonly codec = new Uint8Array([0x03, 0x02])
14
-
15
- private readonly relay: PeerId
16
- private readonly peer: PeerId
17
- private readonly expiration: number
18
-
19
- constructor ({ relay, peer, expiration }: ReservationVoucherOptions) {
20
- this.relay = relay
21
- this.peer = peer
22
- this.expiration = expiration
23
- }
24
-
25
- marshal (): Uint8Array {
26
- return ReservationVoucher.encode({
27
- relay: this.relay.toBytes(),
28
- peer: this.peer.toBytes(),
29
- expiration: BigInt(this.expiration)
30
- })
31
- }
32
-
33
- equals (other: Record): boolean {
34
- if (!(other instanceof ReservationVoucherRecord)) {
35
- return false
36
- }
37
- if (!this.peer.equals(other.peer)) {
38
- return false
39
- }
40
-
41
- if (!this.relay.equals(other.relay)) {
42
- return false
43
- }
44
-
45
- if (this.expiration !== other.expiration) {
46
- return false
47
- }
48
-
49
- return true
50
- }
51
- }