1
- import { KEEP_ALIVE , TypedEventEmitter , setMaxListeners } from '@libp2p/interface'
1
+ import { TypedEventEmitter , setMaxListeners , start , stop } from '@libp2p/interface'
2
2
import { AdaptiveTimeout } from '@libp2p/utils/adaptive-timeout'
3
3
import { PeerQueue } from '@libp2p/utils/peer-queue'
4
4
import { anySignal } from 'any-signal'
5
5
import parallel from 'it-parallel'
6
6
import { EventTypes } from '../index.js'
7
7
import { MessageType } from '../message/dht.js'
8
8
import * as utils from '../utils.js'
9
+ import { ClosestPeers } from './closest-peers.js'
9
10
import { KBucket , isLeafBucket } from './k-bucket.js'
10
11
import type { Bucket , LeafBucket , Peer } from './k-bucket.js'
11
12
import type { Network } from '../network.js'
12
- import type { AbortOptions , ComponentLogger , CounterGroup , Logger , Metric , Metrics , PeerId , PeerStore , Startable , Stream , TagOptions } from '@libp2p/interface'
13
+ import type { AbortOptions , ComponentLogger , CounterGroup , Logger , Metric , Metrics , PeerId , PeerStore , Startable , Stream } from '@libp2p/interface'
13
14
import type { AdaptiveTimeoutInit } from '@libp2p/utils/adaptive-timeout'
14
15
15
- export const KAD_CLOSE_TAG_NAME = 'kad-close'
16
- export const KAD_CLOSE_TAG_VALUE = 50
17
16
export const KBUCKET_SIZE = 20
18
- export const PREFIX_LENGTH = 7
17
+ export const PREFIX_LENGTH = 8
19
18
export const PING_NEW_CONTACT_TIMEOUT = 2000
20
19
export const PING_NEW_CONTACT_CONCURRENCY = 20
21
20
export const PING_NEW_CONTACT_MAX_QUEUE_SIZE = 100
@@ -50,6 +49,8 @@ export interface RoutingTableInit {
50
49
populateFromDatastoreOnStart ?: boolean
51
50
populateFromDatastoreLimit ?: number
52
51
lastPingThreshold ?: number
52
+ closestPeerSetSize ?: number
53
+ closestPeerSetRefreshInterval ?: number
53
54
}
54
55
55
56
export interface RoutingTableComponents {
@@ -62,6 +63,7 @@ export interface RoutingTableComponents {
62
63
export interface RoutingTableEvents {
63
64
'peer:add' : CustomEvent < PeerId >
64
65
'peer:remove' : CustomEvent < PeerId >
66
+ 'peer:ping' : CustomEvent < PeerId >
65
67
}
66
68
67
69
/**
@@ -71,6 +73,7 @@ export class RoutingTable extends TypedEventEmitter<RoutingTableEvents> implemen
71
73
public kBucketSize : number
72
74
public kb : KBucket
73
75
public network : Network
76
+ private readonly closestPeerTagger : ClosestPeers
74
77
private readonly log : Logger
75
78
private readonly components : RoutingTableComponents
76
79
private running : boolean
@@ -83,8 +86,6 @@ export class RoutingTable extends TypedEventEmitter<RoutingTableEvents> implemen
83
86
private readonly protocol : string
84
87
private readonly peerTagName : string
85
88
private readonly peerTagValue : number
86
- private readonly closeTagName : string
87
- private readonly closeTagValue : number
88
89
private readonly metrics ?: {
89
90
routingTableSize : Metric
90
91
routingTableKadBucketTotal : Metric
@@ -106,13 +107,10 @@ export class RoutingTable extends TypedEventEmitter<RoutingTableEvents> implemen
106
107
this . network = init . network
107
108
this . peerTagName = init . peerTagName ?? KAD_PEER_TAG_NAME
108
109
this . peerTagValue = init . peerTagValue ?? KAD_PEER_TAG_VALUE
109
- this . closeTagName = init . closeTagName ?? KAD_CLOSE_TAG_NAME
110
- this . closeTagValue = init . closeTagValue ?? KAD_CLOSE_TAG_VALUE
111
110
this . pingOldContacts = this . pingOldContacts . bind ( this )
112
111
this . verifyNewContact = this . verifyNewContact . bind ( this )
113
112
this . peerAdded = this . peerAdded . bind ( this )
114
113
this . peerRemoved = this . peerRemoved . bind ( this )
115
- this . peerMoved = this . peerMoved . bind ( this )
116
114
this . populateFromDatastoreOnStart = init . populateFromDatastoreOnStart ?? POPULATE_FROM_DATASTORE_ON_START
117
115
this . populateFromDatastoreLimit = init . populateFromDatastoreLimit ?? POPULATE_FROM_DATASTORE_LIMIT
118
116
@@ -149,8 +147,16 @@ export class RoutingTable extends TypedEventEmitter<RoutingTableEvents> implemen
149
147
ping : this . pingOldContacts ,
150
148
verify : this . verifyNewContact ,
151
149
onAdd : this . peerAdded ,
152
- onRemove : this . peerRemoved ,
153
- onMove : this . peerMoved
150
+ onRemove : this . peerRemoved
151
+ } )
152
+
153
+ this . closestPeerTagger = new ClosestPeers ( this . components , {
154
+ logPrefix : init . logPrefix ,
155
+ routingTable : this ,
156
+ peerSetSize : init . closestPeerSetSize ,
157
+ refreshInterval : init . closestPeerSetRefreshInterval ,
158
+ closeTagName : init . closeTagName ,
159
+ closeTagValue : init . closeTagValue
154
160
} )
155
161
156
162
if ( this . components . metrics != null ) {
@@ -173,6 +179,7 @@ export class RoutingTable extends TypedEventEmitter<RoutingTableEvents> implemen
173
179
async start ( ) : Promise < void > {
174
180
this . running = true
175
181
182
+ await start ( this . closestPeerTagger )
176
183
await this . kb . addSelfPeer ( this . components . peerId )
177
184
}
178
185
@@ -205,9 +212,7 @@ export class RoutingTable extends TypedEventEmitter<RoutingTableEvents> implemen
205
212
this . log ( 'failed to add peer %p to routing table, removing kad-dht peer tags - %e' )
206
213
await this . components . peerStore . merge ( peer . id , {
207
214
tags : {
208
- [ this . closeTagName ] : undefined ,
209
- [ this . peerTagName ] : undefined ,
210
- [ KEEP_ALIVE ] : undefined
215
+ [ this . peerTagName ] : undefined
211
216
}
212
217
} )
213
218
}
@@ -222,29 +227,19 @@ export class RoutingTable extends TypedEventEmitter<RoutingTableEvents> implemen
222
227
223
228
async stop ( ) : Promise < void > {
224
229
this . running = false
230
+ await stop ( this . closestPeerTagger )
225
231
this . pingOldContactQueue . abort ( )
226
232
this . pingNewContactQueue . abort ( )
227
233
}
228
234
229
235
private async peerAdded ( peer : Peer , bucket : LeafBucket ) : Promise < void > {
230
236
if ( ! this . components . peerId . equals ( peer . peerId ) ) {
231
- const tags : Record < string , TagOptions | undefined > = {
232
- [ this . peerTagName ] : {
233
- value : this . peerTagValue
234
- }
235
- }
236
-
237
- if ( bucket . containsSelf === true ) {
238
- tags [ this . closeTagName ] = {
239
- value : this . closeTagValue
240
- }
241
- tags [ KEEP_ALIVE ] = {
242
- value : 1
243
- }
244
- }
245
-
246
237
await this . components . peerStore . merge ( peer . peerId , {
247
- tags
238
+ tags : {
239
+ [ this . peerTagName ] : {
240
+ value : this . peerTagValue
241
+ }
242
+ }
248
243
} )
249
244
}
250
245
@@ -257,9 +252,7 @@ export class RoutingTable extends TypedEventEmitter<RoutingTableEvents> implemen
257
252
if ( ! this . components . peerId . equals ( peer . peerId ) ) {
258
253
await this . components . peerStore . merge ( peer . peerId , {
259
254
tags : {
260
- [ this . closeTagName ] : undefined ,
261
- [ this . peerTagName ] : undefined ,
262
- [ KEEP_ALIVE ] : undefined
255
+ [ this . peerTagName ] : undefined
263
256
}
264
257
} )
265
258
}
@@ -269,30 +262,6 @@ export class RoutingTable extends TypedEventEmitter<RoutingTableEvents> implemen
269
262
this . safeDispatchEvent ( 'peer:remove' , { detail : peer . peerId } )
270
263
}
271
264
272
- private async peerMoved ( peer : Peer , oldBucket : LeafBucket , newBucket : LeafBucket ) : Promise < void > {
273
- if ( this . components . peerId . equals ( peer . peerId ) ) {
274
- return
275
- }
276
-
277
- const tags : Record < string , TagOptions | undefined > = {
278
- [ this . closeTagName ] : undefined ,
279
- [ KEEP_ALIVE ] : undefined
280
- }
281
-
282
- if ( newBucket . containsSelf === true ) {
283
- tags [ this . closeTagName ] = {
284
- value : this . closeTagValue
285
- }
286
- tags [ KEEP_ALIVE ] = {
287
- value : 1
288
- }
289
- }
290
-
291
- await this . components . peerStore . merge ( peer . peerId , {
292
- tags
293
- } )
294
- }
295
-
296
265
/**
297
266
* Called on the `ping` event from `k-bucket` when a bucket is full
298
267
* and cannot split.
@@ -410,6 +379,11 @@ export class RoutingTable extends TypedEventEmitter<RoutingTableEvents> implemen
410
379
if ( event . type === EventTypes . PEER_RESPONSE ) {
411
380
if ( event . messageType === MessageType . PING ) {
412
381
this . log ( 'contact %p ping ok' , contact . peerId )
382
+
383
+ this . safeDispatchEvent ( 'peer:ping' , {
384
+ detail : contact . peerId
385
+ } )
386
+
413
387
return true
414
388
}
415
389
0 commit comments