Skip to content

[19.1.x][FlightReply] Don't drop FormData entries in decodeReplyFromBusboy#36567

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

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

Conversation

@eps1lon
Copy link
Copy Markdown
Collaborator

@eps1lon eps1lon commented May 28, 2026

Backports #36468 to 19.1.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
@eps1lon eps1lon force-pushed the sebbie/fd-bb-regression/19.1.x branch from 4a3c61c to b360174 Compare May 28, 2026 16:22
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

…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.1.x branch from b360174 to ff81c78 Compare May 29, 2026 08:57
Comment on lines +13 to +20
if (typeof File === 'undefined') {
// Older Node.js versions do have support for Files in FormData but don't expose
// the constructor globally.
const formData = new FormData();
formData.append('a', new Blob(['a'], {type: 'text/plain'}), 'a.txt');
const arbitraryFile = formData.get('a');
globalThis.File = arbitraryFile.constructor;
}
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.

Also new to accomodate older Node.js versions. Only needed for assertions.

@eps1lon eps1lon requested a review from unstubbable May 29, 2026 10:57
@eps1lon eps1lon marked this pull request as ready for review May 29, 2026 10:58
@eps1lon eps1lon merged commit 52b2ad4 into facebook:releases/19.1.x May 29, 2026
244 of 246 checks passed
@eps1lon eps1lon deleted the sebbie/fd-bb-regression/19.1.x branch May 29, 2026 16:53
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.

2 participants