feat: Fix WebSocket connection issues after account registration by ensuring connection before authentication

This commit is contained in:
k1ngsterr1
2026-01-11 16:19:44 +05:00
parent 5f21f120f1
commit 70ed7fbc6e
4 changed files with 89 additions and 2 deletions

69
FIX_WEBSOCKET_CONNECT.md Normal file
View File

@@ -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

View File

@@ -175,7 +175,13 @@ class AuthStateManager(
loadAccounts() 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...") Log.d(TAG, "🌐 Authenticating with protocol server...")
ProtocolManager.authenticate(keyPair.publicKey, privateKeyHash) ProtocolManager.authenticate(keyPair.publicKey, privateKeyHash)
@@ -236,7 +242,13 @@ class AuthStateManager(
status = AuthStatus.Authenticated(decryptedAccount) 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...") Log.d(TAG, "🌐 Authenticating with protocol server...")
ProtocolManager.authenticate(decryptedAccount.publicKey, decryptedAccount.privateKeyHash) ProtocolManager.authenticate(decryptedAccount.publicKey, decryptedAccount.privateKeyHash)

View File

@@ -497,6 +497,9 @@ fun SetPasswordScreen(
// 🔌 Connect to server and authenticate // 🔌 Connect to server and authenticate
val privateKeyHash = CryptoManager.generatePrivateKeyHash(keyPair.privateKey) val privateKeyHash = CryptoManager.generatePrivateKeyHash(keyPair.privateKey)
Log.d("SetPasswordScreen", "🔌 Connecting to server...") Log.d("SetPasswordScreen", "🔌 Connecting to server...")
ProtocolManager.connect()
// Give WebSocket time to connect before authenticating
kotlinx.coroutines.delay(500)
ProtocolManager.authenticate(keyPair.publicKey, privateKeyHash) ProtocolManager.authenticate(keyPair.publicKey, privateKeyHash)
onAccountCreated() onAccountCreated()

View File

@@ -581,6 +581,9 @@ fun UnlockScreen(
// Connect to server and authenticate // Connect to server and authenticate
Log.d("UnlockScreen", "Connecting to server...") Log.d("UnlockScreen", "Connecting to server...")
ProtocolManager.connect()
// Give WebSocket time to connect before authenticating
kotlinx.coroutines.delay(500)
ProtocolManager.authenticate(account.publicKey, privateKeyHash) ProtocolManager.authenticate(account.publicKey, privateKeyHash)
accountManager.setCurrentAccount(account.publicKey) accountManager.setCurrentAccount(account.publicKey)