2.8 KiB
Архитектурные границы
Это целевое разделение; modules ещё предстоит реализовать после выбора стека.
UI components / routes
↓ commands ↑ view models
Application use cases / lifecycle
↓ ports
Domain models / pure policies
↕ adapters
IndexedDB / XMPP WSS / crypto worker / media worker / browser APIs
↕
External XMPP + upload + TURN + maps + push gateway
Каталоги реализации
src/domain/: модели и pure policies без UI/network.src/application/: use cases, event reducers, account-bound operation context.src/ports/: интерфейсы, errors, capability contracts.src/adapters/: xmpp, storage, crypto, media, notifications.src/ui/: tokens, primitive components, feature views, routes.src/workers/: crypto/media off-main work.src/platform/: browser lifecycle, permission, multi-tab coordination.services/push/: минимальный Web Push gateway; не messaging backend и не OMEMO endpoint.infra/: local fixtures/server/HTTPS/WSS/turn and deployment configuration.tests/: unit, contract, integration, browser, interoperability, security, tooling.
Расширения файлов/commands определяет accepted stack ADR. В карточках scope без расширения обозначает logical module stem: после ADR создаётся файл с принятым расширением, не файл без расширения.
Направления зависимостей
Domain не импортирует adapters/UI. UI вызывает application commands, не Signal/session/network internals. Adapters реализуют ports. Event содержит accountId, conversationId/eventId и generation/cancellation context; поздний результат старого аккаунта отбрасывается.
Durable history mutations и checkpoint — одна transaction boundary. Внешняя доставка и локальная запись не образуют общей distributed transaction: retries должны учитывать факт возможной успешной отправки.
Gateway хранит только необходимые push subscription/registration metadata; encrypted message plaintext ему недоступен. CORS не обходится скрытым decrypting proxy.
Governance
Любое изменение shared contract требует ADR/contract update и focused contract tests. До этого downstream owner не угадывает поля интерфейса. Интерфейсы сначала фиксируются в S01, затем implementers добавляют concrete code.