Skip to content

Commit bf3bf0c

Browse files
authored
fix: pass peer id to onPeerConnect (#234)
The persistent peer store in libp2p 0.28 means sometimes we know about peers when we start up, so we try to start bitswap for them when we start up if we have an open connection already. The connection object has a remotePeer property that should be used instead of passing the whole thing to `this._onPeerConnect`. Adds a test for the above. Fixes ipfs/js-ipfs#3182
1 parent ce0a3c0 commit bf3bf0c

File tree

2 files changed

+76
-41
lines changed

2 files changed

+76
-41
lines changed

src/network.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class Network {
5353
for (const peer of this.libp2p.peerStore.peers.values()) {
5454
const conn = this.libp2p.connectionManager.get(peer.id)
5555

56-
conn && this._onPeerConnect(conn)
56+
conn && this._onPeerConnect(conn.remotePeer)
5757
}
5858
}
5959

test/network/network.node.js

Lines changed: 75 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,75 +5,63 @@ const { expect, assert } = require('aegir/utils/chai')
55
const lp = require('it-length-prefixed')
66
const pipe = require('it-pipe')
77
const pDefer = require('p-defer')
8-
const pWaitFor = require('p-wait-for')
98
const createLibp2pNode = require('../utils/create-libp2p-node')
109
const makeBlock = require('../utils/make-block')
1110
const Network = require('../../src/network')
1211
const Message = require('../../src/types/message')
1312

13+
function createBitswapMock () {
14+
return {
15+
_receiveMessage: async () => {},
16+
_receiveError: async () => {},
17+
_onPeerConnected: async () => {},
18+
_onPeerDisconnected: async () => {}
19+
}
20+
}
21+
1422
describe('network', () => {
1523
let p2pA
1624
let networkA
25+
let bitswapMockA
1726

1827
let p2pB
1928
let networkB
29+
let bitswapMockB
2030

2131
let p2pC
2232
let networkC
33+
let bitswapMockC
2334

2435
let blocks
2536

26-
before(async () => {
37+
beforeEach(async () => {
2738
[p2pA, p2pB, p2pC] = await Promise.all([
2839
createLibp2pNode(),
2940
createLibp2pNode(),
3041
createLibp2pNode()
3142
])
3243
blocks = await makeBlock(2)
33-
})
3444

35-
after(() => {
36-
p2pA.stop()
37-
p2pB.stop()
38-
p2pC.stop()
39-
})
40-
41-
const bitswapMockA = {
42-
_receiveMessage: async () => {},
43-
_receiveError: async () => {},
44-
_onPeerConnected: async () => {},
45-
_onPeerDisconnected: async () => {}
46-
}
45+
bitswapMockA = createBitswapMock()
46+
bitswapMockB = createBitswapMock()
47+
bitswapMockC = createBitswapMock()
4748

48-
const bitswapMockB = {
49-
_receiveMessage: async () => {},
50-
_receiveError: async () => {},
51-
_onPeerConnected: async () => {},
52-
_onPeerDisconnected: async () => {}
53-
}
54-
55-
const bitswapMockC = {
56-
_receiveMessage: async () => {},
57-
_receiveError: async () => {},
58-
_onPeerConnected: async () => {},
59-
_onPeerDisconnected: async () => {}
60-
}
61-
62-
it('instantiate the network obj', () => {
6349
networkA = new Network(p2pA, bitswapMockA)
6450
networkB = new Network(p2pB, bitswapMockB)
6551
// only bitswap100
6652
networkC = new Network(p2pC, bitswapMockC, { b100Only: true })
6753

68-
expect(networkA).to.exist()
69-
expect(networkB).to.exist()
70-
expect(networkC).to.exist()
71-
7254
networkA.start()
7355
networkB.start()
7456
networkC.start()
7557
})
7658

59+
afterEach(() => {
60+
p2pA.stop()
61+
p2pB.stop()
62+
p2pC.stop()
63+
})
64+
7765
it('connectTo fail', async () => {
7866
try {
7967
await networkA.connectTo(p2pB.peerId)
@@ -84,31 +72,70 @@ describe('network', () => {
8472
})
8573

8674
it('onPeerConnected success', async () => {
87-
var counter = 0
75+
const p2pAConnected = pDefer()
76+
const p2pBConnected = pDefer()
8877

8978
bitswapMockA._onPeerConnected = (peerId) => {
9079
expect(peerId.toB58String()).to.equal(p2pB.peerId.toB58String())
91-
counter++
80+
p2pBConnected.resolve()
9281
}
9382

9483
bitswapMockB._onPeerConnected = (peerId) => {
9584
expect(peerId.toB58String()).to.equal(p2pA.peerId.toB58String())
96-
counter++
85+
p2pAConnected.resolve()
9786
}
9887

9988
const ma = `${p2pB.multiaddrs[0]}/p2p/${p2pB.peerId.toB58String()}`
10089
await p2pA.dial(ma)
10190

102-
await pWaitFor(() => counter >= 2)
103-
bitswapMockA._onPeerConnected = () => {}
104-
bitswapMockB._onPeerConnected = () => {}
91+
await Promise.all([
92+
p2pAConnected,
93+
p2pBConnected
94+
])
10595
})
10696

10797
it('connectTo success', async () => {
10898
const ma = `${p2pB.multiaddrs[0]}/p2p/${p2pB.peerId.toB58String()}`
10999
await networkA.connectTo(ma)
110100
})
111101

102+
it('sets up peer handlers for previously connected peers', async () => {
103+
let p2pAConnected = pDefer()
104+
let p2pBConnected = pDefer()
105+
106+
bitswapMockA._onPeerConnected = (peerId) => {
107+
expect(peerId.toB58String()).to.equal(p2pB.peerId.toB58String())
108+
p2pBConnected.resolve()
109+
}
110+
111+
bitswapMockB._onPeerConnected = (peerId) => {
112+
expect(peerId.toB58String()).to.equal(p2pA.peerId.toB58String())
113+
p2pAConnected.resolve()
114+
}
115+
116+
const ma = `${p2pB.multiaddrs[0]}/p2p/${p2pB.peerId.toB58String()}`
117+
await p2pA.dial(ma)
118+
119+
await Promise.all([
120+
p2pAConnected,
121+
p2pBConnected
122+
])
123+
124+
networkA.stop()
125+
networkB.stop()
126+
127+
p2pAConnected = pDefer()
128+
p2pBConnected = pDefer()
129+
130+
networkA.start()
131+
networkB.start()
132+
133+
await Promise.all([
134+
p2pAConnected,
135+
p2pBConnected
136+
])
137+
})
138+
112139
const versions = [{
113140
num: '1.0.0', serialize: (msg) => msg.serializeToBitswap100()
114141
}, {
@@ -159,6 +186,10 @@ describe('network', () => {
159186
msg.addBlock(b1)
160187
msg.addBlock(b2)
161188

189+
// In a real network scenario, peers will be discovered and their addresses
190+
// will be added to the addressBook before bitswap kicks in
191+
p2pA.peerStore.addressBook.set(p2pB.peerId, p2pB.multiaddrs)
192+
162193
bitswapMockB._receiveMessage = async (peerId, msgReceived) => { // eslint-disable-line require-await
163194
expect(msg).to.eql(msgReceived)
164195
bitswapMockB._receiveMessage = async () => {}
@@ -189,6 +220,10 @@ describe('network', () => {
189220
msg.addBlock(b1)
190221
msg.addBlock(b2)
191222

223+
// In a real network scenario, peers will be discovered and their addresses
224+
// will be added to the addressBook before bitswap kicks in
225+
p2pA.peerStore.addressBook.set(p2pC.peerId, p2pC.multiaddrs)
226+
192227
bitswapMockC._receiveMessage = async (peerId, msgReceived) => { // eslint-disable-line require-await
193228
expect(msg).to.eql(msgReceived)
194229
bitswapMockC._receiveMessage = async () => {}

0 commit comments

Comments
 (0)