def read_cbor_message(self):
        """
        Try to read a single cbor (response) message from the underlying interface.
        Respects the any read timeout.
        If any 'log' messages are received, logs them locally at the nearest corresponding level
        and awaits the next message.  Returns when it receives what appears to be a reply message.

        Returns
        -------
        dict
            The message received, as a dict
        """
        while True:
            # 'self' is sufficiently 'file-like' to act as a load source.
            # Throws EOFError on end of stream/timeout/lost-connection etc.
            message = cbor.load(self)

            if isinstance(message, collections.abc.Mapping):
                # A message response (to a prior request)
                if 'id' in message:
                    logger.info("Received msg: {}".format(_hexlify(message)))
                    return message

                # A log message - handle as normal
                if 'log' in message:
                    response = message['log']
                    log_method = device_logger.error
                    try:
                        response = message['log'].decode("utf-8")
                        log_methods = {
                            'E': device_logger.error,
                            'W': device_logger.warning,
                            'I': device_logger.info,
                            'D': device_logger.debug,
                            'V': device_logger.debug,
                        }
                        if len(response) > 1 and response[1] == ' ':
                            lvl = response[0]
                            log_method = log_methods.get(lvl, device_logger.error)
                    except Exception as e:
                        logger.error('Error processing log message: {}'.format(e))
                    log_method('>> {}'.format(response))
                    continue

            # Unknown/unhandled/unexpected message
            logger.error("Unhandled message received")
            device_logger.error(message)

        Try to read a single cbor (response) message from the underlying interface.
        Respects the any read timeout.
        If any 'log' messages are received, logs them locally at the nearest corresponding level
        and awaits the next message.  Returns when it receives what appears to be a reply message.

        Returns
        -------
        dict
            The message received, as a dict
        
electrum/plugins/jade/jadepy/jade.py