diff --git a/README.md b/README.md index 107fd71854..25113352b9 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,9 @@ libp2p-swarm JavaScript implementation [![](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/diasdavid/js-libp2p-swarm/master.svg?style=flat-square)](https://travis-ci.org/diasdavid/js-libp2p-swarm) +![](https://img.shields.io/badge/coverage-%3F-yellow.svg?style=flat-square) +[![Dependency Status](https://david-dm.org/ipfs/js-libp2p-swarm.svg?style=flat-square)](https://david-dm.org/ipfs/js-libp2p-swarm) +[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/feross/standard) > libp2p swarm implementation in JavaScript diff --git a/karma.conf.js b/karma.conf.js index 50ef8cb0d5..42617833e3 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,6 +1,7 @@ +const path = require('path') + module.exports = function (config) { - var path = require('path') - var nodeForgePath = path.resolve(__dirname, 'node_modules/peer-id/deps/forge.bundle.js') + const nodeForgePath = path.resolve(__dirname, 'node_modules/peer-id/deps/forge.bundle.js') config.set({ basePath: '', @@ -8,11 +9,12 @@ module.exports = function (config) { files: [ nodeForgePath, - 'tests/browser.js' + 'tests/browser-nodejs/browser.js' ], preprocessors: { - 'tests/*': ['webpack'] + 'tests/*': ['webpack'], + 'tests/browser-nodejs/*': ['webpack'] }, webpack: { diff --git a/package.json b/package.json index ecb670b364..47ff5d13b7 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,11 @@ { "name": "libp2p-swarm", "version": "0.9.0", - "description": "libp2p swarm implementation in Node.js", + "description": "libp2p swarm implementation in JavaScript", "main": "src/index.js", "scripts": { "test:node": "mocha tests/*-test.js", - "test:browser": "node tests/karma.js", + "test:browser": "node tests/browser-nodejs/test.js", "test": "npm run test:node && npm run test:browser", "coverage": "istanbul cover --print both -- _mocha tests/*-test.js", "lint": "standard" diff --git a/tests/browser-nodejs/browser.js b/tests/browser-nodejs/browser.js new file mode 100644 index 0000000000..6b6a7ed037 --- /dev/null +++ b/tests/browser-nodejs/browser.js @@ -0,0 +1,123 @@ +/* eslint-env mocha */ + +const expect = require('chai').expect +const multiaddr = require('multiaddr') +const Id = require('peer-id') +const Peer = require('peer-info') +const Swarm = require('./../../src') +const WebSockets = require('libp2p-websockets') +const bl = require('bl') + +describe('basics', () => { + it('throws on missing peerInfo', (done) => { + expect(Swarm).to.throw(Error) + done() + }) +}) + +describe('transport - websockets', function () { + this.timeout(10000) + + var swarm + + before((done) => { + const b58IdSrc = 'QmYzgdesgjdvD3okTPGZT9NPmh1BuH5FfTVNKjsvaAprhb' + // use a pre generated Id to save time + const idSrc = Id.createFromB58String(b58IdSrc) + const peerSrc = new Peer(idSrc) + swarm = new Swarm(peerSrc) + + done() + }) + + it('add', (done) => { + swarm.transport.add('ws', new WebSockets(), () => { + expect(Object.keys(swarm.transports).length).to.equal(1) + done() + }) + }) + + it('dial', (done) => { + const ma = multiaddr('/ip4/127.0.0.1/tcp/9100/websockets') + + const conn = swarm.transport.dial('ws', ma, (err, conn) => { + expect(err).to.not.exist + }) + + conn.pipe(bl((err, data) => { + expect(err).to.not.exist + expect(data.toString()).to.equal('hey') + done() + })) + conn.write('hey') + conn.end() + }) +}) + +describe('high level API - 1st without stream multiplexing (on websockets)', function () { + this.timeout(10000) + + var swarm + var peerDst + + before((done) => { + const b58IdSrc = 'QmYzgdesgjdvD3okTPGZT9NPmh1BuH5FfTVNKjsvaAprhb' + // use a pre generated Id to save time + const idSrc = Id.createFromB58String(b58IdSrc) + const peerSrc = new Peer(idSrc) + swarm = new Swarm(peerSrc) + + done() + }) + + after((done) => { + done() + // swarm.close(done) + }) + + it('add ws', (done) => { + swarm.transport.add('ws', new WebSockets()) + expect(Object.keys(swarm.transports).length).to.equal(1) + done() + }) + + it('create Dst peer info', (done) => { + const b58IdDst = 'QmYzgdesgjdvD3okTPGZT9NPmh1BuH5FfTVNKjsvaAprhb' + // use a pre generated Id to save time + const idDst = Id.createFromB58String(b58IdDst) + peerDst = new Peer(idDst) + + const ma = multiaddr('/ip4/127.0.0.1/tcp/9200/websockets') + peerDst.multiaddr.add(ma) + done() + }) + + it('dial on protocol', (done) => { + swarm.dial(peerDst, '/echo/1.0.0', (err, conn) => { + expect(err).to.not.exist + conn.pipe(bl((err, data) => { + expect(err).to.not.exist + expect(data.toString()).to.equal('hey') + done() + })) + conn.write('hey') + conn.end() + }) + }) + + it('dial to warm a conn', (done) => { + swarm.dial(peerDst, (err) => { + expect(err).to.not.exist + done() + }) + }) + + it('dial on protocol, reuse warmed conn', (done) => { + swarm.dial(peerDst, '/echo/1.0.0', (err, conn) => { + expect(err).to.not.exist + conn.end() + conn.on('data', () => {}) // let it flow.. let it flooooow + conn.on('end', done) + }) + }) +}) diff --git a/tests/browser-nodejs/test.js b/tests/browser-nodejs/test.js new file mode 100644 index 0000000000..9f54de2aef --- /dev/null +++ b/tests/browser-nodejs/test.js @@ -0,0 +1,65 @@ +const Server = require('karma').Server +const path = require('path') + +const Peer = require('peer-info') +const Id = require('peer-id') +const WebSockets = require('libp2p-websockets') +const Swarm = require('./../../src') +const multiaddr = require('multiaddr') + +var swarmA +var swarmB + +function createListeners (done) { + function createListenerA (cb) { + const b58IdA = 'QmWg2L4Fucx1x4KXJTfKHGixBJvveubzcd7DdhB2Mqwfh1' + const peerA = new Peer(Id.createFromB58String(b58IdA)) + const maA = multiaddr('/ip4/127.0.0.1/tcp/9100/websockets') + + peerA.multiaddr.add(maA) + swarmA = new Swarm(peerA) + swarmA.transport.add('ws', new WebSockets()) + swarmA.transport.listen('ws', {}, echo, cb) + } + + function createListenerB (cb) { + const b58IdB = 'QmRy1iU6BHmG5Hd8rnPhPL98cy1W1przUSTAMcGDq9yAAV' + const maB = multiaddr('/ip4/127.0.0.1/tcp/9200/websockets') + const peerB = new Peer(Id.createFromB58String(b58IdB)) + peerB.multiaddr.add(maB) + swarmB = new Swarm(peerB) + + swarmB.transport.add('ws', new WebSockets()) + swarmB.transport.listen('ws', {}, null, cb) + + swarmB.handle('/echo/1.0.0', echo) + } + + var count = 0 + const ready = () => ++count === 2 ? done() : null + + createListenerA(ready) + createListenerB(ready) + + function echo (conn) { + conn.pipe(conn) + } +} + +function stop (done) { + var count = 0 + const ready = () => ++count === 2 ? done() : null + + swarmA.transport.close('ws', ready) + swarmB.transport.close('ws', ready) +} + +function run (done) { + const karma = new Server({ + configFile: path.join(__dirname, '../../karma.conf.js') + }, done) + + karma.start() +} + +createListeners(() => run(() => stop(() => null))) diff --git a/tests/browser.js b/tests/browser.js deleted file mode 100644 index 5b67917063..0000000000 --- a/tests/browser.js +++ /dev/null @@ -1,133 +0,0 @@ -/* eslint-env mocha */ - -const expect = require('chai').expect -// const async = require('async') - -const multiaddr = require('multiaddr') -const PeerId = require('peer-id') -const Peer = require('peer-info') -const Swarm = require('../src') -const WebSockets = require('libp2p-websockets') -const bl = require('bl') - -const PEER_ID_SERVER_A = 'QmWg2L4Fucx1x4KXJTfKHGixBJvveubzcd7DdhB2Mqwfh1' -const PEER_ID_SERVER_B = 'QmRy1iU6BHmG5Hd8rnPhPL98cy1W1przUSTAMcGDq9yAAV' -const MULTIADDR_SERVER_A = '/ip4/127.0.0.1/tcp/9888/websockets' -const MULTIADDR_SERVER_B = '/ip4/127.0.0.1/tcp/9999/websockets' - -// random id to be used on the tests -const PEER_ID_A = 'QmYzgdesgjdvD3okTPGZT9NPmh1BuH5FfTVNKjsvaAprhb' - -describe('basics', () => { - it('throws on missing peerInfo', (done) => { - expect(Swarm).to.throw(Error) - done() - }) -}) - -describe('transport - websockets', function () { - this.timeout(10000) - - var swarm - var peerId = PeerId.createFromB58String(PEER_ID_A) - var peer = new Peer(peerId) - - before((done) => { - swarm = new Swarm(peer) - done() - }) - - it('add', (done) => { - swarm.transport.add('ws', new WebSockets(), () => { - expect(Object.keys(swarm.transports).length).to.equal(1) - done() - }) - }) - - it('dial', (done) => { - const conn = swarm.transport.dial('ws', multiaddr(MULTIADDR_SERVER_A), (err, conn) => { - expect(err).to.not.exist - }) - conn.pipe(bl((err, data) => { - expect(err).to.not.exist - expect(data.toString()).to.equal('hey') - done() - })) - conn.write('hey') - conn.end() - }) -}) - -describe('high level API - 1st without stream multiplexing (on websockets)', function () { - this.timeout(10000) - - var swarm - var peerSelf - var peerServerA - var peerServerB - - before((done) => { - const peerServerAId = PeerId.createFromB58String(PEER_ID_SERVER_A) - peerServerA = new Peer(peerServerAId) - const peerServerBId = PeerId.createFromB58String(PEER_ID_SERVER_B) - peerServerB = new Peer(peerServerBId) - const peerSelfId = PeerId.createFromB58String(PEER_ID_A) - peerSelf = new Peer(peerSelfId) - - peerServerA.multiaddr.add(multiaddr(MULTIADDR_SERVER_A)) - peerServerB.multiaddr.add(multiaddr(MULTIADDR_SERVER_B)) - - swarm = new Swarm(peerSelf) - - swarm.transport.add('ws', new WebSockets()) - expect(Object.keys(swarm.transports).length).to.equal(1) - done() - }) - - // after((done) => { - // swarm.close(done) - // }) - - it('dial using transport interface', (done) => { - const conn = swarm.transport.dial('ws', peerServerA.multiaddrs, (err, conn) => { - expect(err).to.not.exist - }) - - conn.pipe(bl((err, data) => { - expect(err).to.not.exist - expect(data.toString()).to.equal('hey') - done() - })) - conn.write('hey') - conn.end() - }) - - it('dial on protocol', (done) => { - swarm.dial(peerServerB, '/pineapple/1.0.0', (err, conn) => { - expect(err).to.not.exist - conn.pipe(bl((err, data) => { - expect(err).to.not.exist - expect(data.toString()).to.equal('yo') - done() - })) - conn.write('yo') - conn.end() - }) - }) - - it('dial to warm a conn', (done) => { - swarm.dial(peerServerB, (err) => { - expect(err).to.not.exist - done() - }) - }) - - it('dial on protocol, reuse warmed conn', (done) => { - swarm.dial(peerServerB, '/pineapple/1.0.0', (err, conn) => { - expect(err).to.not.exist - conn.end() - conn.on('data', () => {}) // let it flow.. let it flooooow - conn.on('end', done) - }) - }) -}) diff --git a/tests/karma.js b/tests/karma.js deleted file mode 100644 index b86a2f8148..0000000000 --- a/tests/karma.js +++ /dev/null @@ -1,66 +0,0 @@ -const Server = require('karma').Server -const path = require('path') - -const Peer = require('peer-info') -const PeerId = require('peer-id') -const WebSockets = require('libp2p-websockets') -const Swarm = require('../src') -const multiaddr = require('multiaddr') - -const PEER_ID_SERVER_A = 'QmWg2L4Fucx1x4KXJTfKHGixBJvveubzcd7DdhB2Mqwfh1' -const PEER_ID_SERVER_B = 'QmRy1iU6BHmG5Hd8rnPhPL98cy1W1przUSTAMcGDq9yAAV' -const MULTIADDR_SERVER_A = '/ip4/127.0.0.1/tcp/9888/websockets' -const MULTIADDR_SERVER_B = '/ip4/127.0.0.1/tcp/9999/websockets' - -var swarmA -var peerA -var swarmB -var peerB - -function createServers (done) { - function createServerA (cb) { - const id = PeerId.createFromB58String(PEER_ID_SERVER_A) - peerA = new Peer(id) - peerA.multiaddr.add(multiaddr(MULTIADDR_SERVER_A)) - swarmA = new Swarm(peerA) - swarmA.transport.add('ws', new WebSockets()) - swarmA.transport.listen('ws', {}, (conn) => { - conn.pipe(conn) - }, cb) - } - - function createServerB (cb) { - const id = PeerId.createFromB58String(PEER_ID_SERVER_B) - peerB = new Peer(id) - peerB.multiaddr.add(multiaddr(MULTIADDR_SERVER_B)) - swarmB = new Swarm(peerB) - swarmB.transport.add('ws', new WebSockets()) - swarmB.handle('/pineapple/1.0.0', (conn) => { - conn.pipe(conn) - }) - swarmB.transport.listen('ws', {}, null, cb) - } - - var count = 0 - const ready = () => ++count === 2 ? done() : null - - createServerA(ready) - createServerB(ready) -} - -function stopServers (done) { - var count = 0 - const ready = () => ++count === 2 ? done() : null - - swarmA.transport.close('ws', ready) - swarmB.transport.close('ws', ready) -} - -function runTests (done) { - new Server({ - configFile: path.join(__dirname, '/../karma.conf.js'), - singleRun: true - }, done).start() -} - -createServers(() => runTests(() => stopServers(() => null)))