1
1
import { logger } from '@libp2p/logger'
2
2
import { PeerSet } from '@libp2p/peer-collections'
3
- // @ts -expect-error no types
4
- import KBuck from 'k-bucket'
5
3
import Queue from 'p-queue'
6
4
import * as utils from '../utils.js'
5
+ import { KBucket , type PingEventDetails } from './k-bucket.js'
7
6
import type { ConnectionManager } from '@libp2p/interface-connection-manager'
8
7
import type { Metric , Metrics } from '@libp2p/interface-metrics'
9
8
import type { PeerId } from '@libp2p/interface-peer-id'
@@ -17,42 +16,6 @@ export const KBUCKET_SIZE = 20
17
16
export const PING_TIMEOUT = 10000
18
17
export const PING_CONCURRENCY = 10
19
18
20
- export interface KBucketPeer {
21
- id : Uint8Array
22
- peer : PeerId
23
- }
24
-
25
- export interface KBucket {
26
- id : Uint8Array
27
- contacts : KBucketPeer [ ]
28
- dontSplit : boolean
29
- left : KBucket
30
- right : KBucket
31
- }
32
-
33
- interface KBucketTreeEvents {
34
- 'ping' : ( oldContacts : KBucketPeer [ ] , newContact : KBucketPeer ) => void
35
- 'added' : ( contact : KBucketPeer ) => void
36
- 'removed' : ( contact : KBucketPeer ) => void
37
- }
38
-
39
- export interface KBucketTree {
40
- root : KBucket
41
- localNodeId : Uint8Array
42
-
43
- on : < U extends keyof KBucketTreeEvents > (
44
- event : U , listener : KBucketTreeEvents [ U ]
45
- ) => this
46
-
47
- closest : ( key : Uint8Array , count : number ) => KBucketPeer [ ]
48
- closestPeer : ( key : Uint8Array ) => KBucketPeer
49
- remove : ( key : Uint8Array ) => void
50
- add : ( peer : KBucketPeer ) => void
51
- get : ( key : Uint8Array ) => Uint8Array
52
- count : ( ) => number
53
- toIterable : ( ) => Iterable < KBucketPeer >
54
- }
55
-
56
19
export interface RoutingTableInit {
57
20
lan : boolean
58
21
protocol : string
@@ -76,7 +39,7 @@ export interface RoutingTableComponents {
76
39
*/
77
40
export class RoutingTable implements Startable {
78
41
public kBucketSize : number
79
- public kb ?: KBucketTree
42
+ public kb ?: KBucket
80
43
public pingQueue : Queue
81
44
82
45
private readonly log : Logger
@@ -135,15 +98,15 @@ export class RoutingTable implements Startable {
135
98
}
136
99
}
137
100
138
- const kBuck : KBucketTree = new KBuck ( {
101
+ const kBuck = new KBucket ( {
139
102
localNodeId : await utils . convertPeerId ( this . components . peerId ) ,
140
103
numberOfNodesPerKBucket : this . kBucketSize ,
141
104
numberOfNodesToPing : 1
142
105
} )
143
106
this . kb = kBuck
144
107
145
108
// test whether to evict peers
146
- kBuck . on ( 'ping' , this . _onPing )
109
+ kBuck . addEventListener ( 'ping' , this . _onPing )
147
110
148
111
// tag kad-close peers
149
112
this . _tagPeers ( kBuck )
@@ -160,7 +123,7 @@ export class RoutingTable implements Startable {
160
123
* - this will lower the chances that connections to them get closed when
161
124
* we reach connection limits
162
125
*/
163
- _tagPeers ( kBuck : KBucketTree ) : void {
126
+ _tagPeers ( kBuck : KBucket ) : void {
164
127
let kClosest = new PeerSet ( )
165
128
166
129
const updatePeerTags = utils . debounce ( ( ) => {
@@ -197,10 +160,10 @@ export class RoutingTable implements Startable {
197
160
kClosest = newClosest
198
161
} )
199
162
200
- kBuck . on ( 'added' , ( ) => {
163
+ kBuck . addEventListener ( 'added' , ( ) => {
201
164
updatePeerTags ( )
202
165
} )
203
- kBuck . on ( 'removed' , ( ) => {
166
+ kBuck . addEventListener ( 'removed' , ( ) => {
204
167
updatePeerTags ( )
205
168
} )
206
169
}
@@ -215,7 +178,12 @@ export class RoutingTable implements Startable {
215
178
* `oldContacts` will not be empty and is the list of contacts that
216
179
* have not been contacted for the longest.
217
180
*/
218
- _onPing ( oldContacts : KBucketPeer [ ] , newContact : KBucketPeer ) : void {
181
+ _onPing ( evt : CustomEvent < PingEventDetails > ) : void {
182
+ const {
183
+ oldContacts,
184
+ newContact
185
+ } = evt . detail
186
+
219
187
// add to a queue so multiple ping requests do not overlap and we don't
220
188
// flood the network with ping requests if lots of newContact requests
221
189
// are received
0 commit comments