Skip to content

Commit

Permalink
changes from review
Browse files Browse the repository at this point in the history
  • Loading branch information
yaacovCR committed Jul 2, 2024
1 parent f3fd2bc commit 1ce4b1e
Show file tree
Hide file tree
Showing 10 changed files with 32 additions and 54 deletions.
4 changes: 2 additions & 2 deletions packages/delegate/src/defaultMergedResolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import {
responsePathAsArray,
SelectionSetNode,
} from 'graphql';
import { getResponseKeyFromInfo, isPromise } from '@graphql-tools/utils';
import { createDeferred, DelegationPlanLeftOver, getPlanLeftOverFromParent } from './leftOver.js';
import { createDeferred, getResponseKeyFromInfo, isPromise } from '@graphql-tools/utils';
import { DelegationPlanLeftOver, getPlanLeftOverFromParent } from './leftOver.js';
import {
getSubschema,
getUnpathedErrors,
Expand Down
17 changes: 1 addition & 16 deletions packages/delegate/src/leftOver.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,8 @@
import { FieldNode } from 'graphql';
import { Deferred } from '@graphql-tools/utils';
import { Subschema } from './Subschema.js';
import { DelegationPlanBuilder, ExternalObject } from './types.js';

export type Deferred<T = unknown> = PromiseWithResolvers<T>;

// TODO: Remove this after Node 22
export function createDeferred<T>(): Deferred<T> {
if (Promise.withResolvers) {
return Promise.withResolvers();
}
let resolve: (value: T | PromiseLike<T>) => void;
let reject: (error: unknown) => void;
const promise = new Promise<T>((_resolve, _reject) => {
resolve = _resolve;
reject = _reject;
});
return { promise, resolve: resolve!, reject: reject! };
}

export interface DelegationPlanLeftOver {
unproxiableFieldNodes: Array<FieldNode>;
nonProxiableSubschemas: Array<Subschema>;
Expand Down
5 changes: 2 additions & 3 deletions packages/executor/src/execution/IncrementalGraph.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import type { GraphQLError } from 'graphql';
import { isPromise } from '@graphql-tools/utils';
import { createDeferred, isPromise } from '@graphql-tools/utils';
import { BoxedPromiseOrValue } from './BoxedPromiseOrValue.js';
import { invariant } from './invariant.js';
import { promiseWithResolvers } from './promiseWithResolvers.js';
import type {
DeferredFragmentRecord,
DeferredGroupedFieldSetRecord,
Expand Down Expand Up @@ -75,7 +74,7 @@ export class IncrementalGraph {
});
}
const { promise, resolve } =
promiseWithResolvers<IteratorResult<Iterable<IncrementalDataRecordResult>>>();
createDeferred<IteratorResult<Iterable<IncrementalDataRecordResult>>>();
this._nextQueue.push(resolve);
return promise;
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { parse } from 'graphql';
import { createDeferred } from '@graphql-tools/delegate';
import { makeExecutableSchema } from '@graphql-tools/schema';
import { isAsyncIterable } from '@graphql-tools/utils';
import { createDeferred, isAsyncIterable } from '@graphql-tools/utils';
import { Repeater } from '@repeaterjs/repeater';
import { assertAsyncIterable } from '../../../../loaders/url/tests/test-utils';
import { normalizedExecutor } from '../normalizedExecutor';
Expand Down Expand Up @@ -456,7 +455,7 @@ describe('Abort Signal', () => {
expect(bResolverGotInvoked).toBe(false);
});
it('stops pending stream execution for never-returning incremental delivery (@defer)', async () => {
const aResolverGotInvokedD = createDeferred();
const aResolverGotInvokedD = createDeferred<void>();
const requestGotCancelledD = createDeferred();
let bResolverGotInvoked = false;

Expand Down
4 changes: 2 additions & 2 deletions packages/executor/src/execution/__tests__/defer-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ import {
GraphQLString,
parse,
} from 'graphql';
import { createDeferred } from '@graphql-tools/utils';
import { expectJSON } from '../../__testUtils__/expectJSON.js';
import { resolveOnNextTick } from '../../__testUtils__/resolveOnNextTick.js';
import { execute } from '../execute.js';
import { promiseWithResolvers } from '../promiseWithResolvers.js';
import type {
InitialIncrementalExecutionResult,
SubsequentIncrementalExecutionResult,
Expand Down Expand Up @@ -875,7 +875,7 @@ describe('Execute: defer directive', () => {
}
`);

const { promise: slowFieldPromise, resolve: resolveSlowField } = promiseWithResolvers();
const { promise: slowFieldPromise, resolve: resolveSlowField } = createDeferred();
let cResolverCalled = false;
let eResolverCalled = false;
const executeResult = execute({
Expand Down
13 changes: 6 additions & 7 deletions packages/executor/src/execution/__tests__/stream-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,10 @@ import {
GraphQLString,
parse,
} from 'graphql';
import { MaybePromise } from '@graphql-tools/utils';
import { createDeferred, MaybePromise } from '@graphql-tools/utils';
import { expectJSON } from '../../__testUtils__/expectJSON.js';
import { resolveOnNextTick } from '../../__testUtils__/resolveOnNextTick.js';
import { execute } from '../execute.js';
import { promiseWithResolvers } from '../promiseWithResolvers.js';
import type {
InitialIncrementalExecutionResult,
SubsequentIncrementalExecutionResult,
Expand Down Expand Up @@ -1974,7 +1973,7 @@ describe('Execute: stream directive', () => {
]);
});
it('Returns payloads in correct order when parent deferred fragment resolves slower than stream', async () => {
const { promise: slowFieldPromise, resolve: resolveSlowField } = promiseWithResolvers();
const { promise: slowFieldPromise, resolve: resolveSlowField } = createDeferred();
const document = parse(/* GraphQL */ `
query {
nestedObject {
Expand Down Expand Up @@ -2077,9 +2076,9 @@ describe('Execute: stream directive', () => {
});
});
it('Can @defer fields that are resolved after async iterable is complete', async () => {
const { promise: slowFieldPromise, resolve: resolveSlowField } = promiseWithResolvers();
const { promise: slowFieldPromise, resolve: resolveSlowField } = createDeferred();
const { promise: iterableCompletionPromise, resolve: resolveIterableCompletion } =
promiseWithResolvers();
createDeferred();

const document = parse(/* GraphQL */ `
query {
Expand Down Expand Up @@ -2187,9 +2186,9 @@ describe('Execute: stream directive', () => {
});
});
it('Can @defer fields that are resolved before async iterable is complete', async () => {
const { promise: slowFieldPromise, resolve: resolveSlowField } = promiseWithResolvers();
const { promise: slowFieldPromise, resolve: resolveSlowField } = createDeferred();
const { promise: iterableCompletionPromise, resolve: resolveIterableCompletion } =
promiseWithResolvers();
createDeferred();

const document = parse(/* GraphQL */ `
query {
Expand Down
20 changes: 0 additions & 20 deletions packages/executor/src/execution/promiseWithResolvers.ts

This file was deleted.

1 change: 0 additions & 1 deletion packages/federation/test/defer.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { exec } from 'child_process';
import { inspect } from 'util';
import { GraphQLSchema, parse, print } from 'graphql';
import _ from 'lodash';
Expand Down
16 changes: 16 additions & 0 deletions packages/utils/src/createDeferred.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// TODO: Remove this after Node 22

export type Deferred<T = unknown> = PromiseWithResolvers<T>;

export function createDeferred<T>(): Deferred<T> {
if (Promise.withResolvers) {
return Promise.withResolvers();
}
let resolve: (value: T | PromiseLike<T>) => void;
let reject: (error: unknown) => void;
const promise = new Promise<T>((_resolve, _reject) => {
resolve = _resolve;
reject = _reject;
});
return { promise, resolve: resolve!, reject: reject! };
}
1 change: 1 addition & 0 deletions packages/utils/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,4 @@ export * from './jsutils.js';
export * from './directives.js';
export * from './mergeIncrementalResult.js';
export * from './debugTimer.js';
export * from './createDeferred.js';

0 comments on commit 1ce4b1e

Please sign in to comment.