@libp2p/circuit-relay-v2 3.2.24-8484de8a2 → 3.2.24-87bc8d4fb

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 (51) hide show
  1. package/dist/index.min.js +1 -1
  2. package/dist/index.min.js.map +4 -4
  3. package/dist/src/constants.d.ts +4 -0
  4. package/dist/src/constants.d.ts.map +1 -1
  5. package/dist/src/constants.js +4 -0
  6. package/dist/src/constants.js.map +1 -1
  7. package/dist/src/index.d.ts +7 -170
  8. package/dist/src/index.d.ts.map +1 -1
  9. package/dist/src/index.js +2 -12
  10. package/dist/src/index.js.map +1 -1
  11. package/dist/src/server/index.d.ts +45 -41
  12. package/dist/src/server/index.d.ts.map +1 -1
  13. package/dist/src/server/index.js +47 -30
  14. package/dist/src/server/index.js.map +1 -1
  15. package/dist/src/server/reservation-store.d.ts +36 -2
  16. package/dist/src/server/reservation-store.d.ts.map +1 -1
  17. package/dist/src/server/reservation-store.js.map +1 -1
  18. package/dist/src/transport/discovery.d.ts +17 -2
  19. package/dist/src/transport/discovery.d.ts.map +1 -1
  20. package/dist/src/transport/discovery.js +2 -2
  21. package/dist/src/transport/discovery.js.map +1 -1
  22. package/dist/src/transport/index.d.ts +42 -34
  23. package/dist/src/transport/index.d.ts.map +1 -1
  24. package/dist/src/transport/index.js +5 -291
  25. package/dist/src/transport/index.js.map +1 -1
  26. package/dist/src/transport/reservation-store.d.ts +37 -3
  27. package/dist/src/transport/reservation-store.d.ts.map +1 -1
  28. package/dist/src/transport/reservation-store.js +6 -4
  29. package/dist/src/transport/reservation-store.js.map +1 -1
  30. package/dist/src/transport/transport.d.ts +54 -0
  31. package/dist/src/transport/transport.d.ts.map +1 -0
  32. package/dist/src/transport/transport.js +314 -0
  33. package/dist/src/transport/transport.js.map +1 -0
  34. package/dist/src/utils.d.ts.map +1 -1
  35. package/dist/src/utils.js +59 -36
  36. package/dist/src/utils.js.map +1 -1
  37. package/package.json +24 -19
  38. package/src/constants.ts +5 -0
  39. package/src/index.ts +8 -207
  40. package/src/server/index.ts +100 -35
  41. package/src/server/reservation-store.ts +42 -2
  42. package/src/transport/discovery.ts +22 -4
  43. package/src/transport/index.ts +46 -338
  44. package/src/transport/reservation-store.ts +46 -8
  45. package/src/transport/transport.ts +380 -0
  46. package/src/utils.ts +66 -37
  47. package/dist/src/transport/stream-to-conn.d.ts +0 -19
  48. package/dist/src/transport/stream-to-conn.d.ts.map +0 -1
  49. package/dist/src/transport/stream-to-conn.js +0 -60
  50. package/dist/src/transport/stream-to-conn.js.map +0 -1
  51. package/src/transport/stream-to-conn.ts +0 -91
@@ -1,3 +1,7 @@
1
+ /**
2
+ * Multicodec code
3
+ */
4
+ export declare const CIRCUIT_PROTO_CODE = 290;
1
5
  /**
2
6
  * The maximum number of relay reservations the relay server will accept
3
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,kCAAkC,KAAK,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,2BAA2B,QAAkB,CAAA;AAE1D;;GAEG;AACH,eAAO,MAAM,+BAA+B,IAAI,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,sCAAsC,OAAO,CAAA;AAE1D;;GAEG;AACH,eAAO,MAAM,oCAAoC,MAAM,CAAA;AAEvD,eAAO,MAAM,gBAAgB,yBAAyB,CAAA;AAEtD,eAAO,MAAM,cAAc,6BAAgC,CAAA;AAC3D,eAAO,MAAM,qBAAqB,oCAAuC,CAAA;AAMzE,eAAO,MAAM,sBAAsB,QAAa,CAAA;AAGhD,eAAO,MAAM,kBAAkB,QAAkB,CAAA;AAEjD;;GAEG;AACH,eAAO,MAAM,kBAAkB,oCAAoC,CAAA;AAEnE;;GAEG;AACH,eAAO,MAAM,mBAAmB,qCAAqC,CAAA;AAErE;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAc,CAAA;AAE9C;;GAEG;AACH,eAAO,MAAM,yBAAyB,QAAc,CAAA;AAEpD,eAAO,MAAM,eAAe,MAAM,CAAA;AAElC,eAAO,MAAM,6BAA6B,OAAO,CAAA;AACjD,eAAO,MAAM,mCAAmC,QAAQ,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAA;AAErC;;GAEG;AACH,eAAO,MAAM,kCAAkC,KAAK,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,2BAA2B,QAAkB,CAAA;AAE1D;;GAEG;AACH,eAAO,MAAM,+BAA+B,IAAI,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,sCAAsC,OAAO,CAAA;AAE1D;;GAEG;AACH,eAAO,MAAM,oCAAoC,MAAM,CAAA;AAEvD,eAAO,MAAM,gBAAgB,yBAAyB,CAAA;AAEtD,eAAO,MAAM,cAAc,6BAAgC,CAAA;AAC3D,eAAO,MAAM,qBAAqB,oCAAuC,CAAA;AAMzE,eAAO,MAAM,sBAAsB,QAAa,CAAA;AAGhD,eAAO,MAAM,kBAAkB,QAAkB,CAAA;AAEjD;;GAEG;AACH,eAAO,MAAM,kBAAkB,oCAAoC,CAAA;AAEnE;;GAEG;AACH,eAAO,MAAM,mBAAmB,qCAAqC,CAAA;AAErE;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAc,CAAA;AAE9C;;GAEG;AACH,eAAO,MAAM,yBAAyB,QAAc,CAAA;AAEpD,eAAO,MAAM,eAAe,MAAM,CAAA;AAElC,eAAO,MAAM,6BAA6B,OAAO,CAAA;AACjD,eAAO,MAAM,mCAAmC,QAAQ,CAAA"}
@@ -1,6 +1,10 @@
1
1
  import { KEEP_ALIVE } from '@libp2p/interface';
2
2
  const second = 1000;
3
3
  const minute = 60 * second;
4
+ /**
5
+ * Multicodec code
6
+ */
7
+ export const CIRCUIT_PROTO_CODE = 290;
4
8
  /**
5
9
  * The maximum number of relay reservations the relay server will accept
6
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,MAAM,MAAM,GAAG,IAAI,CAAA;AACnB,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,CAAA;AAE1B;;GAEG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,EAAE,CAAA;AAEpD;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,GAAG,EAAE,GAAG,MAAM,CAAA;AAE1D;;GAEG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAA;AAEhD;;GAEG;AACH,MAAM,CAAC,MAAM,sCAAsC,GAAG,IAAI,CAAA;AAE1D;;GAEG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,GAAG,CAAA;AAEvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,CAAA;AAEtD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,UAAU,gBAAgB,CAAA;AAC3D,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,UAAU,uBAAuB,CAAA;AAEzE,+BAA+B;AAC/B,oGAAoG;AAEpG,2CAA2C;AAC3C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAG,MAAM,CAAA;AAEhD,iCAAiC;AACjC,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAEjD;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,iCAAiC,CAAA;AAEnE;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,kCAAkC,CAAA;AAErE;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,MAAM,CAAA;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,GAAG,MAAM,CAAA;AAEpD,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAA;AAElC,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,CAAA;AACjD,MAAM,CAAC,MAAM,mCAAmC,GAAG,KAAK,CAAA"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,MAAM,MAAM,GAAG,IAAI,CAAA;AACnB,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,CAAA;AAE1B;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAA;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,EAAE,CAAA;AAEpD;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,GAAG,EAAE,GAAG,MAAM,CAAA;AAE1D;;GAEG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAA;AAEhD;;GAEG;AACH,MAAM,CAAC,MAAM,sCAAsC,GAAG,IAAI,CAAA;AAE1D;;GAEG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,GAAG,CAAA;AAEvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,CAAA;AAEtD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,UAAU,gBAAgB,CAAA;AAC3D,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,UAAU,uBAAuB,CAAA;AAEzE,+BAA+B;AAC/B,oGAAoG;AAEpG,2CAA2C;AAC3C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAG,MAAM,CAAA;AAEhD,iCAAiC;AACjC,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAEjD;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,iCAAiC,CAAA;AAEnE;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,kCAAkC,CAAA;AAErE;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,MAAM,CAAA;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,GAAG,MAAM,CAAA;AAEpD,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAA;AAElC,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,CAAA;AACjD,MAAM,CAAC,MAAM,mCAAmC,GAAG,KAAK,CAAA"}
@@ -40,8 +40,6 @@
40
40
  */
41
41
  import { TypedEventEmitter } from 'main-event';
42
42
  import type { Limit } from './pb/index.js';
43
- import type { ComponentLogger, ConnectionGater, Libp2pEvents, Metrics, PeerId, PeerStore, PrivateKey, TopologyFilter, Transport, TypedEventTarget, Upgrader } from '@libp2p/interface';
44
- import type { AddressManager, ConnectionManager, RandomWalk, Registrar, TransportManager } from '@libp2p/interface-internal';
45
43
  import type { PeerMap } from '@libp2p/peer-collections';
46
44
  import type { Multiaddr } from '@multiformats/multiaddr';
47
45
  import type { RetimeableAbortSignal } from 'retimeable-signal';
@@ -73,173 +71,12 @@ export interface CircuitRelayServiceEvents {
73
71
  export interface CircuitRelayService extends TypedEventEmitter<CircuitRelayServiceEvents> {
74
72
  reservations: PeerMap<RelayReservation>;
75
73
  }
74
+ export { circuitRelayServer } from './server/index.js';
75
+ export type { CircuitRelayServerInit, CircuitRelayServerComponents } from './server/index.js';
76
+ export type { ReservationStoreInit as ServerReservationStoreInit } from './server/reservation-store.js';
77
+ export { circuitRelayTransport } from './transport/index.js';
78
+ export type { RelayDiscoveryComponents } from './transport/discovery.js';
79
+ export type { ReservationStoreInit as TransportReservationStoreInit } from './transport/reservation-store.js';
80
+ export type { CircuitRelayTransportInit, CircuitRelayTransportComponents } from './transport/index.js';
76
81
  export { RELAY_V2_HOP_CODEC, RELAY_V2_STOP_CODEC } from './constants.js';
77
- export interface ServerReservationStoreInit {
78
- /**
79
- * maximum number of reservations allowed
80
- *
81
- * @default 15
82
- */
83
- maxReservations?: number;
84
- /**
85
- * interval after which stale reservations are cleared
86
- *
87
- * @default 300000
88
- */
89
- reservationClearInterval?: number;
90
- /**
91
- * apply default relay limits to a new reservation
92
- *
93
- * @default true
94
- */
95
- applyDefaultLimit?: boolean;
96
- /**
97
- * reservation ttl
98
- *
99
- * @default 7200000
100
- */
101
- reservationTtl?: number;
102
- /**
103
- * The maximum time a relayed connection can be open for
104
- */
105
- defaultDurationLimit?: number;
106
- /**
107
- * The maximum amount of data allowed to be transferred over a relayed connection
108
- */
109
- defaultDataLimit?: bigint;
110
- }
111
- export interface CircuitRelayServerComponents {
112
- registrar: Registrar;
113
- peerStore: PeerStore;
114
- addressManager: AddressManager;
115
- peerId: PeerId;
116
- privateKey: PrivateKey;
117
- connectionManager: ConnectionManager;
118
- connectionGater: ConnectionGater;
119
- logger: ComponentLogger;
120
- metrics?: Metrics;
121
- }
122
- export interface CircuitRelayServerInit {
123
- /**
124
- * Incoming hop requests must complete within this time in ms otherwise
125
- * the stream will be reset
126
- *
127
- * @default 30000
128
- */
129
- hopTimeout?: number;
130
- /**
131
- * Configuration of reservations
132
- */
133
- reservations?: ServerReservationStoreInit;
134
- /**
135
- * The maximum number of simultaneous HOP inbound streams that can be open at once
136
- */
137
- maxInboundHopStreams?: number;
138
- /**
139
- * The maximum number of simultaneous HOP outbound streams that can be open at once
140
- */
141
- maxOutboundHopStreams?: number;
142
- /**
143
- * The maximum number of simultaneous STOP outbound streams that can be open at
144
- * once.
145
- *
146
- * @default 300
147
- */
148
- maxOutboundStopStreams?: number;
149
- }
150
- export declare function circuitRelayServer(init?: CircuitRelayServerInit): (components: CircuitRelayServerComponents) => CircuitRelayService;
151
- export interface RelayDiscoveryEvents {
152
- 'relay:discover': CustomEvent<PeerId>;
153
- }
154
- export interface TransportReservationStoreComponents {
155
- peerId: PeerId;
156
- connectionManager: ConnectionManager;
157
- peerStore: PeerStore;
158
- events: TypedEventTarget<Libp2pEvents>;
159
- logger: ComponentLogger;
160
- metrics?: Metrics;
161
- }
162
- export interface TransportReservationStoreInit {
163
- /**
164
- * Multiple relays may be discovered simultaneously - to prevent listening
165
- * on too many relays, this value controls how many to attempt to reserve a
166
- * slot on at once. If set to more than one, we may end up listening on
167
- * more relays than the `maxReservations` value, but on networks with poor
168
- * connectivity the user may wish to attempt to reserve on multiple relays
169
- * simultaneously.
170
- *
171
- * @default 1
172
- */
173
- reservationConcurrency?: number;
174
- /**
175
- * Limit the number of potential relays we will dial
176
- *
177
- * @default 100
178
- */
179
- maxReservationQueueLength?: number;
180
- /**
181
- * When creating a reservation it must complete within this number of ms
182
- *
183
- * @default 5000
184
- */
185
- reservationCompletionTimeout?: number;
186
- }
187
- export interface RelayDiscoveryComponents {
188
- peerStore: PeerStore;
189
- connectionManager: ConnectionManager;
190
- transportManager: TransportManager;
191
- registrar: Registrar;
192
- logger: ComponentLogger;
193
- randomWalk: RandomWalk;
194
- events: TypedEventTarget<Libp2pEvents>;
195
- }
196
- export interface RelayDiscoveryInit {
197
- filter?: TopologyFilter;
198
- }
199
- export interface CircuitRelayTransportComponents extends RelayDiscoveryComponents {
200
- peerId: PeerId;
201
- upgrader: Upgrader;
202
- addressManager: AddressManager;
203
- connectionGater: ConnectionGater;
204
- }
205
- /**
206
- * RelayConfig configures the circuit v2 relay transport.
207
- */
208
- export interface CircuitRelayTransportInit extends TransportReservationStoreInit {
209
- /**
210
- * An optional filter used to prevent duplicate attempts to reserve relay
211
- * slots on the same peer
212
- */
213
- discoveryFilter?: TopologyFilter;
214
- /**
215
- * The maximum number of simultaneous STOP inbound streams that can be open at
216
- * once - each inbound relayed connection uses a STOP stream
217
- *
218
- * @default 300
219
- */
220
- maxInboundStopStreams?: number;
221
- /**
222
- * The maximum number of simultaneous STOP outbound streams that can be open
223
- * at once. If this transport is used along with the relay server these
224
- * settings should be set to the same value
225
- *
226
- * @default 300
227
- */
228
- maxOutboundStopStreams?: number;
229
- /**
230
- * Incoming STOP requests (e.g. when a remote peer wants to dial us via a
231
- * relay) must finish the initial protocol negotiation within this timeout in
232
- * ms
233
- *
234
- * @deprecated Configure `connectionManager.inboundUpgradeTimeout` instead
235
- */
236
- stopTimeout?: number;
237
- /**
238
- * When creating a reservation it must complete within this number of ms
239
- *
240
- * @default 10_000
241
- */
242
- reservationCompletionTimeout?: number;
243
- }
244
- export declare function circuitRelayTransport(init?: CircuitRelayTransportInit): (components: CircuitRelayTransportComponents) => Transport;
245
82
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAG9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACtL,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC5H,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAE9D,YAAY,EAAE,KAAK,EAAE,CAAA;AAErB,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,MAAM,EAAE,IAAI,CAAA;IAEZ;;OAEG;IACH,IAAI,EAAE,SAAS,CAAA;IAEf;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAA;IAEb;;OAEG;IACH,MAAM,EAAE,qBAAqB,CAAA;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACxC,mBAAmB,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAA;IAClD,sBAAsB,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;IAC5C,oBAAoB,EAAE,WAAW,CAAC,KAAK,CAAC,CAAA;CACzC;AAED,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB,CAAC,yBAAyB,CAAC;IACvF,YAAY,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;CACxC;AAED,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,gBAAgB,CAAA;AAEvB,MAAM,WAAW,0BAA0B;IACzC;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAA;IAEjC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAE3B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IAEvB;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAE7B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,SAAS,CAAA;IACpB,SAAS,EAAE,SAAS,CAAA;IACpB,cAAc,EAAE,cAAc,CAAA;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;IACtB,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,eAAe,EAAE,eAAe,CAAA;IAChC,MAAM,EAAE,eAAe,CAAA;IACvB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;OAEG;IACH,YAAY,CAAC,EAAE,0BAA0B,CAAA;IAEzC;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAE7B;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAE9B;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC;AAED,wBAAgB,kBAAkB,CAAE,IAAI,GAAE,sBAA2B,GAAG,CAAC,UAAU,EAAE,4BAA4B,KAAK,mBAAmB,CAIxI;AAED,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CACtC;AAED,MAAM,WAAW,mCAAmC;IAClD,MAAM,EAAE,MAAM,CAAA;IACd,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAA;IACtC,MAAM,EAAE,eAAe,CAAA;IACvB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,6BAA6B;IAC5C;;;;;;;;;OASG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAE/B;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAElC;;;;OAIG;IACH,4BAA4B,CAAC,EAAE,MAAM,CAAA;CACtC;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,SAAS,CAAA;IACpB,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,eAAe,CAAA;IACvB,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,cAAc,CAAA;CACxB;AAED,MAAM,WAAW,+BAAgC,SAAQ,wBAAwB;IAC/E,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,QAAQ,CAAA;IAClB,cAAc,EAAE,cAAc,CAAA;IAC9B,eAAe,EAAE,eAAe,CAAA;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,6BAA6B;IAC9E;;;OAGG;IACH,eAAe,CAAC,EAAE,cAAc,CAAA;IAEhC;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAE9B;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAE/B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;;;OAIG;IACH,4BAA4B,CAAC,EAAE,MAAM,CAAA;CACtC;AAED,wBAAgB,qBAAqB,CAAE,IAAI,GAAE,yBAA8B,GAAG,CAAC,UAAU,EAAE,+BAA+B,KAAK,SAAS,CAIvI"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAE9D,YAAY,EAAE,KAAK,EAAE,CAAA;AAErB,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,MAAM,EAAE,IAAI,CAAA;IAEZ;;OAEG;IACH,IAAI,EAAE,SAAS,CAAA;IAEf;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAA;IAEb;;OAEG;IACH,MAAM,EAAE,qBAAqB,CAAA;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACxC,mBAAmB,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAA;IAClD,sBAAsB,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;IAC5C,oBAAoB,EAAE,WAAW,CAAC,KAAK,CAAC,CAAA;CACzC;AAED,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB,CAAC,yBAAyB,CAAC;IACvF,YAAY,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;CACxC;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,YAAY,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AAC7F,YAAY,EAAE,oBAAoB,IAAI,0BAA0B,EAAE,MAAM,+BAA+B,CAAA;AACvG,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AACxE,YAAY,EAAE,oBAAoB,IAAI,6BAA6B,EAAE,MAAM,kCAAkC,CAAA;AAC7G,YAAY,EAAE,yBAAyB,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAA;AAEtG,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,gBAAgB,CAAA"}
package/dist/src/index.js CHANGED
@@ -39,17 +39,7 @@
39
39
  * ```
40
40
  */
41
41
  import { TypedEventEmitter } from 'main-event';
42
- import { CircuitRelayServer } from './server/index.js';
43
- import { CircuitRelayTransport } from "./transport/index.js";
42
+ export { circuitRelayServer } from './server/index.js';
43
+ export { circuitRelayTransport } from './transport/index.js';
44
44
  export { RELAY_V2_HOP_CODEC, RELAY_V2_STOP_CODEC } from './constants.js';
45
- export function circuitRelayServer(init = {}) {
46
- return (components) => {
47
- return new CircuitRelayServer(components, init);
48
- };
49
- }
50
- export function circuitRelayTransport(init = {}) {
51
- return (components) => {
52
- return new CircuitRelayTransport(components, init);
53
- };
54
- }
55
45
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AA2C5D,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,gBAAgB,CAAA;AAuFvB,MAAM,UAAU,kBAAkB,CAAE,OAA+B,EAAE;IACnE,OAAO,CAAC,UAAU,EAAE,EAAE;QACpB,OAAO,IAAI,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IACjD,CAAC,CAAA;AACH,CAAC;AA4GD,MAAM,UAAU,qBAAqB,CAAE,OAAkC,EAAE;IACzE,OAAO,CAAC,UAAU,EAAE,EAAE;QACpB,OAAO,IAAI,qBAAqB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IACpD,CAAC,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAyC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAGtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAK5D,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,gBAAgB,CAAA"}
@@ -1,10 +1,37 @@
1
- import { TypedEventEmitter } from 'main-event';
2
1
  import { HopMessage, StopMessage } from '../pb/index.js';
3
- import type { CircuitRelayServerComponents, CircuitRelayServerInit, CircuitRelayService, RelayReservation } from '../index.js';
4
- import type { Reservation } from '../pb/index.js';
5
- import type { Connection, Stream, PeerId, Startable, AbortOptions } from '@libp2p/interface';
6
- import type { PeerMap } from '@libp2p/peer-collections';
7
- import type { ProtobufStream } from '@libp2p/utils';
2
+ import type { ReservationStoreInit } from './reservation-store.js';
3
+ import type { CircuitRelayService, RelayReservation } from '../index.js';
4
+ import type { ComponentLogger, Connection, Stream, ConnectionGater, PeerId, PeerStore, PrivateKey, Metrics } from '@libp2p/interface';
5
+ import type { AddressManager, ConnectionManager, Registrar } from '@libp2p/interface-internal';
6
+ import type { ProtobufStream } from 'it-protobuf-stream';
7
+ export interface CircuitRelayServerInit {
8
+ /**
9
+ * Incoming hop requests must complete within this time in ms otherwise
10
+ * the stream will be reset
11
+ *
12
+ * @default 30000
13
+ */
14
+ hopTimeout?: number;
15
+ /**
16
+ * Configuration of reservations
17
+ */
18
+ reservations?: ReservationStoreInit;
19
+ /**
20
+ * The maximum number of simultaneous HOP inbound streams that can be open at once
21
+ */
22
+ maxInboundHopStreams?: number;
23
+ /**
24
+ * The maximum number of simultaneous HOP outbound streams that can be open at once
25
+ */
26
+ maxOutboundHopStreams?: number;
27
+ /**
28
+ * The maximum number of simultaneous STOP outbound streams that can be open at
29
+ * once.
30
+ *
31
+ * @default 300
32
+ */
33
+ maxOutboundStopStreams?: number;
34
+ }
8
35
  export interface HopProtocolOptions {
9
36
  connection: Connection;
10
37
  request: HopMessage;
@@ -14,44 +41,21 @@ export interface StopOptions {
14
41
  connection: Connection;
15
42
  request: StopMessage;
16
43
  }
44
+ export interface CircuitRelayServerComponents {
45
+ registrar: Registrar;
46
+ peerStore: PeerStore;
47
+ addressManager: AddressManager;
48
+ peerId: PeerId;
49
+ privateKey: PrivateKey;
50
+ connectionManager: ConnectionManager;
51
+ connectionGater: ConnectionGater;
52
+ logger: ComponentLogger;
53
+ metrics?: Metrics;
54
+ }
17
55
  export interface RelayServerEvents {
18
56
  'relay:reservation': CustomEvent<RelayReservation>;
19
57
  'relay:advert:success': CustomEvent<unknown>;
20
58
  'relay:advert:error': CustomEvent<Error>;
21
59
  }
22
- export declare class CircuitRelayServer extends TypedEventEmitter<RelayServerEvents> implements Startable, CircuitRelayService {
23
- private readonly components;
24
- private readonly reservationStore;
25
- private started;
26
- private readonly hopTimeout;
27
- private readonly shutdownController;
28
- private readonly maxInboundHopStreams?;
29
- private readonly maxOutboundHopStreams?;
30
- private readonly maxOutboundStopStreams;
31
- private readonly log;
32
- /**
33
- * Creates an instance of Relay
34
- */
35
- constructor(components: CircuitRelayServerComponents, init?: CircuitRelayServerInit);
36
- readonly [Symbol.toStringTag] = "@libp2p/circuit-relay-v2-server";
37
- isStarted(): boolean;
38
- /**
39
- * Start Relay service
40
- */
41
- start(): Promise<void>;
42
- /**
43
- * Stop Relay service
44
- */
45
- stop(): Promise<void>;
46
- onHop(stream: Stream, connection: Connection): Promise<void>;
47
- handleHopProtocol({ stream, request, connection }: HopProtocolOptions, options: AbortOptions): Promise<void>;
48
- handleReserve({ stream, connection }: HopProtocolOptions, options: AbortOptions): Promise<void>;
49
- makeReservation(remotePeer: PeerId, expire: bigint): Promise<Reservation>;
50
- handleConnect({ stream, request, connection }: HopProtocolOptions, options: AbortOptions): Promise<void>;
51
- /**
52
- * Send a STOP request to the target peer that the dialing peer wants to contact
53
- */
54
- stopHop({ connection, request }: StopOptions, options: AbortOptions): Promise<Stream | undefined>;
55
- get reservations(): PeerMap<RelayReservation>;
56
- }
60
+ export declare function circuitRelayServer(init?: CircuitRelayServerInit): (components: CircuitRelayServerComponents) => CircuitRelayService;
57
61
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,UAAU,EAAU,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAIhE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAExE,OAAO,KAAK,EAAE,eAAe,EAAU,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAa,UAAU,EAAE,OAAO,EAAoC,MAAM,mBAAmB,CAAA;AAC1L,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAG9F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAIxD,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;OAEG;IACH,YAAY,CAAC,EAAE,oBAAoB,CAAA;IAEnC;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAE7B;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAE9B;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,UAAU,CAAA;IACnB,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,SAAS,CAAA;IACpB,SAAS,EAAE,SAAS,CAAA;IACpB,cAAc,EAAE,cAAc,CAAA;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;IACtB,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,eAAe,EAAE,eAAe,CAAA;IAChC,MAAM,EAAE,eAAe,CAAA;IACvB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAA;IAClD,sBAAsB,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;IAC5C,oBAAoB,EAAE,WAAW,CAAC,KAAK,CAAC,CAAA;CACzC;AA+VD,wBAAgB,kBAAkB,CAAE,IAAI,GAAE,sBAA2B,GAAG,CAAC,UAAU,EAAE,4BAA4B,KAAK,mBAAmB,CAIxI"}
@@ -1,21 +1,27 @@
1
1
  import { publicKeyToProtobuf } from '@libp2p/crypto/keys';
2
2
  import { peerIdFromMultihash } from '@libp2p/peer-id';
3
3
  import { RecordEnvelope } from '@libp2p/peer-record';
4
- import { pbStream } from '@libp2p/utils';
5
4
  import { multiaddr } from '@multiformats/multiaddr';
6
- import { Circuit } from '@multiformats/multiaddr-matcher';
5
+ import { pbStream } from 'it-protobuf-stream';
7
6
  import { TypedEventEmitter, setMaxListeners } from 'main-event';
8
7
  import * as Digest from 'multiformats/hashes/digest';
9
- import { DEFAULT_HOP_TIMEOUT, KEEP_ALIVE_SOURCE_TAG, MAX_CONNECTIONS, RELAY_SOURCE_TAG, RELAY_V2_HOP_CODEC, RELAY_V2_STOP_CODEC } from '../constants.js';
8
+ import { CIRCUIT_PROTO_CODE, DEFAULT_HOP_TIMEOUT, KEEP_ALIVE_SOURCE_TAG, MAX_CONNECTIONS, RELAY_SOURCE_TAG, RELAY_V2_HOP_CODEC, RELAY_V2_STOP_CODEC } from '../constants.js';
10
9
  import { HopMessage, Status, StopMessage } from '../pb/index.js';
11
10
  import { createLimitedRelay } from '../utils.js';
12
11
  import { ReservationStore } from './reservation-store.js';
13
12
  import { ReservationVoucherRecord } from './reservation-voucher.js';
13
+ const isRelayAddr = (ma) => ma.protoCodes().includes(CIRCUIT_PROTO_CODE);
14
14
  const defaults = {
15
15
  maxOutboundStopStreams: MAX_CONNECTIONS
16
16
  };
17
- export class CircuitRelayServer extends TypedEventEmitter {
18
- components;
17
+ class CircuitRelayServer extends TypedEventEmitter {
18
+ registrar;
19
+ peerStore;
20
+ addressManager;
21
+ peerId;
22
+ privateKey;
23
+ connectionManager;
24
+ connectionGater;
19
25
  reservationStore;
20
26
  started;
21
27
  hopTimeout;
@@ -30,7 +36,13 @@ export class CircuitRelayServer extends TypedEventEmitter {
30
36
  constructor(components, init = {}) {
31
37
  super();
32
38
  this.log = components.logger.forComponent('libp2p:circuit-relay:server');
33
- this.components = components;
39
+ this.registrar = components.registrar;
40
+ this.peerStore = components.peerStore;
41
+ this.addressManager = components.addressManager;
42
+ this.peerId = components.peerId;
43
+ this.privateKey = components.privateKey;
44
+ this.connectionManager = components.connectionManager;
45
+ this.connectionGater = components.connectionGater;
34
46
  this.started = false;
35
47
  this.hopTimeout = init?.hopTimeout ?? DEFAULT_HOP_TIMEOUT;
36
48
  this.maxInboundHopStreams = init.maxInboundHopStreams;
@@ -39,7 +51,6 @@ export class CircuitRelayServer extends TypedEventEmitter {
39
51
  this.reservationStore = new ReservationStore(components, init.reservations);
40
52
  this.shutdownController = new AbortController();
41
53
  setMaxListeners(Infinity, this.shutdownController.signal);
42
- this.onHop = this.onHop.bind(this);
43
54
  }
44
55
  [Symbol.toStringTag] = '@libp2p/circuit-relay-v2-server';
45
56
  isStarted() {
@@ -52,7 +63,11 @@ export class CircuitRelayServer extends TypedEventEmitter {
52
63
  if (this.started) {
53
64
  return;
54
65
  }
55
- await this.components.registrar.handle(RELAY_V2_HOP_CODEC, this.onHop, {
66
+ await this.registrar.handle(RELAY_V2_HOP_CODEC, (data) => {
67
+ void this.onHop(data).catch(err => {
68
+ this.log.error(err);
69
+ });
70
+ }, {
56
71
  maxInboundStreams: this.maxInboundHopStreams,
57
72
  maxOutboundStreams: this.maxOutboundHopStreams,
58
73
  runOnLimitedConnection: true
@@ -65,15 +80,13 @@ export class CircuitRelayServer extends TypedEventEmitter {
65
80
  async stop() {
66
81
  this.reservationStore.clear();
67
82
  this.shutdownController.abort();
68
- await this.components.registrar.unhandle(RELAY_V2_HOP_CODEC);
83
+ await this.registrar.unhandle(RELAY_V2_HOP_CODEC);
69
84
  this.started = false;
70
85
  }
71
- async onHop(stream, connection) {
86
+ async onHop({ connection, stream }) {
72
87
  this.log('received circuit v2 hop protocol stream from %p', connection.remotePeer);
73
- const signal = AbortSignal.timeout(this.hopTimeout);
74
- setMaxListeners(Infinity, signal);
75
88
  const options = {
76
- signal
89
+ signal: AbortSignal.timeout(this.hopTimeout)
77
90
  };
78
91
  const pbstr = pbStream(stream);
79
92
  try {
@@ -115,12 +128,12 @@ export class CircuitRelayServer extends TypedEventEmitter {
115
128
  async handleReserve({ stream, connection }, options) {
116
129
  const hopstr = stream.pb(HopMessage);
117
130
  this.log('hop reserve request from %p', connection.remotePeer);
118
- if (Circuit.exactMatch(connection.remoteAddr)) {
131
+ if (isRelayAddr(connection.remoteAddr)) {
119
132
  this.log.error('relay reservation over circuit connection denied for peer: %p', connection.remotePeer);
120
133
  await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED }, options);
121
134
  return;
122
135
  }
123
- if ((await this.components.connectionGater.denyInboundRelayReservation?.(connection.remotePeer)) === true) {
136
+ if ((await this.connectionGater.denyInboundRelayReservation?.(connection.remotePeer)) === true) {
124
137
  this.log.error('reservation for %p denied by connection gater', connection.remotePeer);
125
138
  await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED }, options);
126
139
  return;
@@ -135,12 +148,12 @@ export class CircuitRelayServer extends TypedEventEmitter {
135
148
  // result.expire is non-null if `ReservationStore.reserve` returns with status == OK
136
149
  if (result.expire != null) {
137
150
  const ttl = (result.expire * 1000) - Date.now();
138
- await this.components.peerStore.merge(connection.remotePeer, {
151
+ await this.peerStore.merge(connection.remotePeer, {
139
152
  tags: {
140
153
  [RELAY_SOURCE_TAG]: { value: 1, ttl },
141
154
  [KEEP_ALIVE_SOURCE_TAG]: { value: 1, ttl }
142
155
  }
143
- }, options);
156
+ });
144
157
  }
145
158
  await hopstr.write({
146
159
  type: HopMessage.Type.STATUS,
@@ -149,19 +162,17 @@ export class CircuitRelayServer extends TypedEventEmitter {
149
162
  limit: this.reservationStore.get(connection.remotePeer)?.limit
150
163
  }, options);
151
164
  this.log('sent confirmation response to %s', connection.remotePeer);
152
- // close writable end of stream
153
- await hopstr.unwrap().unwrap().close(options);
154
165
  }
155
166
  catch (err) {
156
167
  this.log.error('failed to send confirmation response to %p - %e', connection.remotePeer, err);
157
168
  this.reservationStore.removeReservation(connection.remotePeer);
158
169
  try {
159
- await this.components.peerStore.merge(connection.remotePeer, {
170
+ await this.peerStore.merge(connection.remotePeer, {
160
171
  tags: {
161
172
  [RELAY_SOURCE_TAG]: undefined,
162
173
  [KEEP_ALIVE_SOURCE_TAG]: undefined
163
174
  }
164
- }, options);
175
+ });
165
176
  }
166
177
  catch (err) {
167
178
  this.log.error('failed to untag relay source peer %p - %e', connection.remotePeer, err);
@@ -170,7 +181,7 @@ export class CircuitRelayServer extends TypedEventEmitter {
170
181
  }
171
182
  async makeReservation(remotePeer, expire) {
172
183
  const addrs = [];
173
- for (const relayAddr of this.components.addressManager.getAddresses()) {
184
+ for (const relayAddr of this.addressManager.getAddresses()) {
174
185
  if (relayAddr.toString().includes('/p2p-circuit')) {
175
186
  continue;
176
187
  }
@@ -178,9 +189,9 @@ export class CircuitRelayServer extends TypedEventEmitter {
178
189
  }
179
190
  const envelope = await RecordEnvelope.seal(new ReservationVoucherRecord({
180
191
  peer: remotePeer,
181
- relay: this.components.peerId,
192
+ relay: this.peerId,
182
193
  expiration: expire
183
- }), this.components.privateKey);
194
+ }), this.privateKey);
184
195
  return {
185
196
  addrs,
186
197
  expire,
@@ -189,7 +200,7 @@ export class CircuitRelayServer extends TypedEventEmitter {
189
200
  payloadType: envelope.payloadType,
190
201
  payload: {
191
202
  peer: remotePeer.toMultihash().bytes,
192
- relay: this.components.peerId.toMultihash().bytes,
203
+ relay: this.peerId.toMultihash().bytes,
193
204
  expiration: expire
194
205
  },
195
206
  signature: envelope.signature
@@ -198,7 +209,7 @@ export class CircuitRelayServer extends TypedEventEmitter {
198
209
  }
199
210
  async handleConnect({ stream, request, connection }, options) {
200
211
  const hopstr = stream.pb(HopMessage);
201
- if (Circuit.matches(connection.remoteAddr)) {
212
+ if (isRelayAddr(connection.remoteAddr)) {
202
213
  this.log.error('relay reservation over circuit connection denied for peer: %p', connection.remotePeer);
203
214
  await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED }, options);
204
215
  return;
@@ -224,12 +235,12 @@ export class CircuitRelayServer extends TypedEventEmitter {
224
235
  await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.NO_RESERVATION }, options);
225
236
  return;
226
237
  }
227
- if ((await this.components.connectionGater.denyOutboundRelayedConnection?.(connection.remotePeer, dstPeer)) === true) {
238
+ if ((await this.connectionGater.denyOutboundRelayedConnection?.(connection.remotePeer, dstPeer)) === true) {
228
239
  this.log.error('hop connect for %p to %p denied by connection gater', connection.remotePeer, dstPeer);
229
240
  await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED }, options);
230
241
  return;
231
242
  }
232
- const connections = this.components.connectionManager.getConnections(dstPeer);
243
+ const connections = this.connectionManager.getConnections(dstPeer);
233
244
  if (connections.length === 0) {
234
245
  this.log('hop connect denied for destination peer %p not having a connection for %p as there is no destination connection', dstPeer, connection.remotePeer);
235
246
  await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.NO_RESERVATION }, options);
@@ -257,9 +268,10 @@ export class CircuitRelayServer extends TypedEventEmitter {
257
268
  status: Status.OK,
258
269
  limit: reservation?.limit
259
270
  }, options);
271
+ const sourceStream = stream.unwrap();
260
272
  this.log('connection from %p to %p established - merging streams', connection.remotePeer, dstPeer);
261
273
  // Short circuit the two streams to create the relayed connection
262
- createLimitedRelay(stream.unwrap(), destinationStream, this.shutdownController.signal, reservation, {
274
+ createLimitedRelay(sourceStream, destinationStream, this.shutdownController.signal, reservation, {
263
275
  log: this.log
264
276
  });
265
277
  }
@@ -268,7 +280,7 @@ export class CircuitRelayServer extends TypedEventEmitter {
268
280
  */
269
281
  async stopHop({ connection, request }, options) {
270
282
  this.log('starting circuit relay v2 stop request to %s', connection.remotePeer);
271
- const stream = await connection.newStream(RELAY_V2_STOP_CODEC, {
283
+ const stream = await connection.newStream([RELAY_V2_STOP_CODEC], {
272
284
  maxOutboundStreams: this.maxOutboundStopStreams,
273
285
  runOnLimitedConnection: true,
274
286
  ...options
@@ -299,4 +311,9 @@ export class CircuitRelayServer extends TypedEventEmitter {
299
311
  return this.reservationStore.reservations;
300
312
  }
301
313
  }
314
+ export function circuitRelayServer(init = {}) {
315
+ return (components) => {
316
+ return new CircuitRelayServer(components, init);
317
+ };
318
+ }
302
319
  //# sourceMappingURL=index.js.map