Be more gentle with frontend typing + go back to fire-and-forget for cracked room creation

This commit is contained in:
Jack Kingsman
2026-03-09 21:51:07 -07:00
parent 3316f00271
commit c3f1a43a80
4 changed files with 59 additions and 8 deletions
+13 -3
View File
@@ -1,6 +1,7 @@
"""Typed WebSocket event contracts and serialization helpers."""
import json
import logging
from typing import Any, Literal
from pydantic import TypeAdapter
@@ -9,6 +10,8 @@ from typing_extensions import NotRequired, TypedDict
from app.models import Channel, Contact, Message, MessagePath, RawPacketBroadcast
from app.routers.health import HealthResponse
logger = logging.getLogger(__name__)
WsEventType = Literal[
"health",
"message",
@@ -82,9 +85,16 @@ def dump_ws_event(event_type: str, data: Any) -> str:
if adapter is None:
return json.dumps({"type": event_type, "data": data})
validated = adapter.validate_python(data)
payload = adapter.dump_python(validated, mode="json")
return json.dumps({"type": event_type, "data": payload})
try:
validated = adapter.validate_python(data)
payload = adapter.dump_python(validated, mode="json")
return json.dumps({"type": event_type, "data": payload})
except Exception:
logger.exception(
"Failed to validate WebSocket payload for event %s; falling back to raw JSON envelope",
event_type,
)
return json.dumps({"type": event_type, "data": data})
def dump_ws_event_payload(event_type: str, data: Any) -> Any: