2017-11-27 10:10:36 +01:00
|
|
|
/* eslint max-nested-callbacks: ["error", 8] */
|
|
|
|
/* eslint-env mocha */
|
|
|
|
'use strict'
|
|
|
|
|
|
|
|
const chai = require('chai')
|
|
|
|
chai.use(require('dirty-chai'))
|
|
|
|
const expect = chai.expect
|
|
|
|
const PeerInfo = require('peer-info')
|
|
|
|
const PeerId = require('peer-id')
|
2019-02-15 13:26:40 +01:00
|
|
|
const Mplex = require('pull-mplex')
|
2017-11-27 10:10:36 +01:00
|
|
|
const pull = require('pull-stream')
|
|
|
|
const parallel = require('async/parallel')
|
|
|
|
const goodbye = require('pull-goodbye')
|
|
|
|
const serializer = require('pull-serializer')
|
2019-02-14 17:07:13 +00:00
|
|
|
const wrtcSupport = self.RTCPeerConnection && ('createDataChannel' in self.RTCPeerConnection.prototype)
|
2018-02-07 08:22:03 +00:00
|
|
|
const tryEcho = require('./utils/try-echo')
|
2017-11-27 10:10:36 +01:00
|
|
|
|
2018-06-28 10:06:25 +02:00
|
|
|
const Node = require('./utils/bundle-browser')
|
2019-02-25 13:44:56 +01:00
|
|
|
const { getPeerRelay } = require('./utils/constants')
|
2017-11-27 10:10:36 +01:00
|
|
|
|
|
|
|
describe('transports', () => {
|
|
|
|
describe('websockets', () => {
|
|
|
|
let peerB
|
2019-02-25 13:44:56 +01:00
|
|
|
let peerBMultiaddr
|
2017-11-27 10:10:36 +01:00
|
|
|
let nodeA
|
|
|
|
|
|
|
|
before((done) => {
|
2019-02-25 13:44:56 +01:00
|
|
|
getPeerRelay((err, peerInfo) => {
|
2018-06-28 10:06:25 +02:00
|
|
|
expect(err).to.not.exist()
|
2019-02-25 13:44:56 +01:00
|
|
|
peerB = new PeerInfo(peerInfo.id)
|
|
|
|
peerBMultiaddr = `/ip4/127.0.0.1/tcp/9200/ws/p2p/${peerInfo.id.toB58String()}`
|
2018-06-28 10:06:25 +02:00
|
|
|
peerB.multiaddrs.add(peerBMultiaddr)
|
2017-11-27 10:10:36 +01:00
|
|
|
done()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
after((done) => nodeA.stop(done))
|
|
|
|
|
2018-06-28 10:06:25 +02:00
|
|
|
it('create a libp2p Node', (done) => {
|
2017-11-27 10:10:36 +01:00
|
|
|
PeerInfo.create((err, peerInfo) => {
|
|
|
|
expect(err).to.not.exist()
|
|
|
|
|
2018-06-28 10:06:25 +02:00
|
|
|
nodeA = new Node({
|
|
|
|
peerInfo: peerInfo
|
|
|
|
})
|
2017-11-27 10:10:36 +01:00
|
|
|
done()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2018-06-28 10:06:25 +02:00
|
|
|
it('create a libp2p Node with mplex only', (done) => {
|
2017-11-27 10:10:36 +01:00
|
|
|
PeerInfo.create((err, peerInfo) => {
|
|
|
|
expect(err).to.not.exist()
|
|
|
|
|
2018-06-28 10:06:25 +02:00
|
|
|
const b = new Node({
|
|
|
|
peerInfo: peerInfo,
|
|
|
|
modules: {
|
|
|
|
streamMuxer: [ Mplex ]
|
|
|
|
}
|
|
|
|
})
|
2019-02-15 13:26:40 +01:00
|
|
|
expect(b._modules.streamMuxer).to.eql([require('pull-mplex')])
|
2017-11-27 10:10:36 +01:00
|
|
|
done()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
it('start libp2pNode', (done) => {
|
|
|
|
nodeA.start(done)
|
|
|
|
})
|
|
|
|
|
|
|
|
// General connectivity tests
|
|
|
|
|
2018-02-07 08:22:03 +00:00
|
|
|
it('.dial using Multiaddr', (done) => {
|
2018-06-28 10:06:25 +02:00
|
|
|
nodeA.dial(peerBMultiaddr, (err) => {
|
2017-11-27 10:10:36 +01:00
|
|
|
expect(err).to.not.exist()
|
|
|
|
|
|
|
|
setTimeout(check, 500) // Some time for Identify to finish
|
|
|
|
|
|
|
|
function check () {
|
|
|
|
const peers = nodeA.peerBook.getAll()
|
|
|
|
expect(Object.keys(peers)).to.have.length(1)
|
|
|
|
done()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2018-02-07 08:22:03 +00:00
|
|
|
it('.dialProtocol using Multiaddr', (done) => {
|
2018-06-28 10:06:25 +02:00
|
|
|
nodeA.dialProtocol(peerBMultiaddr, '/echo/1.0.0', (err, conn) => {
|
2017-11-27 10:10:36 +01:00
|
|
|
expect(err).to.not.exist()
|
|
|
|
|
|
|
|
const peers = nodeA.peerBook.getAll()
|
|
|
|
expect(Object.keys(peers)).to.have.length(1)
|
|
|
|
|
2018-02-07 08:22:03 +00:00
|
|
|
tryEcho(conn, done)
|
2017-11-27 10:10:36 +01:00
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2018-02-07 08:22:03 +00:00
|
|
|
it('.hangUp using Multiaddr', (done) => {
|
2018-06-28 10:06:25 +02:00
|
|
|
nodeA.hangUp(peerBMultiaddr, (err) => {
|
2017-11-27 10:10:36 +01:00
|
|
|
expect(err).to.not.exist()
|
|
|
|
|
|
|
|
setTimeout(check, 500)
|
|
|
|
|
|
|
|
function check () {
|
|
|
|
const peers = nodeA.peerBook.getAll()
|
|
|
|
expect(Object.keys(peers)).to.have.length(1)
|
2018-12-14 17:54:32 +01:00
|
|
|
expect(nodeA._switch.connection.getAll()).to.have.length(0)
|
2017-11-27 10:10:36 +01:00
|
|
|
done()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2018-02-07 08:22:03 +00:00
|
|
|
it('.dial using PeerInfo', (done) => {
|
2017-11-27 10:10:36 +01:00
|
|
|
nodeA.dial(peerB, (err) => {
|
|
|
|
expect(err).to.not.exist()
|
|
|
|
|
|
|
|
setTimeout(check, 500) // Some time for Identify to finish
|
|
|
|
|
|
|
|
function check () {
|
|
|
|
const peers = nodeA.peerBook.getAll()
|
|
|
|
expect(Object.keys(peers)).to.have.length(1)
|
|
|
|
done()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2018-02-07 08:22:03 +00:00
|
|
|
it('.dialProtocol using PeerInfo', (done) => {
|
|
|
|
nodeA.dialProtocol(peerB, '/echo/1.0.0', (err, conn) => {
|
2017-11-27 10:10:36 +01:00
|
|
|
expect(err).to.not.exist()
|
|
|
|
const peers = nodeA.peerBook.getAll()
|
|
|
|
expect(err).to.not.exist()
|
|
|
|
expect(Object.keys(peers)).to.have.length(1)
|
|
|
|
|
2018-02-07 08:22:03 +00:00
|
|
|
tryEcho(conn, done)
|
2017-11-27 10:10:36 +01:00
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2018-02-07 08:22:03 +00:00
|
|
|
it('.hangUp using PeerInfo', (done) => {
|
2017-11-27 10:10:36 +01:00
|
|
|
nodeA.hangUp(peerB, (err) => {
|
|
|
|
expect(err).to.not.exist()
|
|
|
|
setTimeout(check, 500)
|
|
|
|
|
|
|
|
function check () {
|
|
|
|
const peers = nodeA.peerBook.getAll()
|
|
|
|
expect(err).to.not.exist()
|
|
|
|
expect(Object.keys(peers)).to.have.length(1)
|
2018-12-14 17:54:32 +01:00
|
|
|
expect(nodeA._switch.connection.getAll()).to.have.length(0)
|
2017-11-27 10:10:36 +01:00
|
|
|
done()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2018-10-19 17:37:34 +02:00
|
|
|
it('.dialFSM check conn and close', (done) => {
|
|
|
|
nodeA.dialFSM(peerB, (err, connFSM) => {
|
|
|
|
expect(err).to.not.exist()
|
|
|
|
|
|
|
|
connFSM.once('muxed', () => {
|
2018-12-14 17:54:32 +01:00
|
|
|
expect(
|
|
|
|
nodeA._switch.connection.getAllById(peerB.id.toB58String())
|
|
|
|
).to.have.length(1)
|
2018-10-19 17:37:34 +02:00
|
|
|
|
|
|
|
connFSM.once('error', done)
|
|
|
|
connFSM.once('close', () => {
|
|
|
|
// ensure the connection is closed
|
2018-12-14 17:54:32 +01:00
|
|
|
expect(
|
|
|
|
nodeA._switch.connection.getAllById(peerB.id.toB58String())
|
|
|
|
).to.have.length(0)
|
|
|
|
|
2018-10-19 17:37:34 +02:00
|
|
|
done()
|
|
|
|
})
|
|
|
|
|
|
|
|
connFSM.close()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
it('.dialFSM with a protocol, do an echo and close', (done) => {
|
|
|
|
nodeA.dialFSM(peerB, '/echo/1.0.0', (err, connFSM) => {
|
|
|
|
expect(err).to.not.exist()
|
|
|
|
connFSM.once('connection', (conn) => {
|
|
|
|
tryEcho(conn, () => {
|
|
|
|
connFSM.close()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
connFSM.once('error', done)
|
|
|
|
connFSM.once('close', done)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2017-11-27 10:10:36 +01:00
|
|
|
describe('stress', () => {
|
|
|
|
it('one big write', (done) => {
|
2018-02-07 08:22:03 +00:00
|
|
|
nodeA.dialProtocol(peerB, '/echo/1.0.0', (err, conn) => {
|
2017-11-27 10:10:36 +01:00
|
|
|
expect(err).to.not.exist()
|
|
|
|
const rawMessage = Buffer.alloc(100000)
|
|
|
|
rawMessage.fill('a')
|
|
|
|
|
|
|
|
const s = serializer(goodbye({
|
|
|
|
source: pull.values([rawMessage]),
|
|
|
|
sink: pull.collect((err, results) => {
|
|
|
|
expect(err).to.not.exist()
|
|
|
|
expect(results).to.have.length(1)
|
|
|
|
expect(Buffer.from(results[0])).to.have.length(rawMessage.length)
|
|
|
|
done()
|
|
|
|
})
|
|
|
|
}))
|
|
|
|
pull(s, conn, s)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2018-09-24 17:17:35 +02:00
|
|
|
it('many writes', function (done) {
|
|
|
|
this.timeout(10000)
|
|
|
|
|
2018-02-07 08:22:03 +00:00
|
|
|
nodeA.dialProtocol(peerB, '/echo/1.0.0', (err, conn) => {
|
2017-11-27 10:10:36 +01:00
|
|
|
expect(err).to.not.exist()
|
|
|
|
|
|
|
|
const s = serializer(goodbye({
|
|
|
|
source: pull(
|
|
|
|
pull.infinite(),
|
|
|
|
pull.take(1000),
|
|
|
|
pull.map((val) => Buffer.from(val.toString()))
|
|
|
|
),
|
|
|
|
sink: pull.collect((err, result) => {
|
|
|
|
expect(err).to.not.exist()
|
|
|
|
expect(result).to.have.length(1000)
|
|
|
|
done()
|
|
|
|
})
|
|
|
|
}))
|
|
|
|
|
|
|
|
pull(s, conn, s)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
describe('webrtc-star', () => {
|
2018-10-19 17:37:34 +02:00
|
|
|
/* eslint-disable-next-line no-console */
|
2019-02-14 17:07:13 +00:00
|
|
|
if (!wrtcSupport) { return console.log('NO WEBRTC SUPPORT') }
|
2017-11-27 10:10:36 +01:00
|
|
|
|
|
|
|
let peer1
|
|
|
|
let peer2
|
|
|
|
let node1
|
|
|
|
let node2
|
2018-09-24 16:57:31 +02:00
|
|
|
let node3
|
|
|
|
|
|
|
|
after((done) => {
|
|
|
|
parallel([
|
|
|
|
(cb) => node1.stop(cb),
|
|
|
|
(cb) => node2.stop(cb),
|
|
|
|
(cb) => node3.stop(cb)
|
|
|
|
], done)
|
|
|
|
})
|
2017-11-27 10:10:36 +01:00
|
|
|
|
|
|
|
it('create two peerInfo with webrtc-star addrs', (done) => {
|
|
|
|
parallel([
|
2018-06-28 10:06:25 +02:00
|
|
|
(cb) => PeerId.create({ bits: 512 }, cb),
|
|
|
|
(cb) => PeerId.create({ bits: 512 }, cb)
|
2017-11-27 10:10:36 +01:00
|
|
|
], (err, ids) => {
|
|
|
|
expect(err).to.not.exist()
|
|
|
|
|
|
|
|
peer1 = new PeerInfo(ids[0])
|
2019-02-06 04:59:42 +10:00
|
|
|
const ma1 = '/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star/p2p/' + ids[0].toB58String()
|
2017-11-27 10:10:36 +01:00
|
|
|
peer1.multiaddrs.add(ma1)
|
|
|
|
|
|
|
|
peer2 = new PeerInfo(ids[1])
|
2019-02-06 04:59:42 +10:00
|
|
|
const ma2 = '/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star/p2p/' + ids[1].toB58String()
|
2017-11-27 10:10:36 +01:00
|
|
|
peer2.multiaddrs.add(ma2)
|
|
|
|
|
|
|
|
done()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
it('create two libp2p nodes with those peers', (done) => {
|
2018-06-28 10:06:25 +02:00
|
|
|
node1 = new Node({
|
|
|
|
peerInfo: peer1
|
|
|
|
})
|
|
|
|
node2 = new Node({
|
|
|
|
peerInfo: peer2
|
|
|
|
})
|
2017-11-27 10:10:36 +01:00
|
|
|
done()
|
|
|
|
})
|
|
|
|
|
2018-02-07 08:22:03 +00:00
|
|
|
it('start two libp2p nodes', (done) => {
|
2017-11-27 10:10:36 +01:00
|
|
|
parallel([
|
|
|
|
(cb) => node1.start(cb),
|
|
|
|
(cb) => node2.start(cb)
|
|
|
|
], done)
|
|
|
|
})
|
|
|
|
|
2018-02-07 08:22:03 +00:00
|
|
|
it('.handle echo on first node', () => {
|
2017-11-27 10:10:36 +01:00
|
|
|
node2.handle('/echo/1.0.0', (protocol, conn) => pull(conn, conn))
|
|
|
|
})
|
|
|
|
|
2018-02-07 08:22:03 +00:00
|
|
|
it('.dialProtocol from the second node to the first node', (done) => {
|
|
|
|
node1.dialProtocol(peer2, '/echo/1.0.0', (err, conn) => {
|
2017-11-27 10:10:36 +01:00
|
|
|
expect(err).to.not.exist()
|
|
|
|
setTimeout(check, 500)
|
|
|
|
|
|
|
|
function check () {
|
|
|
|
const peers1 = node1.peerBook.getAll()
|
|
|
|
expect(Object.keys(peers1)).to.have.length(1)
|
|
|
|
|
|
|
|
const peers2 = node2.peerBook.getAll()
|
|
|
|
expect(Object.keys(peers2)).to.have.length(1)
|
|
|
|
|
2018-02-07 08:22:03 +00:00
|
|
|
tryEcho(conn, done)
|
2017-11-27 10:10:36 +01:00
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
it('node1 hangUp node2', (done) => {
|
|
|
|
node1.hangUp(peer2, (err) => {
|
|
|
|
expect(err).to.not.exist()
|
|
|
|
setTimeout(check, 500)
|
|
|
|
|
|
|
|
function check () {
|
|
|
|
const peers = node1.peerBook.getAll()
|
|
|
|
expect(Object.keys(peers)).to.have.length(1)
|
2018-12-14 17:54:32 +01:00
|
|
|
expect(node1._switch.connection.getAll()).to.have.length(0)
|
2017-11-27 10:10:36 +01:00
|
|
|
done()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2018-09-24 16:57:31 +02:00
|
|
|
it('create a third node and check that discovery works', (done) => {
|
|
|
|
PeerId.create({ bits: 512 }, (err, id3) => {
|
|
|
|
expect(err).to.not.exist()
|
2018-06-28 10:06:25 +02:00
|
|
|
|
2018-09-24 16:57:31 +02:00
|
|
|
const b58Id = id3.toB58String()
|
2017-11-27 10:10:36 +01:00
|
|
|
|
2018-09-24 16:57:31 +02:00
|
|
|
function check () {
|
|
|
|
// Verify both nodes are connected to node 3
|
2018-12-14 17:54:32 +01:00
|
|
|
if (node1._switch.connection.getAllById(b58Id) && node2._switch.connection.getAllById(b58Id)) {
|
2018-09-24 16:57:31 +02:00
|
|
|
done()
|
|
|
|
}
|
2017-11-27 10:10:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
const peer3 = new PeerInfo(id3)
|
2019-02-06 04:59:42 +10:00
|
|
|
const ma3 = '/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star/p2p/' + b58Id
|
2017-11-27 10:10:36 +01:00
|
|
|
peer3.multiaddrs.add(ma3)
|
|
|
|
|
|
|
|
node1.on('peer:discovery', (peerInfo) => node1.dial(peerInfo, check))
|
|
|
|
node2.on('peer:discovery', (peerInfo) => node2.dial(peerInfo, check))
|
|
|
|
|
2018-09-24 16:57:31 +02:00
|
|
|
node3 = new Node({
|
2018-06-28 10:06:25 +02:00
|
|
|
peerInfo: peer3
|
|
|
|
})
|
2017-11-27 10:10:36 +01:00
|
|
|
node3.start(check)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
describe('websocket-star', () => {
|
|
|
|
let peer1
|
|
|
|
let peer2
|
|
|
|
let node1
|
|
|
|
let node2
|
|
|
|
|
|
|
|
it('create two peerInfo with websocket-star addrs', (done) => {
|
|
|
|
parallel([
|
2018-06-28 10:06:25 +02:00
|
|
|
(cb) => PeerId.create({ bits: 512 }, cb),
|
|
|
|
(cb) => PeerId.create({ bits: 512 }, cb)
|
2017-11-27 10:10:36 +01:00
|
|
|
], (err, ids) => {
|
|
|
|
expect(err).to.not.exist()
|
|
|
|
|
|
|
|
peer1 = new PeerInfo(ids[0])
|
|
|
|
const ma1 = '/ip4/127.0.0.1/tcp/14444/ws/p2p-websocket-star/'
|
|
|
|
peer1.multiaddrs.add(ma1)
|
|
|
|
|
|
|
|
peer2 = new PeerInfo(ids[1])
|
|
|
|
const ma2 = '/ip4/127.0.0.1/tcp/14444/ws/p2p-websocket-star/'
|
|
|
|
peer2.multiaddrs.add(ma2)
|
|
|
|
|
|
|
|
done()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
it('create two libp2p nodes with those peers', (done) => {
|
2018-06-28 10:06:25 +02:00
|
|
|
node1 = new Node({
|
|
|
|
peerInfo: peer1
|
|
|
|
})
|
|
|
|
node2 = new Node({
|
|
|
|
peerInfo: peer2
|
|
|
|
})
|
2017-11-27 10:10:36 +01:00
|
|
|
done()
|
|
|
|
})
|
|
|
|
|
|
|
|
it('listen on the two libp2p nodes', (done) => {
|
|
|
|
parallel([
|
|
|
|
(cb) => node1.start(cb),
|
|
|
|
(cb) => node2.start(cb)
|
|
|
|
], done)
|
|
|
|
})
|
|
|
|
|
|
|
|
it('handle a protocol on the first node', () => {
|
|
|
|
node2.handle('/echo/1.0.0', (protocol, conn) => pull(conn, conn))
|
|
|
|
})
|
|
|
|
|
2018-02-07 08:22:03 +00:00
|
|
|
it('.dialProtocol from the second node to the first node', (done) => {
|
|
|
|
node1.dialProtocol(peer2, '/echo/1.0.0', (err, conn) => {
|
2017-11-27 10:10:36 +01:00
|
|
|
expect(err).to.not.exist()
|
|
|
|
setTimeout(check, 500)
|
|
|
|
|
|
|
|
function check () {
|
|
|
|
const peers1 = node1.peerBook.getAll()
|
|
|
|
expect(Object.keys(peers1)).to.have.length(1)
|
|
|
|
|
|
|
|
const peers2 = node2.peerBook.getAll()
|
|
|
|
expect(Object.keys(peers2)).to.have.length(1)
|
|
|
|
|
2018-02-07 08:22:03 +00:00
|
|
|
tryEcho(conn, done)
|
2017-11-27 10:10:36 +01:00
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
it('node1 hangUp node2', (done) => {
|
|
|
|
node1.hangUp(peer2, (err) => {
|
|
|
|
expect(err).to.not.exist()
|
|
|
|
setTimeout(check, 500)
|
|
|
|
|
|
|
|
function check () {
|
|
|
|
const peers = node1.peerBook.getAll()
|
|
|
|
expect(Object.keys(peers)).to.have.length(1)
|
2018-12-14 17:54:32 +01:00
|
|
|
expect(node1._switch.connection.getAll()).to.have.length(0)
|
2017-11-27 10:10:36 +01:00
|
|
|
done()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2018-06-28 10:06:25 +02:00
|
|
|
it('create a third node and check that discovery works', function (done) {
|
|
|
|
this.timeout(10 * 1000)
|
|
|
|
|
2017-11-27 10:10:36 +01:00
|
|
|
let counter = 0
|
|
|
|
|
|
|
|
function check () {
|
|
|
|
if (++counter === 3) {
|
2018-12-14 17:54:32 +01:00
|
|
|
expect(node1._switch.connection.getAll()).to.have.length(1)
|
|
|
|
expect(node2._switch.connection.getAll()).to.have.length(1)
|
2017-11-27 10:10:36 +01:00
|
|
|
done()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
PeerId.create((err, id3) => {
|
|
|
|
expect(err).to.not.exist()
|
|
|
|
|
|
|
|
const peer3 = new PeerInfo(id3)
|
2019-02-06 04:59:42 +10:00
|
|
|
const ma3 = '/ip4/127.0.0.1/tcp/14444/ws/p2p-websocket-star/p2p/' + id3.toB58String()
|
2017-11-27 10:10:36 +01:00
|
|
|
peer3.multiaddrs.add(ma3)
|
|
|
|
|
|
|
|
node1.on('peer:discovery', (peerInfo) => node1.dial(peerInfo, check))
|
|
|
|
node2.on('peer:discovery', (peerInfo) => node2.dial(peerInfo, check))
|
|
|
|
|
2018-06-28 10:06:25 +02:00
|
|
|
const node3 = new Node({
|
|
|
|
peerInfo: peer3
|
|
|
|
})
|
2017-11-27 10:10:36 +01:00
|
|
|
node3.start(check)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|