From 2440c872df3c10664e96adfc61b32b2afa3c72b5 Mon Sep 17 00:00:00 2001 From: Vasco Santos Date: Mon, 27 Jul 2020 10:53:23 +0200 Subject: [PATCH] fix: ping multiaddr from peer not previously stored in peerstore (#719) --- src/index.js | 9 +++++++-- src/ping/index.js | 4 ++-- test/core/ping.node.js | 11 +++++++++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/index.js b/src/index.js index 485cb547..4d5e578c 100644 --- a/src/index.js +++ b/src/index.js @@ -324,7 +324,7 @@ class Libp2p extends EventEmitter { * @returns {Promise} */ async dialProtocol (peer, protocols, options) { - const { id, multiaddrs } = getPeer(peer, this.peerStore) + const { id, multiaddrs } = getPeer(peer) let connection = this.connectionManager.get(id) if (!connection) { @@ -396,7 +396,12 @@ class Libp2p extends EventEmitter { * @returns {Promise} */ ping (peer) { - const { id } = getPeer(peer) + const { id, multiaddrs } = getPeer(peer) + + // If received multiaddr, ping it + if (multiaddrs) { + return ping(this, multiaddrs[0]) + } return ping(this, id) } diff --git a/src/ping/index.js b/src/ping/index.js index 85903230..7c481739 100644 --- a/src/ping/index.js +++ b/src/ping/index.js @@ -15,11 +15,11 @@ const { PROTOCOL, PING_LENGTH } = require('./constants') /** * Ping a given peer and wait for its response, getting the operation latency. * @param {Libp2p} node - * @param {PeerId} peer + * @param {PeerId|multiaddr} peer * @returns {Promise} */ async function ping (node, peer) { - log('dialing %s to %s', PROTOCOL, peer.toB58String()) + log('dialing %s to %s', PROTOCOL, peer.toB58String ? peer.toB58String() : peer) const { stream } = await node.dialProtocol(peer, PROTOCOL) diff --git a/test/core/ping.node.js b/test/core/ping.node.js index 439fac74..2438758f 100644 --- a/test/core/ping.node.js +++ b/test/core/ping.node.js @@ -17,7 +17,7 @@ describe('ping', () => { beforeEach(async () => { nodes = await peerUtils.createPeer({ - number: 2, + number: 3, config: baseOptions }) @@ -25,7 +25,14 @@ describe('ping', () => { nodes[1].peerStore.addressBook.set(nodes[0].peerId, nodes[0].multiaddrs) }) - it('ping once from peer0 to peer1', async () => { + it('ping once from peer0 to peer1 using a multiaddr', async () => { + const ma = `${nodes[2].multiaddrs[0]}/p2p/${nodes[2].peerId.toB58String()}` + const latency = await nodes[0].ping(ma) + + expect(latency).to.be.a('Number') + }) + + it('ping once from peer0 to peer1 using a peerId', async () => { const latency = await nodes[0].ping(nodes[1].peerId) expect(latency).to.be.a('Number')