feat(chat-input): привести lock flow записи ГС к Telegram (геометрия и анимации)
This commit is contained in:
173
Architecture.md
173
Architecture.md
@@ -32,8 +32,7 @@ flowchart TB
|
||||
end
|
||||
|
||||
subgraph DI["Hilt Singleton Graph"]
|
||||
D1["ProtocolGateway"]
|
||||
D1A["ProtocolRuntime"]
|
||||
D1["ProtocolGateway -> ProtocolRuntime"]
|
||||
D2["SessionCoordinator"]
|
||||
D3["IdentityGateway"]
|
||||
D4["AccountManager / PreferencesManager"]
|
||||
@@ -42,54 +41,57 @@ flowchart TB
|
||||
|
||||
subgraph CHAT_UI["Chat UI Orchestration"]
|
||||
C1["ChatDetailScreen / ChatsListScreen"]
|
||||
C2["ChatViewModel (host)"]
|
||||
C3["Messages/Voice/Attachments/Typing ViewModel"]
|
||||
C4["Messages/Forward/Attachments Coordinator"]
|
||||
C2["ChatViewModel (host-state)"]
|
||||
C3["Feature VM: Messages/Voice/Attachments/Typing"]
|
||||
C4["Coordinators: Messages/Forward/Attachments"]
|
||||
end
|
||||
|
||||
subgraph CHAT_DOMAIN["Chat Domain UseCases"]
|
||||
U1["SendText / SendMedia / SendForward"]
|
||||
U2["SendVoice / SendTyping / SendReadReceipt"]
|
||||
U3["CreateAttachment / EncryptAndUpload"]
|
||||
U3["CreateAttachment / EncryptAndUpload / VideoCircle"]
|
||||
end
|
||||
|
||||
subgraph SESSION["Session / Identity Runtime"]
|
||||
S1["SessionStore"]
|
||||
S2["SessionReducer"]
|
||||
S3["IdentityStore"]
|
||||
S4["AppSessionCoordinator"]
|
||||
S1["SessionStore / SessionReducer"]
|
||||
S2["IdentityStore / AppSessionCoordinator"]
|
||||
end
|
||||
|
||||
subgraph NET["Network Runtime"]
|
||||
N0["ProtocolRuntime"]
|
||||
N1C["RuntimeComposition"]
|
||||
N1A["ProtocolManager (compat facade)"]
|
||||
N2["Protocol"]
|
||||
N3["PacketSubscriptionRegistry"]
|
||||
N4["ReadyPacketGate"]
|
||||
N1["RuntimeComposition (wiring only)"]
|
||||
N2["RuntimeConnectionControlFacade"]
|
||||
N3["RuntimeDirectoryFacade"]
|
||||
N4["RuntimePacketIoFacade"]
|
||||
N5["Assemblies: Transport / Messaging / State / Routing"]
|
||||
N6["ProtocolInstanceManager -> Protocol"]
|
||||
N7["ProtocolManager (legacy compat)"]
|
||||
end
|
||||
|
||||
subgraph DATA["Data + Persistence"]
|
||||
R1["MessageRepository"]
|
||||
R2["GroupRepository"]
|
||||
R3["Room: RosettaDatabase"]
|
||||
R1["MessageRepository / GroupRepository"]
|
||||
R2["Room: RosettaDatabase"]
|
||||
end
|
||||
|
||||
ENTRY --> DI
|
||||
DI --> SESSION
|
||||
DI --> NET
|
||||
DI --> DATA
|
||||
DI --> CHAT_UI
|
||||
DI --> N0
|
||||
CHAT_UI --> CHAT_DOMAIN
|
||||
CHAT_UI --> DATA
|
||||
CHAT_UI --> R1
|
||||
CHAT_DOMAIN --> D1
|
||||
D1 --> D1A
|
||||
D1A --> N1C
|
||||
N1A --> N1C
|
||||
SESSION --> NET
|
||||
DATA --> NET
|
||||
DATA --> R3
|
||||
N1C --> N2
|
||||
D1 --> N0
|
||||
N0 --> N1
|
||||
N1 --> N2
|
||||
N1 --> N3
|
||||
N1 --> N4
|
||||
N1 --> N5
|
||||
N5 --> N6
|
||||
N7 --> N0
|
||||
SESSION --> N0
|
||||
R1 --> N0
|
||||
R1 --> R2
|
||||
```
|
||||
|
||||
---
|
||||
@@ -216,41 +218,40 @@ stateDiagram-v2
|
||||
На hot-path `ProtocolRuntime` берет runtime API (`RuntimeConnectionControlFacade`/`RuntimeDirectoryFacade`/`RuntimePacketIoFacade`) напрямую из `RuntimeComposition`, поэтому лишний proxy-hop через публичные методы composition не используется.
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
flowchart TB
|
||||
PR["ProtocolRuntime (ProtocolGateway impl)"] --> RC["RuntimeComposition"]
|
||||
RC --> RCC["RuntimeConnectionControlFacade"]
|
||||
RC --> RDF["RuntimeDirectoryFacade"]
|
||||
RC --> RPF["RuntimePacketIoFacade"]
|
||||
RC --> CO["ConnectionOrchestrator"]
|
||||
RC --> PIM["ProtocolInstanceManager"]
|
||||
RC --> RLSM["RuntimeLifecycleStateMachine"]
|
||||
RC --> RIC["RuntimeInitializationCoordinator"]
|
||||
RC --> PLSS["ProtocolLifecycleStateStoreImpl"]
|
||||
RC --> OPFT["OwnProfileFallbackTimerService"]
|
||||
RC --> ARS["AuthRestoreService"]
|
||||
RC --> RSC["RuntimeShutdownCoordinator"]
|
||||
RC --> CER["ConnectionEventRouter"]
|
||||
RC --> NCF["NetworkConnectivityFacade"]
|
||||
RC --> PLC["ProtocolLifecycleCoordinator"]
|
||||
RC --> PAC["ProtocolAccountSessionCoordinator"]
|
||||
RC --> RPDC["ReadyPacketDispatchCoordinator"]
|
||||
RC --> PABC["ProtocolPostAuthBootstrapCoordinator"]
|
||||
RC --> BC["BootstrapCoordinator"]
|
||||
RC --> SC["SyncCoordinator"]
|
||||
RC --> PT["PresenceTypingService"]
|
||||
RC --> PR["PacketRouter"]
|
||||
RC --> OPS["OwnProfileSyncService"]
|
||||
RC --> RQ["RetryQueueService"]
|
||||
RC --> ABC["AuthBootstrapCoordinator"]
|
||||
RC --> NRW["NetworkReconnectWatcher"]
|
||||
RC --> DVS["DeviceVerificationService"]
|
||||
RC --> CSB["CallSignalBridge"]
|
||||
RC --> PSF["PacketSubscriptionFacade"]
|
||||
RC --> PSR["PacketSubscriptionRegistry"]
|
||||
RC --> IPR["InboundPacketHandlerRegistrar"]
|
||||
RC --> IQ["InboundTaskQueueService"]
|
||||
RC --> SUP["ProtocolConnectionSupervisor"]
|
||||
RC --> RPG["ReadyPacketGate"]
|
||||
|
||||
RC --> RTA["RuntimeTransportAssembly"]
|
||||
RC --> RMA["RuntimeMessagingAssembly"]
|
||||
RC --> RSA["RuntimeStateAssembly"]
|
||||
RC --> RRA["RuntimeRoutingAssembly"]
|
||||
|
||||
RTA --> PIM["ProtocolInstanceManager"]
|
||||
RTA --> PSF["PacketSubscriptionFacade"]
|
||||
RTA --> NCF["NetworkConnectivityFacade"]
|
||||
|
||||
RMA --> SC["SyncCoordinator"]
|
||||
RMA --> PROUTER["PacketRouter"]
|
||||
RMA --> OMPS["OutgoingMessagePipelineService"]
|
||||
RMA --> CSB["CallSignalBridge"]
|
||||
RMA --> IPR["InboundPacketHandlerRegistrar"]
|
||||
|
||||
RSA --> RLSM["RuntimeLifecycleStateMachine"]
|
||||
RSA --> BC["BootstrapCoordinator"]
|
||||
RSA --> RPG["ReadyPacketGate"]
|
||||
RSA --> PLSS["ProtocolLifecycleStateStoreImpl"]
|
||||
|
||||
RRA --> SUP["ProtocolConnectionSupervisor"]
|
||||
RRA --> CER["ConnectionEventRouter"]
|
||||
|
||||
CER --> CO["ConnectionOrchestrator"]
|
||||
CER --> PLC["ProtocolLifecycleCoordinator"]
|
||||
CER --> PAC["ProtocolAccountSessionCoordinator"]
|
||||
CER --> RPDC["ReadyPacketDispatchCoordinator"]
|
||||
|
||||
PIM --> P["Protocol (WebSocket + packet codec)"]
|
||||
```
|
||||
|
||||
@@ -267,12 +268,16 @@ stateDiagram-v2
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Feature as Feature/Service
|
||||
participant PM as Runtime API (Core/Facade)
|
||||
participant PR as ProtocolRuntime
|
||||
participant RPF as RuntimePacketIoFacade
|
||||
participant PSF as PacketSubscriptionFacade
|
||||
participant REG as PacketSubscriptionRegistry
|
||||
participant P as Protocol
|
||||
|
||||
Feature->>PM: waitPacket(0x03, callback)
|
||||
PM->>REG: addCallback(0x03, callback)
|
||||
Feature->>PR: waitPacket(0x03, callback)
|
||||
PR->>RPF: waitPacket(0x03, callback)
|
||||
RPF->>PSF: waitPacket(0x03, callback)
|
||||
PSF->>REG: addCallback(0x03, callback)
|
||||
REG->>P: waitPacket(0x03, protocolBridge) [once per packetId]
|
||||
|
||||
P-->>REG: Packet(0x03)
|
||||
@@ -319,12 +324,14 @@ flowchart LR
|
||||
CVM --> COORD["Messages/Forward/Attachments Coordinator"]
|
||||
CVM --> UC["domain/chats/usecase/*"]
|
||||
COORD --> UC
|
||||
UC --> GW["ProtocolGateway.sendMessageWithRetry"]
|
||||
UC --> GW["ProtocolGateway.send / sendMessageWithRetry"]
|
||||
GW --> PR["ProtocolRuntime"]
|
||||
PR --> RC["RuntimeComposition"]
|
||||
RC --> RQ["RetryQueueService"]
|
||||
RC --> RG["ReadyPacketGate"]
|
||||
RC --> P["Protocol.sendPacket"]
|
||||
PR --> RPF["RuntimePacketIoFacade"]
|
||||
RPF --> OMP["OutgoingMessagePipelineService"]
|
||||
OMP --> RQ["RetryQueueService"]
|
||||
OMP --> RR["RuntimeRoutingAssembly"]
|
||||
RR --> RG["ReadyPacketGate / ReadyPacketDispatchCoordinator"]
|
||||
RG --> P["Protocol.sendPacket"]
|
||||
```
|
||||
|
||||
### 7.2 Декомпозиция ChatViewModel (host + feature/coordinator слой)
|
||||
@@ -351,17 +358,19 @@ flowchart TB
|
||||
CD --> TVM["TypingViewModel"]
|
||||
CD --> VVM["VoiceRecordingViewModel"]
|
||||
CD --> AVM["AttachmentsViewModel"]
|
||||
MVM --> CVM["ChatViewModel"]
|
||||
MVM --> CVM["ChatViewModel (host-state)"]
|
||||
TVM --> CVM
|
||||
VVM --> CVM
|
||||
AVM --> CVM
|
||||
CVM --> MCO["MessagesCoordinator"]
|
||||
CVM --> FCO["ForwardCoordinator"]
|
||||
CVM --> ACO["AttachmentsCoordinator"]
|
||||
AVM --> AFCO["AttachmentsFeatureCoordinator"]
|
||||
CVM --> U["domain/chats/usecase/*"]
|
||||
MCO --> U
|
||||
FCO --> U
|
||||
ACO --> U
|
||||
AFCO --> U
|
||||
```
|
||||
|
||||
Важно: после вынесения `MessagesCoordinator`, `ForwardCoordinator` и `AttachmentsCoordinator` `ChatViewModel` выступает как host-state и bridge для feature/coordinator подсистем.
|
||||
@@ -388,7 +397,10 @@ sequenceDiagram
|
||||
participant SC as SessionCoordinatorImpl
|
||||
participant SS as SessionStore
|
||||
participant PG as ProtocolGateway
|
||||
participant RC as RuntimeComposition
|
||||
participant PR as ProtocolRuntime
|
||||
participant RCC as RuntimeConnectionControlFacade
|
||||
participant RRA as RuntimeRoutingAssembly
|
||||
participant RSA as RuntimeStateAssembly
|
||||
participant AM as AccountManager
|
||||
|
||||
UI->>SC: bootstrapAuthenticatedSession(account, reason)
|
||||
@@ -400,9 +412,12 @@ sequenceDiagram
|
||||
SC->>AM: setCurrentAccount(public)
|
||||
SC->>SS: dispatch(Ready)
|
||||
|
||||
RC-->>RC: HANDSHAKE -> AUTHENTICATED -> BOOTSTRAPPING
|
||||
RC-->>RC: SyncCompleted + OwnProfileResolved
|
||||
RC-->>RC: connectionLifecycleState = READY
|
||||
PG->>PR: runtime API calls
|
||||
PR->>RCC: connection/auth commands
|
||||
RCC->>RRA: post(ConnectionEvent.*)
|
||||
RRA-->>RRA: Supervisor + Router route events
|
||||
RRA-->>RSA: apply lifecycle transitions
|
||||
RSA-->>RSA: AUTHENTICATED -> BOOTSTRAPPING -> READY
|
||||
```
|
||||
|
||||
Важно: `SessionState.Ready` (app-session готова) и `connectionLifecycleState = READY` (сеть готова) — это разные state-модели.
|
||||
@@ -429,6 +444,9 @@ stateDiagram-v2
|
||||
HANDSHAKING --> AUTHENTICATED
|
||||
AUTHENTICATED --> BOOTSTRAPPING
|
||||
BOOTSTRAPPING --> READY
|
||||
READY --> HANDSHAKING
|
||||
AUTHENTICATED --> DISCONNECTED
|
||||
BOOTSTRAPPING --> DISCONNECTED
|
||||
READY --> DISCONNECTED
|
||||
DEVICE_VERIFICATION_REQUIRED --> CONNECTING
|
||||
```
|
||||
@@ -519,13 +537,12 @@ stateDiagram-v2
|
||||
## 11. Что осталось как технический долг
|
||||
|
||||
Актуальные открытые хвосты:
|
||||
- `RuntimeComposition` остается composition-root, но уже существенно сжат (около 501 строки) после выноса `RuntimeTransportAssembly`, `RuntimeMessagingAssembly`, `RuntimeStateAssembly`, `RuntimeRoutingAssembly` и удаления публичных proxy-методов; следующий шаг — перенос части lifecycle/orchestration helper-кода в отдельные domain-oriented service/adapters.
|
||||
- `ProtocolRuntime` и `ProtocolRuntimePort` все еще имеют широкий proxy-surface; нужен audit методов и дальнейшее сужение публичного API по use-case группам.
|
||||
- `ChatViewModel` остается крупным host-классом (state + bridge/proxy API к feature/coordinator/use-case слоям).
|
||||
- High-level media сценарии теперь в `AttachmentsFeatureCoordinator`, но остаются крупными и требуют дальнейшей декомпозиции на более узкие coordinator/service/use-case блоки.
|
||||
- Тестовое покрытие архитектурных слоев все еще недостаточно:
|
||||
- сейчас в `app/src/test` всего 7 unit-тестов (в основном crypto/data/helpers), в `app/src/androidTest` — 1 тест;
|
||||
- не покрыты network runtime/coordinator слои (`RuntimeComposition`, `ConnectionEventRouter`, `ProtocolLifecycle*`, `ReadyPacketDispatchCoordinator`) и chat orchestration (`Messages/Forward/Attachments*`).
|
||||
- `RuntimeComposition` остается composition-root (около 501 строки): публичные proxy-методы уже убраны, но внутри все еще смешаны wiring и часть helper-логики (`setupStateMonitoring`, event-bridge, log helpers). Следующий шаг: вынести эти helper-блоки в отдельные adapters/services.
|
||||
- `ProtocolRuntime` + `ProtocolRuntimePort` все еще имеют широкий API surface (connection + directory + packet IO + call signaling + debug). Нужен audit и сужение публичных контрактов по use-case группам.
|
||||
- `ChatViewModel` остается очень крупным host-классом (около 4391 строки) с большим bridge/proxy surface к feature/coordinator/use-case слоям.
|
||||
- `AttachmentsFeatureCoordinator` остается крупным (около 761 строки): high-level media сценарии стоит резать на более узкие upload/transform/packet-assembly сервисы.
|
||||
- Тестовое покрытие архитектурно-критичных слоев недостаточно: `app/src/test` = 7, `app/src/androidTest` = 1; не покрыты runtime-routing/lifecycle компоненты (`RuntimeRoutingAssembly`, `ConnectionEventRouter`, `ProtocolLifecycle*`, `ReadyPacketDispatchCoordinator`) и chat coordinators (`Messages/Forward/Attachments*`).
|
||||
- В runtime все еще несколько точек входа (`ProtocolRuntime`, `ProtocolRuntimeAccess`, `ProtocolManager` legacy), что повышает cognitive load; целевой шаг — дальнейшее сокращение legacy/static call-sites.
|
||||
|
||||
Уже закрыто и больше не считается техдолгом:
|
||||
- `UiDependencyAccess.get(...)` удален из `ui/*`.
|
||||
|
||||
Reference in New Issue
Block a user