Class ThreeWayHandshakeClientHandler<R extends RequestMessage,O extends ResponseMessage<?>>

java.lang.Object
io.netty.channel.ChannelHandlerAdapter
io.netty.channel.ChannelInboundHandlerAdapter
io.netty.channel.SimpleChannelInboundHandler<I>
org.drasyl.peer.connection.handler.SimpleChannelDuplexHandler<Message,Message>
org.drasyl.peer.connection.handler.ThreeWayHandshakeClientHandler<R,O>
All Implemented Interfaces:
io.netty.channel.ChannelHandler, io.netty.channel.ChannelInboundHandler, io.netty.channel.ChannelOutboundHandler
Direct Known Subclasses:
ClientConnectionHandler

public abstract class ThreeWayHandshakeClientHandler<R extends RequestMessage,O extends ResponseMessage<?>> extends SimpleChannelDuplexHandler<Message,Message>
This handler performs the client-side part of a three-way handshake to create a session. It automatically requests the server for a new session. The server must confirm this request and then offers the client a session. Then the client has to confirm the offered session again.
  • Field Details

    • ATTRIBUTE_PUBLIC_KEY

      public static final io.netty.util.AttributeKey<CompressedPublicKey> ATTRIBUTE_PUBLIC_KEY
    • timeout

      protected final Duration timeout
    • handshakeFuture

      protected final CompletableFuture<Void> handshakeFuture
    • pipeline

      protected final Pipeline pipeline
    • networkId

      protected final int networkId
    • identity

      protected final Identity identity
    • timeoutFuture

      protected io.netty.util.concurrent.ScheduledFuture<?> timeoutFuture
  • Constructor Details

    • ThreeWayHandshakeClientHandler

      protected ThreeWayHandshakeClientHandler(int networkId, Identity identity, Duration timeout, Pipeline pipeline, R requestMessage)
    • ThreeWayHandshakeClientHandler

      protected ThreeWayHandshakeClientHandler(int networkId, Identity identity, Duration timeout, Pipeline pipeline, CompletableFuture<Void> handshakeFuture, io.netty.util.concurrent.ScheduledFuture<?> timeoutFuture, R requestMessage)
  • Method Details

    • doHandshake

      protected void doHandshake(io.netty.channel.ChannelHandlerContext ctx, Message message)
    • handlerAdded

      public void handlerAdded(io.netty.channel.ChannelHandlerContext ctx) throws Exception
      Specified by:
      handlerAdded in interface io.netty.channel.ChannelHandler
      Overrides:
      handlerAdded in class io.netty.channel.ChannelHandlerAdapter
      Throws:
      Exception
    • requestSession

      protected void requestSession(io.netty.channel.ChannelHandlerContext ctx)
    • validateSessionOffer

      protected abstract ErrorMessage.Error validateSessionOffer(O offerMessage)
      This method validates the session offered by the server and must return an ErrorMessage.Error in case of error. Otherwise null must be returned.
      Parameters:
      offerMessage - the message that should be validated
      Returns:
      ErrorMessage.Error in case of error, otherwise null
    • confirmSession

      protected void confirmSession(io.netty.channel.ChannelHandlerContext ctx, O offerMessage)
    • createConnection

      protected abstract void createConnection(io.netty.channel.ChannelHandlerContext ctx, O offerMessage)
    • processUnexpectedMessageDuringHandshake

      protected void processUnexpectedMessageDuringHandshake(io.netty.channel.ChannelHandlerContext ctx, Message message)
    • getLogger

      protected abstract org.slf4j.Logger getLogger()
    • channelRead0

      public void channelRead0(io.netty.channel.ChannelHandlerContext ctx, Message msg)
      Description copied from class: SimpleChannelDuplexHandler
      Is called for each message of type SimpleChannelDuplexHandler on inbound channel.
      Specified by:
      channelRead0 in class SimpleChannelDuplexHandler<Message,Message>
      Parameters:
      ctx - the ChannelHandlerContext which this SimpleChannelDuplexHandler belongs to
      msg - the message to handle
    • close

      public void close(io.netty.channel.ChannelHandlerContext ctx, io.netty.channel.ChannelPromise promise) throws Exception
      Specified by:
      close in interface io.netty.channel.ChannelOutboundHandler
      Overrides:
      close in class SimpleChannelDuplexHandler<Message,Message>
      Throws:
      Exception
    • channelWrite0

      protected void channelWrite0(io.netty.channel.ChannelHandlerContext ctx, Message msg, io.netty.channel.ChannelPromise promise)
      Description copied from class: SimpleChannelDuplexHandler
      Is called for each message of type SimpleChannelDuplexHandler on the outbound channel.
      Specified by:
      channelWrite0 in class SimpleChannelDuplexHandler<Message,Message>
      Parameters:
      ctx - the ChannelHandlerContext which this SimpleChannelDuplexHandler belongs to
      msg - the message to handle
      promise - the corresponding promise
    • processMessageAfterHandshake

      protected void processMessageAfterHandshake(io.netty.channel.ChannelHandlerContext ctx, Message message)
    • channelActive

      public void channelActive(io.netty.channel.ChannelHandlerContext ctx) throws Exception
      Specified by:
      channelActive in interface io.netty.channel.ChannelInboundHandler
      Overrides:
      channelActive in class io.netty.channel.ChannelInboundHandlerAdapter
      Throws:
      Exception
    • startTimeoutGuard

      protected void startTimeoutGuard(io.netty.channel.ChannelHandlerContext ctx)
    • rejectSession

      protected void rejectSession(io.netty.channel.ChannelHandlerContext ctx, String error)
    • exceptionCaught

      public void exceptionCaught(io.netty.channel.ChannelHandlerContext ctx, Throwable cause)
      Specified by:
      exceptionCaught in interface io.netty.channel.ChannelHandler
      Specified by:
      exceptionCaught in interface io.netty.channel.ChannelInboundHandler
      Overrides:
      exceptionCaught in class io.netty.channel.ChannelInboundHandlerAdapter