Skip to content
This repository was archived by the owner on Dec 10, 2020. It is now read-only.

Commit ddb106e

Browse files
PhilippLghholgerd77
authored andcommitted
feat: add getRlpxInfo
1 parent d74c2ac commit ddb106e

File tree

2 files changed

+63
-8
lines changed

2 files changed

+63
-8
lines changed

lib/net/server/rlpxserver.ts

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export class RlpxServer extends Server {
4242

4343
public rlpx: Devp2pRLPx | null = null
4444
public dpt: Devp2pDPT | null = null
45+
public ip: string = '::'
4546

4647
/**
4748
* Create new DevP2P/RLPx server
@@ -59,6 +60,8 @@ export class RlpxServer extends Server {
5960
super(options)
6061
options = { ...defaultOptions, ...options }
6162

63+
// TODO: get the external ip from the upnp service
64+
this.ip = '::'
6265
this.port = options.port
6366
this.key = options.key
6467
this.clientFilter = options.clientFilter
@@ -83,6 +86,30 @@ export class RlpxServer extends Server {
8386
}
8487
}
8588

89+
/**
90+
* Return Rlpx info
91+
*/
92+
getRlpxInfo() {
93+
// TODO: return undefined? note that this.rlpx might be undefined if called before initRlpx
94+
if (!this.rlpx) {
95+
return {
96+
enode: undefined,
97+
id: undefined,
98+
ip: this.ip,
99+
listenAddr: `[${this.ip}]:${this.port}`,
100+
ports: { 'discovery': this.port, 'listener': this.port }
101+
}
102+
}
103+
const id = this.rlpx._id.toString('hex')
104+
return {
105+
enode: `enode://${id}@[${this.ip}]:${this.port}`,
106+
id: id,
107+
ip: this.ip,
108+
listenAddr: `[${this.ip}]:${this.port}`,
109+
ports: { 'discovery': this.port, 'listener': this.port }
110+
}
111+
}
112+
86113
/**
87114
* Start Devp2p/RLPx server. Returns a promise that resolves once server has been started.
88115
* @return Resolves with true if server successfully started
@@ -120,8 +147,8 @@ export class RlpxServer extends Server {
120147
*/
121148
async stop(): Promise<boolean> {
122149
if (this.started) {
123-
;(this.rlpx as Devp2pRLPx).destroy() // eslint-disable-line no-extra-semi
124-
;(this.dpt as Devp2pDPT).destroy()
150+
; (this.rlpx as Devp2pRLPx).destroy() // eslint-disable-line no-extra-semi
151+
; (this.dpt as Devp2pDPT).destroy()
125152
await super.stop()
126153
this.started = false
127154
}
@@ -138,7 +165,7 @@ export class RlpxServer extends Server {
138165
if (!this.started) {
139166
return false
140167
}
141-
;(this.dpt as Devp2pDPT).banPeer(peerId, maxAge) // eslint-disable-line no-extra-semi
168+
; (this.dpt as Devp2pDPT).banPeer(peerId, maxAge) // eslint-disable-line no-extra-semi
142169
return true
143170
}
144171

@@ -239,7 +266,7 @@ export class RlpxServer extends Server {
239266
this.rlpx.on('listening', () => {
240267
this.emit('listening', {
241268
transport: this.name,
242-
url: `enode://${(this.rlpx as Devp2pRLPx)._id.toString('hex')}@[::]:${this.port}`,
269+
url: this.getRlpxInfo().enode,
243270
})
244271
})
245272

test/net/server/rlpxserver.ts

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ const { defaultLogger } = require('../../../lib/logging')
66
defaultLogger.silent = true
77

88
tape('[RlpxServer]', (t) => {
9-
class RlpxPeer extends EventEmitter {}
9+
class RlpxPeer extends EventEmitter { }
1010
RlpxPeer.capabilities = td.func()
1111
RlpxPeer.prototype.accept = td.func()
1212
td.replace('../../../lib/net/peer/rlpxpeer', RlpxPeer)
13-
class RLPx extends EventEmitter {}
13+
class RLPx extends EventEmitter { }
1414
RLPx.prototype.listen = td.func()
15-
class DPT extends EventEmitter {}
15+
class DPT extends EventEmitter { }
1616
DPT.prototype.bind = td.func()
1717
td.replace('ethereumjs-devp2p', { DPT, RLPx })
1818
td.when(
@@ -72,7 +72,35 @@ tape('[RlpxServer]', (t) => {
7272
t.end()
7373
})
7474

75-
t.test('should handle errors', (t) => {
75+
t.test('should return rlpx server info', async (t) => {
76+
const mockId = '123'
77+
const server = new RlpxServer({
78+
bootnodes: '10.0.0.1:1234,10.0.0.2:1234'
79+
})
80+
server.initDpt = td.func()
81+
server.initRlpx = td.func()
82+
server.dpt = td.object()
83+
server.rlpx = td.object({
84+
_id: mockId,
85+
destroy: td.func()
86+
})
87+
td.when(server.dpt.bootstrap({ address: '10.0.0.1', udpPort: '1234', tcpPort: '1234' })).thenResolve()
88+
td.when(server.dpt.bootstrap({ address: '10.0.0.2', udpPort: '1234', tcpPort: '1234' })).thenReject('err0')
89+
server.on('error', err => t.equals(err, 'err0', 'got error'))
90+
await server.start()
91+
const nodeInfo = server.getRlpxInfo()
92+
t.deepEqual(nodeInfo, {
93+
enode: `enode://${mockId}@[::]:30303`,
94+
id: mockId,
95+
ip: '::',
96+
listenAddr: '[::]:30303',
97+
ports: { discovery: 30303, listener: 30303 }
98+
}, 'get nodeInfo')
99+
await server.stop()
100+
t.end()
101+
})
102+
103+
t.test('should handle errors', t => {
76104
t.plan(3)
77105
let count = 0
78106
const server = new RlpxServer()

0 commit comments

Comments
 (0)