_readMessage() {
		if (!this._messageLength) {
			// We are not in the middle of a message, so the next thing on the wire should be a header
			let header = this.stream.read(8);
			if (!header) {
				return; // maybe we should tear down the connection here
			}

			this._messageLength = header.readUInt32LE(0);
			if (header.slice(4).toString('ascii') != MAGIC) {
				// We definitely need to tear down the connection here
				this._fatal(new Error('Connection out of sync'));
				return;
			}
		}

		if (!this.stream) {
			this._debug('Tried to read message, but there is no stream');
			return;
		}

		let message;
		try {
			message = this.stream.read(this._messageLength);
		} catch (error) {
			this._debug('Error reading from socket: ' + error.message);
			this._fatal(error);
			return;
		}

		if (!message) {
			this._debug('Got incomplete message; expecting ' + this._messageLength + ' more bytes');
			return;
		}

		delete this._messageLength;
		if (this.sessionKey) {
			try {
				message = SteamCrypto.symmetricDecrypt(message, this.sessionKey, true);
			} catch (ex) {
				this._fatal(new Error('Encrypted message authentication failed'));
				return;
			}
		}

		// noinspection JSAccessibilityCheck
		this.user._handleNetMessage(message, this);
		this._readMessage();
	}
Try to read a message from the socket
@private