diff --git a/FIX_WEBSOCKET_CONNECT.md b/FIX_WEBSOCKET_CONNECT.md new file mode 100644 index 0000000..30f5202 --- /dev/null +++ b/FIX_WEBSOCKET_CONNECT.md @@ -0,0 +1,69 @@ +# Fix: WebSocket Connection After Registration + +## Проблема + +После первой регистрации аккаунта в Android приложении не работали запросы на сервер до перезапуска приложения. + +## Причина + +При регистрации или разблокировке аккаунта вызывался `ProtocolManager.authenticate()` до того, как WebSocket соединение было установлено. + +Последовательность была следующая: + +1. Создание/разблокировка аккаунта +2. Вызов `ProtocolManager.authenticate(publicKey, privateKeyHash)` +3. `authenticate()` вызывает `getProtocol().startHandshake()` +4. `startHandshake()` проверяет что не подключено и вызывает `connect()`, но затем сразу возвращается +5. Соединение устанавливается асинхронно, но handshake не происходит вовремя +6. Приложение переходит к экрану чатов, запросы не проходят + +После перезапуска приложения `ProtocolManager.connect()` вызывался в `ChatsListScreen`, поэтому все работало нормально. + +## Решение + +Добавлен явный вызов `ProtocolManager.connect()` перед `authenticate()` в следующих местах: + +### 1. AuthState.kt + +- Метод `createAccount()` - после создания аккаунта +- Метод `unlock()` - после разблокировки + +### 2. SetPasswordScreen.kt + +- При создании нового аккаунта после установки пароля + +### 3. UnlockScreen.kt + +- При разблокировке существующего аккаунта + +Добавлена задержка 500ms после `connect()` для того, чтобы WebSocket успел установить соединение до попытки аутентификации. + +## Измененные файлы + +- `app/src/main/java/com/rosetta/messenger/providers/AuthState.kt` +- `app/src/main/java/com/rosetta/messenger/ui/auth/SetPasswordScreen.kt` +- `app/src/main/java/com/rosetta/messenger/ui/auth/UnlockScreen.kt` + +## Код изменений + +```kotlin +// Было: +ProtocolManager.authenticate(publicKey, privateKeyHash) + +// Стало: +ProtocolManager.connect() +kotlinx.coroutines.delay(500) // Даём время на установку соединения +ProtocolManager.authenticate(publicKey, privateKeyHash) +``` + +## Тестирование + +После этого исправления: + +1. Зарегистрируйте новый аккаунт +2. Сразу после регистрации попробуйте отправить сообщение или выполнить другой запрос +3. Запросы должны проходить без перезапуска приложения + +## Дата + +11 января 2026 diff --git a/app/src/main/java/com/rosetta/messenger/providers/AuthState.kt b/app/src/main/java/com/rosetta/messenger/providers/AuthState.kt index 9b7bc52..5893ba8 100644 --- a/app/src/main/java/com/rosetta/messenger/providers/AuthState.kt +++ b/app/src/main/java/com/rosetta/messenger/providers/AuthState.kt @@ -175,7 +175,13 @@ class AuthStateManager( loadAccounts() - // Step 8: Authenticate with protocol + // Step 8: Connect and authenticate with protocol + Log.d(TAG, "🌐 Connecting to protocol server...") + ProtocolManager.connect() + + // Give WebSocket time to connect before authenticating + kotlinx.coroutines.delay(500) + Log.d(TAG, "🌐 Authenticating with protocol server...") ProtocolManager.authenticate(keyPair.publicKey, privateKeyHash) @@ -236,7 +242,13 @@ class AuthStateManager( status = AuthStatus.Authenticated(decryptedAccount) )} - // Authenticate with protocol + // Connect and authenticate with protocol + Log.d(TAG, "🌐 Connecting to protocol server...") + ProtocolManager.connect() + + // Give WebSocket time to connect before authenticating + kotlinx.coroutines.delay(500) + Log.d(TAG, "🌐 Authenticating with protocol server...") ProtocolManager.authenticate(decryptedAccount.publicKey, decryptedAccount.privateKeyHash) diff --git a/app/src/main/java/com/rosetta/messenger/ui/auth/SetPasswordScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/auth/SetPasswordScreen.kt index 91e1f24..60bbebf 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/auth/SetPasswordScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/auth/SetPasswordScreen.kt @@ -497,6 +497,9 @@ fun SetPasswordScreen( // 🔌 Connect to server and authenticate val privateKeyHash = CryptoManager.generatePrivateKeyHash(keyPair.privateKey) Log.d("SetPasswordScreen", "🔌 Connecting to server...") + ProtocolManager.connect() + // Give WebSocket time to connect before authenticating + kotlinx.coroutines.delay(500) ProtocolManager.authenticate(keyPair.publicKey, privateKeyHash) onAccountCreated() diff --git a/app/src/main/java/com/rosetta/messenger/ui/auth/UnlockScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/auth/UnlockScreen.kt index 8e3551c..50c87fd 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/auth/UnlockScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/auth/UnlockScreen.kt @@ -581,6 +581,9 @@ fun UnlockScreen( // Connect to server and authenticate Log.d("UnlockScreen", "Connecting to server...") + ProtocolManager.connect() + // Give WebSocket time to connect before authenticating + kotlinx.coroutines.delay(500) ProtocolManager.authenticate(account.publicKey, privateKeyHash) accountManager.setCurrentAccount(account.publicKey)