Skip to content

[19.0.x][FlightReply] Don't drop FormData entries in decodeReplyFromBusboy#36568

Merged
eps1lon merged 1 commit into
facebook:releases/19.0.xfrom
eps1lon:sebbie/fd-bb-regression/19.0.x
May 29, 2026
Merged

[19.0.x][FlightReply] Don't drop FormData entries in decodeReplyFromBusboy#36568
eps1lon merged 1 commit into
facebook:releases/19.0.xfrom
eps1lon:sebbie/fd-bb-regression/19.0.x

Conversation

@eps1lon
Copy link
Copy Markdown
Collaborator

@eps1lon eps1lon commented May 28, 2026

Backports #36468 to 19.0.x

@meta-cla meta-cla Bot added the CLA Signed label May 28, 2026
@github-actions github-actions Bot added the React Core Team Opened by a member of the React Core Team label May 28, 2026
@react-sizebot
Copy link
Copy Markdown

react-sizebot commented May 28, 2026

The size diff is too large to display in a single comment. The GitHub action for this pull request contains an artifact called 'sizebot-message.md' with the full message.

Generated by 🚫 dangerJS against 86e5b95

@eps1lon eps1lon force-pushed the sebbie/fd-bb-regression/19.0.x branch from b6eccfb to d5e1df5 Compare May 28, 2026 16:21
webpackServerMap = WebpackMock.webpackServerMap;
ReactServerDOMServer = require('react-server-dom-webpack/server.node');
jest.resetModules();
ReactServerDOMClient = require('react-server-dom-webpack/client.edge');
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Different from the original PR. The Node.js Client didn't have encodeReply before #33474

@J0Ysutradhar

This comment was marked as spam.

…Busboy`

Fixes a regression from facebook#36425 where referenced `FormData` entries can
be dropped by `decodeReplyFromBusboy` when files are interleaved with
text fields in the payload.

`decodeReplyFromBusboy` queues text fields that arrive while a file is
being streamed and flushes them after the last file's `'end'`, working
around busboy emitting `'end'` deferred relative to subsequent `'field'`
events. With multiple files interleaved with text, this loses the
relative order of the affected text entries. The reorder was a
long-standing but invisible issue — entries came back in the wrong order
but were all present — until facebook#36425 tightened how referenced FormData
entries are collected from the backing store to rely on them being
contiguous. With that assumption violated, referenced FormDatas can now
come back with some entries dropped. The pattern is most easily surfaced
through `useActionState` actions that return the submitted `FormData` as
part of their state.

This replaces the tail-flush with a linked list of pending files. Text
fields that arrive while a file is in flight are queued on the tail
file's `queuedFields`; fields that arrive when the list is empty resolve
immediately. `flush()` walks from the head, resolving each completed
file followed by its queued fields, and stops at the first file that
hasn't ended yet. The backing FormData now matches the payload's order,
restoring the contiguity assumption (and fixing the long-standing
reorder as a side effect). The same change is applied to all five copies
in `react-server-dom-{webpack,turbopack,parcel,esm,unbundled}`. Two new
tests cover the multi-file interleave.
@eps1lon eps1lon force-pushed the sebbie/fd-bb-regression/19.0.x branch from d5e1df5 to 86e5b95 Compare May 29, 2026 10:43
@eps1lon eps1lon requested a review from unstubbable May 29, 2026 16:52
@eps1lon eps1lon marked this pull request as ready for review May 29, 2026 16:52
@eps1lon eps1lon merged commit 947132d into facebook:releases/19.0.x May 29, 2026
184 checks passed
@eps1lon eps1lon deleted the sebbie/fd-bb-regression/19.0.x branch May 29, 2026 18:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed React Core Team Opened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants