Skip to content

Commit 229c9df

Browse files
authored
refactor(execution): introduce shared execution context (#4656)
1 parent 4f03342 commit 229c9df

File tree

5 files changed

+34
-11
lines changed

5 files changed

+34
-11
lines changed

src/execution/Executor.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ import {
5555
collectSubfields as _collectSubfields,
5656
} from './collectFields.js';
5757
import { collectIteratorPromises } from './collectIteratorPromises.js';
58+
import type { SharedExecutionContext } from './createSharedExecutionContext.js';
59+
import { createSharedExecutionContext } from './createSharedExecutionContext.js';
5860
import { buildResolveInfo } from './execute.js';
5961
import type { StreamUsage } from './getStreamUsage.js';
6062
import { getStreamUsage as _getStreamUsage } from './getStreamUsage.js';
@@ -224,26 +226,31 @@ export class Executor<
224226
validatedExecutionArgs: ValidatedExecutionArgs;
225227
aborted: boolean;
226228
abortReason: unknown;
229+
sharedExecutionContext: SharedExecutionContext;
227230
collectedErrors: CollectedErrors;
228231
abortResultPromise: ((reason?: unknown) => void) | undefined;
229232
resolverAbortController: AbortController | undefined;
230-
sharedResolverAbortSignal: AbortSignal;
233+
getAbortSignal: () => AbortSignal | undefined;
231234

232235
constructor(
233236
validatedExecutionArgs: ValidatedExecutionArgs,
234-
sharedResolverAbortSignal?: AbortSignal,
237+
sharedExecutionContext?: SharedExecutionContext,
235238
) {
236239
this.validatedExecutionArgs = validatedExecutionArgs;
237240
this.aborted = false;
238241
this.abortReason = new Error('This operation was aborted');
239242
this.collectedErrors = new CollectedErrors();
240243

241-
if (sharedResolverAbortSignal === undefined) {
244+
if (sharedExecutionContext === undefined) {
242245
this.resolverAbortController = new AbortController();
243-
this.sharedResolverAbortSignal = this.resolverAbortController.signal;
246+
this.sharedExecutionContext = createSharedExecutionContext(
247+
this.resolverAbortController.signal,
248+
);
244249
} else {
245-
this.sharedResolverAbortSignal = sharedResolverAbortSignal;
250+
this.sharedExecutionContext = sharedExecutionContext;
246251
}
252+
const { getAbortSignal } = this.sharedExecutionContext;
253+
this.getAbortSignal = getAbortSignal;
247254
}
248255

249256
executeQueryOrMutationOrSubscriptionEvent(): PromiseOrValue<
@@ -553,7 +560,7 @@ export class Executor<
553560
toNodes(fieldDetailsList),
554561
parentType,
555562
path,
556-
() => this.sharedResolverAbortSignal,
563+
this.getAbortSignal,
557564
);
558565

559566
// Get the resolve function, regardless of if its result is normal or abrupt (error).
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/** @internal */
2+
export interface SharedExecutionContext {
3+
getAbortSignal: () => AbortSignal | undefined;
4+
}
5+
6+
export function createSharedExecutionContext(
7+
abortSignal: AbortSignal | undefined,
8+
): SharedExecutionContext {
9+
return {
10+
getAbortSignal: () => abortSignal,
11+
};
12+
}

src/execution/execute.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import type { GraphQLSchema } from '../type/schema.js';
3434
import { cancellablePromise } from './cancellablePromise.js';
3535
import type { FieldDetailsList, FragmentDetails } from './collectFields.js';
3636
import { collectFields } from './collectFields.js';
37+
import { createSharedExecutionContext } from './createSharedExecutionContext.js';
3738
import type { ExecutionResult, ValidatedExecutionArgs } from './Executor.js';
3839
import { Executor } from './Executor.js';
3940
import { ExecutorThrowingOnIncremental } from './ExecutorThrowingOnIncremental.js';
@@ -598,14 +599,16 @@ function executeSubscription(
598599
);
599600
}
600601

602+
const sharedExecutionContext =
603+
createSharedExecutionContext(externalAbortSignal);
601604
const path = addPath(undefined, responseName, rootType.name);
602605
const info = buildResolveInfo(
603606
validatedExecutionArgs,
604607
fieldDef,
605608
fieldNodes,
606609
rootType,
607610
path,
608-
() => externalAbortSignal,
611+
sharedExecutionContext.getAbortSignal,
609612
);
610613

611614
try {

src/execution/incremental/IncrementalExecutor.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import type {
3030
} from '../collectFields.js';
3131
import { collectSubfields as _collectSubfields } from '../collectFields.js';
3232
import { collectIteratorPromises } from '../collectIteratorPromises.js';
33+
import type { SharedExecutionContext } from '../createSharedExecutionContext.js';
3334
import type {
3435
ExecutionResult,
3536
FormattedExecutionResult,
@@ -299,10 +300,10 @@ export class IncrementalExecutor<
299300

300301
constructor(
301302
validatedExecutionArgs: ValidatedExecutionArgs,
302-
sharedResolverAbortSignal?: AbortSignal,
303+
sharedExecutionContext?: SharedExecutionContext,
303304
deferUsageSet?: DeferUsageSet,
304305
) {
305-
super(validatedExecutionArgs, sharedResolverAbortSignal);
306+
super(validatedExecutionArgs, sharedExecutionContext);
306307
this.deferUsageSet = deferUsageSet;
307308
this.groups = [];
308309
this.tasks = [];
@@ -314,7 +315,7 @@ export class IncrementalExecutor<
314315
): IncrementalExecutor<TExperimental> {
315316
return new IncrementalExecutor(
316317
this.validatedExecutionArgs,
317-
this.sharedResolverAbortSignal,
318+
this.sharedExecutionContext,
318319
deferUsageSet,
319320
);
320321
}

src/execution/legacyIncremental/BranchingIncrementalExecutor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ export class BranchingIncrementalExecutor extends IncrementalExecutor<LegacyExpe
179179
): IncrementalExecutor<LegacyExperimentalIncrementalExecutionResults> {
180180
return new BranchingIncrementalExecutor(
181181
this.validatedExecutionArgs,
182-
this.sharedResolverAbortSignal,
182+
this.sharedExecutionContext,
183183
deferUsageSet,
184184
);
185185
}

0 commit comments

Comments
 (0)