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() в тестах раздувал память).
18 lines
937 B
Python
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"]
|