Skip to content
This repository was archived by the owner on Aug 29, 2023. It is now read-only.

Commit e204517

Browse files
committed
fix: catch errors on incomming sockets
1 parent 4694f9d commit e204517

File tree

3 files changed

+39
-36
lines changed

3 files changed

+39
-36
lines changed

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@
4646
"ip-address": "^5.8.6",
4747
"lodash.includes": "^4.3.0",
4848
"lodash.isfunction": "^3.0.8",
49-
"mafmt": "^2.1.7",
50-
"multiaddr": "^2.2.3",
49+
"mafmt": "^2.1.8",
50+
"multiaddr": "^2.3.0",
5151
"once": "^1.4.0",
5252
"stream-to-pull-stream": "^1.7.2"
5353
},

src/index.js

+15-12
Original file line numberDiff line numberDiff line change
@@ -12,40 +12,41 @@ const log = debug('libp2p:tcp:dial')
1212

1313
const createListener = require('./listener')
1414

15-
module.exports = class TCP {
16-
dial (ma, options, cb) {
15+
function noop () {}
16+
17+
class TCP {
18+
dial (ma, options, callback) {
1719
if (isFunction(options)) {
18-
cb = options
20+
callback = options
1921
options = {}
2022
}
2123

22-
if (!cb) {
23-
cb = () => {}
24-
}
24+
callback = callback || noop
2525

26-
cb = once(cb)
26+
callback = once(callback)
2727
const cOpts = ma.toOptions()
2828
log('Connecting to %s %s', cOpts.port, cOpts.host)
2929

3030
const rawSocket = net.connect(cOpts)
31+
3132
rawSocket.once('timeout', () => {
3233
log('timeout')
3334
rawSocket.emit('error', new Error('Timeout'))
3435
})
3536

36-
rawSocket.once('error', cb)
37+
rawSocket.once('error', callback)
3738

3839
rawSocket.once('connect', () => {
39-
rawSocket.removeListener('error', cb)
40-
cb()
40+
rawSocket.removeListener('error', callback)
41+
callback()
4142
})
4243

4344
const socket = toPull.duplex(rawSocket)
4445

4546
const conn = new Connection(socket)
4647

47-
conn.getObservedAddrs = (cb) => {
48-
return cb(null, [ma])
48+
conn.getObservedAddrs = (callback) => {
49+
return callback(null, [ma])
4950
}
5051

5152
return conn
@@ -74,3 +75,5 @@ module.exports = class TCP {
7475
})
7576
}
7677
}
78+
79+
module.exports = TCP

src/listener.js

+22-22
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,22 @@ const getMultiaddr = require('./get-multiaddr')
1414

1515
const IPFS_CODE = 421
1616
const CLOSE_TIMEOUT = 2000
17+
function noop () {}
1718

1819
module.exports = (handler) => {
1920
const listener = new EventEmitter()
2021

2122
const server = net.createServer((socket) => {
23+
// Avoid uncaught errors cause by unstable connections
24+
socket.on('error', noop)
25+
2226
const addr = getMultiaddr(socket)
2327
log('new connection', addr.toString())
2428

2529
const s = toPull.duplex(socket)
30+
2631
s.getObservedAddrs = (cb) => {
27-
return cb(null, [addr])
32+
cb(null, [addr])
2833
}
2934

3035
trackSocket(server, socket)
@@ -34,36 +39,31 @@ module.exports = (handler) => {
3439
listener.emit('connection', conn)
3540
})
3641

37-
server.on('listening', () => {
38-
listener.emit('listening')
39-
})
40-
41-
server.on('error', (err) => {
42-
listener.emit('error', err)
43-
})
44-
45-
server.on('close', () => {
46-
listener.emit('close')
47-
})
42+
server.on('listening', () => listener.emit('listening'))
43+
server.on('error', (err) => listener.emit('error', err))
44+
server.on('close', () => listener.emit('close'))
4845

4946
// Keep track of open connections to destroy in case of timeout
5047
server.__connections = {}
5148

52-
listener.close = (options, cb) => {
49+
listener.close = (options, callback) => {
5350
if (typeof options === 'function') {
54-
cb = options
51+
callback = options
5552
options = {}
5653
}
57-
cb = cb || (() => {})
54+
callback = callback || noop
5855
options = options || {}
5956

6057
let closed = false
61-
server.close(cb)
58+
server.close(callback)
59+
6260
server.once('close', () => {
6361
closed = true
6462
})
6563
setTimeout(() => {
66-
if (closed) return
64+
if (closed) {
65+
return
66+
}
6767

6868
log('unable to close graciously, destroying conns')
6969
Object.keys(server.__connections).forEach((key) => {
@@ -76,7 +76,7 @@ module.exports = (handler) => {
7676
let ipfsId
7777
let listeningAddr
7878

79-
listener.listen = (ma, cb) => {
79+
listener.listen = (ma, callback) => {
8080
listeningAddr = ma
8181
if (includes(ma.protoNames(), 'ipfs')) {
8282
ipfsId = getIpfsId(ma)
@@ -85,15 +85,15 @@ module.exports = (handler) => {
8585

8686
const lOpts = listeningAddr.toOptions()
8787
log('Listening on %s %s', lOpts.port, lOpts.host)
88-
return server.listen(lOpts.port, lOpts.host, cb)
88+
return server.listen(lOpts.port, lOpts.host, callback)
8989
}
9090

91-
listener.getAddrs = (cb) => {
91+
listener.getAddrs = (callback) => {
9292
const multiaddrs = []
9393
const address = server.address()
9494

9595
if (!address) {
96-
return cb(new Error('Listener is not ready yet'))
96+
return callback(new Error('Listener is not ready yet'))
9797
}
9898

9999
// Because TCP will only return the IPv6 version
@@ -128,7 +128,7 @@ module.exports = (handler) => {
128128
multiaddrs.push(ma)
129129
}
130130

131-
cb(null, multiaddrs)
131+
callback(null, multiaddrs)
132132
}
133133

134134
return listener

0 commit comments

Comments
 (0)