- Rust 65.1%
- TypeScript 26%
- Dart 6.6%
- CSS 1.7%
- JavaScript 0.2%
## Что в PR Три независимых блока (3 атомарных коммита над baseline): ### 1. Верификация collision-guard (server) P0-гард `ensure_remote_shadow_ids_free` уже стоял в коде. Добавлено: - **regression-тест** — remote Welcome с коллизией UUID не перезаписывает локальный sentinel, не пишет inbox-receipt и повторно доставляем после очистки (`tests/social.rs`); - **негативный тест authority-guard** для пути federated-conversation (`tests/federated_conversation_writes.rs`); - **доки** — гард помечен как транзитный до миграции на composite/surrogate-ключи (`docs/11`, `docs/12`). Production-логика не менялась (только rustfmt-реформат). ### 2. Federated call integration-тесты (server) Two-home round-trip start/end звонка, idempotent duplicate, shadow-authority guard для calls-пути (`tests/calls.rs`). Путь уже был реализован и врезан — теперь покрыт тестами. ### 3. DSG-оркестратор: Фаза 1 + Фаза 2a (client-web) **Фаза 1 — Welcome trust-gate:** `DsgProjectionStore` + `DsgAcceptedCommitVerifier` + `DsgWelcomeRosterPolicy` (оба порта реализованы, exact-match, fail-closed). Врезан в production credential-policy: гард реальный, store пуст до Фазы 2 → join остаётся fail-closed (`MLS_WELCOME_ROSTER_MISMATCH` вместо `UNCONFIGURED`). **Фаза 2a — feed-transport:** crash-safe DSG envelope feed (`device.sync.envelopes.pull/ack`) — loop + page-parser + atomic IndexedDB opaque-inbox + realtime wake-ветка `device_sync_events_available`; врезан в репозиторий (durable-ингест opaque-конвертов). ## Статус / что НЕ в PR - MLS-обработка DSG-конвертов, `DeviceSyncPayload`-кодек/snapshot-reducer, наполнение projection-store и candidate-join — **Фаза 2b/2c**. - **Открытый design-вопрос (блокер join'а):** в текущей реализации нет канала доставки initial DSG Welcome кандидату (chicken-and-egg: `DsgWelcomeBootstrap` — это DSG application, нечитаемое non-member'ом). Документированный `DeviceAddOperation` server-transition flow (docs/09:325) разошёлся с реализацией и нуждается в уточнении перед 2c. ## Валидация - `cargo test -p guildwine-server` — social 7/7, federated_conversation_writes 5/5, calls 5/5; `clippy -D warnings`, `fmt` — чисто. - client-web — 177 тестов (вкл. 16 новых DSG) + `build:types`; apps/web `tsc -b` + 14 тестов — зелёные. Reviewed-on: #2 |
||
|---|---|---|
| .cargo | ||
| apps | ||
| crates | ||
| docs | ||
| packages | ||
| .env.example | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| context.md | ||
| LICENSE | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
GuildWine
Основа федеративного криптографического MLS-мессенджера: Rust-сервер, общий wire protocol и одна stateful клиентская библиотека для Web/PWA, Android Flutter и будущего desktop-клиента.
Что реализовано
Серверная foundation:
- typed transactional RocksDB и bounded migrations;
- точный indexed TTL;
- WebSocket auth и protocol frames;
- durable per-device event replay/ACK/retention;
- signed/idempotent commands;
- публичный account profile с CAS и durable fan-out на все устройства;
- bounded каталог Space/Conversation/Topic на явном per-user индексе;
- базовые persistence boundaries для spaces/conversations/topics;
- public space/direct/invite/role/topic social slice;
- opaque MLS conversation events, атомарный epoch CAS и durable local wake;
- QR enrollment, межустройственный relay и chat-add lease foundation;
- signed federation transport, authority-routed remote conversation commands и canonical shadow feed на home отправителя;
- sponsor-authored Add/Commit/Welcome и activation ACK для local и two-home invite/direct;
- LiveKit token provisioning и atomic call projection;
- опциональное зашифрованное файловое хранилище с quota и recovery.
Клиентская foundation:
- high-level facade и расширяемый executable feature registry;
- bounded actor, FIFO write lane и параллельные queries;
- immutable reactive snapshots;
- typed encrypted storage, TTL, CAS, opaque cursors и resumable migrations;
- реальный OpenMLS engine, device-signed credential, WASM adapter, WebCrypto/IndexedDB vault и crash-safe pending coordinator;
- Worker/WASM/React PWA, Android Flutter и Iced application shells.
Production web repository собирает OpenMLS/WASM coordinator с
WebCrypto/IndexedDB vault и асинхронный cross-home
queue/status/redrive с подтверждением по canonical event. Пока не завершены
concrete DSG trust/snapshot orchestration и authoritative roster DTO для Welcome,
production encryption локальной расшифрованной истории, multi-tab
leadership, межустройственная передача file secrets через DSG и remote LiveKit
active/token-grant. Cross-home blob discovery/download уже выполняется через
проверенный /.well-known/guildwine/client/v1; Queued не равен принятию
события authority.
Типизированная адресная модель home + local уже входит в общий protocol и
client API.
Документация явно отделяет работающий scaffold от целевых контрактов.
Быстрые проверки
cargo xtask check
cargo xtask check-all
check компилирует Rust-документацию, запускает lints, обычные
Rust tests и отдельные doctests, а затем проверяет WASM target.
check-all дополнительно выполняет Web tests и реальную
Rust→WASM→Vite сборку, Flutter analyze/tests, debug APK через Cargokit/NDK и
Iced check. Для него нужны Node.js, подходящий wasm-bindgen-cli, Flutter и
Android SDK/NDK.
Точечные entry points:
cargo xtask web dev
cargo xtask mobile run
cargo xtask desktop run
Запуск сервера
GW_SERVER__BIND="127.0.0.1:8080" \
GW_SERVER__DATABASE="./db" \
GW_SERVER__GRACEFUL_SHUTDOWN_TIMEOUT_MS=30000 \
GW_REGISTRATION__INITIAL_TOKEN="replace-me" \
GW_REGISTRATION__INITIAL_TOKEN_MAX_REGISTRATIONS=1 \
GW_WELLKNOWN__DOMAIN="example.org" \
GW_WEB__STATIC_DIR="./apps/web/dist" \
cargo run -p guildwine-server
Локальный .env загружается для разработки. Реальные environment values имеют
приоритет над ним и над /etc/guildwine/config.*. Два подчёркивания разделяют
уровни: GW_SERVER__REQUEST_BODY соответствует server.request_body.
GW_SERVER__GRACEFUL_SHUTDOWN_TIMEOUT_MS ограничивает drain HTTP/WebSocket
после SIGINT/SIGTERM; после deadline Axum task abort-ится, а worker cleanup
всё равно выполняется.
GW_WEB__STATIC_DIR опционален. Если он задан, сервер раздаёт собранную Vite
PWA, безопасный SPA fallback и /.well-known/guildwine/client/v1 с того же
origin. Перед запуском выполните npm run build:web. Без этой переменной web
assets должен раздавать reverse proxy; WebSocket и API продолжают работать.
Документация
- Общее руководство разработчика
- Клиентская библиотека
- Добавление client feature
- Client storage и шифрование
- Платформенные оболочки
Перед feature-разработкой прочитайте соответствующий foundation contract и запустите проверки слоя, который меняете.