# TGLock 2.0 architecture

## Local protocols

Один TCP-порт автоматически принимает два типа клиентов:

- MTProto proxy с постоянным 16-байтовым secret — основной режим;
- SOCKS5 без авторизации — режим совместимости.

MTProto init проверяется по secret и transport tag. Из него извлекаются DC,
признак media-соединения и тип транспорта. Для upstream создаётся новый
стандартный obfuscated2 init, а последующий поток пере-шифровывается между
локальным secret и Telegram.

## Transport cascade

Для каждого DC и отдельно для media-соединений строится список маршрутов:

1. сохранённый успешный маршрут;
2. точный Telegram IP с `kwsN` или `kwsN-1` в TLS SNI и WebSocket Host;
3. дополнительный Telegram IP, если он определён;
4. системный DNS;
5. явно настроенный пользователем Cloudflare Worker.

Поддерживаются DC1–5 и media/CDN DC203. DC203 использует WebSocket-host DC2,
но подключается к собственному IP.

После ошибки маршрут получает exponential cooldown от 30 секунд до 30 минут.
Успешный маршрут становится первым для следующего соединения того же DC и
типа трафика.

## TLS policy

Проверка сертификатов и hostname никогда не отключается. При подключении к
заданному Telegram IP TCP destination отделён от URI host: TLS продолжает
проверять сертификат настоящего `kws*.web.telegram.org`.

Cloudflare Worker принимается только как пользовательская настройка. TGLock
не загружает и не скрывает публичные списки чужих доменов.

## Cloudflare Worker contract

Worker должен принимать WebSocket на:

```text
/apiws?dst=<telegram-ip>&dc=<dc-id>
```

и проксировать бинарные frames в TCP `<telegram-ip>:443`. Рекомендуется
добавить собственную авторизацию до стабильного релиза; поэтому Worker
остаётся расширенной опцией alpha-версии.

## Current limitations

- SNI camouflage не включена: небезопасное отключение hostname verification
  из референсной реализации не переносится.
- Голосовые звонки по UDP не поддерживаются.
- Работоспособность медиа зависит от конкретного DC аккаунта и доступности
  Telegram/Cloudflare у провайдера.
- Пулы заранее открытых WebSocket-соединений будут добавлены после измерения,
  что они не создают лишнюю нагрузку и не ухудшают стабильность.
