Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 13 additions & 6 deletions src/execution/Executor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ import {
collectSubfields as _collectSubfields,
} from './collectFields.js';
import { collectIteratorPromises } from './collectIteratorPromises.js';
import type { SharedExecutionContext } from './createSharedExecutionContext.js';
import { createSharedExecutionContext } from './createSharedExecutionContext.js';
import { buildResolveInfo } from './execute.js';
import type { StreamUsage } from './getStreamUsage.js';
import { getStreamUsage as _getStreamUsage } from './getStreamUsage.js';
Expand Down Expand Up @@ -224,26 +226,31 @@ export class Executor<
validatedExecutionArgs: ValidatedExecutionArgs;
aborted: boolean;
abortReason: unknown;
sharedExecutionContext: SharedExecutionContext;
collectedErrors: CollectedErrors;
abortResultPromise: ((reason?: unknown) => void) | undefined;
resolverAbortController: AbortController | undefined;
sharedResolverAbortSignal: AbortSignal;
getAbortSignal: () => AbortSignal | undefined;

constructor(
validatedExecutionArgs: ValidatedExecutionArgs,
sharedResolverAbortSignal?: AbortSignal,
sharedExecutionContext?: SharedExecutionContext,
) {
this.validatedExecutionArgs = validatedExecutionArgs;
this.aborted = false;
this.abortReason = new Error('This operation was aborted');
this.collectedErrors = new CollectedErrors();

if (sharedResolverAbortSignal === undefined) {
if (sharedExecutionContext === undefined) {
this.resolverAbortController = new AbortController();
this.sharedResolverAbortSignal = this.resolverAbortController.signal;
this.sharedExecutionContext = createSharedExecutionContext(
this.resolverAbortController.signal,
);
} else {
this.sharedResolverAbortSignal = sharedResolverAbortSignal;
this.sharedExecutionContext = sharedExecutionContext;
}
const { getAbortSignal } = this.sharedExecutionContext;
this.getAbortSignal = getAbortSignal;
}

executeQueryOrMutationOrSubscriptionEvent(): PromiseOrValue<
Expand Down Expand Up @@ -553,7 +560,7 @@ export class Executor<
toNodes(fieldDetailsList),
parentType,
path,
() => this.sharedResolverAbortSignal,
this.getAbortSignal,
);

// Get the resolve function, regardless of if its result is normal or abrupt (error).
Expand Down
12 changes: 12 additions & 0 deletions src/execution/createSharedExecutionContext.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/** @internal */
export interface SharedExecutionContext {
getAbortSignal: () => AbortSignal | undefined;
}

export function createSharedExecutionContext(
abortSignal: AbortSignal | undefined,
): SharedExecutionContext {
return {
getAbortSignal: () => abortSignal,
};
}
5 changes: 4 additions & 1 deletion src/execution/execute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import type { GraphQLSchema } from '../type/schema.js';
import { cancellablePromise } from './cancellablePromise.js';
import type { FieldDetailsList, FragmentDetails } from './collectFields.js';
import { collectFields } from './collectFields.js';
import { createSharedExecutionContext } from './createSharedExecutionContext.js';
import type { ExecutionResult, ValidatedExecutionArgs } from './Executor.js';
import { Executor } from './Executor.js';
import { ExecutorThrowingOnIncremental } from './ExecutorThrowingOnIncremental.js';
Expand Down Expand Up @@ -598,14 +599,16 @@ function executeSubscription(
);
}

const sharedExecutionContext =
createSharedExecutionContext(externalAbortSignal);
const path = addPath(undefined, responseName, rootType.name);
const info = buildResolveInfo(
validatedExecutionArgs,
fieldDef,
fieldNodes,
rootType,
path,
() => externalAbortSignal,
sharedExecutionContext.getAbortSignal,
);

try {
Expand Down
7 changes: 4 additions & 3 deletions src/execution/incremental/IncrementalExecutor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import type {
} from '../collectFields.js';
import { collectSubfields as _collectSubfields } from '../collectFields.js';
import { collectIteratorPromises } from '../collectIteratorPromises.js';
import type { SharedExecutionContext } from '../createSharedExecutionContext.js';
import type {
ExecutionResult,
FormattedExecutionResult,
Expand Down Expand Up @@ -299,10 +300,10 @@ export class IncrementalExecutor<

constructor(
validatedExecutionArgs: ValidatedExecutionArgs,
sharedResolverAbortSignal?: AbortSignal,
sharedExecutionContext?: SharedExecutionContext,
deferUsageSet?: DeferUsageSet,
) {
super(validatedExecutionArgs, sharedResolverAbortSignal);
super(validatedExecutionArgs, sharedExecutionContext);
this.deferUsageSet = deferUsageSet;
this.groups = [];
this.tasks = [];
Expand All @@ -314,7 +315,7 @@ export class IncrementalExecutor<
): IncrementalExecutor<TExperimental> {
return new IncrementalExecutor(
this.validatedExecutionArgs,
this.sharedResolverAbortSignal,
this.sharedExecutionContext,
deferUsageSet,
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ export class BranchingIncrementalExecutor extends IncrementalExecutor<LegacyExpe
): IncrementalExecutor<LegacyExperimentalIncrementalExecutionResults> {
return new BranchingIncrementalExecutor(
this.validatedExecutionArgs,
this.sharedResolverAbortSignal,
this.sharedExecutionContext,
deferUsageSet,
);
}
Expand Down
Loading