From d3572abc0b8b51fd9aa6943eca46c046dbebc272 Mon Sep 17 00:00:00 2001 From: Wolfgang Schoenberger <221313372+wolfiesch@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:25:49 -0700 Subject: [PATCH] fix(rpc): reuse the parsed notification across listener dispatch The Python client parsed and deep-cloned the same payload twice per notification, once for the isinstance checks and once for listener dispatch. --- python/omp-rpc/src/omp_rpc/client.py | 38 +++++++++++++--------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/python/omp-rpc/src/omp_rpc/client.py b/python/omp-rpc/src/omp_rpc/client.py index 6d651ce90..30ac305c7 100644 --- a/python/omp-rpc/src/omp_rpc/client.py +++ b/python/omp-rpc/src/omp_rpc/client.py @@ -1902,7 +1902,6 @@ class RpcClient: self._normalize_host_tool_event(payload) try: notification = parse_notification(payload) - listener_notification = parse_notification(payload) except (TypeError, ValueError) as exc: # Protocol drift must not terminate the reader. This also # demotes parser defects to UnknownNotification; consumers @@ -1910,14 +1909,11 @@ class RpcClient: notification = UnknownNotification( _clone_json_object(payload), parse_error=str(exc) ) - listener_notification = UnknownNotification( - _clone_json_object(payload), parse_error=str(exc) - ) self._dispatch_listeners( "notification", - listener_notification.type, + notification.type, self._notification_listeners, - listener_notification, + notification, ) if isinstance(notification, ReadyEvent): @@ -1926,9 +1922,9 @@ class RpcClient: self._ready.set() self._dispatch_listeners( "ready", - listener_notification.type, + notification.type, self._ready_listeners, - listener_notification, + notification, ) continue @@ -1936,45 +1932,45 @@ class RpcClient: self._ui_requests.put(notification) self._dispatch_listeners( "ui_request", - listener_notification.type, + notification.type, self._ui_request_listeners, - cast(ExtensionUiRequest, listener_notification), + notification, ) continue if isinstance(notification, ExtensionError): self._dispatch_listeners( "extension_error", - listener_notification.type, + notification.type, self._extension_error_listeners, - cast(ExtensionError, listener_notification), + notification, ) continue if isinstance(notification, UnknownNotification): self._dispatch_listeners( "unknown_notification", - listener_notification.type, + notification.type, self._unknown_notification_listeners, - cast(UnknownNotification, listener_notification), + notification, ) continue - listener_event = cast(RpcAgentEvent, listener_notification) + event = cast(RpcAgentEvent, notification) self._append_event(payload) if ( - isinstance(listener_event, AgentEndEvent) - and listener_event.is_terminal is not False + isinstance(event, AgentEndEvent) + and event.is_terminal is not False ): self._mark_agent_run_completed() self._dispatch_listeners( - "event", listener_event.type, self._event_listeners, listener_event + "event", event.type, self._event_listeners, event ) self._dispatch_listeners( "typed_event", - listener_event.type, - self._typed_event_listeners.get(listener_event.type, []), - listener_event, + event.type, + self._typed_event_listeners.get(event.type, []), + event, ) except Exception as exc: self._mark_closed(exc)