Migrationen 003–009, Kundaufträge mit Lieferschein, Abräumen mit Urteil, ntfy/Backup/Zeitfenster, Live-Stream und Mobile-Mehr-Menü.
43 lines
935 B
Python
43 lines
935 B
Python
"""Thread-sicherer Pub/Sub für Server-Sent Events (Live-UI)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import threading
|
|
from queue import Empty, Queue
|
|
|
|
_lock = threading.Lock()
|
|
_subscribers: list[Queue] = []
|
|
|
|
|
|
def subscribe() -> Queue:
|
|
q: Queue = Queue(maxsize=256)
|
|
with _lock:
|
|
_subscribers.append(q)
|
|
return q
|
|
|
|
|
|
def unsubscribe(q: Queue) -> None:
|
|
with _lock:
|
|
try:
|
|
_subscribers.remove(q)
|
|
except ValueError:
|
|
pass
|
|
|
|
|
|
def publish(kind: str, payload: dict | None = None) -> None:
|
|
msg = {"kind": kind or "message", "payload": payload if payload is not None else {}}
|
|
with _lock:
|
|
targets = list(_subscribers)
|
|
for q in targets:
|
|
try:
|
|
q.put_nowait(msg)
|
|
except Exception:
|
|
pass
|
|
|
|
|
|
def wait_event(q: Queue, timeout_s: float) -> dict | None:
|
|
try:
|
|
return q.get(timeout=timeout_s)
|
|
except Empty:
|
|
return None
|