From 76b10e734d7dcc5b529d7258dfc81362813dad02 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Sun, 21 Jun 2026 19:26:14 -0400 Subject: [PATCH] fix(broadcast): migrate WebSocketServer.broadcast() callers to WebSocketMessage signature Phase 5 of any_type_componentization_20260621 changed WebSocketServer.broadcast(channel, payload) -> broadcast(message: WebSocketMessage) but did not update internal callers. This produced worker[queue_fallback] TypeError spam on the GUI thread. Fixed 2 sites: - src/app_controller.py:1849 _process_pending_gui_tasks (telemetry broadcast) - src/events.py:115 AsyncEventQueue.put (events broadcast) gui_2.py has no internal broadcast callers (grep verified). Both callers now construct WebSocketMessage(channel=, payload=) at the call site. test_websocket_broadcast_regression.py 4/4 pass (was 1/4 failing in red phase). --- src/app_controller.py | 3 ++- src/events.py | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/app_controller.py b/src/app_controller.py index 458f0901..a8913759 100644 --- a/src/app_controller.py +++ b/src/app_controller.py @@ -1841,12 +1841,13 @@ class AppController: def _process_pending_gui_tasks(self) -> None: """Processes pending GUI tasks from the queue on the main render thread.""" + from src.api_hooks import WebSocketMessage now = time.time() if hasattr(self, 'event_queue') and hasattr(self.event_queue, 'websocket_server') and self.event_queue.websocket_server: if now - self._last_telemetry_time >= 1.0: self._last_telemetry_time = now metrics = self.perf_monitor.get_metrics() - self.event_queue.websocket_server.broadcast("telemetry", metrics) + self.event_queue.websocket_server.broadcast(WebSocketMessage(channel="telemetry", payload=metrics)) if not self._pending_gui_tasks: return diff --git a/src/events.py b/src/events.py index 7082ed11..814a6bc2 100644 --- a/src/events.py +++ b/src/events.py @@ -34,6 +34,8 @@ import queue from pathlib import Path from typing import Callable, Any, Dict, List, Tuple, Optional +from src.api_hooks import WebSocketMessage + class EventEmitter: """ @@ -112,7 +114,7 @@ class AsyncEventQueue: elif hasattr(payload, '__dict__'): serializable_payload = vars(payload) - self.websocket_server.broadcast("events", {"event": event_name, "payload": serializable_payload}) + self.websocket_server.broadcast(WebSocketMessage(channel="events", payload={"event": event_name, "payload": serializable_payload})) def get(self) -> Tuple[str, Any]: """