| '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 |