feat: 把 A 端的 Session/KCP/视频/控制 都收口到一个本地 daemon 进程里,Django 和输入发送端都改成通过本机 UDS HTTP 去访问它,同时补齐了观测、性能和可用性上的几个关键问题。
This commit is contained in:
59
backend/control/views.py
Normal file
59
backend/control/views.py
Normal 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)
|
||||
Reference in New Issue
Block a user