feat: 把 A 端的 Session/KCP/视频/控制 都收口到一个本地 daemon 进程里,Django 和输入发送端都改成通过本机 UDS HTTP 去访问它,同时补齐了观测、性能和可用性上的几个关键问题。

This commit is contained in:
2026-04-01 15:48:13 +08:00
parent b6105450a1
commit aca23e91d7
12 changed files with 242 additions and 325 deletions

59
backend/control/views.py Normal file
View File

@@ -0,0 +1,59 @@
from __future__ import annotations
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .services import OmniDaemonError, control_service
@api_view(["GET"])
def control_status(request):
try:
return Response(control_service.get_status())
except OmniDaemonError as error:
return Response(
{
"connected": False,
"queue_depth": 0,
"last_seq_id": None,
"last_error": str(error),
"peer_id": "",
"target_peer": "",
},
status=503,
)
@api_view(["POST"])
def control_event(request):
event_code = str(request.data.get("event_code", "")).strip()
if not event_code:
return Response({"error": "event_code is required"}, status=400)
try:
drive_value = float(request.data.get("drive_value", 1.0))
except (TypeError, ValueError):
return Response({"error": "drive_value must be numeric"}, status=400)
raw_client_time_ms = request.data.get("client_time_ms")
if raw_client_time_ms in (None, ""):
client_time_ms = None
else:
try:
client_time_ms = int(raw_client_time_ms)
except (TypeError, ValueError):
return Response({"error": "client_time_ms must be an integer"}, status=400)
source = str(request.data.get("source", "django-api")).strip() or "django-api"
try:
payload = control_service.send_event(
event_code=event_code,
drive_value=drive_value,
source=source,
client_time_ms=client_time_ms,
)
except OmniDaemonError as error:
return Response({"error": str(error)}, status=503)
return Response(payload, status=200 if payload.get("accepted") else 503)