connectUser() flushes the offline cache on a plain connectivity failure (offlineEnabled=true)
Maintainers usually reply within 2 days
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 50/100
Research direction
Start in ChatClient.setUser(), tracing its onErrorSuspend handler into disconnectSuspend(flushPersistence = true), disconnectUserSuspend(), repositoryFacade.clear(), and mutableClientState.clearState(). Reproduce the cold offline launch with offlineEnabled=true and verify that a connectivity-only connectUser() failure preserves cached data and local user state; add regression coverage if the relevant test location can be identified.
Written by the indexing model from the issue text.
Description
Describe the bug
A failed connectUser() (e.g. device is offline) triggers ChatClient.setUser()'s internal .onErrorSuspend { disconnectSuspend(flushPersistence = true) } handler, which wipes the client's offline Room cache via disconnectUserSuspend(flushPersistence = true) -> repositoryFacade.clear() and resets mutableClientState.clearState(). This happens on every failed connectUser() call, including a plain connectivity failure — not just auth errors — so a cold app launch while offline destroys the exact offline cache that ChatClientConfig(offlineEnabled = true) is meant to preserve for a returning, previously-authenticated user.
This directly contradicts the Offline Support guide, which frames flushPersistence = true as something a caller explicitly opts into (e.g. on logout), not a side effect of a failed reconnect — and the Handling User Connection guide, which explicitly says: "Make sure your implementation handles a missing network without recording it as a fatal error" — implying a connectUser() failure due to missing network is an expected, non-fatal occurrence, yet its side effect (wiping the offline cache) isn't documented anywhere.
SDK version
- 7.6.0 and 7.7.0 (confirmed on both by reading the actual
stream-chat-android-clientsources for each version; 7.7.0's changelog doesn't mention a related fix, and re-testing on-device against 7.7.0 reproduces the same behavior)
To Reproduce
- Sign in successfully with
ChatClient.Builder(apiKey, context).config(ChatClientConfig(offlineEnabled = true)).build(),connectUser(...), and browse channels while online so the offline cache is populated. - Fully close the app (kill the process).
- Put the device in airplane mode / disconnect all networks.
- Cold-launch the app again and call
connectUser(...)for the same user with notimeoutMilliseconds(or any value) — it resolves asResult.Failuresince the socket can't connect. - Observe:
ChannelsScreen/ChannelListViewModelfor this client now has an empty/perpetually-loading channel list,getCurrentUser()returnsnull, and the client's offline database has been cleared — even though step 1 successfully cached channels for this exact user.
Traced root cause (in io.getstream.chat.android.client.ChatClient, 7.6.0/7.7.0 sources):
private suspend fun setUser(...): Result<ConnectionData> {
...
return when {
...
userState is UserState.NotSet -> {
mutableClientState.setUser(user)
initializeClientWithUser(user, cacheableTokenProvider, isAnonymous)
userStateService.onSetUser(user, isAnonymous)
chatSocket.connectUser(user, isAnonymous)
mutableClientState.setInitializationState(InitializationState.COMPLETE)
waitFirstConnection(timeoutMilliseconds) // <- resolves Result.Failure offline, no timeout given
}
...
}.onErrorSuspend {
disconnectSuspend(flushPersistence = true) // <- runs on ANY Result.Failure, including pure connectivity failure
}
}
private suspend fun disconnectUserSuspend(flushPersistence: Boolean) {
...
if (flushPersistence) {
repositoryFacade.clear() // wipes the offline Room cache
userCredentialStorage.clear()
}
...
mutableClientState.clearState() // getCurrentUser() becomes null again
...
}
Expected behavior
A connectUser() failure caused purely by lack of connectivity should not flush the offline persistence layer or clear the client's local user state — the whole point of offlineEnabled = true is that a previously-authenticated user can browse cached channels/messages without a live connection. At minimum, this destructive side effect should be documented, or ideally scoped to real auth/credential errors rather than every Result.Failure (including plain network-unreachable cases).
Workaround we're using in the meantime
Checking device connectivity (our own ConnectivityManager-backed monitor) before calling connectUser() at all, and skipping the call entirely when known-offline — this avoids triggering the destructive path, at the cost of not restoring the previously-connected user's session (and thus not showing cached channels) on that specific cold-offline launch.
Additional context
- Related: #6009 ("Switching user cause ChannelScreen goes in an infinite loop and no chats are shown") describes the same downstream symptom (
ChannelsScreenstuck/empty after adisconnect(flushPersistence = true)), triggered by an explicitswitchUser()call rather than an implicit connectivity failure — but the underlying "post-flush, channel list never recovers" behavior looks like the same class of issue. - Happy to provide a minimal repro project if useful.
- Dominant language
- Kotlin
- Stars
- 1.7k
- Forks
- 319
- Avg merge
- 1d 19h
- Merged PRs (30d)
- 73
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from GetStream/stream-chat-android
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
GetStream/stream-chat-android#6762 ·
Maintainers usually reply within 2 days
-
feature request
Difficulty 3/5 1-2 days Newbie friendliness 65/100
GetStream/stream-chat-android#6556 · 1 comment · 1 reaction ·
Maintainers usually reply within 2 days
-
feature request
Difficulty 4/5 3-5 days Newbie friendliness 55/100
GetStream/stream-chat-android#6359 ·
Maintainers usually reply within 2 days
-
feature request
Difficulty 3/5 1-2 days Newbie friendliness 38/100
GetStream/stream-chat-android#6243 ·
Maintainers usually reply within 2 days
-
compose feature request
Difficulty 4/5 3-5 days Newbie friendliness 35/100
GetStream/stream-chat-android#5612 · 3 comments ·
Maintainers usually reply within 2 days
All issues in GetStream/stream-chat-android
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
mobile-dev-inc/Maestro#3646 · 1 comment ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
SimonHalvdansson/Harmonic-HN#363 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
Maintainers usually reply within 1 day