package kotlinx.coroutines.reactor import kotlinx.coroutines.reactive.* import org.reactivestreams.* import reactor.core.publisher.* import reactor.util.context.* import kotlin.coroutines.* internal class ReactorContextInjector : ContextInjector { /** * Injects all values from the [ReactorContext] entry of the given coroutine context * into the downstream [Context] of Reactor's [Publisher] instances of [Mono] or [Flux]. */ override fun injectCoroutineContext(publisher: Publisher, coroutineContext: CoroutineContext): Publisher { val reactorContext = coroutineContext[ReactorContext]?.context ?: return publisher return when(publisher) { is Mono -> publisher.contextWrite(reactorContext) is Flux -> publisher.contextWrite(reactorContext) else -> publisher } } }