fix #181
This commit is contained in:
committed by
Jacob Alexander
parent
0f0b30c666
commit
7bce2f751a
@@ -1,4 +1,4 @@
|
||||
from capnp.includes.capnp_cpp cimport Maybe, DynamicStruct, Request, Response, PyPromise, VoidPromise, PyPromiseArray, RemotePromise, DynamicCapability, InterfaceSchema, EnumSchema, StructSchema, DynamicValue, Capability, RpcSystem, MessageBuilder, MessageReader, TwoPartyVatNetwork, AnyPointer, DynamicStruct_Builder, WaitScope, AsyncIoContext, StringPtr, TaskSet, Timer
|
||||
from capnp.includes.capnp_cpp cimport Maybe, ReaderOptions, DynamicStruct, Request, Response, PyPromise, VoidPromise, PyPromiseArray, RemotePromise, DynamicCapability, InterfaceSchema, EnumSchema, StructSchema, DynamicValue, Capability, RpcSystem, MessageBuilder, MessageReader, TwoPartyVatNetwork, AnyPointer, DynamicStruct_Builder, WaitScope, AsyncIoContext, StringPtr, TaskSet, Timer
|
||||
|
||||
from capnp.includes.schema_cpp cimport ByteArray
|
||||
|
||||
@@ -29,7 +29,7 @@ cdef extern from "capnp/helpers/capabilityHelper.h":
|
||||
cdef extern from "capnp/helpers/rpcHelper.h":
|
||||
Capability.Client bootstrapHelper(RpcSystem&)
|
||||
Capability.Client bootstrapHelperServer(RpcSystem&)
|
||||
PyPromise connectServer(TaskSet &, Capability.Client, AsyncIoContext *, StringPtr)
|
||||
PyPromise connectServer(TaskSet &, Capability.Client, AsyncIoContext *, StringPtr, ReaderOptions &)
|
||||
|
||||
cdef extern from "capnp/helpers/serialize.h":
|
||||
ByteArray messageToPackedBytes(MessageBuilder &, size_t wordCount)
|
||||
|
||||
@@ -26,26 +26,25 @@ class ErrorHandler : public kj::TaskSet::ErrorHandler {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
struct ServerContext {
|
||||
kj::Own<kj::AsyncIoStream> stream;
|
||||
capnp::TwoPartyVatNetwork network;
|
||||
capnp::RpcSystem<capnp::rpc::twoparty::SturdyRefHostId> rpcSystem;
|
||||
|
||||
ServerContext(kj::Own<kj::AsyncIoStream>&& stream, capnp::Capability::Client client)
|
||||
ServerContext(kj::Own<kj::AsyncIoStream>&& stream, capnp::Capability::Client client, capnp::ReaderOptions & opts)
|
||||
: stream(kj::mv(stream)),
|
||||
network(*this->stream, capnp::rpc::twoparty::Side::SERVER),
|
||||
network(*this->stream, capnp::rpc::twoparty::Side::SERVER, opts),
|
||||
rpcSystem(makeRpcServer(network, client)) {}
|
||||
};
|
||||
|
||||
void acceptLoop(kj::TaskSet & tasks, capnp::Capability::Client client, kj::Own<kj::ConnectionReceiver>&& listener) {
|
||||
void acceptLoop(kj::TaskSet & tasks, capnp::Capability::Client client, kj::Own<kj::ConnectionReceiver>&& listener, capnp::ReaderOptions & opts) {
|
||||
auto ptr = listener.get();
|
||||
tasks.add(ptr->accept().then(kj::mvCapture(kj::mv(listener),
|
||||
[&, client](kj::Own<kj::ConnectionReceiver>&& listener,
|
||||
kj::Own<kj::AsyncIoStream>&& connection) mutable {
|
||||
acceptLoop(tasks, client, kj::mv(listener));
|
||||
acceptLoop(tasks, client, kj::mv(listener), opts);
|
||||
|
||||
auto server = kj::heap<ServerContext>(kj::mv(connection), client);
|
||||
auto server = kj::heap<ServerContext>(kj::mv(connection), client, opts);
|
||||
|
||||
// Arrange to destroy the server context when all references are gone, or when the
|
||||
// EzRpcServer is destroyed (which will destroy the TaskSet).
|
||||
@@ -53,7 +52,7 @@ void acceptLoop(kj::TaskSet & tasks, capnp::Capability::Client client, kj::Own<k
|
||||
})));
|
||||
}
|
||||
|
||||
kj::Promise<PyObject *> connectServer(kj::TaskSet & tasks, capnp::Capability::Client client, kj::AsyncIoContext * context, kj::StringPtr bindAddress) {
|
||||
kj::Promise<PyObject *> connectServer(kj::TaskSet & tasks, capnp::Capability::Client client, kj::AsyncIoContext * context, kj::StringPtr bindAddress, capnp::ReaderOptions & opts) {
|
||||
auto paf = kj::newPromiseAndFulfiller<unsigned int>();
|
||||
auto portPromise = paf.promise.fork();
|
||||
|
||||
@@ -63,7 +62,7 @@ kj::Promise<PyObject *> connectServer(kj::TaskSet & tasks, capnp::Capability::Cl
|
||||
kj::Own<kj::NetworkAddress>&& addr) mutable {
|
||||
auto listener = addr->listen();
|
||||
portFulfiller->fulfill(listener->getPort());
|
||||
acceptLoop(tasks, client, kj::mv(listener));
|
||||
acceptLoop(tasks, client, kj::mv(listener), opts);
|
||||
})));
|
||||
|
||||
return portPromise.addBranch().then([&](unsigned int port) { return PyLong_FromUnsignedLong(port); });
|
||||
|
||||
Reference in New Issue
Block a user