diff --git a/docs/client.example.yaml b/docs/client.example.yaml index ee6ecf2..5ec8792 100644 --- a/docs/client.example.yaml +++ b/docs/client.example.yaml @@ -6,10 +6,12 @@ mode: cnc link: direct auth: - provider: wbstream # must match the server + provider: jitsi # must match the server +# For jitsi: full conference URL (https://host/room or host/room). +# Must match the server. room: - id: "ROOM_ID_HERE" # must match the server + id: "https://meet.cryptopro.ru/REPLACE_WITH_ROOM_NAME" crypto: key: "REPLACE_ME_WITH_64_HEX_CHARS" # must match the server diff --git a/docs/configuration.md b/docs/configuration.md index 75a2879..97d77fd 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -18,7 +18,7 @@ olcrtc /etc/olcrtc/server.yaml |------------------------------------------------------------------|-----------------------------------------------------------| | `mode` | `srv`, `cnc`, or `gen` | | `link` | `direct` | -| `auth.provider` | `telemost`, `jazz`, `wbstream`, `none` | +| `auth.provider` | `jitsi`, `telemost`, `jazz`, `wbstream`, `none` | | `room.id` | conference room id | | `crypto.key` | 64-char hex (32 bytes) | | `net.transport` | `datachannel`, `videochannel`, `seichannel`, `vp8channel` | diff --git a/docs/fast.md b/docs/fast.md index 355ba77..5b78626 100644 --- a/docs/fast.md +++ b/docs/fast.md @@ -94,15 +94,16 @@ cd olcrtc ``` Select auth provider: - 1) telemost - 2) jazz - 3) wbstream -Enter choice [1-3, default: 3]: + 1) jitsi + 2) telemost + 3) jazz + 4) wbstream +Enter choice [1-4, default: 1]: ``` Выбери сервис. Полную матрицу совместимости смотри в [settings.md](settings.md). -**По умолчанию `wbstream`** - работает со всеми транспортами, рекомендуется. +**По умолчанию `jitsi`** — стабильно работает на datachannel против self-hosted и публичных Jitsi инстансов (например `meet.cryptopro.ru`). ### Transport (как именно передавать данные) @@ -116,12 +117,12 @@ Enter choice [1-4, default: 1]: ``` Рекомендации: -- **datachannel** - самый быстрый, минимальный пинг. Работает только с `jazz` (но Jazz банит IP за паттерны трафика). **WBStream DC не работает** в обычном guest flow (токены без `canPublishData`). **Telemost удалил DC**. +- **datachannel** - самый быстрый, минимальный пинг. Стабильно работает с `jitsi` через colibri-ws bridge channel. С `jazz` тоже работает, но Jazz банит IP за паттерны трафика. **WBStream DC не работает** в обычном guest flow (токены без `canPublishData`). **Telemost удалил DC**. - **vp8channel** - работает с telemost и wbstream, быстрый, но большой пинг. - **seichannel** - работает только с wbstream, медленный, но мелкий пинг. - **videochannel** - работает с wbstream (стабильно) и telemost (best effort), самый медленный и большой пинг. -**Рекомендуемая комбинация: `wbstream + vp8channel`** — работает стабильно, не требует специальных прав. +**Рекомендуемая комбинация: `jitsi + datachannel`** — работает стабильно, не требует регистрации, легко поднимать на своём сервере. Альтернатива: `wbstream + vp8channel`. ### Room ID @@ -129,6 +130,8 @@ Enter choice [1-4, default: 1]: Enter Room ID: ``` +Для **jitsi** — полный URL комнаты в формате `https://host/room` (например `https://meet.cryptopro.ru/myroom`). Имя комнаты придумывается на лету, без регистрации. Подойдёт любой публичный или self-hosted Jitsi Meet. + Для **telemost** и **wbstream** - создай руму через сайт ([телемост](https://telemost.yandex.ru/), [wbstream](https://stream.wb.ru)) и вставь её ID. Для **jazz** скрипт предложит выбор: сгенерировать автоматически (рекомендуется) или ввести существующий ID. При автогенерации скрипт запустит `gen` и получит ID до старта сервера. Также можно создать руму через сайт [jazz](https://salutejazz.ru/calls/create). diff --git a/docs/manual.md b/docs/manual.md index 37d9534..a2a3a21 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -145,7 +145,37 @@ openssl rand -hex 32 На серверной машине (VPS и т.д.). Подбери нужную комбинацию carrier + transport из матрицы в [settings.md](settings.md). -### wbstream + vp8channel (рекомендуется) +### jitsi + datachannel (рекомендуется) + +Самый простой способ: используй любой self-hosted или публичный Jitsi Meet инстанс. Регистрация не нужна, имя комнаты выдумывается на лету. По умолчанию в примерах ниже — `meet.cryptopro.ru` (публичный CryptoPro Jitsi), но подойдёт любой другой (`meet.jit.si`, свой self-hosted и т.п.). + +Создай YAML конфиг: + +```yaml +# server.yaml +mode: srv +link: direct +auth: + provider: jitsi +room: + id: "https://meet.cryptopro.ru/myroom" +crypto: + key: "d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799" +net: + transport: datachannel + dns: "1.1.1.1:53" +data: data +``` + +Запусти: + +```sh +./build/olcrtc-linux-amd64 server.yaml +``` + +Сервер сам присоединится к комнате (в качестве участника без камеры/микрофона) и будет ждать, пока клиент тоже зайдёт. Без второго участника Jicofo не выдаёт session-initiate — это особенность Jitsi. + +### wbstream + vp8channel (альтернатива) Сначала создай руму вручную через сайт [wbstream](https://stream.wb.ru) (автогенерация через `mode: gen` для wbstream больше не поддерживается) и сохрани её ID. @@ -195,7 +225,34 @@ Room ID нужно передать клиенту. На своей машине. Auth provider, transport, room ID и key должны совпадать с сервером. -### wbstream + vp8channel +### jitsi + datachannel (рекомендуется) + +```yaml +# client.yaml +mode: cnc +link: direct +auth: + provider: jitsi +room: + id: "https://meet.cryptopro.ru/myroom" +crypto: + key: "" +net: + transport: datachannel + dns: "1.1.1.1:53" +socks: + host: "127.0.0.1" + port: 8808 +data: data +``` + +```sh +./build/olcrtc-linux-amd64 client.yaml +``` + +После запуска SOCKS5 будет слушать на `127.0.0.1:8808`. Используй любой клиент с поддержкой SOCKS5 (`curl --socks5 127.0.0.1:8808 ...`, браузер с переключателем прокси и т.п.). + +### wbstream + vp8channel (альтернатива) ```yaml # client.yaml diff --git a/docs/server.example.yaml b/docs/server.example.yaml index 5c1cf67..7a5f638 100644 --- a/docs/server.example.yaml +++ b/docs/server.example.yaml @@ -7,10 +7,12 @@ mode: srv link: direct # p2p link type auth: - provider: wbstream # telemost | jazz | wbstream | none + provider: jitsi # jitsi | telemost | jazz | wbstream | none +# For jitsi: full conference URL (https://host/room or host/room). +# For telemost / wbstream / jazz: room ID returned by the service. room: - id: "ROOM_ID_HERE" + id: "https://meet.cryptopro.ru/REPLACE_WITH_ROOM_NAME" crypto: # 32-byte hex (64 chars). Generate with: openssl rand -hex 32 @@ -27,7 +29,7 @@ socks: # Direct engine mode — only used when auth.provider is "none" engine: - name: "" # livekit | goolom | salutejazz + name: "" # livekit | goolom | salutejazz | jitsi url: "" token: "" diff --git a/docs/settings.md b/docs/settings.md index 7f2d026..9265601 100644 --- a/docs/settings.md +++ b/docs/settings.md @@ -32,7 +32,7 @@ **Jitsi:** datachannel стабильно проходит — реализован поверх colibri-ws bridge channel и шлёт байты через `EndpointMessage{raw}` broadcast. Подходит для self-hosted и публичных Jitsi Meet инстансов без аутентификации (`https://meet.cryptopro.ru/...`, `https://meet.jit.si/...` и т.п.). Видео-транспорты (vp8channel, seichannel, videochannel) экспонируют sendable VideoTrack через pion PeerConnection после Jingle session-accept, но Jicofo требует дополнительных протокольных шагов (LastN, ReceiverVideoConstraints, source-add) для маршрутизации видео — поэтому они помечены `~` (best effort). -**Рекомендуемая комбинация: `wbstream + vp8channel`** — работает стабильно, не требует специальных прав. **`jitsi + datachannel`** — рекомендация для self-hosted Jitsi инстансов. +**Рекомендуемая комбинация: `jitsi + datachannel`** — стабильно работает на любом self-hosted или публичном Jitsi Meet (например `meet.cryptopro.ru`), не требует регистрации, простая руму создания. Альтернатива: `wbstream + vp8channel` — стабильно для коммерческих сценариев, не требует специальных прав. Скорость по убыванию: `datachannel` > `vp8channel` > `seichannel` > `videochannel` diff --git a/internal/app/session/session.go b/internal/app/session/session.go index 7360a54..89900bf 100644 --- a/internal/app/session/session.go +++ b/internal/app/session/session.go @@ -46,7 +46,7 @@ var ( ErrAmountRequired = errors.New("amount required for gen mode (use -amount )") // ErrAuthRequired indicates that no auth provider was selected. ErrAuthRequired = errors.New( - "auth provider required (use -auth telemost, -auth jazz, -auth wbstream or -auth none)") + "auth provider required (use -auth jitsi, -auth telemost, -auth jazz, -auth wbstream or -auth none)") // ErrURLRequired indicates that -url must be provided when the auth provider has no default URL. ErrURLRequired = errors.New("SFU URL required (use -url wss://...)") // ErrUnsupportedCarrier indicates that carrier is not registered. diff --git a/internal/e2e/tunnel_test.go b/internal/e2e/tunnel_test.go index 6fad26b..37ef84c 100644 --- a/internal/e2e/tunnel_test.go +++ b/internal/e2e/tunnel_test.go @@ -57,7 +57,7 @@ var ( ) realE2ECarriers = flag.String( //nolint:gochecknoglobals // package-level state intentional "olcrtc.real-carriers", - "telemost,wbstream", + "jitsi,telemost,wbstream", "comma-separated carriers for real e2e", ) realE2ETransports = flag.String( //nolint:gochecknoglobals // package-level state intentional diff --git a/pkg/olcrtc/olcrtc.go b/pkg/olcrtc/olcrtc.go index 7999d63..b0b442f 100644 --- a/pkg/olcrtc/olcrtc.go +++ b/pkg/olcrtc/olcrtc.go @@ -11,18 +11,18 @@ // conn, err := sess.Dial(ctx) // blocks until WebRTC data channel is ready // // conn implements net.Conn — pass it to sing-box / any io.ReadWriter consumer // -// Built-in auth providers (telemost, jazz, wbstream): +// Built-in auth providers (jitsi, telemost, jazz, wbstream): // // sess, err := olcrtc.New(ctx, olcrtc.Config{ -// Auth: "telemost", -// RoomID: "", +// Auth: "jitsi", +// RoomID: "https://meet.cryptopro.ru/myroom", // }) // // Import the implementations you need via blank imports, or call [RegisterDefaults]: // // import ( -// _ "github.com/openlibrecommunity/olcrtc/internal/engine/livekit" -// _ "github.com/openlibrecommunity/olcrtc/internal/auth/telemost" +// _ "github.com/openlibrecommunity/olcrtc/internal/engine/jitsi" +// _ "github.com/openlibrecommunity/olcrtc/internal/auth/jitsi" // ) package olcrtc @@ -52,7 +52,7 @@ var ( // Config is the input to [New]. type Config struct { // --- built-in auth mode --- - // Auth is the name of a registered auth provider ("telemost", "jazz", "wbstream"). + // Auth is the name of a registered auth provider ("jitsi", "telemost", "jazz", "wbstream"). // When set, RoomID is forwarded to the provider as the room reference. Auth string RoomID string diff --git a/pkg/olcrtc/tunnel/tunnel.go b/pkg/olcrtc/tunnel/tunnel.go index 2eece91..db1e8c6 100644 --- a/pkg/olcrtc/tunnel/tunnel.go +++ b/pkg/olcrtc/tunnel/tunnel.go @@ -7,8 +7,8 @@ // srv := tunnel.New(tunnel.Config{ // Link: "direct", // Transport: "datachannel", -// Carrier: "telemost", -// RoomURL: "", +// Carrier: "jitsi", +// RoomURL: "https://meet.cryptopro.ru/myroom", // KeyHex: "<64-char hex>", // DNSServer: "1.1.1.1:53", // AuthHook: func(deviceID string, claims map[string]any) (string, error) { @@ -30,7 +30,7 @@ // } // // Call [RegisterDefaults] once at program start to register the built-in -// carriers (telemost, jazz, wbstream) and transports (datachannel, +// carriers (jitsi, telemost, jazz, wbstream) and transports (datachannel, // videochannel, seichannel, vp8channel). package tunnel @@ -67,11 +67,11 @@ type Config struct { // --- carrier selection --- Link string // currently only "direct" Transport string // datachannel, videochannel, seichannel, vp8channel - Carrier string // telemost, jazz, wbstream, none + Carrier string // jitsi, telemost, jazz, wbstream, none RoomURL string // conference room identifier for the carrier // --- direct engine mode (Carrier == "none") --- - Engine string // livekit, goolom, salutejazz + Engine string // livekit, goolom, salutejazz, jitsi URL string Token string