| 11 | |
| 12 | |
| 13 | class StdRpcEndpointController(object): |
| 14 | def __init__(self, transport, reactor): |
| 15 | super(StdRpcEndpointController, self).__init__() |
| 16 | self.transport = transport |
| 17 | self.reactor = reactor |
| 18 | |
| 19 | def deserialize(self, data): |
| 20 | if six.PY3 and not isinstance(data, six.text_type): |
| 21 | data = data.decode('utf-8') |
| 22 | return json.loads(data) |
| 23 | |
| 24 | def serialize(self, packet): |
| 25 | return json.dumps(packet) |
| 26 | |
| 27 | def serve_forever(self): |
| 28 | while True: |
| 29 | cid, data = self.transport.update() |
| 30 | if data: |
| 31 | packet = self.deserialize(data) |
| 32 | if 'method' in packet: |
| 33 | result = self.reactor.handle_request(packet) |
| 34 | sres = self.serialize(result) |
| 35 | self.transport.send(cid, sres) |
| 36 | else: |
| 37 | self.reactor.handle_response(packet) |
| 38 | |
| 39 | def call(self, method, *args, **kwargs): |
| 40 | req = self.reactor.build_request(method, *args, **kwargs) |
| 41 | rid = req['id'] |
| 42 | sreq = self.serialize(req) |
| 43 | self.transport.send(None, sreq) |
| 44 | while True: |
| 45 | time.sleep(0.004) |
| 46 | res = self.reactor.get_result(rid) |
| 47 | if res is not None: |
| 48 | if 'result' in res: |
| 49 | return res['result'] |
| 50 | |
| 51 | if 'error' in res: |
| 52 | raise RpcRemoteException(res['error']['message']) |
| 53 | |
| 54 | raise RuntimeError('Invalid response from {}. Got {}'.format(self.transport, res)) |
no outgoing calls
no test coverage detected