@libp2p/kad-dht 13.1.2-35b48025c → 13.1.2-661d6586a

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. package/dist/index.min.js +2 -2
  2. package/dist/src/index.d.ts +26 -2
  3. package/dist/src/index.d.ts.map +1 -1
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/kad-dht.d.ts.map +1 -1
  6. package/dist/src/kad-dht.js +25 -13
  7. package/dist/src/kad-dht.js.map +1 -1
  8. package/dist/src/network.d.ts +1 -1
  9. package/dist/src/network.d.ts.map +1 -1
  10. package/dist/src/network.js +1 -3
  11. package/dist/src/network.js.map +1 -1
  12. package/dist/src/query-self.d.ts.map +1 -1
  13. package/dist/src/query-self.js +13 -6
  14. package/dist/src/query-self.js.map +1 -1
  15. package/dist/src/routing-table/index.d.ts +53 -30
  16. package/dist/src/routing-table/index.d.ts.map +1 -1
  17. package/dist/src/routing-table/index.js +279 -169
  18. package/dist/src/routing-table/index.js.map +1 -1
  19. package/dist/src/routing-table/k-bucket.d.ts +67 -21
  20. package/dist/src/routing-table/k-bucket.d.ts.map +1 -1
  21. package/dist/src/routing-table/k-bucket.js +128 -60
  22. package/dist/src/routing-table/k-bucket.js.map +1 -1
  23. package/dist/src/routing-table/refresh.d.ts.map +1 -1
  24. package/dist/src/routing-table/refresh.js +4 -1
  25. package/dist/src/routing-table/refresh.js.map +1 -1
  26. package/dist/src/rpc/index.d.ts.map +1 -1
  27. package/dist/src/rpc/index.js +3 -7
  28. package/dist/src/rpc/index.js.map +1 -1
  29. package/package.json +11 -12
  30. package/src/index.ts +30 -2
  31. package/src/kad-dht.ts +29 -15
  32. package/src/network.ts +1 -4
  33. package/src/query-self.ts +14 -6
  34. package/src/routing-table/index.ts +318 -201
  35. package/src/routing-table/k-bucket.ts +203 -74
  36. package/src/routing-table/refresh.ts +5 -1
  37. package/src/rpc/index.ts +4 -7
@@ -1,66 +1,110 @@
1
- import { InvalidMessageError, KEEP_ALIVE, TypedEventEmitter } from '@libp2p/interface';
2
- import { PeerSet } from '@libp2p/peer-collections';
1
+ import { KEEP_ALIVE, TypedEventEmitter, setMaxListeners } from '@libp2p/interface';
3
2
  import { AdaptiveTimeout } from '@libp2p/utils/adaptive-timeout';
4
3
  import { PeerQueue } from '@libp2p/utils/peer-queue';
5
- import { pbStream } from 'it-protobuf-stream';
6
- import { Message, MessageType } from '../message/dht.js';
4
+ import { anySignal } from 'any-signal';
5
+ import parallel from 'it-parallel';
6
+ import { EventTypes } from '../index.js';
7
+ import { MessageType } from '../message/dht.js';
7
8
  import * as utils from '../utils.js';
8
9
  import { KBucket, isLeafBucket } from './k-bucket.js';
9
10
  export const KAD_CLOSE_TAG_NAME = 'kad-close';
10
11
  export const KAD_CLOSE_TAG_VALUE = 50;
11
12
  export const KBUCKET_SIZE = 20;
12
- export const PREFIX_LENGTH = 32;
13
- export const PING_TIMEOUT = 2000;
14
- export const PING_CONCURRENCY = 20;
13
+ export const PREFIX_LENGTH = 7;
14
+ export const PING_NEW_CONTACT_TIMEOUT = 2000;
15
+ export const PING_NEW_CONTACT_CONCURRENCY = 20;
16
+ export const PING_NEW_CONTACT_MAX_QUEUE_SIZE = 100;
17
+ export const PING_OLD_CONTACT_COUNT = 3;
18
+ export const PING_OLD_CONTACT_TIMEOUT = 2000;
19
+ export const PING_OLD_CONTACT_CONCURRENCY = 20;
20
+ export const PING_OLD_CONTACT_MAX_QUEUE_SIZE = 100;
21
+ export const KAD_PEER_TAG_NAME = 'kad-peer';
22
+ export const KAD_PEER_TAG_VALUE = 1;
23
+ export const LAST_PING_THRESHOLD = 600000;
24
+ export const POPULATE_FROM_DATASTORE_ON_START = true;
25
+ export const POPULATE_FROM_DATASTORE_LIMIT = 1000;
15
26
  /**
16
- * A wrapper around `k-bucket`, to provide easy store and
17
- * retrieval for peers.
27
+ * A wrapper around `k-bucket`, to provide easy store and retrieval for peers.
18
28
  */
19
29
  export class RoutingTable extends TypedEventEmitter {
20
30
  kBucketSize;
21
31
  kb;
22
- pingQueue;
32
+ network;
23
33
  log;
24
34
  components;
25
- prefixLength;
26
- splitThreshold;
27
- pingTimeout;
28
- pingConcurrency;
29
35
  running;
36
+ pingNewContactTimeout;
37
+ pingNewContactQueue;
38
+ pingOldContactTimeout;
39
+ pingOldContactQueue;
40
+ populateFromDatastoreOnStart;
41
+ populateFromDatastoreLimit;
30
42
  protocol;
31
- tagName;
32
- tagValue;
43
+ peerTagName;
44
+ peerTagValue;
45
+ closeTagName;
46
+ closeTagValue;
33
47
  metrics;
34
48
  constructor(components, init) {
35
49
  super();
36
50
  this.components = components;
37
51
  this.log = components.logger.forComponent(`${init.logPrefix}:routing-table`);
38
52
  this.kBucketSize = init.kBucketSize ?? KBUCKET_SIZE;
39
- this.pingConcurrency = init.pingConcurrency ?? PING_CONCURRENCY;
40
53
  this.running = false;
41
54
  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;
46
- this.pingQueue = new PeerQueue({
47
- concurrency: this.pingConcurrency,
48
- metricName: `${init.logPrefix.replaceAll(':', '_')}_ping_queue`,
49
- metrics: this.components.metrics
55
+ this.network = init.network;
56
+ this.peerTagName = init.peerTagName ?? KAD_PEER_TAG_NAME;
57
+ this.peerTagValue = init.peerTagValue ?? KAD_PEER_TAG_VALUE;
58
+ this.closeTagName = init.closeTagName ?? KAD_CLOSE_TAG_NAME;
59
+ this.closeTagValue = init.closeTagValue ?? KAD_CLOSE_TAG_VALUE;
60
+ this.pingOldContacts = this.pingOldContacts.bind(this);
61
+ this.verifyNewContact = this.verifyNewContact.bind(this);
62
+ this.peerAdded = this.peerAdded.bind(this);
63
+ this.peerRemoved = this.peerRemoved.bind(this);
64
+ this.peerMoved = this.peerMoved.bind(this);
65
+ this.populateFromDatastoreOnStart = init.populateFromDatastoreOnStart ?? POPULATE_FROM_DATASTORE_ON_START;
66
+ this.populateFromDatastoreLimit = init.populateFromDatastoreLimit ?? POPULATE_FROM_DATASTORE_LIMIT;
67
+ this.pingOldContactQueue = new PeerQueue({
68
+ concurrency: init.pingOldContactConcurrency ?? PING_OLD_CONTACT_CONCURRENCY,
69
+ metricName: `${init.logPrefix.replaceAll(':', '_')}_ping_old_contact_queue`,
70
+ metrics: this.components.metrics,
71
+ maxSize: init.pingOldContactMaxQueueSize ?? PING_OLD_CONTACT_MAX_QUEUE_SIZE
50
72
  });
51
- this.pingQueue.addEventListener('error', evt => {
52
- this.log.error('error pinging peer', evt.detail);
73
+ this.pingOldContactTimeout = new AdaptiveTimeout({
74
+ ...(init.pingOldContactTimeout ?? {}),
75
+ metrics: this.components.metrics,
76
+ metricName: `${init.logPrefix.replaceAll(':', '_')}_routing_table_ping_old_contact_time_milliseconds`
53
77
  });
54
- this.pingTimeout = new AdaptiveTimeout({
55
- ...(init.pingTimeout ?? {}),
78
+ this.pingNewContactQueue = new PeerQueue({
79
+ concurrency: init.pingNewContactConcurrency ?? PING_NEW_CONTACT_CONCURRENCY,
80
+ metricName: `${init.logPrefix.replaceAll(':', '_')}_ping_new_contact_queue`,
56
81
  metrics: this.components.metrics,
57
- metricName: `${init.logPrefix.replaceAll(':', '_')}_routing_table_ping_time_milliseconds`
82
+ maxSize: init.pingNewContactMaxQueueSize ?? PING_NEW_CONTACT_MAX_QUEUE_SIZE
83
+ });
84
+ this.pingNewContactTimeout = new AdaptiveTimeout({
85
+ ...(init.pingNewContactTimeout ?? {}),
86
+ metrics: this.components.metrics,
87
+ metricName: `${init.logPrefix.replaceAll(':', '_')}_routing_table_ping_new_contact_time_milliseconds`
88
+ });
89
+ this.kb = new KBucket({
90
+ kBucketSize: init.kBucketSize,
91
+ prefixLength: init.prefixLength,
92
+ splitThreshold: init.splitThreshold,
93
+ numberOfOldContactsToPing: init.numberOfOldContactsToPing,
94
+ lastPingThreshold: init.lastPingThreshold,
95
+ ping: this.pingOldContacts,
96
+ verify: this.verifyNewContact,
97
+ onAdd: this.peerAdded,
98
+ onRemove: this.peerRemoved,
99
+ onMove: this.peerMoved
58
100
  });
59
101
  if (this.components.metrics != null) {
60
102
  this.metrics = {
61
103
  routingTableSize: this.components.metrics.registerMetric(`${init.logPrefix.replaceAll(':', '_')}_routing_table_size`),
62
104
  routingTableKadBucketTotal: this.components.metrics.registerMetric(`${init.logPrefix.replaceAll(':', '_')}_routing_table_kad_bucket_total`),
63
105
  routingTableKadBucketAverageOccupancy: this.components.metrics.registerMetric(`${init.logPrefix.replaceAll(':', '_')}_routing_table_kad_bucket_average_occupancy`),
106
+ routingTableKadBucketMinOccupancy: this.components.metrics.registerMetric(`${init.logPrefix.replaceAll(':', '_')}_routing_table_kad_bucket_min_occupancy`),
107
+ routingTableKadBucketMaxOccupancy: this.components.metrics.registerMetric(`${init.logPrefix.replaceAll(':', '_')}_routing_table_kad_bucket_max_occupancy`),
64
108
  routingTableKadBucketMaxDepth: this.components.metrics.registerMetric(`${init.logPrefix.replaceAll(':', '_')}_routing_table_kad_bucket_max_depth`),
65
109
  kadBucketEvents: this.components.metrics.registerCounterGroup(`${init.logPrefix.replaceAll(':', '_')}_kad_bucket_events_total`)
66
110
  };
@@ -71,91 +115,108 @@ export class RoutingTable extends TypedEventEmitter {
71
115
  }
72
116
  async start() {
73
117
  this.running = true;
74
- const kBuck = new KBucket({
75
- localPeer: {
76
- kadId: await utils.convertPeerId(this.components.peerId),
77
- peerId: this.components.peerId
78
- },
79
- kBucketSize: this.kBucketSize,
80
- prefixLength: this.prefixLength,
81
- splitThreshold: this.splitThreshold,
82
- numberOfNodesToPing: 1
83
- });
84
- this.kb = kBuck;
85
- // test whether to evict peers
86
- kBuck.addEventListener('ping', (evt) => {
87
- this.metrics?.kadBucketEvents.increment({ ping: true });
88
- this._onPing(evt).catch(err => {
89
- this.metrics?.kadBucketEvents.increment({ ping_error: true });
90
- this.log.error('could not process k-bucket ping event', err);
91
- });
92
- });
93
- let peerStorePeers = 0;
94
- // add existing peers from the peer store to routing table
95
- for (const peer of await this.components.peerStore.all()) {
96
- if (peer.protocols.includes(this.protocol)) {
97
- const id = await utils.convertPeerId(peer.id);
98
- this.kb.add({ kadId: id, peerId: peer.id });
99
- peerStorePeers++;
100
- }
101
- }
102
- this.log('added %d peer store peers to the routing table', peerStorePeers);
103
- // tag kad-close peers
104
- this._tagPeers(kBuck);
118
+ await this.kb.addSelfPeer(this.components.peerId);
105
119
  }
106
- async stop() {
107
- this.running = false;
108
- this.pingQueue.clear();
109
- this.kb = undefined;
110
- }
111
- /**
112
- * Keep track of our k-closest peers and tag them in the peer store as such
113
- * - this will lower the chances that connections to them get closed when
114
- * we reach connection limits
115
- */
116
- _tagPeers(kBuck) {
117
- let kClosest = new PeerSet();
118
- const updatePeerTags = utils.debounce(() => {
119
- const newClosest = new PeerSet(kBuck.closest(kBuck.localPeer.kadId, KBUCKET_SIZE));
120
- const addedPeers = newClosest.difference(kClosest);
121
- const removedPeers = kClosest.difference(newClosest);
122
- Promise.resolve()
123
- .then(async () => {
124
- for (const peer of addedPeers) {
125
- await this.components.peerStore.merge(peer, {
126
- tags: {
127
- [this.tagName]: {
128
- value: this.tagValue
129
- },
130
- [KEEP_ALIVE]: {
131
- value: 1
132
- }
133
- }
134
- });
120
+ async afterStart() {
121
+ // do this async to not block startup but iterate serially to not overwhelm
122
+ // the ping queue
123
+ Promise.resolve().then(async () => {
124
+ if (!this.populateFromDatastoreOnStart) {
125
+ return;
126
+ }
127
+ let peerStorePeers = 0;
128
+ // add existing peers from the peer store to routing table
129
+ for (const peer of await this.components.peerStore.all({
130
+ filters: [(peer) => {
131
+ return peer.protocols.includes(this.protocol) && peer.tags.has(KAD_PEER_TAG_NAME);
132
+ }],
133
+ limit: this.populateFromDatastoreLimit
134
+ })) {
135
+ if (!this.running) {
136
+ // bail if we've been shut down
137
+ return;
135
138
  }
136
- for (const peer of removedPeers) {
137
- await this.components.peerStore.merge(peer, {
139
+ try {
140
+ await this.add(peer.id);
141
+ peerStorePeers++;
142
+ }
143
+ catch (err) {
144
+ this.log('failed to add peer %p to routing table, removing kad-dht peer tags - %e');
145
+ await this.components.peerStore.merge(peer.id, {
138
146
  tags: {
139
- [this.tagName]: undefined,
147
+ [this.closeTagName]: undefined,
148
+ [this.peerTagName]: undefined,
140
149
  [KEEP_ALIVE]: undefined
141
150
  }
142
151
  });
143
152
  }
144
- })
145
- .catch(err => {
146
- this.log.error('Could not update peer tags', err);
147
- });
148
- kClosest = newClosest;
149
- });
150
- kBuck.addEventListener('added', (evt) => {
151
- updatePeerTags();
152
- this.metrics?.kadBucketEvents.increment({ peer_added: true });
153
- this.safeDispatchEvent('peer:add', { detail: evt.detail.peerId });
153
+ }
154
+ this.log('added %d peer store peers to the routing table', peerStorePeers);
155
+ })
156
+ .catch(err => {
157
+ this.log.error('error adding peer store peers to the routing table %e', err);
154
158
  });
155
- kBuck.addEventListener('removed', (evt) => {
156
- updatePeerTags();
157
- this.metrics?.kadBucketEvents.increment({ peer_removed: true });
158
- this.safeDispatchEvent('peer:remove', { detail: evt.detail.peerId });
159
+ }
160
+ async stop() {
161
+ this.running = false;
162
+ this.pingOldContactQueue.abort();
163
+ this.pingNewContactQueue.abort();
164
+ }
165
+ async peerAdded(peer, bucket) {
166
+ if (!this.components.peerId.equals(peer.peerId)) {
167
+ const tags = {
168
+ [this.peerTagName]: {
169
+ value: this.peerTagValue
170
+ }
171
+ };
172
+ if (bucket.containsSelf === true) {
173
+ tags[this.closeTagName] = {
174
+ value: this.closeTagValue
175
+ };
176
+ tags[KEEP_ALIVE] = {
177
+ value: 1
178
+ };
179
+ }
180
+ await this.components.peerStore.merge(peer.peerId, {
181
+ tags
182
+ });
183
+ }
184
+ this.updateMetrics();
185
+ this.metrics?.kadBucketEvents.increment({ peer_added: true });
186
+ this.safeDispatchEvent('peer:add', { detail: peer.peerId });
187
+ }
188
+ async peerRemoved(peer, bucket) {
189
+ if (!this.components.peerId.equals(peer.peerId)) {
190
+ await this.components.peerStore.merge(peer.peerId, {
191
+ tags: {
192
+ [this.closeTagName]: undefined,
193
+ [this.peerTagName]: undefined,
194
+ [KEEP_ALIVE]: undefined
195
+ }
196
+ });
197
+ }
198
+ this.updateMetrics();
199
+ this.metrics?.kadBucketEvents.increment({ peer_removed: true });
200
+ this.safeDispatchEvent('peer:remove', { detail: peer.peerId });
201
+ }
202
+ async peerMoved(peer, oldBucket, newBucket) {
203
+ if (this.components.peerId.equals(peer.peerId)) {
204
+ return;
205
+ }
206
+ const tags = {
207
+ [this.closeTagName]: undefined,
208
+ [KEEP_ALIVE]: undefined
209
+ };
210
+ if (newBucket.containsSelf === true) {
211
+ tags[this.closeTagName] = {
212
+ value: this.closeTagValue
213
+ };
214
+ tags[KEEP_ALIVE] = {
215
+ value: 1
216
+ };
217
+ }
218
+ await this.components.peerStore.merge(peer.peerId, {
219
+ tags
159
220
  });
160
221
  }
161
222
  /**
@@ -168,69 +229,112 @@ export class RoutingTable extends TypedEventEmitter {
168
229
  * `oldContacts` will not be empty and is the list of contacts that
169
230
  * have not been contacted for the longest.
170
231
  */
171
- async _onPing(evt) {
232
+ async *pingOldContacts(oldContacts, options) {
172
233
  if (!this.running) {
173
234
  return;
174
235
  }
175
- const { oldContacts, newContact } = evt.detail;
176
- const results = await Promise.all(oldContacts.map(async (oldContact) => {
177
- // if a previous ping wants us to ping this contact, re-use the result
178
- const pingJob = this.pingQueue.find(oldContact.peerId);
179
- if (pingJob != null) {
180
- return pingJob.join();
236
+ const jobs = [];
237
+ for (const oldContact of oldContacts) {
238
+ if (this.kb.get(oldContact.kadId) == null) {
239
+ this.log('asked to ping contact %p that was not in routing table', oldContact.peerId);
240
+ continue;
181
241
  }
182
- return this.pingQueue.add(async () => {
183
- let stream;
184
- const signal = this.pingTimeout.getTimeoutSignal();
185
- try {
186
- const options = {
187
- signal
188
- };
189
- this.log('pinging old contact %p', oldContact.peerId);
190
- const connection = await this.components.connectionManager.openConnection(oldContact.peerId, options);
191
- stream = await connection.newStream(this.protocol, options);
192
- const pb = pbStream(stream).pb(Message);
193
- await pb.write({
194
- type: MessageType.PING,
195
- closer: [],
196
- providers: []
197
- }, options);
198
- const response = await pb.read(options);
199
- await pb.unwrap().unwrap().close(options);
200
- if (response.type !== MessageType.PING) {
201
- throw new InvalidMessageError(`Incorrect message type received, expected PING got ${response.type}`);
242
+ this.metrics?.kadBucketEvents.increment({ ping_old_contact: true });
243
+ jobs.push(async () => {
244
+ // if a previous ping wants us to ping this contact, re-use the result
245
+ const existingJob = this.pingOldContactQueue.find(oldContact.peerId);
246
+ if (existingJob != null) {
247
+ this.log('asked to ping contact %p was already being pinged', oldContact.peerId);
248
+ const result = await existingJob.join(options);
249
+ if (!result) {
250
+ return oldContact;
202
251
  }
203
- this.log('old contact %p ping ok', oldContact.peerId);
204
- return true;
252
+ return;
205
253
  }
206
- catch (err) {
207
- if (this.running) {
208
- // only evict peers if we are still running, otherwise we evict
209
- // when dialing is cancelled due to shutdown in progress
210
- this.log.error('could not ping peer %p - %e', oldContact.peerId, err);
211
- this.log('evicting old contact after ping failed %p', oldContact.peerId);
212
- this.kb?.remove(oldContact.kadId);
254
+ const result = await this.pingOldContactQueue.add(async (options) => {
255
+ const signal = this.pingOldContactTimeout.getTimeoutSignal();
256
+ const signals = anySignal([signal, options?.signal]);
257
+ setMaxListeners(Infinity, signal, signals);
258
+ try {
259
+ return await this.pingContact(oldContact, options);
213
260
  }
214
- stream?.abort(err);
215
- return false;
216
- }
217
- finally {
218
- this.pingTimeout.cleanUp(signal);
219
- this.updateMetrics();
261
+ catch {
262
+ this.metrics?.kadBucketEvents.increment({ ping_old_contact_error: true });
263
+ return true;
264
+ }
265
+ finally {
266
+ this.pingOldContactTimeout.cleanUp(signal);
267
+ signals.clear();
268
+ }
269
+ }, {
270
+ peerId: oldContact.peerId,
271
+ signal: options?.signal
272
+ });
273
+ if (!result) {
274
+ return oldContact;
220
275
  }
221
- }, {
222
- peerId: oldContact.peerId
223
276
  });
224
- }));
225
- const responded = results
226
- .filter(res => res)
227
- .length;
228
- if (this.running && responded < oldContacts.length && this.kb != null) {
229
- this.log('adding new contact %p', newContact.peerId);
230
- this.kb.add(newContact);
277
+ }
278
+ for await (const peer of parallel(jobs)) {
279
+ if (peer != null) {
280
+ yield peer;
281
+ }
282
+ }
283
+ }
284
+ async verifyNewContact(contact, options) {
285
+ const signal = this.pingNewContactTimeout.getTimeoutSignal();
286
+ const signals = anySignal([signal, options?.signal]);
287
+ setMaxListeners(Infinity, signal, signals);
288
+ try {
289
+ const job = this.pingNewContactQueue.find(contact.peerId);
290
+ if (job != null) {
291
+ this.log('joining existing ping to add new peer %p to routing table', contact.peerId);
292
+ return await job.join({
293
+ signal: signals
294
+ });
295
+ }
296
+ else {
297
+ return await this.pingNewContactQueue.add(async (options) => {
298
+ this.metrics?.kadBucketEvents.increment({ ping_new_contact: true });
299
+ this.log('pinging new peer %p before adding to routing table', contact.peerId);
300
+ return this.pingContact(contact, options);
301
+ }, {
302
+ peerId: contact.peerId,
303
+ signal: signals
304
+ });
305
+ }
306
+ }
307
+ catch (err) {
308
+ this.log.trace('tried to add peer %p but they were not online', contact.peerId);
309
+ this.metrics?.kadBucketEvents.increment({ ping_new_contact_error: true });
310
+ return false;
311
+ }
312
+ finally {
313
+ this.pingNewContactTimeout.cleanUp(signal);
314
+ signals.clear();
315
+ }
316
+ }
317
+ async pingContact(contact, options) {
318
+ let stream;
319
+ try {
320
+ this.log('pinging contact %p', contact.peerId);
321
+ for await (const event of this.network.sendRequest(contact.peerId, { type: MessageType.PING }, options)) {
322
+ if (event.type === EventTypes.PEER_RESPONSE) {
323
+ if (event.messageType === MessageType.PING) {
324
+ this.log('contact %p ping ok', contact.peerId);
325
+ return true;
326
+ }
327
+ return false;
328
+ }
329
+ }
330
+ return false;
331
+ }
332
+ catch (err) {
333
+ this.log('error pinging old contact %p - %e', contact.peerId, err);
334
+ stream?.abort(err);
335
+ return false;
231
336
  }
232
337
  }
233
- // -- Public Interface
234
338
  /**
235
339
  * Amount of currently stored peers
236
340
  */
@@ -244,8 +348,8 @@ export class RoutingTable extends TypedEventEmitter {
244
348
  * Find a specific peer by id
245
349
  */
246
350
  async find(peer) {
247
- const key = await utils.convertPeerId(peer);
248
- return this.kb?.get(key)?.peerId;
351
+ const kadId = await utils.convertPeerId(peer);
352
+ return this.kb.get(kadId)?.peerId;
249
353
  }
250
354
  /**
251
355
  * Retrieve the closest peers to the given kadId
@@ -269,14 +373,11 @@ export class RoutingTable extends TypedEventEmitter {
269
373
  /**
270
374
  * Add or update the routing table with the given peer
271
375
  */
272
- async add(peerId) {
376
+ async add(peerId, options) {
273
377
  if (this.kb == null) {
274
378
  throw new Error('RoutingTable is not started');
275
379
  }
276
- const kadId = await utils.convertPeerId(peerId);
277
- this.kb.add({ kadId, peerId });
278
- this.log.trace('added %p with kad id %b', peerId, kadId);
279
- this.updateMetrics();
380
+ await this.kb.add(peerId, options);
280
381
  }
281
382
  /**
282
383
  * Remove a given peer from the table
@@ -285,9 +386,8 @@ export class RoutingTable extends TypedEventEmitter {
285
386
  if (this.kb == null) {
286
387
  throw new Error('RoutingTable is not started');
287
388
  }
288
- const id = await utils.convertPeerId(peer);
289
- this.kb.remove(id);
290
- this.updateMetrics();
389
+ const kadId = await utils.convertPeerId(peer);
390
+ await this.kb.remove(kadId);
291
391
  }
292
392
  updateMetrics() {
293
393
  if (this.metrics == null || this.kb == null) {
@@ -296,6 +396,8 @@ export class RoutingTable extends TypedEventEmitter {
296
396
  let size = 0;
297
397
  let buckets = 0;
298
398
  let maxDepth = 0;
399
+ let minOccupancy = 20;
400
+ let maxOccupancy = 0;
299
401
  function count(bucket) {
300
402
  if (isLeafBucket(bucket)) {
301
403
  if (bucket.depth > maxDepth) {
@@ -303,6 +405,12 @@ export class RoutingTable extends TypedEventEmitter {
303
405
  }
304
406
  buckets++;
305
407
  size += bucket.peers.length;
408
+ if (bucket.peers.length < minOccupancy) {
409
+ minOccupancy = bucket.peers.length;
410
+ }
411
+ if (bucket.peers.length > maxOccupancy) {
412
+ maxOccupancy = bucket.peers.length;
413
+ }
306
414
  return;
307
415
  }
308
416
  count(bucket.left);
@@ -312,6 +420,8 @@ export class RoutingTable extends TypedEventEmitter {
312
420
  this.metrics.routingTableSize.update(size);
313
421
  this.metrics.routingTableKadBucketTotal.update(buckets);
314
422
  this.metrics.routingTableKadBucketAverageOccupancy.update(Math.round(size / buckets));
423
+ this.metrics.routingTableKadBucketMinOccupancy.update(minOccupancy);
424
+ this.metrics.routingTableKadBucketMaxOccupancy.update(maxOccupancy);
315
425
  this.metrics.routingTableKadBucketMaxDepth.update(maxDepth);
316
426
  }
317
427
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routing-table/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routing-table/index.ts"],"names":[],"mappings":"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"}