@hyperswarm/secret-stream
Version:
Secret stream backed by Noise and libsodium's secretstream
77 lines (62 loc) • 1.28 kB
JavaScript
const { Duplex, Writable } = require('streamx')
class ReversePassThrough extends Duplex {
constructor (s) {
super()
this._stream = s
this._ondrain = null
}
_write (data, cb) {
if (this._stream.push(data) === false) {
this._stream._ondrain = cb
} else {
cb(null)
}
}
_final (cb) {
this._stream.push(null)
cb(null)
}
_read (cb) {
const ondrain = this._ondrain
this._ondrain = null
if (ondrain) ondrain()
cb(null)
}
}
module.exports = class Bridge extends Duplex {
constructor (noiseStream) {
super()
this.noiseStream = noiseStream
this._ondrain = null
this.reverse = new ReversePassThrough(this)
}
get publicKey () {
return this.noiseStream.publicKey
}
get remotePublicKey () {
return this.noiseStream.remotePublicKey
}
get handshakeHash () {
return this.noiseStream.handshakeHash
}
flush () {
return Writable.drained(this)
}
_read (cb) {
const ondrain = this._ondrain
this._ondrain = null
if (ondrain) ondrain()
cb(null)
}
_write (data, cb) {
if (this.reverse.push(data) === false) {
this.reverse._ondrain = cb
} else {
cb(null)
}
}
_final (cb) {
this.reverse.push(null)
cb(null)
}
}