diff --git a/examples/README.md b/examples/README.md index d0d3503a..0102dd36 100644 --- a/examples/README.md +++ b/examples/README.md @@ -6,8 +6,6 @@ Let us know if you find any issue or if you want to contribute and add a new tut ## Examples -- [In Node.js](./nodejs) - - [echo](./nodejs/echo) - - [chat](./nodejs/chat) -- [In the browser](./browser) - - [mapper](./browser/mapper) +- [The standard echo net example with libp2p](./echo) +- [A simple chat app with](./chat) +- [See other nodes in the network using WebRTC Star discovery mechanism](./see-nodes) diff --git a/examples/chat/README.md b/examples/chat/README.md new file mode 100644 index 00000000..905f1f08 --- /dev/null +++ b/examples/chat/README.md @@ -0,0 +1 @@ +# Chat example with libp2p diff --git a/examples/nodejs/chat/dialer.js b/examples/chat/src/dialer.js similarity index 88% rename from examples/nodejs/chat/dialer.js rename to examples/chat/src/dialer.js index 88ae5cd4..fe592a0f 100644 --- a/examples/nodejs/chat/dialer.js +++ b/examples/chat/src/dialer.js @@ -3,8 +3,7 @@ const PeerId = require('peer-id') const PeerInfo = require('peer-info') -const Node = require('../../../../test/nodejs-bundle/nodejs-bundle.js') -const multiaddr = require('multiaddr') +const Node = require('./libp2p-bundle') const pull = require('pull-stream') const async = require('async') const Pushable = require('pull-pushable') @@ -31,12 +30,12 @@ async.parallel([ ], (err, ids) => { if (err) throw err const peerDialer = new PeerInfo(ids[0]) - peerDialer.multiaddr.add(multiaddr('/ip4/0.0.0.0/tcp/0')) + peerDialer.multiaddr.add('/ip4/0.0.0.0/tcp/0') const nodeDialer = new Node(peerDialer) const peerListener = new PeerInfo(ids[1]) idListener = ids[1] - peerListener.multiaddr.add(multiaddr('/ip4/127.0.0.1/tcp/10333')) + peerListener.multiaddr.add('/ip4/127.0.0.1/tcp/10333') nodeDialer.start((err) => { if (err) { throw err diff --git a/examples/chat/src/libp2p-bundle.js b/examples/chat/src/libp2p-bundle.js new file mode 100644 index 00000000..5d670752 --- /dev/null +++ b/examples/chat/src/libp2p-bundle.js @@ -0,0 +1,80 @@ +'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 multiplex = require('libp2p-multiplex') +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 'multiplex': return multiplex + 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 [multiplex, 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/examples/nodejs/chat/listener.js b/examples/chat/src/listener.js similarity index 87% rename from examples/nodejs/chat/listener.js rename to examples/chat/src/listener.js index 435ab8ff..a983bee0 100644 --- a/examples/nodejs/chat/listener.js +++ b/examples/chat/src/listener.js @@ -3,8 +3,7 @@ const PeerId = require('peer-id') const PeerInfo = require('peer-info') -const Node = require('../../../../test/nodejs-bundle/nodejs-bundle.js') -const multiaddr = require('multiaddr') +const Node = require('./libp2p-bundle.js') const pull = require('pull-stream') const Pushable = require('pull-pushable') const p = Pushable() @@ -14,7 +13,7 @@ PeerId.createFromJSON(require('./peer-id-listener'), (err, idListener) => { throw err } const peerListener = new PeerInfo(idListener) - peerListener.multiaddr.add(multiaddr('/ip4/0.0.0.0/tcp/10333')) + peerListener.multiaddr.add('/ip4/0.0.0.0/tcp/10333') const nodeListener = new Node(peerListener) nodeListener.start((err) => { diff --git a/examples/nodejs/chat/peer-id-dialer.json b/examples/chat/src/peer-id-dialer.json similarity index 100% rename from examples/nodejs/chat/peer-id-dialer.json rename to examples/chat/src/peer-id-dialer.json diff --git a/examples/nodejs/chat/peer-id-listener.json b/examples/chat/src/peer-id-listener.json similarity index 100% rename from examples/nodejs/chat/peer-id-listener.json rename to examples/chat/src/peer-id-listener.json diff --git a/examples/echo/README.md b/examples/echo/README.md new file mode 100644 index 00000000..f848b465 --- /dev/null +++ b/examples/echo/README.md @@ -0,0 +1 @@ +# Echo example with libp2p diff --git a/examples/nodejs/echo/dialer.js b/examples/echo/src/dialer.js similarity index 82% rename from examples/nodejs/echo/dialer.js rename to examples/echo/src/dialer.js index c3093292..75476ab6 100644 --- a/examples/nodejs/echo/dialer.js +++ b/examples/echo/src/dialer.js @@ -7,8 +7,7 @@ const PeerId = require('peer-id') const PeerInfo = require('peer-info') -const Node = require('../../../../test/nodejs-bundle/nodejs-bundle.js') -const multiaddr = require('multiaddr') +const Node = require('./libp2p-bundle') const pull = require('pull-stream') const async = require('async') @@ -21,14 +20,14 @@ async.parallel([ // Dialer const dialerId = ids[0] const dialerPeerInfo = new PeerInfo(dialerId) - dialerPeerInfo.multiaddr.add(multiaddr('/ip4/0.0.0.0/tcp/0')) + dialerPeerInfo.multiaddr.add('/ip4/0.0.0.0/tcp/0') const dialerNode = new Node(dialerPeerInfo) // Peer to Dial const listenerPeerInfo = new PeerInfo(ids[1]) const listenerId = ids[1] - const listenerMultiaddr = multiaddr('/ip4/127.0.0.1/tcp/10333/ipfs/' + - listenerId.toB58String()) + const listenerMultiaddr = '/ip4/127.0.0.1/tcp/10333/ipfs/' + + listenerId.toB58String() listenerPeerInfo.multiaddr.add(listenerMultiaddr) dialerNode.start((err) => { diff --git a/examples/nodejs/echo/id-d.json b/examples/echo/src/id-d.json similarity index 100% rename from examples/nodejs/echo/id-d.json rename to examples/echo/src/id-d.json diff --git a/examples/nodejs/echo/id-l.json b/examples/echo/src/id-l.json similarity index 100% rename from examples/nodejs/echo/id-l.json rename to examples/echo/src/id-l.json diff --git a/examples/echo/src/libp2p-bundle.js b/examples/echo/src/libp2p-bundle.js new file mode 100644 index 00000000..053a5719 --- /dev/null +++ b/examples/echo/src/libp2p-bundle.js @@ -0,0 +1,80 @@ +'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 multiplex = require('libp2p-multiplex') +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 'multiplex': return multiplex + 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 [multiplex, 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/examples/nodejs/echo/listener.js b/examples/echo/src/listener.js similarity index 84% rename from examples/nodejs/echo/listener.js rename to examples/echo/src/listener.js index 812dfc43..611f2581 100644 --- a/examples/nodejs/echo/listener.js +++ b/examples/echo/src/listener.js @@ -7,8 +7,7 @@ const PeerId = require('peer-id') const PeerInfo = require('peer-info') -const Node = require('../../../../test/nodejs-bundle/nodejs-bundle.js') -const multiaddr = require('multiaddr') +const Node = require('./libp2p-bundle') const pull = require('pull-stream') const series = require('async/series') @@ -25,7 +24,7 @@ series([ }, (cb) => { const listenerPeerInfo = new PeerInfo(listenerId) - listenerPeerInfo.multiaddr.add(multiaddr('/ip4/0.0.0.0/tcp/10333')) + listenerPeerInfo.multiaddr.add('/ip4/0.0.0.0/tcp/10333') listenerNode = new Node(listenerPeerInfo) listenerNode.swarm.on('peer-mux-established', (peerInfo) => { @@ -33,7 +32,6 @@ series([ }) listenerNode.handle('/echo/1.0.0', (protocol, conn) => pull(conn, conn)) - listenerNode.start(cb) } ], (err) => { diff --git a/examples/browser/mapper/.gitignore b/examples/see-nodes/.gitignore similarity index 100% rename from examples/browser/mapper/.gitignore rename to examples/see-nodes/.gitignore diff --git a/examples/see-nodes/README.md b/examples/see-nodes/README.md new file mode 100644 index 00000000..cc60cf79 --- /dev/null +++ b/examples/see-nodes/README.md @@ -0,0 +1,12 @@ +# See nodes + +> See other nodes in the network using WebRTC Star Discovery + +# Try it out + +``` +# After having run `npm install` at the root of the repo. +> npm install +> npm start +# open your browser in port :9090 +``` diff --git a/examples/browser/mapper/package.json b/examples/see-nodes/package.json similarity index 75% rename from examples/browser/mapper/package.json rename to examples/see-nodes/package.json index b9c2724b..ae7648a2 100644 --- a/examples/browser/mapper/package.json +++ b/examples/see-nodes/package.json @@ -1,10 +1,10 @@ { - "name": "mapper", + "name": "see-nodes", "version": "0.0.0", - "description": "", + "description": "See other nodes in the network using WebRTC Star discovery mechanism", "main": "src/index.js", "scripts": { - "bundle": "browserify src/index.js --require browserify-zlib-next:zlib > public/bundle.js", + "bundle": "browserify src/index.js > public/bundle.js", "serve": "static public -p 9090 -H '{\"Cache-Control\": \"no-cache, must-revalidate\"}'", "mon": "nodemon --exec \"npm run start\" --ignore public/bundle.js", "start": "npm run bundle && npm run serve" @@ -13,7 +13,6 @@ "devDependencies": { "browserify": "^14.0.0", "browserify-optional": "^1.0.0", - "browserify-zlib-next": "^1.0.1", "concat-stream": "^1.6.0", "detect-dom-ready": "^1.0.2", "node-static": "^0.7.9", diff --git a/examples/browser/mapper/public/index.html b/examples/see-nodes/public/index.html similarity index 100% rename from examples/browser/mapper/public/index.html rename to examples/see-nodes/public/index.html diff --git a/examples/browser/mapper/src/create-node.js b/examples/see-nodes/src/create-node.js similarity index 87% rename from examples/browser/mapper/src/create-node.js rename to examples/see-nodes/src/create-node.js index 6e364560..764363f8 100644 --- a/examples/browser/mapper/src/create-node.js +++ b/examples/see-nodes/src/create-node.js @@ -1,7 +1,7 @@ 'use strict' const PeerInfo = require('peer-info') -const Node = require('../../../../test/browser-bundle/browser-bundle.js') +const Node = require('./libp2p-bundle') function createNode (callback) { PeerInfo.create((err, peerInfo) => { diff --git a/examples/browser/mapper/src/index.js b/examples/see-nodes/src/index.js similarity index 100% rename from examples/browser/mapper/src/index.js rename to examples/see-nodes/src/index.js diff --git a/examples/see-nodes/src/libp2p-bundle.js b/examples/see-nodes/src/libp2p-bundle.js new file mode 100644 index 00000000..9a33e9ea --- /dev/null +++ b/examples/see-nodes/src/libp2p-bundle.js @@ -0,0 +1,27 @@ +'use strict' + +const WebRTCStar = require('libp2p-webrtc-star') +const multiplex = require('libp2p-multiplex') +const spdy = require('libp2p-spdy') +const secio = require('libp2p-secio') +const libp2p = require('../../..') + +class Node extends libp2p { + constructor (peerInfo, peerBook, options) { + options = options || {} + const wstar = new WebRTCStar() + + const modules = { + transport: [wstar], + connection: { + muxer: [multiplex, spdy], + crypto: [secio] + }, + discovery: [wstar.discovery] + } + + super(modules, peerInfo, peerBook, options) + } +} + +module.exports = Node