Private
Public Access
0
0

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).
This commit is contained in:
2026-06-21 19:26:14 -04:00
parent 0c7a12a3fa
commit 76b10e734d
2 changed files with 5 additions and 2 deletions
+2 -1
View File
@@ -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
+3 -1
View File
@@ -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]:
"""