Skip to content

Commit d9d9063

Browse files
committed
fix FirebaseDatabase losing internal state when accessed via Firebase.database(app)
1 parent 40c6ba9 commit d9d9063

File tree

1 file changed

+17
-7
lines changed
  • firebase-database/src/androidMain/kotlin/dev/gitlive/firebase/database

1 file changed

+17
-7
lines changed

firebase-database/src/androidMain/kotlin/dev/gitlive/firebase/database/database.kt

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,21 @@ import dev.gitlive.firebase.Firebase
1616
import dev.gitlive.firebase.FirebaseApp
1717
import dev.gitlive.firebase.database.ChildEvent.Type
1818
import dev.gitlive.firebase.decode
19+
import dev.gitlive.firebase.database.FirebaseDatabase.Companion.FirebaseDatabase
20+
import kotlinx.coroutines.CancellationException
1921
import kotlinx.coroutines.channels.awaitClose
2022
import kotlinx.coroutines.coroutineScope
21-
import kotlinx.coroutines.flow.Flow
22-
import kotlinx.coroutines.flow.callbackFlow
23-
import kotlinx.coroutines.flow.filter
24-
import kotlinx.coroutines.flow.produceIn
2523
import kotlinx.coroutines.selects.select
2624
import kotlinx.coroutines.tasks.asDeferred
2725
import kotlinx.coroutines.tasks.await
2826
import kotlinx.coroutines.CompletableDeferred
27+
import kotlinx.coroutines.cancel
28+
import kotlinx.coroutines.channels.trySendBlocking
29+
import kotlinx.coroutines.flow.*
2930
import kotlinx.serialization.DeserializationStrategy
3031
import kotlinx.serialization.KSerializer
3132
import kotlinx.serialization.SerializationStrategy
33+
import java.util.WeakHashMap
3234

3335
suspend fun <T> Task<T>.awaitWhileOnline(): T = coroutineScope {
3436

@@ -56,7 +58,15 @@ actual fun Firebase.database(app: FirebaseApp) =
5658
actual fun Firebase.database(app: FirebaseApp, url: String) =
5759
FirebaseDatabase(com.google.firebase.database.FirebaseDatabase.getInstance(app.android, url))
5860

59-
actual class FirebaseDatabase internal constructor(val android: com.google.firebase.database.FirebaseDatabase) {
61+
actual class FirebaseDatabase private constructor(val android: com.google.firebase.database.FirebaseDatabase) {
62+
63+
companion object {
64+
private val instances = WeakHashMap<com.google.firebase.database.FirebaseDatabase, FirebaseDatabase>()
65+
66+
internal fun FirebaseDatabase(
67+
android: com.google.firebase.database.FirebaseDatabase
68+
) = instances.getOrPut(android) { dev.gitlive.firebase.database.FirebaseDatabase(android) }
69+
}
6070

6171
private var persistenceEnabled = true
6272

@@ -112,11 +122,11 @@ actual open class Query internal constructor(
112122
get() = callbackFlow {
113123
val listener = object : ValueEventListener {
114124
override fun onDataChange(snapshot: com.google.firebase.database.DataSnapshot) {
115-
trySend(DataSnapshot(snapshot, persistenceEnabled))
125+
trySendBlocking(DataSnapshot(snapshot, persistenceEnabled))
116126
}
117127

118128
override fun onCancelled(error: com.google.firebase.database.DatabaseError) {
119-
close(error.toException())
129+
cancel(CancellationException(error.message, error.toException()))
120130
}
121131
}
122132
android.addValueEventListener(listener)

0 commit comments

Comments
 (0)