@libp2p/kad-dht 13.1.2-b4f02a637 → 14.0.0-0d326d102
Sign up to get free protection for your applications and to get access to all the features.
- 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 +26 -2
- 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 -13
- 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 +54 -32
- package/dist/src/routing-table/index.d.ts.map +1 -1
- package/dist/src/routing-table/index.js +256 -172
- 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 +30 -2
- package/src/kad-dht.ts +29 -15
- 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 +296 -205
- 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/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,66 +1,86 @@
|
|
1
1
|
import { TypedEventEmitter } from '@libp2p/interface';
|
2
|
-
import {
|
3
|
-
import {
|
4
|
-
import type {
|
5
|
-
import type {
|
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
6
|
import type { AdaptiveTimeoutInit } from '@libp2p/utils/adaptive-timeout';
|
7
|
-
export declare const KAD_CLOSE_TAG_NAME = "kad-close";
|
8
|
-
export declare const KAD_CLOSE_TAG_VALUE = 50;
|
9
7
|
export declare const KBUCKET_SIZE = 20;
|
10
|
-
export declare const PREFIX_LENGTH =
|
11
|
-
export declare const
|
12
|
-
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;
|
13
21
|
export interface RoutingTableInit {
|
14
22
|
logPrefix: string;
|
15
23
|
protocol: string;
|
16
24
|
prefixLength?: number;
|
17
25
|
splitThreshold?: number;
|
18
26
|
kBucketSize?: number;
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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;
|
23
44
|
}
|
24
45
|
export interface RoutingTableComponents {
|
25
46
|
peerId: PeerId;
|
26
47
|
peerStore: PeerStore;
|
27
|
-
connectionManager: ConnectionManager;
|
28
48
|
metrics?: Metrics;
|
29
49
|
logger: ComponentLogger;
|
30
50
|
}
|
31
51
|
export interface RoutingTableEvents {
|
32
52
|
'peer:add': CustomEvent<PeerId>;
|
33
53
|
'peer:remove': CustomEvent<PeerId>;
|
54
|
+
'peer:ping': CustomEvent<PeerId>;
|
34
55
|
}
|
35
56
|
/**
|
36
|
-
* A wrapper around `k-bucket`, to provide easy store and
|
37
|
-
* retrieval for peers.
|
57
|
+
* A wrapper around `k-bucket`, to provide easy store and retrieval for peers.
|
38
58
|
*/
|
39
59
|
export declare class RoutingTable extends TypedEventEmitter<RoutingTableEvents> implements Startable {
|
40
60
|
kBucketSize: number;
|
41
|
-
kb
|
42
|
-
|
61
|
+
kb: KBucket;
|
62
|
+
network: Network;
|
63
|
+
private readonly closestPeerTagger;
|
43
64
|
private readonly log;
|
44
65
|
private readonly components;
|
45
|
-
private readonly prefixLength;
|
46
|
-
private readonly splitThreshold;
|
47
|
-
private readonly pingTimeout;
|
48
|
-
private readonly pingConcurrency;
|
49
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;
|
50
73
|
private readonly protocol;
|
51
|
-
private readonly
|
52
|
-
private readonly
|
74
|
+
private readonly peerTagName;
|
75
|
+
private readonly peerTagValue;
|
53
76
|
private readonly metrics?;
|
54
77
|
constructor(components: RoutingTableComponents, init: RoutingTableInit);
|
55
78
|
isStarted(): boolean;
|
56
79
|
start(): Promise<void>;
|
80
|
+
afterStart(): Promise<void>;
|
57
81
|
stop(): Promise<void>;
|
58
|
-
|
59
|
-
|
60
|
-
* - this will lower the chances that connections to them get closed when
|
61
|
-
* we reach connection limits
|
62
|
-
*/
|
63
|
-
_tagPeers(kBuck: KBucket): void;
|
82
|
+
private peerAdded;
|
83
|
+
private peerRemoved;
|
64
84
|
/**
|
65
85
|
* Called on the `ping` event from `k-bucket` when a bucket is full
|
66
86
|
* and cannot split.
|
@@ -71,7 +91,9 @@ export declare class RoutingTable extends TypedEventEmitter<RoutingTableEvents>
|
|
71
91
|
* `oldContacts` will not be empty and is the list of contacts that
|
72
92
|
* have not been contacted for the longest.
|
73
93
|
*/
|
74
|
-
|
94
|
+
pingOldContacts(oldContacts: Peer[], options?: AbortOptions): AsyncGenerator<Peer>;
|
95
|
+
verifyNewContact(contact: Peer, options?: AbortOptions): Promise<boolean>;
|
96
|
+
pingContact(contact: Peer, options?: AbortOptions): Promise<boolean>;
|
75
97
|
/**
|
76
98
|
* Amount of currently stored peers
|
77
99
|
*/
|
@@ -91,7 +113,7 @@ export declare class RoutingTable extends TypedEventEmitter<RoutingTableEvents>
|
|
91
113
|
/**
|
92
114
|
* Add or update the routing table with the given peer
|
93
115
|
*/
|
94
|
-
add(peerId: PeerId): Promise<void>;
|
116
|
+
add(peerId: PeerId, options?: AbortOptions): Promise<void>;
|
95
117
|
/**
|
96
118
|
* Remove a given peer from the table
|
97
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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"}
|