blob: b6e127847aeada9e9009cfd61e3e6d30835635d0 [file] [log] [blame]
(function() {
var Api, Client, Command, Multi, Parser, Queue, Reply,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
Api = require('./api');
Command = require('./command');
Reply = require('./reply');
Queue = require('./queue');
Multi = require('./multi');
Parser = require('./parser');
Client = (function(_super) {
__extends(Client, _super);
function Client() {
this.commandQueue = new Queue;
this.parser = new Parser;
this.stream = null;
}
Client.prototype._hook = function() {
var _this = this;
this.stream.on('data', function(data) {
return _this.parser.parse(data);
});
this.stream.on('error', function(err) {
return _this.emit('error', err);
});
this.stream.on('end', function() {
return _this.emit('end');
});
this.stream.on('finish', function() {
return _this.emit('finish');
});
this.parser.on('reply', function(reply) {
return _this._consume(reply);
});
this.parser.on('error', function(err) {
return _this.emit('error', err);
});
};
Client.prototype._consume = function(reply) {
var command;
if (command = this.commandQueue.dequeue()) {
if (reply.isError()) {
command.callback(reply.toError(), null, command.command);
} else {
command.callback(null, reply.value, command.command);
}
} else {
throw new Error("Command queue depleted, but replies still coming in");
}
};
Client.prototype.connect = function(stream) {
this.stream = stream;
this._hook();
return this;
};
Client.prototype.end = function() {
this.stream.end();
return this;
};
Client.prototype.send = function(commands, callback) {
var command, _i, _len;
if (Array.isArray(commands)) {
for (_i = 0, _len = commands.length; _i < _len; _i++) {
command = commands[_i];
this.commandQueue.enqueue(new Command(command, callback));
}
this.stream.write("" + (commands.join('\n')) + "\n");
} else {
this.commandQueue.enqueue(new Command(commands, callback));
this.stream.write("" + commands + "\n");
}
return this;
};
Client.prototype.multi = function() {
return new Multi(this);
};
return Client;
})(Api);
module.exports = Client;
}).call(this);