diff --git a/src/core/components/index.js b/src/core/components/index.js index 44d922712a..64afaa2b09 100644 --- a/src/core/components/index.js +++ b/src/core/components/index.js @@ -3,6 +3,7 @@ exports.add = require('./add') exports.config = require('./config') exports.init = require('./init') +exports.ping = require('./ping') exports.start = require('./start') exports.stop = require('./stop') diff --git a/src/core/components/ping-pull-stream.js b/src/core/components/ping-pull-stream.js deleted file mode 100644 index 838378bace..0000000000 --- a/src/core/components/ping-pull-stream.js +++ /dev/null @@ -1,100 +0,0 @@ -'use strict' - -const debug = require('debug') -const OFFLINE_ERROR = require('../utils').OFFLINE_ERROR -const PeerId = require('peer-id') -const pull = require('pull-stream') -const Pushable = require('pull-pushable') - -const log = debug('ipfs:pingPullStream') -log.error = debug('ipfs:pingPullStream:error') - -module.exports = function pingPullStream (self) { - return (peerId, opts) => { - if (!self.isOnline()) { - return pull.error(new Error(OFFLINE_ERROR)) - } - - opts = Object.assign({ count: 10 }, opts) - - const source = Pushable() - - getPeer(self.libp2p, source, peerId, (err, peer) => { - if (err) { - log.error(err) - source.end(err) - return - } - - runPing(self.libp2p, source, opts.count, peer, (err) => { - if (err) { - log.error(err) - source.push(getPacket({ success: false, text: err.toString() })) - source.end() - } - }) - }) - - return source - } -} - -function getPacket (msg) { - // Default msg - const basePacket = { success: true, time: 0, text: '' } - return Object.assign(basePacket, msg) -} - -function getPeer (libp2pNode, statusStream, peerIdStr, cb) { - let peerId - - try { - peerId = PeerId.createFromB58String(peerIdStr) - } catch (err) { - return cb(err) - } - - let peerInfo - - try { - peerInfo = libp2pNode.peerBook.get(peerId) - } catch (err) { - log('Peer not found in peer book, trying peer routing') - - // Share lookup status just as in the go implemmentation - statusStream.push(getPacket({ text: `Looking up peer ${peerIdStr}` })) - return libp2pNode.peerRouting.findPeer(peerId, cb) - } - - cb(null, peerInfo) -} - -function runPing (libp2pNode, statusStream, count, peer, cb) { - libp2pNode.ping(peer, (err, p) => { - if (err) { return cb(err) } - - let packetCount = 0 - let totalTime = 0 - statusStream.push(getPacket({ text: `PING ${peer.id.toB58String()}` })) - - p.on('ping', (time) => { - statusStream.push(getPacket({ time })) - totalTime += time - packetCount++ - if (packetCount >= count) { - const average = totalTime / count - p.stop() - statusStream.push(getPacket({ text: `Average latency: ${average}ms` })) - statusStream.end() - } - }) - - p.on('error', (err) => { - log.error(err) - p.stop() - cb(err) - }) - - p.start() - }) -} diff --git a/src/core/components/ping-readable-stream.js b/src/core/components/ping-readable-stream.js deleted file mode 100644 index b6809ffb48..0000000000 --- a/src/core/components/ping-readable-stream.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -const toStream = require('pull-stream-to-stream') - -module.exports = function pingReadableStream (self) { - return (peerId, opts) => toStream.source(self.pingPullStream(peerId, opts)) -} diff --git a/src/core/components/ping.js b/src/core/components/ping.js index 5f0aa61be3..efc0e1bc33 100644 --- a/src/core/components/ping.js +++ b/src/core/components/ping.js @@ -1,18 +1,44 @@ 'use strict' -const promisify = require('promisify-es6') -const pull = require('pull-stream/pull') - -module.exports = function ping (self) { - return promisify((peerId, opts, callback) => { - if (typeof opts === 'function') { - callback = opts - opts = {} +const PeerId = require('peer-id') +const basePacket = { success: true, time: 0, text: '' } + +module.exports = ({ libp2p }) => { + return async function * (peerId, options) { + options = options || {} + options.count = options.count || 10 + + if (!PeerId.isPeerId(peerId)) { + peerId = PeerId.createFromCID(peerId) } - pull( - self.pingPullStream(peerId, opts), - pull.collect(callback) - ) - }) + let peerInfo + if (libp2p.peerStore.has(peerId)) { + peerInfo = libp2p.peerStore.get(peerId) + } else { + yield { ...basePacket, text: `Looking up peer ${peerId}` } + peerInfo = await libp2p.peerRouting.findPeer(peerId) + } + + yield { ...basePacket, text: `PING ${peerInfo.id.toB58String()}` } + + let packetCount = 0 + let totalTime = 0 + + for (let i = 0; i < options.count; i++) { + try { + const time = libp2p.ping(peerInfo) + totalTime += time + packetCount++ + yield { ...basePacket, time } + } catch (err) { + yield { ...basePacket, success: false, text: err.toString() } + } + } + + if (packetCount) { + const average = totalTime / packetCount + yield { ...basePacket, text: `Average latency: ${average}ms` } + } + } } diff --git a/src/core/components/start.js b/src/core/components/start.js index f9f41c7458..bbae1cb271 100644 --- a/src/core/components/start.js +++ b/src/core/components/start.js @@ -133,6 +133,7 @@ function createApi ({ add, config: Commands.config({ repo }), init: () => { throw new AlreadyInitializedError() }, + ping: Commands.ping({ libp2p }), start: () => apiManager.api, stop }