async def METHOD_NAME(
    self,
    session: ProfileSession,
    message_body: Union[str, bytes],
) -> Tuple[dict, MessageReceipt]:
    """Deserialize an incoming message and further populate the request context.
    Args:
        session: The profile session for providing wallet access
        message_body: The body of the message
    Returns:
        A tuple of the parsed message and a message receipt instance
    Raises:
        WireFormatParseError: If the JSON parsing failed
        WireFormatParseError: If a wallet is required but can't be located
    """
    receipt = MessageReceipt()
    receipt.in_time = time_now()
    receipt.raw_message = message_body
    message_dict = None
    message_json = message_body
    if not message_json:
        raise WireFormatParseError("Message body is empty")
    try:
        message_dict = json.loads(message_json)
    except ValueError:
        raise WireFormatParseError("Message JSON parsing failed")
    if not isinstance(message_dict, dict):
        raise WireFormatParseError("Message JSON result is not an object")
    # packed messages are detected by the absence of @type
    if "@type" not in message_dict:
        try:
            unpack = self.unpack(session, message_body, receipt)
            message_json = await (
                self.task_queue and self.task_queue.run(unpack) or unpack
            )
        except WireFormatParseError:
            LOGGER.debug("Message unpack failed, falling back to JSON")
        else:
            receipt.raw_message = message_json
            try:
                message_dict = json.loads(message_json)
            except ValueError:
                raise WireFormatParseError("Message JSON parsing failed")
            if not isinstance(message_dict, dict):
                raise WireFormatParseError("Message JSON result is not an object")
    # parse thread ID
    thread_dec = message_dict.get("~thread")
    receipt.thread_id = (
        thread_dec and thread_dec.get("thid") or message_dict.get("@id")
    )
    receipt.parent_thread_id = thread_dec.get("pthid") if thread_dec else None
    # handle transport decorator
    transport_dec = message_dict.get("~transport")
    if transport_dec:
        receipt.direct_response_mode = transport_dec.get("return_route")
    LOGGER.debug(f"Expanded message: {message_dict}")
    return message_dict, receipt