import logging from utils.ringbuffer import RingBuffer logger = logging.getLogger(__name__) logger.addHandler(logging.NullHandler()) class ClientMessenger(object): """ Handles communication to the client """ def __init__(self): """Init """ self.clear() def clear(self): self.buffer = RingBuffer(256) def get_message_count(self): """ Get the number of errors in the buffer Returns: The number of errors. """ return self.buffer.count() def get_last_messages(self, count): """ Get the 'count' last errors from the buffer Args: count(int): Number of errors to get Returns: The last 'count' errors. """ return self.buffer.get_last(count) def _send(self, message): """ Sends a message to the box The message will be stored in a ring buffer and available for the clients to download later. Args: message: Message to store in the buffer. Note: Only the last 256 messages are kept. """ logger.info(message) self.buffer.put(message) def send_error(self, e): """Raise an asynchronous error""" self._send({'error': e.payload}) def send_event(self, name, payload=None): """Sends an asynchronous message""" if payload and not (isinstance(payload, dict) or isinstance(payload, object)): logger.error("Payload for {} is not an object, ignored: {}".format(name, str(payload))) payload = None self._send({'event': {'name': name, 'payload': payload}}) CLIENT_MESSENGER = ClientMessenger()