From a6623c1ba20e189e769e12f7bf304610a7e38e6c Mon Sep 17 00:00:00 2001 From: David Dias Date: Mon, 27 Mar 2017 12:26:34 +0100 Subject: [PATCH] feat: new super simplified API --- README.md | 4 ++ package.json | 7 +-- src/index.js | 166 ++++++++++++++------------------------------------- 3 files changed, 53 insertions(+), 124 deletions(-) diff --git a/README.md b/README.md index 771e2e1a9c..a632d28ca5 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,10 @@ class Node extends libp2p { > Check if libp2p is started +#### `libp2p.ping(peer [, options], callback)` + +> Ping a node in the network + #### `libp2p.peerBook` > PeerBook instance of the node diff --git a/package.json b/package.json index 3d0a4757cf..ec4696d51d 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ }, "homepage": "https://github.com/libp2p/js-libp2p", "devDependencies": { - "aegir": "^11.0.0", + "aegir": "^11.0.1", "chai": "^3.5.0", "dirty-chai": "^1.2.2", "pre-commit": "^1.2.2" @@ -42,8 +42,7 @@ "dependencies": { "libp2p-ping": "~0.3.2", "libp2p-swarm": "~0.26.19", - "mafmt": "^2.1.6", - "multiaddr": "^2.2.2", + "multiaddr": "^2.2.3", "peer-book": "~0.3.1", "peer-id": "~0.8.4", "peer-info": "~0.8.4" @@ -55,4 +54,4 @@ "greenkeeperio-bot ", "mayerwin " ] -} \ No newline at end of file +} diff --git a/src/index.js b/src/index.js index 47984055ce..8aab1da8a8 100644 --- a/src/index.js +++ b/src/index.js @@ -5,8 +5,7 @@ const PeerId = require('peer-id') const PeerInfo = require('peer-info') const PeerBook = require('peer-book') const multiaddr = require('multiaddr') -const mafmt = require('mafmt') -const EE = require('events').EventEmitter +const EventEmitter = require('events').EventEmitter const assert = require('assert') const Ping = require('libp2p-ping') const setImmediate = require('async/setImmediate') @@ -14,10 +13,10 @@ const setImmediate = require('async/setImmediate') exports = module.exports const OFFLINE_ERROR_MESSAGE = 'The libp2p node is not started yet' -const IPFS_CODE = 421 -class Node { +class Node extends EventEmitter { constructor (_modules, _peerInfo, _peerBook, _options) { + super() assert(_modules, 'requires modules to equip libp2p with features') assert(_peerInfo, 'requires a PeerInfo instance') @@ -26,8 +25,6 @@ class Node { this.peerBook = _peerBook || new PeerBook() this.isOnline = false - this.discovery = new EE() - this.swarm = new Swarm(this.peerInfo) // Attach stream multiplexers @@ -66,9 +63,7 @@ class Node { let discoveries = this.modules.discovery discoveries = Array.isArray(discoveries) ? discoveries : [discoveries] discoveries.forEach((discovery) => { - discovery.on('peer', (peerInfo) => { - this.discovery.emit('peer', peerInfo) - }) + discovery.on('peer', (peerInfo) => this.emit('peer', peerInfo)) }) } @@ -142,88 +137,26 @@ class Node { this.swarm.close(callback) } - // - // Ping - // - - // TODO - pingById (id, callback) { - assert(this.isOnline, OFFLINE_ERROR_MESSAGE) - callback(new Error('not implemented yet')) - } - - // TODO - pingByMultiaddr (maddr, callback) { - assert(this.isOnline, OFFLINE_ERROR_MESSAGE) - callback(new Error('not implemented yet')) + isOn () { + return this.isOnline } - pingByPeerInfo (peerInfo, callback) { - assert(this.isOnline, OFFLINE_ERROR_MESSAGE) + ping (peer, callback) { + assert(this.isOn, OFFLINE_ERROR_MESSAGE) + const peerInfo = this._getPeerInfo(peer) callback(null, new Ping(this.swarm, peerInfo)) } - // - // Dialing methods - // - - // TODO - dialById (id, protocol, callback) { - // NOTE: dialById only works if a previous dial was made. This will - // change once we have PeerRouting - - assert(this.isOnline, OFFLINE_ERROR_MESSAGE) - - if (typeof protocol === 'function') { - callback = protocol - protocol = undefined - } - - callback(new Error('not implemented yet')) - } - - dialByMultiaddr (maddr, protocol, callback) { - assert(this.isOnline, OFFLINE_ERROR_MESSAGE) - - if (typeof protocol === 'function') { - callback = protocol - protocol = undefined - } - - if (typeof maddr === 'string') { - maddr = multiaddr(maddr) - } - - if (!mafmt.IPFS.matches(maddr.toString())) { - return callback(new Error('multiaddr not valid')) - } - - const ipfsIdB58String = maddr.stringTuples().filter((tuple) => { - if (tuple[0] === IPFS_CODE) { - return true - } - })[0][1] - - let peer - try { - peer = this.peerBook.getByB58String(ipfsIdB58String) - } catch (err) { - peer = new PeerInfo(PeerId.createFromB58String(ipfsIdB58String)) - } - - peer.multiaddr.add(maddr) - this.dialByPeerInfo(peer, protocol, callback) - } - - dialByPeerInfo (peer, protocol, callback) { + dial (peer, protocol, callback) { assert(this.isOnline, OFFLINE_ERROR_MESSAGE) + const peerInfo = this._getPeerInfo(peer) if (typeof protocol === 'function') { callback = protocol protocol = undefined } - this.swarm.dial(peer, protocol, (err, conn) => { + this.swarm.dial(peerInfo, protocol, (err, conn) => { if (err) { return callback(err) } @@ -232,52 +165,14 @@ class Node { }) } - // - // Disconnecting (hangUp) methods - // - - hangUpById (id, callback) { - // TODO - callback(new Error('not implemented yet')) - } - - hangUpByMultiaddr (maddr, callback) { + hangUp (peer, callback) { assert(this.isOnline, OFFLINE_ERROR_MESSAGE) + const peerInfo = this._getPeerInfo(peer) - if (typeof maddr === 'string') { - maddr = multiaddr(maddr) - } - - if (!mafmt.IPFS.matches(maddr.toString())) { - return callback(new Error('multiaddr not valid')) - } - - const ipfsIdB58String = maddr.stringTuples().filter((tuple) => { - if (tuple[0] === IPFS_CODE) { - return true - } - })[0][1] - - try { - const pi = this.peerBook.getByB58String(ipfsIdB58String) - this.hangUpByPeerInfo(pi, callback) - } catch (err) { - // already disconnected - callback() - } - } - - hangUpByPeerInfo (peer, callback) { - assert(this.isOnline, OFFLINE_ERROR_MESSAGE) - - this.peerBook.removeByB58String(peer.id.toB58String()) + this.peerBook.removeByB58String(peerInfo.id.toB58String()) this.swarm.hangUp(peer, callback) } - // - // Protocol multiplexing handling - // - handle (protocol, handlerFunc, matchFunc) { this.swarm.handle(protocol, handlerFunc, matchFunc) } @@ -285,6 +180,37 @@ class Node { unhandle (protocol) { this.swarm.unhandle(protocol) } + + /* + * Helper method to check the data type of peer and convert it to PeerInfo + */ + _getPeerInfo (peer) { + let p + switch (peer) { + case PeerInfo.isPeerInfo(peer): p = peer; break + case multiaddr.isMultiaddr(peer): { + const peerIdB58Str = multiaddr.getPeerId(peer) + try { + p = this.peerBook.getByB58String(peerIdB58Str) + } catch (err) { + p = new PeerInfo(PeerId.createFromB58String(peerIdB58Str)) + } + p.multiaddr.add(peer) + } break + case PeerId.isPeerId(peer): { + const peerIdB58Str = peer.toB58String() + try { + p = this.peerBook.getByB58String(peerIdB58Str) + } catch (err) { + // TODO this is where PeerRouting comes into place + throw new Error('No knowledge about: ' + peerIdB58Str) + } + } break + default: throw new Error('Peer type not recognized') + } + + return p + } } module.exports = Node