mirror of
https://github.com/capnproto/pycapnp.git
synced 2025-03-05 17:01:01 +01:00

Note: I've tried not to break any behaviour of the previously working APIs Python API Changes / Additions - capnp/lib/capnp.pyx * class _RemotePromise + [Added] cpdef _wait(self) = Exception raising code that used to be inside of wait(self) + [Modified] def wait(self) = Same functionality as before + [Added] async def a_wait(self) = Cannot use await as that's a reserved keyword = Uses pollRemote and asyncio.sleep(0) to make call asynchronous * class _TwoPartyVatNetwork + [Added] cdef _init_pipe(self, _TwoWayPipe pipe, Side side, schema_cpp.ReaderOptions opts) = Instanciates a TwoPartyVatNetwork using a TwoWayPipe (instead of using a file handle or connection as before) * class TwoPartyClient + [Modified] def __init__(self, socket=None, restorer=None, traversal_limit_in_words=None, nesting_limit=None) = Changes the socket parameter to be optional = If socket is not specified, default to using a TwoWayPipe + [Added] async def read(self, bufsize) = awaitable function that blocks until data has been read = bufsize defines the maximum amount of data to be read back (e.g. 4096 bytes) = Reads data from TwoWayPipe + [Added] def write(self, data) = Write data to TwoWayPipe = Not awaitable as the write interface of the TwoWayPipe doesn't have poll functionality * class TwoPartyServer + [Modified] def __init__(self, socket=None, restorer=None, server_socket=None, bootstrap=None, traversal_limit_in_words=None, nesting_limit=None) = Changes the socket parameter to be optional = If socket is not specified, default to using a TwoWayPipe = Simplified code by removing an else (self._connect) + [Added] async def read(self, bufsize) = awaitable function that blocks until data has been read = bufsize defines the maximum amount of data to be read back (e.g. 4096 bytes) = Reads data from TwoWayPipe + [Added] def write(self, data) = Write data to TwoWayPipe = Not awaitable as the write interface of the TwoWayPipe doesn't have poll functionality + [Added] async def poll_forever(self) = asyncio equivalent of run_forever() * class _TwoWayPipe + Wrapper class for TwoWayPipe Other Additions - capnp/helpers/asyncHelper.h * pollWaitScope + Pumps the kj event handler + Used for the TwoWayServer * pollRemote + Polls a remote promise + i.e. a capnp RPC call - capnp/helpers/asyncIoHelper.h * AsyncIoStreamReadHelper + I wasn't able to figure out Promise[size_t] using Cython so this was the next best thing I could think of doing + Was needed to handle read polling from a read promise = Polling is used for asyncio as kj waits need a wrapper to be compatible - capnp/lib/capnp.pyx * makeTwoWayPipe + Wrapper for kj newTwoWayPipe function * poll_once + Single pump of the kj event handler (used with pollWaitScope) TwoWayClient Usage - TwoWayPipe - See examples/async_client.py TwoWayServer Usage - TwoWayPipe - See examples/async_server.py capnp/helpers/asyncIoHelper.h Misc Changes - Fixed thread_server.py and thread_client.py to use bootstrap instead of ez_restore - async_client.py and async_server.py examples * Uses the same thread.capnp as thread_client.py and thread_server.py * They are compatible, so you can mix and match client and server for compatibility testing * async_client.py and async_server.py require <address>:<port> formatting (unlike autodetection from thread_client.py and thread_server.py)
51 lines
2.8 KiB
Cython
51 lines
2.8 KiB
Cython
from capnp.includes.capnp_cpp cimport Maybe, DynamicStruct, Request, Response, PyPromise, VoidPromise, PyPromiseArray, RemotePromise, DynamicCapability, InterfaceSchema, EnumSchema, StructSchema, DynamicValue, Capability, RpcSystem, MessageBuilder, MessageReader, TwoPartyVatNetwork, PyRestorer, AnyPointer, DynamicStruct_Builder, WaitScope, AsyncIoContext, StringPtr, TaskSet, Timer
|
|
|
|
from capnp.includes.schema_cpp cimport ByteArray
|
|
|
|
from non_circular cimport reraise_kj_exception, AsyncIoStreamReadHelper
|
|
|
|
from cpython.ref cimport PyObject
|
|
|
|
from libcpp cimport bool
|
|
|
|
cdef extern from "capnp/helpers/fixMaybe.h":
|
|
EnumSchema.Enumerant fixMaybe(Maybe[EnumSchema.Enumerant]) except +reraise_kj_exception
|
|
StructSchema.Field fixMaybe(Maybe[StructSchema.Field]) except +reraise_kj_exception
|
|
|
|
cdef extern from "capnp/helpers/capabilityHelper.h":
|
|
# PyPromise evalLater(EventLoop &, PyObject * func)
|
|
# PyPromise there(EventLoop & loop, PyPromise & promise, PyObject * func, PyObject * error_func)
|
|
PyPromise then(PyPromise & promise, PyObject * func, PyObject * error_func)
|
|
PyPromise then(RemotePromise & promise, PyObject * func, PyObject * error_func)
|
|
PyPromise then(VoidPromise & promise, PyObject * func, PyObject * error_func)
|
|
PyPromise then(PyPromiseArray & promise)
|
|
DynamicCapability.Client new_client(InterfaceSchema&, PyObject *)
|
|
DynamicValue.Reader new_server(InterfaceSchema&, PyObject *)
|
|
Capability.Client server_to_client(InterfaceSchema&, PyObject *)
|
|
PyPromise convert_to_pypromise(RemotePromise&)
|
|
PyPromise convert_to_pypromise(VoidPromise&)
|
|
VoidPromise convert_to_voidpromise(PyPromise&)
|
|
|
|
cdef extern from "capnp/helpers/rpcHelper.h":
|
|
Capability.Client restoreHelper(RpcSystem&)
|
|
Capability.Client restoreHelper(RpcSystem&, MessageBuilder&)
|
|
Capability.Client restoreHelper(RpcSystem&, MessageReader&)
|
|
Capability.Client restoreHelper(RpcSystem&, AnyPointer.Reader&)
|
|
Capability.Client restoreHelper(RpcSystem&, AnyPointer.Builder&)
|
|
Capability.Client bootstrapHelper(RpcSystem&)
|
|
Capability.Client bootstrapHelperServer(RpcSystem&)
|
|
RpcSystem makeRpcClientWithRestorer(TwoPartyVatNetwork&, PyRestorer&)
|
|
PyPromise connectServerRestorer(TaskSet &, PyRestorer &, AsyncIoContext *, StringPtr)
|
|
PyPromise connectServer(TaskSet &, Capability.Client, AsyncIoContext *, StringPtr)
|
|
|
|
cdef extern from "capnp/helpers/serialize.h":
|
|
ByteArray messageToPackedBytes(MessageBuilder &, size_t wordCount)
|
|
|
|
cdef extern from "capnp/helpers/asyncHelper.h":
|
|
void waitNeverDone(WaitScope&)
|
|
void pollWaitScope(WaitScope&)
|
|
Response * waitRemote(RemotePromise *, WaitScope&)
|
|
bool pollRemote(RemotePromise *, WaitScope&)
|
|
PyObject * waitPyPromise(PyPromise *, WaitScope&)
|
|
void waitVoidPromise(VoidPromise *, WaitScope&)
|
|
Timer * getTimer(AsyncIoContext *) except +reraise_kj_exception
|