@@ -7,11 +7,6 @@ import com.google.common.collect.HashBiMap
77import com.google.common.collect.Maps
88import graphql.language.Definition
99import graphql.language.Document
10- import graphql.language.FieldDefinition
11- import graphql.language.ListType
12- import graphql.language.NonNullType
13- import graphql.language.ObjectTypeDefinition
14- import graphql.language.TypeName
1510import graphql.parser.Parser
1611import graphql.schema.DataFetchingEnvironment
1712import graphql.schema.GraphQLScalarType
@@ -288,7 +283,7 @@ data class SchemaParserOptions internal constructor(
288283 val proxyHandlers : List <ProxyHandler >,
289284 val preferGraphQLResolver : Boolean ,
290285 val introspectionEnabled : Boolean ,
291- val coroutineContext : CoroutineContext ,
286+ val coroutineContextProvider : CoroutineContextProvider ,
292287 val typeDefinitionFactories : List <TypeDefinitionFactory >
293288) {
294289 companion object {
@@ -299,6 +294,9 @@ data class SchemaParserOptions internal constructor(
299294 fun defaultOptions () = Builder ().build()
300295 }
301296
297+ val coroutineContext: CoroutineContext
298+ get() = coroutineContextProvider.provide()
299+
302300 class Builder {
303301 private var contextClass: Class <* >? = null
304302 private val genericWrappers: MutableList <GenericWrapper > = mutableListOf ()
@@ -308,6 +306,7 @@ data class SchemaParserOptions internal constructor(
308306 private val proxyHandlers: MutableList <ProxyHandler > = mutableListOf (Spring4AopProxyHandler (), GuiceAopProxyHandler (), JavassistProxyHandler (), WeldProxyHandler ())
309307 private var preferGraphQLResolver = false
310308 private var introspectionEnabled = true
309+ private var coroutineContextProvider: CoroutineContextProvider ? = null
311310 private var coroutineContext: CoroutineContext ? = null
312311 private var typeDefinitionFactories: MutableList <TypeDefinitionFactory > = mutableListOf (RelayConnectionFactory ())
313312
@@ -360,7 +359,11 @@ data class SchemaParserOptions internal constructor(
360359 }
361360
362361 fun coroutineContext (context : CoroutineContext ) = this .apply {
363- this .coroutineContext = context
362+ this .coroutineContextProvider = DefaultCoroutineContextProvider (context)
363+ }
364+
365+ fun coroutineContextProvider (contextProvider : CoroutineContextProvider ) = this .apply {
366+ this .coroutineContextProvider = contextProvider
364367 }
365368
366369 fun typeDefinitionFactory (factory : TypeDefinitionFactory ) = this .apply {
@@ -369,15 +372,15 @@ data class SchemaParserOptions internal constructor(
369372
370373 @ExperimentalCoroutinesApi
371374 fun build (): SchemaParserOptions {
372- val coroutineContext = coroutineContext ? : Dispatchers .Default
375+ val coroutineContextProvider = coroutineContextProvider ? : DefaultCoroutineContextProvider ( Dispatchers .Default )
373376 val wrappers = if (useDefaultGenericWrappers) {
374377 genericWrappers + listOf (
375378 GenericWrapper (Future ::class , 0 ),
376379 GenericWrapper (CompletableFuture ::class , 0 ),
377380 GenericWrapper (CompletionStage ::class , 0 ),
378381 GenericWrapper (Publisher ::class , 0 ),
379382 GenericWrapper .withTransformer(ReceiveChannel ::class , 0 , { receiveChannel ->
380- GlobalScope .publish(coroutineContext ) {
383+ GlobalScope .publish(coroutineContextProvider.provide() ) {
381384 try {
382385 for (item in receiveChannel) {
383386 send(item)
@@ -393,7 +396,13 @@ data class SchemaParserOptions internal constructor(
393396 }
394397
395398 return SchemaParserOptions (contextClass, wrappers, allowUnimplementedResolvers, objectMapperProvider,
396- proxyHandlers, preferGraphQLResolver, introspectionEnabled, coroutineContext, typeDefinitionFactories)
399+ proxyHandlers, preferGraphQLResolver, introspectionEnabled, coroutineContextProvider, typeDefinitionFactories)
400+ }
401+ }
402+
403+ internal class DefaultCoroutineContextProvider (val coroutineContext : CoroutineContext ): CoroutineContextProvider {
404+ override fun provide (): CoroutineContext {
405+ return coroutineContext
397406 }
398407 }
399408
0 commit comments