docs: update transport compatibility docs

This commit is contained in:
zarazaex69
2026-05-14 20:22:37 +03:00
parent 6ba8fcdbe8
commit af87120f73
6 changed files with 159 additions and 84 deletions
+119 -52
View File
@@ -93,6 +93,19 @@
**2026-05-07..10** - финальная полировка: исправлен throughput bug в vp8channel (ограничение было в 32 раза ниже реального), документация, SEI конфигурация, SOCKS5 аутентификация (username/password).
**2026-05-11..14** - большой архитектурный рефакторинг `refactor/universal-carrier`:
- Разделение `internal/provider/` на `internal/engine/` (wire-level SFU протоколы) + `internal/auth/` (HTTP/API авторизация)
- Три engine: `livekit` (WB Stream), `goolom` (Telemost), `salutejazz` (Jazz)
- Три auth: `wbstream`, `telemost`, `salutejazz`
- Замена `-carrier` на `-auth`/`-engine`/`-url`/`-token`
- Публичный Go API `pkg/olcrtc` (net.Conn через Session.Dial) для встраивания в sing-box и другие
- `cmd/olcrtc-cgo` — C-shared библиотека с Ping API
- YAML конфигурация вместо CLI-флагов (`internal/config/`)
- Протокол handshake (`internal/handshake/`) с CLIENT_HELLO/SERVER_WELCOME
- Session callbacks: OnSessionOpen, OnSessionClose, OnTraffic
- Перевод документации на русский
- E2E тесты: jazz non-data транспорты помечены как expected fail
### Статья на Хабре
Проект описан в двух статьях на Хабре:
@@ -145,11 +158,16 @@
```
cmd/olcrtc/ CLI entrypoint, загрузка YAML конфига
cmd/olcrtc-cgo/ C-shared библиотека (Ping API для десктопных клиентов)
pkg/olcrtc/ Публичный Go API (net.Conn через Session.Dial)
internal/config/ Загрузка и маппинг YAML конфига
internal/app/session/ конфигурация, валидация, роутинг в server/client
│ │
internal/server/ internal/client/ бизнес-логика: SOCKS5, smux
internal/handshake/ Протокол handshake (CLIENT_HELLO / SERVER_WELCOME)
internal/muxconn/ io.ReadWriteCloser поверх link.Link + AEAD
internal/link/direct/ pass-through, пробрасывает в transport
@@ -161,13 +179,18 @@ internal/transport/ интерфейс Transport + реестр
└── videochannel/ QR-коды / тайлы в VP8 видеофрейме через ffmpeg
internal/carrier/ интерфейс Carrier + реестр
├── builtin/ регистрация провайдеров
├── builtin/ регистрация engine+auth → carrier
└── bytestream.go ByteStream, VideoTrack capability
internal/provider/ WebRTC реализации
├── jazz/ SaluteJazz (salutejazz.ru)
├── telemost/ Yandex Telemost (telemost.yandex.ru)
└── wbstream/ WB Stream (stream.wb.ru) через LiveKit SDK
internal/engine/ Wire-level SFU протоколы (URL+Token → WebRTC)
├── livekit/ LiveKit (WB Stream)
├── goolom/ Goolom (Yandex Telemost)
└── salutejazz/ SaluteJazz (Сбер)
internal/auth/ HTTP/API авторизация → Credentials для engine
├── wbstream/ WB Stream API (guest register, join, token)
├── telemost/ Yandex Telemost (connection-info)
└── salutejazz/ SaluteJazz (create-meeting, preconnect)
internal/crypto/ ChaCha20-Poly1305 AEAD
internal/names/ генератор имён участников
@@ -186,13 +209,12 @@ internal/e2e/ E2E тесты на реальных провайдер
| Файл/папка | Что это |
|---|---|
| `readme.md` | Краткое описание, команды сборки, ссылки |
| `about.md` | Этот документ |
| `SECURITY.md` | Политика безопасности |
| `magefile.go` | Система сборки на Mage (аналог Makefile для Go). Таргеты: `build`, `cross`, `mobile`, `docker`, `podman`, `lint`, `test`, `e2e` |
| `magefile.go` | Система сборки на Mage (аналог Makefile для Go). Таргеты: `build`, `buildCLI`, `cross`, `mobile`, `docker`, `podman`, `lint`, `test`, `e2e`, `deps`, `clean` |
| `Dockerfile` | Многоэтапный образ: Alpine build → Alpine runtime с непривилегированным пользователем `olcrtc` |
| `docker-compose.server.yml` | Compose для серверного режима |
| `.gitmodules` | Субмодуль `internal/transport/videochannel/gr` - кастомные кодеки QR и tile |
| `.golangci.yml` | Конфиг линтера golangci-lint |
| `.golangci.yml` | Конфиг линтера golangci-lint v2 |
| `.github/workflows/ci.yml` | CI: тесты, покрытие, E2E, lint, сборка CLI для всех платформ, сборка Android AAR |
### `cmd/olcrtc/`
@@ -202,6 +224,12 @@ internal/e2e/ E2E тесты на реальных провайдер
| `main.go` | Точка входа. Загружает YAML конфиг (`olcrtc config.yaml`), настраивает логирование, подавляет шум LiveKit/pion в не-debug режиме, запускает `session.Run` или `session.Gen`. Graceful shutdown по SIGTERM/SIGINT с 5-секундным таймаутом |
| `main_test.go` | Юнит-тесты CLI: валидация конфига, режимы, edge cases |
### `cmd/olcrtc-cgo/`
| Файл | Что делает |
|---|---|
| `main.go` | C-shared библиотека. Экспортирует функцию `Ping()` для десктопных клиентов: запускает короткоживущий olcRTC клиент, ждёт SOCKS listener, делает HTTP ping через него и возвращает latency в миллисекундах. Используется для проверки связности из нативных приложений |
### `internal/app/session/`
| Файл | Что делает |
@@ -209,6 +237,20 @@ internal/e2e/ E2E тесты на реальных провайдер
| `session.go` | Главная точка конфигурации. `RegisterDefaults()` регистрирует все carriers, links, transports. `Validate()` проверяет все настройки. `Run()` роутит в `server.Run` или `client.Run`. `Gen()` генерирует Room ID для jazz с ретраями (wbstream больше не поддерживает автогенерацию - руму нужно создавать вручную через stream.wb.ru) |
| `session_test.go` | Тесты валидации конфига |
### `internal/config/`
| Файл | Что делает |
|---|---|
| `config.go` | Загрузка и парсинг YAML конфига. `Load(path)` читает файл, `Apply(dst, f)` маппит YAML поля в `session.Config`. Все структуры YAML: `File`, `Auth`, `Room`, `Crypto`, `Net`, `SOCKS`, `Engine`, `Video`, `VP8`, `SEI`, `Gen` |
| `config_test.go` | Тесты загрузки и маппинга |
### `internal/handshake/`
| Файл | Что делает |
|---|---|
| `handshake.go` | Протокол handshake на контрольном smux-стриме. Wire format: 4-byte big-endian length + JSON. Клиент шлёт `CLIENT_HELLO` (device ID, claims), сервер отвечает `SERVER_WELCOME` (session ID) или `REJECT`. После handshake контрольный стрим остаётся открытым для keepalive |
| `handshake_test.go` | Тесты |
### `internal/server/`
| Файл | Что делает |
@@ -263,24 +305,26 @@ internal/e2e/ E2E тесты на реальных провайдер
| `carrier.go` | Интерфейс `Session` + реестр. `Capabilities` описывает что умеет carrier: ByteStream и/или VideoTrack |
| `bytestream.go` | `ByteStream` и `VideoTrack` интерфейсы |
| `carrier_test.go` | Тесты |
| `builtin/register.go` | Регистрирует jazz, telemost, wbstream в реестре carrier |
| `builtin/provider_adapter.go` | Адаптер `provider.Provider``carrier.Session` |
| `builtin/register.go` | Регистрирует jazz, telemost, wbstream, none в реестре carrier через `registerEngineAuth` (связывает auth provider с engine) и `registerDirect` (прямое подключение без auth) |
| `builtin/engine_adapter.go` | Адаптер `engine.Session``carrier.Session`. Связывает auth provider (Issue → Credentials) с engine (Connect с URL+Token). Поддерживает Refresh callback для engines, требующих свежие credentials при реконнекте (Goolom) |
### `internal/provider/`
### `internal/engine/`
| Файл | Что делает |
|---|---|
| `provider.go` | Интерфейс `Provider`: Connect, Send, Close, SetReconnectCallback, WatchConnection, CanSend, GetSendQueue, AddVideoTrack и т.д. |
| `jazz/provider.go` | SaluteJazz провайдер. Обёртка над `Peer` |
| `jazz/peer.go` | WebRTC peer для jazz. Signaling через HTTP API SaluteJazz. Автопереподключение, очередь отправки, backpressure |
| `jazz/api.go` | HTTP клиент API SaluteJazz: создание комнаты, получение SDP |
| `jazz/datapacket.go` | Protobuf-style пакетное кодирование сообщений DataChannel jazz (специфика протокола jazz) |
| `telemost/provider.go` | Yandex Telemost провайдер |
| `telemost/peer.go` | WebRTC peer для Telemost. Signaling через WebSocket. Двухуровневый keepalive (WS ping + app ping). Автопереподключение |
| `telemost/api.go` | HTTP/WS клиент API Telemost |
| `wbstream/provider.go` | WB Stream провайдер через LiveKit SDK |
| `wbstream/peer.go` | WebRTC peer для wbstream. Самый стабильный провайдер - минимальная прослойка, почти прямой relay |
| `wbstream/api.go` | API клиент wbstream: создание стрима/комнаты |
| `engine.go` | Интерфейс `Session` (Connect, Send, Close, WatchConnection, CanSend и т.д.) + `Factory` + реестр. `Config` содержит URL, Token, Extra, OnData, DNSServer, Refresh callback. `Capabilities`: ByteStream, VideoTrack |
| `livekit/engine.go` | LiveKit engine — используется WB Stream. Подключается через LiveKit SDK, публикует/подписывается на DataChannel и VideoTrack |
| `goolom/engine.go` | Goolom engine — проприетарный протокол Яндекса (Telemost). WebSocket signaling, dual pub/sub PeerConnections, DataChannel, telemetry. Использует `Refresh` callback для получения свежих credentials при реконнекте |
| `salutejazz/engine.go` | SaluteJazz engine — протокол Сбера. WebSocket + SDP signaling, pub/sub split, `_reliable` DataChannel, length-prefixed DataPacket envelope |
### `internal/auth/`
| Файл | Что делает |
|---|---|
| `auth.go` | Интерфейс `Provider` (Engine, DefaultServiceURL, Issue) + `RoomCreator` + реестр. `Credentials`: URL, Token, Extra |
| `wbstream/provider.go` | WB Stream auth: guest register → join room → token exchange. Реализует `RoomCreator`. `Engine()``"livekit"`, `DefaultServiceURL()``"https://stream.wb.ru"` |
| `telemost/provider.go` | Yandex Telemost auth: HTTP connection-info → engine credentials. `Engine()``"goolom"`, `DefaultServiceURL()``"https://telemost.yandex.ru"` |
| `salutejazz/provider.go` | SaluteJazz auth: create-meeting + preconnect flow. Реализует `RoomCreator`. `Engine()``"salutejazz"`. Принимает room в формате `<roomID>:<password>` |
### `internal/crypto/`
@@ -316,6 +360,15 @@ internal/e2e/ E2E тесты на реальных провайдер
|---|---|
| `tunnel_test.go` | E2E тесты на реальных провайдерах. Матрица всех carrier × transport комбинаций. Запускается с флагом `-olcrtc.real-e2e`. В CI запускается на каждый push |
### `pkg/olcrtc/`
| Файл | Что делает |
|---|---|
| `olcrtc.go` | Публичный Go API для встраивания olcrtc как библиотеки. `New(ctx, Config)` создаёт `Session`. Два режима: direct engine (URL+Token) или built-in auth (Auth+RoomID). `Session.Connect()`, `Send()`, `Close()`, `WatchConnection()`, `SetEndedCallback()` |
| `conn.go` | `Session.Dial(ctx)``net.Conn`. Реализует `net.Conn` через `io.Pipe`: `Read` из pipe (заполняется OnData), `Write` через engine.Send. Для интеграции с sing-box и другими io.ReadWriter потребителями |
| `olcrtc_test.go` | Тесты публичного API |
| `tunnel/` | Подпакет для высокоуровневого туннелирования |
### `mobile/`
| Файл | Что делает |
@@ -359,11 +412,15 @@ internal/e2e/ E2E тесты на реальных провайдер
| Файл | Что делает |
|---|---|
| `about.md` | Этот документ — полная документация проекта |
| `fast.md` | Быстрый старт через скрипты (Podman) |
| `manual.md` | Мануальная сборка: Go, mage, кросс-компиляция, все шаги |
| `settings.md` | Матрица совместимости carrier×transport, описание всех YAML полей, готовые примеры конфигов |
| `uri.md` | URI формат для клиентских приложений: `olcrtc://<Carrier>?<Transport>@<RoomID>#<Key>$<MIMO>` |
| `configuration.md` | Краткая справка по YAML схеме |
| `uri.md` | URI формат для клиентских приложений: `olcrtc://<Auth>?<Transport>@<RoomID>#<Key>$<MIMO>` |
| `sub.md` | Формат подписок: список серверов в одном файле с метаданными |
| `server.example.yaml` | Полный пример серверного YAML конфига |
| `client.example.yaml` | Полный пример клиентского YAML конфига |
---
@@ -376,7 +433,7 @@ Carrier - это WebRTC сервис видеозвонков, через кот
- Сервис видеозвонков от Сбера: `salutejazz.ru`
- Не требует регистрации для участника (только организатор)
- DataChannel работает, но Jazz **банит IP** за паттерны трафика характерные для DataChannel туннеля
- VideoTrack работает стабильно
- VideoTrack **не работает** для туннелирования (все non-data транспорты fail в E2E тестах)
- Поддерживает автогенерацию Room ID (`mode: gen`)
- Инициализация звонка изнутри автоматически реализована
@@ -384,7 +441,7 @@ Carrier - это WebRTC сервис видеозвонков, через кот
- Сервис видеозвонков от Яндекса: `telemost.yandex.ru`
- **Удалил DataChannel** - его больше нет в Telemost
- VideoTrack работает
- VideoTrack: только vp8channel стабильно работает, videochannel — best effort, seichannel не поддерживается
- Требует создания комнаты вручную через сайт (нет автогенерации)
- Двухуровневый keepalive: WebSocket ping + app-level ping
@@ -394,7 +451,7 @@ Carrier - это WebRTC сервис видеозвонков, через кот
- **Рекомендуется** - самый стабильный
- Минимальная прослойка, почти прямой relay
- Работает с vp8channel, seichannel, videochannel
- DataChannel поддерживается условно: WB Stream должен выдать участникам право `canPublishData`, обычно через модераторские/permission права комнаты. В обычном guest flow DC не рекомендуется.
- DataChannel **не работает** в обычном guest flow: WB Stream выдаёт токены с `canPublishData=false`, DC не маршрутизирует данные (expected fail в E2E тестах)
- Room ID нужно создавать вручную через stream.wb.ru
- Инициализация звонка автоматически
@@ -410,14 +467,16 @@ Transport определяет как именно данные упаковыв
- Лимит payload: 12KB на сообщение (ограничение SFU)
- Надёжный, упорядоченный (SCTP гарантирует)
- Работает с jazz (нежелательно - банят) и условно с wbstream
- WB Stream DataChannel требует `canPublishData=true` у участников. Без модераторских/permission прав WB Stream может поднять соединение, но не маршрутизировать data packets.
- Работает только с jazz (но Jazz банит IP за паттерны трафика)
- Telemost удалил DataChannel
- WB Stream DataChannel **не работает** в обычном guest flow — токены выдаются с `canPublishData=false`
### vp8channel
Данные упаковываются в VP8 видеофреймы. Поверх этого строится KCP - надёжный протокол с повторной передачей, работающий поверх ненадёжного канала.
- Работает везде где есть VideoTrack (jazz, telemost, wbstream)
- Работает с telemost и wbstream (pass в E2E тестах)
- Jazz не поддерживает VideoTrack для туннелирования (fail)
- Большой пинг из-за батчинга фреймов
- KCP параметры: MTU 1400, окно 4096, conv ID `0xC0FFEE01`
- Рекомендуется: `vp8.fps: 60`, `vp8.batch_size: 64`
@@ -429,7 +488,8 @@ Transport определяет как именно данные упаковыв
- Собственный бинарный протокол: magic `OVC1` (0x4f564331), версия, тип Data/Ack, CRC32, sequence numbers
- UUID для SEI payload: `5dc03ba8-450f-4b55-9a77-1f916c5b0739`
- ACK timeout (по умолчанию 3с), фрагментация, ретрансмиссия до 4 попыток
- Не работает с telemost
- Работает только с wbstream (pass в E2E тестах)
- Telemost и Jazz не поддерживают (fail)
- Рекомендуется: `sei.fps: 60`, `sei.batch_size: 64`, `sei.fragment_size: 900`, `sei.ack_timeout_ms: 2000`
### videochannel
@@ -440,7 +500,7 @@ Transport определяет как именно данные упаковыв
**tile** - тайловый кодек, только 1080x1080. Пиксели кодируют биты напрямую. Reed-Solomon коррекция ошибок. Параметры: размер тайла в пикселях (1..270), процент избыточности (0..200). Быстрее QR но нестабильнее.
Общее: ffmpeg как subprocess, поддержка NVENC, VP8 видеопоток. Самый медленный транспорт, но работает везде.
Общее: ffmpeg как subprocess, поддержка NVENC, VP8 видеопоток. Самый медленный транспорт. Работает стабильно с wbstream, best effort с telemost, не работает с jazz.
---
@@ -508,7 +568,7 @@ Community Android клиент: [alananisimov/olcbox](https://github.com/alanani
- `SetProtector(p SocketProtector)` - Android VPN bypass (VpnService.protect)
- `SetLogWriter(w LogWriter)` - получать логи в Kotlin/Java
По умолчанию использует `vp8channel` транспорт (наиболее совместимый). Если carrier - wbstream или jazz и DataChannel доступен - переключается на `datachannel`.
По умолчанию использует `vp8channel` транспорт (наиболее совместимый).
`protect.go` - механизм Android VPN protect: перед каждым `connect()` вызывается Kotlin-коллбэк который вызывает `VpnService.protect(fd)`. Без этого трафик olcRTC может рекурсивно идти через тот же VPN.
@@ -540,7 +600,7 @@ Community Android клиент: [alananisimov/olcbox](https://github.com/alanani
### Зависимости
- Go 1.25+
- Go 1.25+ (go.mod: `go 1.25.0`)
- Mage (`go install github.com/magefile/mage@latest`)
- ffmpeg (для videochannel транспорта)
- git с `--recurse-submodules` (субмодуль `gr` для videochannel кодеков)
@@ -550,17 +610,17 @@ Community Android клиент: [alananisimov/olcbox](https://github.com/alanani
```sh
mage build # текущая платформа
mage buildCLI # только CLI
mage buildCLIB # CLI + b-codec (клонирует внешний репо, собирает libb.so)
mage buildCLI # только CLI бинарник
mage cross # все платформы: linux/amd64, linux/arm64, windows/amd64,
# darwin/amd64, darwin/arm64, freebsd/amd64, freebsd/arm64,
# openbsd/amd64, openbsd/arm64
mage mobile # Android AAR через gomobile
mage podman # Docker образ через podman
mage docker # Docker образ через docker
mage lint # golangci-lint
mage lint # golangci-lint v2
mage test # go test -race ./...
mage e2e # E2E тесты (нужны реальные провайдеры)
mage deps # go mod tidy + download
mage clean # удалить build/
```
@@ -696,7 +756,7 @@ olcrtc config.yaml
Соглашение для клиентских приложений. Сам `olcrtc` не парсит - используется в сторонних клиентах.
```
olcrtc://<Carrier>?<Transport><payload>@<RoomID>#<Key>$<MIMO>
olcrtc://<Auth>?<Transport><payload>@<RoomID>#<Key>$<MIMO>
```
Где `<payload>` - опциональный блок `<key=value&...>` с параметрами транспорта.
@@ -704,8 +764,8 @@ olcrtc://<Carrier>?<Transport><payload>@<RoomID>#<Key>$<MIMO>
**Примеры:**
```
olcrtc://wbstream?vp8channel<vp8-fps=60&vp8-batch=64>@room-01#d823fa...$RU
olcrtc://wbstream?datachannel@room-01#d823fa...$RU / requires canPublishData
olcrtc://telemost?seichannel<fps=60&batch=64&frag=900&ack-ms=2000>@room-01#d823fa...$RU
olcrtc://wbstream?datachannel@room-01#d823fa...$RU / DC does not work in guest flow
olcrtc://wbstream?seichannel<fps=60&batch=64&frag=900&ack-ms=2000>@room-01#d823fa...$RU
```
### Формат подписки (sub.md)
@@ -732,23 +792,28 @@ olcrtc://wbstream?vp8channel<vp8-fps=60&vp8-batch=64>@room-01#key$RU / free
| Transport | telemost | jazz | wbstream |
|---|:---:|:---:|:---:|
| datachannel | - | `*` | `!` |
| vp8channel | `+` | `+` | `+` |
| seichannel | - | `+` | `+` |
| videochannel | `+` | `+` | `+` |
| datachannel | `-` | `+` | `-` |
| vp8channel | `+` | `-` | `+` |
| seichannel | `-` | `-` | `+` |
| videochannel | `~` | `-` | `+` |
- `+` работает
- `-` не поддерживается
- `*` работает, но jazz банит IP за паттерны datachannel трафика
- `!` работает только если WB Stream выдал участникам право `canPublishData` (обычно через модераторские/permission права)
- `+` работает (pass в E2E тестах)
- `-` не работает / не поддерживается (fail в E2E тестах)
- `~` best effort (может работать, но нестабильно)
**Рекомендуется для wbstream:** `vp8channel` как обычный режим. `wbstream + datachannel` быстрый, но не рекомендуется без модераторских прав: в guest flow WB Stream может выдавать токены с `canPublishData=false`, и DC не будет маршрутизировать данные.
**Jazz:** только datachannel проходит E2E тесты. Все non-data транспорты (vp8channel, seichannel, videochannel) помечены как expected fail — Jazz не поддерживает VideoTrack для туннелирования. Кроме того, Jazz **банит IP** за паттерны datachannel трафика.
**Telemost:** только vp8channel стабильно проходит. DataChannel удалён из Telemost. seichannel не поддерживается. videochannel — best effort.
**WBStream:** все транспорты кроме datachannel работают. DataChannel помечен как expected fail — в обычном guest flow WB Stream выдаёт токены с `canPublishData=false`, и DC не маршрутизирует данные. Для DC нужны модераторские/permission права.
**Рекомендуется:** `wbstream + vp8channel` — работает стабильно, не требует специальных прав.
**Скорость по убыванию:** `datachannel` > `vp8channel` > `seichannel` > `videochannel`
**Рекордный замер:** на связке `wbstream + datachannel` (test by `x2827262628281872727`) зафиксированы пинг **7 мс** и скорость **792.62 Mbps на вход / 749.69 Mbps на выход** - максимум, измеренный через olcRTC. Сейчас этот режим зависит от WB Stream permission `canPublishData` и не считается рекомендуемым для обычного guest flow.
**Рекордный замер:** на связке `wbstream + datachannel` (test by `x2827262628281872727`) зафиксированы пинг **7 мс** и скорость **792.62 Mbps на вход / 749.69 Mbps на выход** максимум, измеренный через olcRTC. Этот режим больше не работает в обычном guest flow (WB Stream выдаёт токены без `canPublishData`).
<img src="asset/speedtest.png" alt="speedtest" width="400">
@@ -756,14 +821,14 @@ olcrtc://wbstream?vp8channel<vp8-fps=60&vp8-batch=64>@room-01#key$RU / free
## 17. CI/CD
`.github/workflows/ci.yml` - GitHub Actions, запускается на каждый push/PR в master.
`.github/workflows/ci.yml` - GitHub Actions, запускается на каждый push и PR в master.
| Job | Что делает |
|---|---|
| `test` | `go test -count=1 ./...` |
| `coverage` | `go test --cover ./...` |
| `real-e2e` | E2E матрица всех carrier×transport на реальных провайдерах (25 мин таймаут) |
| `lint` | golangci-lint |
| `lint` | golangci-lint v2 |
| `build-cli` | `mage cross` - кросс-компиляция для 9 платформ, артефакты в Actions |
| `build-android` | `mage mobile` - Android AAR, артефакт в Actions |
@@ -827,7 +892,9 @@ WB Stream - текущий приоритет. Основа уже реализ
| **zowue** (heminpo49@gmail.com) | 24 | Соавтор. Упомянут в оригинальной статье на Хабре |
| **TheDevisi** (devisinov@gmail.com) | 20 | UI, SOCKS5 улучшения, Windows поддержка, фиксы |
| **Qtozdec** | 10 | Фиксы, URI добавление |
| **Alexander Anisimov** / alananisimov | 6 | Android клиент [olcbox](https://github.com/alananisimov/olcbox), mobile.go фиксы, mobile provider config |
| **Alexander Anisimov** / alananisimov | 6 | Android клиент [olcbox](https://github.com/alananisimov/olcbox), mobile.go фиксы, mobile provider config, cmd/olcrtc-cgo (C-shared Ping API) |
| **spkprsnts** (jectokuu@gmail.com) | 2 | Кастомный путь к ffmpeg (`-ffmpeg` flag), снижение задержки VP8 кодирования |
| **win64exe** (doost-55@yandex.ru) | 1 | Фикс srv.sh (--network host) |
| **s0me0ne-25** | 3 | Расширение датасета имён и фамилий |
| **Kot-nikot** | 3 | Фиксы |
| **HLNikNiky** / Sesdear | 2 | URI добавление, фиксы |
+5 -5
View File
@@ -116,12 +116,12 @@ Enter choice [1-4, default: 1]:
```
Рекомендации:
- **datachannel** - самый быстрый, минимальный пинг. Работает с `jazz` и условно с `wbstream`. **Jazz банит IP за datachannel**; **WBStream DC требует `canPublishData`/модераторские права у участников**, поэтому для обычного guest flow не рекомендуется.
- **vp8channel** - работает везде, быстрый, но большой пинг.
- **seichannel** - работает везде кроме telemost, медленный, но мелкий пинг.
- **videochannel** - работает везде, самый медленный и большой пинг.
- **datachannel** - самый быстрый, минимальный пинг. Работает только с `jazz` (но Jazz банит IP за паттерны трафика). **WBStream DC не работает** в обычном guest flow (токены без `canPublishData`). **Telemost удалил DC**.
- **vp8channel** - работает с telemost и wbstream, быстрый, но большой пинг.
- **seichannel** - работает только с wbstream, медленный, но мелкий пинг.
- **videochannel** - работает с wbstream (стабильно) и telemost (best effort), самый медленный и большой пинг.
**Рекомендуемая комбинация для wbstream: `wbstream + vp8channel`**. `wbstream + datachannel` используй только если участникам выданы права на отправку data packets.
**Рекомендуемая комбинация: `wbstream + vp8channel`** — работает стабильно, не требует специальных прав.
### Room ID
+11 -10
View File
@@ -10,7 +10,7 @@
# Мануальная сборка
Этот способ для тех кто хочет собрать бинарник руками без Docker/Podman.
Нужен Go 1.26+, mage, git.
Нужен Go 1.25+, mage, git.
Проект в бете. По проблемам: t.me/openlibrecommunity
@@ -26,7 +26,7 @@ dnf install git # Fedora / RHEL / CentOS
---
## Шаг 2: Установить Go 1.26+
## Шаг 2: Установить Go 1.25+
### Arch / Fedora (всё просто)
@@ -51,28 +51,26 @@ Pin-Priority: 100
EOF
sudo apt update
sudo apt install -t testing golang-1.26
sudo apt install -t testing golang-go
sudo update-alternatives --install /usr/bin/go go `which go` 10
sudo update-alternatives --install /usr/bin/gofmt gofmt `which gofmt` 10
sudo update-alternatives --install /usr/bin/go go /usr/lib/go-1.26/bin/go 20
sudo update-alternatives --install /usr/bin/gofmt gofmt /usr/lib/go-1.26/bin/gofmt 20
```
Иначе через SDK:
```sh
apt install golang # ставим старый go - он нужен только чтобы скачать новый
go install golang.org/dl/go1.26.0@latest # скачиваем установщик go1.26
~/go/bin/go1.26.0 download # скачиваем сам go1.26
mv ~/go/bin/go1.26.0 /usr/local/bin/go # заменяем системный go
go install golang.org/dl/go1.25.0@latest # скачиваем установщик go1.25
~/go/bin/go1.25.0 download # скачиваем сам go1.25
mv ~/go/bin/go1.25.0 /usr/local/bin/go # заменяем системный go
```
### Проверка
```sh
go version
# go version go1.26.x linux/amd64
# go version go1.25.x linux/amd64
```
---
@@ -151,7 +149,7 @@ openssl rand -hex 32
Сначала создай руму вручную через сайт [wbstream](https://stream.wb.ru) (автогенерация через `mode: gen` для wbstream больше не поддерживается) и сохрани её ID.
`wbstream + datachannel` поддерживается только если участникам выданы права на отправку data packets (`canPublishData=true`), обычно через модераторские/permission права комнаты. В обычном guest flow DC не рекомендуется.
`wbstream + datachannel` **не работает** в обычном guest flow — WB Stream выдаёт токены с `canPublishData=false`, и DC не маршрутизирует данные. Для обычного использования выбирай `vp8channel`.
Создай YAML конфиг:
@@ -276,13 +274,16 @@ curl https://icanhazip.com
```sh
mage build # собрать для текущей платформы
mage buildCLI # собрать только CLI бинарник
mage cross # собрать для всех платформ
mage deps # скачать и обновить зависимости
mage clean # удалить build/
mage test # запустить тесты
mage e2e # запустить E2E тесты (нужны реальные провайдеры)
mage lint # запустить линтер
mage podman # собрать образ через podman
mage docker # собрать образ через docker
mage mobile # собрать Android AAR
```
---
+21 -14
View File
@@ -14,18 +14,23 @@
| Transport | telemost | jazz | wbstream |
|-----------|:--------:|:----:|:--------:|
| datachannel | - | * | ! |
| vp8channel | + | + | + |
| seichannel | - | + | + |
| videochannel | + | + | + |
| datachannel | - | ~ | ~ |
| vp8channel | + | - | + |
| seichannel | - | - | + |
| videochannel | + | - | + |
**Легенда:**
- `+` - работает
- `-` - не поддерживается
- `*` - работает, но не желательно
- `!` - работает только если участникам выданы права на отправку data packets (`canPublishData`), обычно через модераторские права
- `+` - работает (pass в E2E тестах)
- `-` - не работает / не поддерживается (fail в E2E тестах)
- `~` - нестабильно (может работать, но нестабильно)
**Рекомендуемая комбинация для wbstream: `wbstream + vp8channel`**. `wbstream + datachannel` быстрый, но в обычном guest/anonymous flow WB Stream выдаёт токены с `canPublishData=false`; без выдачи участникам модераторских/permission прав DC не маршрутизирует данные и поэтому не рекомендуется.
**Jazz:** только datachannel проходит E2E тесты. Все non-data транспорты (vp8channel, seichannel, videochannel) не работают — Jazz не поддерживает VideoTrack для туннелирования. Кроме того, Jazz **банит IP** за паттерны datachannel трафика.
**Telemost:** только vp8channel стабильно проходит. DataChannel удалён из Telemost. seichannel не поддерживается. videochannel — best effort.
**WBStream:** все транспорты кроме datachannel работают. DataChannel в обычном guest flow без выдавания модератора не работает — WB Stream выдаёт токены с `canPublishData=false`, и DC не маршрутизирует данные.
**Рекомендуемая комбинация: `wbstream + vp8channel`** — работает стабильно, не требует специальных прав.
Скорость по убыванию: `datachannel` > `vp8channel` > `seichannel` > `videochannel`
@@ -163,9 +168,9 @@ gen:
## Готовые конфиги
### wbstream + datachannel (не рекомендуется без модераторских прав)
### wbstream + datachannel (не работает в обычном guest flow)
WB Stream DataChannel работает только когда участникам выданы права на отправку data packets (`canPublishData=true`), обычно через модераторские/permission права комнаты. В обычном guest flow WB Stream может выдавать токены с `canPublishData=false`, тогда соединение поднимется, но данные через DC не пойдут. Для обычного использования выбирай `vp8channel`, `seichannel` или `videochannel`.
WB Stream DataChannel **не работает** в обычном guest flow WB Stream выдаёт токены с `canPublishData=false`, и DC не маршрутизирует данные. Этот режим помечен как expected fail в E2E тестах. Для обычного использования выбирай `vp8channel`, `seichannel` или `videochannel`.
```yaml
# room ID нужно создать вручную через https://stream.wb.ru
@@ -204,7 +209,7 @@ socks:
data: data
```
### wbstream + datachannel + SOCKS5 аутентификация (только с модераторскими правами)
### wbstream + datachannel + SOCKS5 аутентификация (не работает в обычном guest flow)
```yaml
# client.yaml с логином и паролем на прокси
@@ -279,7 +284,9 @@ vp8:
data: data
```
### telemost + seichannel
### telemost + seichannel (не работает)
> ⚠️ Эта комбинация помечена как expected fail в E2E тестах. Telemost не поддерживает seichannel.
```yaml
# server.yaml
@@ -326,7 +333,7 @@ sei:
data: data
```
### telemost + videochannel (крайний случай)
### telemost + videochannel (best effort, нестабильно)
```yaml
# server.yaml
+1 -1
View File
@@ -154,7 +154,7 @@ olcrtc://wbstream?datachannel@abc123xyz#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
##name: DE-Backup
##icon: 🇩🇪
##color: #2EBD85
##comment: reserve route, wbstream+datachannel requires canPublishData/moderator permissions
##comment: reserve route, wbstream+datachannel does not work in guest flow
```
## Имплементация клиента для подписок
+2 -2
View File
@@ -113,13 +113,13 @@ Payload не используется.
## Примеры
### wbstream + datachannel (только с permission rights)
### wbstream + datachannel (не работает в обычном guest flow)
```text
olcrtc://wbstream?datachannel@room-01#d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799$RU / olc free sub / IPv6
```
Payload не нужен - datachannel параметров не имеет. Для WBStream этот режим не рекомендуется в обычном guest flow: участникам нужны права на отправку data packets (`canPublishData=true`), обычно через модераторские/permission права комнаты.
Payload не нужен - datachannel параметров не имеет. Для WBStream этот режим **не работает** в обычном guest flow: WB Stream выдаёт токены с `canPublishData=false`, и DC не маршрутизирует данные.
### Эквивалент YAML