diff --git a/package.json b/package.json index 4a0a39aa..54ad2d73 100644 --- a/package.json +++ b/package.json @@ -53,8 +53,8 @@ "ipfs-repo": "^2.0.0", "ipfs-utils": "^2.2.0", "iso-random-stream": "^1.1.1", - "libp2p": "^0.27.0", - "libp2p-kad-dht": "^0.18.3", + "libp2p": "libp2p/js-libp2p#0.28.x", + "libp2p-kad-dht": "^0.19.1", "libp2p-mplex": "^0.9.2", "libp2p-secio": "^0.12.1", "libp2p-tcp": "^0.14.2", @@ -66,9 +66,7 @@ "p-defer": "^3.0.0", "p-event": "^4.1.0", "p-wait-for": "^3.1.0", - "peer-book": "~0.9.0", "peer-id": "^0.13.5", - "peer-info": "^0.17.0", "promisify-es6": "^1.0.3", "rimraf": "^3.0.0", "stats-lite": "^2.2.0", diff --git a/src/index.js b/src/index.js index 380a7b72..32c1bb51 100644 --- a/src/index.js +++ b/src/index.js @@ -35,7 +35,7 @@ const statsKeys = [ class Bitswap { constructor (libp2p, blockstore, options) { this._libp2p = libp2p - this._log = logger(this.peerInfo.id) + this._log = logger(this.peerId) this._options = Object.assign({}, defaultOptions, options) @@ -52,16 +52,16 @@ class Bitswap { // local database this.blockstore = blockstore - this.engine = new DecisionEngine(this.peerInfo.id, blockstore, this.network, this._stats) + this.engine = new DecisionEngine(this.peerId, blockstore, this.network, this._stats) // handle message sending - this.wm = new WantManager(this.peerInfo.id, this.network, this._stats) + this.wm = new WantManager(this.peerId, this.network, this._stats) - this.notifications = new Notifications(this.peerInfo.id) + this.notifications = new Notifications(this.peerId) } - get peerInfo () { - return this._libp2p.peerInfo + get peerId () { + return this._libp2p.peerId } // handle messages received through the network diff --git a/src/network.js b/src/network.js index dc1678ce..63c37e32 100644 --- a/src/network.js +++ b/src/network.js @@ -13,7 +13,7 @@ const BITSWAP120 = '/ipfs/bitswap/1.2.0' class Network { constructor (libp2p, bitswap, options, stats) { - this._log = logger(libp2p.peerInfo.id, 'network') + this._log = logger(libp2p.peerId, 'network') options = options || {} this.libp2p = libp2p this.bitswap = bitswap @@ -37,14 +37,14 @@ class Network { this._running = true this.libp2p.handle(this.protocols, this._onConnection) - this.libp2p.on('peer:connect', this._onPeerConnect) - this.libp2p.on('peer:disconnect', this._onPeerDisconnect) + this.libp2p.connectionManager.on('peer:connect', this._onPeerConnect) + this.libp2p.connectionManager.on('peer:disconnect', this._onPeerDisconnect) // All existing connections are like new ones for us for (const peer of this.libp2p.peerStore.peers.values()) { - if (this.libp2p.registrar.getConnection(peer)) { - this._onPeerConnect(peer) - } + const conn = this.libp2p.connectionManager.get(peer.id) + + conn && this._onPeerConnect(conn) } } @@ -54,8 +54,8 @@ class Network { // Unhandle both, libp2p doesn't care if it's not already handled this.libp2p.unhandle(this.protocols) - this.libp2p.removeListener('peer:connect', this._onPeerConnect) - this.libp2p.removeListener('peer:disconnect', this._onPeerDisconnect) + this.libp2p.connectionManager.removeListener('peer:connect', this._onPeerConnect) + this.libp2p.connectionManager.removeListener('peer:disconnect', this._onPeerDisconnect) } /** @@ -92,12 +92,12 @@ class Network { } } - _onPeerConnect (peerInfo) { - this.bitswap._onPeerConnected(peerInfo.id) + _onPeerConnect (connection) { + this.bitswap._onPeerConnected(connection.remotePeer) } - _onPeerDisconnect (peerInfo) { - this.bitswap._onPeerDisconnected(peerInfo.id) + _onPeerDisconnect (connection) { + this.bitswap._onPeerDisconnected(connection.remotePeer) } /** @@ -168,7 +168,7 @@ class Network { /** * Connects to another peer * - * @param {PeerInfo|PeerId|Multiaddr} peer + * @param {PeerId|Multiaddr} peer * @returns {Promise.} */ async connectTo (peer) { // eslint-disable-line require-await diff --git a/test/bitswap-stats.js b/test/bitswap-stats.js index a30bdcad..fa3d3bab 100644 --- a/test/bitswap-stats.js +++ b/test/bitswap-stats.js @@ -171,7 +171,8 @@ describe('bitswap stats', () => { bs2 = bitswaps[1] bs2.start() - await libp2pNodes[0].dial(libp2pNodes[1].peerInfo) + libp2pNodes[0].peerStore.addressBook.set(libp2pNodes[1].peerId, libp2pNodes[1].multiaddrs) + await libp2pNodes[0].dial(libp2pNodes[1].peerId) block = await makeBlock() @@ -214,7 +215,7 @@ describe('bitswap stats', () => { }) it('has peer stats', async () => { - const peerStats = bs2.stat().forPeer(libp2pNodes[0].peerInfo.id) + const peerStats = bs2.stat().forPeer(libp2pNodes[0].peerId) expect(peerStats).to.exist() const stats = await pEvent(peerStats, 'update') diff --git a/test/bitswap.js b/test/bitswap.js index de4150db..8b5b6e4e 100644 --- a/test/bitswap.js +++ b/test/bitswap.js @@ -5,6 +5,7 @@ const chai = require('chai') chai.use(require('dirty-chai')) const expect = chai.expect const delay = require('delay') +const pWaitFor = require('p-wait-for') const Bitswap = require('../src') @@ -37,9 +38,12 @@ describe('bitswap without DHT', function () { ]) // connect 0 -> 1 && 1 -> 2 + nodes[0].libp2pNode.peerStore.addressBook.set(nodes[1].libp2pNode.peerId, nodes[1].libp2pNode.multiaddrs) + nodes[1].libp2pNode.peerStore.addressBook.set(nodes[2].libp2pNode.peerId, nodes[2].libp2pNode.multiaddrs) + await Promise.all([ - nodes[0].libp2pNode.dial(nodes[1].libp2pNode.peerInfo), - nodes[1].libp2pNode.dial(nodes[2].libp2pNode.peerInfo) + nodes[0].libp2pNode.dial(nodes[1].libp2pNode.peerId), + nodes[1].libp2pNode.dial(nodes[2].libp2pNode.peerId) ]) }) @@ -85,10 +89,22 @@ describe('bitswap with DHT', function () { ]) // connect 0 -> 1 && 1 -> 2 + nodes[0].libp2pNode.peerStore.addressBook.set(nodes[1].libp2pNode.peerId, nodes[1].libp2pNode.multiaddrs) + nodes[1].libp2pNode.peerStore.addressBook.set(nodes[2].libp2pNode.peerId, nodes[2].libp2pNode.multiaddrs) + + await Promise.all([ + nodes[0].libp2pNode.dial(nodes[1].libp2pNode.peerId), + nodes[1].libp2pNode.dial(nodes[2].libp2pNode.peerId) + ]) + + // await dht routing table are updated await Promise.all([ - nodes[0].libp2pNode.dial(nodes[1].libp2pNode.peerInfo), - nodes[1].libp2pNode.dial(nodes[2].libp2pNode.peerInfo) + pWaitFor(() => nodes[0].libp2pNode._dht.routingTable.size >= 1), + pWaitFor(() => nodes[1].libp2pNode._dht.routingTable.size >= 1) ]) + + // Give time to process + await delay(300) }) after(async () => { @@ -101,12 +117,11 @@ describe('bitswap with DHT', function () { it('put a block in 2, get it in 0', async () => { const block = await makeBlock() - nodes[2].bitswap.put(block) await nodes[2].bitswap.put(block) // Give put time to process - await delay(100) + await delay(300) const blockRetrieved = await nodes[0].bitswap.get(block.cid) expect(block.data).to.eql(blockRetrieved.data) diff --git a/test/network/gen-bitswap-network.node.js b/test/network/gen-bitswap-network.node.js index 39e596d9..0f07e907 100644 --- a/test/network/gen-bitswap-network.node.js +++ b/test/network/gen-bitswap-network.node.js @@ -81,7 +81,7 @@ async function exchangeBlocks (nodes, blocksPerNode = 10) { const d = Date.now() // fetch all blocks on every node - await Promise.all(nodes.map(async (node) => { + await Promise.all(nodes.map(async (node, index) => { const bs = await Promise.all(cids.map((cid) => node.bitswap.get(cid))) expect(bs).to.deep.equal(blocks) })) diff --git a/test/network/network.node.js b/test/network/network.node.js index 38517668..782abacf 100644 --- a/test/network/network.node.js +++ b/test/network/network.node.js @@ -78,7 +78,7 @@ describe('network', () => { it('connectTo fail', async () => { try { - await networkA.connectTo(p2pB.peerInfo.id) + await networkA.connectTo(p2pB.peerId) chai.assert.fail() } catch (err) { expect(err).to.exist() @@ -89,16 +89,17 @@ describe('network', () => { var counter = 0 bitswapMockA._onPeerConnected = (peerId) => { - expect(peerId.toB58String()).to.equal(p2pB.peerInfo.id.toB58String()) + expect(peerId.toB58String()).to.equal(p2pB.peerId.toB58String()) counter++ } bitswapMockB._onPeerConnected = (peerId) => { - expect(peerId.toB58String()).to.equal(p2pA.peerInfo.id.toB58String()) + expect(peerId.toB58String()).to.equal(p2pA.peerId.toB58String()) counter++ } - await p2pA.dial(p2pB.peerInfo) + p2pA.peerStore.addressBook.set(p2pB.peerId, p2pB.multiaddrs) + await p2pA.dial(p2pB.peerId) await pWaitFor(() => counter >= 2) bitswapMockA._onPeerConnected = () => {} @@ -106,7 +107,8 @@ describe('network', () => { }) it('connectTo success', async () => { - await networkA.connectTo(p2pB.peerInfo) + p2pA.peerStore.addressBook.set(p2pB.peerId, p2pB.multiaddrs) + await networkA.connectTo(p2pB.peerId) }) const versions = [{ @@ -136,7 +138,8 @@ describe('network', () => { bitswapMockB._receiveError = (err) => deferred.reject(err) - const { stream } = await p2pA.dialProtocol(p2pB.peerInfo, '/ipfs/bitswap/' + version.num) + // TODO: set addr + const { stream } = await p2pA.dialProtocol(p2pB.peerId, '/ipfs/bitswap/' + version.num) await pipe( [version.serialize(msg)], lp.encode(), @@ -167,11 +170,12 @@ describe('network', () => { bitswapMockB._receiveError = deferred.reject - await networkA.sendMessage(p2pB.peerInfo.id, msg) + await networkA.sendMessage(p2pB.peerId, msg) }) it('dial to peer on Bitswap 1.0.0', async () => { - const { protocol } = await p2pA.dialProtocol(p2pC.peerInfo, ['/ipfs/bitswap/1.1.0', '/ipfs/bitswap/1.0.0']) + p2pA.peerStore.addressBook.set(p2pC.peerId, p2pC.multiaddrs) + const { protocol } = await p2pA.dialProtocol(p2pC.peerId, ['/ipfs/bitswap/1.1.0', '/ipfs/bitswap/1.0.0']) expect(protocol).to.equal('/ipfs/bitswap/1.0.0') }) @@ -196,7 +200,7 @@ describe('network', () => { bitswapMockC._receiveError = deferred.reject - await networkA.sendMessage(p2pC.peerInfo.id, msg) + await networkA.sendMessage(p2pC.peerId, msg) await deferred.promise }) }) diff --git a/test/utils/connect-all.js b/test/utils/connect-all.js index 100bebd2..a396d4ad 100644 --- a/test/utils/connect-all.js +++ b/test/utils/connect-all.js @@ -5,7 +5,8 @@ const without = require('lodash.without') module.exports = async (nodes) => { for (const node of nodes) { for (const otherNode of without(nodes, node)) { - await node.libp2pNode.dial(otherNode.bitswap.peerInfo) + // TODO: set addrs + await node.libp2pNode.dial(otherNode.bitswap.peerId) } } } diff --git a/test/utils/create-libp2p-node.js b/test/utils/create-libp2p-node.js index 4e630a35..98649980 100644 --- a/test/utils/create-libp2p-node.js +++ b/test/utils/create-libp2p-node.js @@ -5,8 +5,8 @@ const MPLEX = require('libp2p-mplex') const SECIO = require('libp2p-secio') const libp2p = require('libp2p') const KadDHT = require('libp2p-kad-dht') -const PeerInfo = require('peer-info') const PeerId = require('peer-id') + const defaultsDeep = require('@nodeutils/defaults-deep') class Node extends libp2p { @@ -38,10 +38,13 @@ class Node extends libp2p { async function createLibp2pNode (options = {}) { const id = await PeerId.create({ bits: 512 }) - const peerInfo = new PeerInfo(id) - peerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/0') - options.peerInfo = peerInfo - const node = new Node(options) + const node = new Node({ + peerId: id, + addresses: { + listen: ['/ip4/0.0.0.0/tcp/0'] + }, + ...options + }) await node.start() return node diff --git a/test/utils/mocks.js b/test/utils/mocks.js index 2179b371..293fc7d1 100644 --- a/test/utils/mocks.js +++ b/test/utils/mocks.js @@ -1,8 +1,9 @@ 'use strict' const range = require('lodash.range') + const PeerId = require('peer-id') -const PeerInfo = require('peer-info') + const PeerStore = require('libp2p/src/peer-store') const Node = require('./create-libp2p-node').bundle const tmpdir = require('ipfs-utils/src/temp-dir') @@ -15,17 +16,21 @@ const Bitswap = require('../../src') * Create a mock libp2p node */ exports.mockLibp2pNode = () => { - const peerInfo = new PeerInfo(PeerId.createFromHexString('122019318b6e5e0cf93a2314bf01269a2cc23cd3dcd452d742cdb9379d8646f6e4a9')) + const peerId = PeerId.createFromHexString('122019318b6e5e0cf93a2314bf01269a2cc23cd3dcd452d742cdb9379d8646f6e4a9') return Object.assign(new EventEmitter(), { - peerInfo: peerInfo, + peerId, + multiaddrs: [], handle () {}, unhandle () {}, contentRouting: { provide: async (cid) => {}, // eslint-disable-line require-await findProviders: async (cid, timeout) => { return [] } // eslint-disable-line require-await }, - on () {}, + connectionManager: { + on () {}, + removeListener () {} + }, async dial (peer) { // eslint-disable-line require-await }, async dialProtocol (peer, protocol) { // eslint-disable-line require-await @@ -139,58 +144,44 @@ exports.applyNetwork = (bs, n) => { bs.engine.network = n } -let basePort = 12000 - /** * @private * @param {number} n The number of nodes in the network * @param {boolean} enableDHT Whether or not to run the dht */ exports.genBitswapNetwork = async (n, enableDHT = false) => { - const netArray = [] // bitswap, peerStore, libp2p, peerInfo, repo + const netArray = [] // bitswap, peerStore, libp2p, peerId, repo - // create PeerInfo and libp2p.Node for each + // create PeerId and libp2p.Node for each const peers = await Promise.all( - range(n).map(i => PeerInfo.create()) + range(n).map(i => PeerId.create()) ) peers.forEach((p, i) => { - basePort++ - p.multiaddrs.add('/ip4/127.0.0.1/tcp/' + basePort + '/ipfs/' + p.id.toB58String()) - const l = new Node({ - peerInfo: p, + peerId: p, + addresses: { + listen: ['/ip4/127.0.0.1/tcp/0'] + }, config: { dht: { enabled: enableDHT } } }) - netArray.push({ peerInfo: p, libp2p: l }) - }) - - // create PeerStore and populate peerStore - netArray.forEach((net, i) => { - const pb = netArray[i].libp2p.peerStore - netArray.forEach((net, j) => { - if (i === j) { - return - } - pb.put(net.peerInfo) - }) - netArray[i].peerStore = pb + netArray.push({ peerId: p, libp2p: l }) }) // create the repos const tmpDir = tmpdir() netArray.forEach((net, i) => { - const repoPath = tmpDir + '/' + net.peerInfo.id.toB58String() + const repoPath = tmpDir + '/' + net.peerId.toB58String() net.repo = new Repo(repoPath) }) await Promise.all( netArray.map(async (net) => { - const repoPath = tmpDir + '/' + net.peerInfo.id.toB58String() + const repoPath = tmpDir + '/' + net.peerId.toB58String() net.repo = new Repo(repoPath) await net.repo.init({}) @@ -203,6 +194,18 @@ exports.genBitswapNetwork = async (n, enableDHT = false) => { netArray.map((net) => net.libp2p.start()) ) + // create PeerStore and populate peerStore + netArray.forEach((net, i) => { + const pb = netArray[i].libp2p.peerStore + netArray.forEach((net, j) => { + if (i === j) { + return + } + pb.addressBook.set(net.peerId, net.libp2p.multiaddrs) + }) + netArray[i].peerStore = pb + }) + // create every BitSwap netArray.forEach((net) => { net.bitswap = new Bitswap(net.libp2p, net.repo.blocks, net.peerStore)