Skip to content

Commit f75b240

Browse files
committed
Use Wrappers rather than Abstract classes
1 parent 26d7ea9 commit f75b240

File tree

8 files changed

+148
-110
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-functions/src

8 files changed

+148
-110
lines changed

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

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,10 @@ actual class FirebaseDatabase private constructor(val android: com.google.fireba
7474
private var persistenceEnabled = true
7575

7676
actual fun reference(path: String) =
77-
DatabaseReference(android.getReference(path), persistenceEnabled)
77+
DatabaseReference(NativeDatabaseReference(android.getReference(path), persistenceEnabled))
7878

7979
actual fun reference() =
80-
DatabaseReference(android.reference, persistenceEnabled)
80+
DatabaseReference(NativeDatabaseReference(android.reference, persistenceEnabled))
8181

8282
actual fun setPersistenceEnabled(enabled: Boolean) =
8383
android.setPersistenceEnabled(enabled).also { persistenceEnabled = enabled }
@@ -89,8 +89,8 @@ actual class FirebaseDatabase private constructor(val android: com.google.fireba
8989
android.useEmulator(host, port)
9090
}
9191

92-
actual data class NativeQuery(
93-
val android: com.google.firebase.database.Query,
92+
internal actual open class NativeQuery(
93+
open val android: com.google.firebase.database.Query,
9494
val persistenceEnabled: Boolean,
9595
)
9696

@@ -183,25 +183,26 @@ actual open class Query internal actual constructor(
183183
override fun toString() = android.toString()
184184
}
185185

186-
actual class DatabaseReference internal constructor(
186+
@PublishedApi
187+
internal actual class NativeDatabaseReference internal constructor(
187188
override val android: com.google.firebase.database.DatabaseReference,
188189
persistenceEnabled: Boolean
189-
): BaseDatabaseReference(NativeQuery(android, persistenceEnabled)) {
190+
): NativeQuery(android, persistenceEnabled) {
190191

191192
actual val key get() = android.key
192193
val database = FirebaseDatabase(android.database)
193194

194-
actual fun child(path: String) = DatabaseReference(android.child(path), persistenceEnabled)
195+
actual fun child(path: String) = NativeDatabaseReference(android.child(path), persistenceEnabled)
195196

196-
actual fun push() = DatabaseReference(android.push(), persistenceEnabled)
197-
actual fun onDisconnect() = OnDisconnect(android.onDisconnect(), persistenceEnabled, database)
197+
actual fun push() = NativeDatabaseReference(android.push(), persistenceEnabled)
198+
actual fun onDisconnect() = NativeOnDisconnect(android.onDisconnect(), persistenceEnabled, database)
198199

199-
override suspend fun setValueEncoded(encodedValue: Any?) = android.setValue(encodedValue)
200+
actual suspend fun setValueEncoded(encodedValue: Any?) = android.setValue(encodedValue)
200201
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
201202
.run { Unit }
202203

203204
@Suppress("UNCHECKED_CAST")
204-
override suspend fun updateEncodedChildren(encodedUpdate: Any?) =
205+
actual suspend fun updateEncodedChildren(encodedUpdate: Any?) =
205206
android.updateChildren(encodedUpdate as Map<String, Any?>)
206207
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
207208
.run { Unit }
@@ -245,6 +246,9 @@ actual class DatabaseReference internal constructor(
245246
return deferred.await()
246247
}
247248
}
249+
250+
val DatabaseReference.android get() = nativeReference.android
251+
248252
@Suppress("UNCHECKED_CAST")
249253
actual class DataSnapshot internal constructor(
250254
val android: com.google.firebase.database.DataSnapshot,
@@ -255,7 +259,7 @@ actual class DataSnapshot internal constructor(
255259

256260
actual val key get() = android.key
257261

258-
actual val ref: DatabaseReference get() = DatabaseReference(android.ref, persistenceEnabled)
262+
actual val ref: DatabaseReference get() = DatabaseReference(NativeDatabaseReference(android.ref, persistenceEnabled))
259263

260264
actual val value get() = android.value
261265

@@ -270,11 +274,12 @@ actual class DataSnapshot internal constructor(
270274
actual val children: Iterable<DataSnapshot> get() = android.children.map { DataSnapshot(it, persistenceEnabled) }
271275
}
272276

273-
actual class OnDisconnect internal constructor(
277+
@PublishedApi
278+
internal actual class NativeOnDisconnect internal constructor(
274279
val android: com.google.firebase.database.OnDisconnect,
275280
val persistenceEnabled: Boolean,
276281
val database: FirebaseDatabase,
277-
) : BaseOnDisconnect() {
282+
) {
278283

279284
actual suspend fun removeValue() = android.removeValue()
280285
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
@@ -284,14 +289,18 @@ actual class OnDisconnect internal constructor(
284289
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
285290
.run { Unit }
286291

287-
override suspend fun setValue(encodedValue: Any?) = android.setValue(encodedValue)
292+
actual suspend fun setValue(encodedValue: Any?) = android.setValue(encodedValue)
288293
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
289294
.run { Unit }
290295

291-
override suspend fun updateEncodedChildren(encodedUpdate: Map<String, Any?>) =
296+
actual suspend fun updateEncodedChildren(encodedUpdate: Map<String, Any?>) =
292297
android.updateChildren(encodedUpdate)
293298
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
294299
.run { Unit }
295300
}
296301

302+
val OnDisconnect.android get() = native.android
303+
val OnDisconnect.persistenceEnabled get() = native.persistenceEnabled
304+
val OnDisconnect.database get() = native.database
305+
297306
actual typealias DatabaseException = com.google.firebase.database.DatabaseException

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

Lines changed: 39 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ data class ChildEvent internal constructor(
5252
}
5353
}
5454

55-
expect class NativeQuery
55+
internal expect open class NativeQuery
5656

5757
expect open class Query internal constructor(nativeQuery: NativeQuery) {
5858
val valueEvents: Flow<DataSnapshot>
@@ -73,46 +73,52 @@ expect open class Query internal constructor(nativeQuery: NativeQuery) {
7373
fun equalTo(value: Boolean, key: String? = null): Query
7474
}
7575

76-
abstract class BaseDatabaseReference internal constructor(nativeQuery: NativeQuery) : Query(nativeQuery) {
76+
@PublishedApi
77+
internal expect class NativeDatabaseReference : NativeQuery {
78+
val key: String?
79+
fun push(): NativeDatabaseReference
80+
suspend fun setValueEncoded(encodedValue: Any?)
81+
suspend fun updateEncodedChildren(encodedUpdate: Any?)
82+
fun child(path: String): NativeDatabaseReference
83+
fun onDisconnect(): NativeOnDisconnect
84+
85+
suspend fun removeValue()
86+
87+
suspend fun <T> runTransaction(strategy: KSerializer<T>, buildSettings: EncodeDecodeSettingsBuilder.() -> Unit = {}, transactionUpdate: (currentData: T) -> T): DataSnapshot
88+
}
89+
90+
class DatabaseReference internal constructor(@PublishedApi internal val nativeReference: NativeDatabaseReference) : Query(nativeReference) {
91+
92+
val key: String? = nativeReference.key
93+
fun push(): DatabaseReference = DatabaseReference(nativeReference.push())
94+
fun child(path: String): DatabaseReference = DatabaseReference(nativeReference.child(path))
95+
fun onDisconnect(): OnDisconnect = OnDisconnect(nativeReference.onDisconnect())
7796

7897
@Deprecated("Deprecated. Use builder instead", replaceWith = ReplaceWith("setValue(value) { this.encodeDefaults = encodeDefaults }"))
7998
suspend inline fun <reified T> setValue(value: T?, encodeDefaults: Boolean) =
8099
setValue(value) {
81100
this.encodeDefaults = encodeDefaults
82101
}
83102
suspend inline fun <reified T> setValue(value: T?, buildSettings: EncodeSettings.Builder.() -> Unit = {}) =
84-
setValueEncoded(encode(value, buildSettings))
103+
nativeReference.setValueEncoded(encode(value, buildSettings))
85104

86105
@Deprecated("Deprecated. Use builder instead", replaceWith = ReplaceWith("setValue(strategy, value) { this.encodeDefaults = encodeDefaults }"))
87106
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeDefaults: Boolean) =
88107
setValue(strategy, value) {
89108
this.encodeDefaults = encodeDefaults
90109
}
91-
suspend inline fun <T> setValue(strategy: SerializationStrategy<T>, value: T, buildSettings: EncodeSettings.Builder.() -> Unit = {}) = setValueEncoded(encode(strategy, value, buildSettings))
92-
93-
@PublishedApi
94-
internal abstract suspend fun setValueEncoded(encodedValue: Any?)
110+
suspend inline fun <T> setValue(strategy: SerializationStrategy<T>, value: T, buildSettings: EncodeSettings.Builder.() -> Unit = {}) = nativeReference.setValueEncoded(encode(strategy, value, buildSettings))
95111

96112
@Deprecated("Deprecated. Use builder instead", replaceWith = ReplaceWith("updateChildren(update) { this.encodeDefaults = encodeDefaults }"))
97113
suspend fun updateChildren(update: Map<String, Any?>, encodeDefaults: Boolean) = updateChildren(update) {
98114
this.encodeDefaults = encodeDefaults
99115
}
100-
suspend inline fun updateChildren(update: Map<String, Any?>, buildSettings: EncodeSettings.Builder.() -> Unit = {}) = updateEncodedChildren(
116+
suspend inline fun updateChildren(update: Map<String, Any?>, buildSettings: EncodeSettings.Builder.() -> Unit = {}) = nativeReference.updateEncodedChildren(
101117
encode(update, buildSettings))
102118

103-
@PublishedApi
104-
internal abstract suspend fun updateEncodedChildren(encodedUpdate: Any?)
105-
}
106-
107-
expect class DatabaseReference : BaseDatabaseReference {
108-
val key: String?
109-
fun push(): DatabaseReference
110-
fun child(path: String): DatabaseReference
111-
fun onDisconnect(): OnDisconnect
119+
suspend fun removeValue() = nativeReference.removeValue()
112120

113-
suspend fun removeValue()
114-
115-
suspend fun <T> runTransaction(strategy: KSerializer<T>, buildSettings: EncodeDecodeSettingsBuilder.() -> Unit = {}, transactionUpdate: (currentData: T) -> T): DataSnapshot
121+
suspend fun <T> runTransaction(strategy: KSerializer<T>, buildSettings: EncodeDecodeSettingsBuilder.() -> Unit = {}, transactionUpdate: (currentData: T) -> T): DataSnapshot = nativeReference.runTransaction(strategy, buildSettings, transactionUpdate)
116122
}
117123

118124
expect class DataSnapshot {
@@ -129,31 +135,30 @@ expect class DataSnapshot {
129135

130136
expect class DatabaseException(message: String?, cause: Throwable?) : RuntimeException
131137

132-
abstract class BaseOnDisconnect internal constructor() {
138+
@PublishedApi
139+
internal expect class NativeOnDisconnect {
140+
suspend fun removeValue()
141+
suspend fun cancel()
142+
suspend fun setValue(encodedValue: Any?)
143+
suspend fun updateEncodedChildren(encodedUpdate: Map<String, Any?>)
144+
}
145+
146+
class OnDisconnect internal constructor(@PublishedApi internal val native: NativeOnDisconnect) {
147+
suspend fun removeValue() = native.removeValue()
148+
suspend fun cancel() = native.cancel()
133149
@Deprecated("Deprecated. Use builder instead", replaceWith = ReplaceWith("setValue(value) { this.encodeDefaults = encodeDefaults }"))
134150
suspend inline fun <reified T> setValue(value: T?, encodeDefaults: Boolean) =
135151
setValue(value) { this.encodeDefaults = encodeDefaults }
136152
suspend inline fun <reified T> setValue(value: T?, buildSettings: EncodeSettings.Builder.() -> Unit = {}) =
137-
setValue(encode(value, buildSettings))
153+
native.setValue(encode(value, buildSettings))
138154
@Deprecated("Deprecated. Use builder instead", replaceWith = ReplaceWith("setValue(strategy, value) { this.encodeDefaults = encodeDefaults }"))
139155
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeDefaults: Boolean) =
140156
setValue(strategy, value) { this.encodeDefaults = encodeDefaults }
141157
suspend inline fun <T> setValue(strategy: SerializationStrategy<T>, value: T, buildSettings: EncodeSettings.Builder.() -> Unit = {}) = setValue(encode(strategy, value, buildSettings))
142158

143-
@PublishedApi
144-
internal abstract suspend fun setValue(encodedValue: Any?)
145-
146-
suspend inline fun updateChildren(update: Map<String, Any?>, buildSettings: EncodeSettings.Builder.() -> Unit = {}) = updateEncodedChildren(update.mapValues { (_, it) -> encode(it, buildSettings) })
159+
suspend inline fun updateChildren(update: Map<String, Any?>, buildSettings: EncodeSettings.Builder.() -> Unit = {}) = native.updateEncodedChildren(update.mapValues { (_, it) -> encode(it, buildSettings) })
147160
@Deprecated("Deprecated. Use builder instead", replaceWith = ReplaceWith("updateChildren(update) { this.encodeDefaults = encodeDefaults }"))
148161
suspend fun updateChildren(update: Map<String, Any?>, encodeDefaults: Boolean) = updateChildren(update) {
149162
this.encodeDefaults = encodeDefaults
150163
}
151-
152-
@PublishedApi
153-
internal abstract suspend fun updateEncodedChildren(encodedUpdate: Map<String, Any?>)
154-
}
155-
156-
expect class OnDisconnect : BaseOnDisconnect {
157-
suspend fun removeValue()
158-
suspend fun cancel()
159164
}

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

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ actual fun Firebase.database(app: FirebaseApp, url: String): FirebaseDatabase =
5555
actual class FirebaseDatabase internal constructor(val ios: FIRDatabase) {
5656

5757
actual fun reference(path: String) =
58-
DatabaseReference(ios.referenceWithPath(path), ios.persistenceEnabled)
58+
DatabaseReference(NativeDatabaseReference(ios.referenceWithPath(path), ios.persistenceEnabled))
5959

6060
actual fun reference() =
61-
DatabaseReference(ios.reference(), ios.persistenceEnabled)
61+
DatabaseReference(NativeDatabaseReference(ios.reference(), ios.persistenceEnabled))
6262

6363
actual fun setPersistenceEnabled(enabled: Boolean) {
6464
ios.persistenceEnabled = enabled
@@ -78,7 +78,7 @@ fun Type.toEventType() = when(this) {
7878
REMOVED -> FIRDataEventTypeChildRemoved
7979
}
8080

81-
actual data class NativeQuery(
81+
internal actual open class NativeQuery(
8282
open val ios: FIRDatabaseQuery,
8383
val persistenceEnabled: Boolean
8484
)
@@ -147,25 +147,26 @@ actual open class Query internal actual constructor(
147147
override fun toString() = ios.toString()
148148
}
149149

150-
actual class DatabaseReference internal constructor(
150+
@PublishedApi
151+
internal actual class NativeDatabaseReference internal constructor(
151152
override val ios: FIRDatabaseReference,
152153
persistenceEnabled: Boolean
153-
): BaseDatabaseReference(NativeQuery(ios, persistenceEnabled)) {
154+
): NativeQuery(ios, persistenceEnabled) {
154155

155156
actual val key get() = ios.key
156157

157-
actual fun child(path: String) = DatabaseReference(ios.child(path), persistenceEnabled)
158+
actual fun child(path: String) = NativeDatabaseReference(ios.child(path), persistenceEnabled)
158159

159-
actual fun push() = DatabaseReference(ios.childByAutoId(), persistenceEnabled)
160-
actual fun onDisconnect() = OnDisconnect(ios, persistenceEnabled)
160+
actual fun push() = NativeDatabaseReference(ios.childByAutoId(), persistenceEnabled)
161+
actual fun onDisconnect() = NativeOnDisconnect(ios, persistenceEnabled)
161162

162-
override suspend fun setValueEncoded(encodedValue: Any?) {
163+
actual suspend fun setValueEncoded(encodedValue: Any?) {
163164
ios.await(persistenceEnabled) { setValue(encodedValue, it) }
164165
}
165166

166167
@Suppress("UNCHECKED_CAST")
167-
override suspend fun updateEncodedChildren(encodedValue: Any?) {
168-
ios.await(persistenceEnabled) { updateChildValues(encodedValue as Map<Any?, *>, it) }
168+
actual suspend fun updateEncodedChildren(encodedUpdate: Any?) {
169+
ios.await(persistenceEnabled) { updateChildValues(encodedUpdate as Map<Any?, *>, it) }
169170
}
170171

171172
actual suspend fun removeValue() {
@@ -192,6 +193,8 @@ actual class DatabaseReference internal constructor(
192193
}
193194
}
194195

196+
val DatabaseReference.ios: FIRDatabaseReference get() = nativeReference.ios
197+
195198
@Suppress("UNCHECKED_CAST")
196199
actual class DataSnapshot internal constructor(
197200
val ios: FIRDataSnapshot,
@@ -202,7 +205,7 @@ actual class DataSnapshot internal constructor(
202205

203206
actual val key: String? get() = ios.key
204207

205-
actual val ref: DatabaseReference get() = DatabaseReference(ios.ref, persistenceEnabled)
208+
actual val ref: DatabaseReference get() = DatabaseReference(NativeDatabaseReference(ios.ref, persistenceEnabled))
206209

207210
actual val value get() = ios.value
208211

@@ -217,10 +220,11 @@ actual class DataSnapshot internal constructor(
217220
actual val children: Iterable<DataSnapshot> get() = ios.children.allObjects.map { DataSnapshot(it as FIRDataSnapshot, persistenceEnabled) }
218221
}
219222

220-
actual class OnDisconnect internal constructor(
223+
@PublishedApi
224+
internal actual class NativeOnDisconnect internal constructor(
221225
val ios: FIRDatabaseReference,
222226
val persistenceEnabled: Boolean
223-
) : BaseOnDisconnect() {
227+
) {
224228
actual suspend fun removeValue() {
225229
ios.await(persistenceEnabled) { onDisconnectRemoveValueWithCompletionBlock(it) }
226230
}
@@ -229,16 +233,19 @@ actual class OnDisconnect internal constructor(
229233
ios.await(persistenceEnabled) { cancelDisconnectOperationsWithCompletionBlock(it) }
230234
}
231235

232-
override suspend fun setValue(encodedValue: Any?) {
236+
actual suspend fun setValue(encodedValue: Any?) {
233237
ios.await(persistenceEnabled) { onDisconnectSetValue(encodedValue, it) }
234238
}
235239

236240
@Suppress("UNCHECKED_CAST")
237-
override suspend fun updateEncodedChildren(encodedUpdate: Map<String, Any?>) {
241+
actual suspend fun updateEncodedChildren(encodedUpdate: Map<String, Any?>) {
238242
ios.await(persistenceEnabled) { onDisconnectUpdateChildValues(encodedUpdate as Map<Any?, *>, it) }
239243
}
240244
}
241245

246+
val OnDisconnect.ios: FIRDatabaseReference get() = native.ios
247+
val OnDisconnect.persistenceEnabled get() = native.persistenceEnabled
248+
242249
actual class DatabaseException actual constructor(message: String?, cause: Throwable?) : RuntimeException(message, cause)
243250

244251
private suspend inline fun <T, reified R> T.awaitResult(whileOnline: Boolean, function: T.(callback: (NSError?, R?) -> Unit) -> Unit): R {

0 commit comments

Comments
 (0)