Private
Public Access
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:
@@ -1841,12 +1841,13 @@ class AppController:
|
|||||||
|
|
||||||
def _process_pending_gui_tasks(self) -> None:
|
def _process_pending_gui_tasks(self) -> None:
|
||||||
"""Processes pending GUI tasks from the queue on the main render thread."""
|
"""Processes pending GUI tasks from the queue on the main render thread."""
|
||||||
|
from src.api_hooks import WebSocketMessage
|
||||||
now = time.time()
|
now = time.time()
|
||||||
if hasattr(self, 'event_queue') and hasattr(self.event_queue, 'websocket_server') and self.event_queue.websocket_server:
|
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:
|
if now - self._last_telemetry_time >= 1.0:
|
||||||
self._last_telemetry_time = now
|
self._last_telemetry_time = now
|
||||||
metrics = self.perf_monitor.get_metrics()
|
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
|
if not self._pending_gui_tasks: return
|
||||||
|
|
||||||
|
|||||||
+3
-1
@@ -34,6 +34,8 @@ import queue
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Callable, Any, Dict, List, Tuple, Optional
|
from typing import Callable, Any, Dict, List, Tuple, Optional
|
||||||
|
|
||||||
|
from src.api_hooks import WebSocketMessage
|
||||||
|
|
||||||
|
|
||||||
class EventEmitter:
|
class EventEmitter:
|
||||||
"""
|
"""
|
||||||
@@ -112,7 +114,7 @@ class AsyncEventQueue:
|
|||||||
elif hasattr(payload, '__dict__'):
|
elif hasattr(payload, '__dict__'):
|
||||||
serializable_payload = vars(payload)
|
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]:
|
def get(self) -> Tuple[str, Any]:
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user