private async Task Connect()
        {
            Logger.Information("Trying to connect to {endpoint}", endpoint);
            try
            {
                proto.DisposeSafe();
                var arp = new AlienReaderProtocol(keepAliveTimeout, receiveTimeout);
                await arp.ConnectAndLogin(endpoint.Host, endpoint.Port, login, password);

                if (usePolling)
                {
                    await arp.StartTagPolling(tags, errors, heartbeat);
                }
                else
                {
                    await arp.StartTagStreamOld(tags);
                }
                arp.Disconnected += (s, e) => ScheduleReconnect(true);
                if (!arp.IsConnected)
                {
                    ScheduleReconnect();
                }
                else
                {
                    proto = arp;
                    Logger.Swallow(() => connected.OnNext(true));
                }
            }
            catch (Exception ex)
            {
                Logger.Warning("Could not connect to {endpoint} {ex}", endpoint, ex);
                ScheduleReconnect();
                errors.OnNext(ex);
                Logger.Swallow(() => connected.OnNext(false));
            }

            try
            {
                if (proto.IsConnected)
                {
                    await onConnected(proto.Api);
                }
            }
            catch (Exception ex)
            {
                Logger.Warning(ex, "OnConnected handler failed {ex}");
                errors.OnNext(ex);
                Logger.Swallow(() => connected.OnNext(false));
            }
        }
        private async Task Connect()
        {
            Logger.Information("Trying to connect to {endpoint}", endpoint);
            try
            {
                proto?.Dispose();
                var arp = new AlienReaderProtocol(keepAliveTimeout, receiveTimeout);
                await arp.ConnectAndLogin(endpoint.Address.ToString(), endpoint.Port, "alien", "password");

                if (usePolling)
                {
                    await arp.StartTagPolling(tags);
                }
                else
                {
                    await arp.StartTagStreamOld(tags);
                }
                arp.Disconnected += (s, e) => ScheduleReconnect(true);
                if (!arp.IsConnected)
                {
                    ScheduleReconnect();
                }
                else
                {
                    proto = arp;
                    Logger.Swallow(() => connectionStatus.OnNext(new ConnectedEvent()));
                }
            }
            catch (Exception ex)
            {
                Logger.Warning("Could not connect to {endpoint} {ex}", endpoint, ex);
                ScheduleReconnect();
                Logger.Swallow(() => connectionStatus.OnNext(new FailedToConnect(ex)));
            }

            try
            {
                if (proto.IsConnected)
                {
                    await onConnected(proto.Api);
                }
            }
            catch (Exception ex)
            {
                Logger.Warning(ex, "OnConnected handler failed {ex}");
                Logger.Swallow(() => connectionStatus.OnNext(new FailedToConnect(ex)));
            }
        }