Source code for bitcoincash.electrum.protocol

#
# Implement an asyncio.Protocol for Electrum (clients)
#
#
import asyncio, json
import logging

logger = logging.getLogger(__name__)

[docs]class StratumProtocol(asyncio.Protocol): client = None closed = False transport = None buf = b""
[docs] def connection_made(self, transport): self.transport = transport logger.debug("Transport connected ok")
[docs] def connection_lost(self, exc): if not self.closed: self.closed = True self.close() self.client._connection_lost(self)
[docs] def data_received(self, data): self.buf += data # Unframe the mesage. Expecting JSON. *lines, self.buf = self.buf.split(b'\n') for line in lines: if not line: continue try: msg = line.decode('utf-8', "error").strip() except UnicodeError as exc: logger.exception("Encoding issue on %r" % line) self.connection_lost(exc) return try: msg = json.loads(msg) except ValueError as exc: logger.exception("Bad JSON received from server: %r" % msg) self.connection_lost(exc) return #logger.debug("RX:\n%s", json.dumps(msg, indent=2)) try: self.client._got_response(msg) except Exception as e: logger.exception("Trouble handling response! (%s)" % e) continue
[docs] def send_data(self, message): ''' Given an object, encode as JSON and transmit to the server. ''' #logger.debug("TX:\n%s", json.dumps(message, indent=2)) data = json.dumps(message).encode('utf-8') + b'\n' self.transport.write(data)
[docs] def close(self): if not self.closed: try: self.transport.close() finally: self.closed = True
# EOF