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)
142 lines
5.4 KiB
Cython
142 lines
5.4 KiB
Cython
# cython: language_level = 2
|
|
|
|
from capnp.includes cimport capnp_cpp as capnp
|
|
from capnp.includes cimport schema_cpp
|
|
from capnp.includes.capnp_cpp cimport Schema as C_Schema, StructSchema as C_StructSchema, InterfaceSchema as C_InterfaceSchema, EnumSchema as C_EnumSchema, ListSchema as C_ListSchema, DynamicStruct as C_DynamicStruct, DynamicValue as C_DynamicValue, Type as C_Type, DynamicList as C_DynamicList, SchemaParser as C_SchemaParser, ParsedSchema as C_ParsedSchema, VOID, ArrayPtr, StringPtr, String, StringTree, DynamicOrphan as C_DynamicOrphan, AnyPointer as C_DynamicObject, DynamicCapability as C_DynamicCapability, Request, Response, RemotePromise, PyPromise, VoidPromise, CallContext, PyRestorer, RpcSystem, makeRpcServer, makeRpcServerBootstrap, makeRpcClient, Capability as C_Capability, TwoPartyVatNetwork as C_TwoPartyVatNetwork, Side, AsyncIoStream, Own, makeTwoPartyVatNetwork, PromiseFulfillerPair as C_PromiseFulfillerPair, copyPromiseFulfillerPair, newPromiseAndFulfiller, PyArray, DynamicStruct_Builder, TwoWayPipe
|
|
from capnp.includes.schema_cpp cimport Node as C_Node, EnumNode as C_EnumNode
|
|
from capnp.includes.types cimport *
|
|
from capnp.helpers.non_circular cimport reraise_kj_exception
|
|
from capnp.helpers cimport helpers
|
|
|
|
|
|
cdef class _StructSchemaField:
|
|
cdef C_StructSchema.Field thisptr
|
|
cdef object _parent
|
|
cdef _init(self, C_StructSchema.Field other, parent=?)
|
|
|
|
cdef class _StringArrayPtr:
|
|
cdef StringPtr * thisptr
|
|
cdef object parent
|
|
cdef size_t size
|
|
cdef ArrayPtr[StringPtr] asArrayPtr(self) except +reraise_kj_exception
|
|
|
|
cdef class SchemaParser:
|
|
cdef C_SchemaParser * thisptr
|
|
cdef public dict modules_by_id
|
|
cdef list _all_imports
|
|
cdef _StringArrayPtr _last_import_array
|
|
cpdef _parse_disk_file(self, displayName, diskPath, imports) except +reraise_kj_exception
|
|
|
|
cdef class _DynamicOrphan:
|
|
cdef C_DynamicOrphan thisptr
|
|
cdef public object _parent
|
|
|
|
cdef _init(self, C_DynamicOrphan other, object parent)
|
|
|
|
cdef C_DynamicOrphan move(self)
|
|
cpdef get(self)
|
|
|
|
|
|
cdef class _DynamicStructReader:
|
|
cdef C_DynamicStruct.Reader thisptr
|
|
cdef public object _parent
|
|
cdef public bint is_root
|
|
cdef object _obj_to_pin
|
|
cdef object _schema
|
|
|
|
cdef _init(self, C_DynamicStruct.Reader other, object parent, bint isRoot=?, bint tryRegistry=?)
|
|
|
|
cpdef _get(self, field)
|
|
cpdef _has(self, field)
|
|
cpdef _DynamicEnumField _which(self)
|
|
cpdef _which_str(self)
|
|
cpdef _get_by_field(self, _StructSchemaField field)
|
|
cpdef _has_by_field(self, _StructSchemaField field)
|
|
|
|
cpdef as_builder(self, num_first_segment_words=?)
|
|
|
|
|
|
cdef class _DynamicStructBuilder:
|
|
cdef DynamicStruct_Builder thisptr
|
|
cdef public object _parent
|
|
cdef public bint is_root
|
|
cdef public bint _is_written
|
|
cdef object _schema
|
|
|
|
cdef _init(self, DynamicStruct_Builder other, object parent, bint isRoot=?, bint tryRegistry=?)
|
|
|
|
cdef _check_write(self)
|
|
cpdef to_bytes(_DynamicStructBuilder self) except +reraise_kj_exception
|
|
cpdef to_segments(_DynamicStructBuilder self) except +reraise_kj_exception
|
|
cpdef _to_bytes_packed_helper(_DynamicStructBuilder self, word_count) except +reraise_kj_exception
|
|
cpdef to_bytes_packed(_DynamicStructBuilder self) except +reraise_kj_exception
|
|
|
|
cpdef _get(self, field)
|
|
cpdef _set(self, field, value)
|
|
cpdef _has(self, field)
|
|
cpdef init(self, field, size=?)
|
|
cpdef _get_by_field(self, _StructSchemaField field)
|
|
cpdef _set_by_field(self, _StructSchemaField field, value)
|
|
cpdef _has_by_field(self, _StructSchemaField field)
|
|
cpdef _init_by_field(self, _StructSchemaField field, size=?)
|
|
cpdef init_resizable_list(self, field)
|
|
cpdef _DynamicEnumField _which(self)
|
|
cpdef _which_str(self)
|
|
cpdef adopt(self, field, _DynamicOrphan orphan)
|
|
cpdef disown(self, field)
|
|
|
|
cpdef as_reader(self)
|
|
cpdef copy(self, num_first_segment_words=?)
|
|
|
|
cdef class _DynamicEnumField:
|
|
cdef object thisptr
|
|
|
|
cdef _init(self, proto)
|
|
cpdef _str(self)
|
|
|
|
cdef class _Schema:
|
|
cdef C_Schema thisptr
|
|
|
|
cdef _init(self, C_Schema other)
|
|
|
|
cpdef as_const_value(self)
|
|
cpdef as_struct(self)
|
|
cpdef as_interface(self)
|
|
cpdef as_enum(self)
|
|
cpdef get_dependency(self, id)
|
|
cpdef get_proto(self)
|
|
|
|
cdef class _InterfaceSchema:
|
|
cdef C_InterfaceSchema thisptr
|
|
cdef object __method_names, __method_names_inherited, __methods, __methods_inherited
|
|
cdef _init(self, C_InterfaceSchema other)
|
|
cpdef get_dependency(self, id)
|
|
|
|
cdef class _DynamicEnum:
|
|
cdef capnp.DynamicEnum thisptr
|
|
cdef public object _parent
|
|
|
|
cdef _init(self, capnp.DynamicEnum other, object parent)
|
|
cpdef _as_str(self) except +reraise_kj_exception
|
|
|
|
cdef class _DynamicListBuilder:
|
|
cdef C_DynamicList.Builder thisptr
|
|
cdef public object _parent
|
|
cdef _init(self, C_DynamicList.Builder other, object parent)
|
|
|
|
cpdef _get(self, int64_t index)
|
|
cpdef _set(self, index, value)
|
|
|
|
cpdef adopt(self, index, _DynamicOrphan orphan)
|
|
cpdef disown(self, index)
|
|
|
|
cpdef init(self, index, size)
|
|
|
|
cdef to_python_reader(C_DynamicValue.Reader self, object parent)
|
|
cdef to_python_builder(C_DynamicValue.Builder self, object parent)
|
|
cdef _to_dict(msg, bint verbose, bint ordered)
|
|
cdef _from_list(_DynamicListBuilder msg, list d)
|
|
cdef _from_tuple(_DynamicListBuilder msg, tuple d)
|
|
cdef _setDynamicFieldWithField(DynamicStruct_Builder thisptr, _StructSchemaField field, value, parent)
|
|
cdef _setDynamicFieldStatic(DynamicStruct_Builder thisptr, field, value, parent)
|