You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.1 KiB
50 lines
1.1 KiB
9 years ago
|
const Duplex = require('readable-stream').Duplex
|
||
|
const inherits = require('util').inherits
|
||
|
|
||
|
module.exports = StreamProvider
|
||
|
|
||
|
|
||
|
inherits(StreamProvider, Duplex)
|
||
|
|
||
|
function StreamProvider(){
|
||
|
Duplex.call(this, {
|
||
|
objectMode: true,
|
||
|
})
|
||
|
|
||
|
this._handlers = {}
|
||
|
}
|
||
|
|
||
|
// public
|
||
|
|
||
|
StreamProvider.prototype.send = function(payload){
|
||
|
throw new Error('StreamProvider - does not support synchronous RPC calls')
|
||
|
}
|
||
|
|
||
|
StreamProvider.prototype.sendAsync = function(payload, callback){
|
||
|
// console.log('StreamProvider - sending payload', payload)
|
||
|
this._handlers[payload.id] = callback
|
||
|
this.push(payload)
|
||
|
}
|
||
|
|
||
|
// private
|
||
|
|
||
|
StreamProvider.prototype._onResponse = function(payload){
|
||
|
// console.log('StreamProvider - got response', payload)
|
||
|
var callback = this._handlers[payload.id]
|
||
|
if (!callback) throw new Error('StreamProvider - Unknown response id')
|
||
|
delete this._handlers[payload.id]
|
||
|
callback(null, payload)
|
||
|
}
|
||
|
|
||
|
// stream plumbing
|
||
|
|
||
|
StreamProvider.prototype._read = noop
|
||
|
|
||
|
StreamProvider.prototype._write = function(msg, encoding, cb){
|
||
|
this._onResponse(msg)
|
||
|
cb()
|
||
|
}
|
||
|
|
||
|
// util
|
||
|
|
||
|
function noop(){}
|