@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.
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +4 -4
- package/dist/src/constants.d.ts +4 -0
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +4 -0
- package/dist/src/constants.js.map +1 -1
- package/dist/src/index.d.ts +7 -170
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -12
- package/dist/src/index.js.map +1 -1
- package/dist/src/server/index.d.ts +45 -41
- package/dist/src/server/index.d.ts.map +1 -1
- package/dist/src/server/index.js +47 -30
- package/dist/src/server/index.js.map +1 -1
- package/dist/src/server/reservation-store.d.ts +36 -2
- package/dist/src/server/reservation-store.d.ts.map +1 -1
- package/dist/src/server/reservation-store.js.map +1 -1
- package/dist/src/transport/discovery.d.ts +17 -2
- package/dist/src/transport/discovery.d.ts.map +1 -1
- package/dist/src/transport/discovery.js +2 -2
- package/dist/src/transport/discovery.js.map +1 -1
- package/dist/src/transport/index.d.ts +42 -34
- package/dist/src/transport/index.d.ts.map +1 -1
- package/dist/src/transport/index.js +5 -291
- package/dist/src/transport/index.js.map +1 -1
- package/dist/src/transport/reservation-store.d.ts +37 -3
- package/dist/src/transport/reservation-store.d.ts.map +1 -1
- package/dist/src/transport/reservation-store.js +6 -4
- package/dist/src/transport/reservation-store.js.map +1 -1
- package/dist/src/transport/transport.d.ts +54 -0
- package/dist/src/transport/transport.d.ts.map +1 -0
- package/dist/src/transport/transport.js +314 -0
- package/dist/src/transport/transport.js.map +1 -0
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +59 -36
- package/dist/src/utils.js.map +1 -1
- package/package.json +24 -19
- package/src/constants.ts +5 -0
- package/src/index.ts +8 -207
- package/src/server/index.ts +100 -35
- package/src/server/reservation-store.ts +42 -2
- package/src/transport/discovery.ts +22 -4
- package/src/transport/index.ts +46 -338
- package/src/transport/reservation-store.ts +46 -8
- package/src/transport/transport.ts +380 -0
- package/src/utils.ts +66 -37
- package/dist/src/transport/stream-to-conn.d.ts +0 -19
- package/dist/src/transport/stream-to-conn.d.ts.map +0 -1
- package/dist/src/transport/stream-to-conn.js +0 -60
- package/dist/src/transport/stream-to-conn.js.map +0 -1
- package/src/transport/stream-to-conn.ts +0 -91
package/dist/src/constants.d.ts
CHANGED
@@ -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"}
|
package/dist/src/constants.js
CHANGED
@@ -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"}
|
package/dist/src/index.d.ts
CHANGED
@@ -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
|
package/dist/src/index.d.ts.map
CHANGED
@@ -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;
|
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
|
-
|
43
|
-
|
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
|
package/dist/src/index.js.map
CHANGED
@@ -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;
|
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 {
|
4
|
-
import type {
|
5
|
-
import type { Connection, Stream, PeerId,
|
6
|
-
import type {
|
7
|
-
import type { ProtobufStream } from '
|
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
|
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":"
|
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"}
|
package/dist/src/server/index.js
CHANGED
@@ -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 {
|
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
|
-
|
18
|
-
|
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.
|
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.
|
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.
|
83
|
+
await this.registrar.unhandle(RELAY_V2_HOP_CODEC);
|
69
84
|
this.started = false;
|
70
85
|
}
|
71
|
-
async onHop(
|
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 (
|
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.
|
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.
|
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
|
-
}
|
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.
|
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
|
-
}
|
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.
|
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.
|
192
|
+
relay: this.peerId,
|
182
193
|
expiration: expire
|
183
|
-
}), this.
|
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.
|
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 (
|
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.
|
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.
|
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(
|
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
|