# desktop — desktop-обёртка glchat (Tauri 2) Тот же веб-клиент из `web/`, обёрнутый в Tauri 2 (docs/client-tauri.md). Отдельного UI-кода нет: страница инстанса загружается в системный webview, а обёртка даёт платформенную интеграцию — трей, нативные уведомления, глобальный push-to-talk, автозапуск, deep links и автообновление. ``` desktop/ └── src-tauri/ # Rust-проект обёртки ├── src/ # окно, трей, шорткаты, уведомления, deep links, обновления ├── capabilities/ # allowlist IPC: локальная страница настроек и домен инстанса ├── ui/ # локальная страница настроек обёртки (tauri://localhost) ├── icons/ # иконки приложения (сгенерированы из web/public/icons) └── tauri.conf.json # конфигурация сборки и плагинов ``` ## Сборка и запуск ```bash make desktop-check # cargo fmt --check, clippy, тесты (кэш в .cache/) make desktop-build # бандлы текущей ОС (macOS: .app и .dmg) open desktop/src-tauri/target/release/bundle/macos/glchat.app ``` Требуется Rust 1.77+ и Node 22 (Tauri CLI ставится через `npx`). Кэши `cargo` и `npm` держатся в `.cache/` — как у остальных инструментов проекта. Сборка релиза с артефактами автообновления использует ключ подписи: ```bash # ключ и пароль не коммитятся: приватный ключ живёт в CI-секретах, # локально — в build/desktop-keys/ (каталог build/ в .gitignore) npx @tauri-apps/cli@^2 signer generate -w build/desktop-keys/glchat-updater.key -p '…' make desktop-build ``` Публичный ключ уже вписан в `src-tauri/tauri.conf.json` и в `UPDATER_PUBKEY` (`src/updates.rs`). Без локального ключа `make desktop-build` собирает бандл без артефактов обновления, чтобы сборка не падала у тех, у кого ключа нет. ## Аргументы командной строки | Аргумент | Что делает | |---|---| | `--instance ` | адрес инстанса вместо сохранённого (`--instance=https://…` тоже работает) | | `--minimized` | запуск свёрнутым в трей (используется автозапуском) | | `--settings` | сразу открыть страницу настроек обёртки | | `--autostart on\|off` | включить или выключить автозапуск при установке скриптом | ## Настройки Хранятся в `settings.json` каталога конфигурации приложения (`~/Library/Application Support/su.mhspx.glchat/` на macOS): | Ключ | Смысл | |---|---| | `instanceUrl` | адрес клиента, по умолчанию `https://gl.mhspx.su` | | `closeToTray` | закрытие окна сворачивает приложение в трей | | `autostart` | запуск при входе в систему (`--minimized`) | | `notifications` | показывать системные уведомления | | `pttShortcut`, `muteShortcut`, `deafenShortcut` | глобальные комбинации (пусто — выключено) | Меняются из меню трея и со страницы настроек обёртки (трей → «Настройки обёртки…»). Сессия и токены живут только в cookie webview: обёртка их не хранит. ## Deep links Схема `glchat://` (регистрируется бандлом): - `glchat://invite/` → страница приглашения; - `glchat://guild//channel/` → сервер и комната. Ссылка, пришедшая до загрузки клиента (холодный старт), ждёт в очереди и доставляется после `desktop_ready`. ## Что не сделано (открытые пункты Фазы 6) - **Манифест обновлений на сервере**: `GET /updates/{target}/{arch}/{current_version}` ещё не публикуется — нужна статика на стороне инстанса (Caddy) и релизный контур с приватным ключом в CI. Клиентская часть готова: подпись проверяется, downgrade отклоняется, при недоступном манифесте ошибка только логируется. - **Клик по уведомлению** → открытие канала: у `tauri-plugin-notification` нет колбэка действия на desktop, нужен свой мост к `UNUserNotificationCenter`. - **Аватары в уведомлениях** (thumb/буква) и группировка — сейчас иконка приложения. - **Захват экрана и микрофон**: разрешения macOS выдаёт webview, отдельных экранов-инструкций у обёртки нет. - **Подпись и нотаризация сборки** macOS/Windows: Developer ID/EV только в CI. - **Windows/Linux-бандлы**: конфигурация кросс-платформенная, но собирались и проверялись только macOS-arm64.