@libp2p/kad-dht 3.0.6 → 3.1.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/src/routing-table/index.d.ts +22 -1
- package/dist/src/routing-table/index.d.ts.map +1 -1
- package/dist/src/routing-table/index.js +50 -5
- package/dist/src/routing-table/index.js.map +1 -1
- package/dist/src/utils.d.ts +1 -0
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +7 -0
- package/dist/src/utils.js.map +1 -1
- package/package.json +2 -1
- package/src/routing-table/index.ts +77 -7
- package/src/utils.ts +9 -0
|
@@ -2,6 +2,11 @@ import Queue from 'p-queue';
|
|
|
2
2
|
import type { PeerId } from '@libp2p/interface-peer-id';
|
|
3
3
|
import type { Startable } from '@libp2p/interfaces/startable';
|
|
4
4
|
import { Components, Initializable } from '@libp2p/components';
|
|
5
|
+
export declare const KAD_CLOSE_TAG_NAME = "kad-close";
|
|
6
|
+
export declare const KAD_CLOSE_TAG_VALUE = 50;
|
|
7
|
+
export declare const KBUCKET_SIZE = 20;
|
|
8
|
+
export declare const PING_TIMEOUT = 10000;
|
|
9
|
+
export declare const PING_CONCURRENCY = 10;
|
|
5
10
|
export interface KBucketPeer {
|
|
6
11
|
id: Uint8Array;
|
|
7
12
|
peer: PeerId;
|
|
@@ -13,10 +18,15 @@ export interface KBucket {
|
|
|
13
18
|
left: KBucket;
|
|
14
19
|
right: KBucket;
|
|
15
20
|
}
|
|
21
|
+
interface KBucketTreeEvents {
|
|
22
|
+
'ping': (oldContacts: KBucketPeer[], newContact: KBucketPeer) => void;
|
|
23
|
+
'added': (contact: KBucketPeer) => void;
|
|
24
|
+
'removed': (contact: KBucketPeer) => void;
|
|
25
|
+
}
|
|
16
26
|
export interface KBucketTree {
|
|
17
27
|
root: KBucket;
|
|
18
28
|
localNodeId: Uint8Array;
|
|
19
|
-
on: (event:
|
|
29
|
+
on: <U extends keyof KBucketTreeEvents>(event: U, listener: KBucketTreeEvents[U]) => this;
|
|
20
30
|
closest: (key: Uint8Array, count: number) => KBucketPeer[];
|
|
21
31
|
closestPeer: (key: Uint8Array) => KBucketPeer;
|
|
22
32
|
remove: (key: Uint8Array) => void;
|
|
@@ -31,6 +41,8 @@ export interface RoutingTableInit {
|
|
|
31
41
|
kBucketSize?: number;
|
|
32
42
|
pingTimeout?: number;
|
|
33
43
|
pingConcurrency?: number;
|
|
44
|
+
tagName?: string;
|
|
45
|
+
tagValue?: number;
|
|
34
46
|
}
|
|
35
47
|
/**
|
|
36
48
|
* A wrapper around `k-bucket`, to provide easy store and
|
|
@@ -47,11 +59,19 @@ export declare class RoutingTable implements Startable, Initializable {
|
|
|
47
59
|
private readonly pingConcurrency;
|
|
48
60
|
private running;
|
|
49
61
|
private readonly protocol;
|
|
62
|
+
private readonly tagName;
|
|
63
|
+
private readonly tagValue;
|
|
50
64
|
constructor(init: RoutingTableInit);
|
|
51
65
|
init(components: Components): void;
|
|
52
66
|
isStarted(): boolean;
|
|
53
67
|
start(): Promise<void>;
|
|
54
68
|
stop(): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Keep track of our k-closest peers and tag them in the peer store as such
|
|
71
|
+
* - this will lower the chances that connections to them get closed when
|
|
72
|
+
* we reach connection limits
|
|
73
|
+
*/
|
|
74
|
+
_tagPeers(kBuck: KBucketTree): void;
|
|
55
75
|
/**
|
|
56
76
|
* Called on the `ping` event from `k-bucket` when a bucket is full
|
|
57
77
|
* and cannot split.
|
|
@@ -88,4 +108,5 @@ export declare class RoutingTable implements Startable, Initializable {
|
|
|
88
108
|
*/
|
|
89
109
|
remove(peer: PeerId): Promise<void>;
|
|
90
110
|
}
|
|
111
|
+
export {};
|
|
91
112
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routing-table/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,SAAS,CAAA;AAG3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAE7D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routing-table/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,SAAS,CAAA;AAG3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAE7D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAG9D,eAAO,MAAM,kBAAkB,cAAc,CAAA;AAC7C,eAAO,MAAM,mBAAmB,KAAK,CAAA;AACrC,eAAO,MAAM,YAAY,KAAK,CAAA;AAC9B,eAAO,MAAM,YAAY,QAAQ,CAAA;AACjC,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAElC,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,UAAU,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,UAAU,CAAA;IACd,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;IAClB,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;CACf;AAED,UAAU,iBAAiB;IACzB,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,WAAW,KAAK,IAAI,CAAA;IACrE,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAA;IACvC,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAA;CAC1C;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAA;IACb,WAAW,EAAE,UAAU,CAAA;IAEvB,EAAE,EAAE,CAAC,CAAC,SAAS,MAAM,iBAAiB,EACpC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,KACrC,IAAI,CAAA;IAET,OAAO,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,WAAW,EAAE,CAAA;IAC1D,WAAW,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,WAAW,CAAA;IAC7C,MAAM,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,CAAA;IACjC,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;IAChC,GAAG,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,UAAU,CAAA;IACpC,KAAK,EAAE,MAAM,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAA;CACpC;AAMD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,OAAO,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,qBAAa,YAAa,YAAW,SAAS,EAAE,aAAa;IACpD,WAAW,EAAE,MAAM,CAAA;IACnB,EAAE,CAAC,EAAE,WAAW,CAAA;IAChB,SAAS,EAAE,KAAK,CAAA;IAEvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;gBAEpB,IAAI,EAAE,gBAAgB;IAmCnC,IAAI,CAAE,UAAU,EAAE,UAAU,GAAG,IAAI;IAInC,SAAS;IAIH,KAAK;IAiBL,IAAI;IAMV;;;;OAIG;IACH,SAAS,CAAE,KAAK,EAAE,WAAW;IAqC7B;;;;;;;;;OASG;IACH,OAAO,CAAE,WAAW,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,WAAW;IAkE5D;;OAEG;IACH,IAAI,IAAI,WAMP;IAED;;OAEG;IACG,IAAI,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAWtD;;OAEG;IACH,WAAW,CAAE,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS;IAUjD;;OAEG;IACH,YAAY,CAAE,GAAG,EAAE,UAAU,EAAE,KAAK,SAAmB,GAAG,MAAM,EAAE;IAUlE;;OAEG;IACG,GAAG,CAAE,IAAI,EAAE,MAAM;IAmBvB;;OAEG;IACG,MAAM,CAAE,IAAI,EAAE,MAAM;CAgB3B"}
|
|
@@ -5,6 +5,12 @@ import Queue from 'p-queue';
|
|
|
5
5
|
import { TimeoutController } from 'timeout-abort-controller';
|
|
6
6
|
import { logger } from '@libp2p/logger';
|
|
7
7
|
import { Components } from '@libp2p/components';
|
|
8
|
+
import { PeerSet } from '@libp2p/peer-collections';
|
|
9
|
+
export const KAD_CLOSE_TAG_NAME = 'kad-close';
|
|
10
|
+
export const KAD_CLOSE_TAG_VALUE = 50;
|
|
11
|
+
export const KBUCKET_SIZE = 20;
|
|
12
|
+
export const PING_TIMEOUT = 10000;
|
|
13
|
+
export const PING_CONCURRENCY = 10;
|
|
8
14
|
const METRIC_ROUTING_TABLE_SIZE = 'routing-table-size';
|
|
9
15
|
const METRIC_PING_QUEUE_SIZE = 'ping-queue-size';
|
|
10
16
|
const METRIC_PING_RUNNING = 'ping-running';
|
|
@@ -15,14 +21,16 @@ const METRIC_PING_RUNNING = 'ping-running';
|
|
|
15
21
|
export class RoutingTable {
|
|
16
22
|
constructor(init) {
|
|
17
23
|
this.components = new Components();
|
|
18
|
-
const { kBucketSize, pingTimeout, lan, pingConcurrency, protocol } = init;
|
|
24
|
+
const { kBucketSize, pingTimeout, lan, pingConcurrency, protocol, tagName, tagValue } = init;
|
|
19
25
|
this.log = logger(`libp2p:kad-dht:${lan ? 'lan' : 'wan'}:routing-table`);
|
|
20
|
-
this.kBucketSize = kBucketSize ??
|
|
21
|
-
this.pingTimeout = pingTimeout ??
|
|
22
|
-
this.pingConcurrency = pingConcurrency ??
|
|
26
|
+
this.kBucketSize = kBucketSize ?? KBUCKET_SIZE;
|
|
27
|
+
this.pingTimeout = pingTimeout ?? PING_TIMEOUT;
|
|
28
|
+
this.pingConcurrency = pingConcurrency ?? PING_CONCURRENCY;
|
|
23
29
|
this.lan = lan;
|
|
24
30
|
this.running = false;
|
|
25
31
|
this.protocol = protocol;
|
|
32
|
+
this.tagName = tagName ?? KAD_CLOSE_TAG_NAME;
|
|
33
|
+
this.tagValue = tagValue ?? KAD_CLOSE_TAG_VALUE;
|
|
26
34
|
const updatePingQueueSizeMetric = () => {
|
|
27
35
|
this.components.getMetrics()?.updateComponentMetric({
|
|
28
36
|
system: 'libp2p',
|
|
@@ -55,14 +63,51 @@ export class RoutingTable {
|
|
|
55
63
|
numberOfNodesPerKBucket: this.kBucketSize,
|
|
56
64
|
numberOfNodesToPing: 1
|
|
57
65
|
});
|
|
58
|
-
kBuck.on('ping', this._onPing);
|
|
59
66
|
this.kb = kBuck;
|
|
67
|
+
// test whether to evict peers
|
|
68
|
+
kBuck.on('ping', this._onPing);
|
|
69
|
+
// tag kad-close peers
|
|
70
|
+
this._tagPeers(kBuck);
|
|
60
71
|
}
|
|
61
72
|
async stop() {
|
|
62
73
|
this.running = false;
|
|
63
74
|
this.pingQueue.clear();
|
|
64
75
|
this.kb = undefined;
|
|
65
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Keep track of our k-closest peers and tag them in the peer store as such
|
|
79
|
+
* - this will lower the chances that connections to them get closed when
|
|
80
|
+
* we reach connection limits
|
|
81
|
+
*/
|
|
82
|
+
_tagPeers(kBuck) {
|
|
83
|
+
let kClosest = new PeerSet();
|
|
84
|
+
const updatePeerTags = utils.debounce(() => {
|
|
85
|
+
const newClosest = new PeerSet(kBuck.closest(kBuck.localNodeId, KBUCKET_SIZE).map(contact => contact.peer));
|
|
86
|
+
const addedPeers = newClosest.difference(kClosest);
|
|
87
|
+
const removedPeers = kClosest.difference(newClosest);
|
|
88
|
+
Promise.resolve()
|
|
89
|
+
.then(async () => {
|
|
90
|
+
for (const peer of addedPeers) {
|
|
91
|
+
await this.components.getPeerStore().tagPeer(peer, this.tagName, {
|
|
92
|
+
value: this.tagValue
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
for (const peer of removedPeers) {
|
|
96
|
+
await this.components.getPeerStore().unTagPeer(peer, this.tagName);
|
|
97
|
+
}
|
|
98
|
+
})
|
|
99
|
+
.catch(err => {
|
|
100
|
+
this.log.error('Could not update peer tags', err);
|
|
101
|
+
});
|
|
102
|
+
kClosest = newClosest;
|
|
103
|
+
});
|
|
104
|
+
kBuck.on('added', () => {
|
|
105
|
+
updatePeerTags();
|
|
106
|
+
});
|
|
107
|
+
kBuck.on('removed', () => {
|
|
108
|
+
updatePeerTags();
|
|
109
|
+
});
|
|
110
|
+
}
|
|
66
111
|
/**
|
|
67
112
|
* Called on the `ping` event from `k-bucket` when a bucket is full
|
|
68
113
|
* and cannot split.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routing-table/index.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,KAAK,MAAM,UAAU,CAAA;AAC5B,OAAO,KAAK,KAAK,MAAM,aAAa,CAAA;AACpC,OAAO,KAAK,MAAM,SAAS,CAAA;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAIvC,OAAO,EAAE,UAAU,EAAiB,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routing-table/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/utils.d.ts
CHANGED
|
@@ -30,4 +30,5 @@ export declare function fromPublicKeyKey(key: Uint8Array): PeerId;
|
|
|
30
30
|
* Create a new put record, encodes and signs it if enabled
|
|
31
31
|
*/
|
|
32
32
|
export declare function createPutRecord(key: Uint8Array, value: Uint8Array): Uint8Array;
|
|
33
|
+
export declare function debounce(callback: () => void, wait?: number): () => void;
|
|
33
34
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/src/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAM7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAE3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAMvD,wBAAgB,sBAAsB,CAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAiBhE;AAED,wBAAgB,qBAAqB,CAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAiB/D;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAE,GAAG,EAAE,UAAU,uBAInD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAE,MAAM,EAAE,MAAM,uBAElD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAE,GAAG,EAAE,UAAU,OAE3C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAE,GAAG,EAAE,UAAU,OAEjD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAE,IAAI,EAAE,MAAM,cAK5C;AAED,wBAAgB,cAAc,CAAE,GAAG,EAAE,UAAU,WAE9C;AAED,wBAAgB,SAAS,CAAE,GAAG,EAAE,UAAU,WAEzC;AAED,wBAAgB,gBAAgB,CAAE,GAAG,EAAE,UAAU,UAEhD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,cAKlE"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAM7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAE3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAMvD,wBAAgB,sBAAsB,CAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAiBhE;AAED,wBAAgB,qBAAqB,CAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAiB/D;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAE,GAAG,EAAE,UAAU,uBAInD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAE,MAAM,EAAE,MAAM,uBAElD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAE,GAAG,EAAE,UAAU,OAE3C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAE,GAAG,EAAE,UAAU,OAEjD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAE,IAAI,EAAE,MAAM,cAK5C;AAED,wBAAgB,cAAc,CAAE,GAAG,EAAE,UAAU,WAE9C;AAED,wBAAgB,SAAS,CAAE,GAAG,EAAE,UAAU,WAEzC;AAED,wBAAgB,gBAAgB,CAAE,GAAG,EAAE,UAAU,UAEhD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,cAKlE;AAED,wBAAgB,QAAQ,CAAE,QAAQ,EAAE,MAAM,IAAI,EAAE,IAAI,GAAE,MAAY,cAOjE"}
|
package/dist/src/utils.js
CHANGED
|
@@ -90,4 +90,11 @@ export function createPutRecord(key, value) {
|
|
|
90
90
|
const rec = new Libp2pRecord(key, value, timeReceived);
|
|
91
91
|
return rec.serialize();
|
|
92
92
|
}
|
|
93
|
+
export function debounce(callback, wait = 100) {
|
|
94
|
+
let timeout;
|
|
95
|
+
return () => {
|
|
96
|
+
clearTimeout(timeout);
|
|
97
|
+
timeout = setTimeout(() => callback(), wait);
|
|
98
|
+
};
|
|
99
|
+
}
|
|
93
100
|
//# sourceMappingURL=utils.js.map
|
package/dist/src/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EAAE,MAAM,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,WAAW,MAAM,YAAY,CAAA;AAEpC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElD,qDAAqD;AACrD,MAAM,SAAS,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAA;AAE9C,MAAM,UAAU,sBAAsB,CAAE,IAAc;IACpD,OAAO;QACL,GAAG,IAAI;QACP,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;YAC7C,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,YAAY,EAAE,CAAA;YAE/C,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE;gBAC5B,OAAO,KAAK,CAAA;aACb;YAED,IAAI,IAAI,IAAI,IAAI,EAAE;gBAChB,OAAO,KAAK,CAAA;aACb;YAED,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QAC3B,CAAC,CAAC;KACH,CAAA;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAE,IAAc;IACnD,OAAO;QACL,GAAG,IAAI;QACP,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;YAC7C,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,YAAY,EAAE,CAAA;YAE/C,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE;gBAC5B,OAAO,KAAK,CAAA;aACb;YAED,IAAI,IAAI,IAAI,IAAI,EAAE;gBAChB,OAAO,KAAK,CAAA;aACb;YAED,OAAO,WAAW,CAAC,IAAI,CAAC,CAAA;QAC1B,CAAC,CAAC;KACH,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAE,GAAe;IAClD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAE1C,OAAO,SAAS,CAAC,MAAM,CAAA;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAE,MAAc;IACjD,OAAO,MAAM,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAE,GAAe;IAC1C,OAAO,IAAI,GAAG,CAAC,GAAG,GAAG,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAA;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAE,GAAe;IAChD,OAAO,IAAI,GAAG,CAAC,GAAG,iBAAiB,IAAI,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;AACpF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAE,IAAY;IAC3C,OAAO,gBAAgB,CAAC;QACtB,SAAS;QACT,IAAI,CAAC,OAAO,EAAE;KACf,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAE,GAAe;IAC7C,OAAO,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,SAAS,CAAE,GAAe;IACxC,OAAO,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAA;AAC5D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAE,GAAe;IAC/C,OAAO,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAE,GAAe,EAAE,KAAiB;IACjE,MAAM,YAAY,GAAG,IAAI,IAAI,EAAE,CAAA;IAC/B,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,YAAY,CAAC,CAAA;IAEtD,OAAO,GAAG,CAAC,SAAS,EAAE,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAE,QAAoB,EAAE,OAAe,GAAG;IAChE,IAAI,OAAsC,CAAA;IAE1C,OAAO,GAAG,EAAE;QACV,YAAY,CAAC,OAAO,CAAC,CAAA;QACrB,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAA;IAC9C,CAAC,CAAA;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libp2p/kad-dht",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "JavaScript implementation of the Kad-DHT for libp2p",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"homepage": "https://github.com/libp2p/js-libp2p-kad-dht#readme",
|
|
@@ -201,6 +201,7 @@
|
|
|
201
201
|
"lodash.random": "^3.2.0",
|
|
202
202
|
"lodash.range": "^3.2.0",
|
|
203
203
|
"p-retry": "^5.0.0",
|
|
204
|
+
"p-wait-for": "^5.0.0",
|
|
204
205
|
"protons": "^5.1.0",
|
|
205
206
|
"sinon": "^14.0.0",
|
|
206
207
|
"ts-sinon": "^2.0.2",
|
|
@@ -8,6 +8,13 @@ import type { PeerId } from '@libp2p/interface-peer-id'
|
|
|
8
8
|
import type { Startable } from '@libp2p/interfaces/startable'
|
|
9
9
|
import type { Logger } from '@libp2p/logger'
|
|
10
10
|
import { Components, Initializable } from '@libp2p/components'
|
|
11
|
+
import { PeerSet } from '@libp2p/peer-collections'
|
|
12
|
+
|
|
13
|
+
export const KAD_CLOSE_TAG_NAME = 'kad-close'
|
|
14
|
+
export const KAD_CLOSE_TAG_VALUE = 50
|
|
15
|
+
export const KBUCKET_SIZE = 20
|
|
16
|
+
export const PING_TIMEOUT = 10000
|
|
17
|
+
export const PING_CONCURRENCY = 10
|
|
11
18
|
|
|
12
19
|
export interface KBucketPeer {
|
|
13
20
|
id: Uint8Array
|
|
@@ -22,10 +29,20 @@ export interface KBucket {
|
|
|
22
29
|
right: KBucket
|
|
23
30
|
}
|
|
24
31
|
|
|
32
|
+
interface KBucketTreeEvents {
|
|
33
|
+
'ping': (oldContacts: KBucketPeer[], newContact: KBucketPeer) => void
|
|
34
|
+
'added': (contact: KBucketPeer) => void
|
|
35
|
+
'removed': (contact: KBucketPeer) => void
|
|
36
|
+
}
|
|
37
|
+
|
|
25
38
|
export interface KBucketTree {
|
|
26
39
|
root: KBucket
|
|
27
40
|
localNodeId: Uint8Array
|
|
28
|
-
|
|
41
|
+
|
|
42
|
+
on: <U extends keyof KBucketTreeEvents>(
|
|
43
|
+
event: U, listener: KBucketTreeEvents[U]
|
|
44
|
+
) => this
|
|
45
|
+
|
|
29
46
|
closest: (key: Uint8Array, count: number) => KBucketPeer[]
|
|
30
47
|
closestPeer: (key: Uint8Array) => KBucketPeer
|
|
31
48
|
remove: (key: Uint8Array) => void
|
|
@@ -45,6 +62,8 @@ export interface RoutingTableInit {
|
|
|
45
62
|
kBucketSize?: number
|
|
46
63
|
pingTimeout?: number
|
|
47
64
|
pingConcurrency?: number
|
|
65
|
+
tagName?: string
|
|
66
|
+
tagValue?: number
|
|
48
67
|
}
|
|
49
68
|
|
|
50
69
|
/**
|
|
@@ -63,17 +82,21 @@ export class RoutingTable implements Startable, Initializable {
|
|
|
63
82
|
private readonly pingConcurrency: number
|
|
64
83
|
private running: boolean
|
|
65
84
|
private readonly protocol: string
|
|
85
|
+
private readonly tagName: string
|
|
86
|
+
private readonly tagValue: number
|
|
66
87
|
|
|
67
88
|
constructor (init: RoutingTableInit) {
|
|
68
|
-
const { kBucketSize, pingTimeout, lan, pingConcurrency, protocol } = init
|
|
89
|
+
const { kBucketSize, pingTimeout, lan, pingConcurrency, protocol, tagName, tagValue } = init
|
|
69
90
|
|
|
70
91
|
this.log = logger(`libp2p:kad-dht:${lan ? 'lan' : 'wan'}:routing-table`)
|
|
71
|
-
this.kBucketSize = kBucketSize ??
|
|
72
|
-
this.pingTimeout = pingTimeout ??
|
|
73
|
-
this.pingConcurrency = pingConcurrency ??
|
|
92
|
+
this.kBucketSize = kBucketSize ?? KBUCKET_SIZE
|
|
93
|
+
this.pingTimeout = pingTimeout ?? PING_TIMEOUT
|
|
94
|
+
this.pingConcurrency = pingConcurrency ?? PING_CONCURRENCY
|
|
74
95
|
this.lan = lan
|
|
75
96
|
this.running = false
|
|
76
97
|
this.protocol = protocol
|
|
98
|
+
this.tagName = tagName ?? KAD_CLOSE_TAG_NAME
|
|
99
|
+
this.tagValue = tagValue ?? KAD_CLOSE_TAG_VALUE
|
|
77
100
|
|
|
78
101
|
const updatePingQueueSizeMetric = () => {
|
|
79
102
|
this.components.getMetrics()?.updateComponentMetric({
|
|
@@ -108,13 +131,18 @@ export class RoutingTable implements Startable, Initializable {
|
|
|
108
131
|
async start () {
|
|
109
132
|
this.running = true
|
|
110
133
|
|
|
111
|
-
const kBuck = new KBuck({
|
|
134
|
+
const kBuck: KBucketTree = new KBuck({
|
|
112
135
|
localNodeId: await utils.convertPeerId(this.components.getPeerId()),
|
|
113
136
|
numberOfNodesPerKBucket: this.kBucketSize,
|
|
114
137
|
numberOfNodesToPing: 1
|
|
115
138
|
})
|
|
116
|
-
kBuck.on('ping', this._onPing)
|
|
117
139
|
this.kb = kBuck
|
|
140
|
+
|
|
141
|
+
// test whether to evict peers
|
|
142
|
+
kBuck.on('ping', this._onPing)
|
|
143
|
+
|
|
144
|
+
// tag kad-close peers
|
|
145
|
+
this._tagPeers(kBuck)
|
|
118
146
|
}
|
|
119
147
|
|
|
120
148
|
async stop () {
|
|
@@ -123,6 +151,48 @@ export class RoutingTable implements Startable, Initializable {
|
|
|
123
151
|
this.kb = undefined
|
|
124
152
|
}
|
|
125
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Keep track of our k-closest peers and tag them in the peer store as such
|
|
156
|
+
* - this will lower the chances that connections to them get closed when
|
|
157
|
+
* we reach connection limits
|
|
158
|
+
*/
|
|
159
|
+
_tagPeers (kBuck: KBucketTree) {
|
|
160
|
+
let kClosest = new PeerSet()
|
|
161
|
+
|
|
162
|
+
const updatePeerTags = utils.debounce(() => {
|
|
163
|
+
const newClosest = new PeerSet(
|
|
164
|
+
kBuck.closest(kBuck.localNodeId, KBUCKET_SIZE).map(contact => contact.peer)
|
|
165
|
+
)
|
|
166
|
+
const addedPeers = newClosest.difference(kClosest)
|
|
167
|
+
const removedPeers = kClosest.difference(newClosest)
|
|
168
|
+
|
|
169
|
+
Promise.resolve()
|
|
170
|
+
.then(async () => {
|
|
171
|
+
for (const peer of addedPeers) {
|
|
172
|
+
await this.components.getPeerStore().tagPeer(peer, this.tagName, {
|
|
173
|
+
value: this.tagValue
|
|
174
|
+
})
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
for (const peer of removedPeers) {
|
|
178
|
+
await this.components.getPeerStore().unTagPeer(peer, this.tagName)
|
|
179
|
+
}
|
|
180
|
+
})
|
|
181
|
+
.catch(err => {
|
|
182
|
+
this.log.error('Could not update peer tags', err)
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
kClosest = newClosest
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
kBuck.on('added', () => {
|
|
189
|
+
updatePeerTags()
|
|
190
|
+
})
|
|
191
|
+
kBuck.on('removed', () => {
|
|
192
|
+
updatePeerTags()
|
|
193
|
+
})
|
|
194
|
+
}
|
|
195
|
+
|
|
126
196
|
/**
|
|
127
197
|
* Called on the `ping` event from `k-bucket` when a bucket is full
|
|
128
198
|
* and cannot split.
|
package/src/utils.ts
CHANGED
|
@@ -112,3 +112,12 @@ export function createPutRecord (key: Uint8Array, value: Uint8Array) {
|
|
|
112
112
|
|
|
113
113
|
return rec.serialize()
|
|
114
114
|
}
|
|
115
|
+
|
|
116
|
+
export function debounce (callback: () => void, wait: number = 100) {
|
|
117
|
+
let timeout: ReturnType<typeof setTimeout>
|
|
118
|
+
|
|
119
|
+
return () => {
|
|
120
|
+
clearTimeout(timeout)
|
|
121
|
+
timeout = setTimeout(() => callback(), wait)
|
|
122
|
+
}
|
|
123
|
+
}
|