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

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

    this.write(RequestMessage.init(userAgent, authToken), observer, true)

    return observer
  }
Perform initialization and authentication of the underlying connection.
@param {Object} param
@param {string} param.userAgent the user agent.
@param {Object} param.authToken the authentication token.
@param {NotificationFilter} param.notificationFilter the notification filter.
@param {function(err: Error)} param.onError the callback to invoke on error.
@param {function()} param.onComplete the callback to invoke on completion.
@returns {StreamObserver} the stream observer that monitors the corresponding server response.