_handleConnectionClose(conn) {
		let connPrefix = conn.connectionType[0] + conn.connectionId;

		// If the message queue is currently enabled, we need to enqueue processing of the connection close.
		// Otherwise we might handle the closed connection too early, e.g. before processing ClientLogOnResponse
		if (this._useMessageQueue) {
			this.emit('debug', `[${connPrefix}] Connection closed, but message queue is active. Enqueueing __CLOSE__`);
			this._incomingMessageQueue.push(['__CLOSE__', conn]);
			return;
		}

		this.emit('debug', `[${connPrefix}] Handling connection close`);
		if (this._loggingOff) {
			// We want to bail, so call _handleLogOff now (normally it's called at the end)
			this._handleLogOff(EResult.NoConnection, 'Logged off');
			return;
		}

		this._cleanupClosedConnection();

		if (!this.steamID) {
			// connection closed while connecting; reconnect

			if (this._lastChosenCM) {
				// Blacklist this CM from subsequent connection attempts
				this._ttlCache.add(`CM_DQ_${this._lastChosenCM.type}_${this._lastChosenCM.endpoint}`, 1, 1000 * 60 * 2);
			}

			// We save this timeout reference because it's possible that we handle connection close before we fully handle
			// a logon response. In that case, we'll cancel this timeout when we handle the logon response.
			// This isn't an issue in the reverse case, since a handled logon response will tear down the connection and
			// remove all listeners.
			this._reconnectForCloseDuringAuthTimeout = setTimeout(() => this._doConnection(), 1000);
		} else {
			// connection closed while we were connected; fire logoff
			this._handleLogOff(EResult.NoConnection, 'NoConnection');
		}
	}
Handle the closure of our underlying connection.
@param {BaseConnection} conn
@protected