Skip to content

Commit 8b589f0

Browse files
committed
devp2p -> DPT: improved peer related typings
1 parent 9937927 commit 8b589f0

File tree

4 files changed

+39
-37
lines changed

4 files changed

+39
-37
lines changed

packages/devp2p/src/dpt/dpt.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ import { Server as DPTServer } from './server'
1010

1111
const debug = createDebugLogger('devp2p:dpt')
1212

13+
export interface PeerInfo {
14+
id?: Uint8Array | Buffer
15+
address?: string
16+
udpPort?: number | null
17+
tcpPort?: number | null
18+
}
19+
1320
export class DPT extends EventEmitter {
1421
privateKey: Buffer
1522
banlist: BanList
@@ -28,8 +35,8 @@ export class DPT extends EventEmitter {
2835
this.banlist = new BanList()
2936

3037
this._kbucket = new KBucket(this._id)
31-
this._kbucket.on('added', (peer) => this.emit('peer:added', peer))
32-
this._kbucket.on('removed', (peer) => this.emit('peer:removed', peer))
38+
this._kbucket.on('added', (peer: PeerInfo) => this.emit('peer:added', peer))
39+
this._kbucket.on('removed', (peer: PeerInfo) => this.emit('peer:removed', peer))
3340
this._kbucket.on('ping', this._onKBucketPing)
3441

3542
this._server = new DPTServer(this, this.privateKey, {
@@ -55,7 +62,7 @@ export class DPT extends EventEmitter {
5562
this._server.destroy(...args)
5663
}
5764

58-
_onKBucketPing(oldPeers: any[], newPeer: any): void {
65+
_onKBucketPing(oldPeers: PeerInfo[], newPeer: PeerInfo): void {
5966
if (this.banlist.has(newPeer)) return
6067

6168
let count = 0
@@ -81,15 +88,15 @@ export class DPT extends EventEmitter {
8188
for (const peer of peers) this.addPeer(peer).catch(() => {})
8289
}
8390

84-
async bootstrap(peer: any): Promise<void> {
91+
async bootstrap(peer: PeerInfo): Promise<void> {
8592
debug(`bootstrap with peer ${peer.address}:${peer.udpPort}`)
8693

8794
peer = await this.addPeer(peer)
8895
if (!this._id) return
8996
this._server.findneighbours(peer, this._id)
9097
}
9198

92-
async addPeer(obj: any): Promise<any> {
99+
async addPeer(obj: PeerInfo): Promise<any> {
93100
if (this.banlist.has(obj)) throw new Error('Peer is banned')
94101
debug(`attempt adding peer ${obj.address}:${obj.udpPort}`)
95102

@@ -109,23 +116,23 @@ export class DPT extends EventEmitter {
109116
}
110117
}
111118

112-
getPeer(obj: any): any {
119+
getPeer(obj: string | Buffer | PeerInfo) {
113120
return this._kbucket.get(obj)
114121
}
115122

116-
getPeers(): any[] {
123+
getPeers() {
117124
return this._kbucket.getAll()
118125
}
119126

120-
getClosestPeers(id: string): any {
127+
getClosestPeers(id: string) {
121128
return this._kbucket.closest(id)
122129
}
123130

124131
removePeer(obj: any) {
125132
this._kbucket.remove(obj)
126133
}
127134

128-
banPeer(obj: any, maxAge?: number) {
135+
banPeer(obj: string | Buffer | PeerInfo, maxAge?: number) {
129136
this.banlist.add(obj, maxAge)
130137
this._kbucket.remove(obj)
131138
}

packages/devp2p/src/dpt/kbucket.ts

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,58 @@
11
import { EventEmitter } from 'events'
22
import _KBucket = require('k-bucket')
3+
import { PeerInfo } from './dpt'
34

45
const KBUCKET_SIZE = 16
56
const KBUCKET_CONCURRENCY = 3
67

7-
export interface KObj {
8-
id?: string
9-
port?: string
10-
address?: string
8+
export interface CustomContact extends PeerInfo {
9+
id: Uint8Array | Buffer
10+
vectorClock: number
1111
}
1212

1313
export class KBucket extends EventEmitter {
14-
_peers: Map<string, any> = new Map()
14+
_peers: Map<string, PeerInfo> = new Map()
1515
_kbucket: _KBucket
1616
constructor(id: string | Buffer) {
1717
super()
1818

19-
this._kbucket = new _KBucket({
19+
this._kbucket = new _KBucket<CustomContact>({
2020
localNodeId: typeof id === 'string' ? Buffer.from(id) : id,
2121
numberOfNodesPerKBucket: KBUCKET_SIZE,
2222
numberOfNodesToPing: KBUCKET_CONCURRENCY,
2323
})
2424

25-
this._kbucket.on('added', (peer: any) => {
25+
this._kbucket.on('added', (peer: PeerInfo) => {
2626
KBucket.getKeys(peer).forEach((key) => this._peers.set(key, peer))
2727
this.emit('added', peer)
2828
})
2929

30-
this._kbucket.on('removed', (peer: any) => {
30+
this._kbucket.on('removed', (peer: PeerInfo) => {
3131
KBucket.getKeys(peer).forEach((key) => this._peers.delete(key))
3232
this.emit('removed', peer)
3333
})
3434

35-
this._kbucket.on('ping', (...args: any[]) => this.emit('ping', ...args))
35+
this._kbucket.on('ping', (oldPeers: PeerInfo[], newPeer: PeerInfo) => {
36+
this.emit('ping', { oldPeers, newPeer })
37+
})
3638
}
3739

38-
static getKeys(obj: Buffer | string | KObj): string[] {
40+
static getKeys(obj: Buffer | string | PeerInfo): string[] {
3941
if (Buffer.isBuffer(obj)) return [obj.toString('hex')]
4042
if (typeof obj === 'string') return [obj]
4143

4244
const keys = []
4345
if (Buffer.isBuffer(obj.id)) keys.push(obj.id.toString('hex'))
44-
if (obj.address && obj.port) keys.push(`${obj.address}:${obj.port}`)
46+
//if (obj.address && obj.port) keys.push(`${obj.address}:${obj.port}`)
4547
return keys
4648
}
4749

48-
add(peer: any) {
50+
add(peer: PeerInfo) {
4951
const isExists = KBucket.getKeys(peer).some((key) => this._peers.has(key))
50-
if (!isExists) this._kbucket.add(peer)
52+
if (!isExists) this._kbucket.add(peer as CustomContact)
5153
}
5254

53-
get(obj: Buffer | string | KObj) {
55+
get(obj: Buffer | string | PeerInfo) {
5456
for (const key of KBucket.getKeys(obj)) {
5557
const peer = this._peers.get(key)
5658
if (peer !== undefined) return peer
@@ -59,16 +61,16 @@ export class KBucket extends EventEmitter {
5961
return null
6062
}
6163

62-
getAll(): Array<any> {
64+
getAll(): Array<PeerInfo> {
6365
return this._kbucket.toArray()
6466
}
6567

66-
closest(id: string): any {
68+
closest(id: string): PeerInfo[] {
6769
return this._kbucket.closest(Buffer.from(id), KBUCKET_SIZE)
6870
}
6971

70-
remove(obj: Buffer | string | KObj) {
72+
remove(obj: Buffer | string | PeerInfo) {
7173
const peer = this.get(obj)
72-
if (peer !== null) this._kbucket.remove(peer.id)
74+
if (peer !== null) this._kbucket.remove((peer as CustomContact).id)
7375
}
7476
}

packages/devp2p/src/dpt/message.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,14 @@ import ip from 'ip'
33
import * as rlp from 'rlp'
44
import secp256k1 from 'secp256k1'
55
import { keccak256, int2buffer, buffer2int, assertEq, unstrictDecode } from '../util'
6+
import { PeerInfo } from './dpt'
67

78
const debug = createDebugLogger('devp2p:dpt:server')
89

910
function getTimestamp() {
1011
return (Date.now() / 1000) | 0
1112
}
1213

13-
export interface PeerInfo {
14-
id?: Buffer
15-
address?: string
16-
udpPort?: number | null
17-
tcpPort?: number | null
18-
}
19-
2014
const timestamp = {
2115
encode: function (value = getTimestamp() + 60) {
2216
const buffer = Buffer.allocUnsafe(4)
@@ -133,7 +127,7 @@ type OutNeighborMsg = { [0]: Buffer[][]; [1]: Buffer }
133127
const neighbours = {
134128
encode: function (obj: InNeighborMsg): OutNeighborMsg {
135129
return [
136-
obj.peers.map((peer: PeerInfo) => endpoint.encode(peer).concat(peer.id!)),
130+
obj.peers.map((peer: PeerInfo) => endpoint.encode(peer).concat(peer.id! as Buffer)),
137131
timestamp.encode(obj.timestamp),
138132
]
139133
},

packages/devp2p/src/dpt/server.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ import { debug as createDebugLogger } from 'debug'
55
import LRUCache = require('lru-cache')
66
import { encode, decode } from './message'
77
import { keccak256, pk2id, createDeferred, formatLogId } from '../util'
8-
import { DPT } from './dpt'
8+
import { DPT, PeerInfo } from './dpt'
99
import { Socket as DgramSocket, RemoteInfo } from 'dgram'
10-
import { PeerInfo } from './message'
1110

1211
const debug = createDebugLogger('devp2p:dpt:server')
1312
const verbose = createDebugLogger('verbose').enabled

0 commit comments

Comments
 (0)