Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Add support for newer incremental delivery format #8148

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

Open
jerelmiller wants to merge 92 commits into main
base: main
Choose a base branch
Loading
from jerel/newer-incremental-spec

Conversation

Copy link
Member

@jerelmiller jerelmiller commented Sep 25, 2025
edited
Loading

Closes #7932

Adds support for the graphql@17.0.0-alpha.9 @defer and @stream incremental delivery protocol.

When graphql@17.0.0-alpha.9 is installed, clients must send the Accept header with a value of multipart/mixed; incrementalDeliverySpec=graphql/incremental/v0.1 to specify the new format. If the Accept header is not compatible with the installed version of graphql (such as sending deferSpec=20220824 when ``17.0.0-alpha.9` is installed), an error is returned to the client.

Copy link

apollo-librarian bot commented Sep 25, 2025
edited
Loading

✅ Docs preview ready

The preview is ready to be viewed. View the preview

File Changes

0 new, 1 changed, 0 removed
* (developer-tools)/apollo-server/(latest)/workflow/requests.md

Build ID: afe05c62ab65b9d1a52c8666
Build Logs: View logs

URL: https://www.apollographql.com/docs/deploy-preview/afe05c62ab65b9d1a52c8666

Copy link

codesandbox-ci bot commented Sep 25, 2025
edited
Loading

This pull request is automatically built and testable in CodeSandbox.

To see build info of the built libraries, click here or the icon next to each commit SHA.

@jerelmiller jerelmiller marked this pull request as ready for review September 29, 2025 20:22
Copy link
Member Author

Ok I think I have this implemented working as I had hoped. 5.1 will now require 17.0.0-alpha.9 and will be able to support the legacy format if the @yaacovcr/transform package is installed. This allows Apollo Server to simultaneously support both the old and new formats (which means clients can switch over whenever).

The only unanswered questions remaining before I think this is 100% ready:

MULTIPART_MIXED_EXPERIMENTAL_ALPHA_2: 'multipart/mixed; deferSpec=20220824',
// spec version represents the commit hash of 17.0.0-alpha.9
MULTIPART_MIXED_EXPERIMENTAL_ALPHA_9:
'multipart/mixed; incrementalDeliverySpec=3283f8a',
Copy link
Member

@glasser glasser Oct 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I lean towards @BoD 's preference from last week of just using deferSpec with a date again. While it might not have been the best design in the first place, it does kinda feel like using the same mechanism twice for the same exact thing ("representing an unreleased incremental delivery format") would be better than changing it? (And then once it's fully standardized, we can drop it.)

},
"peerDependencies": {
"graphql": "^16.11.0"
"graphql": "^16.11.0 || 17.0.0-alpha.9",
Copy link
Member

@glasser glasser Oct 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As discussed on Slack, I am somewhat paranoid that this may lead in some cases to npm i @apollo/server installing graphql@17.0.0-alpha.9 by default (because it's the dependency of @yaacovr/transform. I still lean towards us just saying that to support this experimental feature you need to do a manual npm i --legacy-peer-deps. (What exactly does declaring an optional peer dep win us anyway — enforcement of its version constraint?)

jerelmiller reacted with thumbs up emoji
Copy link
Member Author

@jerelmiller jerelmiller Oct 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What exactly does declaring an optional peer dep win us anyway — enforcement of its version constraint?

I think precisely that. Though its a very niche tool so maybe there are more downsides to declaring it as a peer dependency vs not.

Copy link
Member Author

@jerelmiller jerelmiller Oct 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in bd5cd63

'@apollo/server': minor
---

Apollo Server now supports the modern incremental delivery protocol (`@defer` and `@stream`) that ships with `graphql@17.0.0-alpha.9`. To use the modern protocol, clients must send the `Accept` header with a value of `multipart/mixed; incrementalDeliverySpec=3283f8a`.
Copy link
Member

@glasser glasser Oct 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if "modern" is an overly optimistic term to use throughout this PR. If we come up with a third protocol later, it won't age well. Would "current" work better than "modern"?

Copy link
Member Author

@jerelmiller jerelmiller Oct 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is why I hate naming 😂. I just picked something to differentiate from it and the legacy version. I didn't really find a good name for the "now" version, but I'd be ok with "current" 🙂

Copy link
Member Author

@jerelmiller jerelmiller Oct 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in 3c0a88e

Copy link
Member

@glasser glasser Oct 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the term is also used in errors?

Copy link
Member Author

@jerelmiller jerelmiller Oct 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops, you're right! Updated in 5d15554

Copy link
Member

@glasser glasser left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you've addressed all my concerns from last time.

I'm not really sure what the v0.1 refers to but it's as good as anything else. Have you tested what happens when both deferSpec and incrementalDeliverySpec are sent? Would be good to make that well-defined, but not necessary.

This isn't a regression, but it might be nice to be explicit somewhere that --legacy-peer-deps is required for installing the alpha and transform.

Copy link
Member Author

jerelmiller commented Oct 14, 2025
edited
Loading

🙌

I'm not really sure what the v0.1 refers to but it's as good as anything else.

We're going to document the spec as it exists today in specs.apollo.dev. @calvincestari has a PR up right now to add this: apollographql/specs#67

That v0.1 refers to the version in that PR. We figure this is a good way to reference the spec as implemented in that version. If new ones come along, we can add v0.2, 0.3, etc for as long as we need until the spec is stable. But we plan to have those versions documented to capture the spec as it exists at the time we add support for the version.

Have you tested what happens when both deferSpec and incrementalDeliverySpec are sent?

Actually no! I'll try this out. I believe it will return the newer version of the spec (since it uses Negotiator and prefers that version), but wouldn't hurt to add an explicit test.

This isn't a regression, but it might be nice to be explicit somewhere that --legacy-peer-deps is required for installing the alpha and transform.

Good call. I'll see if I can update the docs page and include that.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@glasser glasser glasser approved these changes

@martinbonnin martinbonnin Awaiting requested review from martinbonnin

@BoD BoD Awaiting requested review from BoD

@phryneas phryneas Awaiting requested review from phryneas

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Support June 2023 incremental delivery spec

AltStyle によって変換されたページ (->オリジナル) /