public async ValueTask <bool> ProcessMessageAsync(HandshakeMessage noiseMessage, CancellationToken cancellation)
        {
            if (PeerContext.HandshakeComplete)
            {
                logger.LogDebug("Receiving version while already handshaked, disconnect.");
                throw new ProtocolViolationException("Peer already handshaked, disconnecting because of protocol violation.");
            }

            switch (_handshakeActNumber)
            {
            case 1: // ActOne responder
            {
                logger.LogDebug("Handshake ActOne received.");
                await SendMessageAsync(Handshake(noiseMessage.Payload), cancellation).ConfigureAwait(false);

                _handshakeActNumber += 2;   // jump to act3
                logger.LogDebug("Handshake ActTwo sent.");
                break;
            }

            case 2: // ActTwo both
            {
                logger.LogDebug("Handshake ActTwo received.");
                await SendMessageAsync(Handshake(noiseMessage.Payload), cancellation).ConfigureAwait(false);

                PeerContext.OnHandshakeCompleted();
                _handshakeActNumber++;
                logger.LogDebug("Handshake ActThree sent.");
                break;
            }

            case 3: // ActThree Responder
            {
                logger.LogDebug("Handshake ActThree received.");
                _ = Handshake(noiseMessage.Payload);
                _handshakeActNumber++;
                logger.LogDebug("Handshake Init sent.");
                PeerContext.OnHandshakeCompleted();
                await SendMessageAsync(CreateInitMessage(), cancellation).ConfigureAwait(false);

                PeerContext.OnInitMessageCompleted();
                break;
            }
            }

            // will prevent to handle noise messages to other Processors
            return(false);
        }
        public async ValueTask <bool> ProcessMessageAsync(InitMessage message, CancellationToken cancellation)
        {
            logger.LogDebug("Handshake Init received.");

            if (PeerContext.InitComplete)
            {
                return(true);
            }

            // validate init message

            PeerContext.OnInitMessageCompleted();

            await SendMessageAsync(CreateInitMessage(), cancellation).ConfigureAwait(false);

            return(true);// new ValueTask<bool>(true);
        }