diff --git a/src/main/kotlin/com/coxautodev/graphql/tools/MethodFieldResolver.kt b/src/main/kotlin/com/coxautodev/graphql/tools/MethodFieldResolver.kt index e83fb7e2..b9027c42 100644 --- a/src/main/kotlin/com/coxautodev/graphql/tools/MethodFieldResolver.kt +++ b/src/main/kotlin/com/coxautodev/graphql/tools/MethodFieldResolver.kt @@ -202,7 +202,7 @@ open class MethodFieldResolverDataFetcher(private val sourceResolver: SourceReso val args = this.args.map { it(environment) }.toTypedArray() return if (isSuspendFunction) { - GlobalScope.future(options.coroutineContextProvider.provide()) { + environment.coroutineScope().future(options.coroutineContextProvider.provide()) { methodAccess.invokeSuspend(source, methodIndex, args)?.transformWithGenericWrapper(environment) } } else { diff --git a/src/main/kotlin/com/coxautodev/graphql/tools/SchemaParserBuilder.kt b/src/main/kotlin/com/coxautodev/graphql/tools/SchemaParserBuilder.kt index b1a9c33f..645437b0 100644 --- a/src/main/kotlin/com/coxautodev/graphql/tools/SchemaParserBuilder.kt +++ b/src/main/kotlin/com/coxautodev/graphql/tools/SchemaParserBuilder.kt @@ -14,7 +14,6 @@ import graphql.schema.idl.RuntimeWiring import graphql.schema.idl.SchemaDirectiveWiring import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.channels.ReceiveChannel import kotlinx.coroutines.reactive.publish import org.antlr.v4.runtime.RecognitionException @@ -383,8 +382,8 @@ data class SchemaParserOptions internal constructor( GenericWrapper(CompletableFuture::class, 0), GenericWrapper(CompletionStage::class, 0), GenericWrapper(Publisher::class, 0), - GenericWrapper.withTransformer(ReceiveChannel::class, 0, { receiveChannel -> - GlobalScope.publish(coroutineContextProvider.provide()) { + GenericWrapper.withTransformer(ReceiveChannel::class, 0, { receiveChannel, environment -> + environment.coroutineScope().publish(coroutineContextProvider.provide()) { try { for (item in receiveChannel) { send(item) diff --git a/src/main/kotlin/com/coxautodev/graphql/tools/Utils.kt b/src/main/kotlin/com/coxautodev/graphql/tools/Utils.kt index 4677ab88..55dd18d6 100644 --- a/src/main/kotlin/com/coxautodev/graphql/tools/Utils.kt +++ b/src/main/kotlin/com/coxautodev/graphql/tools/Utils.kt @@ -6,6 +6,9 @@ import graphql.language.NonNullType import graphql.language.ObjectTypeDefinition import graphql.language.ObjectTypeExtensionDefinition import graphql.language.Type +import graphql.schema.DataFetchingEnvironment +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.GlobalScope import java.lang.reflect.Method import java.lang.reflect.ParameterizedType import java.lang.reflect.Proxy @@ -38,6 +41,12 @@ internal fun JavaType.unwrap(): Class = } + +internal fun DataFetchingEnvironment.coroutineScope(): CoroutineScope { + val context: Any? = this.getContext() + return if (context is CoroutineScope) context else GlobalScope +} + internal val Class<*>.declaredNonProxyMethods: List get() { return when { @@ -46,6 +55,7 @@ internal val Class<*>.declaredNonProxyMethods: List } } + /** * Simple heuristic to check is a method is a trivial data fetcher. *