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.
62 lines
1.5 KiB
62 lines
1.5 KiB
'use strict' |
|
|
|
var hiredis = require('hiredis') |
|
var ReplyError = require('../lib/replyError') |
|
var ParserError = require('../lib/parserError') |
|
|
|
/** |
|
* Parse data |
|
* @param parser |
|
* @returns {*} |
|
*/ |
|
function parseData (parser, data) { |
|
try { |
|
return parser.reader.get() |
|
} catch (err) { |
|
// Protocol errors land here |
|
// Reset the parser. Otherwise new commands can't be processed properly |
|
parser.reader = new hiredis.Reader(parser.options) |
|
parser.returnFatalError(new ParserError(err.message, JSON.stringify(data), -1)) |
|
} |
|
} |
|
|
|
/** |
|
* Hiredis Parser |
|
* @param options |
|
* @constructor |
|
*/ |
|
function HiredisReplyParser (options) { |
|
this.returnError = options.returnError |
|
this.returnFatalError = options.returnFatalError || options.returnError |
|
this.returnReply = options.returnReply |
|
this.name = 'hiredis' |
|
this.options = { |
|
return_buffers: !!options.returnBuffers |
|
} |
|
this.reader = new hiredis.Reader(this.options) |
|
} |
|
|
|
HiredisReplyParser.prototype.execute = function (data) { |
|
this.reader.feed(data) |
|
var reply = parseData(this, data) |
|
|
|
while (reply !== undefined) { |
|
if (reply && reply.name === 'Error') { |
|
this.returnError(new ReplyError(reply.message)) |
|
} else { |
|
this.returnReply(reply) |
|
} |
|
reply = parseData(this, data) |
|
} |
|
} |
|
|
|
/** |
|
* Reset the parser values to the initial state |
|
* |
|
* @returns {undefined} |
|
*/ |
|
HiredisReplyParser.prototype.reset = function () { |
|
this.reader = new hiredis.Reader(this.options) |
|
} |
|
|
|
module.exports = HiredisReplyParser
|
|
|