feat: 把 B 端的 视频/控制 都收口到一个本地 daemon 进程里
This commit is contained in:
10
python/omnisocket_b_side/__init__.py
Normal file
10
python/omnisocket_b_side/__init__.py
Normal file
@@ -0,0 +1,10 @@
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
PACKAGE_ROOT = Path(__file__).resolve().parent
|
||||
PYTHON_ROOT = PACKAGE_ROOT.parent
|
||||
REPO_ROOT = PYTHON_ROOT.parent
|
||||
DEFAULT_SOCKET_PATH = "/tmp/omnisocket-b-side.sock"
|
||||
DEFAULT_CTRL_SOCKET_PATH = "/tmp/omnisocket-b-ctrl.sock"
|
||||
DEFAULT_CONFIG_PATH = REPO_ROOT / "config" / "b_side_omnidaemon.yaml"
|
||||
VERSION = "0.1.0"
|
||||
5
python/omnisocket_b_side/__main__.py
Normal file
5
python/omnisocket_b_side/__main__.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from .daemon import main
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
54
python/omnisocket_b_side/client.py
Normal file
54
python/omnisocket_b_side/client.py
Normal file
@@ -0,0 +1,54 @@
|
||||
"""Local AF_UNIX SOCK_SEQPACKET client for B-side control delivery."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
import socket
|
||||
|
||||
from omnisocket_a_side.control_codec import CONTROL_PACKET_STRUCT
|
||||
|
||||
from . import DEFAULT_CTRL_SOCKET_PATH
|
||||
|
||||
|
||||
class BSideControlClient:
|
||||
def __init__(self, socket_path: str | None = None) -> None:
|
||||
self.socket_path = socket_path or os.getenv(
|
||||
"OMNIBDAEMON_CTRL_SOCKET",
|
||||
DEFAULT_CTRL_SOCKET_PATH,
|
||||
)
|
||||
self._sock: socket.socket | None = None
|
||||
|
||||
def connect(self) -> None:
|
||||
if not hasattr(socket, "AF_UNIX"):
|
||||
raise OSError("AF_UNIX sockets are not available on this platform")
|
||||
if not hasattr(socket, "SOCK_SEQPACKET"):
|
||||
raise OSError("SOCK_SEQPACKET is not available on this platform")
|
||||
sock = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
|
||||
sock.connect(self.socket_path)
|
||||
self._sock = sock
|
||||
|
||||
def recv_control_packet(self, timeout_ms: int = 100) -> bytes | None:
|
||||
if self._sock is None:
|
||||
raise RuntimeError("B-side control client is not connected")
|
||||
|
||||
self._sock.settimeout(max(0.001, timeout_ms / 1000.0))
|
||||
try:
|
||||
payload = self._sock.recv(CONTROL_PACKET_STRUCT.size)
|
||||
except socket.timeout:
|
||||
return None
|
||||
except BlockingIOError:
|
||||
return None
|
||||
|
||||
if payload == b"":
|
||||
raise ConnectionResetError("daemon control socket closed")
|
||||
if len(payload) != CONTROL_PACKET_STRUCT.size:
|
||||
return None
|
||||
return payload
|
||||
|
||||
def close(self) -> None:
|
||||
if self._sock is None:
|
||||
return
|
||||
try:
|
||||
self._sock.close()
|
||||
finally:
|
||||
self._sock = None
|
||||
1318
python/omnisocket_b_side/daemon.py
Normal file
1318
python/omnisocket_b_side/daemon.py
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user