@libp2p/circuit-relay-v2 2.1.5-e6b4158c6 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/index.min.js +4 -4
- package/dist/src/constants.d.ts +0 -1
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +0 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/errors.d.ts +22 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +22 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/transport/discovery.d.ts +1 -0
- package/dist/src/transport/discovery.d.ts.map +1 -1
- package/dist/src/transport/discovery.js +38 -8
- package/dist/src/transport/discovery.js.map +1 -1
- package/dist/src/transport/index.d.ts +0 -6
- package/dist/src/transport/index.d.ts.map +1 -1
- package/dist/src/transport/index.js.map +1 -1
- package/dist/src/transport/listener.d.ts +3 -0
- package/dist/src/transport/listener.d.ts.map +1 -1
- package/dist/src/transport/listener.js +57 -27
- package/dist/src/transport/listener.js.map +1 -1
- package/dist/src/transport/reservation-store.d.ts +37 -14
- package/dist/src/transport/reservation-store.d.ts.map +1 -1
- package/dist/src/transport/reservation-store.js +125 -80
- package/dist/src/transport/reservation-store.js.map +1 -1
- package/dist/src/transport/transport.d.ts +2 -13
- package/dist/src/transport/transport.d.ts.map +1 -1
- package/dist/src/transport/transport.js +22 -49
- package/dist/src/transport/transport.js.map +1 -1
- package/dist/src/utils.d.ts +5 -2
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +7 -4
- package/dist/src/utils.js.map +1 -1
- package/dist/typedoc-urls.json +23 -0
- package/package.json +12 -11
- package/src/constants.ts +0 -2
- package/src/errors.ts +25 -0
- package/src/transport/discovery.ts +47 -9
- package/src/transport/index.ts +0 -7
- package/src/transport/listener.ts +75 -35
- package/src/transport/reservation-store.ts +184 -102
- package/src/transport/transport.ts +25 -71
- package/src/utils.ts +12 -4
@@ -1,10 +1,13 @@
|
|
1
|
-
import { TypedEventEmitter, setMaxListeners } from '@libp2p/interface';
|
1
|
+
import { ListenError, TypedEventEmitter, setMaxListeners } from '@libp2p/interface';
|
2
2
|
import { PeerMap } from '@libp2p/peer-collections';
|
3
|
-
import {
|
3
|
+
import { createScalableCuckooFilter } from '@libp2p/utils/filters';
|
4
4
|
import { PeerQueue } from '@libp2p/utils/peer-queue';
|
5
5
|
import { multiaddr } from '@multiformats/multiaddr';
|
6
|
+
import { Circuit } from '@multiformats/multiaddr-matcher';
|
6
7
|
import { pbStream } from 'it-protobuf-stream';
|
7
|
-
import {
|
8
|
+
import { nanoid } from 'nanoid';
|
9
|
+
import { DEFAULT_MAX_RESERVATION_QUEUE_LENGTH, DEFAULT_RESERVATION_COMPLETION_TIMEOUT, DEFAULT_RESERVATION_CONCURRENCY, KEEP_ALIVE_TAG, RELAY_V2_HOP_CODEC } from '../constants.js';
|
10
|
+
import { DoubleRelayError, HadEnoughRelaysError, RelayQueueFullError } from '../errors.js';
|
8
11
|
import { HopMessage, Status } from '../pb/index.js';
|
9
12
|
import { getExpirationMilliseconds } from '../utils.js';
|
10
13
|
// allow refreshing a relay reservation if it will expire in the next 10 minutes
|
@@ -16,12 +19,11 @@ const REFRESH_TIMEOUT_MIN = 30 * 1000;
|
|
16
19
|
export class ReservationStore extends TypedEventEmitter {
|
17
20
|
peerId;
|
18
21
|
connectionManager;
|
19
|
-
transportManager;
|
20
22
|
peerStore;
|
21
23
|
events;
|
22
24
|
reserveQueue;
|
23
25
|
reservations;
|
24
|
-
|
26
|
+
pendingReservations;
|
25
27
|
maxReservationQueueLength;
|
26
28
|
reservationCompletionTimeout;
|
27
29
|
started;
|
@@ -32,15 +34,14 @@ export class ReservationStore extends TypedEventEmitter {
|
|
32
34
|
this.log = components.logger.forComponent('libp2p:circuit-relay:transport:reservation-store');
|
33
35
|
this.peerId = components.peerId;
|
34
36
|
this.connectionManager = components.connectionManager;
|
35
|
-
this.transportManager = components.transportManager;
|
36
37
|
this.peerStore = components.peerStore;
|
37
38
|
this.events = components.events;
|
38
39
|
this.reservations = new PeerMap();
|
39
|
-
this.
|
40
|
+
this.pendingReservations = [];
|
40
41
|
this.maxReservationQueueLength = init?.maxReservationQueueLength ?? DEFAULT_MAX_RESERVATION_QUEUE_LENGTH;
|
41
42
|
this.reservationCompletionTimeout = init?.reservationCompletionTimeout ?? DEFAULT_RESERVATION_COMPLETION_TIMEOUT;
|
42
43
|
this.started = false;
|
43
|
-
this.relayFilter =
|
44
|
+
this.relayFilter = createScalableCuckooFilter(100);
|
44
45
|
// ensure we don't listen on multiple relays simultaneously
|
45
46
|
this.reserveQueue = new PeerQueue({
|
46
47
|
concurrency: init?.reservationConcurrency ?? DEFAULT_RESERVATION_CONCURRENCY,
|
@@ -56,7 +57,7 @@ export class ReservationStore extends TypedEventEmitter {
|
|
56
57
|
if (reservation == null) {
|
57
58
|
return;
|
58
59
|
}
|
59
|
-
this.#removeReservation(evt.detail.remotePeer
|
60
|
+
this.#removeReservation(evt.detail.remotePeer)
|
60
61
|
.catch(err => {
|
61
62
|
this.log('could not remove relay %p - %e', evt.detail, err);
|
62
63
|
});
|
@@ -74,7 +75,7 @@ export class ReservationStore extends TypedEventEmitter {
|
|
74
75
|
.then(async () => {
|
75
76
|
const relayPeers = await this.peerStore.all({
|
76
77
|
filters: [(peer) => {
|
77
|
-
return peer.tags.has(
|
78
|
+
return peer.tags.has(KEEP_ALIVE_TAG);
|
78
79
|
}]
|
79
80
|
});
|
80
81
|
this.log('removing tag from %d old relays', relayPeers.length);
|
@@ -82,15 +83,13 @@ export class ReservationStore extends TypedEventEmitter {
|
|
82
83
|
await Promise.all(relayPeers.map(async (peer) => {
|
83
84
|
await this.peerStore.merge(peer.id, {
|
84
85
|
tags: {
|
85
|
-
[RELAY_TAG]: undefined,
|
86
86
|
[KEEP_ALIVE_TAG]: undefined
|
87
87
|
}
|
88
88
|
});
|
89
89
|
}));
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
}
|
90
|
+
this.log('redialing %d old relays', relayPeers.length);
|
91
|
+
await Promise.all(relayPeers.map(async (peer) => this.addRelay(peer.id, 'discovered')));
|
92
|
+
this.#checkReservationCount();
|
94
93
|
})
|
95
94
|
.catch(err => {
|
96
95
|
this.log.error(err);
|
@@ -104,6 +103,12 @@ export class ReservationStore extends TypedEventEmitter {
|
|
104
103
|
this.reservations.clear();
|
105
104
|
this.started = false;
|
106
105
|
}
|
106
|
+
reserveRelay() {
|
107
|
+
const id = nanoid();
|
108
|
+
this.pendingReservations.push(id);
|
109
|
+
this.#checkReservationCount();
|
110
|
+
return id;
|
111
|
+
}
|
107
112
|
/**
|
108
113
|
* If the number of current relays is beneath the configured `maxReservations`
|
109
114
|
* value, and the passed peer id is not our own, and we have a non-relayed
|
@@ -113,22 +118,21 @@ export class ReservationStore extends TypedEventEmitter {
|
|
113
118
|
async addRelay(peerId, type) {
|
114
119
|
if (this.peerId.equals(peerId)) {
|
115
120
|
this.log.trace('not trying to use self as relay');
|
116
|
-
|
121
|
+
throw new ListenError('Cannot use self as relay');
|
117
122
|
}
|
118
123
|
if (this.reserveQueue.size > this.maxReservationQueueLength) {
|
119
|
-
|
120
|
-
return;
|
124
|
+
throw new RelayQueueFullError('The reservation queue is full');
|
121
125
|
}
|
122
|
-
|
126
|
+
const existingJob = this.reserveQueue.find(peerId);
|
127
|
+
if (existingJob != null) {
|
123
128
|
this.log.trace('potential relay peer %p is already in the reservation queue', peerId);
|
124
|
-
return;
|
129
|
+
return existingJob.join();
|
125
130
|
}
|
126
131
|
if (this.relayFilter.has(peerId.toMultihash().bytes)) {
|
127
|
-
|
128
|
-
return;
|
132
|
+
throw new ListenError('The relay was previously invalid');
|
129
133
|
}
|
130
134
|
this.log.trace('try to reserve relay slot with %p', peerId);
|
131
|
-
|
135
|
+
return this.reserveQueue.add(async () => {
|
132
136
|
const start = Date.now();
|
133
137
|
try {
|
134
138
|
// allow refresh of an existing reservation if it is about to expire
|
@@ -145,27 +149,23 @@ export class ReservationStore extends TypedEventEmitter {
|
|
145
149
|
}
|
146
150
|
if (connected && getExpirationMilliseconds(existingReservation.reservation.expire) > REFRESH_WINDOW) {
|
147
151
|
this.log('already have relay reservation with %p but we are still connected and it does not expire soon', peerId);
|
148
|
-
return
|
152
|
+
return {
|
153
|
+
relay: peerId,
|
154
|
+
details: existingReservation
|
155
|
+
};
|
149
156
|
}
|
150
|
-
await this.#removeReservation(peerId
|
157
|
+
await this.#removeReservation(peerId);
|
151
158
|
}
|
152
|
-
if (type === 'discovered' &&
|
153
|
-
|
154
|
-
acc++;
|
155
|
-
}
|
156
|
-
return acc;
|
157
|
-
}, 0) >= this.maxDiscoveredRelays) {
|
158
|
-
this.log.trace('already have enough discovered relays');
|
159
|
-
return;
|
159
|
+
if (type === 'discovered' && this.pendingReservations.length === 0) {
|
160
|
+
throw new HadEnoughRelaysError('Not making reservation on discovered relay because we do not need any more relays');
|
160
161
|
}
|
161
162
|
const signal = AbortSignal.timeout(this.reservationCompletionTimeout);
|
162
163
|
setMaxListeners(Infinity, signal);
|
163
164
|
const connection = await this.connectionManager.openConnection(peerId, {
|
164
165
|
signal
|
165
166
|
});
|
166
|
-
if (connection.remoteAddr
|
167
|
-
|
168
|
-
return;
|
167
|
+
if (Circuit.matches(connection.remoteAddr)) {
|
168
|
+
throw new DoubleRelayError('not creating reservation over relayed connection');
|
169
169
|
}
|
170
170
|
const reservation = await this.#createReservation(connection, {
|
171
171
|
signal
|
@@ -180,56 +180,72 @@ export class ReservationStore extends TypedEventEmitter {
|
|
180
180
|
this.addRelay(peerId, type)
|
181
181
|
.catch(async (err) => {
|
182
182
|
this.log.error('could not refresh reservation to relay %p - %e', peerId, err);
|
183
|
-
|
184
|
-
if (reservation == null) {
|
185
|
-
this.log.error('did not have reservation after refreshing reservation failed %p', peerId);
|
186
|
-
return;
|
187
|
-
}
|
188
|
-
await this.#removeReservation(peerId, reservation);
|
183
|
+
await this.#removeReservation(peerId);
|
189
184
|
})
|
190
185
|
.catch(err => {
|
191
186
|
this.log.error('could not remove expired reservation to relay %p - %e', peerId, err);
|
192
187
|
});
|
193
188
|
}, timeoutDuration);
|
189
|
+
let res;
|
190
|
+
// assign a reservation id if one was requested
|
191
|
+
if (type === 'discovered') {
|
192
|
+
const id = this.pendingReservations.pop();
|
193
|
+
if (id == null) {
|
194
|
+
throw new HadEnoughRelaysError('Made reservation on relay but did not need any more discovered relays');
|
195
|
+
}
|
196
|
+
res = {
|
197
|
+
timeout,
|
198
|
+
reservation,
|
199
|
+
type,
|
200
|
+
connection: connection.id,
|
201
|
+
id
|
202
|
+
};
|
203
|
+
}
|
204
|
+
else {
|
205
|
+
res = {
|
206
|
+
timeout,
|
207
|
+
reservation,
|
208
|
+
type,
|
209
|
+
connection: connection.id
|
210
|
+
};
|
211
|
+
}
|
194
212
|
// we've managed to create a reservation successfully
|
195
|
-
this.reservations.set(peerId,
|
196
|
-
timeout,
|
197
|
-
reservation,
|
198
|
-
type,
|
199
|
-
connection: connection.id
|
200
|
-
});
|
213
|
+
this.reservations.set(peerId, res);
|
201
214
|
// ensure we don't close the connection to the relay
|
202
215
|
await this.peerStore.merge(peerId, {
|
203
216
|
tags: {
|
204
|
-
[RELAY_TAG]: {
|
205
|
-
value: 1,
|
206
|
-
ttl: expiration
|
207
|
-
},
|
208
217
|
[KEEP_ALIVE_TAG]: {
|
209
218
|
value: 1,
|
210
219
|
ttl: expiration
|
211
220
|
}
|
212
221
|
}
|
213
222
|
});
|
214
|
-
//
|
215
|
-
|
223
|
+
// check to see if we have discovered enough relays
|
224
|
+
this.#checkReservationCount();
|
225
|
+
const result = {
|
226
|
+
relay: peerId,
|
227
|
+
details: res
|
228
|
+
};
|
216
229
|
this.safeDispatchEvent('relay:created-reservation', {
|
217
|
-
detail:
|
230
|
+
detail: result
|
218
231
|
});
|
232
|
+
return result;
|
219
233
|
}
|
220
234
|
catch (err) {
|
221
|
-
|
222
|
-
|
223
|
-
this.relayFilter.add(peerId.toMultihash().bytes);
|
224
|
-
// cancel the renewal timeout if it's been set
|
225
|
-
const reservation = this.reservations.get(peerId);
|
226
|
-
// if listening failed, remove the reservation
|
227
|
-
if (reservation != null) {
|
228
|
-
this.#removeReservation(peerId, reservation)
|
229
|
-
.catch(err => {
|
230
|
-
this.log.error('could not remove reservation on %p after reserving slot failed - %e', peerId, err);
|
231
|
-
});
|
235
|
+
if (!(type === 'discovered' && err.name === 'HadEnoughRelaysError')) {
|
236
|
+
this.log.error('could not reserve slot on %p after %dms - %e', peerId, Date.now() - start, err);
|
232
237
|
}
|
238
|
+
// don't try this peer again if dialing failed or they do not support
|
239
|
+
// the hop protocol
|
240
|
+
if (err.name === 'DialError' || err.name === 'UnsupportedProtocolError') {
|
241
|
+
this.relayFilter.add(peerId.toMultihash().bytes);
|
242
|
+
}
|
243
|
+
// if listening failed, remove the reservation
|
244
|
+
this.#removeReservation(peerId)
|
245
|
+
.catch(err => {
|
246
|
+
this.log.error('could not remove reservation on %p after reserving slot failed - %e', peerId, err);
|
247
|
+
});
|
248
|
+
throw err;
|
233
249
|
}
|
234
250
|
}, {
|
235
251
|
peerId
|
@@ -241,13 +257,22 @@ export class ReservationStore extends TypedEventEmitter {
|
|
241
257
|
getReservation(peerId) {
|
242
258
|
return this.reservations.get(peerId)?.reservation;
|
243
259
|
}
|
244
|
-
reservationCount() {
|
245
|
-
|
260
|
+
reservationCount(type) {
|
261
|
+
if (type == null) {
|
262
|
+
return this.reservations.size;
|
263
|
+
}
|
264
|
+
return [...this.reservations.values()].reduce((acc, curr) => {
|
265
|
+
if (curr.type === type) {
|
266
|
+
acc++;
|
267
|
+
}
|
268
|
+
return acc;
|
269
|
+
}, 0);
|
246
270
|
}
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
})
|
271
|
+
cancelReservations() {
|
272
|
+
[...this.reservations.values()].forEach(reservation => {
|
273
|
+
clearTimeout(reservation.timeout);
|
274
|
+
});
|
275
|
+
this.reservations.clear();
|
251
276
|
}
|
252
277
|
async #createReservation(connection, options) {
|
253
278
|
options.signal?.throwIfAborted();
|
@@ -255,9 +280,11 @@ export class ReservationStore extends TypedEventEmitter {
|
|
255
280
|
const stream = await connection.newStream(RELAY_V2_HOP_CODEC, options);
|
256
281
|
const pbstr = pbStream(stream);
|
257
282
|
const hopstr = pbstr.pb(HopMessage);
|
283
|
+
this.log.trace('send RESERVE to %p', connection.remotePeer);
|
258
284
|
await hopstr.write({ type: HopMessage.Type.RESERVE }, options);
|
259
285
|
let response;
|
260
286
|
try {
|
287
|
+
this.log.trace('read response from %p', connection.remotePeer);
|
261
288
|
response = await hopstr.read(options);
|
262
289
|
}
|
263
290
|
catch (err) {
|
@@ -269,6 +296,7 @@ export class ReservationStore extends TypedEventEmitter {
|
|
269
296
|
await stream.close(options);
|
270
297
|
}
|
271
298
|
}
|
299
|
+
this.log.trace('read response from %p', response);
|
272
300
|
if (response.status === Status.OK && response.reservation != null) {
|
273
301
|
// check that the returned relay has the relay address - this can be
|
274
302
|
// omitted when requesting a reservation from a go-libp2p relay we
|
@@ -294,26 +322,43 @@ export class ReservationStore extends TypedEventEmitter {
|
|
294
322
|
/**
|
295
323
|
* Remove listen relay
|
296
324
|
*/
|
297
|
-
async #removeReservation(peerId
|
298
|
-
|
299
|
-
|
325
|
+
async #removeReservation(peerId) {
|
326
|
+
const reservation = this.reservations.get(peerId);
|
327
|
+
if (reservation == null) {
|
300
328
|
return;
|
301
329
|
}
|
302
330
|
this.log('removing relay reservation with %p from local store', peerId);
|
303
331
|
clearTimeout(reservation.timeout);
|
304
332
|
this.reservations.delete(peerId);
|
333
|
+
// discover a new relay for this discovery request
|
334
|
+
if (reservation.type === 'discovered') {
|
335
|
+
this.pendingReservations.push(reservation.id);
|
336
|
+
}
|
305
337
|
// untag the relay
|
306
338
|
await this.peerStore.merge(peerId, {
|
307
339
|
tags: {
|
308
|
-
[RELAY_TAG]: undefined,
|
309
340
|
[KEEP_ALIVE_TAG]: undefined
|
310
341
|
}
|
311
342
|
});
|
312
|
-
this.safeDispatchEvent('relay:removed', {
|
313
|
-
|
314
|
-
|
315
|
-
|
343
|
+
this.safeDispatchEvent('relay:removed', {
|
344
|
+
detail: {
|
345
|
+
relay: peerId,
|
346
|
+
details: reservation
|
347
|
+
}
|
348
|
+
});
|
349
|
+
// maybe trigger discovery of new relays
|
350
|
+
this.#checkReservationCount();
|
351
|
+
}
|
352
|
+
#checkReservationCount() {
|
353
|
+
if (this.pendingReservations.length === 0) {
|
354
|
+
this.log.trace('have discovered enough relays');
|
355
|
+
this.reserveQueue.clear();
|
356
|
+
this.safeDispatchEvent('relay:found-enough-relays');
|
357
|
+
return;
|
316
358
|
}
|
359
|
+
this.relayFilter = createScalableCuckooFilter(100);
|
360
|
+
this.log('not discovered enough relays %d/%d', this.reservations.size, this.pendingReservations.length);
|
361
|
+
this.safeDispatchEvent('relay:not-enough-relays');
|
317
362
|
}
|
318
363
|
}
|
319
364
|
//# sourceMappingURL=reservation-store.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"reservation-store.js","sourceRoot":"","sources":["../../../src/transport/reservation-store.ts"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"reservation-store.js","sourceRoot":"","sources":["../../../src/transport/reservation-store.ts"],"names":[],"mappings":"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"}
|
@@ -1,19 +1,10 @@
|
|
1
1
|
import { serviceCapabilities, serviceDependencies, transportSymbol } from '@libp2p/interface';
|
2
2
|
import { ReservationStore } from './reservation-store.js';
|
3
3
|
import type { CircuitRelayTransportComponents, CircuitRelayTransportInit } from './index.js';
|
4
|
-
import type { Transport, CreateListenerOptions, Listener, Connection,
|
4
|
+
import type { Transport, CreateListenerOptions, Listener, Connection, OutboundConnectionUpgradeEvents, DialTransportOptions, OpenConnectionProgressEvents } from '@libp2p/interface';
|
5
5
|
import type { IncomingStreamData } from '@libp2p/interface-internal';
|
6
6
|
import type { Multiaddr } from '@multiformats/multiaddr';
|
7
|
-
import type { ProgressEvent
|
8
|
-
interface ConnectOptions extends ProgressOptions<CircuitRelayDialEvents> {
|
9
|
-
stream: Stream;
|
10
|
-
connection: Connection;
|
11
|
-
destinationPeer: PeerId;
|
12
|
-
destinationAddr: Multiaddr;
|
13
|
-
relayAddr: Multiaddr;
|
14
|
-
ma: Multiaddr;
|
15
|
-
disconnectOnFailure: boolean;
|
16
|
-
}
|
7
|
+
import type { ProgressEvent } from 'progress-events';
|
17
8
|
export type CircuitRelayDialEvents = OutboundConnectionUpgradeEvents | OpenConnectionProgressEvents | ProgressEvent<'circuit-relay:open-connection'> | ProgressEvent<'circuit-relay:reuse-connection'> | ProgressEvent<'circuit-relay:open-hop-stream'> | ProgressEvent<'circuit-relay:write-connect-message'> | ProgressEvent<'circuit-relay:read-connect-response'>;
|
18
9
|
export declare class CircuitRelayTransport implements Transport<CircuitRelayDialEvents> {
|
19
10
|
private readonly discovery?;
|
@@ -44,7 +35,6 @@ export declare class CircuitRelayTransport implements Transport<CircuitRelayDial
|
|
44
35
|
* Dial a peer over a relay
|
45
36
|
*/
|
46
37
|
dial(ma: Multiaddr, options: DialTransportOptions<CircuitRelayDialEvents>): Promise<Connection>;
|
47
|
-
connectV2({ stream, connection, destinationPeer, destinationAddr, relayAddr, ma, disconnectOnFailure, onProgress }: ConnectOptions): Promise<Connection>;
|
48
38
|
/**
|
49
39
|
* Create a listener
|
50
40
|
*/
|
@@ -62,5 +52,4 @@ export declare class CircuitRelayTransport implements Transport<CircuitRelayDial
|
|
62
52
|
*/
|
63
53
|
onStop({ connection, stream }: IncomingStreamData): Promise<void>;
|
64
54
|
}
|
65
|
-
export {};
|
66
55
|
//# sourceMappingURL=transport.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/transport/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,mBAAmB,EAAE,mBAAmB,EAAe,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAc1I,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,KAAK,EAAE,+BAA+B,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAC5F,OAAO,KAAK,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAqC,UAAU,
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/transport/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,mBAAmB,EAAE,mBAAmB,EAAe,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAc1I,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,KAAK,EAAE,+BAA+B,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAC5F,OAAO,KAAK,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAqC,UAAU,EAA8C,+BAA+B,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AACnQ,OAAO,KAAK,EAAqC,kBAAkB,EAA+B,MAAM,4BAA4B,CAAA;AACpI,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAsBpD,MAAM,MAAM,sBAAsB,GAChC,+BAA+B,GAC/B,4BAA4B,GAC5B,aAAa,CAAC,+BAA+B,CAAC,GAC9C,aAAa,CAAC,gCAAgC,CAAC,GAC/C,aAAa,CAAC,+BAA+B,CAAC,GAC9C,aAAa,CAAC,qCAAqC,CAAC,GACpD,aAAa,CAAC,qCAAqC,CAAC,CAAA;AAEtD,qBAAa,qBAAsB,YAAW,SAAS,CAAC,sBAAsB,CAAC;IAC7E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAmB;IACrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,SAAgB,gBAAgB,EAAE,gBAAgB,CAAA;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAQ;IAC9C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAQ;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;gBAEf,UAAU,EAAE,+BAA+B,EAAE,IAAI,EAAE,yBAAyB;IAqCzF,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,wCAAuC;IAEpE,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAGvC;IAED,IAAI,CAAC,mBAAmB,CAAC,IAAK,MAAM,EAAE,CASrC;IAED,QAAQ,CAAC,CAAC,eAAe,CAAC,QAAO;IAEjC,SAAS,IAAK,OAAO;IAIf,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAiBvB,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;IACG,IAAI,CAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,CAAC,sBAAsB,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAuFtG;;OAEG;IACH,cAAc,CAAE,OAAO,EAAE,qBAAqB,GAAG,QAAQ;IAQzD;;OAEG;IACH,YAAY,CAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;IAQnD;;OAEG;IACH,UAAU,CAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;IAQjD;;OAEG;IACG,MAAM,CAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;CAiFzE"}
|
@@ -9,7 +9,7 @@ import * as Digest from 'multiformats/hashes/digest';
|
|
9
9
|
import { CustomProgressEvent } from 'progress-events';
|
10
10
|
import { CIRCUIT_PROTO_CODE, DEFAULT_DISCOVERY_FILTER_ERROR_RATE, DEFAULT_DISCOVERY_FILTER_SIZE, MAX_CONNECTIONS, RELAY_V2_HOP_CODEC, RELAY_V2_STOP_CODEC } from '../constants.js';
|
11
11
|
import { StopMessage, HopMessage, Status } from '../pb/index.js';
|
12
|
-
import { CircuitListen, LimitTracker } from '../utils.js';
|
12
|
+
import { CircuitListen, CircuitSearch, LimitTracker } from '../utils.js';
|
13
13
|
import { RelayDiscovery } from './discovery.js';
|
14
14
|
import { createListener } from './listener.js';
|
15
15
|
import { ReservationStore } from './reservation-store.js';
|
@@ -61,26 +61,23 @@ export class CircuitRelayTransport {
|
|
61
61
|
this.maxInboundStopStreams = init.maxInboundStopStreams ?? defaults.maxInboundStopStreams;
|
62
62
|
this.maxOutboundStopStreams = init.maxOutboundStopStreams ?? defaults.maxOutboundStopStreams;
|
63
63
|
this.stopTimeout = init.stopTimeout ?? defaults.stopTimeout;
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
.catch(err => {
|
64
|
+
this.discovery = new RelayDiscovery(components, {
|
65
|
+
filter: init.discoveryFilter ?? peerFilter(DEFAULT_DISCOVERY_FILTER_SIZE, DEFAULT_DISCOVERY_FILTER_ERROR_RATE)
|
66
|
+
});
|
67
|
+
this.discovery.addEventListener('relay:discover', (evt) => {
|
68
|
+
this.reservationStore.addRelay(evt.detail, 'discovered')
|
69
|
+
.catch(err => {
|
70
|
+
if (err.name !== 'HadEnoughRelaysError' && err.name !== 'RelayQueueFullError') {
|
72
71
|
this.log.error('could not add discovered relay %p', evt.detail, err);
|
73
|
-
}
|
72
|
+
}
|
74
73
|
});
|
75
|
-
}
|
74
|
+
});
|
76
75
|
this.reservationStore = new ReservationStore(components, init);
|
77
76
|
this.reservationStore.addEventListener('relay:not-enough-relays', () => {
|
78
77
|
this.discovery?.startDiscovery();
|
79
78
|
});
|
80
|
-
this.reservationStore.addEventListener('relay:
|
81
|
-
|
82
|
-
this.discovery?.stopDiscovery();
|
83
|
-
}
|
79
|
+
this.reservationStore.addEventListener('relay:found-enough-relays', () => {
|
80
|
+
this.discovery?.stopDiscovery();
|
84
81
|
});
|
85
82
|
this.started = false;
|
86
83
|
}
|
@@ -143,7 +140,6 @@ export class CircuitRelayTransport {
|
|
143
140
|
}
|
144
141
|
const relayPeer = peerIdFromString(relayId);
|
145
142
|
const destinationPeer = peerIdFromString(destinationId);
|
146
|
-
let disconnectOnFailure = false;
|
147
143
|
const relayConnections = this.connectionManager.getConnections(relayPeer);
|
148
144
|
let relayConnection = relayConnections[0];
|
149
145
|
if (relayConnection == null) {
|
@@ -152,7 +148,6 @@ export class CircuitRelayTransport {
|
|
152
148
|
});
|
153
149
|
options.onProgress?.(new CustomProgressEvent('circuit-relay:open-connection'));
|
154
150
|
relayConnection = await this.connectionManager.openConnection(relayPeer, options);
|
155
|
-
disconnectOnFailure = true;
|
156
151
|
}
|
157
152
|
else {
|
158
153
|
options.onProgress?.(new CustomProgressEvent('circuit-relay:reuse-connection'));
|
@@ -160,41 +155,19 @@ export class CircuitRelayTransport {
|
|
160
155
|
let stream;
|
161
156
|
try {
|
162
157
|
options.onProgress?.(new CustomProgressEvent('circuit-relay:open-hop-stream'));
|
163
|
-
stream = await relayConnection.newStream(RELAY_V2_HOP_CODEC);
|
164
|
-
return await this.connectV2({
|
165
|
-
stream,
|
166
|
-
connection: relayConnection,
|
167
|
-
destinationPeer,
|
168
|
-
destinationAddr,
|
169
|
-
relayAddr,
|
170
|
-
ma,
|
171
|
-
disconnectOnFailure,
|
172
|
-
onProgress: options.onProgress
|
173
|
-
});
|
174
|
-
}
|
175
|
-
catch (err) {
|
176
|
-
this.log.error('circuit relay dial to destination %p via relay %p failed', destinationPeer, relayPeer, err);
|
177
|
-
if (stream != null) {
|
178
|
-
stream.abort(err);
|
179
|
-
}
|
180
|
-
disconnectOnFailure && await relayConnection.close();
|
181
|
-
throw err;
|
182
|
-
}
|
183
|
-
}
|
184
|
-
async connectV2({ stream, connection, destinationPeer, destinationAddr, relayAddr, ma, disconnectOnFailure, onProgress }) {
|
185
|
-
try {
|
158
|
+
stream = await relayConnection.newStream(RELAY_V2_HOP_CODEC, options);
|
186
159
|
const pbstr = pbStream(stream);
|
187
160
|
const hopstr = pbstr.pb(HopMessage);
|
188
|
-
onProgress?.(new CustomProgressEvent('circuit-relay:write-connect-message'));
|
161
|
+
options.onProgress?.(new CustomProgressEvent('circuit-relay:write-connect-message'));
|
189
162
|
await hopstr.write({
|
190
163
|
type: HopMessage.Type.CONNECT,
|
191
164
|
peer: {
|
192
165
|
id: destinationPeer.toMultihash().bytes,
|
193
166
|
addrs: [multiaddr(destinationAddr).bytes]
|
194
167
|
}
|
195
|
-
});
|
196
|
-
onProgress?.(new CustomProgressEvent('circuit-relay:read-connect-response'));
|
197
|
-
const status = await hopstr.read();
|
168
|
+
}, options);
|
169
|
+
options.onProgress?.(new CustomProgressEvent('circuit-relay:read-connect-response'));
|
170
|
+
const status = await hopstr.read(options);
|
198
171
|
if (status.status !== Status.OK) {
|
199
172
|
throw new InvalidMessageError(`failed to connect via relay with status ${status?.status?.toString() ?? 'undefined'}`);
|
200
173
|
}
|
@@ -209,13 +182,13 @@ export class CircuitRelayTransport {
|
|
209
182
|
});
|
210
183
|
this.log('new outbound relayed connection %a', maConn.remoteAddr);
|
211
184
|
return await this.upgrader.upgradeOutbound(maConn, {
|
212
|
-
|
213
|
-
|
185
|
+
...options,
|
186
|
+
limits: limits.getLimits()
|
214
187
|
});
|
215
188
|
}
|
216
189
|
catch (err) {
|
217
|
-
this.log.error(
|
218
|
-
|
190
|
+
this.log.error('circuit relay dial to destination %p via relay %p failed', destinationPeer, relayPeer, err);
|
191
|
+
stream?.abort(err);
|
219
192
|
throw err;
|
220
193
|
}
|
221
194
|
}
|
@@ -235,7 +208,7 @@ export class CircuitRelayTransport {
|
|
235
208
|
listenFilter(multiaddrs) {
|
236
209
|
multiaddrs = Array.isArray(multiaddrs) ? multiaddrs : [multiaddrs];
|
237
210
|
return multiaddrs.filter((ma) => {
|
238
|
-
return CircuitListen.exactMatch(ma);
|
211
|
+
return CircuitListen.exactMatch(ma) || CircuitSearch.exactMatch(ma);
|
239
212
|
});
|
240
213
|
}
|
241
214
|
/**
|