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(); } } }