cl / colab_tunnel /_registry.py
rottenstuff's picture
Upload 13 files
c0e2219 verified
Raw
History Blame Contribute Delete
3.36 kB
"""
Реестр провайдеров туннелей.
Регистрация нового провайдера:
@tunnel_provider('myprovider')
def get_myprovider_url(port: int) -> str: ...
Отключить провайдера (сервис временно недоступен):
@tunnel_provider('tunwg', enabled=False)
# или в рантайме:
disable_provider('tunwg')
Включить обратно:
enable_provider('tunwg')
Посмотреть статус всех:
list_providers()
"""
from typing import Callable
# Активные провайдеры — используются get_share_link(), try_all(), benchmark()
proxies_functions: dict[str, Callable[[int], str]] = {}
# Все зарегистрированные провайдеры (активные + отключённые)
_all_providers: dict[str, Callable[[int], str]] = {}
# Имена отключённых провайдеров
_disabled_providers: set[str] = set()
def tunnel_provider(name: str, *, enabled: bool = True) -> Callable:
"""
Декоратор регистрации провайдера туннеля.
Args:
name: Уникальное имя провайдера.
enabled: False — провайдер зарегистрирован, но не активен.
Включить позднее через enable_provider(name).
"""
def decorator(func: Callable[[int], str]) -> Callable[[int], str]:
_all_providers[name] = func
if enabled:
proxies_functions[name] = func
else:
_disabled_providers.add(name)
return func
return decorator
def disable_provider(name: str) -> None:
"""
Деактивирует провайдера: убирает из активного реестра.
Функция сохраняется — включить обратно через enable_provider().
Raises:
KeyError: Провайдер с таким именем не зарегистрирован.
"""
if name not in _all_providers:
raise KeyError(f'Провайдер "{name}" не зарегистрирован. Доступные: {list(_all_providers)}')
proxies_functions.pop(name, None)
_disabled_providers.add(name)
def enable_provider(name: str) -> None:
"""
Активирует ранее отключённого провайдера.
Raises:
KeyError: Провайдер с таким именем не зарегистрирован.
"""
if name not in _all_providers:
raise KeyError(f'Провайдер "{name}" не зарегистрирован. Доступные: {list(_all_providers)}')
_disabled_providers.discard(name)
proxies_functions[name] = _all_providers[name]
def list_providers() -> dict[str, bool]:
"""
Возвращает статус всех зарегистрированных провайдеров.
Returns:
Словарь {имя: активен}, в порядке регистрации.
Пример вывода:
{'cloudflared': True, 'tunwg': False, 'bore': True, ...}
"""
return {name: (name not in _disabled_providers) for name in _all_providers}