Skip to content

fix: handle rejected streamed data race condition#16268

Merged
Rich-Harris merged 1 commit into
sveltejs:version-3from
scarab-systems:fix-streamed-data-rejection
Jul 14, 2026
Merged

fix: handle rejected streamed data race condition#16268
Rich-Harris merged 1 commit into
sveltejs:version-3from
scarab-systems:fix-streamed-data-rejection

Conversation

@scarab-systems

@scarab-systems scarab-systems commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Related to #9785, but this PR targets a distinct streamed-data rejection race condition demonstrated by the added regression test.

Summary

Thanks for SvelteKit. I really appreciate the care that goes into this project.

This PR fixes a timing issue in streamed server data handling. Previously, the JSON data response waited for all server load promises to settle before serializing any node. If one load returned a rejected streamed promise while another load was still pending, the rejection could occur before SvelteKit had attached the stream rejection handler.

The change creates the JSON data serializer earlier and adds each node as its load result resolves, while still waiting for all nodes before emitting the final data response. That preserves the response shape/order but attaches stream handlers earlier.

I also added a regression route/test where one server load delays serialization and another returns a rejected streamed promise.

Validation

Passed:

  • pnpm exec prettier --check ... on touched files
  • pnpm --dir packages/kit check
  • pnpm --dir packages/kit/test/apps/basics check
  • pnpm run lint
  • pnpm run check
  • Focused Playwright regression in dev mode
  • Focused Playwright regression in build/preview mode

I also ran pnpm test:kit locally with reduced workers/retries. The new regression passed inside that run, but the full command failed on an existing unrelated no-SSR dev test (SPA mode / no SSR › cannot use browser-only global on page because of ssr config in +page.js). I did not change that area.

Disclosure: I used AI-assisted coding tools while preparing this PR. I reviewed the changes myself, tested them, and take responsibility for the implementation and any follow-up revisions needed.

@pkg-svelte-dev

pkg-svelte-dev Bot commented Jul 7, 2026

Copy link
Copy Markdown

Install the latest version of @sveltejs/kit from 456e378:

pnpm add https://pkg.svelte.dev/@sveltejs/kit/c/456e37877955e14003d12a30473b398375c67a98

Open in pkg.svelte.dev: https://pkg.svelte.dev/repos/kit/pr/16268

Note

This PR is from a fork. A maintainer must approve approve each commit before it can be built and installed.

@changeset-bot

changeset-bot Bot commented Jul 7, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 456e378

The changes in this PR will be included in the next version bump.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@teemingc

Copy link
Copy Markdown
Member

See #9785 (comment)

@teemingc teemingc closed this Jul 14, 2026
@teemingc

Copy link
Copy Markdown
Member

Actually, this PR targets a different problem than the aforementioned issue (at least the failing test is failing)

@teemingc teemingc reopened this Jul 14, 2026
@teemingc teemingc changed the title Fix rejected streamed data after delayed loads fix: handle rejected streamed data race condition Jul 14, 2026
@scarab-systems

Copy link
Copy Markdown
Contributor Author

Thanks for taking another look, and for reopening/renaming this.

I updated the PR description so it no longer says Fixes #9785. It now frames this as related to #9785, but targeting the distinct streamed-data rejection race demonstrated by the regression test.

Happy to adjust the scope or wording further if you would prefer a different framing.

@teemingc

Copy link
Copy Markdown
Member

Do you mind rebasing this on the version-3 branch? We're not actively developing against the main branch currently.

@scarab-systems
scarab-systems force-pushed the fix-streamed-data-rejection branch from 83f2ce2 to 456e378 Compare July 14, 2026 14:48
@scarab-systems
scarab-systems changed the base branch from main to version-3 July 14, 2026 14:48
@scarab-systems

Copy link
Copy Markdown
Contributor Author

Thanks — rebased onto version-3 and updated the PR base.

I resolved the rebase conflict by keeping the current version-3 data-response error/redirect status behavior while preserving the earlier streamed-data serializer attachment from this PR.

Local validation after the rebase:

  • pnpm install --frozen-lockfile
  • pnpm exec prettier --check ... on touched files
  • pnpm --dir packages/kit check
  • pnpm --dir packages/kit/test/apps/basics check
  • Focused regression in dev mode
  • Focused regression in build/preview mode
  • pnpm run lint
  • pnpm run check
  • pnpm exec changeset status --since upstream/version-3 shows @sveltejs/kit patch

CI is rerunning on the rebased branch now.

@Rich-Harris Rich-Harris left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

thank you!

@Rich-Harris
Rich-Harris merged commit 9f3d9bb into sveltejs:version-3 Jul 14, 2026
18 of 19 checks passed
@scarab-systems
scarab-systems deleted the fix-streamed-data-rejection branch July 14, 2026 19:30
@scarab-systems

Copy link
Copy Markdown
Contributor Author

thank you!

You’re very welcome, and thank you for the review and merge. We’re big fans of SvelteKit and were happy to help.

Rich-Harris pushed a commit that referenced this pull request Jul 17, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to version-3, this PR
will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`version-3` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `version-3`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @sveltejs/[email protected]

### Major Changes

- breaking: `handle`'s `resolve` is now typed to always return a
`Promise` ([#16352](#16352))

- breaking: replace the `$lib` alias with `#lib` and remove `files.lib`
config. ([#16360](#16360))

- breaking: disallow cross-origin form submissions without a
`Content-Type` header
([#16347](#16347))

- breaking: Server-only directories (`/server/` in the path) are now
treated as server-only everywhere inside the project (except
`src/routes` and the assets directory)
([#16360](#16360))

- breaking: delegate CORS handling to Vite for static directory requests
during development
([#16357](#16357))

### Minor Changes

- feat: reinstate `$env/static/private`, `$env/dynamic/private`,
`$env/static/public`, `$env/dynamic/public` and `$app/environment` as
deprecated aliases for `$app/env/private` `$app/env/public` and
`$app/env` ([#16334](#16334))

### Patch Changes

- perf: cache the default cookie header parse and avoid allocations in
`cookies.get` ([#16341](#16341))

- fix: avoid client-side code being bundled by Cloudflare Wrangler
([#16364](#16364))

- fix: handle rejected streamed server data after delayed loads
([#16268](#16268))

- fix: enable CSRF protection in builds with a non-production `NODE_ENV`
value ([#16313](#16313))
## @sveltejs/[email protected]

### Minor Changes

- feat: transform import aliases into relative imports in files
([#16360](#16360))
## @sveltejs/[email protected]

### Patch Changes

- fix: correctly bundle entrypoints on Windows
([#16367](#16367))
- Updated dependencies
[[`c1ee782`](c1ee782),
[`1a1b3ea`](1a1b3ea),
[`6423d98`](6423d98),
[`6d1f4f0`](6d1f4f0),
[`5ca9906`](5ca9906),
[`b148d31`](b148d31),
[`5ca9906`](5ca9906),
[`9f3d9bb`](9f3d9bb),
[`7bfd922`](7bfd922),
[`ffa0e3b`](ffa0e3b)]:
  - @sveltejs/[email protected]
## @sveltejs/[email protected]

### Patch Changes

- chore: replace the `$lib` alias with `#lib` in docs
([#16360](#16360))

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
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