_initialize (userAgent, boltAgent, authToken) {
    const self = this
    return new Promise((resolve, reject) => {
      this._protocol.initialize({
        userAgent,
        boltAgent,
        authToken,
        notificationFilter: this._notificationFilter,
        onError: err => reject(err),
        onComplete: metadata => {
          if (metadata) {
            // read server version from the response metadata, if it is available
            const serverVersion = metadata.server
            if (!this.version || serverVersion) {
              this.version = serverVersion
            }

            // read database connection id from the response metadata, if it is available
            const dbConnectionId = metadata.connection_id
            if (!this.databaseId) {
              this.databaseId = dbConnectionId
            }

            if (metadata.hints) {
              const receiveTimeoutRaw =
                metadata.hints['connection.recv_timeout_seconds']
              if (
                receiveTimeoutRaw !== null &&
                receiveTimeoutRaw !== undefined
              ) {
                const receiveTimeoutInSeconds = toNumber(receiveTimeoutRaw)
                if (
                  Number.isInteger(receiveTimeoutInSeconds) &&
                  receiveTimeoutInSeconds > 0
                ) {
                  this._ch.setupReceiveTimeout(receiveTimeoutInSeconds * 1000)
                } else {
                  this._log.info(
                    `Server located at ${this._address} supplied an invalid connection receive timeout value (${receiveTimeoutInSeconds}). ` +
                      'Please, verify the server configuration and status because this can be the symptom of a bigger issue.'
                  )
                }
              }

              const telemetryEnabledHint = metadata.hints['telemetry.enabled']
              if (telemetryEnabledHint === true) {
                this._telemetryDisabledConnection = false
              }
              this.SSREnabledHint = metadata.hints['ssr.enabled']
            }
            this._ssrCallback(this.SSREnabledHint ?? false, 'OPEN')
          }
          resolve(self)
        }
      })
    })
  }
Perform protocol-specific initialization which includes authentication.
@param {string} userAgent the user agent for this driver.
@param {string} boltAgent the bolt agent for this driver.
@param {Object} authToken the object containing auth information.
@return {Promise<Connection>} promise resolved with the current connection if initialization is successful. Rejected promise otherwise.