# Rust-оболочка (`src-tauri/`)

Tauri 2 приложение-хост. Вся VPN-логика вынесена в плагин
[`src/plugins/vpn-plugin/`](src/plugins/vpn-plugin/README.md) — сюда, в
корневой крейт, попадает только запуск приложения и платформенная сборка.

## Файлы

| Путь | Назначение |
|---|---|
| `src/main.rs` | Точка входа десктоп-бинарника: инициализация логгера, вызов `netrunner_app::run()`. |
| `src/lib.rs` | `run()` — сборка `tauri::Builder` с плагином `tauri_plugin_vpn`; помечен `#[tauri::mobile_entry_point]` для Android/iOS. |
| `build.rs` | На Windows: копирует `bin/<arch>/wintun.dll` рядом со скомпилированным `.exe` в `target/<triple>/<profile>/` (нужно для локального запуска `cargo run`/`tauri dev`) и встраивает манифест с `requireAdministrator` (VPN нужны admin-права). Копирование в финальный **инсталлятор** — отдельный механизм, см. ниже. |
| `Cargo.toml` | Зависимости: `tauri`, `tauri-plugin-vpn` (path), `netrunner-logger` (git-зависимость из приватного репозитория `netrunner-core`). Собирается только под `x86_64-pc-windows-gnu` из настроенных Windows-таргетов. |
| `tauri.conf.json` | Общий конфиг: окно 500×800, CSP (`img-src`/`connect-src` жёстко ограничены — см. ниже), бандл-таргеты `"all"`. |
| `tauri.windows.conf.json` | **Платформенный оверлей**, Tauri мержит его автоматически только при сборке под Windows (см. `tauri-utils::config::parse`). Добавляет `wintun.dll` в `bundle.resources`. |
| `capabilities/*.json` | ACL для Tauri IPC — какие команды плагина доступны из WebView. |

## Windows: TUN-драйвер

VPN-движок использует крейт `wintun` (Rust-обёртка над `wintun.dll`,
самодостаточный сетевой драйвер без отдельной установки). Он должен лежать
**рядом с exe** — так его находит `LoadLibraryW("wintun.dll")` по умолчанию.
Это решается в двух независимых местах:

1. **Локальный запуск** (`cargo run`/`tauri dev`) — копирует `build.rs`.
2. **Финальный инсталлятор** (NSIS/MSI) — бандлер `tauri build` ничего не
   знает про `build.rs`-копирование, поэтому файл явно объявлен как
   `bundle.resources` в `tauri.windows.conf.json`
   (`"bin/amd64/wintun.dll": "wintun.dll"` — плоское имя, чтобы попасть в
   корень инсталляции рядом с exe). Если добавите сборку под arm64 —
   потребуется отдельный CI-профиль с `--config`, т.к. `tauri.conf.json` не
   умеет параметризоваться по архитектуре.

## CSP (`tauri.conf.json` → `app.security.csp`)

Специально ограничен: `img-src`/`connect-src`/`script-src` разрешают только
`'self'`, `data:` и домены Telegram (нужны для встроенного Telegram Web).
**Любой новый внешний домен/CDN, к которому фронт обращается напрямую
(картинки, шрифты, API), нужно либо явно добавлять в CSP, либо не
использовать** — это уже один раз ловили на флагах стран, см.
[../src/features/README.md](../src/features/README.md).
