feat(node): push USB changes and preserve sensor setup across sessions
This commit is contained in:
@@ -2,11 +2,15 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import ipaddress
|
||||
import json
|
||||
from contextlib import suppress
|
||||
from typing import Annotated
|
||||
from urllib.parse import urlsplit
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request, Response
|
||||
from fastapi.responses import StreamingResponse
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
|
||||
from k1link.fleet.registry import FleetRegistry
|
||||
@@ -53,6 +57,31 @@ def fleet_list(response: Response, fleet: Annotated[FleetRegistry, Depends(local
|
||||
return fleet.listing()
|
||||
|
||||
|
||||
@router.get("/events")
|
||||
async def fleet_events(fleet: Annotated[FleetRegistry, Depends(local_operator)]):
|
||||
async def stream():
|
||||
queue, close = fleet.events.subscribe()
|
||||
try:
|
||||
while not fleet.stop.is_set():
|
||||
# Full replacement snapshots recover missed events/reconnections.
|
||||
# The timeout updates link expiry locally; it never queries a Node.
|
||||
value = await asyncio.to_thread(fleet.listing)
|
||||
yield "retry: 3000\ndata: " + json.dumps(value) + "\n\n"
|
||||
with suppress(TimeoutError):
|
||||
await asyncio.wait_for(queue.get(), timeout=5)
|
||||
finally:
|
||||
close()
|
||||
|
||||
return StreamingResponse(
|
||||
stream(),
|
||||
media_type="text/event-stream",
|
||||
headers={
|
||||
"Cache-Control": "no-store",
|
||||
"X-Accel-Buffering": "no",
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@router.post("/preview")
|
||||
def fleet_preview(
|
||||
body: PreviewRequest,
|
||||
|
||||
Reference in New Issue
Block a user