Source code for caller

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

import logging

from wampy.constants import NOT_AUTHORISED
from wampy.errors import WampyError, WampProtocolError
from wampy.messages import Error, Result
from wampy.messages import MESSAGE_TYPE_MAP
from wampy.messages.call import Call

logger = logging.getLogger('wampy.rpc')


[docs]class CallProxy: """ Proxy wrapper of a `wampy` client for WAMP application RPCs. Applictions and their endpoints are identified by dot delimented strings, e.g. :: "com.example.endpoints" and a `CallProxy` object will call such and endpoint, passing in any `args` or `kwargs` necessary. """ def __init__(self, client): self.client = client def __call__(self, procedure, *args, **kwargs): message = Call(procedure=procedure, args=args, kwargs=kwargs) response = self.client.make_rpc(message) wamp_code = response.WAMP_CODE if wamp_code == Error.WAMP_CODE: logger.error("call returned an error: %s", response) return response elif wamp_code == Result.WAMP_CODE: return response.value raise WampProtocolError("unexpected response: %s", response)
[docs]class RpcProxy: """ Proxy wrapper of a `wampy` client for WAMP application RPCs where the endpoint is a non-delimted single string name, such as a function name, e.g. :: "get_data" The typical use case of this proxy class is for microservices where endpoints are class methods. """ def __init__(self, client): self.client = client def __getattr__(self, name): def wrapper(*args, **kwargs): message = Call(procedure=name, args=args, kwargs=kwargs) response = self.client.make_rpc(message) wamp_code = response.WAMP_CODE if wamp_code == Error.WAMP_CODE: _, _, request_id, _, endpoint, exc_args, exc_kwargs = ( response.message) if endpoint == NOT_AUTHORISED: raise WampyError( "NOT_AUTHORISED: {} - {}".format( self.client.name, exc_args[0] ) ) raise WampyError( 'oops! wampy has failed, sorry: {}'.format( response.message ) ) if wamp_code != Result.WAMP_CODE: raise WampProtocolError( 'unexpected message code: "%s (%s) %s"', wamp_code, MESSAGE_TYPE_MAP[wamp_code], response[5] ) result = response.value logger.debug("RpcProxy got result: %s", result) return result return wrapper