@@ -12,4 +12,5 @@ from .exceptions import (
ClientError,
ServerError,
ConnectionClosedError,
+ InvokeError,
)
@@ -11,7 +11,7 @@ import os
import socket
import sys
from .connection import StreamConnection, WebsocketConnection, DEFAULT_MAX_CHUNK
-from .exceptions import ConnectionClosedError
+from .exceptions import ConnectionClosedError, InvokeError
class AsyncClient(object):
@@ -93,12 +93,18 @@ class AsyncClient(object):
await self.close()
count += 1
+ def check_invoke_error(self, msg):
+ if isinstance(msg, dict) and "invoke-error" in msg:
+ raise InvokeError(msg["invoke-error"]["message"])
+
async def invoke(self, msg):
async def proc():
await self.socket.send_message(msg)
return await self.socket.recv_message()
- return await self._send_wrapper(proc)
+ result = await self._send_wrapper(proc)
+ self.check_invoke_error(result)
+ return result
async def ping(self):
return await self.invoke({"ping": {}})
@@ -9,6 +9,10 @@ class ClientError(Exception):
pass
+class InvokeError(Exception):
+ pass
+
+
class ServerError(Exception):
pass
@@ -14,7 +14,7 @@ import sys
import multiprocessing
import logging
from .connection import StreamConnection, WebsocketConnection
-from .exceptions import ClientError, ServerError, ConnectionClosedError
+from .exceptions import ClientError, ServerError, ConnectionClosedError, InvokeError
class ClientLoggerAdapter(logging.LoggerAdapter):
@@ -76,7 +76,14 @@ class AsyncServerConnection(object):
d = await self.socket.recv_message()
if d is None:
break
- response = await self.dispatch_message(d)
+ try:
+ response = await self.dispatch_message(d)
+ except InvokeError as e:
+ await self.socket.send_message(
+ {"invoke-error": {"message": str(e)}}
+ )
+ break
+
if response is not self.NO_RESPONSE:
await self.socket.send_message(response)
Adds support for Invocation Errors (that is, errors raised by the actual RPC call instead of at the protocol level) to propagate across the connection. If a server RPC call raises an InvokeError, it will be sent across the connection and then raised on the client side also. The connection is still terminated on this error. Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> --- lib/bb/asyncrpc/__init__.py | 1 + lib/bb/asyncrpc/client.py | 10 ++++++++-- lib/bb/asyncrpc/exceptions.py | 4 ++++ lib/bb/asyncrpc/serv.py | 11 +++++++++-- 4 files changed, 22 insertions(+), 4 deletions(-)