diff --git a/src/Interfaces.ts b/src/Interfaces.ts index 314f14ff10b..e265e4d0c48 100644 --- a/src/Interfaces.ts +++ b/src/Interfaces.ts @@ -207,16 +207,6 @@ export interface IDelegateRequestOptions extends IDelegateToSchemaOptions { request: Request; } -export type Delegator = ({ - document, - context, - variables, -}: { - document: DocumentNode; - context?: { [key: string]: any }; - variables?: { [key: string]: any }; -}) => any; - export interface MergeInfo { delegate: ( type: 'query' | 'mutation' | 'subscription', diff --git a/src/delegate/delegateToSchema.ts b/src/delegate/delegateToSchema.ts index 9fc53a1aeb0..f398d332c24 100644 --- a/src/delegate/delegateToSchema.ts +++ b/src/delegate/delegateToSchema.ts @@ -8,13 +8,13 @@ import { ExecutionResult, GraphQLOutputType, isSchema, + DocumentNode, } from 'graphql'; import { IDelegateToSchemaOptions, IDelegateRequestOptions, Fetcher, - Delegator, SubschemaConfig, isSubschemaConfig, IGraphQLToolsResolveInfo, @@ -202,9 +202,7 @@ export function delegateRequest({ subschemaConfig, ); - const executionResult: - | ExecutionResult - | Promise = executor({ + const executionResult = executor({ document: processedRequest.document, context, variables: processedRequest.variables, @@ -263,7 +261,15 @@ function createExecutor( rootValue: Record, context: Record, subschemaConfig?: SubschemaConfig, -): Delegator { +): ({ + document, + context, + variables, +}: { + document: DocumentNode; + context?: Record; + variables?: Record; +}) => Promise | ExecutionResult { let fetcher: Fetcher; let targetRootValue: Record = rootValue; if (subschemaConfig != null) { @@ -308,7 +314,15 @@ function createSubscriber( rootValue: Record, context: Record, subschemaConfig?: SubschemaConfig, -): Delegator { +): ({ + document, + context, + variables, +}: { + document: DocumentNode; + context?: Record; + variables?: Record; +}) => Promise | ExecutionResult> { let link: ApolloLink; let targetRootValue: Record = rootValue; @@ -332,7 +346,7 @@ function createSubscriber( context: { graphqlContext }, }; const observable = executeLink(link, operation); - return observableToAsyncIterable(observable); + return Promise.resolve(observableToAsyncIterable(observable)); }; } diff --git a/src/wrap/makeRemoteExecutableSchema.ts b/src/wrap/makeRemoteExecutableSchema.ts index 295ee8ca4df..f8dd8f071b6 100644 --- a/src/wrap/makeRemoteExecutableSchema.ts +++ b/src/wrap/makeRemoteExecutableSchema.ts @@ -2,30 +2,16 @@ import { ApolloLink } from 'apollo-link'; import { GraphQLFieldResolver, GraphQLSchema, - Kind, - GraphQLResolveInfo, BuildSchemaOptions, - DocumentNode, } from 'graphql'; import { Fetcher } from '../Interfaces'; import { buildSchema } from '../polyfills/index'; -import { addTypenameToAbstract } from '../delegate/addTypenameToAbstract'; -import { checkResultAndHandleErrors } from '../delegate/checkResultAndHandleErrors'; - -import linkToFetcher, { execute } from '../stitch/linkToFetcher'; -import { observableToAsyncIterable } from '../stitch/observableToAsyncIterable'; -import mapAsyncIterator from '../stitch/mapAsyncIterator'; +import linkToFetcher from '../stitch/linkToFetcher'; +import { delegateToSchema } from '../delegate'; import { wrapSchema } from './wrapSchema'; -export type ResolverFn = ( - rootValue?: any, - args?: any, - context?: any, - info?: GraphQLResolveInfo, -) => AsyncIterator; - export default function makeRemoteExecutableSchema({ schema: schemaOrTypeDefs, link, @@ -68,50 +54,21 @@ export default function makeRemoteExecutableSchema({ export function defaultCreateRemoteResolver( fetcher: Fetcher, ): GraphQLFieldResolver { - return async (_root, _args, context, info) => { - const fragments = Object.keys(info.fragments).map( - (fragment) => info.fragments[fragment], - ); - let query: DocumentNode = { - kind: Kind.DOCUMENT, - definitions: [info.operation, ...fragments], - }; - - query = addTypenameToAbstract(info.schema, query); - - const result = await fetcher({ - query, - variables: info.variableValues, - context: { graphqlContext: context }, + return (_parent, _args, context, info) => + delegateToSchema({ + schema: { schema: info.schema, fetcher }, + context, + info, }); - return checkResultAndHandleErrors(result, context, info); - }; } export function defaultCreateRemoteSubscriptionResolver( link: ApolloLink, ): GraphQLFieldResolver { - return (_root, _args, context, info) => { - const fragments = Object.keys(info.fragments).map( - (fragment) => info.fragments[fragment], - ); - let query: DocumentNode = { - kind: Kind.DOCUMENT, - definitions: [info.operation, ...fragments], - }; - - query = addTypenameToAbstract(info.schema, query); - - const operation = { - query, - variables: info.variableValues, - context: { graphqlContext: context }, - }; - - const observable = execute(link, operation); - const originalAsyncIterator = observableToAsyncIterable(observable); - return mapAsyncIterator(originalAsyncIterator, (result) => ({ - [info.fieldName]: checkResultAndHandleErrors(result, context, info), - })); - }; + return (_parent, _args, context, info) => + delegateToSchema({ + schema: { schema: info.schema, link }, + context, + info, + }); }