Skip to content

Commit

Permalink
Minor optimizations to avoid excessive parsing/printing
Browse files Browse the repository at this point in the history
  • Loading branch information
freiksenet committed Oct 4, 2017
1 parent d70a854 commit 67a0e0a
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 18 deletions.
12 changes: 8 additions & 4 deletions src/stitching/introspectSchema.ts
Expand Up @@ -3,17 +3,21 @@ import { introspectionQuery, buildClientSchema } from 'graphql';
import { ApolloLink, execute, makePromise } from 'apollo-link';
import { Fetcher, fetcherToLink } from './makeRemoteExecutableSchema';

const parsedIntrospectionQuery = parse(introspectionQuery);

export default async function introspectSchema(
link: ApolloLink | Fetcher,
context?: { [key: string]: any },
): Promise<GraphQLSchema> {
if (!(link as ApolloLink).request) {
link = fetcherToLink(link as Fetcher);
}
const introspectionResult = await makePromise(execute((link as ApolloLink), {
query: typeof introspectionQuery === 'string' ? parse(introspectionQuery) : introspectionQuery,
context,
}));
const introspectionResult = await makePromise(
execute(link as ApolloLink, {
query: parsedIntrospectionQuery,
context,
}),
);
if (introspectionResult.errors || !introspectionResult.data.__schema) {
throw introspectionResult.errors;
} else {
Expand Down
32 changes: 18 additions & 14 deletions src/stitching/makeRemoteExecutableSchema.ts
@@ -1,4 +1,4 @@
import { printSchema, print, parse, Kind, ValueNode, ExecutionResult } from 'graphql';
import { printSchema, print, Kind, ValueNode, ExecutionResult } from 'graphql';
import { execute, makePromise, ApolloLink, Observable } from 'apollo-link';

import {
Expand Down Expand Up @@ -28,15 +28,15 @@ export type Fetcher = (
) => Promise<ExecutionResult>;

export const fetcherToLink = (fetcher: Fetcher): ApolloLink => {
return new ApolloLink((operation) => {
return new ApolloLink(operation => {
return new Observable(observer => {
const { query, operationName, variables } = operation;
const context = operation.getContext();
fetcher({
query: typeof query === 'string' ? query : print(query),
operationName,
variables,
context
context,
})
.then((result: ExecutionResult) => {
observer.next(result);
Expand All @@ -50,7 +50,7 @@ export const fetcherToLink = (fetcher: Fetcher): ApolloLink => {
export default function makeRemoteExecutableSchema({
schema,
link,
fetcher
fetcher,
}: {
schema: GraphQLSchema;
link?: ApolloLink;
Expand Down Expand Up @@ -118,16 +118,20 @@ export default function makeRemoteExecutableSchema({

function createResolver(link: ApolloLink): GraphQLFieldResolver<any, any> {
return async (root, args, context, info) => {
const operation = print(info.operation);
const fragments = Object.keys(info.fragments)
.map(fragment => print(info.fragments[fragment]))
.join('\n');
const query = `${operation}\n${fragments}`;
const result = await makePromise(execute(link, {
query: typeof query === 'string' ? parse(query) : query,
variables: info.variableValues,
context,
}));
const fragments = Object.keys(info.fragments).map(
fragment => info.fragments[fragment],
);
const document = {
kind: Kind.DOCUMENT,
definitions: [info.operation, ...fragments],
};
const result = await makePromise(
execute(link, {
query: document,
variables: info.variableValues,
context,
}),
);
const fieldName = info.fieldNodes[0].alias
? info.fieldNodes[0].alias.value
: info.fieldName;
Expand Down

0 comments on commit 67a0e0a

Please sign in to comment.