diff --git a/.aegir.js b/.aegir.js index 793492dd16..d3166a7b71 100644 --- a/.aegir.js +++ b/.aegir.js @@ -8,6 +8,7 @@ const pull = require('pull-stream') const PeerBook = require('peer-book') const Switch = require('./src') +const mplex = require('pull-mplex') const spdy = require('libp2p-spdy') const fs = require('fs') const path = require('path') @@ -54,6 +55,7 @@ function pre (done) { switchB = new Switch(peerB, new PeerBook()) switchB.transport.add('ws', new WebSockets()) + switchB.connection.addStreamMuxer(mplex) switchB.connection.addStreamMuxer(spdy) switchB.connection.reuse() switchB.handle('/echo/1.0.0', echo) diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..d2e373b0c0 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,41 @@ +language: node_js +cache: npm +stages: + - check + - test + - cov + +node_js: + - '10' + +os: + - linux + - osx + - windows + +script: npx nyc -s npm run test:node -- --bail +after_success: npx nyc report --reporter=text-lcov > coverage.lcov && npx codecov + +jobs: + include: + - stage: check + script: + - npx aegir commitlint --travis + - npx aegir dep-check + - npm run lint + + - stage: test + name: chrome + addons: + chrome: stable + script: npx aegir test -t browser + + - stage: test + name: firefox + addons: + firefox: latest + script: npx aegir test -t browser -- --browsers FirefoxHeadless + +notifications: + email: false + diff --git a/README.md b/README.md index 3f78bb7876..8c743912fa 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,8 @@ libp2p-switch JavaScript implementation [![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) [![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) [![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) -[![Build Status](https://img.shields.io/travis/libp2p/js-libp2p-switch/master.svg?style=flat-square)](https://travis-ci.org/libp2p/js-libp2p-switch) -[![Circle CI](https://circleci.com/gh/libp2p/js-libp2p-switch.svg?style=svg)](https://circleci.com/gh/libp2p/js-libp2p-switch) -[![Coverage Status](https://coveralls.io/repos/github/libp2p/js-libp2p-switch/badge.svg?branch=master)](https://coveralls.io/github/libp2p/js-libp2p-switch?branch=master) +[![Travis CI](https://flat.badgen.net/travis/libp2p/js-libp2p-switch)](https://travis-ci.com/libp2p/js-libp2p-switch) +[![codecov](https://codecov.io/gh/libp2p/js-libp2p-switch/branch/master/graph/badge.svg)](https://codecov.io/gh/libp2p/js-libp2p-switch) [![Dependency Status](https://david-dm.org/libp2p/js-libp2p-switch.svg?style=flat-square)](https://david-dm.org/libp2p/js-libp2p-switch) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/feross/standard) ![](https://img.shields.io/badge/npm-%3E%3D3.0.0-orange.svg?style=flat-square) diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile deleted file mode 100644 index a7da2e54f3..0000000000 --- a/ci/Jenkinsfile +++ /dev/null @@ -1,2 +0,0 @@ -// Warning: This file is automatically synced from https://github.com/ipfs/ci-sync so if you want to change it, please change it there and ask someone to sync all repositories. -javascript() diff --git a/package.json b/package.json index 417617b052..f35a8752d3 100644 --- a/package.json +++ b/package.json @@ -40,25 +40,28 @@ "npm": ">=3.0.0" }, "devDependencies": { - "aegir": "^18.0.3", + "aegir": "^18.1.0", "chai": "^4.2.0", "chai-checkmark": "^1.0.1", "dirty-chai": "^2.0.1", "libp2p-mplex": "~0.8.4", "libp2p-pnet": "~0.1.0", - "libp2p-secio": "~0.11.0", + "libp2p-secio": "~0.11.1", "libp2p-spdy": "~0.13.1", "libp2p-tcp": "~0.13.0", "libp2p-webrtc-star": "~0.15.8", - "libp2p-websockets": "~0.12.1", + "libp2p-websockets": "~0.12.2", "peer-book": "~0.9.1", "portfinder": "^1.0.20", - "sinon": "^7.2.0", + "pull-length-prefixed": "^1.3.1", + "pull-mplex": "~0.1.0", + "pull-pair": "^1.1.0", + "sinon": "^7.2.3", "webrtcsupport": "^2.2.0" }, "dependencies": { - "async": "^2.6.1", - "bignumber.js": "^8.0.1", + "async": "^2.6.2", + "bignumber.js": "^8.0.2", "class-is": "^1.1.0", "debug": "^4.1.1", "err-code": "^1.1.2", @@ -68,7 +71,7 @@ "libp2p-circuit": "~0.3.4", "libp2p-identify": "~0.7.5", "moving-average": "^1.0.0", - "multiaddr": "^6.0.3", + "multiaddr": "^6.0.4", "multistream-select": "~0.14.4", "once": "^1.4.0", "peer-id": "~0.12.2", diff --git a/src/connection/base.js b/src/connection/base.js index de992409d1..a37aead39e 100644 --- a/src/connection/base.js +++ b/src/connection/base.js @@ -21,6 +21,7 @@ class BaseConnection extends EventEmitter { * @returns {void} */ close (err) { + if (this._state._state === 'DISCONNECTING') return this.log(`closing connection to ${this.theirB58Id}`) if (err && this._events.error) { this.emit('error', err) diff --git a/test/circuit-relay.node.js b/test/circuit-relay.node.js index 9368080e1e..0c3c305b68 100644 --- a/test/circuit-relay.node.js +++ b/test/circuit-relay.node.js @@ -12,7 +12,7 @@ const parallel = require('async/parallel') const series = require('async/series') const TCP = require('libp2p-tcp') const WS = require('libp2p-websockets') -const multiplex = require('libp2p-mplex') +const multiplex = require('pull-mplex') const PeerBook = require('peer-book') const getPorts = require('portfinder').getPorts diff --git a/test/connection.node.js b/test/connection.node.js index a9bb20cb35..b30c4a8a49 100644 --- a/test/connection.node.js +++ b/test/connection.node.js @@ -11,7 +11,7 @@ const WS = require('libp2p-websockets') const parallel = require('async/parallel') const secio = require('libp2p-secio') const pull = require('pull-stream') -const multiplex = require('libp2p-mplex') +const multiplex = require('pull-mplex') const spdy = require('libp2p-spdy') const Connection = require('interface-connection').Connection const Protector = require('libp2p-pnet') diff --git a/test/dial-fsm.node.js b/test/dial-fsm.node.js index 2bebd41604..7acf810007 100644 --- a/test/dial-fsm.node.js +++ b/test/dial-fsm.node.js @@ -11,7 +11,7 @@ const parallel = require('async/parallel') const WS = require('libp2p-websockets') const TCP = require('libp2p-tcp') const secio = require('libp2p-secio') -const multiplex = require('libp2p-mplex') +const multiplex = require('pull-mplex') const pull = require('pull-stream') const utils = require('./utils') diff --git a/test/pnet.node.js b/test/pnet.node.js index 0c680a2cc4..a0b31cea5d 100644 --- a/test/pnet.node.js +++ b/test/pnet.node.js @@ -7,7 +7,7 @@ const expect = chai.expect chai.use(dirtyChai) const parallel = require('async/parallel') const TCP = require('libp2p-tcp') -const multiplex = require('libp2p-mplex') +const multiplex = require('pull-mplex') const pull = require('pull-stream') const PeerBook = require('peer-book') const secio = require('libp2p-secio') diff --git a/test/secio.node.js b/test/secio.node.js index a60c2c3c8d..c040e73ac9 100644 --- a/test/secio.node.js +++ b/test/secio.node.js @@ -7,7 +7,7 @@ const expect = chai.expect chai.use(dirtyChai) const parallel = require('async/parallel') const TCP = require('libp2p-tcp') -const multiplex = require('libp2p-mplex') +const multiplex = require('pull-mplex') const pull = require('pull-stream') const secio = require('libp2p-secio') const PeerBook = require('peer-book') diff --git a/test/stream-muxers.node.js b/test/stream-muxers.node.js index c1ff0f12a2..a3fbf00589 100644 --- a/test/stream-muxers.node.js +++ b/test/stream-muxers.node.js @@ -10,6 +10,7 @@ chai.use(dirtyChai) const parallel = require('async/parallel') const TCP = require('libp2p-tcp') const multiplex = require('libp2p-mplex') +const pullMplex = require('pull-mplex') const spdy = require('libp2p-spdy') const pull = require('pull-stream') const PeerBook = require('peer-book') @@ -22,6 +23,7 @@ const Switch = require('../src') describe('Stream Multiplexing', () => { [ multiplex, + pullMplex, spdy ].forEach((sm) => describe(sm.multicodec, () => { let switchA diff --git a/test/swarm-muxing+websockets.browser.js b/test/swarm-muxing+websockets.browser.js index 2718b7f57e..d6acfab6a5 100644 --- a/test/swarm-muxing+websockets.browser.js +++ b/test/swarm-muxing+websockets.browser.js @@ -1,4 +1,5 @@ /* eslint-env mocha */ +/* eslint max-nested-callbacks: ["error", 5] */ 'use strict' const chai = require('chai') @@ -9,6 +10,7 @@ chai.use(dirtyChai) const PeerId = require('peer-id') const PeerInfo = require('peer-info') const WebSockets = require('libp2p-websockets') +const mplex = require('pull-mplex') const spdy = require('libp2p-spdy') const PeerBook = require('peer-book') const tryEcho = require('./utils').tryEcho @@ -16,51 +18,57 @@ const tryEcho = require('./utils').tryEcho const Switch = require('../src') describe('Switch (WebSockets)', () => { - let sw - let peerDst + [ + mplex, + spdy + ].forEach((muxer) => { + describe(muxer.multicodec, () => { + let sw + let peerDst - before((done) => { - PeerInfo.create((err, peerSrc) => { - expect(err).to.not.exist() - sw = new Switch(peerSrc, new PeerBook()) - done() - }) - }) + before((done) => { + PeerInfo.create((err, peerSrc) => { + expect(err).to.not.exist() + sw = new Switch(peerSrc, new PeerBook()) + done() + }) + }) - it('add spdy', () => { - sw.connection.addStreamMuxer(spdy) - sw.connection.reuse() - }) + after(done => { + sw.stop(done) + }) - it('add ws', () => { - sw.transport.add('ws', new WebSockets()) - expect(Object.keys(sw.transports).length).to.equal(1) - }) + it(`add muxer (${muxer.multicodec})`, () => { + sw.connection.addStreamMuxer(muxer) + sw.connection.reuse() + }) - it('create Dst peer info', (done) => { - PeerId.createFromJSON(require('./test-data/id-2.json'), (err, id) => { - expect(err).to.not.exist() + it('add ws', () => { + sw.transport.add('ws', new WebSockets()) + expect(Object.keys(sw.transports).length).to.equal(1) + }) - peerDst = new PeerInfo(id) - const ma = '/ip4/127.0.0.1/tcp/15347/ws' - peerDst.multiaddrs.add(ma) - done() - }) - }) + it('create Dst peer info', (done) => { + PeerId.createFromJSON(require('./test-data/id-2.json'), (err, id) => { + expect(err).to.not.exist() - it('dial to warm a conn', (done) => { - sw.dial(peerDst, done) - }) + peerDst = new PeerInfo(id) + const ma = '/ip4/127.0.0.1/tcp/15347/ws' + peerDst.multiaddrs.add(ma) + done() + }) + }) - it('dial on protocol, use warmed conn', (done) => { - sw.dial(peerDst, '/echo/1.0.0', (err, conn) => { - expect(err).to.not.exist() - tryEcho(conn, done) - }) - }) + it('dial to warm a conn', (done) => { + sw.dial(peerDst, done) + }) - it('close', (done) => { - // cause CI is slow - setTimeout(() => sw.stop(done), 1000) + it('dial on protocol, use warmed conn', (done) => { + sw.dial(peerDst, '/echo/1.0.0', (err, conn) => { + expect(err).to.not.exist() + tryEcho(conn, done) + }) + }) + }) }) }) diff --git a/test/swarm-muxing.node.js b/test/swarm-muxing.node.js index 47feaf2feb..8a32b9d6fc 100644 --- a/test/swarm-muxing.node.js +++ b/test/swarm-muxing.node.js @@ -1,4 +1,5 @@ /* eslint-env mocha */ +/* eslint max-nested-callbacks: ["error", 5] */ 'use strict' const chai = require('chai') @@ -9,6 +10,7 @@ chai.use(dirtyChai) const parallel = require('async/parallel') const TCP = require('libp2p-tcp') const WebSockets = require('libp2p-websockets') +const mplex = require('pull-mplex') const spdy = require('libp2p-spdy') const pull = require('pull-stream') const PeerBook = require('peer-book') @@ -19,225 +21,229 @@ const tryEcho = utils.tryEcho const Switch = require('../src') describe('Switch (everything all together)', () => { - let switchA // tcp - let switchB // tcp+ws - let switchC // tcp+ws - let switchD // ws - let switchE // ws - - before((done) => createInfos(5, (err, infos) => { - expect(err).to.not.exist() - - const peerA = infos[0] - const peerB = infos[1] - const peerC = infos[2] - const peerD = infos[3] - const peerE = infos[4] - - switchA = new Switch(peerA, new PeerBook()) - switchB = new Switch(peerB, new PeerBook()) - switchC = new Switch(peerC, new PeerBook()) - switchD = new Switch(peerD, new PeerBook()) - switchE = new Switch(peerE, new PeerBook()) - - done() - })) - - after(function (done) { - this.timeout(3 * 1000) - - parallel([ - (cb) => switchA.stop(cb), - (cb) => switchB.stop(cb), - (cb) => switchD.stop(cb), - (cb) => switchE.stop(cb) - ], done) - }) + [mplex, spdy].forEach(muxer => { + describe(muxer.multicodec, () => { + let switchA // tcp + let switchB // tcp+ws + let switchC // tcp+ws + let switchD // ws + let switchE // ws + + before((done) => createInfos(5, (err, infos) => { + expect(err).to.not.exist() - it('add tcp', (done) => { - switchA._peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/10100') - switchB._peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/10200') - switchC._peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/10300') + const peerA = infos[0] + const peerB = infos[1] + const peerC = infos[2] + const peerD = infos[3] + const peerE = infos[4] - switchA.transport.add('tcp', new TCP()) - switchB.transport.add('tcp', new TCP()) - switchC.transport.add('tcp', new TCP()) + switchA = new Switch(peerA, new PeerBook()) + switchB = new Switch(peerB, new PeerBook()) + switchC = new Switch(peerC, new PeerBook()) + switchD = new Switch(peerD, new PeerBook()) + switchE = new Switch(peerE, new PeerBook()) - parallel([ - (cb) => switchA.transport.listen('tcp', {}, null, cb), - (cb) => switchB.transport.listen('tcp', {}, null, cb) - ], done) - }) + done() + })) - it('add websockets', (done) => { - switchB._peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/9012/ws') - switchC._peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/9022/ws') - switchD._peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/9032/ws') - switchE._peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/9042/ws') - - switchB.transport.add('ws', new WebSockets()) - switchC.transport.add('ws', new WebSockets()) - switchD.transport.add('ws', new WebSockets()) - switchE.transport.add('ws', new WebSockets()) - - parallel([ - (cb) => switchB.transport.listen('ws', {}, null, cb), - (cb) => switchD.transport.listen('ws', {}, null, cb), - (cb) => switchE.transport.listen('ws', {}, null, cb) - ], done) - }) + after(function (done) { + this.timeout(3 * 1000) - it('listen automatically', (done) => { - switchC.start(done) - }) + parallel([ + (cb) => switchA.stop(cb), + (cb) => switchB.stop(cb), + (cb) => switchD.stop(cb), + (cb) => switchE.stop(cb) + ], done) + }) - it('add spdy and enable identify', () => { - switchA.connection.addStreamMuxer(spdy) - switchB.connection.addStreamMuxer(spdy) - switchC.connection.addStreamMuxer(spdy) - switchD.connection.addStreamMuxer(spdy) - switchE.connection.addStreamMuxer(spdy) - - switchA.connection.reuse() - switchB.connection.reuse() - switchC.connection.reuse() - switchD.connection.reuse() - switchE.connection.reuse() - }) + it('add tcp', (done) => { + switchA._peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/10100') + switchB._peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/10200') + switchC._peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/10300') - it('warm up from A to B on tcp to tcp+ws', function (done) { - this.timeout(10 * 1000) - parallel([ - (cb) => switchB.once('peer-mux-established', (pi) => { - expect(pi.id.toB58String()).to.equal(switchA._peerInfo.id.toB58String()) - cb() - }), - (cb) => switchA.once('peer-mux-established', (pi) => { - expect(pi.id.toB58String()).to.equal(switchB._peerInfo.id.toB58String()) - cb() - }), - (cb) => switchA.dial(switchB._peerInfo, (err) => { - expect(err).to.not.exist() - expect(switchA.connection.getAll()).to.have.length(1) - cb() + switchA.transport.add('tcp', new TCP()) + switchB.transport.add('tcp', new TCP()) + switchC.transport.add('tcp', new TCP()) + + parallel([ + (cb) => switchA.transport.listen('tcp', {}, null, cb), + (cb) => switchB.transport.listen('tcp', {}, null, cb) + ], done) }) - ], done) - }) - it('warm up a warmed up, from B to A', (done) => { - switchB.dial(switchA._peerInfo, (err) => { - expect(err).to.not.exist() - expect(switchA.connection.getAll()).to.have.length(1) - done() - }) - }) + it('add websockets', (done) => { + switchB._peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/9012/ws') + switchC._peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/9022/ws') + switchD._peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/9032/ws') + switchE._peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/9042/ws') + + switchB.transport.add('ws', new WebSockets()) + switchC.transport.add('ws', new WebSockets()) + switchD.transport.add('ws', new WebSockets()) + switchE.transport.add('ws', new WebSockets()) + + parallel([ + (cb) => switchB.transport.listen('ws', {}, null, cb), + (cb) => switchD.transport.listen('ws', {}, null, cb), + (cb) => switchE.transport.listen('ws', {}, null, cb) + ], done) + }) - it('dial from tcp to tcp+ws, on protocol', (done) => { - switchB.handle('/anona/1.0.0', (protocol, conn) => pull(conn, conn)) + it('listen automatically', (done) => { + switchC.start(done) + }) - switchA.dial(switchB._peerInfo, '/anona/1.0.0', (err, conn) => { - expect(err).to.not.exist() - expect(switchA.connection.getAll()).to.have.length(1) - tryEcho(conn, done) - }) - }) + it('add spdy and enable identify', () => { + switchA.connection.addStreamMuxer(muxer) + switchB.connection.addStreamMuxer(muxer) + switchC.connection.addStreamMuxer(muxer) + switchD.connection.addStreamMuxer(muxer) + switchE.connection.addStreamMuxer(muxer) + + switchA.connection.reuse() + switchB.connection.reuse() + switchC.connection.reuse() + switchD.connection.reuse() + switchE.connection.reuse() + }) - it('dial from ws to ws no proto', (done) => { - switchD.dial(switchE._peerInfo, (err) => { - expect(err).to.not.exist() - expect(switchD.connection.getAll()).to.have.length(1) - done() - }) - }) + it('warm up from A to B on tcp to tcp+ws', function (done) { + this.timeout(10 * 1000) + parallel([ + (cb) => switchB.once('peer-mux-established', (pi) => { + expect(pi.id.toB58String()).to.equal(switchA._peerInfo.id.toB58String()) + cb() + }), + (cb) => switchA.once('peer-mux-established', (pi) => { + expect(pi.id.toB58String()).to.equal(switchB._peerInfo.id.toB58String()) + cb() + }), + (cb) => switchA.dial(switchB._peerInfo, (err) => { + expect(err).to.not.exist() + expect(switchA.connection.getAll()).to.have.length(1) + cb() + }) + ], done) + }) - it('dial from ws to ws', (done) => { - switchE.handle('/abacaxi/1.0.0', (protocol, conn) => pull(conn, conn)) + it('warm up a warmed up, from B to A', (done) => { + switchB.dial(switchA._peerInfo, (err) => { + expect(err).to.not.exist() + expect(switchA.connection.getAll()).to.have.length(1) + done() + }) + }) - switchD.dial(switchE._peerInfo, '/abacaxi/1.0.0', (err, conn) => { - expect(err).to.not.exist() - expect(switchD.connection.getAll()).to.have.length(1) + it('dial from tcp to tcp+ws, on protocol', (done) => { + switchB.handle('/anona/1.0.0', (protocol, conn) => pull(conn, conn)) - tryEcho(conn, () => setTimeout(() => { - expect(switchE.connection.getAll()).to.have.length(1) - done() - }, 1000)) - }) - }) + switchA.dial(switchB._peerInfo, '/anona/1.0.0', (err, conn) => { + expect(err).to.not.exist() + expect(switchA.connection.getAll()).to.have.length(1) + tryEcho(conn, done) + }) + }) - it('dial from tcp to tcp+ws (returned conn)', (done) => { - switchB.handle('/grapes/1.0.0', (protocol, conn) => pull(conn, conn)) + it('dial from ws to ws no proto', (done) => { + switchD.dial(switchE._peerInfo, (err) => { + expect(err).to.not.exist() + expect(switchD.connection.getAll()).to.have.length(1) + done() + }) + }) - const conn = switchA.dial(switchB._peerInfo, '/grapes/1.0.0', (err, conn) => { - expect(err).to.not.exist() - expect(switchA.connection.getAll()).to.have.length(1) - }) + it('dial from ws to ws', (done) => { + switchE.handle('/abacaxi/1.0.0', (protocol, conn) => pull(conn, conn)) - tryEcho(conn, done) - }) + switchD.dial(switchE._peerInfo, '/abacaxi/1.0.0', (err, conn) => { + expect(err).to.not.exist() + expect(switchD.connection.getAll()).to.have.length(1) - it('dial from tcp+ws to tcp+ws', (done) => { - let i = 0 + tryEcho(conn, () => setTimeout(() => { + expect(switchE.connection.getAll()).to.have.length(1) + done() + }, 1000)) + }) + }) - function check (err) { - expect(err).to.not.exist() - if (++i === 3) { done() } - } + it('dial from tcp to tcp+ws (returned conn)', (done) => { + switchB.handle('/grapes/1.0.0', (protocol, conn) => pull(conn, conn)) - switchC.handle('/mamao/1.0.0', (protocol, conn) => { - conn.getPeerInfo((err, peerInfo) => { - expect(err).to.not.exist() - expect(peerInfo).to.exist() - check() + const conn = switchA.dial(switchB._peerInfo, '/grapes/1.0.0', (err, conn) => { + expect(err).to.not.exist() + expect(switchA.connection.getAll()).to.have.length(1) + }) + + tryEcho(conn, done) }) - pull(conn, conn) - }) + it('dial from tcp+ws to tcp+ws', (done) => { + let i = 0 - switchA.dial(switchC._peerInfo, '/mamao/1.0.0', (err, conn) => { - expect(err).to.not.exist() + function check (err) { + expect(err).to.not.exist() + if (++i === 3) { done() } + } - conn.getPeerInfo((err, peerInfo) => { - expect(err).to.not.exist() - expect(peerInfo).to.exist() - check() - }) + switchC.handle('/mamao/1.0.0', (protocol, conn) => { + conn.getPeerInfo((err, peerInfo) => { + expect(err).to.not.exist() + expect(peerInfo).to.exist() + check() + }) - expect(switchA.connection.getAll()).to.have.length(2) - expect(switchC._peerInfo.isConnected).to.exist() - expect(switchA._peerInfo.isConnected).to.exist() + pull(conn, conn) + }) - tryEcho(conn, check) - }) - }) + switchA.dial(switchC._peerInfo, '/mamao/1.0.0', (err, conn) => { + expect(err).to.not.exist() - it('hangUp', (done) => { - let count = 0 - const ready = () => ++count === 3 ? done() : null + conn.getPeerInfo((err, peerInfo) => { + expect(err).to.not.exist() + expect(peerInfo).to.exist() + check() + }) - switchB.once('peer-mux-closed', (peerInfo) => { - expect(switchB.connection.getAll()).to.have.length(0) - expect(switchB._peerInfo.isConnected()).to.not.exist() - ready() - }) + expect(switchA.connection.getAll()).to.have.length(2) + expect(switchC._peerInfo.isConnected).to.exist() + expect(switchA._peerInfo.isConnected).to.exist() - switchA.once('peer-mux-closed', (peerInfo) => { - expect(switchA.connection.getAll()).to.have.length(1) - expect(switchA._peerInfo.isConnected()).to.not.exist() - ready() - }) + tryEcho(conn, check) + }) + }) - switchA.hangUp(switchB._peerInfo, (err) => { - expect(err).to.not.exist() - ready() - }) - }) + it('hangUp', (done) => { + let count = 0 + const ready = () => ++count === 3 ? done() : null + + switchB.once('peer-mux-closed', (peerInfo) => { + expect(switchB.connection.getAll()).to.have.length(0) + expect(switchB._peerInfo.isConnected()).to.not.exist() + ready() + }) + + switchA.once('peer-mux-closed', (peerInfo) => { + expect(switchA.connection.getAll()).to.have.length(1) + expect(switchA._peerInfo.isConnected()).to.not.exist() + ready() + }) + + switchA.hangUp(switchB._peerInfo, (err) => { + expect(err).to.not.exist() + ready() + }) + }) - it('close a muxer emits event', function (done) { - this.timeout(3 * 1000) + it('close a muxer emits event', function (done) { + this.timeout(3 * 1000) - parallel([ - (cb) => switchA.once('peer-mux-closed', (peerInfo) => cb()), - (cb) => switchC.stop(cb) - ], done) + parallel([ + (cb) => switchA.once('peer-mux-closed', (peerInfo) => cb()), + (cb) => switchC.stop(cb) + ], done) + }) + }) }) })