Skip to content

Commit

Permalink
fix: upgrader should not need muxers
Browse files Browse the repository at this point in the history
  • Loading branch information
vasco-santos committed Dec 13, 2019
1 parent a39889c commit 45c2760
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 9 deletions.
50 changes: 41 additions & 9 deletions src/upgrader.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class Upgrader {
async upgradeInbound (maConn) {
let encryptedConn
let remotePeer
let muxedConnection
let upgradedConn
let Muxer
let cryptoProtocol
let setPeer
Expand Down Expand Up @@ -94,7 +94,11 @@ class Upgrader {
} = await this._encryptInbound(this.localPeer, protectedConn, this.cryptos))

// Multiplex the connection
;({ stream: muxedConnection, Muxer } = await this._multiplexInbound(encryptedConn, this.muxers))
if (this.muxers.size) {
;({ stream: upgradedConn, Muxer } = await this._multiplexInbound(encryptedConn, this.muxers))
} else {
upgradedConn = encryptedConn
}
} catch (err) {
log.error('Failed to upgrade inbound connection', err)
await maConn.close(err)
Expand All @@ -113,7 +117,7 @@ class Upgrader {
cryptoProtocol,
direction: 'inbound',
maConn,
muxedConnection,
upgradedConn,
Muxer,
remotePeer
})
Expand All @@ -135,7 +139,7 @@ class Upgrader {

let encryptedConn
let remotePeer
let muxedConnection
let upgradedConn
let cryptoProtocol
let Muxer
let setPeer
Expand Down Expand Up @@ -165,7 +169,11 @@ class Upgrader {
} = await this._encryptOutbound(this.localPeer, protectedConn, remotePeerId, this.cryptos))

// Multiplex the connection
;({ stream: muxedConnection, Muxer } = await this._multiplexOutbound(encryptedConn, this.muxers))
if (this.muxers.size) {
;({ stream: upgradedConn, Muxer } = await this._multiplexOutbound(encryptedConn, this.muxers))
} else {
upgradedConn = encryptedConn
}
} catch (err) {
log.error('Failed to upgrade outbound connection', err)
await maConn.close(err)
Expand All @@ -183,7 +191,7 @@ class Upgrader {
cryptoProtocol,
direction: 'outbound',
maConn,
muxedConnection,
upgradedConn,
Muxer,
remotePeer
})
Expand All @@ -196,7 +204,7 @@ class Upgrader {
* @param {string} cryptoProtocol The crypto protocol that was negotiated
* @param {string} direction One of ['inbound', 'outbound']
* @param {MultiaddrConnection} maConn The transport layer connection
* @param {*} muxedConnection A duplex connection returned from multiplexer selection
* @param {*} upgradedConn A duplex connection returned from multiplexer selection
* @param {Muxer} Muxer The muxer to be used for muxing
* @param {PeerId} remotePeer The peer the connection is with
* @returns {Connection}
Expand All @@ -205,10 +213,34 @@ class Upgrader {
cryptoProtocol,
direction,
maConn,
muxedConnection,
upgradedConn,
Muxer,
remotePeer
}) {
if (!Muxer) {
// Create the connection
maConn.timeline.upgraded = Date.now()

const connection = new Connection({
localAddr: maConn.localAddr,
remoteAddr: maConn.remoteAddr,
localPeer: this.localPeer,
remotePeer: remotePeer,
stat: {
direction,
timeline: maConn.timeline,
encryption: cryptoProtocol
},
newStream : () => { throw new Error('connection is not multiplexed') },
getStreams: () => { throw new Error('connection is not multiplexed') },
close: err => maConn.close(err)
})

this.onConnection(connection)

return connection
}

// Create the muxer
const muxer = new Muxer({
// Run anytime a remote stream is created
Expand Down Expand Up @@ -245,7 +277,7 @@ class Upgrader {
}

// Pipe all data through the muxer
pipe(muxedConnection, muxer, muxedConnection)
pipe(upgradedConn, muxer, upgradedConn)

maConn.timeline.upgraded = Date.now()
const timelineProxy = new Proxy(maConn.timeline, {
Expand Down
20 changes: 20 additions & 0 deletions test/upgrading/upgrader.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,26 @@ describe('Upgrader', () => {
expect(result).to.eql([hello])
})

it('should upgrade with only crypto', async () => {
const { inbound, outbound } = mockMultiaddrConnPair({ addrs, remotePeer })

// No available muxers
const muxers = new Map()
sinon.stub(localUpgrader, 'muxers').value(muxers)
sinon.stub(remoteUpgrader, 'muxers').value(muxers)

const cryptos = new Map([[Crypto.protocol, Crypto]])
sinon.stub(localUpgrader, 'cryptos').value(cryptos)
sinon.stub(remoteUpgrader, 'cryptos').value(cryptos)

const connections = await Promise.all([
localUpgrader.upgradeOutbound(outbound),
remoteUpgrader.upgradeInbound(inbound)
])

expect(connections).to.have.length(2)
})

it('should use a private connection protector when provided', async () => {
const { inbound, outbound } = mockMultiaddrConnPair({ addrs, remotePeer })

Expand Down

0 comments on commit 45c2760

Please sign in to comment.