Skip to content

Commit

Permalink
Cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
ardatan committed Feb 25, 2025
1 parent 2e7cd38 commit 1fffa68
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 49 deletions.
4 changes: 2 additions & 2 deletions packages/executor/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@
"@graphql-typed-document-node/core": "^3.2.0",
"@repeaterjs/repeater": "^3.0.4",
"@whatwg-node/disposablestack": "^0.0.5",
"tslib": "^2.4.0",
"value-or-promise": "^1.0.12"
"@whatwg-node/promise-helpers": "^1.0.0",
"tslib": "^2.4.0"
},
"devDependencies": {
"cross-inspect": "1.0.1",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ describe('Abort Signal', () => {
didInvokeFirstFn = true;
return true;
},
second() {
async second() {
didInvokeSecondFn = true;
controller.abort();
return true;
Expand Down
82 changes: 43 additions & 39 deletions packages/executor/src/execution/execute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ import {
TypeNameMetaFieldDef,
versionInfo,
} from 'graphql';
import { ValueOrPromise } from 'value-or-promise';
import {
collectSubFields as _collectSubfields,
addPath,
Expand Down Expand Up @@ -57,6 +56,7 @@ import {
} from '@graphql-tools/utils';
import { TypedDocumentNode } from '@graphql-typed-document-node/core';
import { DisposableSymbols } from '@whatwg-node/disposablestack';
import { handleMaybePromise } from '@whatwg-node/promise-helpers';
import { coerceError } from './coerceError.js';
import { flattenAsyncIterable } from './flattenAsyncIterable.js';
import { invariant } from './invariant.js';
Expand Down Expand Up @@ -305,36 +305,33 @@ function executeImpl<TData = any, TVariables = any, TContext = any>(
// Errors from sub-fields of a NonNull type may propagate to the top level,
// at which point we still log the error and null the parent field, which
// in this case is the entire response.
const result = new ValueOrPromise(() => executeOperation<TData, TVariables, TContext>(exeContext))
.then(
data => {
const initialResult = buildResponse(data, exeContext.errors);
if (exeContext.subsequentPayloads.size > 0) {
return {
initialResult: {
...initialResult,
hasNext: true,
},
subsequentResults: yieldSubsequentPayloads(exeContext),
};
}

return initialResult;
},
(error: any) => {
exeContext.signal?.throwIfAborted();
return handleMaybePromise(
() => executeOperation<TData, TVariables, TContext>(exeContext),
data => {
const initialResult = buildResponse(data, exeContext.errors);
if (exeContext.subsequentPayloads.size > 0) {
return {
initialResult: {
...initialResult,
hasNext: true,
},
subsequentResults: yieldSubsequentPayloads(exeContext),
};
}

if (error.errors) {
exeContext.errors.push(...error.errors);
} else {
exeContext.errors.push(error);
}
return buildResponse<TData>(null, exeContext.errors);
},
)
.resolve()!;
return initialResult;
},
(error: any) => {
exeContext.signal?.throwIfAborted();

return result;
if (error.errors) {
exeContext.errors.push(...error.errors);
} else {
exeContext.errors.push(error);
}
return buildResponse<TData>(null, exeContext.errors);
},
);
}

/**
Expand Down Expand Up @@ -575,20 +572,21 @@ function executeFieldsSerially<TData>(
const fieldPath = addPath(path, responseName, parentType.name);
exeContext.signal?.throwIfAborted();

return new ValueOrPromise(() =>
executeField(exeContext, parentType, sourceValue, fieldNodes, fieldPath),
).then(result => {
if (result === undefined) {
return results;
}
return handleMaybePromise(
() => executeField(exeContext, parentType, sourceValue, fieldNodes, fieldPath),
result => {
if (result === undefined) {
return results;
}

results[responseName] = result;
results[responseName] = result;

return results;
});
return results;
},
);
},
Object.create(null),
).resolve();
);
}

/**
Expand Down Expand Up @@ -1572,6 +1570,12 @@ export function subscribe<TData = any, TVariables = any, TContext = any>(
return mapSourceToResponse(exeContext, resultOrStream);
}

export function isIncrementalResults<TData>(
results: any,
): results is IncrementalExecutionResults<TData> {
return results?.initialResult;
}

export function flattenIncrementalResults<TData>(
incrementalResults: IncrementalExecutionResults<TData>,
): AsyncGenerator<
Expand Down
21 changes: 14 additions & 7 deletions packages/executor/src/execution/normalizedExecutor.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { getOperationAST, GraphQLSchema } from 'graphql';
import { ValueOrPromise } from 'value-or-promise';
import {
ExecutionRequest,
ExecutionResult,
Expand All @@ -8,7 +7,14 @@ import {
MaybePromise,
memoize1,
} from '@graphql-tools/utils';
import { execute, ExecutionArgs, flattenIncrementalResults, subscribe } from './execute.js';
import { handleMaybePromise } from '@whatwg-node/promise-helpers';
import {
execute,
ExecutionArgs,
flattenIncrementalResults,
isIncrementalResults,
subscribe,
} from './execute.js';

export function normalizedExecutor<TData = any, TVariables = any, TContext = any>(
args: ExecutionArgs<TData, TVariables, TContext>,
Expand All @@ -20,14 +26,15 @@ export function normalizedExecutor<TData = any, TVariables = any, TContext = any
if (operationAST.operation === 'subscription') {
return subscribe(args);
}
return new ValueOrPromise(() => execute(args))
.then((result): MaybeAsyncIterable<ExecutionResult<TData>> => {
if ('initialResult' in result) {
return handleMaybePromise(
() => execute(args),
result => {
if (isIncrementalResults(result)) {
return flattenIncrementalResults(result);
}
return result;
})
.resolve()!;
},
);
}

export const executorFromSchema = memoize1(function executorFromSchema(
Expand Down

0 comments on commit 1fffa68

Please sign in to comment.