Files
glchat/desktop/README.md
T
grendervill a7b4e3318e build(desktop): цели make, README и устойчивость обёртки к правам на логи
- 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 по модулям обёртки.
2026-09-22 21:55:19 +03:00

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: обёртка их не хранит.

Схема 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.