@libp2p/circuit-relay-v2 2.1.5-75301ac7d → 2.1.5-aa8de9fd3
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/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
package/dist/src/constants.d.ts
CHANGED
@@ -23,7 +23,6 @@ export declare const DEFAULT_RESERVATION_COMPLETION_TIMEOUT = 2000;
|
|
23
23
|
*/
|
24
24
|
export declare const DEFAULT_MAX_RESERVATION_QUEUE_LENGTH = 100;
|
25
25
|
export declare const RELAY_SOURCE_TAG = "circuit-relay-source";
|
26
|
-
export declare const RELAY_TAG = "circuit-relay-relay";
|
27
26
|
export declare const KEEP_ALIVE_TAG = "keep-alive-circuit-relay";
|
28
27
|
export declare const KEEP_ALIVE_SOURCE_TAG = "keep-alive-circuit-relay-source";
|
29
28
|
export declare const DEFAULT_DURATION_LIMIT: number;
|
@@ -1 +1 @@
|
|
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,
|
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
@@ -26,7 +26,6 @@ export const DEFAULT_RESERVATION_COMPLETION_TIMEOUT = 2000;
|
|
26
26
|
*/
|
27
27
|
export const DEFAULT_MAX_RESERVATION_QUEUE_LENGTH = 100;
|
28
28
|
export const RELAY_SOURCE_TAG = 'circuit-relay-source';
|
29
|
-
export const RELAY_TAG = 'circuit-relay-relay';
|
30
29
|
export const KEEP_ALIVE_TAG = `${KEEP_ALIVE}-circuit-relay`;
|
31
30
|
export const KEEP_ALIVE_SOURCE_TAG = `${KEEP_ALIVE}-circuit-relay-source`;
|
32
31
|
// circuit v2 connection limits
|
@@ -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,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,
|
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/errors.d.ts
CHANGED
@@ -10,4 +10,26 @@ export declare class TransferLimitError extends Error {
|
|
10
10
|
export declare class DurationLimitError extends Error {
|
11
11
|
constructor(message?: string);
|
12
12
|
}
|
13
|
+
/**
|
14
|
+
* There were enough relay reservations already
|
15
|
+
*/
|
16
|
+
export declare class HadEnoughRelaysError extends Error {
|
17
|
+
static name: string;
|
18
|
+
name: string;
|
19
|
+
}
|
20
|
+
/**
|
21
|
+
* An attempt to open a relayed connection over a relayed connection was made
|
22
|
+
*/
|
23
|
+
export declare class DoubleRelayError extends Error {
|
24
|
+
static name: string;
|
25
|
+
name: string;
|
26
|
+
}
|
27
|
+
/**
|
28
|
+
* An attempt to make a reservation on a relay was made while the reservation
|
29
|
+
* queue was full
|
30
|
+
*/
|
31
|
+
export declare class RelayQueueFullError extends Error {
|
32
|
+
static name: string;
|
33
|
+
name: string;
|
34
|
+
}
|
13
35
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/src/errors.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;gBAC9B,OAAO,SAAyB;CAI9C;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;gBAC9B,OAAO,SAAyB;CAI9C"}
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;gBAC9B,OAAO,SAAyB;CAI9C;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;gBAC9B,OAAO,SAAyB;CAI9C;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,MAAM,CAAC,IAAI,EAAE,MAAM,CAAyB;IAC5C,IAAI,EAAE,MAAM,CAAyB;CACtC;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAqB;IACxC,IAAI,EAAE,MAAM,CAAqB;CAClC;AAED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,CAAC,IAAI,EAAE,MAAM,CAAwB;IAC3C,IAAI,EAAE,MAAM,CAAwB;CACrC"}
|
package/dist/src/errors.js
CHANGED
@@ -16,4 +16,26 @@ export class DurationLimitError extends Error {
|
|
16
16
|
this.name = 'DurationLimitError';
|
17
17
|
}
|
18
18
|
}
|
19
|
+
/**
|
20
|
+
* There were enough relay reservations already
|
21
|
+
*/
|
22
|
+
export class HadEnoughRelaysError extends Error {
|
23
|
+
static name = 'HadEnoughRelaysError';
|
24
|
+
name = 'HadEnoughRelaysError';
|
25
|
+
}
|
26
|
+
/**
|
27
|
+
* An attempt to open a relayed connection over a relayed connection was made
|
28
|
+
*/
|
29
|
+
export class DoubleRelayError extends Error {
|
30
|
+
static name = 'DoubleRelayError';
|
31
|
+
name = 'DoubleRelayError';
|
32
|
+
}
|
33
|
+
/**
|
34
|
+
* An attempt to make a reservation on a relay was made while the reservation
|
35
|
+
* queue was full
|
36
|
+
*/
|
37
|
+
export class RelayQueueFullError extends Error {
|
38
|
+
static name = 'RelayQueueFullError';
|
39
|
+
name = 'RelayQueueFullError';
|
40
|
+
}
|
19
41
|
//# sourceMappingURL=errors.js.map
|
package/dist/src/errors.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAa,OAAO,GAAG,sBAAsB;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAa,OAAO,GAAG,sBAAsB;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF"}
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAa,OAAO,GAAG,sBAAsB;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAa,OAAO,GAAG,sBAAsB;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,MAAM,CAAC,IAAI,GAAW,sBAAsB,CAAA;IAC5C,IAAI,GAAW,sBAAsB,CAAA;;AAGvC;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,MAAM,CAAC,IAAI,GAAW,kBAAkB,CAAA;IACxC,IAAI,GAAW,kBAAkB,CAAA;;AAGnC;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,CAAC,IAAI,GAAW,qBAAqB,CAAA;IAC3C,IAAI,GAAW,qBAAqB,CAAA"}
|
@@ -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":"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,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EACL,kBAAkB,EACnB,MAAM,iBAAiB,CAAA;AAqBxB;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,iBAAuC;IACxD,SAAS,CAAW;IACpB,SAAS,CAAW;IACpB,iBAAiB,CAAmB;IACpC,UAAU,CAAY;IAC/B,OAAO,CAAS;IAChB,OAAO,CAAS;IAChB,UAAU,CAAS;IACV,GAAG,CAAQ;IACpB,mBAAmB,CAAiB;IAC3B,MAAM,CAAiB;IAChC,KAAK,CAAY;IAEzB,YAAa,UAAoC,EAAE,OAA2B,EAAE;QAC9E,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,sCAAsC,CAAC,CAAA;QACjF,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAA;QACrC,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAA;QACrC,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,CAAA;QACrD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAAA;QACvC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,CAAC,mBAAmB,GAAG,IAAI,eAAe,EAAE,CAAA;QAChD,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;IAC5D,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,kEAAkE;QAClE,gCAAgC;QAChC,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE;YAClE,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;gBACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mDAAmD,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;gBAClH,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;YAC9D,CAAC;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACrB,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC5C,CAAC;QAED,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAE,CAAA;QACjC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;IAED;;;;;;;OAOG;IACH,cAAc;QACZ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAM;QACR,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,IAAI,CAAC,mBAAmB,GAAG,IAAI,eAAe,EAAE,CAAA;QAChD,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;QAE1D,OAAO,CAAC,OAAO,EAAE;aACd,IAAI,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;YAE3C,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;gBACtC,OAAO,EAAE;oBACP,qFAAqF;oBACrF,CAAC,IAAI,EAAE,EAAE;wBACP,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAA;oBACpD,CAAC;iBACF;gBACD,MAAM,EAAE;oBACN,YAAY;oBACZ,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClC,8CAA8C;oBAC9C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;wBACP,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;wBAChC,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;wBAEhC,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC;4BAC1B,OAAO,CAAC,CAAC,CAAA;wBACX,CAAC;wBAED,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC;4BAC1B,OAAO,CAAC,CAAA;wBACV,CAAC;wBAED,OAAO,CAAC,CAAA;oBACV,CAAC;iBACF;aACF,CAAC,CAAC,CAAA;YAEH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;gBAC5D,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;YAC/D,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,oCAAoC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;YAE5D,2EAA2E;YAC3E,0CAA0C;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC;gBACvC,WAAW,EAAE,CAAC;aACf,CAAC,CAAA;YAEF,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;YAE7B,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;gBAC3F,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sBAAsB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;gBAE/C,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;oBACvB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qCAAqC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;oBAE9D,kCAAkC;oBAClC,SAAQ;gBACV,CAAC;gBAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sCAAsC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;oBAE/D,yCAAyC;oBACzC,SAAQ;gBACV,CAAC;gBAED,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;oBAChE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;oBAEpG,2BAA2B;oBAC3B,SAAQ;gBACV,CAAC;gBAED,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;oBACtB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gCAAgC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;oBAEzD,0DAA0D;oBAC1D,MAAM,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE;wBAC7B,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM;qBACxC,CAAC,CAAA;gBACJ,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC,6DAA6D,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;gBAE3G,sEAAsE;gBACtE,uDAAuD;gBACvD,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;oBACnB,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBACtF,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;oBAEjC,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;oBAClE,CAAC;4BAAS,CAAC;wBACT,MAAM,CAAC,KAAK,EAAE,CAAA;oBAChB,CAAC;gBACH,CAAC,EAAE;oBACD,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM;iBACxC,CAAC;qBACC,KAAK,CAAC,GAAG,CAAC,EAAE;oBACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4CAA4C,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;gBAC5E,CAAC,CAAC,CAAA;YACN,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;YAE5B,MAAM,KAAK,CAAC,MAAM,EAAE,CAAA;QACtB,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,CAAC,EAAE;YACX,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC7C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAA;YAClE,CAAC;QACH,CAAC,CAAC,CAAA;IACN,CAAC;IAED,aAAa;QACX,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;QAC1B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAE,CAAA;IACnC,CAAC;CACF;AAED;;;GAGG;AACH,SAAS,WAAW,CAAE,IAAU;IAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;IAEvD,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,OAAO,CAAC,CAAA;IACV,CAAC;IAED,OAAO,IAAI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;AACzD,CAAC"}
|
@@ -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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"}
|