@libp2p/kad-dht 12.0.15 → 12.0.16
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.map +1 -1
- package/dist/src/constants.js +1 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/content-routing/index.d.ts.map +1 -1
- package/dist/src/content-routing/index.js +3 -2
- package/dist/src/content-routing/index.js.map +1 -1
- package/dist/src/index.d.ts +34 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/network.d.ts +3 -0
- package/dist/src/network.d.ts.map +1 -1
- package/dist/src/network.js +33 -8
- package/dist/src/network.js.map +1 -1
- package/dist/src/peer-list/peer-distance-list.d.ts +13 -4
- package/dist/src/peer-list/peer-distance-list.d.ts.map +1 -1
- package/dist/src/peer-list/peer-distance-list.js +29 -21
- package/dist/src/peer-list/peer-distance-list.js.map +1 -1
- package/dist/src/peer-routing/index.d.ts +5 -5
- package/dist/src/peer-routing/index.d.ts.map +1 -1
- package/dist/src/peer-routing/index.js +15 -24
- package/dist/src/peer-routing/index.js.map +1 -1
- package/dist/src/query/manager.d.ts +3 -0
- package/dist/src/query/manager.d.ts.map +1 -1
- package/dist/src/query/manager.js +14 -5
- package/dist/src/query/manager.js.map +1 -1
- package/dist/src/query/query-path.d.ts +6 -6
- package/dist/src/query/query-path.d.ts.map +1 -1
- package/dist/src/query/query-path.js +32 -20
- package/dist/src/query/query-path.js.map +1 -1
- package/dist/src/routing-table/index.d.ts +11 -5
- package/dist/src/routing-table/index.d.ts.map +1 -1
- package/dist/src/routing-table/index.js +84 -42
- package/dist/src/routing-table/index.js.map +1 -1
- package/dist/src/routing-table/k-bucket.d.ts +80 -115
- package/dist/src/routing-table/k-bucket.d.ts.map +1 -1
- package/dist/src/routing-table/k-bucket.js +165 -311
- 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 +9 -4
- package/dist/src/routing-table/refresh.js.map +1 -1
- package/package.json +8 -10
- package/src/constants.ts +1 -1
- package/src/content-routing/index.ts +3 -2
- package/src/index.ts +37 -1
- package/src/network.ts +38 -9
- package/src/peer-list/peer-distance-list.ts +36 -25
- package/src/peer-routing/index.ts +19 -28
- package/src/query/manager.ts +18 -5
- package/src/query/query-path.ts +46 -30
- package/src/routing-table/index.ts +100 -46
- package/src/routing-table/k-bucket.ts +214 -359
- package/src/routing-table/refresh.ts +10 -4
- package/dist/src/query/utils.d.ts +0 -6
- package/dist/src/query/utils.d.ts.map +0 -1
- package/dist/src/query/utils.js +0 -53
- package/dist/src/query/utils.js.map +0 -1
- package/src/query/utils.ts +0 -64
|
@@ -4,10 +4,11 @@ import { PeerQueue } from '@libp2p/utils/peer-queue';
|
|
|
4
4
|
import { pbStream } from 'it-protobuf-stream';
|
|
5
5
|
import { Message, MessageType } from '../message/dht.js';
|
|
6
6
|
import * as utils from '../utils.js';
|
|
7
|
-
import { KBucket } from './k-bucket.js';
|
|
7
|
+
import { KBucket, isLeafBucket } from './k-bucket.js';
|
|
8
8
|
export const KAD_CLOSE_TAG_NAME = 'kad-close';
|
|
9
9
|
export const KAD_CLOSE_TAG_VALUE = 50;
|
|
10
10
|
export const KBUCKET_SIZE = 20;
|
|
11
|
+
export const PREFIX_LENGTH = 32;
|
|
11
12
|
export const PING_TIMEOUT = 10000;
|
|
12
13
|
export const PING_CONCURRENCY = 10;
|
|
13
14
|
/**
|
|
@@ -20,6 +21,8 @@ export class RoutingTable extends TypedEventEmitter {
|
|
|
20
21
|
pingQueue;
|
|
21
22
|
log;
|
|
22
23
|
components;
|
|
24
|
+
prefixLength;
|
|
25
|
+
splitThreshold;
|
|
23
26
|
pingTimeout;
|
|
24
27
|
pingConcurrency;
|
|
25
28
|
running;
|
|
@@ -29,19 +32,20 @@ export class RoutingTable extends TypedEventEmitter {
|
|
|
29
32
|
metrics;
|
|
30
33
|
constructor(components, init) {
|
|
31
34
|
super();
|
|
32
|
-
const { kBucketSize, pingTimeout, logPrefix, pingConcurrency, protocol, tagName, tagValue } = init;
|
|
33
35
|
this.components = components;
|
|
34
|
-
this.log = components.logger.forComponent(`${logPrefix}:routing-table`);
|
|
35
|
-
this.kBucketSize = kBucketSize ?? KBUCKET_SIZE;
|
|
36
|
-
this.pingTimeout = pingTimeout ?? PING_TIMEOUT;
|
|
37
|
-
this.pingConcurrency = pingConcurrency ?? PING_CONCURRENCY;
|
|
36
|
+
this.log = components.logger.forComponent(`${init.logPrefix}:routing-table`);
|
|
37
|
+
this.kBucketSize = init.kBucketSize ?? KBUCKET_SIZE;
|
|
38
|
+
this.pingTimeout = init.pingTimeout ?? PING_TIMEOUT;
|
|
39
|
+
this.pingConcurrency = init.pingConcurrency ?? PING_CONCURRENCY;
|
|
38
40
|
this.running = false;
|
|
39
|
-
this.protocol = protocol;
|
|
40
|
-
this.tagName = tagName ?? KAD_CLOSE_TAG_NAME;
|
|
41
|
-
this.tagValue = tagValue ?? KAD_CLOSE_TAG_VALUE;
|
|
41
|
+
this.protocol = init.protocol;
|
|
42
|
+
this.tagName = init.tagName ?? KAD_CLOSE_TAG_NAME;
|
|
43
|
+
this.tagValue = init.tagValue ?? KAD_CLOSE_TAG_VALUE;
|
|
44
|
+
this.prefixLength = init.prefixLength ?? PREFIX_LENGTH;
|
|
45
|
+
this.splitThreshold = init.splitThreshold ?? KBUCKET_SIZE;
|
|
42
46
|
this.pingQueue = new PeerQueue({
|
|
43
47
|
concurrency: this.pingConcurrency,
|
|
44
|
-
metricName: `${logPrefix.replaceAll(':', '_')}_ping_queue`,
|
|
48
|
+
metricName: `${init.logPrefix.replaceAll(':', '_')}_ping_queue`,
|
|
45
49
|
metrics: this.components.metrics
|
|
46
50
|
});
|
|
47
51
|
this.pingQueue.addEventListener('error', evt => {
|
|
@@ -49,7 +53,10 @@ export class RoutingTable extends TypedEventEmitter {
|
|
|
49
53
|
});
|
|
50
54
|
if (this.components.metrics != null) {
|
|
51
55
|
this.metrics = {
|
|
52
|
-
routingTableSize: this.components.metrics.registerMetric(`${logPrefix.replaceAll(':', '_')}_routing_table_size`)
|
|
56
|
+
routingTableSize: this.components.metrics.registerMetric(`${init.logPrefix.replaceAll(':', '_')}_routing_table_size`),
|
|
57
|
+
routingTableKadBucketTotal: this.components.metrics.registerMetric(`${init.logPrefix.replaceAll(':', '_')}_routing_table_kad_bucket_total`),
|
|
58
|
+
routingTableKadBucketAverageOccupancy: this.components.metrics.registerMetric(`${init.logPrefix.replaceAll(':', '_')}_routing_table_kad_bucket_average_occupancy`),
|
|
59
|
+
routingTableKadBucketMaxDepth: this.components.metrics.registerMetric(`${init.logPrefix.replaceAll(':', '_')}_routing_table_kad_bucket_max_depth`)
|
|
53
60
|
};
|
|
54
61
|
}
|
|
55
62
|
}
|
|
@@ -59,8 +66,13 @@ export class RoutingTable extends TypedEventEmitter {
|
|
|
59
66
|
async start() {
|
|
60
67
|
this.running = true;
|
|
61
68
|
const kBuck = new KBucket({
|
|
62
|
-
|
|
63
|
-
|
|
69
|
+
localPeer: {
|
|
70
|
+
kadId: await utils.convertPeerId(this.components.peerId),
|
|
71
|
+
peerId: this.components.peerId
|
|
72
|
+
},
|
|
73
|
+
kBucketSize: this.kBucketSize,
|
|
74
|
+
prefixLength: this.prefixLength,
|
|
75
|
+
splitThreshold: this.splitThreshold,
|
|
64
76
|
numberOfNodesToPing: 1
|
|
65
77
|
});
|
|
66
78
|
this.kb = kBuck;
|
|
@@ -70,6 +82,16 @@ export class RoutingTable extends TypedEventEmitter {
|
|
|
70
82
|
this.log.error('could not process k-bucket ping event', err);
|
|
71
83
|
});
|
|
72
84
|
});
|
|
85
|
+
let peerStorePeers = 0;
|
|
86
|
+
// add existing peers from the peer store to routing table
|
|
87
|
+
for (const peer of await this.components.peerStore.all()) {
|
|
88
|
+
if (peer.protocols.includes(this.protocol)) {
|
|
89
|
+
const id = await utils.convertPeerId(peer.id);
|
|
90
|
+
this.kb.add({ kadId: id, peerId: peer.id });
|
|
91
|
+
peerStorePeers++;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
this.log('added %d peer store peers to the routing table', peerStorePeers);
|
|
73
95
|
// tag kad-close peers
|
|
74
96
|
this._tagPeers(kBuck);
|
|
75
97
|
}
|
|
@@ -86,7 +108,7 @@ export class RoutingTable extends TypedEventEmitter {
|
|
|
86
108
|
_tagPeers(kBuck) {
|
|
87
109
|
let kClosest = new PeerSet();
|
|
88
110
|
const updatePeerTags = utils.debounce(() => {
|
|
89
|
-
const newClosest = new PeerSet(kBuck.closest(kBuck.
|
|
111
|
+
const newClosest = new PeerSet(kBuck.closest(kBuck.localPeer.kadId, KBUCKET_SIZE));
|
|
90
112
|
const addedPeers = newClosest.difference(kClosest);
|
|
91
113
|
const removedPeers = kClosest.difference(newClosest);
|
|
92
114
|
Promise.resolve()
|
|
@@ -115,11 +137,11 @@ export class RoutingTable extends TypedEventEmitter {
|
|
|
115
137
|
});
|
|
116
138
|
kBuck.addEventListener('added', (evt) => {
|
|
117
139
|
updatePeerTags();
|
|
118
|
-
this.safeDispatchEvent('peer:add', { detail: evt.detail.
|
|
140
|
+
this.safeDispatchEvent('peer:add', { detail: evt.detail.peerId });
|
|
119
141
|
});
|
|
120
142
|
kBuck.addEventListener('removed', (evt) => {
|
|
121
143
|
updatePeerTags();
|
|
122
|
-
this.safeDispatchEvent('peer:remove', { detail: evt.detail.
|
|
144
|
+
this.safeDispatchEvent('peer:remove', { detail: evt.detail.peerId });
|
|
123
145
|
});
|
|
124
146
|
}
|
|
125
147
|
/**
|
|
@@ -139,7 +161,7 @@ export class RoutingTable extends TypedEventEmitter {
|
|
|
139
161
|
const { oldContacts, newContact } = evt.detail;
|
|
140
162
|
const results = await Promise.all(oldContacts.map(async (oldContact) => {
|
|
141
163
|
// if a previous ping wants us to ping this contact, re-use the result
|
|
142
|
-
const pingJob = this.pingQueue.find(oldContact.
|
|
164
|
+
const pingJob = this.pingQueue.find(oldContact.peerId);
|
|
143
165
|
if (pingJob != null) {
|
|
144
166
|
return pingJob.join();
|
|
145
167
|
}
|
|
@@ -149,8 +171,8 @@ export class RoutingTable extends TypedEventEmitter {
|
|
|
149
171
|
const options = {
|
|
150
172
|
signal: AbortSignal.timeout(this.pingTimeout)
|
|
151
173
|
};
|
|
152
|
-
this.log('pinging old contact %p', oldContact.
|
|
153
|
-
const connection = await this.components.connectionManager.openConnection(oldContact.
|
|
174
|
+
this.log('pinging old contact %p', oldContact.peerId);
|
|
175
|
+
const connection = await this.components.connectionManager.openConnection(oldContact.peerId, options);
|
|
154
176
|
stream = await connection.newStream(this.protocol, options);
|
|
155
177
|
const pb = pbStream(stream);
|
|
156
178
|
await pb.write({
|
|
@@ -167,9 +189,9 @@ export class RoutingTable extends TypedEventEmitter {
|
|
|
167
189
|
if (this.running && this.kb != null) {
|
|
168
190
|
// only evict peers if we are still running, otherwise we evict
|
|
169
191
|
// when dialing is cancelled due to shutdown in progress
|
|
170
|
-
this.log.error('could not ping peer %p', oldContact.
|
|
171
|
-
this.log('evicting old contact after ping failed %p', oldContact.
|
|
172
|
-
this.kb.remove(oldContact.
|
|
192
|
+
this.log.error('could not ping peer %p', oldContact.peerId, err);
|
|
193
|
+
this.log('evicting old contact after ping failed %p', oldContact.peerId);
|
|
194
|
+
this.kb.remove(oldContact.kadId);
|
|
173
195
|
}
|
|
174
196
|
stream?.abort(err);
|
|
175
197
|
return false;
|
|
@@ -178,14 +200,14 @@ export class RoutingTable extends TypedEventEmitter {
|
|
|
178
200
|
this.metrics?.routingTableSize.update(this.size);
|
|
179
201
|
}
|
|
180
202
|
}, {
|
|
181
|
-
peerId: oldContact.
|
|
203
|
+
peerId: oldContact.peerId
|
|
182
204
|
});
|
|
183
205
|
}));
|
|
184
206
|
const responded = results
|
|
185
207
|
.filter(res => res)
|
|
186
208
|
.length;
|
|
187
209
|
if (this.running && responded < oldContacts.length && this.kb != null) {
|
|
188
|
-
this.log('adding new contact %p', newContact.
|
|
210
|
+
this.log('adding new contact %p', newContact.peerId);
|
|
189
211
|
this.kb.add(newContact);
|
|
190
212
|
}
|
|
191
213
|
}
|
|
@@ -204,43 +226,38 @@ export class RoutingTable extends TypedEventEmitter {
|
|
|
204
226
|
*/
|
|
205
227
|
async find(peer) {
|
|
206
228
|
const key = await utils.convertPeerId(peer);
|
|
207
|
-
|
|
208
|
-
if (closest != null && peer.equals(closest)) {
|
|
209
|
-
return closest;
|
|
210
|
-
}
|
|
211
|
-
return undefined;
|
|
229
|
+
return this.kb?.get(key)?.peerId;
|
|
212
230
|
}
|
|
213
231
|
/**
|
|
214
|
-
* Retrieve the closest peers to the given
|
|
232
|
+
* Retrieve the closest peers to the given kadId
|
|
215
233
|
*/
|
|
216
|
-
closestPeer(
|
|
217
|
-
const res = this.closestPeers(
|
|
234
|
+
closestPeer(kadId) {
|
|
235
|
+
const res = this.closestPeers(kadId, 1);
|
|
218
236
|
if (res.length > 0) {
|
|
219
237
|
return res[0];
|
|
220
238
|
}
|
|
221
239
|
return undefined;
|
|
222
240
|
}
|
|
223
241
|
/**
|
|
224
|
-
* Retrieve the `count`-closest peers to the given
|
|
242
|
+
* Retrieve the `count`-closest peers to the given kadId
|
|
225
243
|
*/
|
|
226
|
-
closestPeers(
|
|
244
|
+
closestPeers(kadId, count = this.kBucketSize) {
|
|
227
245
|
if (this.kb == null) {
|
|
228
246
|
return [];
|
|
229
247
|
}
|
|
230
|
-
|
|
231
|
-
return closest.map(p => p.peer);
|
|
248
|
+
return [...this.kb.closest(kadId, count)];
|
|
232
249
|
}
|
|
233
250
|
/**
|
|
234
251
|
* Add or update the routing table with the given peer
|
|
235
252
|
*/
|
|
236
|
-
async add(
|
|
253
|
+
async add(peerId) {
|
|
237
254
|
if (this.kb == null) {
|
|
238
255
|
throw new Error('RoutingTable is not started');
|
|
239
256
|
}
|
|
240
|
-
const
|
|
241
|
-
this.kb.add({
|
|
242
|
-
this.log('added %p with kad id %b',
|
|
243
|
-
this.
|
|
257
|
+
const kadId = await utils.convertPeerId(peerId);
|
|
258
|
+
this.kb.add({ kadId, peerId });
|
|
259
|
+
this.log('added %p with kad id %b', peerId, kadId);
|
|
260
|
+
this.updateMetrics();
|
|
244
261
|
}
|
|
245
262
|
/**
|
|
246
263
|
* Remove a given peer from the table
|
|
@@ -251,7 +268,32 @@ export class RoutingTable extends TypedEventEmitter {
|
|
|
251
268
|
}
|
|
252
269
|
const id = await utils.convertPeerId(peer);
|
|
253
270
|
this.kb.remove(id);
|
|
254
|
-
this.
|
|
271
|
+
this.updateMetrics();
|
|
272
|
+
}
|
|
273
|
+
updateMetrics() {
|
|
274
|
+
if (this.metrics == null || this.kb == null) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
let size = 0;
|
|
278
|
+
let buckets = 0;
|
|
279
|
+
let maxDepth = 0;
|
|
280
|
+
function count(bucket) {
|
|
281
|
+
if (isLeafBucket(bucket)) {
|
|
282
|
+
if (bucket.depth > maxDepth) {
|
|
283
|
+
maxDepth = bucket.depth;
|
|
284
|
+
}
|
|
285
|
+
buckets++;
|
|
286
|
+
size += bucket.peers.length;
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
count(bucket.left);
|
|
290
|
+
count(bucket.right);
|
|
291
|
+
}
|
|
292
|
+
count(this.kb.root);
|
|
293
|
+
this.metrics.routingTableSize.update(size);
|
|
294
|
+
this.metrics.routingTableKadBucketTotal.update(buckets);
|
|
295
|
+
this.metrics.routingTableKadBucketAverageOccupancy.update(Math.round(size / buckets));
|
|
296
|
+
this.metrics.routingTableKadBucketMaxDepth.update(maxDepth);
|
|
255
297
|
}
|
|
256
298
|
}
|
|
257
299
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routing-table/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,KAAK,KAAK,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routing-table/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,186 +1,151 @@
|
|
|
1
1
|
import { TypedEventEmitter } from '@libp2p/interface';
|
|
2
2
|
import type { PeerId } from '@libp2p/interface';
|
|
3
3
|
export interface PingEventDetails {
|
|
4
|
-
oldContacts:
|
|
5
|
-
newContact:
|
|
6
|
-
}
|
|
7
|
-
export interface UpdatedEventDetails {
|
|
8
|
-
incumbent: Contact;
|
|
9
|
-
selection: Contact;
|
|
4
|
+
oldContacts: Peer[];
|
|
5
|
+
newContact: Peer;
|
|
10
6
|
}
|
|
11
7
|
export interface KBucketEvents {
|
|
12
8
|
'ping': CustomEvent<PingEventDetails>;
|
|
13
|
-
'added': CustomEvent<
|
|
14
|
-
'removed': CustomEvent<
|
|
15
|
-
'updated': CustomEvent<UpdatedEventDetails>;
|
|
9
|
+
'added': CustomEvent<Peer>;
|
|
10
|
+
'removed': CustomEvent<Peer>;
|
|
16
11
|
}
|
|
17
12
|
export interface KBucketOptions {
|
|
18
13
|
/**
|
|
19
|
-
*
|
|
14
|
+
* The current peer. All subsequently added peers must have a KadID that is
|
|
15
|
+
* the same length as this peer.
|
|
20
16
|
*/
|
|
21
|
-
|
|
17
|
+
localPeer: Peer;
|
|
22
18
|
/**
|
|
23
|
-
*
|
|
19
|
+
* How many bits of the key to use when forming the bucket trie. The larger
|
|
20
|
+
* this value, the deeper the tree will grow and the slower the lookups will
|
|
21
|
+
* be but the peers returned will be more specific to the key.
|
|
24
22
|
*/
|
|
25
|
-
|
|
23
|
+
prefixLength: number;
|
|
26
24
|
/**
|
|
27
|
-
* The number of nodes
|
|
28
|
-
* full.
|
|
29
|
-
*
|
|
25
|
+
* The number of nodes that a max-depth k-bucket can contain before being
|
|
26
|
+
* full.
|
|
27
|
+
*
|
|
28
|
+
* @default 20
|
|
30
29
|
*/
|
|
31
|
-
|
|
30
|
+
kBucketSize?: number;
|
|
32
31
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
32
|
+
* The number of nodes that an intermediate k-bucket can contain before being
|
|
33
|
+
* split.
|
|
34
|
+
*
|
|
35
|
+
* @default kBucketSize
|
|
35
36
|
*/
|
|
36
|
-
|
|
37
|
+
splitThreshold?: number;
|
|
37
38
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
39
|
+
* The number of nodes to ping when a bucket that should not be split becomes
|
|
40
|
+
* full. KBucket will emit a `ping` event that contains `numberOfNodesToPing`
|
|
41
|
+
* nodes that have not been contacted the longest.
|
|
41
42
|
*/
|
|
42
|
-
|
|
43
|
+
numberOfNodesToPing?: number;
|
|
43
44
|
}
|
|
44
|
-
export interface
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
vectorClock?: number;
|
|
45
|
+
export interface Peer {
|
|
46
|
+
kadId: Uint8Array;
|
|
47
|
+
peerId: PeerId;
|
|
48
48
|
}
|
|
49
|
-
export interface
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
export interface LeafBucket {
|
|
50
|
+
prefix: string;
|
|
51
|
+
depth: number;
|
|
52
|
+
peers: Peer[];
|
|
53
|
+
}
|
|
54
|
+
export interface InternalBucket {
|
|
55
|
+
prefix: string;
|
|
56
|
+
depth: number;
|
|
53
57
|
left: Bucket;
|
|
54
58
|
right: Bucket;
|
|
55
59
|
}
|
|
60
|
+
export type Bucket = LeafBucket | InternalBucket;
|
|
61
|
+
export declare function isLeafBucket(obj: any): obj is LeafBucket;
|
|
56
62
|
/**
|
|
57
|
-
* Implementation of a Kademlia DHT
|
|
58
|
-
*
|
|
63
|
+
* Implementation of a Kademlia DHT routing table as a prefix binary trie with
|
|
64
|
+
* configurable prefix length, bucket split threshold and size.
|
|
59
65
|
*/
|
|
60
66
|
export declare class KBucket extends TypedEventEmitter<KBucketEvents> {
|
|
61
|
-
localNodeId: Uint8Array;
|
|
62
67
|
root: Bucket;
|
|
63
|
-
|
|
68
|
+
localPeer: Peer;
|
|
69
|
+
private readonly prefixLength;
|
|
70
|
+
private readonly splitThreshold;
|
|
71
|
+
private readonly kBucketSize;
|
|
64
72
|
private readonly numberOfNodesToPing;
|
|
65
|
-
private readonly distance;
|
|
66
|
-
private readonly arbiter;
|
|
67
73
|
constructor(options: KBucketOptions);
|
|
68
|
-
/**
|
|
69
|
-
* Default arbiter function for contacts with the same id. Uses
|
|
70
|
-
* contact.vectorClock to select which contact to update the k-bucket with.
|
|
71
|
-
* Contact with larger vectorClock field will be selected. If vectorClock is
|
|
72
|
-
* the same, candidate will be selected.
|
|
73
|
-
*
|
|
74
|
-
* @param {object} incumbent - Contact currently stored in the k-bucket.
|
|
75
|
-
* @param {object} candidate - Contact being added to the k-bucket.
|
|
76
|
-
* @returns {object} Contact to updated the k-bucket with.
|
|
77
|
-
*/
|
|
78
|
-
static arbiter(incumbent: Contact, candidate: Contact): Contact;
|
|
79
|
-
/**
|
|
80
|
-
* Default distance function. Finds the XOR
|
|
81
|
-
* distance between firstId and secondId.
|
|
82
|
-
*
|
|
83
|
-
* @param {Uint8Array} firstId - Uint8Array containing first id.
|
|
84
|
-
* @param {Uint8Array} secondId - Uint8Array containing second id.
|
|
85
|
-
* @returns {number} Integer The XOR distance between firstId and secondId.
|
|
86
|
-
*/
|
|
87
|
-
static distance(firstId: Uint8Array, secondId: Uint8Array): number;
|
|
88
74
|
/**
|
|
89
75
|
* Adds a contact to the k-bucket.
|
|
90
76
|
*
|
|
91
|
-
* @param {
|
|
77
|
+
* @param {Peer} peer - the contact object to add
|
|
92
78
|
*/
|
|
93
|
-
add(
|
|
79
|
+
add(peer: Peer): void;
|
|
94
80
|
/**
|
|
95
|
-
* Get
|
|
81
|
+
* Get 0-n closest contacts to the provided node id. "Closest" here means:
|
|
96
82
|
* closest according to the XOR metric of the contact node id.
|
|
97
83
|
*
|
|
98
84
|
* @param {Uint8Array} id - Contact node id
|
|
99
|
-
* @
|
|
100
|
-
* @returns {Array} Array Maximum of n closest contacts to the node id
|
|
85
|
+
* @returns {Generator<Peer, void, undefined>} Array Maximum of n closest contacts to the node id
|
|
101
86
|
*/
|
|
102
|
-
closest(id: Uint8Array, n?: number):
|
|
87
|
+
closest(id: Uint8Array, n?: number): Generator<PeerId, void, undefined>;
|
|
103
88
|
/**
|
|
104
89
|
* Counts the total number of contacts in the tree.
|
|
105
90
|
*
|
|
106
91
|
* @returns {number} The number of contacts held in the tree
|
|
107
92
|
*/
|
|
108
93
|
count(): number;
|
|
109
|
-
/**
|
|
110
|
-
* Determines whether the id at the bitIndex is 0 or 1.
|
|
111
|
-
* Return left leaf if `id` at `bitIndex` is 0, right leaf otherwise
|
|
112
|
-
*
|
|
113
|
-
* @param {object} node - internal object that has 2 leafs: left and right
|
|
114
|
-
* @param {Uint8Array} id - Id to compare localNodeId with.
|
|
115
|
-
* @param {number} bitIndex - Integer (Default: 0) The bit index to which bit to check in the id Uint8Array.
|
|
116
|
-
* @returns {object} left leaf if id at bitIndex is 0, right leaf otherwise.
|
|
117
|
-
*/
|
|
118
|
-
_determineNode(node: any, id: Uint8Array, bitIndex: number): Bucket;
|
|
119
94
|
/**
|
|
120
95
|
* Get a contact by its exact ID.
|
|
121
96
|
* If this is a leaf, loop through the bucket contents and return the correct
|
|
122
97
|
* contact if we have it or null if not. If this is an inner node, determine
|
|
123
98
|
* which branch of the tree to traverse and repeat.
|
|
124
99
|
*
|
|
125
|
-
* @param {Uint8Array}
|
|
126
|
-
* @returns {object |
|
|
100
|
+
* @param {Uint8Array} kadId - The ID of the contact to fetch.
|
|
101
|
+
* @returns {object | undefined} The contact if available, otherwise null
|
|
127
102
|
*/
|
|
128
|
-
get(
|
|
103
|
+
get(kadId: Uint8Array): Peer | undefined;
|
|
129
104
|
/**
|
|
130
|
-
*
|
|
131
|
-
* id if it exists, returns -1 otherwise.
|
|
105
|
+
* Removes contact with the provided id.
|
|
132
106
|
*
|
|
133
|
-
* @param {
|
|
134
|
-
* @param {Uint8Array} id - Contact node id.
|
|
135
|
-
* @returns {number} Integer Index of contact with provided id if it exists, -1 otherwise.
|
|
107
|
+
* @param {Uint8Array} kadId - The ID of the contact to remove
|
|
136
108
|
*/
|
|
137
|
-
|
|
109
|
+
remove(kadId: Uint8Array): void;
|
|
138
110
|
/**
|
|
139
|
-
*
|
|
111
|
+
* Similar to `toArray()` but instead of buffering everything up into an
|
|
112
|
+
* array before returning it, yields contacts as they are encountered while
|
|
113
|
+
* walking the tree.
|
|
140
114
|
*
|
|
141
|
-
* @
|
|
142
|
-
* @returns {object} The k-bucket itself
|
|
115
|
+
* @returns {Iterable} All of the contacts in the tree, as an iterable
|
|
143
116
|
*/
|
|
144
|
-
|
|
117
|
+
toIterable(): Generator<Peer, void, undefined>;
|
|
145
118
|
/**
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
* setting this.root.contacts = null
|
|
119
|
+
* Default distance function. Finds the XOR distance between firstId and
|
|
120
|
+
* secondId.
|
|
149
121
|
*
|
|
150
|
-
* @param
|
|
151
|
-
* @param
|
|
122
|
+
* @param {Uint8Array} firstId - Uint8Array containing first id.
|
|
123
|
+
* @param {Uint8Array} secondId - Uint8Array containing second id.
|
|
124
|
+
* @returns {number} Integer The XOR distance between firstId and secondId.
|
|
152
125
|
*/
|
|
153
|
-
|
|
126
|
+
distance(firstId: Uint8Array, secondId: Uint8Array): bigint;
|
|
154
127
|
/**
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
* return the union of the low and high branches (themselves also as arrays).
|
|
128
|
+
* Determines whether the id at the bitIndex is 0 or 1
|
|
129
|
+
* Return left leaf if `id` at `bitIndex` is 0, right leaf otherwise
|
|
158
130
|
*
|
|
159
|
-
* @
|
|
131
|
+
* @param {Uint8Array} kadId - Id to compare localNodeId with
|
|
132
|
+
* @returns {LeafBucket} left leaf if id at bitIndex is 0, right leaf otherwise.
|
|
160
133
|
*/
|
|
161
|
-
|
|
134
|
+
private _determineBucket;
|
|
162
135
|
/**
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
* walking the tree.
|
|
136
|
+
* Returns the index of the contact with provided
|
|
137
|
+
* id if it exists, returns -1 otherwise.
|
|
166
138
|
*
|
|
167
|
-
* @
|
|
139
|
+
* @param {object} bucket - internal object that has 2 leafs: left and right
|
|
140
|
+
* @param {Uint8Array} kadId - KadId of peer
|
|
141
|
+
* @returns {number} Integer Index of contact with provided id if it exists, -1 otherwise.
|
|
168
142
|
*/
|
|
169
|
-
|
|
143
|
+
private _indexOf;
|
|
170
144
|
/**
|
|
171
|
-
*
|
|
172
|
-
* If the selection is our old contact and the candidate is some new contact
|
|
173
|
-
* then the new contact is abandoned (not added).
|
|
174
|
-
* If the selection is our old contact and the candidate is our old contact
|
|
175
|
-
* then we are refreshing the contact and it is marked as most recently
|
|
176
|
-
* contacted (by being moved to the right/end of the bucket array).
|
|
177
|
-
* If the selection is our new contact, the old contact is removed and the new
|
|
178
|
-
* contact is marked as most recently contacted.
|
|
145
|
+
* Modify the bucket, turn it from a leaf bucket to an internal bucket
|
|
179
146
|
*
|
|
180
|
-
* @param {
|
|
181
|
-
* @param {number} index - the index in the bucket where contact exists (index has already been computed in a previous calculation)
|
|
182
|
-
* @param {object} contact - The contact object to update
|
|
147
|
+
* @param {any} bucket - bucket for splitting
|
|
183
148
|
*/
|
|
184
|
-
|
|
149
|
+
private _split;
|
|
185
150
|
}
|
|
186
151
|
//# sourceMappingURL=k-bucket.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"k-bucket.d.ts","sourceRoot":"","sources":["../../../src/routing-table/k-bucket.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"k-bucket.d.ts","sourceRoot":"","sources":["../../../src/routing-table/k-bucket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAMrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AA2B/C,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,IAAI,EAAE,CAAA;IACnB,UAAU,EAAE,IAAI,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAA;IACrC,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;IAC1B,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,SAAS,EAAE,IAAI,CAAA;IAEf;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAA;IAEpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IAEvB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,UAAU,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,IAAI,EAAE,CAAA;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,MAAM,GAAG,UAAU,GAAG,cAAc,CAAA;AAEhD,wBAAgB,YAAY,CAAE,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,UAAU,CAEzD;AAED;;;GAGG;AACH,qBAAa,OAAQ,SAAQ,iBAAiB,CAAC,aAAa,CAAC;IACpD,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,IAAI,CAAA;IACtB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAQ;gBAE/B,OAAO,EAAE,cAAc;IAkBpC;;;;OAIG;IACH,GAAG,CAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IA6CtB;;;;;;OAMG;IACD,OAAO,CAAE,EAAE,EAAE,UAAU,EAAE,CAAC,GAAE,MAAyB,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC;IAU5F;;;;OAIG;IACH,KAAK,IAAK,MAAM;IAsBhB;;;;;;;;OAQG;IACH,GAAG,CAAE,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS;IAOzC;;;;OAIG;IACH,MAAM,CAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAYhC;;;;;;OAMG;IACD,UAAU,IAAK,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC;IAcjD;;;;;;;OAOG;IACH,QAAQ,CAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,GAAG,MAAM;IAI5D;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAqBxB;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ;IAIhB;;;;OAIG;IACH,OAAO,CAAC,MAAM;CAkCf"}
|