mirror of
https://github.com/fluencelabs/js-libp2p-secio
synced 2025-03-15 09:50:55 +00:00
148 lines
3.8 KiB
JavaScript
148 lines
3.8 KiB
JavaScript
/* eslint max-nested-callbacks: ["error", 8] */
|
|
/* eslint-env mocha */
|
|
'use strict'
|
|
|
|
const pair = require('pull-pair/duplex')
|
|
const chai = require('chai')
|
|
const dirtyChai = require('dirty-chai')
|
|
const expect = chai.expect
|
|
chai.use(dirtyChai)
|
|
const PeerId = require('peer-id')
|
|
const Connection = require('interface-connection').Connection
|
|
const parallel = require('async/parallel')
|
|
const series = require('async/series')
|
|
const Buffer = require('safe-buffer').Buffer
|
|
const ms = require('multistream-select')
|
|
const pull = require('pull-stream')
|
|
const Listener = ms.Listener
|
|
const Dialer = ms.Dialer
|
|
|
|
const secio = require('../src')
|
|
|
|
describe('secio', () => {
|
|
let peerA
|
|
let peerB
|
|
let peerC
|
|
|
|
before((done) => {
|
|
parallel([
|
|
(cb) => PeerId.createFromJSON(require('./fixtures/peer-a'), cb),
|
|
(cb) => PeerId.createFromJSON(require('./fixtures/peer-b'), cb),
|
|
(cb) => PeerId.createFromJSON(require('./fixtures/peer-c'), cb)
|
|
], (err, peers) => {
|
|
expect(err).to.not.exist()
|
|
peerA = peers[0]
|
|
peerB = peers[1]
|
|
peerC = peers[2]
|
|
done()
|
|
})
|
|
})
|
|
|
|
it('exports a secio multicodec', () => {
|
|
expect(secio.tag).to.equal('/secio/1.0.0')
|
|
})
|
|
|
|
it('upgrades a connection', (done) => {
|
|
const p = pair()
|
|
|
|
const aToB = secio.encrypt(peerA, new Connection(p[0]), peerB, (err) => expect(err).to.not.exist())
|
|
const bToA = secio.encrypt(peerB, new Connection(p[1]), peerA, (err) => expect(err).to.not.exist())
|
|
|
|
pull(
|
|
pull.values([Buffer.from('hello world')]),
|
|
aToB
|
|
)
|
|
|
|
pull(
|
|
bToA,
|
|
pull.collect((err, chunks) => {
|
|
expect(err).to.not.exist()
|
|
expect(chunks).to.eql([Buffer.from('hello world')])
|
|
done()
|
|
})
|
|
)
|
|
})
|
|
|
|
it('works over multistream-select', (done) => {
|
|
const p = pair()
|
|
|
|
const listener = new Listener()
|
|
const dialer = new Dialer()
|
|
|
|
series([
|
|
(cb) => parallel([
|
|
(cb) => listener.handle(p[0], cb),
|
|
(cb) => dialer.handle(p[1], cb)
|
|
], cb),
|
|
(cb) => {
|
|
listener.addHandler('/banana/1.0.0', (protocol, conn) => {
|
|
const bToA = secio.encrypt(peerB, conn, peerA, (err) => expect(err).to.not.exist())
|
|
|
|
pull(
|
|
bToA,
|
|
pull.collect((err, chunks) => {
|
|
expect(err).to.not.exist()
|
|
expect(chunks).to.eql([Buffer.from('hello world')])
|
|
done()
|
|
})
|
|
)
|
|
})
|
|
|
|
cb()
|
|
},
|
|
(cb) => dialer.select('/banana/1.0.0', (err, conn) => {
|
|
expect(err).to.not.exist()
|
|
|
|
const aToB = secio.encrypt(peerA, conn, peerB, (err) => expect(err).to.not.exist())
|
|
|
|
pull(
|
|
pull.values([Buffer.from('hello world')]),
|
|
aToB
|
|
)
|
|
cb()
|
|
})
|
|
])
|
|
})
|
|
|
|
it('establishes the connection even if the receiver does not know who is dialing', (done) => {
|
|
const p = pair()
|
|
|
|
const aToB = secio.encrypt(peerA, new Connection(p[0]), peerB, (err) => expect(err).to.not.exist())
|
|
const bToA = secio.encrypt(peerB, new Connection(p[1]), undefined, (err) => expect(err).to.not.exist())
|
|
|
|
pull(
|
|
pull.values([Buffer.from('hello world')]),
|
|
aToB
|
|
)
|
|
|
|
pull(
|
|
bToA,
|
|
pull.collect((err, chunks) => {
|
|
expect(err).to.not.exist()
|
|
|
|
expect(chunks).to.eql([Buffer.from('hello world')])
|
|
|
|
bToA.getPeerInfo((err, PeerInfo) => {
|
|
expect(err).to.not.exist()
|
|
expect(PeerInfo.id.toB58String()).to.equal(peerA.toB58String())
|
|
done()
|
|
})
|
|
})
|
|
)
|
|
})
|
|
|
|
it('fails if we dialed to the wrong peer', (done) => {
|
|
const p = pair()
|
|
let count = 0
|
|
|
|
function check (err) {
|
|
expect(err).to.exist()
|
|
if (++count === 2) { done() }
|
|
}
|
|
|
|
// we are using peerC Id on purpose to fail
|
|
secio.encrypt(peerA, new Connection(p[0]), peerC, check)
|
|
secio.encrypt(peerB, new Connection(p[1]), peerA, check)
|
|
})
|
|
})
|