91 lines
5.8 KiB
Markdown
91 lines
5.8 KiB
Markdown
|
|
# 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 <url>` | адрес инстанса вместо сохранённого (`--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/<code>` → страница приглашения;
|
||
|
|
- `glchat://guild/<guildId>/channel/<channelId>` → сервер и комната.
|
||
|
|
|
||
|
|
Ссылка, пришедшая до загрузки клиента (холодный старт), ждёт в очереди и
|
||
|
|
доставляется после `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.
|