From ef729bba2e63b2b0075326f1911aa3cd72dc82f2 Mon Sep 17 00:00:00 2001 From: Friedel Ziegelmayer Date: Thu, 15 Sep 2016 08:39:07 +0200 Subject: [PATCH] feat(swarm): make interface-ipfs-core compliant Fixes #439 --- package.json | 1 + src/core/components/swarm.js | 23 ++++--- src/http-api/resources/swarm.js | 64 ++++++++++++++++--- src/http-api/routes/swarm.js | 31 +++++---- .../test-swarm.js | 7 +- 5 files changed, 89 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index 21b1881a24..219fb7a14c 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,7 @@ "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/core/components/swarm.js b/src/core/components/swarm.js index 465db28c63..d897358ebb 100644 --- a/src/core/components/swarm.js +++ b/src/core/components/swarm.js @@ -3,6 +3,7 @@ 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,18 +14,24 @@ module.exports = function swarm (self) { return callback(OFFLINE_ERROR) } - const mas = collectAddrs(self._libp2pNode.peerBook) + const peers = self._libp2pNode.peerBook.getAll() + 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 mas = collectAddrs(self._libp2pNode.peerBook) - callback(null, mas) + const peers = values(self._libp2pNode.peerBook.getAll()) + callback(null, peers) }), + localAddrs: promisify((callback) => { if (!self.isOnline()) { return callback(OFFLINE_ERROR) @@ -32,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) @@ -43,6 +51,7 @@ module.exports = function swarm (self) { self._libp2pNode.dialByMultiaddr(maddr, callback) }), + disconnect: promisify((maddr, callback) => { if (!self.isOnline()) { return callback(OFFLINE_ERROR) @@ -54,16 +63,10 @@ module.exports = function swarm (self) { self._libp2pNode.hangUpByMultiaddr(maddr, callback) }), + filters: promisify((callback) => { // TODO throw new Error('Not implemented') }) } } - -function collectAddrs (book) { - const peers = book.getAll() - return flatMap(Object.keys(peers), (id) => { - return peers[id].multiaddrs - }) -} 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/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)