diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e8e7c28f25..0d4ea0aea7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.26.1 + +* `Versions`: + * `Compose`: `1.8.1` -> `1.8.2` + * `Ktor`: `3.2.1` -> `3.2.2` +* `Coroutines`: + * Add opportunity to pass logger in subscribe async + ## 0.26.0 **WARNING!!! SINCE THIS VERSION IF YOU WANT TO USE SOME OF KSP MODULES, SET `ksp.useKSP2=false` IN YOUR `gradle.properties`** (see [gh issue 2491](https://github.com/google/ksp/issues/2491)) diff --git a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/ActorAsync.kt b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/ActorAsync.kt index 9964a561998..fe9215ada50 100644 --- a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/ActorAsync.kt +++ b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/ActorAsync.kt @@ -1,5 +1,6 @@ package dev.inmo.micro_utils.coroutines +import dev.inmo.kslog.common.KSLog import kotlinx.coroutines.* import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.consumeAsFlow @@ -7,13 +8,15 @@ import kotlinx.coroutines.flow.consumeAsFlow fun CoroutineScope.actorAsync( channelCapacity: Int = Channel.UNLIMITED, markerFactory: suspend (T) -> Any? = { null }, + logger: KSLog = KSLog, block: suspend (T) -> Unit ): Channel { val channel = Channel(channelCapacity) - channel.consumeAsFlow().subscribeAsync(this, markerFactory, block) + channel.consumeAsFlow().subscribeAsync(this, markerFactory, logger, block) return channel } +@Deprecated("Use standard actosAsync instead", ReplaceWith("actorAsync(channelCapacity, markerFactory, block = block)", "dev.inmo.micro_utils.coroutines.actorAsync")) inline fun CoroutineScope.safeActorAsync( channelCapacity: Int = Channel.UNLIMITED, noinline onException: ExceptionHandler = defaultSafelyExceptionHandler, 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 3f46576e8dc..b3f1dcf8565 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 @@ -1,5 +1,6 @@ package dev.inmo.micro_utils.coroutines +import dev.inmo.kslog.common.KSLog import kotlinx.coroutines.* import kotlinx.coroutines.channels.* import kotlinx.coroutines.flow.* @@ -8,6 +9,7 @@ import kotlinx.coroutines.sync.withLock private class SubscribeAsyncReceiver( val scope: CoroutineScope, + val logger: KSLog, output: suspend SubscribeAsyncReceiver.(T) -> Unit ) { private val dataChannel: Channel = Channel(Channel.UNLIMITED) @@ -15,7 +17,7 @@ private class SubscribeAsyncReceiver( get() = dataChannel init { - scope.launchLoggingDropExceptions { + scope.launchLoggingDropExceptions(logger = logger) { for (data in dataChannel) { output(data) } @@ -33,13 +35,16 @@ private data class AsyncSubscriptionCommandData( val scope: CoroutineScope, val markerFactory: suspend (T) -> M, val block: suspend (T) -> Unit, + val logger: KSLog, val onEmpty: suspend (M) -> Unit ) : AsyncSubscriptionCommand { override suspend fun invoke(markersMap: MutableMap>) { val marker = markerFactory(data) markersMap.getOrPut(marker) { - SubscribeAsyncReceiver(scope.LinkedSupervisorScope()) { - safelyWithoutExceptions { block(it) } + SubscribeAsyncReceiver(scope.LinkedSupervisorScope(), logger) { + runCatchingLogging(logger = logger) { + block(it) + } if (isEmpty()) { onEmpty(marker) } @@ -63,6 +68,7 @@ private data class AsyncSubscriptionCommandClearReceiver( fun Flow.subscribeAsync( scope: CoroutineScope, markerFactory: suspend (T) -> M, + logger: KSLog = KSLog, block: suspend (T) -> Unit ): Job { val subscope = scope.LinkedSupervisorScope() @@ -71,8 +77,14 @@ fun Flow.subscribeAsync( it.invoke(markersMap) } - val job = subscribeLoggingDropExceptions(subscope) { data -> - val dataCommand = AsyncSubscriptionCommandData(data, subscope, markerFactory, block) { marker -> + val job = subscribeLoggingDropExceptions(subscope, logger = logger) { data -> + val dataCommand = AsyncSubscriptionCommandData( + data = data, + scope = subscope, + markerFactory = markerFactory, + block = block, + logger = logger + ) { marker -> actor.send( AsyncSubscriptionCommandClearReceiver(marker) ) @@ -85,17 +97,20 @@ fun Flow.subscribeAsync( return job } +@Deprecated("Renamed", ReplaceWith("subscribeLoggingDropExceptionsAsync(scope, markerFactory, block = block)", "dev.inmo.micro_utils.coroutines.subscribeLoggingDropExceptionsAsync")) fun Flow.subscribeSafelyAsync( scope: CoroutineScope, markerFactory: suspend (T) -> M, onException: ExceptionHandler = defaultSafelyExceptionHandler, + logger: KSLog = KSLog, block: suspend (T) -> Unit -) = subscribeAsync(scope, markerFactory) { +) = subscribeAsync(scope, markerFactory, logger) { safely(onException) { block(it) } } +@Deprecated("Renamed", ReplaceWith("subscribeLoggingDropExceptionsAsync(scope, markerFactory, block = block)", "dev.inmo.micro_utils.coroutines.subscribeLoggingDropExceptionsAsync")) fun Flow.subscribeSafelyWithoutExceptionsAsync( scope: CoroutineScope, markerFactory: suspend (T) -> M, @@ -107,11 +122,22 @@ fun Flow.subscribeSafelyWithoutExceptionsAsync( } } +fun Flow.subscribeLoggingDropExceptionsAsync( + scope: CoroutineScope, + markerFactory: suspend (T) -> M, + logger: KSLog = KSLog, + block: suspend (T) -> Unit +) = subscribeAsync(scope, markerFactory, logger) { + block(it) +} + +@Deprecated("Renamed", ReplaceWith("subscribeLoggingDropExceptionsAsync(scope, markerFactory, logger, block = block)", "dev.inmo.micro_utils.coroutines.subscribeLoggingDropExceptionsAsync")) fun Flow.subscribeSafelySkippingExceptionsAsync( scope: CoroutineScope, markerFactory: suspend (T) -> M, + logger: KSLog = KSLog, block: suspend (T) -> Unit -) = subscribeAsync(scope, markerFactory) { +) = subscribeAsync(scope, markerFactory, logger) { safelyWithoutExceptions({ /* do nothing */}) { block(it) } diff --git a/gradle.properties b/gradle.properties index 6c9704f1421..58f1d293e25 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,5 +18,5 @@ crypto_js_version=4.1.1 # Project data group=dev.inmo -version=0.26.0 -android_code_version=299 +version=0.26.1 +android_code_version=300 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6461f4f4eaa..8156a9a29ed 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,7 +8,7 @@ kotlinx-browser = "0.3" kslog = "1.5.0" -jb-compose = "1.8.1" +jb-compose = "1.8.2" jb-exposed = "0.61.0" jb-dokka = "2.0.0" @@ -17,7 +17,7 @@ sqlite = "3.50.1.0" korlibs = "5.4.0" uuid = "0.8.4" -ktor = "3.2.1" +ktor = "3.2.2" gh-release = "2.5.2" @@ -28,7 +28,7 @@ okio = "3.15.0" ksp = "2.2.0-2.0.2" kotlin-poet = "2.2.0" -versions = "0.51.0" +versions = "0.52.0" nmcp = "1.0.1" android-gradle = "8.9.+"