def on_message(self, ws: websocket.WebSocketApp, message: str) -> None:
        """Callback for incoming websocket message from relay.

        The message can be in one of two formats:
        1. ExternalActionRequest - just one plain action request
        2. SlackActionsMessage - has multiple grouped action requests
        """

        try:
            incoming_event = self._parse_websocket_message(message)
        except Exception:
            logging.error(f"Failed to parse incoming event {message}", exc_info=True)
            return

        if isinstance(incoming_event, SlackActionsMessage):
            # slack callbacks have a list of 'actions'. Within each action there a 'value' field,
            # which container the actual action details we need to run.
            # This wrapper format is part of the slack API, and cannot be changed by us.
            for slack_action_request in incoming_event.actions:
                self._process_action(slack_action_request.value, validate_timestamp=False)
        else:
            self._process_action(incoming_event, validate_timestamp=True)
Callback for incoming websocket message from relay.

        The message can be in one of two formats:
        1. ExternalActionRequest - just one plain action request
        2. SlackActionsMessage - has multiple grouped action requests
        
src/robusta/integrations/receiver.py