From a9086b8d0bff4516bed48d29d700e418e78517d2 Mon Sep 17 00:00:00 2001 From: Gijs van Veen Date: Tue, 9 Jul 2024 17:08:58 +0200 Subject: [PATCH 1/7] Fixed a crash for settings when iOS would access the same Firebase instance twice --- .../NativeFirebaseFirestoreWrapper.kt | 37 +++++++++++++++++-- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt b/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt index 96326e4a2..8298e3123 100644 --- a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt +++ b/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt @@ -1,23 +1,52 @@ package dev.gitlive.firebase.firestore.internal import cocoapods.FirebaseFirestoreInternal.FIRFirestore +import cocoapods.FirebaseFirestoreInternal.FIRMemoryCacheSettings +import cocoapods.FirebaseFirestoreInternal.FIRPersistentCacheSettings import dev.gitlive.firebase.firestore.FirebaseFirestoreSettings +import dev.gitlive.firebase.firestore.LocalCacheSettings +import dev.gitlive.firebase.firestore.MemoryGarbageCollectorSettings import dev.gitlive.firebase.firestore.NativeFirebaseFirestore import dev.gitlive.firebase.firestore.NativeTransaction import dev.gitlive.firebase.firestore.await import dev.gitlive.firebase.firestore.awaitResult import dev.gitlive.firebase.firestore.firestoreSettings import dev.gitlive.firebase.firestore.memoryCacheSettings +import dev.gitlive.firebase.firestore.memoryEagerGcSettings +import dev.gitlive.firebase.firestore.persistentCacheSettings import kotlinx.coroutines.runBlocking @Suppress("UNCHECKED_CAST") internal actual class NativeFirebaseFirestoreWrapper internal actual constructor(actual val native: NativeFirebaseFirestore) { - actual var settings: FirebaseFirestoreSettings = firestoreSettings { }.also { - native.settings = it.ios - } + actual var settings: FirebaseFirestoreSettings + get() = firestoreSettings { + host = native.settings.host + sslEnabled = native.settings.sslEnabled + dispatchQueue = native.settings.dispatchQueue + @Suppress("SENSELESS_NULL_IN_WHEN") + cacheSettings = when (val nativeCacheSettings = native.settings.cacheSettings) { + is FIRPersistentCacheSettings -> persistentCacheSettings { + // SizeBytes cannot be determined + } + is FIRMemoryCacheSettings -> memoryCacheSettings { + // Garbage collection settings cannot be determined + } + null -> when { + native.settings.persistenceEnabled -> LocalCacheSettings.Persistent(native.settings.cacheSizeBytes) + native.settings.cacheSizeBytes == FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED -> LocalCacheSettings.Memory( + MemoryGarbageCollectorSettings.Eager, + ) + else -> LocalCacheSettings.Memory( + MemoryGarbageCollectorSettings.LRUGC( + native.settings.cacheSizeBytes, + ), + ) + } + else -> error("Unknown cache settings $nativeCacheSettings") + } + } set(value) { - field = value native.settings = value.ios } From 457926ffeacd4b30fc269110ce1af4de7c2ee53b Mon Sep 17 00:00:00 2001 From: Gijs van Veen Date: Tue, 9 Jul 2024 17:10:23 +0200 Subject: [PATCH 2/7] Linting --- .../firestore/internal/NativeFirebaseFirestoreWrapper.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt b/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt index 8298e3123..96f20fff7 100644 --- a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt +++ b/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt @@ -12,7 +12,6 @@ import dev.gitlive.firebase.firestore.await import dev.gitlive.firebase.firestore.awaitResult import dev.gitlive.firebase.firestore.firestoreSettings import dev.gitlive.firebase.firestore.memoryCacheSettings -import dev.gitlive.firebase.firestore.memoryEagerGcSettings import dev.gitlive.firebase.firestore.persistentCacheSettings import kotlinx.coroutines.runBlocking From be243a99d701371f10195375aa06fa0d1c2ea3c5 Mon Sep 17 00:00:00 2001 From: Gijs van Veen Date: Tue, 9 Jul 2024 17:46:17 +0200 Subject: [PATCH 3/7] Fix for #551 --- .../gitlive/firebase/firestore/firestore.kt | 9 +++++++ .../NativeFirebaseFirestoreWrapper.kt | 24 +++++++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt b/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt index 584d01140..1e932a1fe 100644 --- a/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt +++ b/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt @@ -5,6 +5,7 @@ package dev.gitlive.firebase.firestore import dev.gitlive.firebase.Firebase +import dev.gitlive.firebase.FirebaseApp import dev.gitlive.firebase.FirebaseOptions import dev.gitlive.firebase.apps import dev.gitlive.firebase.internal.decode @@ -85,6 +86,7 @@ class FirebaseFirestoreTest { ) } + lateinit var firebaseApp: FirebaseApp lateinit var firestore: FirebaseFirestore @BeforeTest @@ -100,6 +102,7 @@ class FirebaseFirestoreTest { gcmSenderId = "846484016111", ), ) + firebaseApp = app firestore = Firebase.firestore(app).apply { useEmulator(emulatorHost, 8080) @@ -1031,6 +1034,12 @@ class FirebaseFirestoreTest { fieldQuery.assertDocuments(FirestoreTest.serializer(), testOne) } + @Test + fun testMultiple() = runTest { + Firebase.firestore(firebaseApp).disableNetwork() + Firebase.firestore(firebaseApp).enableNetwork() + } + private suspend fun setupFirestoreData( documentOne: FirestoreTest = testOne, documentTwo: FirestoreTest = testTwo, diff --git a/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt b/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt index 919286d00..5ca836e1d 100644 --- a/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt +++ b/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt @@ -10,6 +10,7 @@ import dev.gitlive.firebase.firestore.NativeWriteBatch import dev.gitlive.firebase.firestore.externals.clearIndexedDbPersistence import dev.gitlive.firebase.firestore.externals.connectFirestoreEmulator import dev.gitlive.firebase.firestore.externals.doc +import dev.gitlive.firebase.firestore.externals.getFirestore import dev.gitlive.firebase.firestore.externals.initializeFirestore import dev.gitlive.firebase.firestore.externals.setLogLevel import dev.gitlive.firebase.firestore.externals.writeBatch @@ -20,28 +21,41 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.await import kotlinx.coroutines.promise +// There is currently no way to check whether Firestore was already initialized for a given app without actually initializing it +// Therefore we keep track of this internally +private val appsWithFirestore = mutableListOf() + internal actual class NativeFirebaseFirestoreWrapper internal constructor( private val createNative: NativeFirebaseFirestoreWrapper.() -> NativeFirebaseFirestore, + private val canUpdateSettings: () -> Boolean, ) { - internal actual constructor(native: NativeFirebaseFirestore) : this({ native }) + internal actual constructor(native: NativeFirebaseFirestore) : this({ native }, { false }) internal constructor(app: FirebaseApp) : this( { NativeFirebaseFirestore( - initializeFirestore(app, settings.js).also { - emulatorSettings?.run { - connectFirestoreEmulator(it, host, port) + if (appsWithFirestore.contains(app)) { + getFirestore(app) + } else { + initializeFirestore(app, settings.js).also { + emulatorSettings?.run { + connectFirestoreEmulator(it, host, port) + } + appsWithFirestore.add(app) } }, ) }, + { + !appsWithFirestore.contains(app) + }, ) private data class EmulatorSettings(val host: String, val port: Int) actual var settings: FirebaseFirestoreSettings = FirebaseFirestoreSettings.Builder().build() set(value) { - if (lazyNative.isInitialized()) { + if (lazyNative.isInitialized() || !canUpdateSettings()) { throw IllegalStateException("FirebaseFirestore has already been started and its settings can no longer be changed. You can only call setFirestoreSettings() before calling any other methods on a FirebaseFirestore object.") } else { field = value From 09c1e71946b7cf1566a4985953c6bef85c6cd650 Mon Sep 17 00:00:00 2001 From: Gijs van Veen Date: Tue, 9 Jul 2024 21:16:39 +0200 Subject: [PATCH 4/7] Properly retain setting on JS --- .../dev/gitlive/firebase/firestore/firestore.kt | 11 ++++++++--- .../internal/NativeFirebaseFirestoreWrapper.kt | 11 +++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt b/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt index 921808031..8b70d47a0 100644 --- a/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt +++ b/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt @@ -37,9 +37,14 @@ public actual val Firebase.firestore: FirebaseFirestore get() = public actual fun Firebase.firestore(app: FirebaseApp): FirebaseFirestore = rethrow { FirebaseFirestore(NativeFirebaseFirestoreWrapper(app.js)) } -internal actual data class NativeFirebaseFirestore(val js: JsFirestore) - -public operator fun FirebaseFirestore.Companion.invoke(js: JsFirestore): FirebaseFirestore = FirebaseFirestore(NativeFirebaseFirestore(js)) +internal actual data class NativeFirebaseFirestore(val js: JsFirestore, val settings: FirebaseFirestoreSettings) + +public operator fun FirebaseFirestore.Companion.invoke(js: JsFirestore): FirebaseFirestore = FirebaseFirestore( + NativeFirebaseFirestore( + js, + FirebaseFirestoreSettings.Builder().build(), + ), +) public val FirebaseFirestore.js: JsFirestore get() = native.js public actual data class FirebaseFirestoreSettings( diff --git a/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt b/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt index 5ca836e1d..75631fdd5 100644 --- a/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt +++ b/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt @@ -23,15 +23,17 @@ import kotlinx.coroutines.promise // There is currently no way to check whether Firestore was already initialized for a given app without actually initializing it // Therefore we keep track of this internally -private val appsWithFirestore = mutableListOf() +private val appsWithFirestore = mutableMapOf() internal actual class NativeFirebaseFirestoreWrapper internal constructor( + initialSettings: FirebaseFirestoreSettings, private val createNative: NativeFirebaseFirestoreWrapper.() -> NativeFirebaseFirestore, private val canUpdateSettings: () -> Boolean, ) { - internal actual constructor(native: NativeFirebaseFirestore) : this({ native }, { false }) + internal actual constructor(native: NativeFirebaseFirestore) : this(native.settings, { native }, { false }) internal constructor(app: FirebaseApp) : this( + appsWithFirestore[app] ?: FirebaseFirestoreSettings.Builder().build(), { NativeFirebaseFirestore( if (appsWithFirestore.contains(app)) { @@ -41,9 +43,10 @@ internal actual class NativeFirebaseFirestoreWrapper internal constructor( emulatorSettings?.run { connectFirestoreEmulator(it, host, port) } - appsWithFirestore.add(app) + appsWithFirestore[app] = settings } }, + settings, ) }, { @@ -53,7 +56,7 @@ internal actual class NativeFirebaseFirestoreWrapper internal constructor( private data class EmulatorSettings(val host: String, val port: Int) - actual var settings: FirebaseFirestoreSettings = FirebaseFirestoreSettings.Builder().build() + actual var settings: FirebaseFirestoreSettings = initialSettings set(value) { if (lazyNative.isInitialized() || !canUpdateSettings()) { throw IllegalStateException("FirebaseFirestore has already been started and its settings can no longer be changed. You can only call setFirestoreSettings() before calling any other methods on a FirebaseFirestore object.") From fef2847666caf6a63ec3dbe0f7962e39e47a949f Mon Sep 17 00:00:00 2001 From: Gijs van Veen Date: Tue, 9 Jul 2024 21:36:04 +0200 Subject: [PATCH 5/7] Fix for test --- .../firestore/internal/NativeFirebaseFirestoreWrapper.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt b/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt index 75631fdd5..c7afc741d 100644 --- a/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt +++ b/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt @@ -50,7 +50,7 @@ internal actual class NativeFirebaseFirestoreWrapper internal constructor( ) }, { - !appsWithFirestore.contains(app) + !appsWithFirestore.containsKey(app) }, ) From 4be99fd01c24a4a887cefa175cdf8e35f81cef8b Mon Sep 17 00:00:00 2001 From: Gijs van Veen Date: Wed, 10 Jul 2024 20:57:07 +0200 Subject: [PATCH 6/7] PR remarks: Replaced readable settings with write only method Ensures easier consistency between platforms --- .../api/android/firebase-firestore.api | 4 +- .../api/jvm/firebase-firestore.api | 4 +- .../NativeFirebaseFirestoreWrapper.kt | 69 +++---------------- .../gitlive/firebase/firestore/firestore.kt | 40 ++++++----- .../NativeFirebaseFirestoreWrapper.kt | 2 +- .../firebase/firestore/FirestoreSourceTest.kt | 4 +- .../gitlive/firebase/firestore/firestore.kt | 4 +- .../NativeFirebaseFirestoreWrapper.kt | 48 ++----------- .../gitlive/firebase/firestore/firestore.kt | 7 +- .../NativeFirebaseFirestoreWrapper.kt | 53 +++++++------- 10 files changed, 72 insertions(+), 163 deletions(-) diff --git a/firebase-firestore/api/android/firebase-firestore.api b/firebase-firestore/api/android/firebase-firestore.api index afda9143b..55fe69e24 100644 --- a/firebase-firestore/api/android/firebase-firestore.api +++ b/firebase-firestore/api/android/firebase-firestore.api @@ -258,6 +258,7 @@ public final class dev/gitlive/firebase/firestore/FilterBuilder { public final class dev/gitlive/firebase/firestore/FirebaseFirestore { public static final field Companion Ldev/gitlive/firebase/firestore/FirebaseFirestore$Companion; + public final fun applySettings (Ldev/gitlive/firebase/firestore/FirebaseFirestoreSettings;)V public final fun batch ()Ldev/gitlive/firebase/firestore/WriteBatch; public final fun clearPersistence (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun collection (Ljava/lang/String;)Ldev/gitlive/firebase/firestore/CollectionReference; @@ -265,11 +266,10 @@ public final class dev/gitlive/firebase/firestore/FirebaseFirestore { public final fun disableNetwork (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun document (Ljava/lang/String;)Ldev/gitlive/firebase/firestore/DocumentReference; public final fun enableNetwork (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun getSettings ()Ldev/gitlive/firebase/firestore/FirebaseFirestoreSettings; public final fun runTransaction (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun setLoggingEnabled (Z)V - public final fun setSettings (Ldev/gitlive/firebase/firestore/FirebaseFirestoreSettings;)V public final fun setSettings (Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/Long;)V + public final fun setSettings (Lkotlin/jvm/functions/Function1;)V public static synthetic fun setSettings$default (Ldev/gitlive/firebase/firestore/FirebaseFirestore;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/Long;ILjava/lang/Object;)V public final fun useEmulator (Ljava/lang/String;I)V } diff --git a/firebase-firestore/api/jvm/firebase-firestore.api b/firebase-firestore/api/jvm/firebase-firestore.api index 5aed50345..2baa38a60 100644 --- a/firebase-firestore/api/jvm/firebase-firestore.api +++ b/firebase-firestore/api/jvm/firebase-firestore.api @@ -258,6 +258,7 @@ public final class dev/gitlive/firebase/firestore/FilterBuilder { public final class dev/gitlive/firebase/firestore/FirebaseFirestore { public static final field Companion Ldev/gitlive/firebase/firestore/FirebaseFirestore$Companion; + public final fun applySettings (Ldev/gitlive/firebase/firestore/FirebaseFirestoreSettings;)V public final fun batch ()Ldev/gitlive/firebase/firestore/WriteBatch; public final fun clearPersistence (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun collection (Ljava/lang/String;)Ldev/gitlive/firebase/firestore/CollectionReference; @@ -265,11 +266,10 @@ public final class dev/gitlive/firebase/firestore/FirebaseFirestore { public final fun disableNetwork (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun document (Ljava/lang/String;)Ldev/gitlive/firebase/firestore/DocumentReference; public final fun enableNetwork (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun getSettings ()Ldev/gitlive/firebase/firestore/FirebaseFirestoreSettings; public final fun runTransaction (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun setLoggingEnabled (Z)V - public final fun setSettings (Ldev/gitlive/firebase/firestore/FirebaseFirestoreSettings;)V public final fun setSettings (Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/Long;)V + public final fun setSettings (Lkotlin/jvm/functions/Function1;)V public static synthetic fun setSettings$default (Ldev/gitlive/firebase/firestore/FirebaseFirestore;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/Long;ILjava/lang/Object;)V public final fun useEmulator (Ljava/lang/String;I)V } diff --git a/firebase-firestore/src/androidMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt b/firebase-firestore/src/androidMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt index bc2fe2450..c3f08216a 100644 --- a/firebase-firestore/src/androidMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt +++ b/firebase-firestore/src/androidMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt @@ -1,14 +1,7 @@ package dev.gitlive.firebase.firestore.internal -import com.google.android.gms.tasks.TaskExecutors -import com.google.firebase.firestore.MemoryCacheSettings -import com.google.firebase.firestore.MemoryEagerGcSettings -import com.google.firebase.firestore.MemoryLruGcSettings -import com.google.firebase.firestore.PersistentCacheSettings import com.google.firebase.firestore.firestoreSettings import dev.gitlive.firebase.firestore.FirebaseFirestoreSettings -import dev.gitlive.firebase.firestore.LocalCacheSettings -import dev.gitlive.firebase.firestore.MemoryGarbageCollectorSettings import dev.gitlive.firebase.firestore.NativeFirebaseFirestore import dev.gitlive.firebase.firestore.NativeTransaction import dev.gitlive.firebase.firestore.android @@ -17,59 +10,6 @@ import kotlinx.coroutines.tasks.await internal actual class NativeFirebaseFirestoreWrapper actual constructor(actual val native: NativeFirebaseFirestore) { - actual var settings: FirebaseFirestoreSettings - get() = with(native.firestoreSettings) { - FirebaseFirestoreSettings( - isSslEnabled, - host, - cacheSettings?.let { localCacheSettings -> - when (localCacheSettings) { - is MemoryCacheSettings -> { - val garbageCollectionSettings = - when (val settings = localCacheSettings.garbageCollectorSettings) { - is MemoryEagerGcSettings -> MemoryGarbageCollectorSettings.Eager - is MemoryLruGcSettings -> MemoryGarbageCollectorSettings.LRUGC( - settings.sizeBytes, - ) - - else -> throw IllegalArgumentException("Existing settings does not have valid GarbageCollectionSettings") - } - LocalCacheSettings.Memory(garbageCollectionSettings) - } - - is PersistentCacheSettings -> LocalCacheSettings.Persistent( - localCacheSettings.sizeBytes, - ) - - else -> throw IllegalArgumentException("Existing settings is not of a valid type") - } - } ?: kotlin.run { - @Suppress("DEPRECATION") - when { - isPersistenceEnabled -> LocalCacheSettings.Persistent(cacheSizeBytes) - cacheSizeBytes == FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED -> LocalCacheSettings.Memory( - MemoryGarbageCollectorSettings.Eager, - ) - - else -> LocalCacheSettings.Memory( - MemoryGarbageCollectorSettings.LRUGC( - cacheSizeBytes, - ), - ) - } - }, - callbackExecutorMap[native] ?: TaskExecutors.MAIN_THREAD, - ) - } - set(value) { - native.firestoreSettings = firestoreSettings { - isSslEnabled = value.sslEnabled - host = value.host - setLocalCacheSettings(value.cacheSettings.android) - } - callbackExecutorMap[native] = value.callbackExecutor - } - actual fun collection(collectionPath: String) = native.collection(collectionPath) actual fun collectionGroup(collectionId: String) = native.collectionGroup(collectionId) @@ -82,6 +22,15 @@ internal actual class NativeFirebaseFirestoreWrapper actual constructor(actual v actual fun setLoggingEnabled(loggingEnabled: Boolean) = com.google.firebase.firestore.FirebaseFirestore.setLoggingEnabled(loggingEnabled) + actual fun applySettings(settings: FirebaseFirestoreSettings) { + native.firestoreSettings = firestoreSettings { + isSslEnabled = settings.sslEnabled + host = settings.host + setLocalCacheSettings(settings.cacheSettings.android) + } + callbackExecutorMap[native] = settings.callbackExecutor + } + actual suspend fun runTransaction(func: suspend NativeTransaction.() -> T): T = native.runTransaction { runBlocking { it.func() } }.await() diff --git a/firebase-firestore/src/commonMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt b/firebase-firestore/src/commonMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt index c66cf7412..41bbd12b0 100644 --- a/firebase-firestore/src/commonMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt +++ b/firebase-firestore/src/commonMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt @@ -44,11 +44,6 @@ public class FirebaseFirestore internal constructor(private val wrapper: NativeF // Important to leave this as a get property since on JS it is initialized lazily internal val native: NativeFirebaseFirestore get() = wrapper.native - public var settings: FirebaseFirestoreSettings - get() = wrapper.settings - set(value) { - wrapper.settings = value - } public fun collection(collectionPath: String): CollectionReference = CollectionReference(wrapper.collection(collectionPath)) public fun collectionGroup(collectionId: String): Query = Query(wrapper.collectionGroup(collectionId)) @@ -65,29 +60,36 @@ public class FirebaseFirestore internal constructor(private val wrapper: NativeF wrapper.useEmulator(host, port) } - @Deprecated("Use settings instead", replaceWith = ReplaceWith("settings = firestoreSettings{}")) + @Deprecated("Use SettingsBuilder instead", replaceWith = ReplaceWith("setSettings { }")) public fun setSettings( persistenceEnabled: Boolean? = null, sslEnabled: Boolean? = null, host: String? = null, cacheSizeBytes: Long? = null, - ) { - settings = firestoreSettings { - this.sslEnabled = sslEnabled ?: true - this.host = host ?: FirebaseFirestoreSettings.DEFAULT_HOST - this.cacheSettings = if (persistenceEnabled != false) { - LocalCacheSettings.Persistent(cacheSizeBytes ?: FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED) + ): Unit = setSettings { + this.sslEnabled = sslEnabled ?: true + this.host = host ?: FirebaseFirestoreSettings.DEFAULT_HOST + this.cacheSettings = if (persistenceEnabled != false) { + LocalCacheSettings.Persistent(cacheSizeBytes ?: FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED) + } else { + val cacheSize = cacheSizeBytes ?: FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED + val garbageCollectionSettings = if (cacheSize == FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED) { + MemoryGarbageCollectorSettings.Eager } else { - val cacheSize = cacheSizeBytes ?: FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED - val garbageCollectionSettings = if (cacheSize == FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED) { - MemoryGarbageCollectorSettings.Eager - } else { - MemoryGarbageCollectorSettings.LRUGC(cacheSize) - } - LocalCacheSettings.Memory(garbageCollectionSettings) + MemoryGarbageCollectorSettings.LRUGC(cacheSize) } + LocalCacheSettings.Memory(garbageCollectionSettings) } } + + public fun applySettings(settings: FirebaseFirestoreSettings) { + wrapper.applySettings(settings) + } + + public fun setSettings(builder: FirebaseFirestoreSettings.Builder.() -> Unit): Unit = wrapper.applySettings( + firestoreSettings(builder = builder), + ) + public suspend fun disableNetwork() { wrapper.disableNetwork() } diff --git a/firebase-firestore/src/commonMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt b/firebase-firestore/src/commonMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt index 207fbbb9b..b617deb45 100644 --- a/firebase-firestore/src/commonMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt +++ b/firebase-firestore/src/commonMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt @@ -9,13 +9,13 @@ import dev.gitlive.firebase.firestore.NativeWriteBatch internal expect class NativeFirebaseFirestoreWrapper internal constructor(native: NativeFirebaseFirestore) { val native: NativeFirebaseFirestore - var settings: FirebaseFirestoreSettings fun collection(collectionPath: String): NativeCollectionReference fun collectionGroup(collectionId: String): NativeQuery fun document(documentPath: String): NativeDocumentReference fun batch(): NativeWriteBatch fun setLoggingEnabled(loggingEnabled: Boolean) + fun applySettings(settings: FirebaseFirestoreSettings) suspend fun clearPersistence() suspend fun runTransaction(func: suspend NativeTransaction.() -> T): T fun useEmulator(host: String, port: Int) diff --git a/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/FirestoreSourceTest.kt b/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/FirestoreSourceTest.kt index ce5c80a0e..c39efa04e 100644 --- a/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/FirestoreSourceTest.kt +++ b/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/FirestoreSourceTest.kt @@ -39,14 +39,14 @@ class FirestoreSourceTest { ) firestore = Firebase.firestore(app).apply { - useEmulator(emulatorHost, 8080) - settings = firestoreSettings(settings) { + setSettings { cacheSettings = if (persistenceEnabled) { persistentCacheSettings { } } else { memoryCacheSettings { } } } + useEmulator(emulatorHost, 8080) } } diff --git a/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt b/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt index 1e932a1fe..c6a00ba04 100644 --- a/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt +++ b/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt @@ -105,12 +105,12 @@ class FirebaseFirestoreTest { firebaseApp = app firestore = Firebase.firestore(app).apply { - useEmulator(emulatorHost, 8080) - settings = firestoreSettings(settings) { + setSettings { cacheSettings = memoryCacheSettings { gcSettings = memoryEagerGcSettings { } } } + useEmulator(emulatorHost, 8080) } } diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt b/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt index 96f20fff7..50e59c0ad 100644 --- a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt +++ b/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt @@ -1,54 +1,16 @@ package dev.gitlive.firebase.firestore.internal import cocoapods.FirebaseFirestoreInternal.FIRFirestore -import cocoapods.FirebaseFirestoreInternal.FIRMemoryCacheSettings -import cocoapods.FirebaseFirestoreInternal.FIRPersistentCacheSettings import dev.gitlive.firebase.firestore.FirebaseFirestoreSettings -import dev.gitlive.firebase.firestore.LocalCacheSettings -import dev.gitlive.firebase.firestore.MemoryGarbageCollectorSettings import dev.gitlive.firebase.firestore.NativeFirebaseFirestore import dev.gitlive.firebase.firestore.NativeTransaction import dev.gitlive.firebase.firestore.await import dev.gitlive.firebase.firestore.awaitResult -import dev.gitlive.firebase.firestore.firestoreSettings -import dev.gitlive.firebase.firestore.memoryCacheSettings -import dev.gitlive.firebase.firestore.persistentCacheSettings import kotlinx.coroutines.runBlocking @Suppress("UNCHECKED_CAST") internal actual class NativeFirebaseFirestoreWrapper internal actual constructor(actual val native: NativeFirebaseFirestore) { - actual var settings: FirebaseFirestoreSettings - get() = firestoreSettings { - host = native.settings.host - sslEnabled = native.settings.sslEnabled - dispatchQueue = native.settings.dispatchQueue - @Suppress("SENSELESS_NULL_IN_WHEN") - cacheSettings = when (val nativeCacheSettings = native.settings.cacheSettings) { - is FIRPersistentCacheSettings -> persistentCacheSettings { - // SizeBytes cannot be determined - } - is FIRMemoryCacheSettings -> memoryCacheSettings { - // Garbage collection settings cannot be determined - } - null -> when { - native.settings.persistenceEnabled -> LocalCacheSettings.Persistent(native.settings.cacheSizeBytes) - native.settings.cacheSizeBytes == FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED -> LocalCacheSettings.Memory( - MemoryGarbageCollectorSettings.Eager, - ) - else -> LocalCacheSettings.Memory( - MemoryGarbageCollectorSettings.LRUGC( - native.settings.cacheSizeBytes, - ), - ) - } - else -> error("Unknown cache settings $nativeCacheSettings") - } - } - set(value) { - native.settings = value.ios - } - actual fun collection(collectionPath: String) = native.collectionWithPath(collectionPath) actual fun collectionGroup(collectionId: String) = native.collectionGroupWithID(collectionId) @@ -61,6 +23,10 @@ internal actual class NativeFirebaseFirestoreWrapper internal actual constructor actual fun setLoggingEnabled(loggingEnabled: Boolean): Unit = FIRFirestore.enableLogging(loggingEnabled) + actual fun applySettings(settings: FirebaseFirestoreSettings) { + native.settings = settings.ios + } + actual suspend fun runTransaction(func: suspend NativeTransaction.() -> T) = awaitResult { native.runTransactionWithBlock( @@ -74,10 +40,8 @@ internal actual class NativeFirebaseFirestoreWrapper internal actual constructor actual fun useEmulator(host: String, port: Int) { native.useEmulatorWithHost(host, port.toLong()) - settings = firestoreSettings(settings) { - this.host = "$host:$port" - cacheSettings = memoryCacheSettings { } - sslEnabled = false + native.settings = native.settings.apply { + this.sslEnabled = false } } diff --git a/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt b/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt index 8b70d47a0..87912f585 100644 --- a/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt +++ b/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt @@ -37,13 +37,10 @@ public actual val Firebase.firestore: FirebaseFirestore get() = public actual fun Firebase.firestore(app: FirebaseApp): FirebaseFirestore = rethrow { FirebaseFirestore(NativeFirebaseFirestoreWrapper(app.js)) } -internal actual data class NativeFirebaseFirestore(val js: JsFirestore, val settings: FirebaseFirestoreSettings) +internal actual data class NativeFirebaseFirestore(val js: JsFirestore) public operator fun FirebaseFirestore.Companion.invoke(js: JsFirestore): FirebaseFirestore = FirebaseFirestore( - NativeFirebaseFirestore( - js, - FirebaseFirestoreSettings.Builder().build(), - ), + NativeFirebaseFirestore(js), ) public val FirebaseFirestore.js: JsFirestore get() = native.js diff --git a/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt b/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt index c7afc741d..c8c1a31ae 100644 --- a/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt +++ b/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt @@ -21,55 +21,46 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.await import kotlinx.coroutines.promise -// There is currently no way to check whether Firestore was already initialized for a given app without actually initializing it -// Therefore we keep track of this internally -private val appsWithFirestore = mutableMapOf() - internal actual class NativeFirebaseFirestoreWrapper internal constructor( - initialSettings: FirebaseFirestoreSettings, - private val createNative: NativeFirebaseFirestoreWrapper.() -> NativeFirebaseFirestore, - private val canUpdateSettings: () -> Boolean, + private val createNative: NativeFirebaseFirestoreWrapper.(FirebaseFirestoreSettings?) -> NativeFirebaseFirestore, ) { - internal actual constructor(native: NativeFirebaseFirestore) : this(native.settings, { native }, { false }) + internal actual constructor(native: NativeFirebaseFirestore) : this( + { settings -> + settings?.let { + NativeFirebaseFirestore(initializeFirestore(native.js.app, settings)) + } ?: native + }, + ) internal constructor(app: FirebaseApp) : this( - appsWithFirestore[app] ?: FirebaseFirestoreSettings.Builder().build(), - { + { settings -> NativeFirebaseFirestore( - if (appsWithFirestore.contains(app)) { - getFirestore(app) - } else { - initializeFirestore(app, settings.js).also { + settings?.let { + initializeFirestore(app, it.js).also { emulatorSettings?.run { connectFirestoreEmulator(it, host, port) } - appsWithFirestore[app] = settings } - }, - settings, + } ?: getFirestore(app), ) }, - { - !appsWithFirestore.containsKey(app) - }, ) private data class EmulatorSettings(val host: String, val port: Int) - actual var settings: FirebaseFirestoreSettings = initialSettings + private var settings: FirebaseFirestoreSettings? = null set(value) { - if (lazyNative.isInitialized() || !canUpdateSettings()) { - throw IllegalStateException("FirebaseFirestore has already been started and its settings can no longer be changed. You can only call setFirestoreSettings() before calling any other methods on a FirebaseFirestore object.") - } else { - field = value + if (lazyNative.isInitialized()) { + createNative(value) // Call initialize again to ensure native crash occurs if settings have changed } + field = value } private var emulatorSettings: EmulatorSettings? = null // initializeFirestore must be called before any call, including before `getFirestore()` // To allow settings to be updated, we defer creating the wrapper until the first call to `native` private val lazyNative = lazy { - createNative() + createNative(settings) } actual val native: NativeFirebaseFirestore by lazyNative private val js get() = native.js @@ -106,6 +97,10 @@ internal actual class NativeFirebaseFirestoreWrapper internal constructor( actual fun setLoggingEnabled(loggingEnabled: Boolean) = rethrow { setLogLevel(if (loggingEnabled) "error" else "silent") } + actual fun applySettings(settings: FirebaseFirestoreSettings) { + this.settings = settings + } + @OptIn(DelicateCoroutinesApi::class) actual suspend fun runTransaction(func: suspend NativeTransaction.() -> T) = rethrow { @@ -119,8 +114,10 @@ internal actual class NativeFirebaseFirestoreWrapper internal constructor( rethrow { clearIndexedDbPersistence(js).await() } actual fun useEmulator(host: String, port: Int) = rethrow { - settings = firestoreSettings(settings) { - this.host = "$host:$port" + if (settings != null) { + settings = firestoreSettings(settings) { + this.host = "$host:$port" + } } emulatorSettings = EmulatorSettings(host, port) } From c987bea83c720be42d8b392a58c5fa004c089321 Mon Sep 17 00:00:00 2001 From: Gijs van Veen Date: Thu, 11 Jul 2024 09:53:32 +0200 Subject: [PATCH 7/7] Settings as write only property --- .../api/android/firebase-firestore.api | 4 +- .../api/jvm/firebase-firestore.api | 4 +- .../gitlive/firebase/firestore/firestore.kt | 44 ++++++++++--------- .../firebase/firestore/FirestoreSourceTest.kt | 2 +- .../gitlive/firebase/firestore/firestore.kt | 2 +- 5 files changed, 30 insertions(+), 26 deletions(-) diff --git a/firebase-firestore/api/android/firebase-firestore.api b/firebase-firestore/api/android/firebase-firestore.api index 55fe69e24..afda9143b 100644 --- a/firebase-firestore/api/android/firebase-firestore.api +++ b/firebase-firestore/api/android/firebase-firestore.api @@ -258,7 +258,6 @@ public final class dev/gitlive/firebase/firestore/FilterBuilder { public final class dev/gitlive/firebase/firestore/FirebaseFirestore { public static final field Companion Ldev/gitlive/firebase/firestore/FirebaseFirestore$Companion; - public final fun applySettings (Ldev/gitlive/firebase/firestore/FirebaseFirestoreSettings;)V public final fun batch ()Ldev/gitlive/firebase/firestore/WriteBatch; public final fun clearPersistence (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun collection (Ljava/lang/String;)Ldev/gitlive/firebase/firestore/CollectionReference; @@ -266,10 +265,11 @@ public final class dev/gitlive/firebase/firestore/FirebaseFirestore { public final fun disableNetwork (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun document (Ljava/lang/String;)Ldev/gitlive/firebase/firestore/DocumentReference; public final fun enableNetwork (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun getSettings ()Ldev/gitlive/firebase/firestore/FirebaseFirestoreSettings; public final fun runTransaction (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun setLoggingEnabled (Z)V + public final fun setSettings (Ldev/gitlive/firebase/firestore/FirebaseFirestoreSettings;)V public final fun setSettings (Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/Long;)V - public final fun setSettings (Lkotlin/jvm/functions/Function1;)V public static synthetic fun setSettings$default (Ldev/gitlive/firebase/firestore/FirebaseFirestore;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/Long;ILjava/lang/Object;)V public final fun useEmulator (Ljava/lang/String;I)V } diff --git a/firebase-firestore/api/jvm/firebase-firestore.api b/firebase-firestore/api/jvm/firebase-firestore.api index 2baa38a60..5aed50345 100644 --- a/firebase-firestore/api/jvm/firebase-firestore.api +++ b/firebase-firestore/api/jvm/firebase-firestore.api @@ -258,7 +258,6 @@ public final class dev/gitlive/firebase/firestore/FilterBuilder { public final class dev/gitlive/firebase/firestore/FirebaseFirestore { public static final field Companion Ldev/gitlive/firebase/firestore/FirebaseFirestore$Companion; - public final fun applySettings (Ldev/gitlive/firebase/firestore/FirebaseFirestoreSettings;)V public final fun batch ()Ldev/gitlive/firebase/firestore/WriteBatch; public final fun clearPersistence (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun collection (Ljava/lang/String;)Ldev/gitlive/firebase/firestore/CollectionReference; @@ -266,10 +265,11 @@ public final class dev/gitlive/firebase/firestore/FirebaseFirestore { public final fun disableNetwork (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun document (Ljava/lang/String;)Ldev/gitlive/firebase/firestore/DocumentReference; public final fun enableNetwork (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun getSettings ()Ldev/gitlive/firebase/firestore/FirebaseFirestoreSettings; public final fun runTransaction (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun setLoggingEnabled (Z)V + public final fun setSettings (Ldev/gitlive/firebase/firestore/FirebaseFirestoreSettings;)V public final fun setSettings (Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/Long;)V - public final fun setSettings (Lkotlin/jvm/functions/Function1;)V public static synthetic fun setSettings$default (Ldev/gitlive/firebase/firestore/FirebaseFirestore;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/Long;ILjava/lang/Object;)V public final fun useEmulator (Ljava/lang/String;I)V } diff --git a/firebase-firestore/src/commonMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt b/firebase-firestore/src/commonMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt index 41bbd12b0..bf4723e49 100644 --- a/firebase-firestore/src/commonMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt +++ b/firebase-firestore/src/commonMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt @@ -45,6 +45,13 @@ public class FirebaseFirestore internal constructor(private val wrapper: NativeF // Important to leave this as a get property since on JS it is initialized lazily internal val native: NativeFirebaseFirestore get() = wrapper.native + public var settings: FirebaseFirestoreSettings + @Deprecated("Property can only be written.", level = DeprecationLevel.ERROR) + get() = throw NotImplementedError() + set(value) { + wrapper.applySettings(value) + } + public fun collection(collectionPath: String): CollectionReference = CollectionReference(wrapper.collection(collectionPath)) public fun collectionGroup(collectionId: String): Query = Query(wrapper.collectionGroup(collectionId)) public fun document(documentPath: String): DocumentReference = DocumentReference(wrapper.document(documentPath)) @@ -60,36 +67,33 @@ public class FirebaseFirestore internal constructor(private val wrapper: NativeF wrapper.useEmulator(host, port) } - @Deprecated("Use SettingsBuilder instead", replaceWith = ReplaceWith("setSettings { }")) + @Deprecated("Use SettingsBuilder instead", replaceWith = ReplaceWith("settings = firestoreSettings { }", "dev.gitlive.firebase.firestore.firestoreSettings")) public fun setSettings( persistenceEnabled: Boolean? = null, sslEnabled: Boolean? = null, host: String? = null, cacheSizeBytes: Long? = null, - ): Unit = setSettings { - this.sslEnabled = sslEnabled ?: true - this.host = host ?: FirebaseFirestoreSettings.DEFAULT_HOST - this.cacheSettings = if (persistenceEnabled != false) { - LocalCacheSettings.Persistent(cacheSizeBytes ?: FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED) - } else { - val cacheSize = cacheSizeBytes ?: FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED - val garbageCollectionSettings = if (cacheSize == FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED) { - MemoryGarbageCollectorSettings.Eager + ) { + settings = firestoreSettings { + this.sslEnabled = sslEnabled ?: true + this.host = host ?: FirebaseFirestoreSettings.DEFAULT_HOST + this.cacheSettings = if (persistenceEnabled != false) { + LocalCacheSettings.Persistent( + cacheSizeBytes ?: FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED, + ) } else { - MemoryGarbageCollectorSettings.LRUGC(cacheSize) + val cacheSize = cacheSizeBytes ?: FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED + val garbageCollectionSettings = + if (cacheSize == FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED) { + MemoryGarbageCollectorSettings.Eager + } else { + MemoryGarbageCollectorSettings.LRUGC(cacheSize) + } + LocalCacheSettings.Memory(garbageCollectionSettings) } - LocalCacheSettings.Memory(garbageCollectionSettings) } } - public fun applySettings(settings: FirebaseFirestoreSettings) { - wrapper.applySettings(settings) - } - - public fun setSettings(builder: FirebaseFirestoreSettings.Builder.() -> Unit): Unit = wrapper.applySettings( - firestoreSettings(builder = builder), - ) - public suspend fun disableNetwork() { wrapper.disableNetwork() } diff --git a/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/FirestoreSourceTest.kt b/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/FirestoreSourceTest.kt index c39efa04e..2a5d74d90 100644 --- a/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/FirestoreSourceTest.kt +++ b/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/FirestoreSourceTest.kt @@ -39,7 +39,7 @@ class FirestoreSourceTest { ) firestore = Firebase.firestore(app).apply { - setSettings { + settings = firestoreSettings { cacheSettings = if (persistenceEnabled) { persistentCacheSettings { } } else { diff --git a/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt b/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt index c6a00ba04..99148d8cc 100644 --- a/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt +++ b/firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt @@ -105,7 +105,7 @@ class FirebaseFirestoreTest { firebaseApp = app firestore = Firebase.firestore(app).apply { - setSettings { + settings = firestoreSettings { cacheSettings = memoryCacheSettings { gcSettings = memoryEagerGcSettings { } }