diff --git a/jOOQ-kotlin-coroutines/src/main/kotlin/org/jooq/kotlin/coroutines/CoroutineExtensions.kt b/jOOQ-kotlin-coroutines/src/main/kotlin/org/jooq/kotlin/coroutines/CoroutineExtensions.kt index 8840b53ead..af3823cd97 100644 --- a/jOOQ-kotlin-coroutines/src/main/kotlin/org/jooq/kotlin/coroutines/CoroutineExtensions.kt +++ b/jOOQ-kotlin-coroutines/src/main/kotlin/org/jooq/kotlin/coroutines/CoroutineExtensions.kt @@ -1,7 +1,8 @@ package org.jooq.kotlin.coroutines import kotlin.coroutines.CoroutineContext -import kotlinx.coroutines.reactive.awaitFirstOrNull +import kotlin.coroutines.EmptyCoroutineContext +import kotlinx.coroutines.reactive.awaitSingle import kotlinx.coroutines.reactor.mono import org.jooq.Configuration import org.jooq.DSLContext @@ -10,20 +11,18 @@ import org.jooq.DSLContext // Extensions to bridge between the reactive-streams and the coroutine world // ---------------------------------------------------------------------------- -suspend fun DSLContext.transactionCoroutine(transactional: suspend (Configuration) -> T): T { - @Suppress("UNCHECKED_CAST") - return transactionPublisher { c -> - mono { - transactional.invoke(c) - } - }.awaitFirstOrNull() as T -} +suspend fun DSLContext.transactionCoroutine(transactional: suspend (Configuration) -> T): T = + transactionCoroutine(EmptyCoroutineContext, transactional) + suspend fun DSLContext.transactionCoroutine(context: CoroutineContext, transactional: suspend (Configuration) -> T): T { - @Suppress("UNCHECKED_CAST") + // [#14997] Wrap values in an auxiliary class in order to allow nulls, which awaitSingle() + // doesn't allow, otherwise + data class Wrap(val t: T) + return transactionPublisher { c -> mono(context) { - transactional.invoke(c) + Wrap(transactional.invoke(c)) } - }.awaitFirstOrNull() as T + }.awaitSingle().t } \ No newline at end of file