diff --git a/index.js b/index.js index 02265964b3..446b7ab34a 100644 --- a/index.js +++ b/index.js @@ -3,10 +3,20 @@ var net = require("net"), util = require("./lib/util").util, events = require("events"), - reply_parser = require("./lib/parser/javascript"), + reply_parser, default_port = 6379, default_host = "127.0.0.1"; +// Try to use hiredis for reply parsing and fall back on the Javascript-based +// reply parsing code when its not available. +try { + if (process.env["DISABLE_HIREDIS"]) + throw new Error(); // Fall back to the Javascript reply parsing code + reply_parser = require("./lib/parser/hiredis"); +} catch(err) { + reply_parser = require("./lib/parser/javascript"); +} + // can can set this to true to enable for all connections exports.debug_mode = false; diff --git a/lib/parser/hiredis.js b/lib/parser/hiredis.js new file mode 100644 index 0000000000..9a7709b4c0 --- /dev/null +++ b/lib/parser/hiredis.js @@ -0,0 +1,35 @@ +var events = require("events"), + util = require("../util").util, + hiredis = require("hiredis"); + +function HiredisReplyParser() { + this.reset(); + events.EventEmitter.call(this); +} + +util.inherits(HiredisReplyParser, events.EventEmitter); + +exports.Parser = HiredisReplyParser; +exports.debug_mode = false; +exports.type = "hiredis"; + +HiredisReplyParser.prototype.reset = function() { + this.reader = new hiredis.Reader({ return_buffers: true }); +} + +HiredisReplyParser.prototype.execute = function(data) { + var reply; + this.reader.feed(data); + try { + while ((reply = this.reader.get()) !== undefined) { + if (reply && reply.constructor == Error) { + this.emit("reply error", reply); + } else { + this.emit("reply", reply); + } + } + } catch(err) { + this.emit("error", err); + } +} +