initialize ({ userAgent, boltAgent, authToken, notificationFilter, onError, onComplete } = {}) {
    const observer = new LoginObserver({
      onError: error => this._onLoginError(error, onError),
      onCompleted: metadata => {
        if (metadata.patch_bolt !== undefined) {
          this._applyPatches(metadata.patch_bolt)
        }
        return this._onLoginCompleted(metadata, authToken, onComplete)
      }
    })

    // passing notification filter on this protocol version throws an error
    assertNotificationFilterIsEmpty(notificationFilter, this._onProtocolError, observer)

    this.write(
      RequestMessage.hello(userAgent, authToken, this._serversideRouting, ['utc']),
      observer,
      true
    )

    return observer
  }
Initialize a connection with the server

@param {Object} args The params
@param {string} args.userAgent The user agent
@param {any} args.authToken The auth token
@param {NotificationFilter} args.notificationFilter The notification filter.
@param {function(error)} args.onError On error callback
@param {function(onComplte)} args.onComplete On complete callback
@returns {LoginObserver} The Login observer