Skip to content

Commit

Permalink
fix(delegate): pass extensions to executor/subscriber
Browse files Browse the repository at this point in the history
  • Loading branch information
yaacovCR committed Aug 31, 2020
1 parent 2c98cbd commit 2a6bab9
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 8 deletions.
6 changes: 2 additions & 4 deletions packages/delegate/src/delegateToSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,7 @@ export function delegateRequest({
}

const executionResult = executor({
document: processedRequest.document,
variables: processedRequest.variables,
...processedRequest,
context,
info,
});
Expand All @@ -179,8 +178,7 @@ export function delegateRequest({
subschemaConfig?.subscriber || createDefaultSubscriber(targetSchema, subschemaConfig?.rootValue || targetRootValue);

return subscriber({
document: processedRequest.document,
variables: processedRequest.variables,
...processedRequest,
context,
info,
}).then((subscriptionResult: AsyncIterableIterator<ExecutionResult> | ExecutionResult) => {
Expand Down
21 changes: 18 additions & 3 deletions packages/delegate/src/getBatchingExecutor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,18 @@ export const getBatchingExecutor = memoize2of3(function (
executor: ({ document, context, variables, info }: ExecutionParams) => ExecutionResult | Promise<ExecutionResult>
) {
const loader = new DataLoader(
createLoadFn(executor ?? subschemaConfig.executor),
createLoadFn(
executor ?? subschemaConfig.executor,
subschemaConfig.batchingOptions?.extensionsReducer ?? defaultExtensionsReducer
),
subschemaConfig.batchingOptions?.dataLoaderOptions
);
return (executionParams: ExecutionParams) => loader.load(executionParams);
});

function createLoadFn(
executor: ({ document, context, variables, info }: ExecutionParams) => ExecutionResult | Promise<ExecutionResult>
executor: ({ document, context, variables, info }: ExecutionParams) => ExecutionResult | Promise<ExecutionResult>,
extensionsReducer: (mergedExtensions: Record<string, any>, executionParams: ExecutionParams) => Record<string, any>
) {
return async (execs: Array<ExecutionParams>): Promise<Array<ExecutionResult>> => {
const execBatches: Array<Array<ExecutionParams>> = [];
Expand All @@ -46,7 +50,7 @@ function createLoadFn(
let containsPromises = false;
const executionResults: Array<ExecutionResult | Promise<ExecutionResult>> = [];
execBatches.forEach(execBatch => {
const mergedExecutionParams = mergeExecutionParams(execBatch);
const mergedExecutionParams = mergeExecutionParams(execBatch, extensionsReducer);
const executionResult = executor(mergedExecutionParams);

if (isPromise(executionResult)) {
Expand All @@ -72,3 +76,14 @@ function createLoadFn(
return results;
};
}

function defaultExtensionsReducer(
mergedExtensions: Record<string, any>,
executionParams: ExecutionParams
): Record<string, any> {
const newExtensions = executionParams.extensions;
if (newExtensions != null) {
Object.assign(mergedExtensions, newExtensions);
}
return mergedExtensions;
}
8 changes: 7 additions & 1 deletion packages/delegate/src/mergeExecutionParams.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,15 @@ import { ExecutionParams } from './types';
* }
* }
*/
export function mergeExecutionParams(execs: Array<ExecutionParams>): ExecutionParams {
export function mergeExecutionParams(
execs: Array<ExecutionParams>,
extensionsReducer: (mergedExtensions: Record<string, any>, executionParams: ExecutionParams) => Record<string, any>
): ExecutionParams {
const mergedVariables: Record<string, any> = Object.create(null);
const mergedVariableDefinitions: Array<VariableDefinitionNode> = [];
const mergedSelections: Array<SelectionNode> = [];
const mergedFragmentDefinitions: Array<FragmentDefinitionNode> = [];
let mergedExtensions: Record<string, any> = Object.create(null);

execs.forEach((executionParams, index) => {
const prefixedExecutionParams = prefixExecutionParams(createPrefix(index), executionParams);
Expand All @@ -73,6 +77,7 @@ export function mergeExecutionParams(execs: Array<ExecutionParams>): ExecutionPa
}
});
Object.assign(mergedVariables, prefixedExecutionParams.variables);
mergedExtensions = extensionsReducer(mergedExtensions, executionParams);
});

const mergedOperationDefinition: OperationDefinitionNode = {
Expand All @@ -91,6 +96,7 @@ export function mergeExecutionParams(execs: Array<ExecutionParams>): ExecutionPa
definitions: [mergedOperationDefinition, ...mergedFragmentDefinitions],
},
variables: mergedVariables,
extensions: mergedExtensions,
context: execs[0].context,
info: execs[0].info,
};
Expand Down
5 changes: 5 additions & 0 deletions packages/delegate/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ export interface MergedTypeInfo {
export interface ExecutionParams<TArgs = Record<string, any>, TContext = any> {
document: DocumentNode;
variables?: TArgs;
extensions?: Record<string, any>;
context?: TContext;
info?: GraphQLResolveInfo;
}
Expand Down Expand Up @@ -134,6 +135,10 @@ export interface SubschemaConfig<K = any, V = any, C = K> {
merge?: Record<string, MergedTypeConfig>;
batch?: boolean;
batchingOptions?: {
extensionsReducer?: (
mergedExtensions: Record<string, any>,
executionParams: ExecutionParams
) => Record<string, any>;
dataLoaderOptions?: DataLoader.Options<K, V, C>;
};
}
Expand Down

0 comments on commit 2a6bab9

Please sign in to comment.