""" colab-tunnel — утилиты для туннелирования веб-интерфейсов в Google Colab. Быстрый старт: from colab_tunnel import get_share_link link = get_share_link('srvus', 7860) print(link) Запуск всех провайдеров параллельно: from colab_tunnel import try_all print(try_all(7860)) Бенчмарк — найти лучший провайдер прямо сейчас: from colab_tunnel import benchmark results = benchmark() print(results) Добавить собственный провайдер: from colab_tunnel import tunnel_provider @tunnel_provider('myprovider') def get_myprovider_url(port: int) -> str: ... """ from concurrent.futures import ThreadPoolExecutor, as_completed from ._config import WORK_FOLDER from ._logger import logger from ._registry import proxies_functions, tunnel_provider, list_providers, enable_provider, disable_provider from ._utils import run, download # Импорт модулей регистрирует провайдеров через @tunnel_provider from . import _tunnels # noqa: F401 from . import _ssh # noqa: F401 # Прямой доступ к функциям провайдеров (обратная совместимость) from ._tunnels import ( get_tmole_url, get_tunwg_url, get_cloudflared_url, get_localt_url, get_gradio_url, get_native_url, get_mmar_url, get_tunnelite_url, get_beeceptor_url, get_bore_url, get_boredigital_url, ) from ._ssh import ( get_optimistix_url, get_srvus_url, get_serveo_url, get_localhostrun_url, ) from ._diagnostics import benchmark, TunnelBenchmarkResult __version__ = '1.1.0' __all__ = [ # Основной API 'get_share_link', 'try_all', 'benchmark', 'TunnelBenchmarkResult', # Реестр (для расширения) 'disable_provider', 'enable_provider', 'list_providers', 'proxies_functions', 'tunnel_provider', # Провайдеры (прямой доступ) 'get_tmole_url', 'get_tunwg_url', 'get_cloudflared_url', 'get_localt_url', 'get_gradio_url', 'get_native_url', 'get_mmar_url', 'get_tunnelite_url', 'get_beeceptor_url', 'get_bore_url', 'get_boredigital_url', 'get_optimistix_url', 'get_srvus_url', 'get_serveo_url', 'get_localhostrun_url', # Утилиты 'download', 'run', 'WORK_FOLDER', 'logger', ] def try_all(port: int) -> str: """ Параллельно запускает все зарегистрированные провайдеры туннелей. В отличие от benchmark(), не измеряет метрики точно, зато возвращает все работающие ссылки в разы быстрее — за время самого медленного провайдера вместо суммы времён всех провайдеров. Args: port: Локальный порт для туннелирования. Returns: Строка со всеми полученными ссылками в формате 'провайдер: URL'. """ results: list[str] = [] with ThreadPoolExecutor(max_workers=len(proxies_functions)) as executor: futures = { executor.submit(func, port): name for name, func in proxies_functions.items() } for future in as_completed(futures): name = futures[future] try: url = future.result() results.append(f'{name}: {url}') except Exception as e: logger.warning(f'[try_all] {name}: {e}') return '\n'.join(results) def get_share_link(host: str, port: int) -> str: """ Получает публичную ссылку на локальный порт через указанный туннель. Args: host: Имя провайдера или 'all' для параллельного запуска всех. Доступные провайдеры: list(proxies_functions.keys()). port: Локальный порт веб-интерфейса. Returns: Публичная URL-ссылка (или несколько строк при host='all'). """ if host in proxies_functions: return proxies_functions[host](port) if host == 'all': return try_all(port) available = ', '.join(proxies_functions.keys()) return f'Провайдер "{host}" не найден. Доступные: {available}'