99 lines
2.7 KiB
JavaScript
99 lines
2.7 KiB
JavaScript
(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);
|