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();
                }
            }
        }
        async Task ISMTPImpostorHostSettingsStore
        .SaveAsync(IEnumerable <SMTPImpostorHostSettings> value)
        {
            var json = _serialization.Serialize(value);

            if (_cancel != null)
            {
                _cancel.Cancel();
            }
            _cancel = new CancellationTokenSource();

            try
            {
                await Task.Delay(500, _cancel.Token);

                await Delegates.RetryAsync(
                    async() => await File.WriteAllTextAsync(FilePath, json),
                    _logger);
            }
            catch (TaskCanceledException) { }

            _cancel = null;
        }