Commit Graph

52 Commits

Author SHA1 Message Date
Jacob Alexander
b3021e4f6b Fixing flake8 warnings and errors
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics --exclude benchmark

Excluding the benchmark directory (due to protobuf generated files)
Also removing some Python2 specific code
2019-09-27 00:15:13 -07:00
Jacob Alexander
1a127bec6f Adding pure python SSL test using asyncio
- Uses thread.capnp
- Follows same format as thread_client.py/thread_server.py and
async_client.py/async_server.py
- Including a basic self signed certificate for testing convenience
- Python 3.7 has a bug cleaning up SSL when using asyncio.run
  https://bugs.python.org/issue36709
  Have a slightly more verbose workaround to do proper cleanup
2019-09-26 21:42:54 -07:00
Jacob Alexander
8915ef79f1 TwoWayPipe and basic asyncio support
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)
2019-09-26 21:42:48 -07:00
Jason Paryani
e00bff6ef8 Fix problems with TwoPartyServer
Fixes #61

It turns out I messed up the Server initialization code for the case
where a string is passed in as the address. The tests only cover the
cases where a raw socket is passed in. This will be rectified in a
following commit.
2015-04-13 14:14:40 -07:00
Jason Paryani
64e80e06bf Get code generator plugin to a decently working state.
Still a few outstanding performance issues, and imports inside .capnp
files may not be working
2014-10-19 20:06:00 -07:00
Jason Paryani
95e706f2f9 Add thread examples 2014-08-26 15:21:46 -07:00
Jason Paryani
b0af30ebe6 Fix up syntax a bit 2014-01-13 17:00:05 -08:00
Jason Paryani
0930a9fd1b Change calculator example to use new dict syntax for a typeless struct 2014-01-13 16:50:02 -08:00
Jason Paryani
f9bb12bff9 Update RPC with simpler methods for connecting 2013-12-12 11:55:50 -08:00
Jason Paryani
81388f82f6 Change rpc server example to use simple restore function 2013-12-11 22:48:59 -08:00
Jason Paryani
2f0f03d1a8 Add TCP_NODELAY 2013-12-11 22:25:43 -08:00
Jason Paryani
4d8a27844f Fix allowing RemotePromises to be returned directly 2013-12-11 11:24:27 -08:00
Jason Paryani
03bac73120 Fix examples formatting issues and make them pep8 compliant 2013-12-11 01:59:52 -08:00
Jason Paryani
117a3c7eac Add examples back in 2013-12-11 00:27:01 -08:00
Jason Paryani
db2247e883 Add calculator to tests 2013-12-11 00:15:08 -08:00
Jason Paryani
0e178de136 Fix segfault by making TwoPartyClient's members immortal 2013-12-10 23:29:21 -08:00
Jason Paryani
a17c76f593 Add server example 2013-12-10 23:05:57 -08:00
Jason Paryani
e92f7b56c6 Various fixups to the RPC api.
* change how restorer works
* fix join_promises
* add incref's all around to make sure we aren't freeing objects early
* make it so we return PyPromises everywhere and make chains collapsible
2013-12-10 22:57:21 -08:00
Jason Paryani
bba1918566 Add ez_restore function to Client. Also add c++.capnp and rpc.capnp 2013-12-09 21:30:27 -08:00
Jason Paryani
8cc214fb7b Add semi-functional rpc example 2013-12-09 19:49:48 -08:00
Jason Paryani
618097dec1 Add ability for passing AnyPointer to restore in RPCClient 2013-12-09 19:18:54 -08:00
Jason Paryani
362a50e34a Remove old examples 2013-12-09 17:11:42 -08:00
Jason Paryani
2155417d38 Fixup examples for recent API changes 2013-12-08 15:52:31 -08:00
Jason Paryani
bb3121d3ae Fix API changes in EventLoop 2013-12-04 11:42:57 -08:00
Jason Paryani
cfc11e4a8a Fix bug in removing an EventLoop 2013-12-02 17:54:53 -08:00
Jason Paryani
888b906781 Remove all public references to EventLoop to match changes to async API 2013-12-02 17:38:32 -08:00
Jason Paryani
fc16eab803 Fix up examples 2013-11-15 01:17:35 -08:00
Jason Paryani
2e4efd040b Allow client requests to use positional args 2013-11-14 20:59:21 -08:00
Jason Paryani
7d82dcbfd8 Update examples for RPC 2013-11-13 21:52:50 -08:00
Jason Paryani
11543b7abf Add ability to pass Restorer to RpcClient. Also various fixups
and added __dir__ reflection to DynamicCapabilityClient
2013-11-13 10:58:16 -08:00
Jason Paryani
5251cb5575 Add upcast/cast_as to DynamicCapability. Also changed EventLoop.
wait_remote -> wait
2013-11-12 20:28:23 -08:00
Jason Paryani
496a126671 Add a cross language RPC example 2013-11-12 19:40:10 -08:00
Jason Paryani
374f986fa7 Add FdAsyncIoStream. Also clean up RPC interface a bit 2013-11-12 19:38:34 -08:00
Jason Paryani
1df115d359 Initial wrapping of rpc-twoparty functionality 2013-11-12 15:32:23 -08:00
Jason Paryani
5e00534842 Fixup exception handling for capabilities 2013-10-20 17:24:59 -07:00
Jason Paryani
c3354e9069 Add ability to pipeline rpc requests 2013-10-19 22:38:10 -07:00
Jason Paryani
7f7b28f328 Fix memleak and simplify dynamic client api 2013-10-17 19:15:40 -07:00
Jason Paryani
a5d0abb49f First working version of capability interfaces 2013-10-15 22:36:14 -07:00
Jason Paryani
38cef54ddc Update docs with new import method 2013-09-03 01:16:48 -07:00
Jason Paryani
1317527893 Change naming for functions to conform to PEP 8. Also deprecate old
read/write api.
2013-09-01 20:10:57 -07:00
Jason Paryani
6fcdf841e4 Update preferred method for reading/writing messages from files 2013-09-01 02:13:19 -07:00
Jason Paryani
172c2fd900 Change orphan list semantics a bit 2013-08-27 10:55:06 -07:00
Jason Paryani
448ea93891 Add full orphan functionality. Also, allow special orphan lists
that can grow over time.
2013-08-26 22:00:12 -07:00
Jason Paryani
c6250962e6 Add handling of constants in schemas 2013-08-25 17:07:08 -07:00
Jason Paryani
948f74d804 Updated capnp schema to conform with new union rules 2013-08-22 17:47:44 -07:00
Jason Paryani
ba2a05e872 Remove warning about Void syntax changing 2013-08-18 21:42:33 -07:00
Jason Paryani
3ece246f23 Simplify code base
Remove bootstrap directory as well as cython wrapping of the schema
protocol.
2013-08-10 13:54:25 -07:00
Jason Paryani
59beea5108 Change how init works 2013-07-07 13:00:03 -07:00
Jason Paryani
2a4a183b7f Fix up example for python3 2013-07-07 02:31:50 -07:00
Jason Paryani
6c84e7c74f Fixed typo in example 2013-07-07 00:13:48 -07:00