diff --git a/CHANGELOG.md b/CHANGELOG.md index a12e65174f7..aea531e3d55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 0.25.2 + +* `Versions`: + * `Exposed`: `0.59.0` -> `0.60.0` +* `Repo`: + * `Cache`: + * Add extensions `alsoInvalidate`, `alsoInvalidateAsync`, `alsoInvalidateSync` and `alsoInvalidateSyncLogging` +* `Koin`: + * Add extensions `singleSuspend` and `factorySuspend` for defining of dependencies with suspendable blocks + ## 0.25.1 * `Coroutines`: diff --git a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/FlowSubscriptionAsync.kt b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/FlowSubscriptionAsync.kt index 667bba39c3f..3f46576e8dc 100644 --- a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/FlowSubscriptionAsync.kt +++ b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/FlowSubscriptionAsync.kt @@ -71,7 +71,7 @@ fun Flow.subscribeAsync( it.invoke(markersMap) } - val job = subscribeSafelyWithoutExceptions(subscope) { data -> + val job = subscribeLoggingDropExceptions(subscope) { data -> val dataCommand = AsyncSubscriptionCommandData(data, subscope, markerFactory, block) { marker -> actor.send( AsyncSubscriptionCommandClearReceiver(marker) diff --git a/coroutines/src/jvmMain/kotlin/dev/inmo/micro_utils/coroutines/LaunchSynchronously.kt b/coroutines/src/jvmMain/kotlin/dev/inmo/micro_utils/coroutines/LaunchSynchronously.kt index 7e9bfe5a205..d5842a928c6 100644 --- a/coroutines/src/jvmMain/kotlin/dev/inmo/micro_utils/coroutines/LaunchSynchronously.kt +++ b/coroutines/src/jvmMain/kotlin/dev/inmo/micro_utils/coroutines/LaunchSynchronously.kt @@ -7,7 +7,9 @@ fun CoroutineScope.launchSynchronously(block: suspend CoroutineScope.() -> T val objectToSynchronize = Object() synchronized(objectToSynchronize) { launch(start = CoroutineStart.UNDISPATCHED) { - result = safelyWithResult(block) + result = runCatching { + block() + } }.invokeOnCompletion { synchronized(objectToSynchronize) { objectToSynchronize.notifyAll() diff --git a/gradle.properties b/gradle.properties index 0d5ea9a07d5..f987d5fa29b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,5 +15,5 @@ crypto_js_version=4.1.1 # Project data group=dev.inmo -version=0.25.1 -android_code_version=291 +version=0.25.2 +android_code_version=292 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2135de11fce..e5cc8805cc4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,7 +7,7 @@ kt-coroutines = "1.10.1" kslog = "1.4.1" jb-compose = "1.7.3" -jb-exposed = "0.59.0" +jb-exposed = "0.60.0" jb-dokka = "2.0.0" sqlite = "3.49.1.0" diff --git a/koin/build.gradle b/koin/build.gradle index 466bf1b376f..829d2ea11d7 100644 --- a/koin/build.gradle +++ b/koin/build.gradle @@ -17,11 +17,13 @@ kotlin { jvmMain { dependencies { api libs.kt.reflect + api project(":micro_utils.coroutines") } } androidMain { dependencies { api libs.kt.reflect + api project(":micro_utils.coroutines") } } } diff --git a/koin/src/jvmMain/kotlin/FactorySuspend.kt b/koin/src/jvmMain/kotlin/FactorySuspend.kt new file mode 100644 index 00000000000..17731956f47 --- /dev/null +++ b/koin/src/jvmMain/kotlin/FactorySuspend.kt @@ -0,0 +1,32 @@ +package dev.inmo.micro_utils.koin + +import dev.inmo.micro_utils.coroutines.doSynchronously +import kotlinx.coroutines.CoroutineScope +import org.koin.core.module.Module +import org.koin.core.parameter.ParametersHolder +import org.koin.core.qualifier.Qualifier +import org.koin.core.qualifier.StringQualifier +import org.koin.core.scope.Scope +import kotlin.reflect.KClass + +inline fun Module.factorySuspend( + qualifier: Qualifier? = null, + coroutineScope: CoroutineScope? = null, + noinline definition: suspend Scope.(ParametersHolder) -> T +) = factory( + qualifier, + if (coroutineScope == null) { + { + doSynchronously { + definition(it) + } + } + } else { + { + coroutineScope.doSynchronously { + definition(it) + } + } + } +) + diff --git a/koin/src/jvmMain/kotlin/SingleSuspend.kt b/koin/src/jvmMain/kotlin/SingleSuspend.kt new file mode 100644 index 00000000000..b43ea88cabc --- /dev/null +++ b/koin/src/jvmMain/kotlin/SingleSuspend.kt @@ -0,0 +1,32 @@ +package dev.inmo.micro_utils.koin + +import dev.inmo.micro_utils.coroutines.doSynchronously +import kotlinx.coroutines.CoroutineScope +import org.koin.core.module.Module +import org.koin.core.parameter.ParametersHolder +import org.koin.core.qualifier.StringQualifier +import org.koin.core.scope.Scope + +inline fun Module.singleSuspend( + qualifier: StringQualifier, + createdAtStart: Boolean = false, + coroutineScope: CoroutineScope? = null, + noinline definition: suspend Scope.(ParametersHolder) -> T +) = single( + qualifier, + createdAtStart, + if (coroutineScope == null) { + { + doSynchronously { + definition(it) + } + } + } else { + { + coroutineScope.doSynchronously { + definition(it) + } + } + } +) + diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/annotations/OverrideRequireManualInvalidation.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/annotations/OverrideRequireManualInvalidation.kt new file mode 100644 index 00000000000..61b84cc6701 --- /dev/null +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/annotations/OverrideRequireManualInvalidation.kt @@ -0,0 +1,14 @@ +package dev.inmo.micro_utils.repos.annotations + + +@RequiresOptIn( + "Overriding of this invalidate message requires manual launching of invalidation on class initialization process", + RequiresOptIn.Level.WARNING +) +@Target( + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FIELD, + AnnotationTarget.PROPERTY, + AnnotationTarget.FUNCTION, +) +annotation class OverrideRequireManualInvalidation \ No newline at end of file diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/CRUDCacheRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/CRUDCacheRepo.kt index 372bff67823..86a1a9c612c 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/CRUDCacheRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/CRUDCacheRepo.kt @@ -4,6 +4,7 @@ import dev.inmo.micro_utils.coroutines.SmartRWLocker import dev.inmo.micro_utils.coroutines.withReadAcquire import dev.inmo.micro_utils.coroutines.withWriteLock import dev.inmo.micro_utils.repos.* +import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation import dev.inmo.micro_utils.repos.cache.cache.KVCache import dev.inmo.micro_utils.repos.cache.util.ActualizeAllClearMode import dev.inmo.micro_utils.repos.cache.util.actualizeAll @@ -39,6 +40,7 @@ open class ReadCRUDCacheRepo( kvCache.contains(id) } || parentRepo.contains(id) + @OverrideRequireManualInvalidation override suspend fun invalidate() = locker.withWriteLock { kvCache.clear() } @@ -117,6 +119,7 @@ open class WriteCRUDCacheRepo( return created } + @OverrideRequireManualInvalidation override suspend fun invalidate() = locker.withWriteLock { kvCache.clear() } @@ -150,6 +153,7 @@ WriteCRUDRepo by WriteCRUDCacheRepo( idGetter ), CRUDRepo { + @OverrideRequireManualInvalidation override suspend fun invalidate() = kvCache.actualizeAll(parentRepo, locker = locker) } diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/CacheRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/CacheRepo.kt index 6d683617fb0..bf709c4657a 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/CacheRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/CacheRepo.kt @@ -1,5 +1,8 @@ package dev.inmo.micro_utils.repos.cache +import dev.inmo.micro_utils.coroutines.launchLoggingDropExceptions +import kotlinx.coroutines.CoroutineScope + interface InvalidatableRepo { /** * Invalidates its internal data. It __may__ lead to autoreload of data. In case when repo makes autoreload, @@ -8,4 +11,14 @@ interface InvalidatableRepo { suspend fun invalidate() } +suspend fun T.alsoInvalidate() = also { + invalidate() +} + +fun T.alsoInvalidateAsync(scope: CoroutineScope) = also { + scope.launchLoggingDropExceptions { + invalidate() + } +} + typealias CacheRepo = InvalidatableRepo diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KeyValueCacheRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KeyValueCacheRepo.kt index 02148900f93..5feb23a91a5 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KeyValueCacheRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KeyValueCacheRepo.kt @@ -5,6 +5,7 @@ import dev.inmo.micro_utils.coroutines.withReadAcquire import dev.inmo.micro_utils.coroutines.withWriteLock import dev.inmo.micro_utils.pagination.* import dev.inmo.micro_utils.repos.* +import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation import dev.inmo.micro_utils.repos.cache.cache.KVCache import dev.inmo.micro_utils.repos.cache.util.actualizeAll import kotlinx.coroutines.CoroutineScope @@ -49,6 +50,7 @@ open class ReadKeyValueCacheRepo( } } + @OverrideRequireManualInvalidation override suspend fun invalidate() = kvCache.actualizeAll(parentRepo, locker = locker) } diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KeyValuesCacheRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KeyValuesCacheRepo.kt index 98c064b9c4c..a27e874f677 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KeyValuesCacheRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KeyValuesCacheRepo.kt @@ -6,6 +6,7 @@ import dev.inmo.micro_utils.coroutines.withWriteLock import dev.inmo.micro_utils.pagination.* import dev.inmo.micro_utils.pagination.utils.* import dev.inmo.micro_utils.repos.* +import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation import dev.inmo.micro_utils.repos.cache.cache.KVCache import dev.inmo.micro_utils.repos.cache.util.actualizeAll import kotlinx.coroutines.CoroutineScope @@ -48,6 +49,7 @@ open class ReadKeyValuesCacheRepo( kvCache.contains(k) } || parentRepo.contains(k) + @OverrideRequireManualInvalidation override suspend fun invalidate() = kvCache.actualizeAll(parentRepo, locker = locker) } diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/crud/AutoRecacheReadCRUDRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/crud/AutoRecacheReadCRUDRepo.kt index 84f5035ceae..30067239bc3 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/crud/AutoRecacheReadCRUDRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/crud/AutoRecacheReadCRUDRepo.kt @@ -6,6 +6,7 @@ import dev.inmo.micro_utils.pagination.PaginationResult import dev.inmo.micro_utils.repos.KeyValueRepo import dev.inmo.micro_utils.repos.MapKeyValueRepo import dev.inmo.micro_utils.repos.ReadCRUDRepo +import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation import dev.inmo.micro_utils.repos.cache.fallback.ActionWrapper import dev.inmo.micro_utils.repos.cache.util.actualizeAll import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo @@ -90,6 +91,7 @@ open class AutoRecacheReadCRUDRepo( kvCache.set(idGetter(it), it) } ?: kvCache.get(id) + @OverrideRequireManualInvalidation override suspend fun invalidate() { actualizeAll() } diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/crud/AutoRecacheWriteCRUDRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/crud/AutoRecacheWriteCRUDRepo.kt index 762b98b5f12..58e335dc05f 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/crud/AutoRecacheWriteCRUDRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/crud/AutoRecacheWriteCRUDRepo.kt @@ -2,6 +2,7 @@ package dev.inmo.micro_utils.repos.cache.fallback.crud import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions import dev.inmo.micro_utils.repos.* +import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow @@ -53,6 +54,7 @@ open class AutoRecacheWriteCRUDRepo( kvCache.set(idGetter(it), it) } + @OverrideRequireManualInvalidation override suspend fun invalidate() { kvCache.clear() } diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/keyvalue/AutoRecacheReadKeyValueRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/keyvalue/AutoRecacheReadKeyValueRepo.kt index e1aac600768..214a84e855c 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/keyvalue/AutoRecacheReadKeyValueRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/keyvalue/AutoRecacheReadKeyValueRepo.kt @@ -6,6 +6,7 @@ import dev.inmo.micro_utils.pagination.PaginationResult import dev.inmo.micro_utils.repos.KeyValueRepo import dev.inmo.micro_utils.repos.MapKeyValueRepo import dev.inmo.micro_utils.repos.ReadKeyValueRepo +import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation import dev.inmo.micro_utils.repos.cache.fallback.ActionWrapper import dev.inmo.micro_utils.repos.cache.util.actualizeAll import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo @@ -100,6 +101,7 @@ open class AutoRecacheReadKeyValueRepo( originalRepo.keys(v, pagination, reversed) }.getOrElse { kvCache.keys(v, pagination, reversed) } + @OverrideRequireManualInvalidation override suspend fun invalidate() { actualizeAll() } diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/keyvalue/AutoRecacheWriteKeyValueRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/keyvalue/AutoRecacheWriteKeyValueRepo.kt index 0bea2516d57..3a498ceb244 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/keyvalue/AutoRecacheWriteKeyValueRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/keyvalue/AutoRecacheWriteKeyValueRepo.kt @@ -2,6 +2,7 @@ package dev.inmo.micro_utils.repos.cache.fallback.keyvalue import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions import dev.inmo.micro_utils.repos.* +import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow @@ -44,6 +45,7 @@ open class AutoRecacheWriteKeyValueRepo( kvCache.set(toSet) } + @OverrideRequireManualInvalidation override suspend fun invalidate() { kvCache.clear() } diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/keyvalues/AutoRecacheReadKeyValuesRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/keyvalues/AutoRecacheReadKeyValuesRepo.kt index c0795f27819..3ab5d114912 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/keyvalues/AutoRecacheReadKeyValuesRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/keyvalues/AutoRecacheReadKeyValuesRepo.kt @@ -13,6 +13,7 @@ import dev.inmo.micro_utils.pagination.utils.paginate import dev.inmo.micro_utils.repos.KeyValueRepo import dev.inmo.micro_utils.repos.MapKeyValueRepo import dev.inmo.micro_utils.repos.ReadKeyValuesRepo +import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation import dev.inmo.micro_utils.repos.cache.fallback.ActionWrapper import dev.inmo.micro_utils.repos.cache.util.actualizeAll import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo @@ -140,6 +141,7 @@ open class AutoRecacheReadKeyValuesRepo( }) ?: (kvCache.get(k) ?.contains(v) == true) } + @OverrideRequireManualInvalidation override suspend fun invalidate() { actualizeAll() } diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/keyvalues/AutoRecacheWriteKeyValuesRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/keyvalues/AutoRecacheWriteKeyValuesRepo.kt index 14a4902c729..380b6255502 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/keyvalues/AutoRecacheWriteKeyValuesRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/fallback/keyvalues/AutoRecacheWriteKeyValuesRepo.kt @@ -3,6 +3,7 @@ package dev.inmo.micro_utils.repos.cache.fallback.keyvalues import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions import dev.inmo.micro_utils.pagination.utils.doForAllWithNextPaging import dev.inmo.micro_utils.repos.* +import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo import dev.inmo.micro_utils.repos.pagination.maxPagePagination import kotlinx.coroutines.CoroutineScope @@ -89,6 +90,7 @@ open class AutoRecacheWriteKeyValuesRepo( } } + @OverrideRequireManualInvalidation override suspend fun invalidate() { kvCache.clear() } diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/FullCRUDCacheRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/FullCRUDCacheRepo.kt index d30ede0d633..7172b8c5f5c 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/FullCRUDCacheRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/FullCRUDCacheRepo.kt @@ -8,6 +8,7 @@ import dev.inmo.micro_utils.coroutines.withWriteLock import dev.inmo.micro_utils.pagination.Pagination import dev.inmo.micro_utils.pagination.PaginationResult import dev.inmo.micro_utils.repos.* +import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation import dev.inmo.micro_utils.repos.cache.* import dev.inmo.micro_utils.repos.cache.util.ActualizeAllClearMode import dev.inmo.micro_utils.repos.cache.util.actualizeAll @@ -133,6 +134,7 @@ open class FullCRUDCacheRepo( locker.unlockWrite() } } + @OverrideRequireManualInvalidation override suspend fun invalidate() { actualizeAll() } diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/FullKeyValueCacheRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/FullKeyValueCacheRepo.kt index 470430ae055..50fc5b77aec 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/FullKeyValueCacheRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/FullKeyValueCacheRepo.kt @@ -8,6 +8,7 @@ import dev.inmo.micro_utils.coroutines.withWriteLock import dev.inmo.micro_utils.pagination.Pagination import dev.inmo.micro_utils.pagination.PaginationResult import dev.inmo.micro_utils.repos.* +import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation import dev.inmo.micro_utils.repos.cache.util.ActualizeAllClearMode import dev.inmo.micro_utils.repos.cache.util.actualizeAll import kotlinx.coroutines.CoroutineScope @@ -86,6 +87,7 @@ open class FullReadKeyValueCacheRepo( { if (it.results.isNotEmpty()) actualizeAll() } ) + @OverrideRequireManualInvalidation override suspend fun invalidate() { actualizeAll() } @@ -160,6 +162,7 @@ open class FullKeyValueCacheRepo( locker.unlockWrite() } } + @OverrideRequireManualInvalidation override suspend fun invalidate() { kvCache.actualizeAll(parentRepo, locker) } diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/FullKeyValuesCacheRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/FullKeyValuesCacheRepo.kt index b4856684916..524afa732c8 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/FullKeyValuesCacheRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/FullKeyValuesCacheRepo.kt @@ -8,6 +8,7 @@ import dev.inmo.micro_utils.coroutines.withWriteLock import dev.inmo.micro_utils.pagination.* import dev.inmo.micro_utils.pagination.utils.* import dev.inmo.micro_utils.repos.* +import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation import dev.inmo.micro_utils.repos.cache.util.ActualizeAllClearMode import dev.inmo.micro_utils.repos.cache.util.actualizeAll import dev.inmo.micro_utils.repos.pagination.maxPagePagination @@ -153,6 +154,7 @@ open class FullReadKeyValuesCacheRepo( { if (it.results.isNotEmpty()) actualizeAll() } ) + @OverrideRequireManualInvalidation override suspend fun invalidate() { actualizeAll() } @@ -235,6 +237,7 @@ open class FullKeyValuesCacheRepo( locker.unlockWrite() } } + @OverrideRequireManualInvalidation override suspend fun invalidate() { kvCache.actualizeAll(parentRepo, locker = locker) } diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/direct/DirectFullCRUDCacheRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/direct/DirectFullCRUDCacheRepo.kt index d371d671f9d..29e536f1b60 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/direct/DirectFullCRUDCacheRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/direct/DirectFullCRUDCacheRepo.kt @@ -1,11 +1,13 @@ package dev.inmo.micro_utils.repos.cache.full.direct +import dev.inmo.micro_utils.common.Warning import dev.inmo.micro_utils.coroutines.SmartRWLocker import dev.inmo.micro_utils.coroutines.launchLoggingDropExceptions import dev.inmo.micro_utils.coroutines.withReadAcquire import dev.inmo.micro_utils.pagination.Pagination import dev.inmo.micro_utils.pagination.PaginationResult import dev.inmo.micro_utils.repos.* +import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation import dev.inmo.micro_utils.repos.cache.* import dev.inmo.micro_utils.repos.cache.util.actualizeAll import kotlinx.coroutines.CoroutineScope @@ -96,6 +98,8 @@ open class DirectFullCRUDCacheRepo( locker.unlockWrite() } } + + @OverrideRequireManualInvalidation override suspend fun invalidate() { actualizeAll() } diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/direct/DirectFullKeyValueCacheRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/direct/DirectFullKeyValueCacheRepo.kt index 1da59594bf8..099d2b71d03 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/direct/DirectFullKeyValueCacheRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/direct/DirectFullKeyValueCacheRepo.kt @@ -7,6 +7,7 @@ import dev.inmo.micro_utils.coroutines.withWriteLock import dev.inmo.micro_utils.pagination.Pagination import dev.inmo.micro_utils.pagination.PaginationResult import dev.inmo.micro_utils.repos.* +import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation import dev.inmo.micro_utils.repos.cache.full.FullKeyValueCacheRepo import dev.inmo.micro_utils.repos.cache.full.FullReadKeyValueCacheRepo import dev.inmo.micro_utils.repos.cache.full.FullWriteKeyValueCacheRepo @@ -54,6 +55,7 @@ open class DirectFullReadKeyValueCacheRepo( kvCache.keys(v, pagination, reversed) } + @OverrideRequireManualInvalidation override suspend fun invalidate() { actualizeAll() } @@ -86,6 +88,7 @@ open class DirectFullWriteKeyValueCacheRepo( } }.launchIn(scope) + @OverrideRequireManualInvalidation override suspend fun invalidate() { locker.withWriteLock { kvCache.clear() @@ -135,6 +138,7 @@ open class DirectFullKeyValueCacheRepo( locker.unlockWrite() } } + @OverrideRequireManualInvalidation override suspend fun invalidate() { kvCache.actualizeAll(parentRepo, locker) } diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/direct/DirectFullKeyValuesCacheRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/direct/DirectFullKeyValuesCacheRepo.kt index a70543c7dc0..c4d3d827446 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/direct/DirectFullKeyValuesCacheRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/direct/DirectFullKeyValuesCacheRepo.kt @@ -8,6 +8,7 @@ import dev.inmo.micro_utils.coroutines.withWriteLock import dev.inmo.micro_utils.pagination.* import dev.inmo.micro_utils.pagination.utils.* import dev.inmo.micro_utils.repos.* +import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation import dev.inmo.micro_utils.repos.cache.util.ActualizeAllClearMode import dev.inmo.micro_utils.repos.cache.util.actualizeAll import kotlinx.coroutines.CoroutineScope @@ -88,6 +89,7 @@ open class DirectFullReadKeyValuesCacheRepo( return result ?: emptyPaginationResult() } + @OverrideRequireManualInvalidation override suspend fun invalidate() { actualizeAll() } @@ -121,6 +123,7 @@ open class DirectFullWriteKeyValuesCacheRepo( } }.launchIn(scope) + @OverrideRequireManualInvalidation override suspend fun invalidate() { locker.withWriteLock { kvCache.clear() @@ -170,6 +173,7 @@ open class DirectFullKeyValuesCacheRepo( locker.unlockWrite() } } + @OverrideRequireManualInvalidation override suspend fun invalidate() { kvCache.actualizeAll(parentRepo, locker = locker) } diff --git a/repos/cache/src/jvmMain/kotlin/InvalidateSynchronously.kt b/repos/cache/src/jvmMain/kotlin/InvalidateSynchronously.kt new file mode 100644 index 00000000000..73fc94b7c5c --- /dev/null +++ b/repos/cache/src/jvmMain/kotlin/InvalidateSynchronously.kt @@ -0,0 +1,54 @@ +package dev.inmo.micro_utils.repos.cache + +import dev.inmo.kslog.common.KSLog +import dev.inmo.micro_utils.coroutines.doSynchronously +import dev.inmo.micro_utils.coroutines.runCatchingLogging +import kotlinx.coroutines.CoroutineScope + +fun T.alsoInvalidateSync( + scope: CoroutineScope, + onFailure: suspend (Throwable) -> Unit = {}, +) = also { + scope.doSynchronously { + runCatching { + invalidate() + }.onFailure { + onFailure(it) + } + } +} + +fun T.alsoInvalidateSync( + onFailure: suspend (Throwable) -> Unit = {}, +) = also { + doSynchronously { + runCatching { + invalidate() + }.onFailure { + onFailure(it) + } + } +} + +fun T.alsoInvalidateSyncLogging( + scope: CoroutineScope, + errorMessageBuilder: CoroutineScope.(Throwable) -> Any = { "Something web wrong" }, + logger: KSLog = KSLog, +) = also { + scope.doSynchronously { + runCatchingLogging(errorMessageBuilder, logger) { + invalidate() + } + } +} + +fun T.alsoInvalidateSyncLogging( + errorMessageBuilder: CoroutineScope.(Throwable) -> Any = { "Something web wrong" }, + logger: KSLog = KSLog, +) = also { + doSynchronously { + runCatchingLogging(errorMessageBuilder, logger) { + invalidate() + } + } +} diff --git a/repos/ktor/common/src/jvmTest/kotlin/KtorCRUDRepoTests.kt b/repos/ktor/common/src/jvmTest/kotlin/KtorCRUDRepoTests.kt index 0426e0e6aca..e94b0bcf8b0 100644 --- a/repos/ktor/common/src/jvmTest/kotlin/KtorCRUDRepoTests.kt +++ b/repos/ktor/common/src/jvmTest/kotlin/KtorCRUDRepoTests.kt @@ -73,7 +73,7 @@ class KtorCRUDRepoTests : CommonCRUDRepoTests() { } val server = io.ktor.server.engine.embeddedServer( CIO, - 34567, + 34568, "127.0.0.1" ) { install(ContentNegotiation) { @@ -100,7 +100,7 @@ class KtorCRUDRepoTests : CommonCRUDRepoTests() { } } val crudClient = KtorCRUDRepoClient( - "http://127.0.0.1:34567", + "http://127.0.0.1:34568", client, ContentType.Application.Json ) { diff --git a/repos/ktor/common/src/jvmTest/kotlin/KtorKeyValueRepoTests.kt b/repos/ktor/common/src/jvmTest/kotlin/KtorKeyValueRepoTests.kt index 781c15c764d..a2b336b7065 100644 --- a/repos/ktor/common/src/jvmTest/kotlin/KtorKeyValueRepoTests.kt +++ b/repos/ktor/common/src/jvmTest/kotlin/KtorKeyValueRepoTests.kt @@ -63,7 +63,7 @@ class KtorKeyValueRepoTests : CommonKeyValueRepoTests() { val repo = MapKeyValueRepo(map) val server = io.ktor.server.engine.embeddedServer( CIO, - 34567, + 34569, "127.0.0.1" ) { install(ContentNegotiation) { @@ -91,7 +91,7 @@ class KtorKeyValueRepoTests : CommonKeyValueRepoTests() { } } val crudClient = KtorKeyValueRepoClient( - "http://127.0.0.1:34567", + "http://127.0.0.1:34569", client, ContentType.Application.Json, Int.serializer(),