From 76c81a76a2efa82626a4fb126752ac84f03f7d39 Mon Sep 17 00:00:00 2001 From: Vaci Koblizek Date: Mon, 28 Sep 2020 09:09:17 +0100 Subject: [PATCH] start to flesh out RPC connection state --- .../src/main/java/org/capnproto/RpcState.java | 150 ++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 runtime/src/main/java/org/capnproto/RpcState.java diff --git a/runtime/src/main/java/org/capnproto/RpcState.java b/runtime/src/main/java/org/capnproto/RpcState.java new file mode 100644 index 0000000..a2e4581 --- /dev/null +++ b/runtime/src/main/java/org/capnproto/RpcState.java @@ -0,0 +1,150 @@ +package org.capnproto; + +import java.util.List; +import java.util.concurrent.CompletableFuture; + +final class RpcState { + + static final class Question { + List paramExports; + boolean isAwaitingReturn = false; + boolean isTailCall = false; + boolean skipFinish = false; + CompletableFuture response = new CompletableFuture<>(); + + void reject(Throwable exc) { + response.completeExceptionally(exc); + } + + void answer(RpcResponse response) { + this.response.complete(response); + } + } + + static final class Answer { + boolean active = false; + PipelineHook pipeline; + CompletableFuture redirectedResults; + RpcCallContext callContext; + List resultExports; + } + + static final class Export { + int refcount; + ClientHook clientHook; + CompletableFuture resolveOp; + } + + static final class Import { + ImportClient importClient; + RpcClient appClient; + CompletableFuture promise; + // If non-null, the import is a promise. + } + + final static class Embargo { + CompletableFuture fulfiller; + } + + interface RpcResponse extends ResponseHook { + AnyPointer.Reader getResults(); + } + + class RpcCallContext implements CallContextHook { + + final int answerId; + final long interfaceId; + final short methodId; + + // request + IncomingRpcMessage request; + final AnyPointer.Reader params; + + // response + RpcResponse response; + RpcProtocol.Return.Builder returnMessage; + boolean redirectResults = false; + + final CompletableFuture cancelled; + + RpcCallContext(int answerId, IncomingRpcMessage request, List capTable, + AnyPointer.Reader params, boolean redirectResults, + CompletableFuture cancelled, + long interfaceId, short methodId) { + this.answerId = answerId; + this.interfaceId = interfaceId; + this.methodId = methodId; + this.request = request; + this.params = params.imbue(new ReaderCapabilityTable(capTable)); + this.redirectResults = redirectResults; + this.cancelled = cancelled; + } + + @Override + public AnyPointer.Reader getParams() { + return this.params; + } + + @Override + public void releaseParams() { + this.request = null; + } + + @Override + public AnyPointer.Builder getResults() { + return null; + } + + @Override + public CompletableFuture tailCall(RequestHook request) { + return null; + } + + @Override + public void allowCancellation() { + } + + @Override + public CompletableFuture onTailCall() { + return null; + } + + @Override + public ClientHook.VoidPromiseAndPipeline directTailCall(RequestHook request) { + return null; + } + } + + abstract class RpcClient implements ClientHook { + + public abstract Integer writeDescriptor(RpcProtocol.CapDescriptor.Builder descriptor, List fds); + + public abstract ClientHook writeTarget(RpcProtocol.MessageTarget.Builder target); + + public ClientHook getInnermostClient() { + return this; + } + + @Override + public Request newCall(long interfaceId, short methodId) { + return null; + } + + @Override + public VoidPromiseAndPipeline call(long interfaceId, short methodId, CallContextHook context) { + return null; + } + } + + class ImportClient extends RpcClient { + @Override + public Integer writeDescriptor(RpcProtocol.CapDescriptor.Builder descriptor, List fds) { + return null; + } + + @Override + public ClientHook writeTarget(RpcProtocol.MessageTarget.Builder target) { + return null; + } + } +}