@libp2p/circuit-relay-v2 2.1.5 → 3.0.0
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 -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 +10 -9
- 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":"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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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"}
|