- Makefile: `desktop-check`, `desktop-build` (с ключом подписи обновлений, без ключа — сборка без артефактов обновления) и `desktop-run`; кэши cargo и npm держатся в .cache/, как у остальных инструментов проекта. - desktop/README.md: сборка, запуск, аргументы командной строки, настройки, deep links и открытые пункты Фазы 6. - bundle.targets = all: бандлы по умолчанию для текущей ОС (macOS: .app/.dmg). - Логирование подключается в setup и больше не роняет приложение, если каталог логов недоступен на запись (песочница, домашний каталог только для чтения). - Разбор аргументов вынесен в Cli::from_args и покрыт тестами (--instance, --minimized, --settings, --autostart on|off). - cargo fmt по модулям обёртки.
5.8 KiB
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 # конфигурация сборки и плагинов
Сборка и запуск
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/ — как у остальных инструментов проекта.
Сборка релиза с артефактами автообновления использует ключ подписи:
# ключ и пароль не коммитятся: приватный ключ живёт в 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.