refactor(docs): async await version of examples/echo (#483)

* fix: performance bottleneck in stat.js (#463)

Array.shift seems to be very slow, perhaps linear, on some
engines, resulting in  _update consuming a lot of CPU.

* docs(fix): correct docs and example for pnet (#464)

* docs(fix): correct docs and example for pnet

* docs(fix): correct pnet docs

* docs(fix): update README.md language (#468)

* docs: reciprocate (#474)

* docs(example): fix ipfs cat (#475)

`ipfs.files.cat` is incorrect. the correct function is `ipfs.cat`

* fix: async await examples/echo

* fix: examples readme typos (#481)

* fix: simplify libp2p bundle for echo example
This commit is contained in:
dirkmc 2019-11-27 06:24:22 -05:00 committed by Jacob Heun
parent c563e06a60
commit 953d185c39
3 changed files with 58 additions and 110 deletions

View File

@ -8,51 +8,54 @@
const PeerId = require('peer-id') const PeerId = require('peer-id')
const PeerInfo = require('peer-info') const PeerInfo = require('peer-info')
const Node = require('./libp2p-bundle') const Node = require('./libp2p-bundle')
const pull = require('pull-stream') const pipe = require('it-pipe')
const async = require('async')
async.parallel([ async function run() {
(cb) => PeerId.createFromJSON(require('./id-d'), cb), const [dialerId, listenerId] = await Promise.all([
(cb) => PeerId.createFromJSON(require('./id-l'), cb) PeerId.createFromJSON(require('./id-d')),
], (err, ids) => { PeerId.createFromJSON(require('./id-l'))
if (err) { throw err } ])
// Dialer // Dialer
const dialerId = ids[0]
const dialerPeerInfo = new PeerInfo(dialerId) const dialerPeerInfo = new PeerInfo(dialerId)
dialerPeerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/0') dialerPeerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/0')
const dialerNode = new Node({ const dialerNode = new Node({
peerInfo: dialerPeerInfo peerInfo: dialerPeerInfo
}) })
// Peer to Dial // Peer to Dial (the listener)
const listenerPeerInfo = new PeerInfo(ids[1]) const listenerPeerInfo = new PeerInfo(listenerId)
const listenerId = ids[1]
const listenerMultiaddr = '/ip4/127.0.0.1/tcp/10333/p2p/' + const listenerMultiaddr = '/ip4/127.0.0.1/tcp/10333/p2p/' +
listenerId.toB58String() listenerId.toB58String()
listenerPeerInfo.multiaddrs.add(listenerMultiaddr) listenerPeerInfo.multiaddrs.add(listenerMultiaddr)
dialerNode.start((err) => { // Start the dialer libp2p node
if (err) { throw err } await dialerNode.start()
console.log('Dialer ready, listening on:') console.log('Dialer ready, listening on:')
dialerPeerInfo.multiaddrs.forEach((ma) => console.log(ma.toString() + dialerPeerInfo.multiaddrs.forEach((ma) => console.log(ma.toString() +
'/p2p/' + dialerId.toB58String())) '/p2p/' + dialerId.toB58String()))
console.log('Dialing to peer:', listenerMultiaddr.toString()) // Dial the listener node
dialerNode.dialProtocol(listenerPeerInfo, '/echo/1.0.0', (err, conn) => { console.log('Dialing to peer:', listenerMultiaddr.toString())
if (err) { throw err } const { stream } = await dialerNode.dialProtocol(listenerPeerInfo, '/echo/1.0.0')
console.log('nodeA dialed to nodeB on protocol: /echo/1.0.0') console.log('nodeA dialed to nodeB on protocol: /echo/1.0.0')
pull( pipe(
pull.values(['hey']), // Source data
conn, ['hey'],
pull.collect((err, data) => { // Write to the stream, and pass its output to the next function
if (err) { throw err } stream,
console.log('received echo:', data.toString()) // Sink function
}) async function (source) {
) // For each chunk of data
}) for await (const data of source) {
}) // Output the data
}) console.log('received echo:', data.toString())
}
}
)
}
run()

View File

@ -1,41 +1,12 @@
'use strict' 'use strict'
const TCP = require('libp2p-tcp') const TCP = require('libp2p-tcp')
const MulticastDNS = require('libp2p-mdns')
const WS = require('libp2p-websockets') const WS = require('libp2p-websockets')
const Bootstrap = require('libp2p-bootstrap')
const spdy = require('libp2p-spdy')
const KadDHT = require('libp2p-kad-dht')
const mplex = require('libp2p-mplex') const mplex = require('libp2p-mplex')
const secio = require('libp2p-secio') const secio = require('libp2p-secio')
const defaultsDeep = require('@nodeutils/defaults-deep') const defaultsDeep = require('@nodeutils/defaults-deep')
const libp2p = require('../../..') 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 { class Node extends libp2p {
constructor (_options) { constructor (_options) {
const defaults = { const defaults = {
@ -44,29 +15,8 @@ class Node extends libp2p {
TCP, TCP,
WS WS
], ],
streamMuxer: getMuxers(_options.muxer), streamMuxer: [ mplex ],
connEncryption: [ secio ], connEncryption: [ secio ]
peerDiscovery: [
MulticastDNS,
Bootstrap
],
dht: KadDHT
},
config: {
peerDiscovery: {
mdns: {
interval: 10000,
enabled: false
},
bootstrap: {
interval: 10000,
enabled: false,
list: _options.bootstrapList
}
},
dht: {
kBucketSize: 20
}
} }
} }

View File

@ -8,39 +8,34 @@
const PeerId = require('peer-id') const PeerId = require('peer-id')
const PeerInfo = require('peer-info') const PeerInfo = require('peer-info')
const Node = require('./libp2p-bundle') const Node = require('./libp2p-bundle')
const pull = require('pull-stream') const pipe = require('it-pipe')
const series = require('async/series')
let listenerId async function run() {
let listenerNode const listenerId = await PeerId.createFromJSON(require('./id-l'))
series([ // Listener libp2p node
(cb) => { const listenerPeerInfo = new PeerInfo(listenerId)
PeerId.createFromJSON(require('./id-l'), (err, id) => { listenerPeerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/10333')
if (err) { return cb(err) } const listenerNode = new Node({
listenerId = id peerInfo: listenerPeerInfo
cb() })
})
},
(cb) => {
const listenerPeerInfo = new PeerInfo(listenerId)
listenerPeerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/10333')
listenerNode = new Node({
peerInfo: listenerPeerInfo
})
listenerNode.on('peer:connect', (peerInfo) => { // Log a message when we receive a connection
console.log('received dial to me from:', peerInfo.id.toB58String()) listenerNode.on('peer:connect', (peerInfo) => {
}) console.log('received dial to me from:', peerInfo.id.toB58String())
})
listenerNode.handle('/echo/1.0.0', (protocol, conn) => pull(conn, conn)) // Handle incoming connections for the protocol by piping from the stream
listenerNode.start(cb) // back to itself (an echo)
} await listenerNode.handle('/echo/1.0.0', ({ stream }) => pipe(stream.source, stream.sink))
], (err) => {
if (err) { throw err } // Start listening
await listenerNode.start()
console.log('Listener ready, listening on:') console.log('Listener ready, listening on:')
listenerNode.peerInfo.multiaddrs.forEach((ma) => { listenerNode.peerInfo.multiaddrs.forEach((ma) => {
console.log(ma.toString() + '/p2p/' + listenerId.toB58String()) console.log(ma.toString() + '/p2p/' + listenerId.toB58String())
}) })
}) }
run()