Desktop-клиент протокола Underline. По DEC-0005 приложение строится на Tauri: нативная часть на Rust, интерфейс на TypeScript и React.
Это каркас, а не работающий мессенджер. Окно открывается, интерфейс обращается к нативной части настоящим IPC-вызовом — и показывает то, что она честно отвечает: протокольного слоя ещё нет. Списка чатов, заглушек сообщений и демонстрационных контактов здесь нет намеренно: пустой список чатов читался бы как «вам никто не написал», хотя правда в другом.
npm install
npm run tauri dev # окно приложения
npm run dev # только интерфейс в браузереВ браузере нативная часть недоступна, и приложение показывает именно это — с причиной, а не пустой экран.
| Путь | Роль |
|---|---|
src/ |
интерфейс: React + TypeScript |
src/protocol.ts |
единственная точка обращения к нативной части; никогда не выбрасывает — недоступность является состоянием интерфейса |
src-tauri/src/lib.rs |
нативная часть и команда protocol_status |
src-tauri/tauri.conf.json |
конфигурация приложения, окна и CSP |
src-tauri/capabilities/default.json |
разрешения главного окна — только ядро Tauri |
npx tsc # типы
npm test # vitest, 6 тестов
npx vite build # сборка интерфейса
cd src-tauri && cargo fmt --all -- --check
cd src-tauri && cargo clippy --all-targets -- -D warnings
cd src-tauri && cargo test # 4 тестаcargo в src-tauri требует собранного интерфейса: tauri::generate_context!
встраивает содержимое dist/, и без него компиляция падает. Поэтому CI собирает
интерфейс до запуска Rust-проверок — .github/workflows/ci.yml.
Команда protocol_status возвращает структуру, поля которой сериализуются в
camelCase. Имена полей — контракт с TypeScript, а не деталь реализации, и его
сторожит тест fields_cross_the_process_boundary_in_camel_case: снимите
#[serde(rename_all = "camelCase")], и тест падает вместо того, чтобы интерфейс
молча показал undefined.
Набор в src-tauri/icons/ собран из src-tauri/app-icon.png. Пересобрать:
npx tauri icon src-tauri/app-icon.pngНаборы для Android и iOS удалены намеренно — мобильных целей у проекта пока нет, а команда выше восстанавливает их за один запуск.
Архитектура, решения, открытые вопросы.
MIT © ssheleg