code: function read(request, initExpected) {
  	var message, tokens;
  	tokens = protocol.explode(request);
  	if (tokens.length < 2) {
  		throw new Error('Message has an invalid number of tokens: ' + request);
  	}
  	message = {
  		id : tokens[0],
  	};
  
  	var isInitRequest = (dataMethods.DATA_INIT === tokens[1]);
  	if (! initExpected && isInitRequest) {
  		throw new Error("Unexpected late " + dataMethods.DATA_INIT + " message");
  	} else if (initExpected && ! isInitRequest) {
  		throw new Error("Unexpected message " + request + " while waiting for a " + dataMethods.DATA_INIT + " message");
  	}
  	if (! isInitRequest && tokens.length != 4) {
  		throw new Error('Message has an invalid number of tokens ' + request);
  	}
  
  	if (isInitRequest) {
  		var tail = tokens.slice(2);
  		message.verb = "init";
  		readInit(message, tail);
  	} else if (dataMethods.SUBSCRIBE === tokens[1]) {
  		message.verb = 'subscribe';
  		message.itemName = protocol.decodeString(tokens[3]);
  	} else if (dataMethods.UNSUBSCRIBE === tokens[1]) {
  		message.verb = 'unsubscribe';
  		message.itemName = protocol.decodeString(tokens[3]);
  	} else {
  		throw new Error('Message has an invalid method');
  	}
  	return message;
  }
docs: Decodes the message string from the server in an associative array.
  The data returned has the following form:
  {id: REQUEST_ID, verb: METHOD_NAME(subscribe|unsubscribe), itemName: ITEM_NAME}.
  
  @param {String} request the string message received from the remote proxy
  @param {Boolean} initExpected if we are waiting for the initial "init" message
  @return {Object} the decoded message
  @private