Skip to content

Commit 69e4516

Browse files
committed
Ensure API stability
1 parent e126519 commit 69e4516

File tree

10 files changed

+219
-290
lines changed
  • firebase-database/src
    • androidMain/kotlin/dev/gitlive/firebase/database
    • commonMain/kotlin/dev/gitlive/firebase/database
    • iosMain/kotlin/dev/gitlive/firebase/database
    • jsMain/kotlin/dev/gitlive/firebase/database
  • firebase-firestore/src
  • firebase-functions/src/commonMain/kotlin/dev/gitlive/firebase/functions

10 files changed

+219
-290
lines changed

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

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import kotlinx.coroutines.flow.*
1616
import kotlinx.coroutines.tasks.await
1717
import kotlinx.serialization.DeserializationStrategy
1818
import kotlinx.serialization.KSerializer
19-
import kotlinx.serialization.SerializationStrategy
2019
import java.util.*
2120
import kotlin.time.Duration.Companion.seconds
2221

@@ -72,10 +71,23 @@ actual class FirebaseDatabase private constructor(val android: com.google.fireba
7271
android.useEmulator(host, port)
7372
}
7473

75-
actual open class Query internal constructor(
76-
open val android: com.google.firebase.database.Query,
77-
val persistenceEnabled: Boolean
74+
actual data class NativeQuery(
75+
val android: com.google.firebase.database.Query,
76+
val persistenceEnabled: Boolean,
77+
)
78+
79+
actual open class Query internal actual constructor(
80+
nativeQuery: NativeQuery
7881
) {
82+
83+
internal constructor(
84+
android: com.google.firebase.database.Query,
85+
persistenceEnabled: Boolean
86+
) : this(NativeQuery(android, persistenceEnabled))
87+
88+
open val android: com.google.firebase.database.Query = nativeQuery.android
89+
val persistenceEnabled: Boolean = nativeQuery.persistenceEnabled
90+
7991
actual fun orderByKey() = Query(android.orderByKey(), persistenceEnabled)
8092

8193
actual fun orderByValue() = Query(android.orderByValue(), persistenceEnabled)
@@ -156,7 +168,7 @@ actual open class Query internal constructor(
156168
actual class DatabaseReference internal constructor(
157169
override val android: com.google.firebase.database.DatabaseReference,
158170
persistenceEnabled: Boolean
159-
): Query(android, persistenceEnabled) {
171+
): BaseDatabaseReference(NativeQuery(android, persistenceEnabled)) {
160172

161173
actual val key get() = android.key
162174
val database = FirebaseDatabase(android.database)
@@ -166,17 +178,12 @@ actual class DatabaseReference internal constructor(
166178
actual fun push() = DatabaseReference(android.push(), persistenceEnabled)
167179
actual fun onDisconnect() = OnDisconnect(android.onDisconnect(), persistenceEnabled, database)
168180

169-
actual suspend inline fun <reified T> setValue(value: T?, encodeSettings: EncodeSettings) = android.setValue(encode(value, encodeSettings))
181+
override suspend fun setValueEncoded(encodedValue: Any?) = android.setValue(encodedValue)
170182
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
171183
.run { Unit }
172184

173-
actual suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeSettings: EncodeSettings) =
174-
android.setValue(encode(strategy, value, encodeSettings))
175-
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
176-
.run { Unit }
177-
178185
@Suppress("UNCHECKED_CAST")
179-
actual suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) =
186+
override suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) =
180187
android.updateChildren(encode(update, encodeSettings) as Map<String, Any?>)
181188
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
182189
.run { Unit }
@@ -241,7 +248,7 @@ actual class OnDisconnect internal constructor(
241248
val android: com.google.firebase.database.OnDisconnect,
242249
val persistenceEnabled: Boolean,
243250
val database: FirebaseDatabase,
244-
) {
251+
) : BaseOnDisconnect() {
245252

246253
actual suspend fun removeValue() = android.removeValue()
247254
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
@@ -251,17 +258,11 @@ actual class OnDisconnect internal constructor(
251258
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
252259
.run { Unit }
253260

254-
actual suspend inline fun <reified T> setValue(value: T, encodeSettings: EncodeSettings) =
255-
android.setValue(encode(value, encodeSettings))
261+
override suspend fun setValue(encodedValue: Any?) = android.setValue(encodedValue)
256262
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
257263
.run { Unit }
258264

259-
actual suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeSettings: EncodeSettings) =
260-
android.setValue(encode(strategy, value, encodeSettings))
261-
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
262-
.run { Unit}
263-
264-
actual suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) =
265+
override suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) =
265266
android.updateChildren(update.mapValues { (_, it) -> encode(it, encodeSettings) })
266267
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
267268
.run { Unit }

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

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import dev.gitlive.firebase.EncodeSettings
99
import dev.gitlive.firebase.Firebase
1010
import dev.gitlive.firebase.FirebaseApp
1111
import dev.gitlive.firebase.database.ChildEvent.Type.*
12+
import dev.gitlive.firebase.encode
1213
import kotlinx.coroutines.flow.Flow
1314
import kotlinx.serialization.DeserializationStrategy
1415
import kotlinx.serialization.KSerializer
@@ -47,7 +48,9 @@ data class ChildEvent internal constructor(
4748
}
4849
}
4950

50-
expect open class Query {
51+
expect class NativeQuery
52+
53+
expect open class Query internal constructor(nativeQuery: NativeQuery) {
5154
val valueEvents: Flow<DataSnapshot>
5255
fun childEvents(vararg types: ChildEvent.Type = arrayOf(ADDED, CHANGED, MOVED, REMOVED)): Flow<ChildEvent>
5356
fun orderByKey(): Query
@@ -66,14 +69,26 @@ expect open class Query {
6669
fun equalTo(value: Boolean, key: String? = null): Query
6770
}
6871

69-
expect class DatabaseReference : Query {
72+
abstract class BaseDatabaseReference internal constructor(nativeQuery: NativeQuery) : Query(nativeQuery) {
73+
suspend inline fun <reified T> setValue(value: T?, encodeDefaults: Boolean) =
74+
setValue(value, EncodeSettings(shouldEncodeElementDefault = encodeDefaults))
75+
suspend inline fun <reified T> setValue(value: T?, encodeSettings: EncodeSettings = EncodeSettings()) =
76+
setValueEncoded(encode(value, encodeSettings))
77+
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeDefaults: Boolean) =
78+
setValue(strategy, value, EncodeSettings(shouldEncodeElementDefault = encodeDefaults))
79+
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeSettings: EncodeSettings = EncodeSettings()) = setValueEncoded(encode(strategy, value, encodeSettings))
80+
81+
abstract suspend fun setValueEncoded(encodedValue: Any?)
82+
suspend fun updateChildren(update: Map<String, Any?>, encodeDefaults: Boolean) = updateChildren(update, EncodeSettings(shouldEncodeElementDefault = encodeDefaults))
83+
abstract suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings = EncodeSettings())
84+
}
85+
86+
expect class DatabaseReference : BaseDatabaseReference {
7087
val key: String?
7188
fun push(): DatabaseReference
7289
fun child(path: String): DatabaseReference
7390
fun onDisconnect(): OnDisconnect
74-
suspend inline fun <reified T> setValue(value: T?, encodeSettings: EncodeSettings = EncodeSettings())
75-
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeSettings: EncodeSettings = EncodeSettings())
76-
suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings = EncodeSettings())
91+
7792
suspend fun removeValue()
7893

7994
suspend fun <T> runTransaction(strategy: KSerializer<T>, decodeSettings: DecodeSettings = DecodeSettings(), transactionUpdate: (currentData: T) -> T): DataSnapshot
@@ -93,10 +108,21 @@ expect class DataSnapshot {
93108

94109
expect class DatabaseException(message: String?, cause: Throwable?) : RuntimeException
95110

96-
expect class OnDisconnect {
111+
abstract class BaseOnDisconnect internal constructor() {
112+
suspend inline fun <reified T> setValue(value: T?, encodeDefaults: Boolean) =
113+
setValue(value, EncodeSettings(shouldEncodeElementDefault = encodeDefaults))
114+
suspend inline fun <reified T> setValue(value: T?, encodeSettings: EncodeSettings = EncodeSettings()) =
115+
setValue(encode(value, encodeSettings))
116+
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeDefaults: Boolean) =
117+
setValue(strategy, value, EncodeSettings(shouldEncodeElementDefault = encodeDefaults))
118+
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeSettings: EncodeSettings = EncodeSettings()) = setValue(encode(strategy, value, encodeSettings))
119+
abstract suspend fun setValue(encodedValue: Any?)
120+
121+
abstract suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings = EncodeSettings())
122+
suspend fun updateChildren(update: Map<String, Any?>, encodeDefaults: Boolean) = updateChildren(update, EncodeSettings(shouldEncodeElementDefault = encodeDefaults))
123+
}
124+
125+
expect class OnDisconnect : BaseOnDisconnect {
97126
suspend fun removeValue()
98127
suspend fun cancel()
99-
suspend inline fun <reified T> setValue(value: T, encodeSettings: EncodeSettings = EncodeSettings())
100-
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeSettings: EncodeSettings = EncodeSettings())
101-
suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings = EncodeSettings())
102128
}

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

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,20 @@ fun Type.toEventType() = when(this) {
6565
REMOVED -> FIRDataEventTypeChildRemoved
6666
}
6767

68-
actual open class Query internal constructor(
68+
actual data class NativeQuery(
6969
open val ios: FIRDatabaseQuery,
7070
val persistenceEnabled: Boolean
71+
)
72+
73+
actual open class Query internal actual constructor(
74+
nativeQuery: NativeQuery
7175
) {
76+
77+
internal constructor(ios: FIRDatabaseQuery, persistenceEnabled: Boolean) : this(NativeQuery(ios, persistenceEnabled))
78+
79+
open val ios: FIRDatabaseQuery = nativeQuery.ios
80+
val persistenceEnabled: Boolean = nativeQuery.persistenceEnabled
81+
7282
actual fun orderByKey() = Query(ios.queryOrderedByKey(), persistenceEnabled)
7383

7484
actual fun orderByValue() = Query(ios.queryOrderedByValue(), persistenceEnabled)
@@ -127,7 +137,7 @@ actual open class Query internal constructor(
127137
actual class DatabaseReference internal constructor(
128138
override val ios: FIRDatabaseReference,
129139
persistenceEnabled: Boolean
130-
): Query(ios, persistenceEnabled) {
140+
): BaseDatabaseReference(NativeQuery(ios, persistenceEnabled)) {
131141

132142
actual val key get() = ios.key
133143

@@ -136,16 +146,12 @@ actual class DatabaseReference internal constructor(
136146
actual fun push() = DatabaseReference(ios.childByAutoId(), persistenceEnabled)
137147
actual fun onDisconnect() = OnDisconnect(ios, persistenceEnabled)
138148

139-
actual suspend inline fun <reified T> setValue(value: T?, encodeSettings: EncodeSettings) {
140-
ios.await(persistenceEnabled) { setValue(encode(value, encodeSettings), it) }
141-
}
142-
143-
actual suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeSettings: EncodeSettings) {
144-
ios.await(persistenceEnabled) { setValue(encode(strategy, value, encodeSettings), it) }
149+
override suspend fun setValueEncoded(encodedValue: Any?) {
150+
ios.await(persistenceEnabled) { setValue(encodedValue, it) }
145151
}
146152

147153
@Suppress("UNCHECKED_CAST")
148-
actual suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) {
154+
override suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) {
149155
ios.await(persistenceEnabled) { updateChildValues(encode(update, encodeSettings) as Map<Any?, *>, it) }
150156
}
151157

@@ -203,7 +209,7 @@ actual class DataSnapshot internal constructor(
203209
actual class OnDisconnect internal constructor(
204210
val ios: FIRDatabaseReference,
205211
val persistenceEnabled: Boolean
206-
) {
212+
) : BaseOnDisconnect() {
207213
actual suspend fun removeValue() {
208214
ios.await(persistenceEnabled) { onDisconnectRemoveValueWithCompletionBlock(it) }
209215
}
@@ -212,16 +218,12 @@ actual class OnDisconnect internal constructor(
212218
ios.await(persistenceEnabled) { cancelDisconnectOperationsWithCompletionBlock(it) }
213219
}
214220

215-
actual suspend inline fun <reified T> setValue(value: T, encodeSettings: EncodeSettings) {
216-
ios.await(persistenceEnabled) { onDisconnectSetValue(encode(value, encodeSettings), it) }
217-
}
218-
219-
actual suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeSettings: EncodeSettings) {
220-
ios.await(persistenceEnabled) { onDisconnectSetValue(encode(strategy, value, encodeSettings), it) }
221+
override suspend fun setValue(encodedValue: Any?) {
222+
ios.await(persistenceEnabled) { onDisconnectSetValue(encodedValue, it) }
221223
}
222224

223225
@Suppress("UNCHECKED_CAST")
224-
actual suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) {
226+
override suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) {
225227
ios.await(persistenceEnabled) { onDisconnectUpdateChildValues(update.mapValues { (_, it) -> encode(it, encodeSettings) } as Map<Any?, *>, it) }
226228
}
227229
}

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

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import kotlinx.coroutines.flow.produceIn
1515
import kotlinx.coroutines.selects.select
1616
import kotlinx.serialization.DeserializationStrategy
1717
import kotlinx.serialization.KSerializer
18-
import kotlinx.serialization.SerializationStrategy
1918
import kotlin.js.Promise
2019
import kotlin.js.json
2120
import dev.gitlive.firebase.database.externals.DataSnapshot as JsDataSnapshot
@@ -52,11 +51,20 @@ actual class FirebaseDatabase internal constructor(val js: Database) {
5251
actual fun useEmulator(host: String, port: Int) = rethrow { connectDatabaseEmulator(js, host, port) }
5352
}
5453

55-
actual open class Query internal constructor(
56-
open val js: JsQuery,
54+
actual data class NativeQuery(
55+
val js: JsQuery,
5756
val database: Database
57+
)
58+
59+
actual open class Query internal actual constructor(
60+
nativeQuery: NativeQuery
5861
) {
5962

63+
internal constructor(js: JsQuery, database: Database) : this(NativeQuery(js, database))
64+
65+
open val js: JsQuery = nativeQuery.js
66+
val database: Database = nativeQuery.database
67+
6068
actual fun orderByKey() = Query(query(js, jsOrderByKey()), database)
6169
actual fun orderByValue() = Query(query(js, jsOrderByValue()), database)
6270
actual fun orderByChild(path: String) = Query(query(js, jsOrderByChild(path)), database)
@@ -130,25 +138,23 @@ actual open class Query internal constructor(
130138
actual class DatabaseReference internal constructor(
131139
override val js: JsDatabaseReference,
132140
database: Database
133-
) : Query(js, database) {
141+
) : BaseDatabaseReference(NativeQuery(js, database)) {
134142

135143
actual val key get() = rethrow { js.key }
136144
actual fun push() = rethrow { DatabaseReference(push(js), database) }
137145
actual fun child(path: String) = rethrow { DatabaseReference(child(js, path), database) }
138146

139147
actual fun onDisconnect() = rethrow { OnDisconnect(onDisconnect(js), database) }
140148

141-
actual suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) =
142-
rethrow { update(js, encode(update, encodeSettings) ?: json()).awaitWhileOnline(database) }
143-
144149
actual suspend fun removeValue() = rethrow { remove(js).awaitWhileOnline(database) }
145150

146-
actual suspend inline fun <reified T> setValue(value: T?, encodeSettings: EncodeSettings) = rethrow {
147-
set(js, encode(value, encodeSettings)).awaitWhileOnline(database)
151+
override suspend fun setValueEncoded(encodedValue: Any?) = rethrow {
152+
set(js, encodedValue).awaitWhileOnline(database)
148153
}
149154

150-
actual suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeSettings: EncodeSettings) =
151-
rethrow { set(js, encode(strategy, value, encodeSettings)).awaitWhileOnline(database) }
155+
override suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) =
156+
rethrow { update(js, encode(update, encodeSettings) ?: json()).awaitWhileOnline(database) }
157+
152158

153159
actual suspend fun <T> runTransaction(strategy: KSerializer<T>, decodeSettings: DecodeSettings, transactionUpdate: (currentData: T) -> T): DataSnapshot {
154160
return DataSnapshot(jsRunTransaction(js, transactionUpdate).awaitWhileOnline(database).snapshot, database)
@@ -187,19 +193,17 @@ actual class DataSnapshot internal constructor(
187193
actual class OnDisconnect internal constructor(
188194
val js: JsOnDisconnect,
189195
val database: Database
190-
) {
196+
) : BaseOnDisconnect() {
191197

192198
actual suspend fun removeValue() = rethrow { js.remove().awaitWhileOnline(database) }
193199
actual suspend fun cancel() = rethrow { js.cancel().awaitWhileOnline(database) }
194200

195-
actual suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) =
196-
rethrow { js.update(encode(update, encodeSettings) ?: json()).awaitWhileOnline(database) }
201+
override suspend fun setValue(encodedValue: Any?) =
202+
rethrow { js.set(encodedValue).awaitWhileOnline(database) }
197203

198-
actual suspend inline fun <reified T> setValue(value: T, encodeSettings: EncodeSettings) =
199-
rethrow { js.set(encode(value, encodeSettings)).awaitWhileOnline(database) }
204+
override suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) =
205+
rethrow { js.update(encode(update, encodeSettings) ?: json()).awaitWhileOnline(database) }
200206

201-
actual suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeSettings: EncodeSettings) =
202-
rethrow { js.set(encode(strategy, value, encodeSettings)).awaitWhileOnline(database) }
203207
}
204208

205209
actual class DatabaseException actual constructor(message: String?, cause: Throwable?) : RuntimeException(message, cause) {

0 commit comments

Comments
 (0)