@libp2p/kad-dht 13.1.1 → 13.1.2-27b2fa6b6

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.
Files changed (63) 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 +2 -1
  9. package/dist/src/network.d.ts.map +1 -1
  10. package/dist/src/network.js +10 -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/manager.d.ts +1 -2
  18. package/dist/src/query/manager.d.ts.map +1 -1
  19. package/dist/src/query/manager.js +11 -16
  20. package/dist/src/query/manager.js.map +1 -1
  21. package/dist/src/query-self.d.ts.map +1 -1
  22. package/dist/src/query-self.js +13 -6
  23. package/dist/src/query-self.js.map +1 -1
  24. package/dist/src/routing-table/closest-peers.d.ts +43 -0
  25. package/dist/src/routing-table/closest-peers.d.ts.map +1 -0
  26. package/dist/src/routing-table/closest-peers.js +86 -0
  27. package/dist/src/routing-table/closest-peers.js.map +1 -0
  28. package/dist/src/routing-table/index.d.ts +55 -32
  29. package/dist/src/routing-table/index.d.ts.map +1 -1
  30. package/dist/src/routing-table/index.js +261 -158
  31. package/dist/src/routing-table/index.js.map +1 -1
  32. package/dist/src/routing-table/k-bucket.d.ts +65 -21
  33. package/dist/src/routing-table/k-bucket.d.ts.map +1 -1
  34. package/dist/src/routing-table/k-bucket.js +122 -66
  35. package/dist/src/routing-table/k-bucket.js.map +1 -1
  36. package/dist/src/routing-table/refresh.d.ts.map +1 -1
  37. package/dist/src/routing-table/refresh.js +4 -1
  38. package/dist/src/routing-table/refresh.js.map +1 -1
  39. package/dist/src/rpc/index.d.ts.map +1 -1
  40. package/dist/src/rpc/index.js +3 -7
  41. package/dist/src/rpc/index.js.map +1 -1
  42. package/package.json +11 -12
  43. package/src/index.ts +32 -6
  44. package/src/kad-dht.ts +29 -13
  45. package/src/network.ts +18 -5
  46. package/src/{peer-list/peer-distance-list.ts → peer-distance-list.ts} +1 -1
  47. package/src/peer-routing/index.ts +1 -1
  48. package/src/query/manager.ts +16 -21
  49. package/src/query-self.ts +14 -6
  50. package/src/routing-table/closest-peers.ts +113 -0
  51. package/src/routing-table/index.ts +302 -189
  52. package/src/routing-table/k-bucket.ts +194 -81
  53. package/src/routing-table/refresh.ts +5 -1
  54. package/src/rpc/index.ts +4 -7
  55. package/dist/src/peer-list/index.d.ts +0 -29
  56. package/dist/src/peer-list/index.d.ts.map +0 -1
  57. package/dist/src/peer-list/index.js +0 -45
  58. package/dist/src/peer-list/index.js.map +0 -1
  59. package/dist/src/peer-list/peer-distance-list.d.ts.map +0 -1
  60. package/dist/src/peer-list/peer-distance-list.js.map +0 -1
  61. package/dist/typedoc-urls.json +0 -56
  62. package/src/peer-list/index.ts +0 -54
  63. /package/dist/src/{peer-list/peer-distance-list.d.ts → peer-distance-list.d.ts} +0 -0
@@ -1,62 +1,114 @@
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`),
59
- routingTableKadBucketMaxDepth: this.components.metrics.registerMetric(`${init.logPrefix.replaceAll(':', '_')}_routing_table_kad_bucket_max_depth`)
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`),
110
+ routingTableKadBucketMaxDepth: this.components.metrics.registerMetric(`${init.logPrefix.replaceAll(':', '_')}_routing_table_kad_bucket_max_depth`),
111
+ kadBucketEvents: this.components.metrics.registerCounterGroup(`${init.logPrefix.replaceAll(':', '_')}_kad_bucket_events_total`)
60
112
  };
61
113
  }
62
114
  }
@@ -65,84 +117,78 @@ export class RoutingTable extends TypedEventEmitter {
65
117
  }
66
118
  async start() {
67
119
  this.running = true;
68
- const kBuck = new KBucket({
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,
76
- numberOfNodesToPing: 1
77
- });
78
- this.kb = kBuck;
79
- // test whether to evict peers
80
- kBuck.addEventListener('ping', (evt) => {
81
- this._onPing(evt).catch(err => {
82
- this.log.error('could not process k-bucket ping event', err);
83
- });
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++;
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;
92
129
  }
93
- }
94
- this.log('added %d peer store peers to the routing table', peerStorePeers);
95
- // tag kad-close peers
96
- 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
+ });
97
160
  }
98
161
  async stop() {
99
162
  this.running = false;
100
- this.pingQueue.clear();
101
- this.kb = undefined;
163
+ await stop(this.closestPeerTagger);
164
+ this.pingOldContactQueue.abort();
165
+ this.pingNewContactQueue.abort();
102
166
  }
103
- /**
104
- * Keep track of our k-closest peers and tag them in the peer store as such
105
- * - this will lower the chances that connections to them get closed when
106
- * we reach connection limits
107
- */
108
- _tagPeers(kBuck) {
109
- let kClosest = new PeerSet();
110
- const updatePeerTags = utils.debounce(() => {
111
- const newClosest = new PeerSet(kBuck.closest(kBuck.localPeer.kadId, KBUCKET_SIZE));
112
- const addedPeers = newClosest.difference(kClosest);
113
- const removedPeers = kClosest.difference(newClosest);
114
- Promise.resolve()
115
- .then(async () => {
116
- for (const peer of addedPeers) {
117
- await this.components.peerStore.merge(peer, {
118
- tags: {
119
- [this.tagName]: {
120
- value: this.tagValue
121
- }
122
- }
123
- });
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
+ }
124
174
  }
125
- for (const peer of removedPeers) {
126
- await this.components.peerStore.merge(peer, {
127
- tags: {
128
- [this.tagName]: undefined
129
- }
130
- });
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
131
186
  }
132
- })
133
- .catch(err => {
134
- this.log.error('Could not update peer tags', err);
135
187
  });
136
- kClosest = newClosest;
137
- });
138
- kBuck.addEventListener('added', (evt) => {
139
- updatePeerTags();
140
- this.safeDispatchEvent('peer:add', { detail: evt.detail.peerId });
141
- });
142
- kBuck.addEventListener('removed', (evt) => {
143
- updatePeerTags();
144
- this.safeDispatchEvent('peer:remove', { detail: evt.detail.peerId });
145
- });
188
+ }
189
+ this.updateMetrics();
190
+ this.metrics?.kadBucketEvents.increment({ peer_removed: true });
191
+ this.safeDispatchEvent('peer:remove', { detail: peer.peerId });
146
192
  }
147
193
  /**
148
194
  * Called on the `ping` event from `k-bucket` when a bucket is full
@@ -154,64 +200,115 @@ export class RoutingTable extends TypedEventEmitter {
154
200
  * `oldContacts` will not be empty and is the list of contacts that
155
201
  * have not been contacted for the longest.
156
202
  */
157
- async _onPing(evt) {
203
+ async *pingOldContacts(oldContacts, options) {
158
204
  if (!this.running) {
159
205
  return;
160
206
  }
161
- const { oldContacts, newContact } = evt.detail;
162
- const results = await Promise.all(oldContacts.map(async (oldContact) => {
163
- // if a previous ping wants us to ping this contact, re-use the result
164
- const pingJob = this.pingQueue.find(oldContact.peerId);
165
- if (pingJob != null) {
166
- 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;
167
212
  }
168
- return this.pingQueue.add(async () => {
169
- let stream;
170
- try {
171
- const options = {
172
- signal: AbortSignal.timeout(this.pingTimeout)
173
- };
174
- this.log('pinging old contact %p', oldContact.peerId);
175
- const connection = await this.components.connectionManager.openConnection(oldContact.peerId, options);
176
- stream = await connection.newStream(this.protocol, options);
177
- const pb = pbStream(stream);
178
- await pb.write({
179
- type: MessageType.PING
180
- }, Message, options);
181
- const response = await pb.read(Message, options);
182
- await pb.unwrap().close();
183
- if (response.type !== MessageType.PING) {
184
- 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;
185
222
  }
186
- return true;
223
+ return;
187
224
  }
188
- catch (err) {
189
- if (this.running && this.kb != null) {
190
- // only evict peers if we are still running, otherwise we evict
191
- // when dialing is cancelled due to shutdown in progress
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);
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);
195
231
  }
196
- stream?.abort(err);
197
- return false;
198
- }
199
- finally {
200
- this.metrics?.routingTableSize.update(this.size);
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;
201
246
  }
202
- }, {
203
- peerId: oldContact.peerId
204
247
  });
205
- }));
206
- const responded = results
207
- .filter(res => res)
208
- .length;
209
- if (this.running && responded < oldContacts.length && this.kb != null) {
210
- this.log('adding new contact %p', newContact.peerId);
211
- 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;
212
310
  }
213
311
  }
214
- // -- Public Interface
215
312
  /**
216
313
  * Amount of currently stored peers
217
314
  */
@@ -225,8 +322,8 @@ export class RoutingTable extends TypedEventEmitter {
225
322
  * Find a specific peer by id
226
323
  */
227
324
  async find(peer) {
228
- const key = await utils.convertPeerId(peer);
229
- return this.kb?.get(key)?.peerId;
325
+ const kadId = await utils.convertPeerId(peer);
326
+ return this.kb.get(kadId)?.peerId;
230
327
  }
231
328
  /**
232
329
  * Retrieve the closest peers to the given kadId
@@ -250,14 +347,11 @@ export class RoutingTable extends TypedEventEmitter {
250
347
  /**
251
348
  * Add or update the routing table with the given peer
252
349
  */
253
- async add(peerId) {
350
+ async add(peerId, options) {
254
351
  if (this.kb == null) {
255
352
  throw new Error('RoutingTable is not started');
256
353
  }
257
- const kadId = await utils.convertPeerId(peerId);
258
- this.kb.add({ kadId, peerId });
259
- this.log.trace('added %p with kad id %b', peerId, kadId);
260
- this.updateMetrics();
354
+ await this.kb.add(peerId, options);
261
355
  }
262
356
  /**
263
357
  * Remove a given peer from the table
@@ -266,9 +360,8 @@ export class RoutingTable extends TypedEventEmitter {
266
360
  if (this.kb == null) {
267
361
  throw new Error('RoutingTable is not started');
268
362
  }
269
- const id = await utils.convertPeerId(peer);
270
- this.kb.remove(id);
271
- this.updateMetrics();
363
+ const kadId = await utils.convertPeerId(peer);
364
+ await this.kb.remove(kadId);
272
365
  }
273
366
  updateMetrics() {
274
367
  if (this.metrics == null || this.kb == null) {
@@ -277,6 +370,8 @@ export class RoutingTable extends TypedEventEmitter {
277
370
  let size = 0;
278
371
  let buckets = 0;
279
372
  let maxDepth = 0;
373
+ let minOccupancy = 20;
374
+ let maxOccupancy = 0;
280
375
  function count(bucket) {
281
376
  if (isLeafBucket(bucket)) {
282
377
  if (bucket.depth > maxDepth) {
@@ -284,6 +379,12 @@ export class RoutingTable extends TypedEventEmitter {
284
379
  }
285
380
  buckets++;
286
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
+ }
287
388
  return;
288
389
  }
289
390
  count(bucket.left);
@@ -293,6 +394,8 @@ export class RoutingTable extends TypedEventEmitter {
293
394
  this.metrics.routingTableSize.update(size);
294
395
  this.metrics.routingTableKadBucketTotal.update(buckets);
295
396
  this.metrics.routingTableKadBucketAverageOccupancy.update(Math.round(size / buckets));
397
+ this.metrics.routingTableKadBucketMinOccupancy.update(minOccupancy);
398
+ this.metrics.routingTableKadBucketMaxOccupancy.update(maxOccupancy);
296
399
  this.metrics.routingTableKadBucketMaxDepth.update(maxDepth);
297
400
  }
298
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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"}