@@ -16,19 +16,21 @@ import dev.gitlive.firebase.Firebase
16
16
import dev.gitlive.firebase.FirebaseApp
17
17
import dev.gitlive.firebase.database.ChildEvent.Type
18
18
import dev.gitlive.firebase.decode
19
+ import dev.gitlive.firebase.database.FirebaseDatabase.Companion.FirebaseDatabase
20
+ import kotlinx.coroutines.CancellationException
19
21
import kotlinx.coroutines.channels.awaitClose
20
22
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
25
23
import kotlinx.coroutines.selects.select
26
24
import kotlinx.coroutines.tasks.asDeferred
27
25
import kotlinx.coroutines.tasks.await
28
26
import kotlinx.coroutines.CompletableDeferred
27
+ import kotlinx.coroutines.cancel
28
+ import kotlinx.coroutines.channels.trySendBlocking
29
+ import kotlinx.coroutines.flow.*
29
30
import kotlinx.serialization.DeserializationStrategy
30
31
import kotlinx.serialization.KSerializer
31
32
import kotlinx.serialization.SerializationStrategy
33
+ import java.util.WeakHashMap
32
34
33
35
suspend fun <T > Task<T>.awaitWhileOnline (): T = coroutineScope {
34
36
@@ -56,7 +58,15 @@ actual fun Firebase.database(app: FirebaseApp) =
56
58
actual fun Firebase.database (app : FirebaseApp , url : String ) =
57
59
FirebaseDatabase (com.google.firebase.database.FirebaseDatabase .getInstance(app.android, url))
58
60
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
+ }
60
70
61
71
private var persistenceEnabled = true
62
72
@@ -112,11 +122,11 @@ actual open class Query internal constructor(
112
122
get() = callbackFlow {
113
123
val listener = object : ValueEventListener {
114
124
override fun onDataChange (snapshot : com.google.firebase.database.DataSnapshot ) {
115
- trySend (DataSnapshot (snapshot, persistenceEnabled))
125
+ trySendBlocking (DataSnapshot (snapshot, persistenceEnabled))
116
126
}
117
127
118
128
override fun onCancelled (error : com.google.firebase.database.DatabaseError ) {
119
- close( error.toException())
129
+ cancel( CancellationException ( error.message, error. toException() ))
120
130
}
121
131
}
122
132
android.addValueEventListener(listener)
0 commit comments