< Summary

Information
Class: NostrSure.Infrastructure.Client.Implementation.WebSocketConnection
Assembly: NostrSure.Infrastructure
File(s): /home/runner/work/NostrSure/NostrSure/NostrSure.Infrastructure/Client/Implementation/WebSocketConnection.cs
Line coverage
93%
Covered lines: 46
Uncovered lines: 3
Coverable lines: 49
Total lines: 101
Line coverage: 93.8%
Branch coverage
53%
Covered branches: 14
Total branches: 26
Branch coverage: 53.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)50%1010100%
get_State()100%11100%
add_MessageReceived(...)100%11100%
remove_MessageReceived(...)100%210%
add_ErrorOccurred(...)100%11100%
remove_ErrorOccurred(...)100%210%
add_Disconnected(...)100%11100%
remove_Disconnected(...)100%210%
ConnectAsync()50%44100%
SendAsync(...)100%11100%
ReceiveAsync(...)100%11100%
CloseAsync()50%44100%
Dispose()62.5%88100%

File(s)

/home/runner/work/NostrSure/NostrSure/NostrSure.Infrastructure/Client/Implementation/WebSocketConnection.cs

#LineLine coverage
 1using Microsoft.Extensions.Logging;
 2using NostrSure.Infrastructure.Client.Abstractions;
 3using System.Net.WebSockets;
 4
 5namespace NostrSure.Infrastructure.Client.Implementation;
 6
 7/// <summary>
 8/// Refactored WebSocket connection implementation using the façade pattern with SOLID principles
 9/// </summary>
 10public sealed class WebSocketConnection : IWebSocketConnection
 11{
 12    private readonly IConnectionManager _connectionManager;
 13    private readonly IMessageReceiver _messageReceiver;
 14    private readonly IMessageSender _messageSender;
 15    private readonly IConnectionErrorHandler _errorHandler;
 16    private readonly IConnectionStateManager _stateManager;
 17    private readonly ILogger<WebSocketConnection>? _logger;
 18    private bool _disposed;
 19
 220    public WebSocketConnection(
 221        IConnectionManager connectionManager,
 222        IMessageReceiver messageReceiver,
 223        IMessageSender messageSender,
 224        IConnectionErrorHandler errorHandler,
 225        IConnectionStateManager stateManager,
 226        ILogger<WebSocketConnection>? logger = null)
 227    {
 228        _connectionManager = connectionManager ?? throw new ArgumentNullException(nameof(connectionManager));
 229        _messageReceiver = messageReceiver ?? throw new ArgumentNullException(nameof(messageReceiver));
 230        _messageSender = messageSender ?? throw new ArgumentNullException(nameof(messageSender));
 231        _errorHandler = errorHandler ?? throw new ArgumentNullException(nameof(errorHandler));
 232        _stateManager = stateManager ?? throw new ArgumentNullException(nameof(stateManager));
 233        _logger = logger;
 234    }
 35
 236    public WebSocketState State => _stateManager.CurrentState;
 37
 38    // Delegate events to component implementations
 39    public event EventHandler<string>? MessageReceived
 40    {
 141        add => _messageReceiver.MessageReceived += value;
 042        remove => _messageReceiver.MessageReceived -= value;
 43    }
 44
 45    public event EventHandler<Exception>? ErrorOccurred
 46    {
 147        add => _errorHandler.ErrorOccurred += value;
 048        remove => _errorHandler.ErrorOccurred -= value;
 49    }
 50
 51    public event EventHandler? Disconnected
 52    {
 153        add => _connectionManager.Disconnected += value;
 054        remove => _connectionManager.Disconnected -= value;
 55    }
 56
 57    public async Task ConnectAsync(Uri uri, CancellationToken cancellationToken = default)
 158    {
 159        _logger?.LogInformation("Connecting to {Uri}", uri);
 60
 161        await _connectionManager.ConnectAsync(uri, cancellationToken);
 162        await _messageReceiver.StartReceivingAsync(cancellationToken);
 63
 164        _logger?.LogInformation("Successfully connected and started receiving messages");
 165    }
 66
 67    public Task SendAsync(string message, CancellationToken cancellationToken = default)
 168    {
 169        return _messageSender.SendAsync(message, cancellationToken);
 170    }
 71
 72    public Task<string> ReceiveAsync(CancellationToken cancellationToken = default)
 173    {
 174        return _messageReceiver.ReceiveAsync(cancellationToken);
 175    }
 76
 77    public async Task CloseAsync(WebSocketCloseStatus closeStatus = WebSocketCloseStatus.NormalClosure,
 78                                string? statusDescription = null,
 79                                CancellationToken cancellationToken = default)
 180    {
 181        _logger?.LogInformation("Closing WebSocket connection");
 82
 183        await _messageReceiver.StopReceivingAsync();
 184        await _connectionManager.CloseAsync(closeStatus, statusDescription, cancellationToken);
 85
 186        _logger?.LogInformation("WebSocket connection closed");
 187    }
 88
 89    public void Dispose()
 190    {
 191        if (!_disposed)
 192        {
 193            _logger?.LogDebug("Disposing RefactoredWebSocketConnection");
 94
 195            _messageReceiver?.Dispose();
 196            _connectionManager?.Dispose();
 97
 198            _disposed = true;
 199        }
 1100    }
 101}