| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | (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);
 |