@@ -7,11 +7,6 @@ import com.google.common.collect.HashBiMap
7
7
import com.google.common.collect.Maps
8
8
import graphql.language.Definition
9
9
import 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
15
10
import graphql.parser.Parser
16
11
import graphql.schema.DataFetchingEnvironment
17
12
import graphql.schema.GraphQLScalarType
@@ -288,7 +283,7 @@ data class SchemaParserOptions internal constructor(
288
283
val proxyHandlers : List <ProxyHandler >,
289
284
val preferGraphQLResolver : Boolean ,
290
285
val introspectionEnabled : Boolean ,
291
- val coroutineContext : CoroutineContext ,
286
+ val coroutineContextProvider : CoroutineContextProvider ,
292
287
val typeDefinitionFactories : List <TypeDefinitionFactory >
293
288
) {
294
289
companion object {
@@ -299,6 +294,9 @@ data class SchemaParserOptions internal constructor(
299
294
fun defaultOptions () = Builder ().build()
300
295
}
301
296
297
+ val coroutineContext: CoroutineContext
298
+ get() = coroutineContextProvider.provide()
299
+
302
300
class Builder {
303
301
private var contextClass: Class <* >? = null
304
302
private val genericWrappers: MutableList <GenericWrapper > = mutableListOf ()
@@ -308,6 +306,7 @@ data class SchemaParserOptions internal constructor(
308
306
private val proxyHandlers: MutableList <ProxyHandler > = mutableListOf (Spring4AopProxyHandler (), GuiceAopProxyHandler (), JavassistProxyHandler (), WeldProxyHandler ())
309
307
private var preferGraphQLResolver = false
310
308
private var introspectionEnabled = true
309
+ private var coroutineContextProvider: CoroutineContextProvider ? = null
311
310
private var coroutineContext: CoroutineContext ? = null
312
311
private var typeDefinitionFactories: MutableList <TypeDefinitionFactory > = mutableListOf (RelayConnectionFactory ())
313
312
@@ -360,7 +359,11 @@ data class SchemaParserOptions internal constructor(
360
359
}
361
360
362
361
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
364
367
}
365
368
366
369
fun typeDefinitionFactory (factory : TypeDefinitionFactory ) = this .apply {
@@ -369,15 +372,15 @@ data class SchemaParserOptions internal constructor(
369
372
370
373
@ExperimentalCoroutinesApi
371
374
fun build (): SchemaParserOptions {
372
- val coroutineContext = coroutineContext ? : Dispatchers .Default
375
+ val coroutineContextProvider = coroutineContextProvider ? : DefaultCoroutineContextProvider ( Dispatchers .Default )
373
376
val wrappers = if (useDefaultGenericWrappers) {
374
377
genericWrappers + listOf (
375
378
GenericWrapper (Future ::class , 0 ),
376
379
GenericWrapper (CompletableFuture ::class , 0 ),
377
380
GenericWrapper (CompletionStage ::class , 0 ),
378
381
GenericWrapper (Publisher ::class , 0 ),
379
382
GenericWrapper .withTransformer(ReceiveChannel ::class , 0 , { receiveChannel ->
380
- GlobalScope .publish(coroutineContext ) {
383
+ GlobalScope .publish(coroutineContextProvider.provide() ) {
381
384
try {
382
385
for (item in receiveChannel) {
383
386
send(item)
@@ -393,7 +396,13 @@ data class SchemaParserOptions internal constructor(
393
396
}
394
397
395
398
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
397
406
}
398
407
}
399
408
0 commit comments