bugger-v8-client
Version:
Client for v8 debug protocol
95 lines (70 loc) • 2.03 kB
JavaScript
;
var util = require('util');
var Duplex = require('readable-stream').Duplex;
var Promise = require('bluebird');
var debug = require('debug')('bugger-v8-client:rpc');
var createEvent = require('../events');
function RPCStream() {
if (!this instanceof RPCStream)
return new RPCStream();
Duplex.call(this, { objectMode: true });
this._lastSequence = 0;
this._pending = {};
}
util.inherits(RPCStream, Duplex);
RPCStream.prototype.execCommand = function(command, args) {
var seq = ++this._lastSequence;
var obj = {
seq: seq,
type: 'request',
command: command,
arguments: args
};
debug('[%s] request %j', seq, command);
var resolver = this._pending[seq] = Promise.defer();
resolver.requestArguments = args;
this.push(obj);
this.emit('readable');
return resolver.promise;
};
RPCStream.prototype._processEventMessage = function(raw) {
var event = createEvent(raw);
this.emit(raw.event, event);
this.emit('event', event);
};
RPCStream.prototype._processResponseMessage = function(raw) {
/*jshint camelcase:false */
var seq = raw.request_seq;
debug('[%s] response %j', seq, raw.command);
var resolver = this._pending[seq];
delete this._pending[seq];
if (typeof resolver !== 'undefined') {
if (!raw.success) {
var err = new Error(raw.message);
err.args = resolver.requestArguments;
resolver.reject(err);
} else {
resolver.resolve(raw);
}
}
};
// Messages coming from the ParseStream
RPCStream.prototype._write = function (raw, encoding, done) {
/*jslint unparam: true*/
this.emit('incomingMessage', raw);
switch (raw.type) {
case 'event':
this._processEventMessage(raw);
break;
case 'response':
this._processResponseMessage(raw);
break;
}
done();
};
// Messages going out to the SerializeStream
RPCStream.prototype._read = function () {
// This is ignored, we will always use push when someone tries
// to send a new message
};
module.exports = RPCStream;