From c64846a44c58f9a192cadcd33c6a028ddd5f9073 Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Mon, 16 Dec 2019 16:35:57 +0000 Subject: [PATCH 1/2] refactor: convert swarm API to async/await --- src/core/components/index.js | 7 +++ src/core/components/init.js | 7 +++ src/core/components/start.js | 7 +++ src/core/components/stop.js | 7 +++ src/core/components/swarm.js | 79 ------------------------ src/core/components/swarm/addrs.js | 13 ++++ src/core/components/swarm/connect.js | 7 +++ src/core/components/swarm/disconnect.js | 7 +++ src/core/components/swarm/local-addrs.js | 7 +++ src/core/components/swarm/peers.js | 31 ++++++++++ 10 files changed, 93 insertions(+), 79 deletions(-) delete mode 100644 src/core/components/swarm.js create mode 100644 src/core/components/swarm/addrs.js create mode 100644 src/core/components/swarm/connect.js create mode 100644 src/core/components/swarm/disconnect.js create mode 100644 src/core/components/swarm/local-addrs.js create mode 100644 src/core/components/swarm/peers.js diff --git a/src/core/components/index.js b/src/core/components/index.js index 1abb7f4499..4a9bcab492 100644 --- a/src/core/components/index.js +++ b/src/core/components/index.js @@ -26,6 +26,13 @@ exports.object = { exports.ping = require('./ping') exports.start = require('./start') exports.stop = require('./stop') +exports.swarm = { + addrs: require('./swarm/addrs'), + connect: require('./swarm/connect'), + disconnect: require('./swarm/disconnect'), + localAddrs: require('./swarm/localAddrs'), + peers: require('./swarm/peers') +} exports.version = require('./version') exports.legacy = { // TODO: these will be removed as the new API is completed diff --git a/src/core/components/init.js b/src/core/components/init.js index e5b6788f63..91d457d7db 100644 --- a/src/core/components/init.js +++ b/src/core/components/init.js @@ -319,6 +319,13 @@ function createApi ({ init: () => { throw new AlreadyInitializedError() }, object, start, + swarm: { + addrs: () => { throw new NotStartedError() }, + connect: () => { throw new NotStartedError() }, + disconnect: () => { throw new NotStartedError() }, + localAddrs: Commands.swarm.localAddrs({ peerInfo }), + peers: () => { throw new NotStartedError() } + }, version: Commands.version({ repo }) } diff --git a/src/core/components/start.js b/src/core/components/start.js index 5234820fa8..2465be61f7 100644 --- a/src/core/components/start.js +++ b/src/core/components/start.js @@ -159,6 +159,13 @@ function createApi ({ : () => { throw new NotEnabledError('pubsub not enabled') }, start: () => apiManager.api, stop, + swarm: { + addrs: () => Commands.swarm.addrs({ libp2p }), + connect: () => Commands.swarm.connect({ libp2p }), + disconnect: () => Commands.swarm.disconnect({ libp2p }), + localAddrs: Commands.swarm.localAddrs({ peerInfo }), + peers: () => Commands.swarm.peers({ libp2p }) + }, version: Commands.version({ repo }) } diff --git a/src/core/components/stop.js b/src/core/components/stop.js index 9be69ec1d6..3bd422f297 100644 --- a/src/core/components/stop.js +++ b/src/core/components/stop.js @@ -117,6 +117,13 @@ function createApi ({ init: () => { throw new AlreadyInitializedError() }, start, stop: () => apiManager.api, + swarm: { + addrs: () => { throw new NotStartedError() }, + connect: () => { throw new NotStartedError() }, + disconnect: () => { throw new NotStartedError() }, + localAddrs: Commands.swarm.localAddrs({ peerInfo }), + peers: () => { throw new NotStartedError() } + }, version: Commands.version({ repo }) } diff --git a/src/core/components/swarm.js b/src/core/components/swarm.js deleted file mode 100644 index 45d1b8ebe5..0000000000 --- a/src/core/components/swarm.js +++ /dev/null @@ -1,79 +0,0 @@ -'use strict' - -const callbackify = require('callbackify') -const OFFLINE_ERROR = require('../utils').OFFLINE_ERROR - -module.exports = function swarm (self) { - return { - peers: callbackify.variadic(async (opts) => { // eslint-disable-line require-await - opts = opts || {} - - if (!self.isOnline()) { - throw new Error(OFFLINE_ERROR) - } - - const verbose = opts.v || opts.verbose - // TODO: return latency and streams when verbose is set - // we currently don't have this information - - const peers = [] - - Object.values(self._peerInfoBook.getAll()).forEach((peer) => { - const connectedAddr = peer.isConnected() - - if (!connectedAddr) { return } - - const tupple = { - addr: connectedAddr, - peer: peer.id - } - if (verbose) { - tupple.latency = 'n/a' - } - - peers.push(tupple) - }) - - return peers - }), - - // all the addrs we know - addrs: callbackify(async () => { // eslint-disable-line require-await - if (!self.isOnline()) { - throw new Error(OFFLINE_ERROR) - } - - const peers = Object.values(self._peerInfoBook.getAll()) - - return peers - }), - - localAddrs: callbackify(async () => { // eslint-disable-line require-await - if (!self.isOnline()) { - throw new Error(OFFLINE_ERROR) - } - - return self.libp2p.peerInfo.multiaddrs.toArray() - }), - - connect: callbackify(async (maddr) => { // eslint-disable-line require-await - if (!self.isOnline()) { - throw new Error(OFFLINE_ERROR) - } - - return self.libp2p.dial(maddr) - }), - - disconnect: callbackify(async (maddr) => { // eslint-disable-line require-await - if (!self.isOnline()) { - throw new Error(OFFLINE_ERROR) - } - - return self.libp2p.hangUp(maddr) - }), - - filters: callbackify(async () => { // eslint-disable-line require-await - throw new Error('Not implemented') - }) - } -} diff --git a/src/core/components/swarm/addrs.js b/src/core/components/swarm/addrs.js new file mode 100644 index 0000000000..ee095be07a --- /dev/null +++ b/src/core/components/swarm/addrs.js @@ -0,0 +1,13 @@ +'use strict' + +const CID = require('cids') + +module.exports = ({ libp2p }) => { + return async function addrs () { // eslint-disable-line require-await + const peers = [] + for (const [peerId, peerInfo] of libp2p.peerStore.entries()) { + peers.push({ id: new CID(peerId), addrs: peerInfo.multiaddrs.toArray() }) + } + return peers + } +} diff --git a/src/core/components/swarm/connect.js b/src/core/components/swarm/connect.js new file mode 100644 index 0000000000..98f7217f71 --- /dev/null +++ b/src/core/components/swarm/connect.js @@ -0,0 +1,7 @@ +'use strict' + +module.exports = ({ libp2p }) => { + return function connect (addr) { + return libp2p.dial(addr) + } +} diff --git a/src/core/components/swarm/disconnect.js b/src/core/components/swarm/disconnect.js new file mode 100644 index 0000000000..3e9aadae52 --- /dev/null +++ b/src/core/components/swarm/disconnect.js @@ -0,0 +1,7 @@ +'use strict' + +module.exports = ({ libp2p }) => { + return function disconnect (addr) { + return libp2p.hangUp(addr) + } +} diff --git a/src/core/components/swarm/local-addrs.js b/src/core/components/swarm/local-addrs.js new file mode 100644 index 0000000000..bc2ee7df71 --- /dev/null +++ b/src/core/components/swarm/local-addrs.js @@ -0,0 +1,7 @@ +'use strict' + +module.exports = ({ peerInfo }) => { + return async function localAddrs () { // eslint-disable-line require-await + return peerInfo.multiaddrs.toArray() + } +} diff --git a/src/core/components/swarm/peers.js b/src/core/components/swarm/peers.js new file mode 100644 index 0000000000..104dccc3f5 --- /dev/null +++ b/src/core/components/swarm/peers.js @@ -0,0 +1,31 @@ +'use strict' + +const CID = require('cids') + +module.exports = ({ libp2p }) => { + return async function peers (options) { // eslint-disable-line require-await + options = options || {} + + const verbose = options.v || options.verbose + const peers = [] + + for (const [peerId, peerInfo] of libp2p.peerStore.peers.entries()) { + const connectedAddr = peerInfo.isConnected() + + if (!connectedAddr) continue + + const tupple = { + addr: connectedAddr, + peer: new CID(peerId) + } + + if (verbose) { + tupple.latency = 'n/a' + } + + peers.push(tupple) + } + + return peers + } +} From 89b96cce0748c7c276e59556f843fdb6ca9117bf Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Mon, 16 Dec 2019 22:12:10 +0000 Subject: [PATCH 2/2] refactor: use libp2p.connections --- src/core/components/swarm/peers.js | 31 ++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/core/components/swarm/peers.js b/src/core/components/swarm/peers.js index 104dccc3f5..3fbc45c9c8 100644 --- a/src/core/components/swarm/peers.js +++ b/src/core/components/swarm/peers.js @@ -9,21 +9,24 @@ module.exports = ({ libp2p }) => { const verbose = options.v || options.verbose const peers = [] - for (const [peerId, peerInfo] of libp2p.peerStore.peers.entries()) { - const connectedAddr = peerInfo.isConnected() - - if (!connectedAddr) continue - - const tupple = { - addr: connectedAddr, - peer: new CID(peerId) + for (const [peerId, connections] of libp2p.connections) { + for (const connection of connections) { + const tupple = { + addr: connection.remoteAddr, + peer: new CID(peerId) + } + + if (verbose || options.direction) { + tupple.direction = connection.stat.direction + } + + if (verbose) { + tupple.muxer = connection.stat.multiplexer + tupple.latency = 'n/a' + } + + peers.push(tupple) } - - if (verbose) { - tupple.latency = 'n/a' - } - - peers.push(tupple) } return peers