internal SignalRClientConnection(HubConnection connection, IHubProxy hub)
        {
            if (connection == null)
            {
                throw new ArgumentNullException(nameof(connection));
            }
            if (hub == null)
            {
                throw new ArgumentNullException(nameof(hub));
            }
            _connection       = connection;
            _hub              = hub;
            _subject          = new Subject <IClientEvent>();
            Events            = _subject.AsObservable();
            _sender           = new SignalRSender(hub, connection, new Metadata());
            connection.Error += OnConnectionError;
            var disposables = new List <IDisposable>
            {
                hub.On <MessageEnvelope>("OnNext", e => _subject.OnNext((IClientEvent)e.Payload)),
                hub.On <Exception>("OnError", _subject.OnError),
                hub.On("OnCompleted", _subject.OnCompleted),
                connection
            };

            _disposable = new CompositeDisposable(disposables);
        }
        public Task <LoginResult> Authenticate(string accessToken)
        {
            if (string.IsNullOrEmpty(accessToken))
            {
                throw new ArgumentException("Access token cannot be null or empty.", nameof(accessToken));
            }
            EnsureIsNotDisposed();
            var token  = new JwtSecurityToken(accessToken);
            var userId = Guid.Parse(token.Subject);
            var meta   = new Metadata
            {
                AccessToken = accessToken
            };
            var sender = new SignalRSender(_hub, _connection, meta);
            var result = new LoginResult(new UserProxy(sender), userId, accessToken);

            return(Task.FromResult(result));
        }