@libp2p/kad-dht 13.1.2 → 14.0.0-934a891f9

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