Skip to content

Architecture ru

Se.Cherkasov edited this page Aug 23, 2026 · 1 revision

Архитектура

English · Русский

Одно ядро на Kotlin Multiplatform, один UI на Compose Multiplatform, четыре платформы. iOS/iPadOS отложен — iOS-таргетов и iosMain в проекте нет.

Модули

flowchart TD
  A[androidApp<br/>MainActivity, манифест] --> C[composeApp<br/>UI на Compose Multiplatform]
  D[точка входа десктопа] -.тот же модуль.- C
  C --> S[shared<br/>ядро KMP]
  SV[server<br/>сервер синхронизации на Ktor] --> W[sync-wire<br/>DTO клиент⇆сервер]
  S --> W
Loading
Модуль Что это Лицензия
shared/ ядро: протоколы, хранилище, синхронизация, терминал, удалённые столы, AI GPL-3.0
composeApp/ весь UI, включая точку входа десктопа GPL-3.0
androidApp/ оболочка Android: MainActivity, манифест, applicationId app.skerry GPL-3.0
server/ сервер синхронизации (Ktor, Exposed, SQLite/PostgreSQL) AGPL-3.0
sync-wire/ wire-контракт, который компилируют обе стороны — руками не дублируется общий для обеих сторон

settings.gradle.kts выкидывает клиентские модули при -PserverOnly (или SKERRY_SERVER_ONLY=1) — так собирается Docker-образ без Android SDK.

Наборы исходников

shared/src/
  commonMain/       контракты, доменные типы, чистая логика — единственное, что видит UI
  jvmSharedMain/    JVM-код, общий для десктопа и Android (sshj, Ktor, mosh, транспорты RDP/VNC)
  desktopMain/      актуалы только для десктопа (JavaSound, ffmpeg H.264, pty4j)
  androidMain/      актуалы только для Android (MediaCodec, keystore биометрии, USB serial)
  commonTest/ desktopTest/

jvmSharedMain несёт основную нагрузку: и десктоп, и Android — JVM, поэтому код на JVM-библиотеках живёт там один раз, а не дважды. Платформенные библиотеки прячутся за expect/actual или интерфейсом; UI видит только контракты commonMain.

Слои

flowchart LR
  UI[composeApp<br/>экраны · контроллеры · дизайн-примитивы]
  DEP[AppDependencies<br/>граф, который собирает платформа]
  CORE[shared/commonMain<br/>контракты + чистая логика]
  PLAT[jvmShared / desktop / android<br/>реализации]
  UI --> DEP --> CORE
  PLAT -. реализует .-> CORE
  DEP -. строится из .-> PLAT
Loading

AppDependencies — единый держатель, передаваемый корневому composable. Новая подсистема становится его полем, а не ещё одним параметром корня; null означает «на этой платформе не подключено», и UI показывает заглушку, а не падает.

Пакеты ядра (shared/commonMain/.../shared/)

Пакет Содержимое
ssh/ контракт транспорта, цели и jump-цепочки, известные хосты, проброс портов, импорт ~/.ssh/config
sftp/, files/ контракты передачи файлов
terminal/ эмулятор, reflow, SGR, поиск, выделение, история, запись, метки шагов
vault/ контракт хранилища, криптография, записи, секреты, корзина, журнал безопасности, биометрия
sync/ движок синхронизации, контракт клиента, курсоры, настройки
team/, share/ команды и их области; трансляция живой сессии и её кадровый протокол
rdp/, vnc/, graphics/, audio/ стеки удалённых столов и общие контракты кадрового буфера и звука
mosh/, telnet/, serial/, container/, local/ остальные транспорты
snippet/, runbook/, host/, tag/ доменные модели, видимые пользователю
ai/ (+ ai/local/) провайдеры, политика по хостам, вырезание секретов, оценка риска, локальный рантайм llama.cpp
guard/, trust/, update/, text/, io/ prod-страж, запросы доверия хосту, проверка обновлений, санитизация текста, приватная запись файлов

rdp/ — самый большой пакет по числу файлов: стек RDP написан здесь, а не заимствован.

Правила, формирующие код

  • Сначала ищи, потом пиши. Каталог абстракций в docs/coding-guidelines.md перечисляет готовое под каждую повторяющуюся задачу; второе повторение — сигнал, третье делает выделение обязательным.
  • Файлы не растут за ~400–500 строк — режутся по секциям экрана или подсистемам.
  • Логика не живёт внутри composable. Парсеры, автоматы и протоколы — в shared/ или рядом с UI, но чистыми и напрямую тестируемыми.
  • Паритет desktop⇆Android — критерий готовности, а не последующая доработка.

Подробности по подсистемам: Подключения и транспорты, Движок терминала, Хранилище и криптография, Протокол синхронизации, Стеки удалённых рабочих столов, Слой UI.

Clone this wiki locally