From c4d9e3273c138e42e49817151cc496e57f621568 Mon Sep 17 00:00:00 2001 From: David Dias Date: Tue, 20 Feb 2018 08:40:36 +0000 Subject: [PATCH] feat: (BREAKING CHANGE) overhaul libp2p config and constructor --- .aegir.js | 29 ++-- README.md | 84 ++++++--- examples/transports/1.js | 17 +- examples/transports/2.js | 17 +- examples/transports/3.js | 18 +- examples/transports/README.md | 40 +++-- package.json | 15 +- src/index.js | 162 +++++++++++------- test/base.js | 14 -- test/browser.js | 1 - test/circuit-relay.node.js | 76 ++++---- test/content-routing.node.js | 11 +- ...ltiaddr-trim.js => multiaddr-trim.node.js} | 9 +- test/node.js | 3 +- test/peer-discovery.node.js | 28 ++- test/peer-routing.node.js | 11 +- test/pubsub.node.js | 4 +- test/stats.js | 2 +- test/stream-muxing.node.js | 12 +- test/transports.browser.js | 95 +++++----- test/transports.node.js | 111 ++++++------ test/utils/bundle-browser.js | 103 +++++++++++ test/utils/bundle-nodejs.js | 97 +++++++++++ test/utils/bundle.browser.js | 74 -------- test/utils/bundle.node.js | 80 --------- test/utils/{node.js => create-node.js} | 19 +- test/utils/echo.js | 10 ++ 27 files changed, 673 insertions(+), 469 deletions(-) delete mode 100644 test/base.js rename test/{multiaddr-trim.js => multiaddr-trim.node.js} (73%) create mode 100644 test/utils/bundle-browser.js create mode 100644 test/utils/bundle-nodejs.js delete mode 100644 test/utils/bundle.browser.js delete mode 100644 test/utils/bundle.node.js rename test/utils/{node.js => create-node.js} (67%) create mode 100644 test/utils/echo.js diff --git a/.aegir.js b/.aegir.js index fa915ef4fe..ab0e020c8c 100644 --- a/.aegir.js +++ b/.aegir.js @@ -5,10 +5,11 @@ const PeerId = require('peer-id') const pull = require('pull-stream') const parallel = require('async/parallel') -const rawPeer = require('./test/fixtures/test-peer.json') -const Node = require('./test/utils/bundle.node.js') -const sigServer = require('libp2p-webrtc-star/src/sig-server') const WebSocketStarRendezvous = require('libp2p-websocket-star-rendezvous') +const sigServer = require('libp2p-webrtc-star/src/sig-server') + +const rawPeer = require('./test/fixtures/test-peer.json') +const Node = require('./test/utils/bundle-nodejs.js') let wrtcRendezvous let wsRendezvous @@ -21,7 +22,9 @@ const before = (done) => { port: 15555 // cryptoChallenge: true TODO: needs https://github.com/libp2p/js-libp2p-webrtc-star/issues/128 }, (err, server) => { - if (err) { return cb(err) } + if (err) { + return cb(err) + } wrtcRendezvous = server cb() }) @@ -33,7 +36,9 @@ const before = (done) => { strictMultiaddr: false, cryptoChallenge: true }, (err, _server) => { - if (err) { return cb(err) } + if (err) { + return cb(err) + } wsRendezvous = _server cb() }) @@ -47,7 +52,9 @@ const before = (done) => { peer.multiaddrs.add('/ip4/127.0.0.1/tcp/9200/ws') - node = new Node(peer) + node = new Node({ + peerInfo: peer + }) node.handle('/echo/1.0.0', (protocol, conn) => pull(conn, conn)) node.start(cb) }) @@ -56,11 +63,11 @@ const before = (done) => { } const after = (done) => { - setTimeout(() => parallel( - [node, wrtcRendezvous, wsRendezvous].map((s) => { - return (cb) => s.stop(cb) - }) - , done), 2000) + setTimeout(() => + parallel( + [node, wrtcRendezvous, wsRendezvous].map((s) => (cb) => s.stop(cb)), + done), + 2000) } module.exports = { diff --git a/README.md b/README.md index a096839955..9277f4c078 100644 --- a/README.md +++ b/README.md @@ -101,47 +101,85 @@ libp2p becomes very simple and basically acts as a glue for every module that co ```JavaScript // Creating a bundle that adds: // transport: websockets + tcp -// stream-muxing: SPDY +// stream-muxing: spdy & mplex // crypto-channel: secio // discovery: multicast-dns const libp2p = require('libp2p') const TCP = require('libp2p-tcp') const WS = require('libp2p-websockets') -const spdy = require('libp2p-spdy') -const secio = require('libp2p-secio') +const SPDY = require('libp2p-spdy') +const MPLEX = require('libp2p-mplex') +const SECIO = require('libp2p-secio') const MulticastDNS = require('libp2p-mdns') const DHT = require('libp2p-kad-dht') +const defaultsDeep = require('lodash.defaultsdeep') class Node extends libp2p { - constructor (peerInfo, peerBook, options) { - options = options || {} - - const modules = { - transport: [ - new TCP(), - new WS() - ], - connection: { - muxer: [ - spdy + constructor (_peerInfo, _peerBook, _options) { + const defaults = { + peerInfo: _peerInfo // The Identity of your Peer + peerBook: _peerBook, // Where peers get tracked, if undefined libp2p will create one instance + + // The libp2p modules for this libp2p bundle + modules: { + transport: [ + TCP, + new WS() // It can take instances too! ], - crypto: [ - secio + streamMuxer: [ + SPDY, + MPLEX + ], + connEncryption: [ + SECIO ] + peerDiscovery: [ + MulticastDNS + ], + peerRouting: {}, // Currently both peerRouting and contentRouting are patched through the DHT, + contentRouting: {} // this will change once we factor that into two modules, for now do the following line: + dht: DHT // DHT enables PeerRouting, ContentRouting and DHT itself components + }, + + // libp2p config options (typically found on a config.json) + config: { // The config object is the part of the config that can go into a file, config.json. + peerDiscovery: { + mdns: { // mdns options + interval: 1000 // ms + enabled: true + }, + webrtcStar: { // webrtc-star options + interval: 1000 // ms + enabled: false + } + // .. other discovery module options. + }, + peerRouting: {}, + contentRouting: {}, + relay: { // Circuit Relay options + enabled: false, + hop: { + enabled: false, + active: false + } + } + // Enable/Disable Experimental features + EXPERIMENTAL: { // Experimental features ("behind a flag") + pubsub: false, + dht: false + } }, - discovery: [ - new MulticastDNS(peerInfo) - ], - // DHT is passed as its own enabling PeerRouting, ContentRouting and DHT itself components - dht: DHT } - super(modules, peerInfo, peerBook, options) + // overload any defaults of your bundle using https://lodash.com/docs/4.17.5#defaultsDeep + defaultsDeep(_options, defaults) + + super(options) } } -// Now all the nodes you create, will have TCP, WebSockets, SPDY, SECIO and MulticastDNS support. +// Now all the nodes you create, will have TCP, WebSockets, SPDY, MPLEX, SECIO and MulticastDNS support. ``` ### API diff --git a/examples/transports/1.js b/examples/transports/1.js index 952f933d62..40c9ce9862 100644 --- a/examples/transports/1.js +++ b/examples/transports/1.js @@ -4,13 +4,20 @@ const libp2p = require('libp2p') const TCP = require('libp2p-tcp') const PeerInfo = require('peer-info') const waterfall = require('async/waterfall') +const defaultsDeep = require('lodash.defaultsdeep') class MyBundle extends libp2p { - constructor (peerInfo) { - const modules = { - transport: [new TCP()] + constructor (_options) { + const defaults = { + modules: { + transport: [ + TCP + ] + } } - super(modules, peerInfo) + + defaultsDeep(_options, defaults) + super(_options) } } @@ -20,7 +27,7 @@ waterfall([ (cb) => PeerInfo.create(cb), (peerInfo, cb) => { peerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/0') - node = new MyBundle(peerInfo) + node = new MyBundle({ peerInfo: peerInfo }) node.start(cb) } ], (err) => { diff --git a/examples/transports/2.js b/examples/transports/2.js index 5ebfc622f6..042e47ddce 100644 --- a/examples/transports/2.js +++ b/examples/transports/2.js @@ -4,15 +4,22 @@ const libp2p = require('libp2p') const TCP = require('libp2p-tcp') const PeerInfo = require('peer-info') const waterfall = require('async/waterfall') +const defaultsDeep = require('lodash.defaultsdeep') const parallel = require('async/parallel') const pull = require('pull-stream') class MyBundle extends libp2p { - constructor (peerInfo) { - const modules = { - transport: [new TCP()] + constructor (_options) { + const defaults = { + modules: { + transport: [ + TCP + ] + } } - super(modules, peerInfo) + + defaultsDeep(_options, defaults) + super(_options) } } @@ -23,7 +30,7 @@ function createNode (callback) { (cb) => PeerInfo.create(cb), (peerInfo, cb) => { peerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/0') - node = new MyBundle(peerInfo) + node = new MyBundle({ peerInfo: peerInfo }) node.start(cb) } ], (err) => callback(err, node)) diff --git a/examples/transports/3.js b/examples/transports/3.js index 5f96f9b81c..8390d21818 100644 --- a/examples/transports/3.js +++ b/examples/transports/3.js @@ -5,15 +5,23 @@ const TCP = require('libp2p-tcp') const WebSockets = require('libp2p-websockets') const PeerInfo = require('peer-info') const waterfall = require('async/waterfall') +const defaultsDeep = require('lodash.defaultsdeep') const parallel = require('async/parallel') const pull = require('pull-stream') class MyBundle extends libp2p { - constructor (peerInfo) { - const modules = { - transport: [new TCP(), new WebSockets()] + constructor (_options) { + const defaults = { + modules: { + transport: [ + TCP, + WebSockets + ] + } } - super(modules, peerInfo) + + defaultsDeep(_options, defaults) + super(_options) } } @@ -28,7 +36,7 @@ function createNode (addrs, callback) { (cb) => PeerInfo.create(cb), (peerInfo, cb) => { addrs.forEach((addr) => peerInfo.multiaddrs.add(addr)) - node = new MyBundle(peerInfo) + node = new MyBundle({ peerInfo: peerInfo }) node.start(cb) } ], (err) => callback(err, node)) diff --git a/examples/transports/README.md b/examples/transports/README.md index 5400f0ea3b..c1637d22ee 100644 --- a/examples/transports/README.md +++ b/examples/transports/README.md @@ -27,16 +27,23 @@ const libp2p = require('libp2p') const TCP = require('libp2p-tcp') const PeerInfo = require('peer-info') const waterfall = require('async/waterfall') +const defaultsDeep = require('lodash.defaultsdeep') // This MyBundle class is your libp2p bundle packed with TCP class MyBundle extends libp2p { - constructor (peerInfo) { - // modules is a JS object that will describe the components - // we want for our libp2p bundle - const modules = { - transport: [new TCP()] + constructor (_options) { + const defaults = { + // modules is a JS object that will describe the components + // we want for our libp2p bundle + modules: { + transport: [ + TCP + ] + } } - super(modules, peerInfo) + + defaultsDeep(_options, defaults) + super(_options) } } ``` @@ -57,7 +64,7 @@ waterfall([ // the multiaddr format, a self describable address peerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/0') // Now we can create a node with that PeerInfo object - node = new MyBundle(peerInfo) + node = new MyBundle({ peerInfo: peerInfo }) // Last, we start the node! node.start(cb) } @@ -114,7 +121,7 @@ function createNode (callback) { (cb) => PeerInfo.create(cb), (peerInfo, cb) => { peerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/0') - node = new MyBundle(peerInfo) + node = new MyBundle({ peerInfo: peerInfo }) node.start(cb) } ], (err) => callback(err, node)) @@ -196,11 +203,18 @@ const WebSockets = require('libp2p-websockets') // ... class MyBundle extends libp2p { - constructor (peerInfo) { - const modules = { - transport: [new TCP(), new WebSockets()] + constructor (_options) { + const defaults = { + modules: { + transport: [ + TCP, + WebSockets + ] + } } - super(modules, peerInfo) + + defaultsDeep(_options, defaults) + super(_options) } } ``` @@ -219,7 +233,7 @@ function createNode (addrs, callback) { (cb) => PeerInfo.create(cb), (peerInfo, cb) => { addrs.forEach((addr) => peerInfo.multiaddrs.add(addr)) - node = new MyBundle(peerInfo) + node = new MyBundle({ peerInfo: peerInfo }) node.start(cb) } ], (err) => callback(err, node)) diff --git a/package.json b/package.json index d47dafe873..6f314287cb 100644 --- a/package.json +++ b/package.json @@ -39,10 +39,10 @@ "dependencies": { "async": "^2.6.0", "libp2p-connection-manager": "~0.0.2", - "libp2p-floodsub": "^0.15.0", + "libp2p-floodsub": "~0.15.0", "libp2p-ping": "~0.8.0", "libp2p-switch": "~0.40.4", - "libp2p-websockets": "^0.12.0", + "libp2p-websockets": "~0.12.0", "mafmt": "^6.0.0", "multiaddr": "^5.0.0", "peer-book": "~0.8.0", @@ -50,22 +50,23 @@ "peer-info": "~0.14.1" }, "devDependencies": { - "aegir": "^13.1.0", + "aegir": "^14.0.0", "chai": "^4.1.2", "cids": "~0.5.3", "dirty-chai": "^2.0.1", "electron-webrtc": "~0.3.0", "libp2p-circuit": "~0.2.0", "libp2p-kad-dht": "~0.10.0", - "libp2p-mdns": "~0.11.0", + "libp2p-mdns": "~0.12.0", "libp2p-mplex": "~0.7.0", - "libp2p-railing": "~0.8.1", + "libp2p-railing": "~0.9.1", "libp2p-secio": "~0.10.0", "libp2p-spdy": "~0.12.1", "libp2p-tcp": "~0.12.0", - "libp2p-webrtc-star": "~0.15.0", - "libp2p-websocket-star": "~0.8.0", + "libp2p-webrtc-star": "~0.15.3", + "libp2p-websocket-star": "~0.8.1", "libp2p-websocket-star-rendezvous": "~0.2.3", + "lodash.defaultsdeep": "^4.6.0", "lodash.times": "^4.3.2", "pull-goodbye": "0.0.2", "pull-serializer": "~0.3.2", diff --git a/src/index.js b/src/index.js index bbc2342b81..f20231ff46 100644 --- a/src/index.js +++ b/src/index.js @@ -24,73 +24,77 @@ exports = module.exports const NOT_STARTED_ERROR_MESSAGE = 'The libp2p node is not started yet' class Node extends EventEmitter { - constructor (_modules, _peerInfo, _peerBook, _options) { + constructor (_options) { super() - assert(_modules, 'requires modules to equip libp2p with features') - assert(_peerInfo, 'requires a PeerInfo instance') + assert(_options.modules, 'requires modules to equip libp2p with features') + assert(_options.peerInfo, 'requires a PeerInfo instance') - this.modules = _modules - this.peerInfo = _peerInfo - this.peerBook = _peerBook || new PeerBook() - _options = _options || {} + this.peerInfo = _options.peerInfo + this.peerBook = _options.peerBook || new PeerBook() + this._modules = _options.modules + // TODO populate with default config, if any + this._config = _options.config || {} this._isStarted = false + this._transport = [] // Transport instances/references + this._discovery = [] // Discovery service instances/references - this.switch = new Switch(this.peerInfo, this.peerBook, _options.switch) - this.stats = this.switch.stats + this._switch = new Switch(this.peerInfo, this.peerBook, _options.switch) + this.stats = this._switch.stats this.connectionManager = new ConnectionManager(this, _options.connectionManager) // Attach stream multiplexers - if (this.modules.connection && this.modules.connection.muxer) { - let muxers = this.modules.connection.muxer + if (this._modules.streamMuxer) { + let muxers = this._modules.streamMuxer muxers = Array.isArray(muxers) ? muxers : [muxers] - muxers.forEach((muxer) => this.switch.connection.addStreamMuxer(muxer)) + muxers.forEach((muxer) => this._switch.connection.addStreamMuxer(muxer)) - // If muxer exists, we can use Identify - this.switch.connection.reuse() + // If muxer exists + // we can use Identify + this._switch.connection.reuse() + // we can use Relay for listening/dialing + this._switch.connection.enableCircuitRelay(this._config.relay) - // If muxer exists, we can use Relay for listening/dialing - this.switch.connection.enableCircuitRelay(_options.relay) - - // Received incommind dial and muxer upgrade happened, + // Received incomming dial and muxer upgrade happened, // reuse this muxed connection - this.switch.on('peer-mux-established', (peerInfo) => { + this._switch.on('peer-mux-established', (peerInfo) => { this.emit('peer:connect', peerInfo) this.peerBook.put(peerInfo) }) - this.switch.on('peer-mux-closed', (peerInfo) => { + this._switch.on('peer-mux-closed', (peerInfo) => { this.emit('peer:disconnect', peerInfo) }) } // Attach crypto channels - if (this.modules.connection && this.modules.connection.crypto) { - let cryptos = this.modules.connection.crypto + if (this._modules.connEncryption) { + let cryptos = this._modules.connEncryption cryptos = Array.isArray(cryptos) ? cryptos : [cryptos] cryptos.forEach((crypto) => { - this.switch.connection.crypto(crypto.tag, crypto.encrypt) + this._switch.connection.crypto(crypto.tag, crypto.encrypt) }) } - // Attach discovery mechanisms - if (this.modules.discovery) { - let discoveries = this.modules.discovery - discoveries = Array.isArray(discoveries) ? discoveries : [discoveries] - - discoveries.forEach((discovery) => { - discovery.on('peer', (peerInfo) => this.emit('peer:discovery', peerInfo)) + // dht provided components (peerRouting, contentRouting, dht) + if (this._config.EXPERIMENTAL && + this._config.EXPERIMENTAL.dht && + this._modules.dht) { + const DHT = this._modules.dht + this._dht = new DHT(this._switch, { + kBucketSize: this._config.dht.kBucketSize || 20, + // TODO make datastore an option of libp2p itself so + // that other things can use it as well + datastore: dht.datastore }) } - // dht provided components (peerRouting, contentRouting, dht) - if (_modules.DHT) { - this._dht = new this.modules.DHT(this.switch, { - kBucketSize: 20, - datastore: _options.DHT && _options.DHT.datastore - }) + // enable/disable pubsub + if (this._config.EXPERIMENTAL && this._config.EXPERIMENTAL.pubsub) { + // TODO only enable PubSub if flag is set to true } + // Attach remaining APIs this.peerRouting = peerRouting(this) this.contentRouting = contentRouting(this) this.dht = dht(this) @@ -99,7 +103,7 @@ class Node extends EventEmitter { this._getPeerInfo = getPeerInfo(this) // Mount default protocols - Ping.mount(this.switch) + Ping.mount(this._switch) } /* @@ -107,14 +111,11 @@ class Node extends EventEmitter { * - create listeners on the multiaddrs the Peer wants to listen */ start (callback) { - if (!this.modules.transport) { + if (!this._modules.transport) { return callback(new Error('no transports were present')) } let ws - let transports = this.modules.transport - - transports = Array.isArray(transports) ? transports : [transports] // so that we can have webrtc-star addrs without adding manually the id const maOld = [] @@ -128,30 +129,58 @@ class Node extends EventEmitter { this.peerInfo.multiaddrs.replace(maOld, maNew) const multiaddrs = this.peerInfo.multiaddrs.toArray() - transports.forEach((transport) => { - if (transport.filter(multiaddrs).length > 0) { - this.switch.transport.add( - transport.tag || transport.constructor.name, transport) - } else if (WebSockets.isWebSockets(transport)) { - // TODO find a cleaner way to signal that a transport is always - // used for dialing, even if no listener - ws = transport + + this._modules.transport.forEach((Transport) => { + let t + + if (typeof Transport === 'function') { + t = new Transport() + } else { + t = Transport } + + if (t.filter(multiaddrs).length > 0) { + this._switch.transport.add(t.tag || t.constructor.name, t) + } else if (WebSockets.isWebSockets(t)) { + // TODO find a cleaner way to signal that a transport is always used + // for dialing, even if no listener + ws = t + } + this._transport.push(t) }) series([ - (cb) => this.switch.start(cb), + (cb) => this._switch.start(cb), (cb) => { if (ws) { // always add dialing on websockets - this.switch.transport.add(ws.tag || ws.constructor.name, ws) + this._switch.transport.add(ws.tag || ws.constructor.name, ws) } // all transports need to be setup before discover starts - if (this.modules.discovery) { - return each(this.modules.discovery, (d, cb) => d.start(cb), cb) + if (this._modules.peerDiscovery && this._config.peerDiscovery) { + each(this._modules.peerDiscovery, (D, cb) => { + // If enabled then start it + if (this._config.peerDiscovery[D.tag].enabled) { + let d + + if (typeof D === 'function') { + this._config.peerDiscovery[D.tag].peerInfo = this.peerInfo + d = new D(this._config.peerDiscovery[D.tag]) + } else { + d = D + } + + d.on('peer', (peerInfo) => this.emit('peer:discovery', peerInfo)) + this._discovery.push(d) + d.start(cb) + } else { + cb() + } + }, cb) + } else { + cb() } - cb() }, (cb) => { // TODO: chicken-and-egg problem #1: @@ -177,10 +206,10 @@ class Node extends EventEmitter { // detect which multiaddrs we don't have a transport for and remove them const multiaddrs = this.peerInfo.multiaddrs.toArray() - transports.forEach((transport) => { + this._transport.forEach((transport) => { multiaddrs.forEach((multiaddr) => { if (!multiaddr.toString().match(/\/p2p-circuit($|\/)/) && - !transports.find((transport) => transport.filter(multiaddr).length > 0)) { + !this._transport.find((transport) => transport.filter(multiaddr).length > 0)) { this.peerInfo.multiaddrs.delete(multiaddr) } }) @@ -198,9 +227,9 @@ class Node extends EventEmitter { * Stop the libp2p node by closing its listeners and open connections */ stop (callback) { - if (this.modules.discovery) { - this.modules.discovery.forEach((discovery) => { - setImmediate(() => discovery.stop(() => {})) + if (this._modules.peerDiscovery) { + this._discovery.forEach((d) => { + setImmediate(() => d.stop(() => {})) }) } @@ -216,7 +245,7 @@ class Node extends EventEmitter { } cb() }, - (cb) => this.switch.stop(cb), + (cb) => this._switch.stop(cb), (cb) => { this.emit('stop') cb() @@ -237,7 +266,7 @@ class Node extends EventEmitter { this._getPeerInfo(peer, (err, peerInfo) => { if (err) { return callback(err) } - this.switch.dial(peerInfo, (err) => { + this._switch.dial(peerInfo, (err) => { if (err) { return callback(err) } this.peerBook.put(peerInfo) @@ -257,7 +286,7 @@ class Node extends EventEmitter { this._getPeerInfo(peer, (err, peerInfo) => { if (err) { return callback(err) } - this.switch.dial(peerInfo, protocol, (err, conn) => { + this._switch.dial(peerInfo, protocol, (err, conn) => { if (err) { return callback(err) } this.peerBook.put(peerInfo) callback(null, conn) @@ -271,25 +300,26 @@ class Node extends EventEmitter { this._getPeerInfo(peer, (err, peerInfo) => { if (err) { return callback(err) } - this.switch.hangUp(peerInfo, callback) + this._switch.hangUp(peerInfo, callback) }) } ping (peer, callback) { assert(this.isStarted(), NOT_STARTED_ERROR_MESSAGE) + this._getPeerInfo(peer, (err, peerInfo) => { if (err) { return callback(err) } - callback(null, new Ping(this.switch, peerInfo)) + callback(null, new Ping(this._switch, peerInfo)) }) } handle (protocol, handlerFunc, matchFunc) { - this.switch.handle(protocol, handlerFunc, matchFunc) + this._switch.handle(protocol, handlerFunc, matchFunc) } unhandle (protocol) { - this.switch.unhandle(protocol) + this._switch.unhandle(protocol) } } diff --git a/test/base.js b/test/base.js deleted file mode 100644 index 91a3af0922..0000000000 --- a/test/base.js +++ /dev/null @@ -1,14 +0,0 @@ -/* eslint-env mocha */ -'use strict' - -const chai = require('chai') -chai.use(require('dirty-chai')) -const expect = chai.expect - -const libp2p = require('../src') - -describe('libp2p', () => { - it('the skeleton is fine, now go build your own libp2p bundle', () => { - expect(libp2p).to.exist() - }) -}) diff --git a/test/browser.js b/test/browser.js index 41357c9e57..3b05294fc5 100644 --- a/test/browser.js +++ b/test/browser.js @@ -1,4 +1,3 @@ 'use strict' -require('./base') require('./transports.browser') diff --git a/test/circuit-relay.node.js b/test/circuit-relay.node.js index 9fa45d6480..2c80636a23 100644 --- a/test/circuit-relay.node.js +++ b/test/circuit-relay.node.js @@ -1,20 +1,21 @@ /* eslint-env mocha */ 'use strict' +const chai = require('chai') +chai.use(require('dirty-chai')) +const expect = chai.expect +const sinon = require('sinon') const waterfall = require('async/waterfall') const series = require('async/series') const parallel = require('async/parallel') -const utils = require('./utils/node') const Circuit = require('libp2p-circuit') const multiaddr = require('multiaddr') -const tryEcho = require('./utils/try-echo') -const chai = require('chai') -chai.use(require('dirty-chai')) -const expect = chai.expect -const sinon = require('sinon') +const createNode = require('./utils/create-node') +const tryEcho = require('./utils/try-echo') +const echo = require('./utils/echo') -describe('circuit relay', function () { +describe('circuit relay', () => { let handlerSpies = [] let relayNode1 let relayNode2 @@ -23,29 +24,32 @@ describe('circuit relay', function () { let nodeTCP1 let nodeTCP2 - function setupNode (addrs, options, cb) { + function setupNode (addrs, options, callback) { if (typeof options === 'function') { - cb = options + callback = options options = {} } options = options || {} - return utils.createNode(addrs, options, (err, node) => { + return createNode(addrs, options, (err, node) => { expect(err).to.not.exist() - node.handle('/echo/1.0.0', utils.echo) + node.handle('/echo/1.0.0', echo) node.start((err) => { expect(err).to.not.exist() - handlerSpies.push(sinon.spy(node.switch.transports[Circuit.tag].listeners[0].hopHandler, 'handle')) - cb(node) + handlerSpies.push(sinon.spy( + node._switch.transports[Circuit.tag].listeners[0].hopHandler, 'handle' + )) + + callback(node) }) }) } before(function (done) { - this.timeout(20000) + this.timeout(20 * 1000) waterfall([ // set up passive relay @@ -53,11 +57,13 @@ describe('circuit relay', function () { '/ip4/0.0.0.0/tcp/0/ws', '/ip4/0.0.0.0/tcp/0' ], { - relay: { - enabled: true, - hop: { + config: { + relay: { enabled: true, - active: false // passive relay + hop: { + enabled: true, + active: false // passive relay + } } } }, (node) => { @@ -69,11 +75,13 @@ describe('circuit relay', function () { '/ip4/0.0.0.0/tcp/0/ws', '/ip4/0.0.0.0/tcp/0' ], { - relay: { - enabled: true, - hop: { + config: { + relay: { enabled: true, - active: false // passive relay + hop: { + enabled: true, + active: false // passive relay + } } } }, (node) => { @@ -84,8 +92,10 @@ describe('circuit relay', function () { (cb) => setupNode([ '/ip4/0.0.0.0/tcp/0/ws' ], { - relay: { - enabled: true + config: { + relay: { + enabled: true + } } }, (node) => { nodeWS1 = node @@ -95,8 +105,10 @@ describe('circuit relay', function () { (cb) => setupNode([ '/ip4/0.0.0.0/tcp/0/ws' ], { - relay: { - enabled: true + config: { + relay: { + enabled: true + } } }, (node) => { nodeWS2 = node @@ -107,8 +119,10 @@ describe('circuit relay', function () { '/ip4/0.0.0.0/tcp/0', `/ipfs/${relayNode1.peerInfo.id.toB58String()}/p2p-circuit` ], { - relay: { - enabled: true + config: { + relay: { + enabled: true + } } }, (node) => { nodeTCP1 = node @@ -119,8 +133,10 @@ describe('circuit relay', function () { '/ip4/0.0.0.0/tcp/0', `/ip4/0.0.0.0/tcp/0/ipfs/${relayNode2.peerInfo.id.toB58String()}/p2p-circuit` ], { - relay: { - enabled: true + config: { + relay: { + enabled: true + } } }, (node) => { nodeTCP2 = node diff --git a/test/content-routing.node.js b/test/content-routing.node.js index 389dc0e59f..3414a6174c 100644 --- a/test/content-routing.node.js +++ b/test/content-routing.node.js @@ -9,8 +9,8 @@ const expect = chai.expect const parallel = require('async/parallel') const _times = require('lodash.times') const CID = require('cids') -const utils = require('./utils/node') -const createNode = utils.createNode + +const createNode = require('./utils/create-node') describe('.contentRouting', () => { let nodeA @@ -23,8 +23,11 @@ describe('.contentRouting', () => { this.timeout(5 * 1000) const tasks = _times(5, () => (cb) => { createNode('/ip4/0.0.0.0/tcp/0', { - mdns: false, - dht: true + config: { + EXPERIMENTAL: { + dht: true + } + } }, (err, node) => { expect(err).to.not.exist() node.start((err) => cb(err, node)) diff --git a/test/multiaddr-trim.js b/test/multiaddr-trim.node.js similarity index 73% rename from test/multiaddr-trim.js rename to test/multiaddr-trim.node.js index 9dc93715b2..bb8e4cd500 100644 --- a/test/multiaddr-trim.js +++ b/test/multiaddr-trim.node.js @@ -5,7 +5,8 @@ const chai = require('chai') chai.use(require('dirty-chai')) const expect = chai.expect const series = require('async/series') -const createNode = require('./utils/node').createNode + +const createNode = require('./utils/create-node') describe('multiaddr trim', () => { it('non used multiaddrs get trimmed', (done) => { @@ -20,7 +21,6 @@ describe('multiaddr trim', () => { expect(err).to.not.exist() node = _node const multiaddrs = node.peerInfo.multiaddrs.toArray() - // multiaddrs.forEach((ma) => console.log(ma.toString())) expect(multiaddrs).to.have.length(3) cb() }), @@ -29,11 +29,10 @@ describe('multiaddr trim', () => { expect(err).to.not.exist() const multiaddrs = node.peerInfo.multiaddrs.toArray() - // console.log('--') - // multiaddrs.forEach((ma) => console.log(ma.toString())) expect(multiaddrs.length).to.at.least(2) - expect(multiaddrs[0].toString()).to.match(/^\/ip4\/127\.0\.0\.1\/tcp\/[0-9]+\/ws\/ipfs\/\w+$/) + expect(multiaddrs[0].toString()) + .to.match(/^\/ip4\/127\.0\.0\.1\/tcp\/[0-9]+\/ws\/ipfs\/\w+$/) node.stop(done) }) }) diff --git a/test/node.js b/test/node.js index 84807201dc..095906a529 100644 --- a/test/node.js +++ b/test/node.js @@ -1,6 +1,5 @@ 'use strict' -require('./base') require('./transports.node') require('./stream-muxing.node') require('./peer-discovery.node') @@ -8,5 +7,5 @@ require('./pubsub.node') require('./peer-routing.node') require('./content-routing.node') require('./circuit-relay.node') -require('./multiaddr-trim') +require('./multiaddr-trim.node') require('./stats') diff --git a/test/peer-discovery.node.js b/test/peer-discovery.node.js index d82b4e4c95..e86f950fd6 100644 --- a/test/peer-discovery.node.js +++ b/test/peer-discovery.node.js @@ -6,9 +6,9 @@ chai.use(require('dirty-chai')) const expect = chai.expect const signalling = require('libp2p-webrtc-star/src/sig-server') const parallel = require('async/parallel') -const utils = require('./utils/node') -const createNode = utils.createNode -const echo = utils.echo + +const createNode = require('./utils/create-node') +const echo = require('./utils/echo') describe('peer discovery', () => { let nodeA @@ -58,7 +58,15 @@ describe('peer discovery', () => { } describe('MulticastDNS', () => { - setup({ mdns: true }) + setup({ + config: { + peerDiscovery: { + mdns: { + enabled: true + } + } + } + }) it('find a peer', function (done) { this.timeout(15 * 1000) @@ -87,8 +95,16 @@ describe('peer discovery', () => { describe('MulticastDNS + WebRTCStar', () => { setup({ - webRTCStar: true, - mdns: true + config: { + peerDiscovery: { + mdns: { + enabled: true + }, + webRTCStar: { + enabled: true + } + } + } }) it('find a peer', function (done) { diff --git a/test/peer-routing.node.js b/test/peer-routing.node.js index ec34eb7f24..b232e423ca 100644 --- a/test/peer-routing.node.js +++ b/test/peer-routing.node.js @@ -8,8 +8,8 @@ chai.use(require('dirty-chai')) const expect = chai.expect const parallel = require('async/parallel') const _times = require('lodash.times') -const utils = require('./utils/node') -const createNode = utils.createNode + +const createNode = require('./utils/create-node') describe('.peerRouting', () => { let nodeA @@ -23,8 +23,11 @@ describe('.peerRouting', () => { const tasks = _times(5, () => (cb) => { createNode('/ip4/0.0.0.0/tcp/0', { - mdns: false, - dht: true + config: { + EXPERIMENTAL: { + dht: true + } + } }, (err, node) => { expect(err).to.not.exist() node.start((err) => cb(err, node)) diff --git a/test/pubsub.node.js b/test/pubsub.node.js index 310c675307..40dfdfbdec 100644 --- a/test/pubsub.node.js +++ b/test/pubsub.node.js @@ -9,8 +9,8 @@ const expect = chai.expect const parallel = require('async/parallel') const waterfall = require('async/waterfall') const _times = require('lodash.times') -const utils = require('./utils/node') -const createNode = utils.createNode + +const createNode = require('./utils/create-node') function startTwo (callback) { const tasks = _times(2, () => (cb) => { diff --git a/test/stats.js b/test/stats.js index 1ac1afa5b5..9e721b1021 100644 --- a/test/stats.js +++ b/test/stats.js @@ -5,7 +5,7 @@ const chai = require('chai') chai.use(require('dirty-chai')) const expect = chai.expect -const createNode = require('./utils/node').createNode +const createNode = require('./utils/create-node') describe('libp2p', (done) => { it('has stats', () => { diff --git a/test/stream-muxing.node.js b/test/stream-muxing.node.js index c887aa71a1..d73c62257e 100644 --- a/test/stream-muxing.node.js +++ b/test/stream-muxing.node.js @@ -6,10 +6,10 @@ chai.use(require('dirty-chai')) const expect = chai.expect const parallel = require('async/parallel') const series = require('async/series') -const utils = require('./utils/node') + +const createNode = require('./utils/create-node') const tryEcho = require('./utils/try-echo') -const createNode = utils.createNode -const echo = utils.echo +const echo = require('./utils/echo') function test (nodeA, nodeB, callback) { nodeA.dialProtocol(nodeB.peerInfo, '/echo/1.0.0', (err, conn) => { @@ -191,12 +191,12 @@ describe('stream muxing', () => { (cb) => setup(cb), (cb) => { // it will just 'warm up a conn' - expect(Object.keys(nodeA.switch.muxers)).to.have.length(1) - expect(Object.keys(nodeB.switch.muxers)).to.have.length(1) + expect(Object.keys(nodeA._switch.muxers)).to.have.length(1) + expect(Object.keys(nodeB._switch.muxers)).to.have.length(1) nodeA.dial(nodeB.peerInfo, (err) => { expect(err).to.not.exist() - expect(Object.keys(nodeA.switch.muxedConns)).to.have.length(0) + expect(Object.keys(nodeA._switch.muxedConns)).to.have.length(0) cb() }) }, diff --git a/test/transports.browser.js b/test/transports.browser.js index 50f7b60c63..1a7ce7f248 100644 --- a/test/transports.browser.js +++ b/test/transports.browser.js @@ -14,46 +14,47 @@ const serializer = require('pull-serializer') const w = require('webrtcsupport') const tryEcho = require('./utils/try-echo') -const Node = require('./utils/bundle.browser') -const rawPeer = require('./fixtures/test-peer.json') +const Node = require('./utils/bundle-browser') +const jsonPeerId = require('./fixtures/test-peer.json') describe('transports', () => { describe('websockets', () => { let peerB + let peerBMultiaddr = '/ip4/127.0.0.1/tcp/9200/ws/ipfs/' + jsonPeerId.id let nodeA before((done) => { - const ma = '/ip4/127.0.0.1/tcp/9200/ws/ipfs/' + rawPeer.id - - PeerId.createFromPrivKey(rawPeer.privKey, (err, id) => { - if (err) { - return done(err) - } + PeerId.createFromPrivKey(jsonPeerId.privKey, (err, id) => { + expect(err).to.not.exist() peerB = new PeerInfo(id) - peerB.multiaddrs.add(ma) + peerB.multiaddrs.add(peerBMultiaddr) done() }) }) after((done) => nodeA.stop(done)) - it('create libp2pNode', (done) => { + it('create a libp2p Node', (done) => { PeerInfo.create((err, peerInfo) => { expect(err).to.not.exist() - peerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/0') - nodeA = new Node(peerInfo) + nodeA = new Node({ + peerInfo: peerInfo + }) done() }) }) - it('create libp2pNode with mplex only', (done) => { + it('create a libp2p Node with mplex only', (done) => { PeerInfo.create((err, peerInfo) => { expect(err).to.not.exist() - const b = new Node(peerInfo, null, { muxer: ['mplex'] }) - expect(b.modules.connection.muxer).to.eql([require('libp2p-mplex')]) + const b = new Node({ + peerInfo: peerInfo, + muxer: ['mplex'] + }) + expect(b._modules.streamMuxer).to.eql([require('libp2p-mplex')]) done() }) }) @@ -65,7 +66,7 @@ describe('transports', () => { // General connectivity tests it('.dial using Multiaddr', (done) => { - nodeA.dial(peerB.multiaddrs.toArray()[0], (err) => { + nodeA.dial(peerBMultiaddr, (err) => { expect(err).to.not.exist() setTimeout(check, 500) // Some time for Identify to finish @@ -79,7 +80,7 @@ describe('transports', () => { }) it('.dialProtocol using Multiaddr', (done) => { - nodeA.dialProtocol(peerB.multiaddrs.toArray()[0], '/echo/1.0.0', (err, conn) => { + nodeA.dialProtocol(peerBMultiaddr, '/echo/1.0.0', (err, conn) => { expect(err).to.not.exist() const peers = nodeA.peerBook.getAll() @@ -90,7 +91,7 @@ describe('transports', () => { }) it('.hangUp using Multiaddr', (done) => { - nodeA.hangUp(peerB.multiaddrs.toArray()[0], (err) => { + nodeA.hangUp(peerBMultiaddr, (err) => { expect(err).to.not.exist() setTimeout(check, 500) @@ -98,7 +99,7 @@ describe('transports', () => { function check () { const peers = nodeA.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeA.switch.muxedConns)).to.have.length(0) + expect(Object.keys(nodeA._switch.muxedConns)).to.have.length(0) done() } }) @@ -138,7 +139,7 @@ describe('transports', () => { const peers = nodeA.peerBook.getAll() expect(err).to.not.exist() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeA.switch.muxedConns)).to.have.length(0) + expect(Object.keys(nodeA._switch.muxedConns)).to.have.length(0) done() } }) @@ -197,8 +198,8 @@ describe('transports', () => { it('create two peerInfo with webrtc-star addrs', (done) => { parallel([ - (cb) => PeerId.create({ bits: 1024 }, cb), - (cb) => PeerId.create({ bits: 1024 }, cb) + (cb) => PeerId.create({ bits: 512 }, cb), + (cb) => PeerId.create({ bits: 512 }, cb) ], (err, ids) => { expect(err).to.not.exist() @@ -215,8 +216,12 @@ describe('transports', () => { }) it('create two libp2p nodes with those peers', (done) => { - node1 = new Node(peer1, null, { webRTCStar: true }) - node2 = new Node(peer2, null, { webRTCStar: true }) + node1 = new Node({ + peerInfo: peer1 + }) + node2 = new Node({ + peerInfo: peer2 + }) done() }) @@ -256,24 +261,26 @@ describe('transports', () => { function check () { const peers = node1.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(node1.switch.muxedConns)).to.have.length(0) + expect(Object.keys(node1._switch.muxedConns)).to.have.length(0) done() } }) }) - it('create a third node and check that discovery works', (done) => { + it('create a third node and check that discovery works', function (done) { + this.timeout(60 * 1000) + let counter = 0 function check () { if (++counter === 3) { - expect(Object.keys(node1.switch.muxedConns).length).to.equal(1) - expect(Object.keys(node2.switch.muxedConns).length).to.equal(1) + expect(Object.keys(node1._switch.muxedConns).length).to.equal(1) + expect(Object.keys(node2._switch.muxedConns).length).to.equal(1) done() } } - PeerId.create((err, id3) => { + PeerId.create({ bits: 512 }, (err, id3) => { expect(err).to.not.exist() const peer3 = new PeerInfo(id3) @@ -283,7 +290,9 @@ describe('transports', () => { node1.on('peer:discovery', (peerInfo) => node1.dial(peerInfo, check)) node2.on('peer:discovery', (peerInfo) => node2.dial(peerInfo, check)) - const node3 = new Node(peer3, null, { webRTCStar: true }) + const node3 = new Node({ + peerInfo: peer3 + }) node3.start(check) }) }) @@ -297,8 +306,8 @@ describe('transports', () => { it('create two peerInfo with websocket-star addrs', (done) => { parallel([ - (cb) => PeerId.create({ bits: 1024 }, cb), - (cb) => PeerId.create({ bits: 1024 }, cb) + (cb) => PeerId.create({ bits: 512 }, cb), + (cb) => PeerId.create({ bits: 512 }, cb) ], (err, ids) => { expect(err).to.not.exist() @@ -315,8 +324,12 @@ describe('transports', () => { }) it('create two libp2p nodes with those peers', (done) => { - node1 = new Node(peer1, null, { wsStar: true }) - node2 = new Node(peer2, null, { wsStar: true }) + node1 = new Node({ + peerInfo: peer1 + }) + node2 = new Node({ + peerInfo: peer2 + }) done() }) @@ -356,19 +369,21 @@ describe('transports', () => { function check () { const peers = node1.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(node1.switch.muxedConns)).to.have.length(0) + expect(Object.keys(node1._switch.muxedConns)).to.have.length(0) done() } }) }) - it('create a third node and check that discovery works', (done) => { + it('create a third node and check that discovery works', function (done) { + this.timeout(10 * 1000) + let counter = 0 function check () { if (++counter === 3) { - expect(Object.keys(node1.switch.muxedConns).length).to.equal(1) - expect(Object.keys(node2.switch.muxedConns).length).to.equal(1) + expect(Object.keys(node1._switch.muxedConns).length).to.equal(1) + expect(Object.keys(node2._switch.muxedConns).length).to.equal(1) done() } } @@ -383,7 +398,9 @@ describe('transports', () => { node1.on('peer:discovery', (peerInfo) => node1.dial(peerInfo, check)) node2.on('peer:discovery', (peerInfo) => node2.dial(peerInfo, check)) - const node3 = new Node(peer3, null, { wsStar: true }) + const node3 = new Node({ + peerInfo: peer3 + }) node3.start(check) }) }) diff --git a/test/transports.node.js b/test/transports.node.js index ca17810ccb..634df185c1 100644 --- a/test/transports.node.js +++ b/test/transports.node.js @@ -6,16 +6,17 @@ chai.use(require('dirty-chai')) const expect = chai.expect const parallel = require('async/parallel') const series = require('async/series') -const utils = require('./utils/node.js') const signalling = require('libp2p-webrtc-star/src/sig-server') const rendezvous = require('libp2p-websocket-star-rendezvous') +const TCP = require('libp2p-tcp') +const WS = require('libp2p-websockets') const WSStar = require('libp2p-websocket-star') const WRTCStar = require('libp2p-webrtc-star') const wrtc = require('wrtc') -const tryEcho = require('./utils/try-echo') -const createNode = utils.createNode -const echo = utils.echo +const createNode = require('./utils/create-node.js') +const tryEcho = require('./utils/try-echo') +const echo = require('./utils/echo') describe('transports', () => { describe('TCP only', () => { @@ -90,14 +91,14 @@ describe('transports', () => { (cb) => { const peers = nodeA.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeA.switch.muxedConns)).to.have.length(0) + expect(Object.keys(nodeA._switch.muxedConns)).to.have.length(0) cb() }, (cb) => { const peers = nodeB.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeB.switch.muxedConns)).to.have.length(0) + expect(Object.keys(nodeB._switch.muxedConns)).to.have.length(0) cb() } ], done) @@ -117,14 +118,14 @@ describe('transports', () => { const peers = nodeA.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeA.switch.muxedConns)).to.have.length(1) + expect(Object.keys(nodeA._switch.muxedConns)).to.have.length(1) cb() }, (cb) => { const peers = nodeB.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeA.switch.muxedConns)).to.have.length(1) + expect(Object.keys(nodeA._switch.muxedConns)).to.have.length(1) cb() } ], () => tryEcho(conn, done)) @@ -143,14 +144,14 @@ describe('transports', () => { const peers = nodeA.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeA.switch.muxedConns)).to.have.length(0) + expect(Object.keys(nodeA._switch.muxedConns)).to.have.length(0) cb() }, (cb) => { const peers = nodeB.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeB.switch.muxedConns)).to.have.length(0) + expect(Object.keys(nodeB._switch.muxedConns)).to.have.length(0) cb() } ], done) @@ -169,13 +170,13 @@ describe('transports', () => { (cb) => { const peers = nodeA.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeA.switch.muxedConns)).to.have.length(1) + expect(Object.keys(nodeA._switch.muxedConns)).to.have.length(1) cb() }, (cb) => { const peers = nodeB.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeA.switch.muxedConns)).to.have.length(1) + expect(Object.keys(nodeA._switch.muxedConns)).to.have.length(1) cb() } ], () => tryEcho(conn, done)) @@ -193,13 +194,13 @@ describe('transports', () => { (cb) => { const peers = nodeA.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeA.switch.muxedConns)).to.have.length(0) + expect(Object.keys(nodeA._switch.muxedConns)).to.have.length(0) cb() }, (cb) => { const peers = nodeB.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeB.switch.muxedConns)).to.have.length(0) + expect(Object.keys(nodeB._switch.muxedConns)).to.have.length(0) cb() } ], done) @@ -263,13 +264,13 @@ describe('transports', () => { (cb) => { const peers = nodeTCP.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeTCP.switch.muxedConns)).to.have.length(1) + expect(Object.keys(nodeTCP._switch.muxedConns)).to.have.length(1) cb() }, (cb) => { const peers = nodeTCPnWS.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeTCPnWS.switch.muxedConns)).to.have.length(1) + expect(Object.keys(nodeTCPnWS._switch.muxedConns)).to.have.length(1) cb() } ], done) @@ -287,14 +288,14 @@ describe('transports', () => { (cb) => { const peers = nodeTCP.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeTCP.switch.muxedConns)).to.have.length(0) + expect(Object.keys(nodeTCP._switch.muxedConns)).to.have.length(0) cb() }, (cb) => { const peers = nodeTCPnWS.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeTCPnWS.switch.muxedConns)).to.have.length(0) + expect(Object.keys(nodeTCPnWS._switch.muxedConns)).to.have.length(0) cb() } ], done) @@ -314,13 +315,13 @@ describe('transports', () => { (cb) => { const peers = nodeTCPnWS.peerBook.getAll() expect(Object.keys(peers)).to.have.length(2) - expect(Object.keys(nodeTCPnWS.switch.muxedConns)).to.have.length(1) + expect(Object.keys(nodeTCPnWS._switch.muxedConns)).to.have.length(1) cb() }, (cb) => { const peers = nodeWS.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeWS.switch.muxedConns)).to.have.length(1) + expect(Object.keys(nodeWS._switch.muxedConns)).to.have.length(1) cb() } ], done) @@ -338,14 +339,14 @@ describe('transports', () => { (cb) => { const peers = nodeTCPnWS.peerBook.getAll() expect(Object.keys(peers)).to.have.length(2) - expect(Object.keys(nodeTCPnWS.switch.muxedConns)).to.have.length(0) + expect(Object.keys(nodeTCPnWS._switch.muxedConns)).to.have.length(0) cb() }, (cb) => { const peers = nodeWS.peerBook.getAll() expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeWS.switch.muxedConns)).to.have.length(0) + expect(Object.keys(nodeWS._switch.muxedConns)).to.have.length(0) cb() } ], done) @@ -367,7 +368,7 @@ describe('transports', () => { let nodeAll let nodeTCP let nodeWS - let nodeWStar + let nodeWebRTCStar let ss @@ -375,22 +376,25 @@ describe('transports', () => { this.timeout(5 * 1000) parallel([ - (cb) => { - signalling.start({ port: 24642 }, (err, server) => { - expect(err).to.not.exist() - ss = server - cb() - }) - }, + (cb) => signalling.start({ port: 24642 }, (err, server) => { + expect(err).to.not.exist() + ss = server + cb() + }), (cb) => { const wstar = new WRTCStar({wrtc: wrtc}) + createNode([ '/ip4/0.0.0.0/tcp/0', '/ip4/127.0.0.1/tcp/25011/ws', '/ip4/127.0.0.1/tcp/24642/ws/p2p-webrtc-star' ], { modules: { - transport: [wstar], + transport: [ + TCP, + WS, + wstar + ], discovery: [wstar.discovery] } }, (err, node) => { @@ -429,7 +433,7 @@ describe('transports', () => { } }, (err, node) => { expect(err).to.not.exist() - nodeWStar = node + nodeWebRTCStar = node node.handle('/echo/1.0.0', echo) node.start(cb) }) @@ -444,7 +448,7 @@ describe('transports', () => { (cb) => nodeAll.stop(cb), (cb) => nodeTCP.stop(cb), (cb) => nodeWS.stop(cb), - (cb) => nodeWStar.stop(cb), + (cb) => nodeWebRTCStar.stop(cb), (cb) => ss.stop(cb) ], done) }) @@ -453,7 +457,7 @@ describe('transports', () => { let i = 1; [nodeAll, otherNode].forEach((node) => { expect(Object.keys(node.peerBook.getAll())).to.have.length(i-- ? peers : 1) - expect(Object.keys(node.switch.muxedConns)).to.have.length(muxed) + expect(Object.keys(node._switch.muxedConns)).to.have.length(muxed) }) callback() } @@ -490,20 +494,20 @@ describe('transports', () => { }) }) - it('nodeAll.dial nodeWStar using PeerInfo', function (done) { + it('nodeAll.dial nodeWebRTCStar using PeerInfo', function (done) { this.timeout(40 * 1000) - nodeAll.dial(nodeWStar.peerInfo, (err) => { + nodeAll.dial(nodeWebRTCStar.peerInfo, (err) => { expect(err).to.not.exist() // Some time for Identify to finish - setTimeout(() => check(nodeWStar, 1, 3, done), 500) + setTimeout(() => check(nodeWebRTCStar, 1, 3, done), 500) }) }) - it('nodeAll.hangUp nodeWStar using PeerInfo', (done) => { - nodeAll.hangUp(nodeWStar.peerInfo, (err) => { + it('nodeAll.hangUp nodeWebRTCStar using PeerInfo', (done) => { + nodeAll.hangUp(nodeWebRTCStar.peerInfo, (err) => { expect(err).to.not.exist() - setTimeout(() => check(nodeWStar, 0, 3, done), 500) + setTimeout(() => check(nodeWebRTCStar, 0, 3, done), 500) }) }) }) @@ -512,7 +516,7 @@ describe('transports', () => { let nodeAll let nodeTCP let nodeWS - let nodeWStar + let nodeWebSocketStar let ss @@ -527,13 +531,18 @@ describe('transports', () => { }, (cb) => { const wstar = new WSStar() + createNode([ '/ip4/0.0.0.0/tcp/0', '/ip4/127.0.0.1/tcp/25011/ws', '/ip4/127.0.0.1/tcp/24642/ws/p2p-websocket-star' ], { modules: { - transport: [wstar], + transport: [ + TCP, + WS, + wstar + ], discovery: [wstar.discovery] } }, (err, node) => { @@ -573,7 +582,7 @@ describe('transports', () => { } }, (err, node) => { expect(err).to.not.exist() - nodeWStar = node + nodeWebSocketStar = node wstar.lazySetId(node.peerInfo.id) node.handle('/echo/1.0.0', echo) node.start(cb) @@ -587,7 +596,7 @@ describe('transports', () => { (cb) => nodeAll.stop(cb), (cb) => nodeTCP.stop(cb), (cb) => nodeWS.stop(cb), - (cb) => nodeWStar.stop(cb), + (cb) => nodeWebSocketStar.stop(cb), (cb) => ss.stop(cb) ], done) }) @@ -596,7 +605,7 @@ describe('transports', () => { let i = 1; [nodeAll, otherNode].forEach((node) => { expect(Object.keys(node.peerBook.getAll())).to.have.length(i-- ? peers : 1) - expect(Object.keys(node.switch.muxedConns)).to.have.length(muxed) + expect(Object.keys(node._switch.muxedConns)).to.have.length(muxed) }) done() } @@ -633,19 +642,19 @@ describe('transports', () => { }) }) - it('nodeAll.dial nodeWStar using PeerInfo', (done) => { - nodeAll.dial(nodeWStar.peerInfo, (err) => { + it('nodeAll.dial nodeWebSocketStar using PeerInfo', (done) => { + nodeAll.dial(nodeWebSocketStar.peerInfo, (err) => { expect(err).to.not.exist() // Some time for Identify to finish - setTimeout(() => check(nodeWStar, 1, 3, done), 500) + setTimeout(() => check(nodeWebSocketStar, 1, 3, done), 500) }) }) - it('nodeAll.hangUp nodeWStar using PeerInfo', (done) => { - nodeAll.hangUp(nodeWStar.peerInfo, (err) => { + it('nodeAll.hangUp nodeWebSocketStar using PeerInfo', (done) => { + nodeAll.hangUp(nodeWebSocketStar.peerInfo, (err) => { expect(err).to.not.exist() // Some time for Identify to finish - setTimeout(() => check(nodeWStar, 0, 3, done), 500) + setTimeout(() => check(nodeWebSocketStar, 0, 3, done), 500) }) }) }) diff --git a/test/utils/bundle-browser.js b/test/utils/bundle-browser.js new file mode 100644 index 0000000000..854c8522ea --- /dev/null +++ b/test/utils/bundle-browser.js @@ -0,0 +1,103 @@ +'use strict' + +const WS = require('libp2p-websockets') +const WebRTCStar = require('libp2p-webrtc-star') +const WebSocketStar = require('libp2p-websocket-star') +const Bootstrap = require('libp2p-railing') +const SPDY = require('libp2p-spdy') +const MPLEX = require('libp2p-mplex') +const KadDHT = require('libp2p-kad-dht') +const SECIO = require('libp2p-secio') +const defaultsDeep = require('lodash.defaultsdeep') +const libp2p = require('../..') + +function mapMuxers (list) { + return list.map((pref) => { + if (typeof pref !== 'string') { return pref } + switch (pref.trim().toLowerCase()) { + case 'spdy': return SPDY + case 'mplex': return MPLEX + default: + throw new Error(pref + ' muxer not available') + } + }) +} + +function getMuxers (options) { + if (options) { + return mapMuxers(options) + } else { + return [MPLEX, SPDY] + } +} + +class Node extends libp2p { + constructor (_options) { + _options = _options || {} + + const starOpts = { id: _options.peerInfo.id } + const wrtcStar = new WebRTCStar(starOpts) + const wsStar = new WebSocketStar(starOpts) + + const defaults = { + modules: { + transport: [ + wrtcStar, + wsStar + ], + streamMuxer: getMuxers(_options.muxer), + connEncryption: [ + SECIO + ], + peerDiscovery: [ + // NOTE: defaultsDeep clones these references making the listeners be + // attached to a clone and not the original. See the below how + // to attach instances. + // wrtcStar.discovery, + // wsStar.discovery, + Bootstrap + ], + peerRouting: [], + contentRouting: [], + dht: KadDHT + }, + config: { + peerDiscovery: { + webRTCStar: { + enabled: true + }, + websocketStar: { + enabled: true + }, + bootstrap: { + interval: 10000, + enabled: false, + list: _options.boostrapList + } + }, + relay: { + enabled: false, + hop: { + enabled: false, + active: false + } + }, + EXPERIMENTAL: { + dht: false, + pubsub: false + } + } + } + + defaultsDeep(_options, defaults) + + // NOTE: defaultsDeep clones instances and screws things up + _options.modules.transport.push(new WS()) // Test with transport instance + _options.modules.peerDiscovery.push(wrtcStar.discovery) + _options.modules.peerDiscovery.push(wsStar.discovery) + + super(_options) + } +} + +module.exports = Node diff --git a/test/utils/bundle-nodejs.js b/test/utils/bundle-nodejs.js new file mode 100644 index 0000000000..075b0ec13e --- /dev/null +++ b/test/utils/bundle-nodejs.js @@ -0,0 +1,97 @@ +'use strict' + +const TCP = require('libp2p-tcp') +const MulticastDNS = require('libp2p-mdns') +const WS = require('libp2p-websockets') +const Bootstrap = require('libp2p-railing') +const SPDY = require('libp2p-spdy') +const KadDHT = require('libp2p-kad-dht') +const MPLEX = require('libp2p-mplex') +const SECIO = require('libp2p-secio') +const defaultsDeep = require('lodash.defaultsdeep') +const libp2p = require('../..') + +function mapMuxers (list) { + return list.map((pref) => { + if (typeof pref !== 'string') { return pref } + switch (pref.trim().toLowerCase()) { + case 'spdy': return SPDY + case 'mplex': return MPLEX + default: + throw new Error(pref + ' muxer not available') + } + }) +} + +function getMuxers (muxers) { + const muxerPrefs = process.env.LIBP2P_MUXER + if (muxerPrefs && !muxers) { + return mapMuxers(muxerPrefs.split(',')) + } else if (muxers) { + return mapMuxers(muxers) + } else { + return [MPLEX, SPDY] + } +} + +class Node extends libp2p { + constructor (_options) { + const defaults = { + modules: { + transport: [ + TCP, + WS + ], + streamMuxer: getMuxers(_options.muxer), + connEncryption: [ + SECIO + ], + peerDiscovery: [ + MulticastDNS, + Bootstrap + ], + peerRouting: [], + contentRouting: [], + dht: KadDHT + }, + config: { + peerDiscovery: { + mdns: { + interval: 10000, + enabled: false + }, + bootstrap: { + interval: 10000, + enabled: false, + list: _options.bootstrapList + } + }, + peerRouting: {}, + contentRouting: {}, + relay: { + enabled: false, + hop: { + enabled: false, + active: false + } + }, + dht: { + kBucketSize: 20 + }, + EXPERIMENTAL: { + dht: false, + pubsub: false + } + } + } + + defaultsDeep(_options, defaults) + + // NOTE: defaultsDeep clones instances and screws things up + // _options.modules.transport.push(new TCP()) // Test with transport instance + + super(_options) + } +} + +module.exports = Node diff --git a/test/utils/bundle.browser.js b/test/utils/bundle.browser.js deleted file mode 100644 index 5e26f8669b..0000000000 --- a/test/utils/bundle.browser.js +++ /dev/null @@ -1,74 +0,0 @@ -'use strict' - -const WS = require('libp2p-websockets') -const WebRTCStar = require('libp2p-webrtc-star') -const WebSocketStar = require('libp2p-websocket-star') -const spdy = require('libp2p-spdy') -const mplex = require('libp2p-mplex') -const secio = require('libp2p-secio') -const Railing = require('libp2p-railing') -const libp2p = require('../..') - -function mapMuxers (list) { - return list.map((pref) => { - if (typeof pref !== 'string') { - return pref - } - switch (pref.trim().toLowerCase()) { - case 'spdy': - return spdy - case 'mplex': - return mplex - default: - throw new Error(pref + ' muxer not available') - } - }) -} - -function getMuxers (options) { - if (options) { - return mapMuxers(options) - } else { - return [mplex, spdy] - } -} - -class Node extends libp2p { - constructor (peerInfo, peerBook, options) { - options = options || {} - const wrtcStar = new WebRTCStar({ id: peerInfo.id }) - const wsStar = new WebSocketStar({ id: peerInfo.id }) - - const modules = { - transport: [ - new WS(), - wrtcStar, - wsStar - ], - connection: { - muxer: getMuxers(options.muxer), - crypto: [ - secio - ] - }, - discovery: [] - } - - if (options.webRTCStar) { - modules.discovery.push(wrtcStar.discovery) - } - - if (options.wsStar) { - modules.discovery.push(wsStar.discovery) - } - - if (options.bootstrap) { - const r = new Railing(options.bootstrap) - modules.discovery.push(r) - } - - super(modules, peerInfo, peerBook, options) - } -} - -module.exports = Node diff --git a/test/utils/bundle.node.js b/test/utils/bundle.node.js deleted file mode 100644 index 061377f321..0000000000 --- a/test/utils/bundle.node.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict' - -const TCP = require('libp2p-tcp') -const MulticastDNS = require('libp2p-mdns') -const WS = require('libp2p-websockets') -const Railing = require('libp2p-railing') -const spdy = require('libp2p-spdy') -const KadDHT = require('libp2p-kad-dht') -const mplex = require('libp2p-mplex') -const secio = require('libp2p-secio') -const libp2p = require('../..') - -function mapMuxers (list) { - return list.map((pref) => { - if (typeof pref !== 'string') { - return pref - } - switch (pref.trim().toLowerCase()) { - case 'spdy': return spdy - case 'mplex': return mplex - default: - throw new Error(pref + ' muxer not available') - } - }) -} - -function getMuxers (muxers) { - const muxerPrefs = process.env.LIBP2P_MUXER - if (muxerPrefs && !muxers) { - return mapMuxers(muxerPrefs.split(',')) - } else if (muxers) { - return mapMuxers(muxers) - } else { - return [mplex, spdy] - } -} - -class Node extends libp2p { - constructor (peerInfo, peerBook, options) { - options = options || {} - - const modules = { - transport: [ - new TCP(), - new WS() - ], - connection: { - muxer: getMuxers(options.muxer), - crypto: [ secio ] - }, - discovery: [] - } - - if (options.dht) { - modules.DHT = KadDHT - } - - if (options.mdns) { - const mdns = new MulticastDNS(peerInfo, 'ipfs.local') - modules.discovery.push(mdns) - } - - if (options.bootstrap) { - const r = new Railing(options.bootstrap) - modules.discovery.push(r) - } - - if (options.modules && options.modules.transport) { - options.modules.transport.forEach((t) => modules.transport.push(t)) - } - - if (options.modules && options.modules.discovery) { - options.modules.discovery.forEach((d) => modules.discovery.push(d)) - } - - super(modules, peerInfo, peerBook, options) - } -} - -module.exports = Node diff --git a/test/utils/node.js b/test/utils/create-node.js similarity index 67% rename from test/utils/node.js rename to test/utils/create-node.js index 9831963569..11564bfe85 100644 --- a/test/utils/node.js +++ b/test/utils/create-node.js @@ -3,11 +3,10 @@ const chai = require('chai') chai.use(require('dirty-chai')) -const Node = require('./bundle.node') const PeerInfo = require('peer-info') const PeerId = require('peer-id') const waterfall = require('async/waterfall') -const pull = require('pull-stream') +const Node = require('./bundle-nodejs') function createNode (multiaddrs, options, callback) { if (typeof options === 'function') { @@ -26,20 +25,10 @@ function createNode (multiaddrs, options, callback) { (peerId, cb) => PeerInfo.create(peerId, cb), (peerInfo, cb) => { multiaddrs.map((ma) => peerInfo.multiaddrs.add(ma)) - cb(null, peerInfo) - }, - (peerInfo, cb) => { - const node = new Node(peerInfo, undefined, options) - cb(null, node) + options.peerInfo = peerInfo + cb(null, new Node(options)) } ], callback) } -function echo (protocol, conn) { - pull(conn, conn) -} - -module.exports = { - createNode: createNode, - echo: echo -} +module.exports = createNode diff --git a/test/utils/echo.js b/test/utils/echo.js new file mode 100644 index 0000000000..4bef5617c2 --- /dev/null +++ b/test/utils/echo.js @@ -0,0 +1,10 @@ +/* eslint-env mocha */ +'use strict' + +const pull = require('pull-stream') + +function echo (protocol, conn) { + pull(conn, conn) +} + +module.exports = echo