Skip to content

Test demonstrating a bug in flattenAsyncIterable #3709

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Conversation

glasser
Copy link
Contributor

@glasser glasser commented Aug 18, 2022

If next() is called in parallel, you can have multiple next()s both
waiting on a higher-level iterator, and the second one will move on to
the next sub-iterator rather than diving in to the iterator returned by
the first one.

lilianammmatos and others added 9 commits August 15, 2022 17:33
# Conflicts:
#	src/execution/execute.ts
#	src/validation/index.d.ts
#	src/validation/index.ts
* fix(race): concurrent next calls

* refactor test

* use invariant

* disable eslint error

* fix
If next() is called in parallel, you can have multiple next()s both
waiting on a higher-level iterator, and the second one will move on to
the next sub-iterator rather than diving in to the iterator returned by
the first one.
@github-actions
Copy link

Hi @glasser, I'm @github-actions bot happy to help you with this PR 👋

Supported commands

Please post this commands in separate comments and only one per comment:

  • @github-actions run-benchmark - Run benchmark comparing base and merge commits for this PR
  • @github-actions publish-pr-on-npm - Build package from this PR and publish it on NPM

glasser added a commit to glasser/graphql-js that referenced this pull request Aug 19, 2022
Use distinct types for "the only result of a single-payload execution",
"the first payload of a multi-payload execution", and "subsequent
payloads of a multi-payload execution", since the data structures are
different.

Wrap the first payload and the subsequent payloads in an
`AsyncExecutionResultStream`. You can now differentiate this from the
single-result case by checking `'initialResult' in result` rather than
`isAsyncIterable`; TS inference works better this way.

flattenAsyncIterable now works on iterables of precisely one nesting
level, and it fixes graphql#3709.
glasser added a commit to glasser/graphql-js that referenced this pull request Aug 19, 2022
Use distinct types for "the only result of a single-payload execution",
"the first payload of a multi-payload execution", and "subsequent
payloads of a multi-payload execution", since the data structures are
different.

Wrap the first payload and the subsequent payloads in an
`AsyncExecutionResultStream`. You can now differentiate this from the
single-result case by checking `'initialResult' in result` rather than
`isAsyncIterable`; TS inference works better this way.

flattenAsyncIterable now works on iterables of precisely one nesting
level, and it fixes graphql#3709.
glasser added a commit to glasser/graphql-js that referenced this pull request Aug 19, 2022
Use distinct types for "the only result of a single-payload execution",
"the first payload of a multi-payload execution", and "subsequent
payloads of a multi-payload execution", since the data structures are
different.

Wrap the first payload and the subsequent payloads in an
`AsyncExecutionResultStream`. You can now differentiate this from the
single-result case by checking `'initialResult' in result` rather than
`isAsyncIterable`; TS inference works better this way.

flattenAsyncIterable now works on iterables of precisely one nesting
level, and it fixes graphql#3709.
glasser added a commit to glasser/graphql-js that referenced this pull request Aug 19, 2022
Use distinct types for "the only result of a single-payload execution",
"the first payload of a multi-payload execution", and "subsequent
payloads of a multi-payload execution", since the data structures are
different.

Wrap the first payload and the subsequent payloads in an
`AsyncExecutionResultStream`. You can now differentiate this from the
single-result case by checking `'initialResult' in result` rather than
`isAsyncIterable`; TS inference works better this way.

flattenAsyncIterable now works on iterables of precisely one nesting
level, and it fixes graphql#3709.
glasser added a commit to glasser/graphql-js that referenced this pull request Aug 19, 2022
Fixes the bug demonstrated in graphql#3709 (which has already been incorporated
into the defer-stream branch).

This fix is extracted from graphql#3703, which also updates the typing and API
around execute. This particular change doesn't affect the API (other
than making the `subscribe` return type more honest, as its returned
generator could yield AsyncExecutionResult before this change as well).
glasser added a commit to glasser/graphql-js that referenced this pull request Aug 19, 2022
Fixes the bug demonstrated in graphql#3709 (which has already been incorporated
into the defer-stream branch).

This fix is extracted from graphql#3703, which also updates the typing and API
around execute.

This particular change doesn't affect the API, other than making the
`subscribe` return type more honest, as its returned generator could
yield AsyncExecutionResult before this change as well. (The reason the
previous version built is because every ExecutionResult is actually an
AsyncExecutionResult; fixing that fact is part of what graphql#3703 does.)
@glasser
Copy link
Contributor Author

glasser commented Aug 19, 2022

This test has already been incorporated into #3659 and the fix is now in #3710.

@glasser glasser closed this Aug 19, 2022
glasser added a commit to glasser/graphql-js that referenced this pull request Aug 19, 2022
Fixes the bug demonstrated in graphql#3709 (which has already been incorporated
into the defer-stream branch).

This fix is extracted from graphql#3703, which also updates the typing and API
around execute.

This particular change doesn't affect the API, other than making the
`subscribe` return type more honest, as its returned generator could
yield AsyncExecutionResult before this change as well. (The reason the
previous version built is because every ExecutionResult is actually an
AsyncExecutionResult; fixing that fact is part of what graphql#3703 does.)
robrichard pushed a commit that referenced this pull request Aug 20, 2022
Fixes the bug demonstrated in #3709 (which has already been incorporated
into the defer-stream branch).

This fix is extracted from #3703, which also updates the typing and API
around execute.

This particular change doesn't affect the API, other than making the
`subscribe` return type more honest, as its returned generator could
yield AsyncExecutionResult before this change as well. (The reason the
previous version built is because every ExecutionResult is actually an
AsyncExecutionResult; fixing that fact is part of what #3703 does.)
robrichard pushed a commit that referenced this pull request Aug 23, 2022
Fixes the bug demonstrated in #3709 (which has already been incorporated
into the defer-stream branch).

This fix is extracted from #3703, which also updates the typing and API
around execute.

This particular change doesn't affect the API, other than making the
`subscribe` return type more honest, as its returned generator could
yield AsyncExecutionResult before this change as well. (The reason the
previous version built is because every ExecutionResult is actually an
AsyncExecutionResult; fixing that fact is part of what #3703 does.)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants