(function() { var PROTOCOL_6, PROTOCOL_7, Parser, ProtocolError, indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; exports.PROTOCOL_6 = PROTOCOL_6 = 'http://livereload.com/protocols/official-6'; exports.PROTOCOL_7 = PROTOCOL_7 = 'http://livereload.com/protocols/official-7'; exports.ProtocolError = ProtocolError = (function() { function ProtocolError(reason, data) { this.message = "LiveReload protocol error (" + reason + ") after receiving data: \"" + data + "\"."; } return ProtocolError; })(); exports.Parser = Parser = (function() { function Parser(handlers) { this.handlers = handlers; this.reset(); } Parser.prototype.reset = function() { return this.protocol = null; }; Parser.prototype.process = function(data) { var command, e, error, message, options, ref; try { if (this.protocol == null) { if (data.match(/^!!ver:([\d.]+)$/)) { this.protocol = 6; } else if (message = this._parseMessage(data, ['hello'])) { if (!message.protocols.length) { throw new ProtocolError("no protocols specified in handshake message"); } else if (indexOf.call(message.protocols, PROTOCOL_7) >= 0) { this.protocol = 7; } else if (indexOf.call(message.protocols, PROTOCOL_6) >= 0) { this.protocol = 6; } else { throw new ProtocolError("no supported protocols found"); } } return this.handlers.connected(this.protocol); } else if (this.protocol === 6) { message = JSON.parse(data); if (!message.length) { throw new ProtocolError("protocol 6 messages must be arrays"); } command = message[0], options = message[1]; if (command !== 'refresh') { throw new ProtocolError("unknown protocol 6 command"); } return this.handlers.message({ command: 'reload', path: options.path, liveCSS: (ref = options.apply_css_live) != null ? ref : true }); } else { message = this._parseMessage(data, ['reload', 'alert']); return this.handlers.message(message); } } catch (error) { e = error; if (e instanceof ProtocolError) { return this.handlers.error(e); } else { throw e; } } }; Parser.prototype._parseMessage = function(data, validCommands) { var e, error, message, ref; try { message = JSON.parse(data); } catch (error) { e = error; throw new ProtocolError('unparsable JSON', data); } if (!message.command) { throw new ProtocolError('missing "command" key', data); } if (ref = message.command, indexOf.call(validCommands, ref) < 0) { throw new ProtocolError("invalid command '" + message.command + "', only valid commands are: " + (validCommands.join(', ')) + ")", data); } return message; }; return Parser; })(); }).call(this);