RpcState bug fixes

correctly brand RpcClient
don't run message loop inside promise
imbue payload
This commit is contained in:
Vaci Koblizek 2020-10-02 21:44:52 +01:00
parent 194c0ada2a
commit 7ae49a8f6a

View file

@ -1108,11 +1108,15 @@ final class RpcState {
public VoidPromiseAndPipeline callNoIntercept(long interfaceId, short methodId, CallContextHook context) { public VoidPromiseAndPipeline callNoIntercept(long interfaceId, short methodId, CallContextHook context) {
var params = context.getParams(); var params = context.getParams();
var request = newCallNoIntercept(interfaceId, methodId); var request = newCallNoIntercept(interfaceId, methodId);
var x = request.params;
context.allowCancellation(); context.allowCancellation();
return context.directTailCall(request.hook); return context.directTailCall(request.hook);
} }
@Override
public final Object getBrand() {
return RpcState.this;
}
private Request<AnyPointer.Builder, AnyPointer.Reader> newCallNoIntercept(long interfaceId, short methodId) { private Request<AnyPointer.Builder, AnyPointer.Reader> newCallNoIntercept(long interfaceId, short methodId) {
if (isDisconnected()) { if (isDisconnected()) {
return Request.newBrokenRequest(disconnected); return Request.newBrokenRequest(disconnected);
@ -1139,7 +1143,7 @@ final class RpcState {
this.target = target; this.target = target;
this.message = connection.newOutgoingMessage(1024); this.message = connection.newOutgoingMessage(1024);
this.callBuilder = message.getBody().getAs(RpcProtocol.Message.factory).initCall(); this.callBuilder = message.getBody().getAs(RpcProtocol.Message.factory).initCall();
this.paramsBuilder = callBuilder.getParams().getContent(); this.paramsBuilder = callBuilder.getParams().getContent().imbue(this.capTable);
} }
AnyPointer.Builder getRoot() { AnyPointer.Builder getRoot() {
@ -1168,8 +1172,7 @@ final class RpcState {
// The pipeline must get notified of resolution before the app does to maintain ordering. // The pipeline must get notified of resolution before the app does to maintain ordering.
var pipeline = new RpcPipeline(question, question.response); var pipeline = new RpcPipeline(question, question.response);
// drive the message loop until the question is answered var appPromise = question.response.thenApply(response -> {
var appPromise = messageLoop(question.response).thenApply(response -> {
var results = response.getResults(); var results = response.getResults();
return new Response(results, response); return new Response(results, response);
}); });
@ -1202,7 +1205,7 @@ final class RpcState {
} }
@Override @Override
public Object getBrand() { public final Object getBrand() {
return RpcState.this; return RpcState.this;
} }