Ejemplo n.º 1
0
    async def _request_subscripton(self,
                                   web_request: WebRequest) -> Dict[str, Any]:
        args = web_request.get_args()
        conn = web_request.get_connection()

        # Build the subscription request from a superset of all client
        # subscriptions
        sub = args.get('objects', {})
        if conn is None:
            raise self.error(
                "No connection associated with subscription request")
        self.subscriptions[conn] = sub
        all_subs: Dict[str, Any] = {}
        # request superset of all client subscriptions
        for sub in self.subscriptions.values():
            for obj, items in sub.items():
                if obj in all_subs:
                    pi = all_subs[obj]
                    if items is None or pi is None:
                        all_subs[obj] = None
                    else:
                        uitems = list(set(pi) | set(items))
                        all_subs[obj] = uitems
                else:
                    all_subs[obj] = items
        args['objects'] = all_subs
        args['response_template'] = {'method': "process_status_update"}

        result = await self._request_standard(web_request)

        # prune the status response
        pruned_status = {}
        all_status = result['status']
        sub = self.subscriptions.get(conn, {})
        for obj, fields in all_status.items():
            if obj in sub:
                valid_fields = sub[obj]
                if valid_fields is None:
                    pruned_status[obj] = fields
                else:
                    pruned_status[obj] = {
                        k: v
                        for k, v in fields.items() if k in valid_fields
                    }
        result['status'] = pruned_status
        return result
Ejemplo n.º 2
0
 async def _handle_agent_event(self, web_request: WebRequest) -> str:
     conn = web_request.get_connection()
     if not isinstance(conn, WebSocket):
         raise self.server.error("No connection detected")
     if conn.client_data["type"] != "agent":
         raise self.server.error(
             "Only connections of the 'agent' type can send events")
     name = conn.client_data["name"]
     evt_name = web_request.get_str("event")
     if evt_name in ["connected", "disconnected"]:
         raise self.server.error(f"Event '{evt_name}' is reserved")
     data: Optional[Union[List, Dict[str, Any]]]
     data = web_request.get("data", None)
     evt: Dict[str, Any] = {"agent": name, "event": evt_name}
     if data is not None:
         evt["data"] = data
     conn.send_notification("agent_event", [evt])
     return "ok"