feat: Fix WebSocket connection issues after account registration by ensuring connection before authentication
This commit is contained in:
69
FIX_WEBSOCKET_CONNECT.md
Normal file
69
FIX_WEBSOCKET_CONNECT.md
Normal 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
|
||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user