Skip to content
This repository was archived by the owner on Feb 26, 2021. It is now read-only.

Commit ae9fb1c

Browse files
dirkmcjacobheun
authored andcommitted
feat: retrieve peers on connect (#64)
* feat: retrieve peers on connect * fix: clean up connections in dial and disconnect tests * fix: remove rendezvous server from discover test * chore: merge from master
1 parent f3e1dc4 commit ae9fb1c

File tree

4 files changed

+73
-14
lines changed

4 files changed

+73
-14
lines changed

src/listener.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class Listener extends EE {
103103

104104
const maStr = this.ma.toString()
105105

106-
this.io.emit('ss-join', maStr, pubKeyStr, (err, sig) => {
106+
this.io.emit('ss-join', maStr, pubKeyStr, (err, sig, peers) => {
107107
if (err) { return callback(err) }
108108

109109
if (sig) {
@@ -127,7 +127,7 @@ class Listener extends EE {
127127
return callback(new Error('Tried to listen on a server with crypto challenge disabled!\n This is prohibited by default and can lead to security issues!\n Please set "allowJoinWithDisabledChallenge" to true in the constructor options (but only if you know what you are doing)!'))
128128
}
129129
this.signature = '_'
130-
callback()
130+
callback(null, null, peers)
131131
}
132132
})
133133
}
@@ -215,8 +215,8 @@ class Listener extends EE {
215215

216216
series([
217217
(cb) => this._up(cb),
218-
(cb) => this._crypto(cb)
219-
], (err) => {
218+
(cb) => this._crypto((err, ignore, peers) => cb(err, peers))
219+
], (err, [ignore, peers]) => {
220220
if (err) {
221221
// Error connecting to WebSocket
222222
if (err.description && err.description.code === 'ENOTFOUND') {
@@ -241,15 +241,23 @@ class Listener extends EE {
241241
this.io.on('reconnect', () => {
242242
// force to get a new signature
243243
this.signature = null
244-
this._crypto((err) => {
244+
this._crypto((err, ignore, reconnectPeers) => {
245245
if (err) {
246246
this.log('reconnect error', err)
247247
this.emit('error', err)
248-
} else this.log('reconnected')
248+
} else {
249+
this.log('reconnected')
250+
for (const p of (reconnectPeers || [])) {
251+
this.emit('peer', p)
252+
}
253+
}
249254
})
250255
})
251256

252257
this.emit('listening')
258+
for (const p of (peers || [])) {
259+
this.emit('peer', p)
260+
}
253261
callback()
254262
})
255263
}

test/dial.spec.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,16 +100,26 @@ describe('dial', () => {
100100
ws1.dial(ma2, (err, conn) => {
101101
expect(err).to.not.exist()
102102

103+
let endFn
104+
let ended = false
103105
pull(
104-
(end, cb) => {},
106+
// Prevent end until test has completed
107+
(end, cb) => {
108+
endFn = cb
109+
},
105110
conn,
106111
pull.drain(() => {
107-
expect('Stream should never end').to.not.exist()
112+
// Should not be called until test has completed
113+
ended = true
108114
})
109115
)
110116

111117
listeners[0].close(() => {})
112-
listeners[0].listen(ma1, done)
118+
listeners[0].listen(ma1, () => {
119+
expect(ended).to.be.equal(false)
120+
endFn(true)
121+
done()
122+
})
113123
})
114124
})
115125

test/disconnect.spec.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
const multiaddr = require('multiaddr')
66
const series = require('async/series')
7+
const each = require('async/each')
78
const pull = require('pull-stream')
89

910
const WebSocketStar = require('../src')
@@ -17,6 +18,7 @@ describe('disconnect', () => {
1718

1819
let conn
1920
let otherConn
21+
const listeners = []
2022

2123
before((done) => {
2224
series([first, second], dial)
@@ -26,29 +28,38 @@ describe('disconnect', () => {
2628

2729
const listener = ws1.createListener((conn) => pull(conn, conn))
2830
listener.listen(ma1, next)
31+
listeners.push(listener)
2932
}
3033

3134
function second (next) {
3235
ws2 = new WebSocketStar({ allowJoinWithDisabledChallenge: true })
3336

3437
const listener = ws2.createListener((conn) => (otherConn = conn))
3538
listener.listen(ma2, next)
39+
listeners.push(listener)
3640
}
3741

3842
function dial () {
3943
conn = ws1.dial(ma2, done)
4044
}
4145
})
4246

47+
after(done => each(listeners, (l, next) => l.close(next), done))
48+
4349
it('all conns die when one peer quits', (done) => {
50+
let endFn
4451
pull(
52+
(end, cb) => {
53+
endFn = cb
54+
},
4555
conn,
4656
pull.collect(err => {
4757
if (err) return done(err)
4858
pull(
4959
otherConn,
5060
pull.collect(err => {
5161
if (err) return done(err)
62+
endFn(true)
5263
done()
5364
})
5465
)

test/discovery.spec.js

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@ const WebSocketStar = require('../src')
1414
describe('peer discovery', () => {
1515
let listeners = []
1616
let ws1
17-
const ma1 = multiaddr('/ip4/127.0.0.1/tcp/15001/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo3A')
18-
17+
const ma1 = multiaddr('/ip4/127.0.0.1/tcp/15001/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo4A')
1918
let ws2
20-
const ma2 = multiaddr('/ip4/127.0.0.1/tcp/15003/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo3B')
19+
const ma2 = multiaddr('/ip4/127.0.0.1/tcp/15002/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo4B')
20+
let ws3
21+
const ma3 = multiaddr('/ip4/127.0.0.1/tcp/15002/ws/p2p-websocket-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo4C')
22+
23+
after(done => each(listeners, (l, next) => l.close(next), done))
2124

2225
it('listen on the first', (done) => {
2326
ws1 = new WebSocketStar({ allowJoinWithDisabledChallenge: true })
@@ -45,7 +48,34 @@ describe('peer discovery', () => {
4548
listener.listen(ma2, (err) => {
4649
expect(err).to.not.exist()
4750
})
48-
}).timeout(5000)
51+
})
52+
53+
it('new peer receives peer events for all other peers on connect', (done) => {
54+
ws3 = new WebSocketStar({ allowJoinWithDisabledChallenge: true })
55+
56+
const discovered = []
57+
ws3.discovery.on('peer', (peerInfo) => {
58+
discovered.push(peerInfo.multiaddrs)
59+
if (discovered.length === 2) {
60+
gotAllPeerEvents()
61+
}
62+
})
4963

50-
after(done => each(listeners, (l, next) => l.close(next), done))
64+
const gotAllPeerEvents = () => {
65+
const allMas = new Set()
66+
discovered.forEach(mas => {
67+
mas.forEach(ma => allMas.add(ma.toString()))
68+
})
69+
expect(allMas.has(ma1.toString())).to.equal(true)
70+
expect(allMas.has(ma2.toString())).to.equal(true)
71+
done()
72+
}
73+
74+
const listener = ws3.createListener((/* conn */) => {})
75+
76+
listeners.push(listener)
77+
listener.listen(ma3, (err) => {
78+
expect(err).to.not.exist()
79+
})
80+
})
5181
})

0 commit comments

Comments
 (0)