public async Task ConnectAsync(ISMTPImpostorHubClient client)
        {
            _clients.OnNext(_clients.Value.Add(client));
            await ListenAsync(client);

            _clients.OnNext(_clients.Value.Remove(client));
        }
        async Task ListenAsync(ISMTPImpostorHubClient client)
        {
            try
            {
                while (client.State == WebSocketState.Open)
                {
                    try
                    {
                        var data = await client.ReceiveAsync();

                        if (!string.IsNullOrWhiteSpace(data))
                        {
                            var message = Newtonsoft.Json.JsonConvert
                                          .DeserializeObject <SMTPImpostorHubMessage>(data);
                            _messages.OnNext(message);

                            try
                            {
                                var result = await _executor.ExecuteAsync(message.Type, message.Data);

                                if (result != null &&
                                    result != ActionNull.Instance)
                                {
                                    await client.SendAsync(
                                        _serialization.Serialize(
                                            CreateMessageFrom(result)
                                            ));
                                }
                            }
                            catch (Exception ex)
                            {
                                _logger.LogError(ex, $"Executor failed\n{data}");
                            }
                        }
                    }
                    catch (WebSocketException ex)
                    {
                        _logger.LogError(ex, "ListenAsync");
                    }
                }
            }
            catch (Exception ex)
            {
                if (client.State == WebSocketState.Open)
                {
                    _logger.LogError(ex, $"Could not receive message");
                    await client.CloseAsync();
                }
            }
        }