diff --git a/package.json b/package.json index c933244bad..2b71f89a71 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "gulp": "^3.9.1", "idb-plus-blob-store": "^1.1.2", "idb-pull-blob-store": "^0.4.0", - "interface-ipfs-core": "^0.14.6", + "interface-ipfs-core": "^0.15.0", "left-pad": "^1.1.1", "lodash": "^4.15.0", "ncp": "^2.0.0", @@ -68,7 +68,7 @@ "detect-node": "^2.0.3", "glob": "^7.0.6", "hapi": "^15.0.3", - "ipfs-api": "^8.0.4", + "ipfs-api": "^9.0.0", "ipfs-bitswap": "^0.7.0", "ipfs-block": "^0.3.0", "ipfs-block-service": "^0.5.0", @@ -81,10 +81,12 @@ "joi": "^9.0.4", "libp2p-ipfs": "^0.14.1", "libp2p-ipfs-browser": "^0.15.1", + "lodash.flatmap": "^4.5.0", "lodash.get": "^4.4.2", "lodash.has": "^4.5.2", "lodash.set": "^4.3.2", "lodash.sortby": "^4.7.0", + "lodash.values": "^4.3.0", "mafmt": "^2.1.2", "map-limit": "0.0.1", "multiaddr": "^2.0.3", diff --git a/src/cli/commands/swarm/addrs.js b/src/cli/commands/swarm/addrs.js index 2a9630c321..d5ef9706c0 100644 --- a/src/cli/commands/swarm/addrs.js +++ b/src/cli/commands/swarm/addrs.js @@ -20,7 +20,21 @@ module.exports = { if (err) { throw err } - // TODO + + ipfs.swarm.addrs((err, res) => { + if (err) { + throw err + } + + res.forEach((peer) => { + const count = peer.multiaddrs.length + console.log(`${peer.id.toB58String()} (${count})`) + peer.multiaddrs.forEach((addr) => { + const res = addr.decapsulate('ipfs').toString() + console.log(`\t${res}`) + }) + }) + }) }) } } diff --git a/src/cli/commands/swarm/addrs/local.js b/src/cli/commands/swarm/addrs/local.js index 92a35a2524..cb559fb564 100644 --- a/src/cli/commands/swarm/addrs/local.js +++ b/src/cli/commands/swarm/addrs/local.js @@ -27,8 +27,8 @@ module.exports = { throw err } - res.Strings.forEach((addr) => { - console.log(addr) + res.forEach((addr) => { + console.log(addr.toString()) }) }) }) diff --git a/src/cli/commands/swarm/peers.js b/src/cli/commands/swarm/peers.js index e26db3e106..2804ef62ae 100644 --- a/src/cli/commands/swarm/peers.js +++ b/src/cli/commands/swarm/peers.js @@ -27,8 +27,8 @@ module.exports = { throw err } - res.Strings.forEach((addr) => { - console.log(addr) + res.forEach((addr) => { + console.log(addr.toString()) }) }) }) diff --git a/src/core/components/swarm.js b/src/core/components/swarm.js index a4410f97b1..d897358ebb 100644 --- a/src/core/components/swarm.js +++ b/src/core/components/swarm.js @@ -2,6 +2,8 @@ const multiaddr = require('multiaddr') const promisify = require('promisify-es6') +const flatMap = require('lodash.flatmap') +const values = require('lodash.values') const OFFLINE_ERROR = require('../utils').OFFLINE_ERROR @@ -13,36 +15,23 @@ module.exports = function swarm (self) { } const peers = self._libp2pNode.peerBook.getAll() - const mas = [] - Object - .keys(peers) - .forEach((b58Id) => { - peers[b58Id].multiaddrs.forEach((ma) => { - // TODO this should only print the addr we are using - mas.push(ma) - }) - }) + const mas = flatMap(Object.keys(peers), (id) => { + return peers[id].multiaddrs + }) callback(null, mas) }), + // all the addrs we know addrs: promisify((callback) => { if (!self.isOnline()) { return callback(OFFLINE_ERROR) } - const peers = self._libp2pNode.peerBook.getAll() - const mas = [] - Object - .keys(peers) - .forEach((b58Id) => { - peers[b58Id].multiaddrs.forEach((ma) => { - // TODO this should only print the addr we are using - mas.push(ma) - }) - }) - callback(null, mas) + const peers = values(self._libp2pNode.peerBook.getAll()) + callback(null, peers) }), + localAddrs: promisify((callback) => { if (!self.isOnline()) { return callback(OFFLINE_ERROR) @@ -50,6 +39,7 @@ module.exports = function swarm (self) { callback(null, self._libp2pNode.peerInfo.multiaddrs) }), + connect: promisify((maddr, callback) => { if (!self.isOnline()) { return callback(OFFLINE_ERROR) @@ -61,6 +51,7 @@ module.exports = function swarm (self) { self._libp2pNode.dialByMultiaddr(maddr, callback) }), + disconnect: promisify((maddr, callback) => { if (!self.isOnline()) { return callback(OFFLINE_ERROR) @@ -72,6 +63,7 @@ module.exports = function swarm (self) { self._libp2pNode.hangUpByMultiaddr(maddr, callback) }), + filters: promisify((callback) => { // TODO throw new Error('Not implemented') diff --git a/src/http-api/resources/swarm.js b/src/http-api/resources/swarm.js index f311526884..a71dbf0a24 100644 --- a/src/http-api/resources/swarm.js +++ b/src/http-api/resources/swarm.js @@ -25,9 +25,28 @@ exports.parseAddrs = (request, reply) => { } exports.peers = { - // main route handler which is called after the above `parseArgs`, but only if the args were valid handler: (request, reply) => { - request.server.app.ipfs.swarm.peers((err, peers) => { + const ipfs = request.server.app.ipfs + ipfs.swarm.peers((err, peers) => { + if (err) { + log.error(err) + return reply({ + Message: err.toString(), + Code: 0 + }).code(500) + } + + return reply({ + Strings: peers.map((addr) => addr.toString()) + }) + }) + } +} + +exports.addrs = { + handler: (request, reply) => { + const ipfs = request.server.app.ipfs + ipfs.swarm.addrs((err, peers) => { if (err) { log.error(err) return reply({ @@ -36,19 +55,22 @@ exports.peers = { }).code(500) } + const addrs = {} + peers.forEach((peer) => { + addrs[peer.id.toB58String()] = peer.multiaddrs.map((addr) => addr.toString()) + }) + return reply({ - Strings: Object.keys(peers) - .map((key) => - `${peers[key].multiaddrs[0].toString()}/ipfs/${peers[key].id.toB58String()}`) + Addrs: addrs }) }) } } exports.localAddrs = { - // main route handler which is called after the above `parseArgs`, but only if the args were valid handler: (request, reply) => { - request.server.app.ipfs.swarm.localAddrs((err, addrs) => { + const ipfs = request.server.app.ipfs + ipfs.swarm.localAddrs((err, addrs) => { if (err) { log.error(err) return reply({ @@ -71,8 +93,9 @@ exports.connect = { // main route handler which is called after the above `parseArgs`, but only if the args were valid handler: (request, reply) => { const addr = request.pre.args.addr + const ipfs = request.server.app.ipfs - request.server.app.ipfs.swarm.connect(addr, (err) => { + ipfs.swarm.connect(addr, (err) => { if (err) { log.error(err) return reply({ @@ -87,3 +110,28 @@ exports.connect = { }) } } + +exports.disconnect = { + // uses common parseAddr method that returns a `addr` + parseArgs: exports.parseAddrs, + + // main route handler which is called after the above `parseArgs`, but only if the args were valid + handler: (request, reply) => { + const addr = request.pre.args.addr + const ipfs = request.server.app.ipfs + + ipfs.swarm.disconnect(addr, (err) => { + if (err) { + log.error(err) + return reply({ + Message: err.toString(), + Code: 0 + }).code(500) + } + + return reply({ + Strings: [`disconnect ${addr} success`] + }) + }) + } +} diff --git a/src/http-api/routes/swarm.js b/src/http-api/routes/swarm.js index 3b4844cd5a..0667acded4 100644 --- a/src/http-api/routes/swarm.js +++ b/src/http-api/routes/swarm.js @@ -13,13 +13,13 @@ module.exports = (server) => { } }) - // api.route({ - // method: '*', - // path: '/api/v0/swarm/addrs', - // config: { - // handler: resources.swarm.addrs.handler - // } - // }) + api.route({ + method: '*', + path: '/api/v0/swarm/addrs', + config: { + handler: resources.swarm.addrs.handler + } + }) api.route({ method: '*', @@ -40,13 +40,16 @@ module.exports = (server) => { } }) - // api.route({ - // method: '*', - // path: '/api/v0/swarm/disconnect', - // config: { - // handler: resources.swarm.disconnect - // } - // }) + api.route({ + method: '*', + path: '/api/v0/swarm/disconnect', + config: { + pre: [ + { method: resources.swarm.disconnect.parseArgs, assign: 'args' } + ], + handler: resources.swarm.disconnect.handler + } + }) // TODO // api.route({ diff --git a/test/cli/test-swarm.js b/test/cli/test-swarm.js index 622fad725d..edeaa3ce9b 100644 --- a/test/cli/test-swarm.js +++ b/test/cli/test-swarm.js @@ -26,7 +26,8 @@ describe('swarm', function () { expect(err).to.not.exist ipfs.id((err, identity) => { expect(err).to.not.exist - ipfsAddr = `${identity.addresses[0]}/ipfs/${identity.id}` + ipfsAddr = identity.addresses[0] + console.log('addr', ipfsAddr) done() }) }) @@ -51,18 +52,32 @@ describe('swarm', function () { }) }) - // TODO revisit these once interface-ipfs-core over http-api are done - it.skip('connect', (done) => { + it('connect', (done) => { nexpect.spawn('node', [process.cwd() + '/src/cli/bin.js', 'swarm', 'connect', ipfsAddr], {env}) .run((err, stdout, exitcode) => { expect(err).to.not.exist expect(exitcode).to.equal(0) + expect(stdout).to.be.eql([ + `connect ${ipfsAddr} success` + ]) done() }) }) - it.skip('peers', (done) => { + it('peers', (done) => { nexpect.spawn('node', [process.cwd() + '/src/cli/bin.js', 'swarm', 'peers'], {env}) + .run((err, stdout, exitcode) => { + expect(err).to.not.exist + expect(exitcode).to.equal(0) + expect(stdout).to.be.eql([ + ipfsAddr + ]) + done() + }) + }) + + it('addrs', (done) => { + nexpect.spawn('node', [process.cwd() + '/src/cli/bin.js', 'swarm', 'addrs'], {env}) .run((err, stdout, exitcode) => { expect(err).to.not.exist expect(exitcode).to.equal(0) @@ -71,7 +86,7 @@ describe('swarm', function () { }) }) - it.skip('addrs local', (done) => { + it('addrs local', (done) => { nexpect.spawn('node', [process.cwd() + '/src/cli/bin.js', 'swarm', 'addrs', 'local'], {env}) .run((err, stdout, exitcode) => { expect(err).to.not.exist diff --git a/test/http-api/interface-ipfs-core-over-ipfs-api/test-swarm.js b/test/http-api/interface-ipfs-core-over-ipfs-api/test-swarm.js index c8e332e12d..d0527da0f3 100644 --- a/test/http-api/interface-ipfs-core-over-ipfs-api/test-swarm.js +++ b/test/http-api/interface-ipfs-core-over-ipfs-api/test-swarm.js @@ -2,7 +2,6 @@ 'use strict' -/* const test = require('interface-ipfs-core') const FactoryClient = require('./../../utils/factory-http') @@ -17,7 +16,5 @@ const common = { fc.dismantle(callback) } } -*/ -// TODO -// Needs: https://github.com/ipfs/js-libp2p-ipfs/pull/16 -// test.swarm(common) + +test.swarm(common)