Skip to content

Commit bdafe57

Browse files
authored
Merge pull request #247 from westd/coroutine-context-provider
Allow configuration of CoroutineContextProvider so that context can b…
2 parents 0802f3e + 14c4dd2 commit bdafe57

File tree

3 files changed

+27
-11
lines changed

3 files changed

+27
-11
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.coxautodev.graphql.tools;
2+
3+
import kotlin.coroutines.CoroutineContext;
4+
5+
public interface CoroutineContextProvider {
6+
CoroutineContext provide();
7+
}

src/main/kotlin/com/coxautodev/graphql/tools/MethodFieldResolver.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ open class MethodFieldResolverDataFetcher(private val sourceResolver: SourceReso
156156
val args = this.args.map { it(environment) }.toTypedArray()
157157

158158
return if (isSuspendFunction) {
159-
GlobalScope.future(options.coroutineContext) {
159+
GlobalScope.future(options.coroutineContextProvider.provide()) {
160160
methodAccess.invokeSuspend(source, methodIndex, args)?.transformWithGenericWrapper(environment)
161161
}
162162
} else {

src/main/kotlin/com/coxautodev/graphql/tools/SchemaParserBuilder.kt

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,6 @@ import com.google.common.collect.HashBiMap
77
import com.google.common.collect.Maps
88
import graphql.language.Definition
99
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
1510
import graphql.parser.Parser
1611
import graphql.schema.DataFetchingEnvironment
1712
import 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

Comments
 (0)