Skip to content

Commit 5fa61ca

Browse files
committed
add awaitWhileOnline
1 parent 0c370aa commit 5fa61ca

File tree

1 file changed

+34
-10
lines changed
  • firebase-database/src/androidMain/kotlin/dev/teamhub/firebase/database

1 file changed

+34
-10
lines changed

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

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.teamhub.firebase.database
22

3+
import com.google.android.gms.tasks.Task
34
import com.google.firebase.database.*
45
import com.google.firebase.database.DataSnapshot
56
import com.google.firebase.database.DatabaseError
@@ -9,11 +10,34 @@ import com.google.firebase.database.Exclude
910
import com.google.firebase.database.FirebaseDatabase
1011
import com.google.firebase.database.IgnoreExtraProperties
1112
import com.google.firebase.database.OnDisconnect
12-
import com.google.firebase.database.ValueEventListener
13-
import kotlinx.coroutines.tasks.await
13+
import kotlinx.coroutines.CompletableDeferred
14+
import kotlinx.coroutines.selects.select
15+
import kotlinx.coroutines.tasks.asDeferred
1416

1517
import kotlin.reflect.KClass
1618

19+
suspend fun <T> Task<T>.awaitWhileOnline(): T {
20+
val notConnected = CompletableDeferred<Unit>()
21+
val reference = getFirebaseDatabase().getReference(".info/connected")
22+
val listener = reference.addValueEventListener(object : ValueEventListener {
23+
override fun onCancelled(error: DatabaseError) {
24+
notConnected.completeExceptionally(error.toException())
25+
}
26+
override fun onDataChange(snapshot: DataSnapshot) {
27+
if(snapshot.value == false) notConnected.complete(Unit)
28+
}
29+
})
30+
31+
try {
32+
return select {
33+
asDeferred().onAwait { it }
34+
notConnected.onAwait { throw DatabaseException("Database not connected") }
35+
}
36+
} finally {
37+
reference.removeEventListener(listener)
38+
}
39+
}
40+
1741
actual fun getFirebaseDatabase() = FirebaseDatabase.getInstance()
1842

1943
actual typealias LoggerLevel = Logger.Level
@@ -22,11 +46,11 @@ actual typealias FirebaseDatabase = FirebaseDatabase
2246

2347
actual typealias DatabaseReference = DatabaseReference
2448

25-
actual suspend fun DatabaseReference.awaitSetValue(value: Any?) = setValue(value).await().run { Unit }
49+
actual suspend fun DatabaseReference.awaitSetValue(value: Any?) = setValue(value).awaitWhileOnline().run { Unit }
2650

27-
actual suspend fun DatabaseReference.awaitUpdateChildren(update: Map<String, Any?>) = updateChildren(update).await().run { Unit }
51+
actual suspend fun DatabaseReference.awaitUpdateChildren(update: Map<String, Any?>) = updateChildren(update).awaitWhileOnline().run { Unit }
2852

29-
actual typealias ValueEventListener = ValueEventListener
53+
actual typealias ValueEventListener = com.google.firebase.database.ValueEventListener
3054

3155
actual typealias DataSnapshot = DataSnapshot
3256

@@ -52,17 +76,17 @@ actual typealias DatabaseError = DatabaseError
5276

5377
actual typealias OnDisconnect = OnDisconnect
5478

55-
actual suspend fun OnDisconnect.awaitRemoveValue() = removeValue().await().run { Unit }
79+
actual suspend fun OnDisconnect.awaitRemoveValue() = removeValue().awaitWhileOnline().run { Unit }
5680

57-
actual suspend fun OnDisconnect.awaitCancel() = cancel().await().run { Unit }
81+
actual suspend fun OnDisconnect.awaitCancel() = cancel().awaitWhileOnline().run { Unit }
5882

59-
actual suspend fun OnDisconnect.awaitSetValue(value: Any?) = setValue(value).await().run { Unit }
83+
actual suspend fun OnDisconnect.awaitSetValue(value: Any?) = setValue(value).awaitWhileOnline().run { Unit }
6084

61-
actual suspend fun OnDisconnect.awaitUpdateChildren(update: Map<String, Any?>) = updateChildren(update).await().run { Unit }
85+
actual suspend fun OnDisconnect.awaitUpdateChildren(update: Map<String, Any?>) = updateChildren(update).awaitWhileOnline().run { Unit }
6286

6387
actual val TIMESTAMP = ServerValue.TIMESTAMP
6488

65-
actual suspend fun DatabaseReference.awaitRemoveValue() = removeValue().await().run { Unit }
89+
actual suspend fun DatabaseReference.awaitRemoveValue() = removeValue().awaitWhileOnline().run { Unit }
6690

6791
actual fun FirebaseDatabase.getReference(path: String) = getReference(path)
6892

0 commit comments

Comments
 (0)