async connect (userAgent, boltAgent, authToken, waitReAuth) {
    if (this._protocol.initialized && !this._protocol.supportsReAuth) {
      throw newError('Connection does not support re-auth')
    }

    this._authToken = authToken

    if (!this._protocol.initialized) {
      return await this._initialize(userAgent, boltAgent, authToken)
    }

    if (waitReAuth) {
      return await new Promise((resolve, reject) => {
        this._protocol.logoff({
          onError: reject
        })

        this._protocol.logon({
          authToken,
          onError: reject,
          onComplete: () => resolve(this),
          flush: true
        })
      })
    }

    this._protocol.logoff()
    this._protocol.logon({ authToken, flush: true })

    return this
  }
Send initialization message.
@param {string} userAgent the user agent for this driver.
@param {Object} boltAgent the bolt agent for this driver.
@param {Object} authToken the object containing auth information.
@param {boolean} waitReAuth whether ot not the connection will wait for re-authentication to happen
@return {Promise<Connection>} promise resolved with the current connection if connection is successful. Rejected promise otherwise.