< Summary - Combined Code Coverage

Information
Class: NLightning.Daemon.Ipc.Handlers.ConnectPeerIpcHandler
Assembly: NLightning.Daemon
File(s): /home/runner/work/NLightning/NLightning/src/NLightning.Daemon/Ipc/Handlers/ConnectPeerIpcHandler.cs
Tag: 57_24045730253
Line coverage
0%
Covered lines: 0
Uncovered lines: 47
Coverable lines: 47
Total lines: 93
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 2
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Command()100%210%
.ctor(...)100%210%
HandleAsync()0%620%

File(s)

/home/runner/work/NLightning/NLightning/src/NLightning.Daemon/Ipc/Handlers/ConnectPeerIpcHandler.cs

#LineLine coverage
 1using MessagePack;
 2using Microsoft.Extensions.Logging;
 3
 4namespace NLightning.Daemon.Ipc.Handlers;
 5
 6using Domain.Client.Constants;
 7using Domain.Client.Enums;
 8using Domain.Exceptions;
 9using Domain.Node.Interfaces;
 10using Interfaces;
 11using Services.Ipc.Factories;
 12using Transport.Ipc;
 13using Transport.Ipc.Requests;
 14using Transport.Ipc.Responses;
 15
 16internal sealed class ConnectPeerIpcHandler : IIpcCommandHandler
 17{
 18    private readonly ILogger<ConnectPeerIpcHandler> _logger;
 19    private readonly IPeerManager _peerManager;
 20
 021    public ClientCommand Command => ClientCommand.ConnectPeer;
 22
 023    public ConnectPeerIpcHandler(ILogger<ConnectPeerIpcHandler> logger, IPeerManager peerManager)
 24    {
 025        _peerManager = peerManager;
 026        _logger = logger;
 027    }
 28
 29    public async Task<IpcEnvelope> HandleAsync(IpcEnvelope envelope, CancellationToken ct)
 30    {
 31        try
 32        {
 33            // Deserialize the request
 034            var request =
 035                MessagePackSerializer.Deserialize<ConnectPeerIpcRequest>(envelope.Payload, cancellationToken: ct);
 36
 37            // Validate the address
 038            if (string.IsNullOrWhiteSpace(request.Address.Address))
 039                return IpcErrorFactory.CreateErrorEnvelope(envelope, ErrorCodes.InvalidAddress,
 040                                                           "Invalid address: address cannot be empty");
 41
 42            // Parse and connect to the peer
 043            var peer = await _peerManager.ConnectToPeerAsync(request.Address);
 44
 045            _logger.LogInformation("Successfully connected to peer at {Address}", request.Address);
 46
 47            // Create a success response
 048            var response = new ConnectPeerIpcResponse
 049            {
 050                Id = peer.NodeId,
 051                Features = peer.Features,
 052                IsInitiator = true,
 053                Address = peer.Host,
 054                Type = peer.Type,
 055                Port = peer.Port
 056            };
 57
 058            var payload = MessagePackSerializer.Serialize(response, cancellationToken: ct);
 059            return new IpcEnvelope
 060            {
 061                Version = envelope.Version,
 062                Command = envelope.Command,
 063                CorrelationId = envelope.CorrelationId,
 064                Kind = IpcEnvelopeKind.Response,
 065                Payload = payload
 066            };
 67        }
 068        catch (FormatException fe)
 69        {
 070            _logger.LogWarning(fe, "Invalid peer address format");
 071            return IpcErrorFactory.CreateErrorEnvelope(envelope, ErrorCodes.InvalidAddress,
 072                                                       $"Invalid address format: {fe.Message}");
 73        }
 074        catch (InvalidOperationException oe)
 75        {
 076            _logger.LogInformation(oe, "The operation could not be completed");
 077            return IpcErrorFactory.CreateErrorEnvelope(envelope, ErrorCodes.InvalidOperation,
 078                                                       $"The operation could not be completed: {oe.Message}");
 79        }
 080        catch (ConnectionException ce)
 81        {
 082            _logger.LogError(ce, "Failed to connect to peer");
 083            return IpcErrorFactory.CreateErrorEnvelope(envelope, ErrorCodes.ConnectionError,
 084                                                       $"Connection failed: {ce.Message}");
 85        }
 086        catch (Exception e)
 87        {
 088            _logger.LogError(e, "Error connecting to peer");
 089            return IpcErrorFactory.CreateErrorEnvelope(envelope, ErrorCodes.ServerError,
 090                                                       $"Error connecting to peer: {e.Message}");
 91        }
 092    }
 93}