@libp2p/kad-dht 13.1.2 → 14.0.0-0d326d102
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 +2 -2
- package/dist/src/constants.d.ts +1 -0
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +3 -0
- package/dist/src/constants.js.map +1 -1
- package/dist/src/index.d.ts +28 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/kad-dht.d.ts.map +1 -1
- package/dist/src/kad-dht.js +25 -11
- package/dist/src/kad-dht.js.map +1 -1
- package/dist/src/network.d.ts +1 -1
- package/dist/src/network.d.ts.map +1 -1
- package/dist/src/network.js +1 -3
- package/dist/src/network.js.map +1 -1
- package/dist/src/peer-distance-list.d.ts.map +1 -0
- package/dist/src/{peer-list/peer-distance-list.js → peer-distance-list.js} +1 -1
- package/dist/src/peer-distance-list.js.map +1 -0
- package/dist/src/peer-routing/index.js +1 -1
- package/dist/src/peer-routing/index.js.map +1 -1
- package/dist/src/query-self.d.ts.map +1 -1
- package/dist/src/query-self.js +13 -6
- package/dist/src/query-self.js.map +1 -1
- package/dist/src/routing-table/closest-peers.d.ts +43 -0
- package/dist/src/routing-table/closest-peers.d.ts.map +1 -0
- package/dist/src/routing-table/closest-peers.js +86 -0
- package/dist/src/routing-table/closest-peers.js.map +1 -0
- package/dist/src/routing-table/index.d.ts +55 -32
- package/dist/src/routing-table/index.d.ts.map +1 -1
- package/dist/src/routing-table/index.js +259 -161
- package/dist/src/routing-table/index.js.map +1 -1
- package/dist/src/routing-table/k-bucket.d.ts +65 -21
- package/dist/src/routing-table/k-bucket.d.ts.map +1 -1
- package/dist/src/routing-table/k-bucket.js +122 -66
- package/dist/src/routing-table/k-bucket.js.map +1 -1
- package/dist/src/routing-table/refresh.d.ts.map +1 -1
- package/dist/src/routing-table/refresh.js +4 -1
- package/dist/src/routing-table/refresh.js.map +1 -1
- package/dist/src/rpc/index.d.ts.map +1 -1
- package/dist/src/rpc/index.js +3 -7
- package/dist/src/rpc/index.js.map +1 -1
- package/package.json +11 -12
- package/src/constants.ts +5 -0
- package/src/index.ts +32 -6
- package/src/kad-dht.ts +29 -13
- package/src/network.ts +1 -4
- package/src/{peer-list/peer-distance-list.ts → peer-distance-list.ts} +1 -1
- package/src/peer-routing/index.ts +1 -1
- package/src/query-self.ts +14 -6
- package/src/routing-table/closest-peers.ts +113 -0
- package/src/routing-table/index.ts +300 -194
- package/src/routing-table/k-bucket.ts +194 -81
- package/src/routing-table/refresh.ts +5 -1
- package/src/rpc/index.ts +4 -7
- package/dist/src/peer-list/index.d.ts +0 -29
- package/dist/src/peer-list/index.d.ts.map +0 -1
- package/dist/src/peer-list/index.js +0 -45
- package/dist/src/peer-list/index.js.map +0 -1
- package/dist/src/peer-list/peer-distance-list.d.ts.map +0 -1
- package/dist/src/peer-list/peer-distance-list.js.map +0 -1
- package/dist/typedoc-urls.json +0 -56
- package/src/peer-list/index.ts +0 -54
- /package/dist/src/{peer-list/peer-distance-list.d.ts → peer-distance-list.d.ts} +0 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { PeerSet } from '@libp2p/peer-collections';
|
|
2
|
+
import { KEEP_ALIVE_TAG } from '../constants.js';
|
|
3
|
+
import { PeerDistanceList } from '../peer-distance-list.js';
|
|
4
|
+
import { convertPeerId } from '../utils.js';
|
|
5
|
+
export const PEER_SET_SIZE = 20;
|
|
6
|
+
export const REFRESH_INTERVAL = 5000;
|
|
7
|
+
export const KAD_CLOSE_TAG_NAME = 'kad-close';
|
|
8
|
+
export const KAD_CLOSE_TAG_VALUE = 50;
|
|
9
|
+
/**
|
|
10
|
+
* Contains a list of the kad-closest peers encountered on the network.
|
|
11
|
+
*
|
|
12
|
+
* Once every few seconds, if the list has changed, it tags the closest peers.
|
|
13
|
+
*/
|
|
14
|
+
export class ClosestPeers {
|
|
15
|
+
routingTable;
|
|
16
|
+
components;
|
|
17
|
+
closestPeers;
|
|
18
|
+
newPeers;
|
|
19
|
+
refreshInterval;
|
|
20
|
+
peerSetSize;
|
|
21
|
+
timeout;
|
|
22
|
+
closeTagName;
|
|
23
|
+
closeTagValue;
|
|
24
|
+
log;
|
|
25
|
+
constructor(components, init) {
|
|
26
|
+
this.components = components;
|
|
27
|
+
this.log = components.logger.forComponent(`${init.logPrefix}:routing-table`);
|
|
28
|
+
this.routingTable = init.routingTable;
|
|
29
|
+
this.refreshInterval = init.refreshInterval ?? REFRESH_INTERVAL;
|
|
30
|
+
this.peerSetSize = init.peerSetSize ?? PEER_SET_SIZE;
|
|
31
|
+
this.closeTagName = init.closeTagName ?? KAD_CLOSE_TAG_NAME;
|
|
32
|
+
this.closeTagValue = init.closeTagValue ?? KAD_CLOSE_TAG_VALUE;
|
|
33
|
+
this.closestPeers = new PeerSet();
|
|
34
|
+
this.onPeerPing = this.onPeerPing.bind(this);
|
|
35
|
+
}
|
|
36
|
+
async start() {
|
|
37
|
+
const targetKadId = await convertPeerId(this.components.peerId);
|
|
38
|
+
this.newPeers = new PeerDistanceList(targetKadId, this.peerSetSize);
|
|
39
|
+
this.routingTable.addEventListener('peer:ping', this.onPeerPing);
|
|
40
|
+
this.timeout = setInterval(() => {
|
|
41
|
+
this.updatePeerTags()
|
|
42
|
+
.catch(err => {
|
|
43
|
+
this.log.error('error updating peer tags - %e', err);
|
|
44
|
+
});
|
|
45
|
+
}, this.refreshInterval);
|
|
46
|
+
}
|
|
47
|
+
stop() {
|
|
48
|
+
this.routingTable.removeEventListener('peer:ping', this.onPeerPing);
|
|
49
|
+
clearTimeout(this.timeout);
|
|
50
|
+
}
|
|
51
|
+
onPeerPing(event) {
|
|
52
|
+
this.newPeers?.add({ id: event.detail, multiaddrs: [] })
|
|
53
|
+
.catch(err => {
|
|
54
|
+
this.log.error('error adding peer to distance list - %e', err);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async updatePeerTags() {
|
|
58
|
+
const newClosest = new PeerSet(this.newPeers?.peers.map(peer => peer.id));
|
|
59
|
+
const added = newClosest.difference(this.closestPeers);
|
|
60
|
+
const removed = this.closestPeers.difference(newClosest);
|
|
61
|
+
this.closestPeers = newClosest;
|
|
62
|
+
await Promise.all([
|
|
63
|
+
...[...added].map(async (peerId) => {
|
|
64
|
+
await this.components.peerStore.merge(peerId, {
|
|
65
|
+
tags: {
|
|
66
|
+
[this.closeTagName]: {
|
|
67
|
+
value: this.closeTagValue
|
|
68
|
+
},
|
|
69
|
+
[KEEP_ALIVE_TAG]: {
|
|
70
|
+
value: 1
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}),
|
|
75
|
+
...[...removed].map(async (peerId) => {
|
|
76
|
+
await this.components.peerStore.merge(peerId, {
|
|
77
|
+
tags: {
|
|
78
|
+
[this.closeTagName]: undefined,
|
|
79
|
+
[KEEP_ALIVE_TAG]: undefined
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
})
|
|
83
|
+
]);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=closest-peers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"closest-peers.js","sourceRoot":"","sources":["../../../src/routing-table/closest-peers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,65 +1,86 @@
|
|
|
1
1
|
import { TypedEventEmitter } from '@libp2p/interface';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import type {
|
|
5
|
-
import type {
|
|
6
|
-
|
|
7
|
-
export declare const KAD_CLOSE_TAG_VALUE = 50;
|
|
2
|
+
import { KBucket } from './k-bucket.js';
|
|
3
|
+
import type { Peer } from './k-bucket.js';
|
|
4
|
+
import type { Network } from '../network.js';
|
|
5
|
+
import type { AbortOptions, ComponentLogger, Metrics, PeerId, PeerStore, Startable } from '@libp2p/interface';
|
|
6
|
+
import type { AdaptiveTimeoutInit } from '@libp2p/utils/adaptive-timeout';
|
|
8
7
|
export declare const KBUCKET_SIZE = 20;
|
|
9
|
-
export declare const PREFIX_LENGTH =
|
|
10
|
-
export declare const
|
|
11
|
-
export declare const
|
|
8
|
+
export declare const PREFIX_LENGTH = 8;
|
|
9
|
+
export declare const PING_NEW_CONTACT_TIMEOUT = 2000;
|
|
10
|
+
export declare const PING_NEW_CONTACT_CONCURRENCY = 20;
|
|
11
|
+
export declare const PING_NEW_CONTACT_MAX_QUEUE_SIZE = 100;
|
|
12
|
+
export declare const PING_OLD_CONTACT_COUNT = 3;
|
|
13
|
+
export declare const PING_OLD_CONTACT_TIMEOUT = 2000;
|
|
14
|
+
export declare const PING_OLD_CONTACT_CONCURRENCY = 20;
|
|
15
|
+
export declare const PING_OLD_CONTACT_MAX_QUEUE_SIZE = 100;
|
|
16
|
+
export declare const KAD_PEER_TAG_NAME = "kad-peer";
|
|
17
|
+
export declare const KAD_PEER_TAG_VALUE = 1;
|
|
18
|
+
export declare const LAST_PING_THRESHOLD = 600000;
|
|
19
|
+
export declare const POPULATE_FROM_DATASTORE_ON_START = true;
|
|
20
|
+
export declare const POPULATE_FROM_DATASTORE_LIMIT = 1000;
|
|
12
21
|
export interface RoutingTableInit {
|
|
13
22
|
logPrefix: string;
|
|
14
23
|
protocol: string;
|
|
15
24
|
prefixLength?: number;
|
|
16
25
|
splitThreshold?: number;
|
|
17
26
|
kBucketSize?: number;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
27
|
+
pingNewContactTimeout?: AdaptiveTimeoutInit;
|
|
28
|
+
pingNewContactConcurrency?: number;
|
|
29
|
+
pingNewContactMaxQueueSize?: number;
|
|
30
|
+
pingOldContactTimeout?: AdaptiveTimeoutInit;
|
|
31
|
+
pingOldContactConcurrency?: number;
|
|
32
|
+
pingOldContactMaxQueueSize?: number;
|
|
33
|
+
numberOfOldContactsToPing?: number;
|
|
34
|
+
peerTagName?: string;
|
|
35
|
+
peerTagValue?: number;
|
|
36
|
+
closeTagName?: string;
|
|
37
|
+
closeTagValue?: number;
|
|
38
|
+
network: Network;
|
|
39
|
+
populateFromDatastoreOnStart?: boolean;
|
|
40
|
+
populateFromDatastoreLimit?: number;
|
|
41
|
+
lastPingThreshold?: number;
|
|
42
|
+
closestPeerSetSize?: number;
|
|
43
|
+
closestPeerSetRefreshInterval?: number;
|
|
22
44
|
}
|
|
23
45
|
export interface RoutingTableComponents {
|
|
24
46
|
peerId: PeerId;
|
|
25
47
|
peerStore: PeerStore;
|
|
26
|
-
connectionManager: ConnectionManager;
|
|
27
48
|
metrics?: Metrics;
|
|
28
49
|
logger: ComponentLogger;
|
|
29
50
|
}
|
|
30
51
|
export interface RoutingTableEvents {
|
|
31
52
|
'peer:add': CustomEvent<PeerId>;
|
|
32
53
|
'peer:remove': CustomEvent<PeerId>;
|
|
54
|
+
'peer:ping': CustomEvent<PeerId>;
|
|
33
55
|
}
|
|
34
56
|
/**
|
|
35
|
-
* A wrapper around `k-bucket`, to provide easy store and
|
|
36
|
-
* retrieval for peers.
|
|
57
|
+
* A wrapper around `k-bucket`, to provide easy store and retrieval for peers.
|
|
37
58
|
*/
|
|
38
59
|
export declare class RoutingTable extends TypedEventEmitter<RoutingTableEvents> implements Startable {
|
|
39
60
|
kBucketSize: number;
|
|
40
|
-
kb
|
|
41
|
-
|
|
61
|
+
kb: KBucket;
|
|
62
|
+
network: Network;
|
|
63
|
+
private readonly closestPeerTagger;
|
|
42
64
|
private readonly log;
|
|
43
65
|
private readonly components;
|
|
44
|
-
private readonly prefixLength;
|
|
45
|
-
private readonly splitThreshold;
|
|
46
|
-
private readonly pingTimeout;
|
|
47
|
-
private readonly pingConcurrency;
|
|
48
66
|
private running;
|
|
67
|
+
private readonly pingNewContactTimeout;
|
|
68
|
+
private readonly pingNewContactQueue;
|
|
69
|
+
private readonly pingOldContactTimeout;
|
|
70
|
+
private readonly pingOldContactQueue;
|
|
71
|
+
private readonly populateFromDatastoreOnStart;
|
|
72
|
+
private readonly populateFromDatastoreLimit;
|
|
49
73
|
private readonly protocol;
|
|
50
|
-
private readonly
|
|
51
|
-
private readonly
|
|
74
|
+
private readonly peerTagName;
|
|
75
|
+
private readonly peerTagValue;
|
|
52
76
|
private readonly metrics?;
|
|
53
77
|
constructor(components: RoutingTableComponents, init: RoutingTableInit);
|
|
54
78
|
isStarted(): boolean;
|
|
55
79
|
start(): Promise<void>;
|
|
80
|
+
afterStart(): Promise<void>;
|
|
56
81
|
stop(): Promise<void>;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
* - this will lower the chances that connections to them get closed when
|
|
60
|
-
* we reach connection limits
|
|
61
|
-
*/
|
|
62
|
-
_tagPeers(kBuck: KBucket): void;
|
|
82
|
+
private peerAdded;
|
|
83
|
+
private peerRemoved;
|
|
63
84
|
/**
|
|
64
85
|
* Called on the `ping` event from `k-bucket` when a bucket is full
|
|
65
86
|
* and cannot split.
|
|
@@ -70,7 +91,9 @@ export declare class RoutingTable extends TypedEventEmitter<RoutingTableEvents>
|
|
|
70
91
|
* `oldContacts` will not be empty and is the list of contacts that
|
|
71
92
|
* have not been contacted for the longest.
|
|
72
93
|
*/
|
|
73
|
-
|
|
94
|
+
pingOldContacts(oldContacts: Peer[], options?: AbortOptions): AsyncGenerator<Peer>;
|
|
95
|
+
verifyNewContact(contact: Peer, options?: AbortOptions): Promise<boolean>;
|
|
96
|
+
pingContact(contact: Peer, options?: AbortOptions): Promise<boolean>;
|
|
74
97
|
/**
|
|
75
98
|
* Amount of currently stored peers
|
|
76
99
|
*/
|
|
@@ -90,7 +113,7 @@ export declare class RoutingTable extends TypedEventEmitter<RoutingTableEvents>
|
|
|
90
113
|
/**
|
|
91
114
|
* Add or update the routing table with the given peer
|
|
92
115
|
*/
|
|
93
|
-
add(peerId: PeerId): Promise<void>;
|
|
116
|
+
add(peerId: PeerId, options?: AbortOptions): Promise<void>;
|
|
94
117
|
/**
|
|
95
118
|
* Remove a given peer from the table
|
|
96
119
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routing-table/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routing-table/index.ts"],"names":[],"mappings":"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"}
|