zapret-kvn/xray_fluent/engines/sidecar/__init__.py
loop-uh ab0384c1a5 Менеджеры ядер на шаговой модели: без блокировок и processEvents в GUI
sing-box, Hysteria, Amnezia и Zapret получили start_steps/stop_steps по
образцу XrayManager: ожидания процессов — сигналы QProcess (wait_process_*),
пробы портов/релея, sing-box check, поиск осиротевших процессов (PowerShell),
WinAPI-резолв аплинка и PUT Clash API — в run_in_worker, паузы — таймеры.
Синхронные start()/stop() остались драйверами тех же шагов для выхода из
приложения и тестов.

- sing-box: запись конфига + check в воркере, готовность прокси/TUN и снятие
  TUN-адаптера — шагами; should_continue прерывает устаревший старт без
  ложной ошибки; request_stop() — kill без ожидания для обработчиков сигналов.
- Clash API: select_outbound_when_ready_steps (попытка в воркере, пауза таймером).
- Hysteria: повтор без Chrome-parrot выполняется внутри идущего start_steps,
  а вне старта — собственным TransitionRunner, без вложенного start().
- Amnezia: physical_network_steps, ожидание relay_ready/рукопожатия шагами.
- Zapret: start() асинхронный (ожидание выхода прежнего winws2, поиск
  осиротевших, пауза драйвера — шаги), stop() без waitForFinished; блокирующее
  ожидание оставлено только для выхода (wait=True).
- async_steps: run_in_worker(executor=...), жёсткий дедлайн шага (60 с) в
  обоих драйверах; run_steps_blocking падает TypeError на не-генераторе и на
  не-шаге вместо бесконечного цикла (Mock.send() в тестах раздувал память).
2026-09-26 13:25:55 +03:00

18 lines
937 B
Python

"""Shared standard for local sidecar cores that sit behind the sing-box front.
Every native transport core (AmneziaWG, Hysteria2, xray) is launched as a local
loopback SOCKS relay that the sing-box front dials through — the front is the
sole OS-facing inbound, each core keeps its own clean protocol implementation.
The *seam* between the front and each core is identical regardless of protocol:
the loopback listener must accept a TCP connection before the front can use it.
This package holds that shared contract so each core manager stops
reimplementing it. Protocol-specific concerns (config handoff, handshake
detection, failure taxonomy, recovery policy) deliberately stay in each engine.
"""
from __future__ import annotations
from .readiness import probe_loopback_relay, wait_for_loopback_relay, wait_for_loopback_relay_steps
__all__ = ["probe_loopback_relay", "wait_for_loopback_relay", "wait_for_loopback_relay_steps"]