@libp2p/circuit-relay-v2 2.1.4 → 2.1.5-3bc9769b8
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 +4 -4
- package/dist/src/constants.d.ts +0 -5
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +0 -5
- 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/index.d.ts +16 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/pb/index.d.ts +12 -1
- package/dist/src/pb/index.d.ts.map +1 -1
- package/dist/src/pb/index.js +78 -2
- package/dist/src/pb/index.js.map +1 -1
- package/dist/src/server/index.d.ts.map +1 -1
- package/dist/src/server/index.js +19 -10
- package/dist/src/server/index.js.map +1 -1
- package/dist/src/server/reservation-store.d.ts +5 -9
- package/dist/src/server/reservation-store.d.ts.map +1 -1
- package/dist/src/server/reservation-store.js +32 -33
- package/dist/src/server/reservation-store.js.map +1 -1
- package/dist/src/server/reservation-voucher.d.ts +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 +144 -74
- 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 +30 -54
- package/dist/src/transport/transport.js.map +1 -1
- package/dist/src/utils.d.ts +10 -1
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +22 -8
- package/dist/src/utils.js.map +1 -1
- package/package.json +14 -12
- package/src/constants.ts +0 -7
- package/src/errors.ts +25 -0
- package/src/index.ts +19 -1
- package/src/pb/index.proto +20 -1
- package/src/pb/index.ts +99 -3
- package/src/server/index.ts +21 -11
- package/src/server/reservation-store.ts +38 -42
- package/src/server/reservation-voucher.ts +2 -2
- 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 +209 -95
- package/src/transport/transport.ts +34 -76
- package/src/utils.ts +29 -8
- package/dist/typedoc-urls.json +0 -23
@@ -1,19 +1,18 @@
|
|
1
1
|
import { trackedPeerMap } from '@libp2p/peer-collections';
|
2
|
-
import {
|
2
|
+
import { retimeableSignal } from 'retimeable-signal';
|
3
|
+
import { DEFAULT_DATA_LIMIT, DEFAULT_DURATION_LIMIT, DEFAULT_MAX_RESERVATION_STORE_SIZE, DEFAULT_MAX_RESERVATION_TTL } from '../constants.js';
|
3
4
|
import { Status } from '../pb/index.js';
|
4
5
|
export class ReservationStore {
|
5
6
|
reservations;
|
6
|
-
_started = false;
|
7
|
-
interval;
|
8
7
|
maxReservations;
|
9
|
-
reservationClearInterval;
|
10
8
|
applyDefaultLimit;
|
11
9
|
reservationTtl;
|
12
10
|
defaultDurationLimit;
|
13
11
|
defaultDataLimit;
|
12
|
+
log;
|
14
13
|
constructor(components, init = {}) {
|
14
|
+
this.log = components.logger.forComponent('libp2p:circuit-relay:server:reservation-store');
|
15
15
|
this.maxReservations = init.maxReservations ?? DEFAULT_MAX_RESERVATION_STORE_SIZE;
|
16
|
-
this.reservationClearInterval = init.reservationClearInterval ?? DEFAULT_MAX_RESERVATION_CLEAR_INTERVAL;
|
17
16
|
this.applyDefaultLimit = init.applyDefaultLimit !== false;
|
18
17
|
this.reservationTtl = init.reservationTtl ?? DEFAULT_MAX_RESERVATION_TTL;
|
19
18
|
this.defaultDurationLimit = init.defaultDurationLimit ?? DEFAULT_DURATION_LIMIT;
|
@@ -23,47 +22,47 @@ export class ReservationStore {
|
|
23
22
|
name: 'libp2p_circuit_relay_server_reservations_total'
|
24
23
|
});
|
25
24
|
}
|
26
|
-
isStarted() {
|
27
|
-
return this._started;
|
28
|
-
}
|
29
|
-
start() {
|
30
|
-
if (this._started) {
|
31
|
-
return;
|
32
|
-
}
|
33
|
-
this._started = true;
|
34
|
-
this.interval = setInterval(() => {
|
35
|
-
const now = (new Date()).getTime();
|
36
|
-
this.reservations.forEach((r, k) => {
|
37
|
-
if (r.expire.getTime() < now) {
|
38
|
-
this.reservations.delete(k);
|
39
|
-
}
|
40
|
-
});
|
41
|
-
}, this.reservationClearInterval);
|
42
|
-
}
|
43
|
-
stop() {
|
44
|
-
clearInterval(this.interval);
|
45
|
-
}
|
46
25
|
reserve(peer, addr, limit) {
|
47
|
-
|
26
|
+
let reservation = this.reservations.get(peer);
|
27
|
+
if (this.reservations.size >= this.maxReservations && reservation == null) {
|
48
28
|
return { status: Status.RESERVATION_REFUSED };
|
49
29
|
}
|
50
|
-
const
|
30
|
+
const expiry = new Date(Date.now() + this.reservationTtl);
|
51
31
|
let checkedLimit;
|
52
32
|
if (this.applyDefaultLimit) {
|
53
|
-
checkedLimit = limit ?? {
|
33
|
+
checkedLimit = limit ?? {
|
34
|
+
data: this.defaultDataLimit,
|
35
|
+
duration: this.defaultDurationLimit
|
36
|
+
};
|
37
|
+
}
|
38
|
+
if (reservation != null) {
|
39
|
+
this.log('refreshing reservation for client %p', peer);
|
40
|
+
reservation.signal.reset(this.reservationTtl);
|
54
41
|
}
|
55
|
-
|
42
|
+
else {
|
43
|
+
this.log('creating new reservation for client %p', peer);
|
44
|
+
reservation = {
|
45
|
+
addr,
|
46
|
+
expiry,
|
47
|
+
limit: checkedLimit,
|
48
|
+
signal: retimeableSignal(this.reservationTtl)
|
49
|
+
};
|
50
|
+
}
|
51
|
+
this.reservations.set(peer, reservation);
|
52
|
+
reservation.signal.addEventListener('abort', () => {
|
53
|
+
this.reservations.delete(peer);
|
54
|
+
});
|
56
55
|
// return expiry time in seconds
|
57
|
-
return { status: Status.OK, expire: Math.round(
|
56
|
+
return { status: Status.OK, expire: Math.round(expiry.getTime() / 1000) };
|
58
57
|
}
|
59
58
|
removeReservation(peer) {
|
60
59
|
this.reservations.delete(peer);
|
61
60
|
}
|
62
|
-
hasReservation(dst) {
|
63
|
-
return this.reservations.has(dst);
|
64
|
-
}
|
65
61
|
get(peer) {
|
66
62
|
return this.reservations.get(peer);
|
67
63
|
}
|
64
|
+
clear() {
|
65
|
+
this.reservations.clear();
|
66
|
+
}
|
68
67
|
}
|
69
68
|
//# sourceMappingURL=reservation-store.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"reservation-store.js","sourceRoot":"","sources":["../../../src/server/reservation-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"reservation-store.js","sourceRoot":"","sources":["../../../src/server/reservation-store.ts"],"names":[],"mappings":"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"}
|
@@ -2,7 +2,7 @@ import type { PeerId, Record } from '@libp2p/interface';
|
|
2
2
|
export interface ReservationVoucherOptions {
|
3
3
|
relay: PeerId;
|
4
4
|
peer: PeerId;
|
5
|
-
expiration:
|
5
|
+
expiration: bigint;
|
6
6
|
}
|
7
7
|
export declare class ReservationVoucherRecord implements Record {
|
8
8
|
readonly domain = "libp2p-relay-rsvp";
|
@@ -30,6 +30,7 @@ export declare class RelayDiscovery extends TypedEventEmitter<RelayDiscoveryEven
|
|
30
30
|
private readonly log;
|
31
31
|
private discoveryController;
|
32
32
|
private readonly filter?;
|
33
|
+
private queue?;
|
33
34
|
constructor(components: RelayDiscoveryComponents, init?: RelayDiscoveryInit);
|
34
35
|
isStarted(): boolean;
|
35
36
|
start(): Promise<void>;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/transport/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAmB,MAAM,mBAAmB,CAAA;AAOtE,OAAO,KAAK,EAAE,eAAe,
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/transport/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAmB,MAAM,mBAAmB,CAAA;AAOtE,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACpH,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAE5G,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,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;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,cAAc,CAAA;CACxB;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,iBAAiB,CAAC,oBAAoB,CAAE,YAAW,SAAS;IAC9F,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,UAAU,CAAY;IACvC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,mBAAmB,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAgB;IACxC,OAAO,CAAC,KAAK,CAAC,CAAW;gBAEZ,UAAU,EAAE,wBAAwB,EAAE,IAAI,GAAE,kBAAuB;IAehF,SAAS,IAAK,OAAO;IAIf,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAc7B,IAAI,IAAK,IAAI;IASb;;;;;;;OAOG;IACH,cAAc,IAAK,IAAI;IA2HvB,aAAa,IAAK,IAAI;CAKvB"}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { TypedEventEmitter, setMaxListeners } from '@libp2p/interface';
|
2
2
|
import { PeerQueue } from '@libp2p/utils/peer-queue';
|
3
3
|
import { anySignal } from 'any-signal';
|
4
|
-
import {
|
4
|
+
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
5
5
|
import { RELAY_V2_HOP_CODEC } from '../constants.js';
|
6
6
|
/**
|
7
7
|
* ReservationManager automatically makes a circuit v2 reservation on any connected
|
@@ -18,6 +18,7 @@ export class RelayDiscovery extends TypedEventEmitter {
|
|
18
18
|
log;
|
19
19
|
discoveryController;
|
20
20
|
filter;
|
21
|
+
queue;
|
21
22
|
constructor(components, init = {}) {
|
22
23
|
super();
|
23
24
|
this.log = components.logger.forComponent('libp2p:circuit-relay:discover-relays');
|
@@ -40,7 +41,7 @@ export class RelayDiscovery extends TypedEventEmitter {
|
|
40
41
|
this.topologyId = await this.registrar.register(RELAY_V2_HOP_CODEC, {
|
41
42
|
filter: this.filter,
|
42
43
|
onConnect: (peerId) => {
|
43
|
-
this.log.trace('discovered relay %p', peerId);
|
44
|
+
this.log.trace('discovered relay %p queue (length: %d, active %d)', peerId, this.queue?.size, this.queue?.running);
|
44
45
|
this.safeDispatchEvent('relay:discover', { detail: peerId });
|
45
46
|
}
|
46
47
|
});
|
@@ -80,7 +81,20 @@ export class RelayDiscovery extends TypedEventEmitter {
|
|
80
81
|
}
|
81
82
|
],
|
82
83
|
orders: [
|
83
|
-
|
84
|
+
// randomise
|
85
|
+
() => Math.random() < 0.5 ? 1 : -1,
|
86
|
+
// prefer peers we've connected to in the past
|
87
|
+
(a, b) => {
|
88
|
+
const lastDialA = getLastDial(a);
|
89
|
+
const lastDialB = getLastDial(b);
|
90
|
+
if (lastDialA > lastDialB) {
|
91
|
+
return -1;
|
92
|
+
}
|
93
|
+
if (lastDialB > lastDialA) {
|
94
|
+
return 1;
|
95
|
+
}
|
96
|
+
return 0;
|
97
|
+
}
|
84
98
|
]
|
85
99
|
}));
|
86
100
|
for (const peer of peers) {
|
@@ -90,7 +104,7 @@ export class RelayDiscovery extends TypedEventEmitter {
|
|
90
104
|
this.log('found %d relay peers in peer store', peers.length);
|
91
105
|
// perform random walk and dial peers - after identify has run, the network
|
92
106
|
// topology will be notified of new relays
|
93
|
-
const queue = new PeerQueue({
|
107
|
+
const queue = this.queue = new PeerQueue({
|
94
108
|
concurrency: 5
|
95
109
|
});
|
96
110
|
this.log('start random walk');
|
@@ -111,10 +125,14 @@ export class RelayDiscovery extends TypedEventEmitter {
|
|
111
125
|
// skip peers we can't dial
|
112
126
|
continue;
|
113
127
|
}
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
128
|
+
if (queue.queued > 10) {
|
129
|
+
this.log.trace('wait for space in queue for %p', peer.id);
|
130
|
+
// pause the random walk until there is space in the queue
|
131
|
+
await queue.onSizeLessThan(10, {
|
132
|
+
signal: this.discoveryController.signal
|
133
|
+
});
|
134
|
+
}
|
135
|
+
this.log('adding random peer %p to dial queue (length: %d, active %d)', peer.id, queue.size, queue.running);
|
118
136
|
// dial the peer - this will cause identify to run and our topology to
|
119
137
|
// be notified and we'll attempt to create reservations
|
120
138
|
queue.add(async () => {
|
@@ -134,6 +152,7 @@ export class RelayDiscovery extends TypedEventEmitter {
|
|
134
152
|
this.log.error('error opening connection to random peer %p', peer.id, err);
|
135
153
|
});
|
136
154
|
}
|
155
|
+
this.log('stop random walk');
|
137
156
|
await queue.onIdle();
|
138
157
|
})
|
139
158
|
.catch(err => {
|
@@ -148,4 +167,15 @@ export class RelayDiscovery extends TypedEventEmitter {
|
|
148
167
|
this.discoveryController?.abort();
|
149
168
|
}
|
150
169
|
}
|
170
|
+
/**
|
171
|
+
* Returns the timestamp of the last time we connected to this peer, if we've
|
172
|
+
* not connected to them before return 0
|
173
|
+
*/
|
174
|
+
function getLastDial(peer) {
|
175
|
+
const lastDial = peer.metadata.get('last-dial-success');
|
176
|
+
if (lastDial == null) {
|
177
|
+
return 0;
|
178
|
+
}
|
179
|
+
return new Date(uint8ArrayToString(lastDial)).getTime();
|
180
|
+
}
|
151
181
|
//# sourceMappingURL=discovery.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/transport/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/transport/discovery.ts"],"names":[],"mappings":"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"}
|
@@ -14,12 +14,6 @@ export interface CircuitRelayTransportComponents extends RelayDiscoveryComponent
|
|
14
14
|
* RelayConfig configures the circuit v2 relay transport.
|
15
15
|
*/
|
16
16
|
export interface CircuitRelayTransportInit extends ReservationStoreInit {
|
17
|
-
/**
|
18
|
-
* The number of peers running diable relays to search for and connect to
|
19
|
-
*
|
20
|
-
* @default 0
|
21
|
-
*/
|
22
|
-
discoverRelays?: number;
|
23
17
|
/**
|
24
18
|
* An optional filter used to prevent duplicate attempts to reserve relay
|
25
19
|
* slots on the same peer
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transport/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACrI,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAE3E,MAAM,WAAW,+BAAgC,SAAQ,wBAAwB;IAC/E,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,SAAS,CAAA;IACpB,QAAQ,EAAE,QAAQ,CAAA;IAClB,cAAc,EAAE,cAAc,CAAA;IAC9B,eAAe,EAAE,eAAe,CAAA;IAChC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAA;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,oBAAoB;IACrE
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transport/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACrI,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAE3E,MAAM,WAAW,+BAAgC,SAAQ,wBAAwB;IAC/E,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,SAAS,CAAA;IACpB,QAAQ,EAAE,QAAQ,CAAA;IAClB,cAAc,EAAE,cAAc,CAAA;IAC9B,eAAe,EAAE,eAAe,CAAA;IAChC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAA;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,oBAAoB;IACrE;;;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 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AA2DtD,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"}
|
@@ -6,5 +6,8 @@ export interface CircuitRelayTransportListenerComponents {
|
|
6
6
|
relayStore: ReservationStore;
|
7
7
|
logger: ComponentLogger;
|
8
8
|
}
|
9
|
+
export interface CircuitRelayTransportListenerInit {
|
10
|
+
listenTimeout?: number;
|
11
|
+
}
|
9
12
|
export declare function createListener(options: CircuitRelayTransportListenerComponents): Listener;
|
10
13
|
//# sourceMappingURL=listener.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/transport/listener.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/transport/listener.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAoB,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAChF,OAAO,KAAK,EAAE,eAAe,EAAU,QAAQ,EAA0B,MAAM,mBAAmB,CAAA;AAClG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAGnE,MAAM,WAAW,uCAAuC;IACtD,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,UAAU,EAAE,gBAAgB,CAAA;IAC5B,MAAM,EAAE,eAAe,CAAA;CACxB;AAED,MAAM,WAAW,iCAAiC;IAChD,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAsHD,wBAAgB,cAAc,CAAE,OAAO,EAAE,uCAAuC,GAAG,QAAQ,CAE1F"}
|
@@ -1,60 +1,90 @@
|
|
1
|
-
import { ListenError, TypedEventEmitter } from '@libp2p/interface';
|
2
|
-
import { PeerMap } from '@libp2p/peer-collections';
|
1
|
+
import { ListenError, TypedEventEmitter, setMaxListeners } from '@libp2p/interface';
|
3
2
|
import { multiaddr } from '@multiformats/multiaddr';
|
3
|
+
import { DEFAULT_RESERVATION_COMPLETION_TIMEOUT } from '../constants.js';
|
4
|
+
import { CircuitListen, CircuitSearch } from '../utils.js';
|
4
5
|
class CircuitRelayTransportListener extends TypedEventEmitter {
|
5
6
|
connectionManager;
|
6
7
|
reservationStore;
|
8
|
+
discovery;
|
7
9
|
listeningAddrs;
|
8
10
|
log;
|
9
|
-
|
11
|
+
listenTimeout;
|
12
|
+
reservationId;
|
13
|
+
relay;
|
14
|
+
constructor(components, init = {}) {
|
10
15
|
super();
|
11
16
|
this.log = components.logger.forComponent('libp2p:circuit-relay:transport:listener');
|
12
17
|
this.connectionManager = components.connectionManager;
|
13
18
|
this.reservationStore = components.relayStore;
|
14
|
-
this.listeningAddrs =
|
19
|
+
this.listeningAddrs = [];
|
20
|
+
this.listenTimeout = init.listenTimeout ?? DEFAULT_RESERVATION_COMPLETION_TIMEOUT;
|
15
21
|
// remove listening addrs when a relay is removed
|
16
22
|
this.reservationStore.addEventListener('relay:removed', this._onRemoveRelayPeer);
|
23
|
+
this.reservationStore.addEventListener('relay:created-reservation', this._onAddRelayPeer);
|
17
24
|
}
|
18
25
|
_onRemoveRelayPeer = (evt) => {
|
19
|
-
|
20
|
-
this.
|
21
|
-
if (!had) {
|
26
|
+
this.log('relay removed %p our relay %p', evt.detail.relay, this.relay, this.relay?.equals(evt.detail.relay));
|
27
|
+
if (this.relay?.equals(evt.detail.relay) !== true) {
|
22
28
|
return;
|
23
29
|
}
|
24
|
-
this.
|
30
|
+
this.log('relay peer removed %p', evt.detail.relay);
|
31
|
+
this.listeningAddrs = [];
|
25
32
|
// announce listen addresses change
|
26
33
|
this.safeDispatchEvent('listening');
|
27
34
|
};
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
const relayAddr = addr.decapsulate('/p2p-circuit');
|
32
|
-
const relayConn = await this.connectionManager.openConnection(relayAddr);
|
33
|
-
if (!this.reservationStore.hasReservation(relayConn.remotePeer)) {
|
34
|
-
this.log('making reservation on peer %p', relayConn.remotePeer);
|
35
|
-
// addRelay calls transportManager.listen which calls this listen method
|
36
|
-
await this.reservationStore.addRelay(relayConn.remotePeer, 'configured');
|
35
|
+
_onAddRelayPeer = (evt) => {
|
36
|
+
const { relay, details } = evt.detail;
|
37
|
+
if (details.type === 'configured') {
|
37
38
|
return;
|
38
39
|
}
|
39
|
-
|
40
|
-
if (reservation == null) {
|
41
|
-
throw new ListenError('Did not have reservation after making reservation');
|
42
|
-
}
|
43
|
-
if (this.listeningAddrs.has(relayConn.remotePeer)) {
|
44
|
-
this.log('already listening on relay %p', relayConn.remotePeer);
|
40
|
+
if (details.id !== this.reservationId) {
|
45
41
|
return;
|
46
42
|
}
|
43
|
+
this.log('relay peer added %p', relay);
|
44
|
+
this.relay = relay;
|
47
45
|
// add all addresses from the relay reservation
|
48
|
-
this.listeningAddrs.
|
49
|
-
.map(buf => multiaddr(buf).encapsulate('/p2p-circuit'))
|
46
|
+
this.listeningAddrs = details.reservation.addrs
|
47
|
+
.map(buf => multiaddr(buf).encapsulate('/p2p-circuit'));
|
48
|
+
// announce listen addresses change
|
50
49
|
this.safeDispatchEvent('listening');
|
50
|
+
};
|
51
|
+
async listen(addr) {
|
52
|
+
this.log('listen on %a', addr);
|
53
|
+
if (CircuitSearch.exactMatch(addr)) {
|
54
|
+
// start relay discovery
|
55
|
+
this.reservationId = this.reservationStore.reserveRelay();
|
56
|
+
}
|
57
|
+
else if (CircuitListen.exactMatch(addr)) {
|
58
|
+
const signal = AbortSignal.timeout(this.listenTimeout);
|
59
|
+
setMaxListeners(Infinity, signal);
|
60
|
+
// try to make a reservation on one particular relay
|
61
|
+
// remove the circuit part to get the peer id of the relay
|
62
|
+
const relayAddr = addr.decapsulate('/p2p-circuit');
|
63
|
+
const relayConn = await this.connectionManager.openConnection(relayAddr, {
|
64
|
+
signal
|
65
|
+
});
|
66
|
+
if (!this.reservationStore.hasReservation(relayConn.remotePeer)) {
|
67
|
+
this.log('making reservation on peer %p', relayConn.remotePeer);
|
68
|
+
const reservation = await this.reservationStore.addRelay(relayConn.remotePeer, 'configured');
|
69
|
+
this.log('made reservation on peer %p', relayConn.remotePeer);
|
70
|
+
this.relay = reservation.relay;
|
71
|
+
// add all addresses from the relay reservation
|
72
|
+
this.listeningAddrs = reservation.details.reservation.addrs
|
73
|
+
.map(buf => multiaddr(buf).encapsulate('/p2p-circuit'));
|
74
|
+
// if that succeeded announce listen addresses change
|
75
|
+
this.safeDispatchEvent('listening');
|
76
|
+
}
|
77
|
+
}
|
78
|
+
else {
|
79
|
+
throw new ListenError(`Could not listen on p2p-circuit address "${addr}"`);
|
80
|
+
}
|
51
81
|
}
|
52
82
|
getAddrs() {
|
53
83
|
return [...this.listeningAddrs.values()].flat();
|
54
84
|
}
|
55
85
|
async close() {
|
56
|
-
|
57
|
-
this.listeningAddrs
|
86
|
+
this.reservationStore.cancelReservations();
|
87
|
+
this.listeningAddrs = [];
|
58
88
|
// remove listener
|
59
89
|
this.reservationStore.removeEventListener('relay:removed', this._onRemoveRelayPeer);
|
60
90
|
// announce listen addresses change
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"listener.js","sourceRoot":"","sources":["../../../src/transport/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;
|
1
|
+
{"version":3,"file":"listener.js","sourceRoot":"","sources":["../../../src/transport/listener.ts"],"names":[],"mappings":"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"}
|
@@ -1,11 +1,10 @@
|
|
1
1
|
import { TypedEventEmitter } from '@libp2p/interface';
|
2
2
|
import type { Reservation } from '../pb/index.js';
|
3
3
|
import type { TypedEventTarget, Libp2pEvents, ComponentLogger, PeerId, PeerStore, Startable, Metrics } from '@libp2p/interface';
|
4
|
-
import type { ConnectionManager
|
4
|
+
import type { ConnectionManager } from '@libp2p/interface-internal';
|
5
5
|
export interface ReservationStoreComponents {
|
6
6
|
peerId: PeerId;
|
7
7
|
connectionManager: ConnectionManager;
|
8
|
-
transportManager: TransportManager;
|
9
8
|
peerStore: PeerStore;
|
10
9
|
events: TypedEventTarget<Libp2pEvents>;
|
11
10
|
logger: ComponentLogger;
|
@@ -23,10 +22,6 @@ export interface ReservationStoreInit {
|
|
23
22
|
* @default 1
|
24
23
|
*/
|
25
24
|
reservationConcurrency?: number;
|
26
|
-
/**
|
27
|
-
* How many discovered relays to allow in the reservation store
|
28
|
-
*/
|
29
|
-
discoverRelays?: number;
|
30
25
|
/**
|
31
26
|
* Limit the number of potential relays we will dial
|
32
27
|
*
|
@@ -41,41 +36,69 @@ export interface ReservationStoreInit {
|
|
41
36
|
reservationCompletionTimeout?: number;
|
42
37
|
}
|
43
38
|
export type RelayType = 'discovered' | 'configured';
|
39
|
+
export interface DiscoveredRelayEntry {
|
40
|
+
timeout: ReturnType<typeof setTimeout>;
|
41
|
+
type: 'discovered';
|
42
|
+
reservation: Reservation;
|
43
|
+
/**
|
44
|
+
* Stores the id of the connection we have to the relay
|
45
|
+
*/
|
46
|
+
connection: string;
|
47
|
+
/**
|
48
|
+
* Stores the identifier returned when the reservation was requested
|
49
|
+
*/
|
50
|
+
id: string;
|
51
|
+
}
|
52
|
+
export interface ConfiguredRelayEntry {
|
53
|
+
timeout: ReturnType<typeof setTimeout>;
|
54
|
+
type: 'configured';
|
55
|
+
reservation: Reservation;
|
56
|
+
/**
|
57
|
+
* Stores the id of the connection we have to the relay
|
58
|
+
*/
|
59
|
+
connection: string;
|
60
|
+
}
|
61
|
+
export type RelayEntry = DiscoveredRelayEntry | ConfiguredRelayEntry;
|
62
|
+
export interface RelayReservation {
|
63
|
+
relay: PeerId;
|
64
|
+
details: RelayEntry;
|
65
|
+
}
|
44
66
|
export interface ReservationStoreEvents {
|
45
67
|
'relay:not-enough-relays': CustomEvent;
|
46
|
-
'relay:
|
47
|
-
'relay:
|
68
|
+
'relay:found-enough-relays': CustomEvent;
|
69
|
+
'relay:removed': CustomEvent<RelayReservation>;
|
70
|
+
'relay:created-reservation': CustomEvent<RelayReservation>;
|
48
71
|
}
|
49
72
|
export declare class ReservationStore extends TypedEventEmitter<ReservationStoreEvents> implements Startable {
|
50
73
|
#private;
|
51
74
|
private readonly peerId;
|
52
75
|
private readonly connectionManager;
|
53
|
-
private readonly transportManager;
|
54
76
|
private readonly peerStore;
|
55
77
|
private readonly events;
|
56
78
|
private readonly reserveQueue;
|
57
79
|
private readonly reservations;
|
58
|
-
private readonly
|
80
|
+
private readonly pendingReservations;
|
59
81
|
private readonly maxReservationQueueLength;
|
60
82
|
private readonly reservationCompletionTimeout;
|
61
83
|
private started;
|
62
84
|
private readonly log;
|
63
|
-
private
|
85
|
+
private relayFilter;
|
64
86
|
constructor(components: ReservationStoreComponents, init?: ReservationStoreInit);
|
65
87
|
isStarted(): boolean;
|
66
88
|
start(): void;
|
67
89
|
afterStart(): void;
|
68
90
|
stop(): void;
|
91
|
+
reserveRelay(): string;
|
69
92
|
/**
|
70
93
|
* If the number of current relays is beneath the configured `maxReservations`
|
71
94
|
* value, and the passed peer id is not our own, and we have a non-relayed
|
72
95
|
* connection to the remote, and the remote peer speaks the hop protocol, try
|
73
96
|
* to reserve a slot on the remote peer
|
74
97
|
*/
|
75
|
-
addRelay(peerId: PeerId, type: RelayType): Promise<
|
98
|
+
addRelay(peerId: PeerId, type: RelayType): Promise<RelayReservation>;
|
76
99
|
hasReservation(peerId: PeerId): boolean;
|
77
100
|
getReservation(peerId: PeerId): Reservation | undefined;
|
78
|
-
reservationCount(): number;
|
79
|
-
cancelReservations():
|
101
|
+
reservationCount(type?: RelayType): number;
|
102
|
+
cancelReservations(): void;
|
80
103
|
}
|
81
104
|
//# sourceMappingURL=reservation-store.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"reservation-store.d.ts","sourceRoot":"","sources":["../../../src/transport/reservation-store.ts"],"names":[],"mappings":"AAAA,OAAO,
|
1
|
+
{"version":3,"file":"reservation-store.d.ts","sourceRoot":"","sources":["../../../src/transport/reservation-store.ts"],"names":[],"mappings":"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"}
|