@Override
    public Promise<Resp> request(Req req) {
        ReqResMessage<Req> msg = new ReqResMessage<>(UUID.randomUUID(), req);
        Promise<Resp> promise = Promise.empty();
        this.channel.sendMessage(msg, new ConversationReplyListener<ReqResMessage<Resp>>() {
            @Nonnull
            @Override
            public RegistrationAction onReply(@Nonnull ReqResMessage<Resp> reply) {
                promise.supply(reply.getBody());
                return RegistrationAction.STOP_LISTENING;
            }

            @Override
            public void onTimeout(@Nonnull List<ReqResMessage<Resp>> replies) {
                promise.supplyException(new TimeoutException("Request timed out"));
            }
        }, 5, TimeUnit.SECONDS);
        return promise;
    }
Implements a {@link ReqRespChannel} using {@link ConversationChannel}s.

@param <Req> the request type
@param <Resp> the response type
helper/src/main/java/me/lucko/helper/messaging/reqresp/SimpleReqRespChannel.java