Skip to content
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

[Flight] Encode ReadableStream and AsyncIterables #28847

Merged
merged 11 commits into from
Apr 16, 2024

Conversation

sebmarkbage
Copy link
Collaborator

@sebmarkbage sebmarkbage commented Apr 16, 2024

This adds support in Flight for serializing four kinds of streams:

  • ReadableStream with objects as a model. This is a single shot iterator so you can read it only once. It can contain any value including Server Components. Chunks are encoded as is so if you send in 10 typed arrays, you get the same typed arrays out on the other side.
  • Binary ReadableStream with type: 'bytes' option. This supports the BYOB protocol. In this mode, the receiving side just gets Uint8Arrays and they can be split across any single byte boundary into arbitrary chunks.
  • AsyncIterable where the AsyncIterator function is different than the AsyncIterable itself. In this case we assume that this might be a multi-shot iterable and so we buffer its value and you can iterate it multiple times on the other side. We support the return value as a value in the single completion slot, but you can't pass values in next(). If you want single-shot, return the AsyncIterator instead.
  • AsyncIterator. These gets serialized as a single-shot as it's just an iterator.

AsyncIterable/AsyncIterator yield Promises that are instrumented with our .status/.value convention so that they can be synchronously looped over if available. They are also lazily parsed upon read.

We can't do this with ReadableStream because we use the native implementation of ReadableStream which owns the promises.

The format is a leading row that indicates which type of stream it is. Then a new row with the same ID is emitted for every chunk. Followed by either an error or close row.

AsyncIterables can also be returned as children of Server Components and then they're conceptually the same as fragment arrays/iterables. They can't actually be used as children in Fizz/Fiber but there's a separate plan for that. Only AsyncIterable not AsyncIterator will be valid as children - just like sync Iterable is already supported but single-shot Iterator is not. Notably, neither of these streams represent updates over time to a value. They represent multiple values in a list.

When the server stream is aborted we also close the underlying stream. However, closing a stream on the client, doesn't close the underlying stream.

A couple of possible follow ups I'm not planning on doing right now:

  • Free memory by releasing the buffer if an Iterator has been exhausted. Single shots could be optimized further to release individual items as you go.
  • We could clean up the underlying stream if the only pending data that's still flowing is from streams and all the streams have cleaned up. It's not very reliable though. It's better to do cancellation for the whole stream - e.g. at the framework level.
  • Implement smarter Binary Stream chunk handling. Currently we wait until we've received a whole row for binary chunks and copy them into consecutive memory. We need this to preserve semantics when passing typed arrays. However, for binary streams we don't need that. We can just send whatever pieces we have so far.

@sebmarkbage sebmarkbage requested review from gnoff and acdlite April 16, 2024 02:44
@facebook-github-bot facebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels Apr 16, 2024
@react-sizebot
Copy link

react-sizebot commented Apr 16, 2024

Comparing: 17e920c...0fddb4e

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable/react-dom/cjs/react-dom.production.min.js = 168.76 kB 168.76 kB = 52.91 kB 52.91 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js = 170.57 kB 170.57 kB = 53.44 kB 53.44 kB
facebook-www/ReactDOM-prod.classic.js = 590.83 kB 590.83 kB = 103.91 kB 103.91 kB
facebook-www/ReactDOM-prod.modern.js = 566.65 kB 566.65 kB = 100.10 kB 100.10 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.min.js +19.53% 53.35 kB 63.77 kB +14.59% 12.14 kB 13.91 kB
oss-experimental/react-client/cjs/react-client-flight.production.js +19.48% 53.17 kB 63.53 kB +13.97% 12.50 kB 14.24 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +19.47% 53.51 kB 63.93 kB +14.56% 12.17 kB 13.94 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js +18.35% 56.77 kB 67.18 kB +13.47% 13.10 kB 14.86 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js +18.19% 57.28 kB 67.70 kB +13.33% 13.26 kB 15.03 kB
oss-experimental/react-client/cjs/react-client-flight.production.min.js +17.71% 13.57 kB 15.98 kB +14.66% 4.79 kB 5.49 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.min.js +17.40% 14.28 kB 16.76 kB +14.20% 5.04 kB 5.75 kB
oss-experimental/react-server/cjs/react-server-flight.production.js +17.37% 70.52 kB 82.77 kB +11.20% 16.84 kB 18.73 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js +17.20% 60.57 kB 70.98 kB +12.57% 14.01 kB 15.77 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.js +16.71% 62.35 kB 72.77 kB +12.09% 14.56 kB 16.32 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js +16.70% 62.39 kB 72.81 kB +12.07% 14.58 kB 16.34 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.min.js +16.62% 14.95 kB 17.43 kB +13.63% 5.30 kB 6.03 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.min.js +16.49% 15.07 kB 17.56 kB +13.49% 5.34 kB 6.07 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js +16.33% 63.79 kB 74.21 kB +11.80% 14.92 kB 16.68 kB
oss-experimental/react-server-dom-turbopack/umd/react-server-dom-turbopack-client.browser.production.min.js +16.33% 15.13 kB 17.60 kB +13.32% 5.39 kB 6.11 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js +16.33% 63.82 kB 74.24 kB +11.79% 14.96 kB 16.72 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.production.min.js +16.20% 15.26 kB 17.73 kB +13.07% 5.43 kB 6.14 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js +16.05% 64.90 kB 75.32 kB +11.62% 15.13 kB 16.88 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js +16.05% 64.93 kB 75.35 kB +11.59% 15.17 kB 16.93 kB
oss-experimental/react-server/cjs/react-server-flight.production.min.js +16.04% 19.04 kB 22.09 kB +11.02% 6.84 kB 7.60 kB
oss-experimental/react-client/cjs/react-client-flight.development.js +15.78% 69.60 kB 80.58 kB +11.37% 16.50 kB 18.37 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +15.77% 69.61 kB 80.59 kB +11.61% 16.20 kB 18.08 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +15.72% 69.85 kB 80.83 kB +11.57% 16.27 kB 18.15 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.min.js +15.19% 16.37 kB 18.86 kB +12.64% 5.71 kB 6.43 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +15.02% 73.10 kB 84.08 kB +10.91% 17.25 kB 19.13 kB
oss-experimental/react-server-dom-turbopack/umd/react-server-dom-turbopack-client.browser.development.js +15.00% 77.62 kB 89.26 kB +10.87% 17.53 kB 19.44 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +14.92% 73.61 kB 84.59 kB +10.81% 17.42 kB 19.30 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +14.89% 78.16 kB 89.80 kB +10.76% 17.71 kB 19.61 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.min.js +14.83% 16.77 kB 19.26 kB +12.15% 5.91 kB 6.63 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.min.js +14.83% 16.77 kB 19.26 kB +12.15% 5.91 kB 6.63 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.min.js +14.56% 17.08 kB 19.57 kB +12.11% 6.01 kB 6.74 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.min.js +14.55% 17.09 kB 19.58 kB +12.12% 6.02 kB 6.75 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.min.js +14.19% 17.52 kB 20.01 kB +11.80% 6.13 kB 6.86 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js +14.19% 17.53 kB 20.02 kB +11.82% 6.14 kB 6.87 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +14.16% 77.53 kB 88.51 kB +10.14% 18.32 kB 20.18 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.development.js +13.84% 79.31 kB 90.29 kB +9.80% 18.90 kB 20.75 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +13.84% 79.34 kB 90.32 kB +9.79% 18.92 kB 20.77 kB
oss-experimental/react-server/cjs/react-server-flight.development.js +13.80% 96.46 kB 109.78 kB +9.91% 21.91 kB 24.08 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +13.60% 80.74 kB 91.72 kB +9.63% 19.27 kB 21.13 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +13.59% 80.77 kB 91.75 kB +9.60% 19.32 kB 21.17 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +13.42% 81.81 kB 92.79 kB +9.47% 19.49 kB 21.33 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +13.42% 81.84 kB 92.82 kB +9.44% 19.53 kB 21.37 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js +11.16% 109.83 kB 122.08 kB +7.42% 25.59 kB 27.49 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.js +10.85% 112.96 kB 125.21 kB +7.32% 26.38 kB 28.31 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js +10.77% 113.81 kB 126.06 kB +7.21% 26.63 kB 28.55 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.js +10.63% 115.21 kB 127.46 kB +7.19% 26.99 kB 28.93 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js +10.61% 115.53 kB 127.78 kB +7.12% 27.06 kB 28.99 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.js +10.56% 115.98 kB 128.23 kB +7.30% 26.59 kB 28.53 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.js +10.38% 118.06 kB 130.31 kB +7.20% 27.12 kB 29.07 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js +10.33% 118.65 kB 130.90 kB +7.05% 27.47 kB 29.40 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js +10.15% 120.72 kB 132.97 kB +6.80% 28.04 kB 29.94 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.min.js +10.11% 30.30 kB 33.37 kB +7.52% 10.19 kB 10.95 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +9.75% 136.57 kB 149.88 kB +7.00% 31.00 kB 33.17 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.min.js +9.68% 31.59 kB 34.64 kB +7.66% 10.17 kB 10.95 kB
oss-experimental/react-server-dom-turbopack/umd/react-server-dom-turbopack-server.browser.production.min.js +9.63% 31.70 kB 34.75 kB +7.76% 10.27 kB 11.07 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +9.56% 139.28 kB 152.60 kB +6.96% 31.50 kB 33.69 kB
oss-experimental/react-server-dom-turbopack/umd/react-server-dom-turbopack-server.browser.development.js +9.52% 146.80 kB 160.79 kB +6.97% 31.88 kB 34.11 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +9.52% 32.11 kB 35.17 kB +7.57% 10.30 kB 11.08 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +9.48% 32.21 kB 35.27 kB +7.47% 10.41 kB 11.19 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +9.45% 140.85 kB 154.16 kB +6.85% 31.98 kB 34.17 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.min.js +9.43% 32.13 kB 35.15 kB +7.43% 10.34 kB 11.11 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +9.39% 141.73 kB 155.04 kB +6.81% 32.17 kB 34.36 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js +9.36% 149.37 kB 163.36 kB +6.82% 32.57 kB 34.79 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.min.js +9.33% 32.84 kB 35.91 kB +7.09% 10.64 kB 11.40 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.development.js +9.33% 142.73 kB 156.05 kB +6.79% 32.00 kB 34.17 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +9.33% 142.78 kB 156.09 kB +6.72% 32.49 kB 34.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +9.31% 32.53 kB 35.56 kB +7.33% 10.44 kB 11.21 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.min.js +9.19% 33.34 kB 36.40 kB +7.08% 10.78 kB 11.55 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +9.18% 145.02 kB 158.34 kB +6.64% 32.61 kB 34.77 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.min.js +9.17% 33.42 kB 36.48 kB +6.94% 10.78 kB 11.53 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +9.16% 145.37 kB 158.69 kB +6.67% 32.81 kB 35.00 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.min.js +9.03% 33.92 kB 36.98 kB +6.95% 10.94 kB 11.70 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +9.02% 147.66 kB 160.97 kB +6.54% 33.42 kB 35.60 kB
oss-stable-semver/react-server/cjs/react-server-flight.production.min.js +2.08% 16.58 kB 16.92 kB +1.22% 6.15 kB 6.23 kB
oss-stable/react-server/cjs/react-server-flight.production.min.js +2.08% 16.58 kB 16.92 kB +1.22% 6.15 kB 6.23 kB
test_utils/ReactAllWarnings.js Deleted 64.44 kB 0.00 kB Deleted 16.10 kB 0.00 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.min.js +19.53% 53.35 kB 63.77 kB +14.59% 12.14 kB 13.91 kB
oss-experimental/react-client/cjs/react-client-flight.production.js +19.48% 53.17 kB 63.53 kB +13.97% 12.50 kB 14.24 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +19.47% 53.51 kB 63.93 kB +14.56% 12.17 kB 13.94 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js +18.35% 56.77 kB 67.18 kB +13.47% 13.10 kB 14.86 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js +18.19% 57.28 kB 67.70 kB +13.33% 13.26 kB 15.03 kB
oss-experimental/react-client/cjs/react-client-flight.production.min.js +17.71% 13.57 kB 15.98 kB +14.66% 4.79 kB 5.49 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.min.js +17.40% 14.28 kB 16.76 kB +14.20% 5.04 kB 5.75 kB
oss-experimental/react-server/cjs/react-server-flight.production.js +17.37% 70.52 kB 82.77 kB +11.20% 16.84 kB 18.73 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js +17.20% 60.57 kB 70.98 kB +12.57% 14.01 kB 15.77 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.js +16.71% 62.35 kB 72.77 kB +12.09% 14.56 kB 16.32 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js +16.70% 62.39 kB 72.81 kB +12.07% 14.58 kB 16.34 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.min.js +16.62% 14.95 kB 17.43 kB +13.63% 5.30 kB 6.03 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.min.js +16.49% 15.07 kB 17.56 kB +13.49% 5.34 kB 6.07 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js +16.33% 63.79 kB 74.21 kB +11.80% 14.92 kB 16.68 kB
oss-experimental/react-server-dom-turbopack/umd/react-server-dom-turbopack-client.browser.production.min.js +16.33% 15.13 kB 17.60 kB +13.32% 5.39 kB 6.11 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js +16.33% 63.82 kB 74.24 kB +11.79% 14.96 kB 16.72 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.production.min.js +16.20% 15.26 kB 17.73 kB +13.07% 5.43 kB 6.14 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js +16.05% 64.90 kB 75.32 kB +11.62% 15.13 kB 16.88 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js +16.05% 64.93 kB 75.35 kB +11.59% 15.17 kB 16.93 kB
oss-experimental/react-server/cjs/react-server-flight.production.min.js +16.04% 19.04 kB 22.09 kB +11.02% 6.84 kB 7.60 kB
oss-experimental/react-client/cjs/react-client-flight.development.js +15.78% 69.60 kB 80.58 kB +11.37% 16.50 kB 18.37 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +15.77% 69.61 kB 80.59 kB +11.61% 16.20 kB 18.08 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +15.72% 69.85 kB 80.83 kB +11.57% 16.27 kB 18.15 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.min.js +15.19% 16.37 kB 18.86 kB +12.64% 5.71 kB 6.43 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +15.02% 73.10 kB 84.08 kB +10.91% 17.25 kB 19.13 kB
oss-experimental/react-server-dom-turbopack/umd/react-server-dom-turbopack-client.browser.development.js +15.00% 77.62 kB 89.26 kB +10.87% 17.53 kB 19.44 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +14.92% 73.61 kB 84.59 kB +10.81% 17.42 kB 19.30 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +14.89% 78.16 kB 89.80 kB +10.76% 17.71 kB 19.61 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.min.js +14.83% 16.77 kB 19.26 kB +12.15% 5.91 kB 6.63 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.min.js +14.83% 16.77 kB 19.26 kB +12.15% 5.91 kB 6.63 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.min.js +14.56% 17.08 kB 19.57 kB +12.11% 6.01 kB 6.74 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.min.js +14.55% 17.09 kB 19.58 kB +12.12% 6.02 kB 6.75 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.min.js +14.19% 17.52 kB 20.01 kB +11.80% 6.13 kB 6.86 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js +14.19% 17.53 kB 20.02 kB +11.82% 6.14 kB 6.87 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +14.16% 77.53 kB 88.51 kB +10.14% 18.32 kB 20.18 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.development.js +13.84% 79.31 kB 90.29 kB +9.80% 18.90 kB 20.75 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +13.84% 79.34 kB 90.32 kB +9.79% 18.92 kB 20.77 kB
oss-experimental/react-server/cjs/react-server-flight.development.js +13.80% 96.46 kB 109.78 kB +9.91% 21.91 kB 24.08 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +13.60% 80.74 kB 91.72 kB +9.63% 19.27 kB 21.13 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +13.59% 80.77 kB 91.75 kB +9.60% 19.32 kB 21.17 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +13.42% 81.81 kB 92.79 kB +9.47% 19.49 kB 21.33 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +13.42% 81.84 kB 92.82 kB +9.44% 19.53 kB 21.37 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js +11.16% 109.83 kB 122.08 kB +7.42% 25.59 kB 27.49 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.js +10.85% 112.96 kB 125.21 kB +7.32% 26.38 kB 28.31 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js +10.77% 113.81 kB 126.06 kB +7.21% 26.63 kB 28.55 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.js +10.63% 115.21 kB 127.46 kB +7.19% 26.99 kB 28.93 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js +10.61% 115.53 kB 127.78 kB +7.12% 27.06 kB 28.99 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.js +10.56% 115.98 kB 128.23 kB +7.30% 26.59 kB 28.53 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.js +10.38% 118.06 kB 130.31 kB +7.20% 27.12 kB 29.07 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js +10.33% 118.65 kB 130.90 kB +7.05% 27.47 kB 29.40 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js +10.15% 120.72 kB 132.97 kB +6.80% 28.04 kB 29.94 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.min.js +10.11% 30.30 kB 33.37 kB +7.52% 10.19 kB 10.95 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +9.75% 136.57 kB 149.88 kB +7.00% 31.00 kB 33.17 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.min.js +9.68% 31.59 kB 34.64 kB +7.66% 10.17 kB 10.95 kB
oss-experimental/react-server-dom-turbopack/umd/react-server-dom-turbopack-server.browser.production.min.js +9.63% 31.70 kB 34.75 kB +7.76% 10.27 kB 11.07 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +9.56% 139.28 kB 152.60 kB +6.96% 31.50 kB 33.69 kB
oss-experimental/react-server-dom-turbopack/umd/react-server-dom-turbopack-server.browser.development.js +9.52% 146.80 kB 160.79 kB +6.97% 31.88 kB 34.11 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +9.52% 32.11 kB 35.17 kB +7.57% 10.30 kB 11.08 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +9.48% 32.21 kB 35.27 kB +7.47% 10.41 kB 11.19 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +9.45% 140.85 kB 154.16 kB +6.85% 31.98 kB 34.17 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.min.js +9.43% 32.13 kB 35.15 kB +7.43% 10.34 kB 11.11 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +9.39% 141.73 kB 155.04 kB +6.81% 32.17 kB 34.36 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js +9.36% 149.37 kB 163.36 kB +6.82% 32.57 kB 34.79 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.min.js +9.33% 32.84 kB 35.91 kB +7.09% 10.64 kB 11.40 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.development.js +9.33% 142.73 kB 156.05 kB +6.79% 32.00 kB 34.17 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +9.33% 142.78 kB 156.09 kB +6.72% 32.49 kB 34.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +9.31% 32.53 kB 35.56 kB +7.33% 10.44 kB 11.21 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.min.js +9.19% 33.34 kB 36.40 kB +7.08% 10.78 kB 11.55 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +9.18% 145.02 kB 158.34 kB +6.64% 32.61 kB 34.77 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.min.js +9.17% 33.42 kB 36.48 kB +6.94% 10.78 kB 11.53 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +9.16% 145.37 kB 158.69 kB +6.67% 32.81 kB 35.00 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.min.js +9.03% 33.92 kB 36.98 kB +6.95% 10.94 kB 11.70 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +9.02% 147.66 kB 160.97 kB +6.54% 33.42 kB 35.60 kB
oss-stable-semver/react-server/cjs/react-server-flight.production.min.js +2.08% 16.58 kB 16.92 kB +1.22% 6.15 kB 6.23 kB
oss-stable/react-server/cjs/react-server-flight.production.min.js +2.08% 16.58 kB 16.92 kB +1.22% 6.15 kB 6.23 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js +1.87% 83.18 kB 84.74 kB +1.50% 19.41 kB 19.70 kB
oss-stable/react-server/cjs/react-server-flight.development.js +1.87% 83.18 kB 84.74 kB +1.50% 19.41 kB 19.70 kB
oss-stable-semver/react-server/cjs/react-server-flight.production.js +1.83% 62.76 kB 63.91 kB +1.60% 15.48 kB 15.73 kB
oss-stable/react-server/cjs/react-server-flight.production.js +1.83% 62.76 kB 63.91 kB +1.60% 15.48 kB 15.73 kB
facebook-www/ReactFlightDOMServer-prod.modern.js +1.46% 39.22 kB 39.79 kB +1.18% 8.98 kB 9.09 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.min.js +1.35% 26.96 kB 27.32 kB +0.88% 9.33 kB 9.42 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.min.js +1.35% 26.96 kB 27.32 kB +0.88% 9.33 kB 9.42 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.min.js +1.32% 28.19 kB 28.56 kB +0.81% 9.30 kB 9.38 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.min.js +1.32% 28.19 kB 28.56 kB +0.81% 9.30 kB 9.38 kB
oss-stable-semver/react-server-dom-turbopack/umd/react-server-dom-turbopack-server.browser.production.min.js +1.31% 28.30 kB 28.67 kB +0.82% 9.42 kB 9.49 kB
oss-stable/react-server-dom-turbopack/umd/react-server-dom-turbopack-server.browser.production.min.js +1.31% 28.30 kB 28.67 kB +0.82% 9.42 kB 9.49 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +1.30% 119.75 kB 121.30 kB +1.15% 27.72 kB 28.04 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +1.30% 119.75 kB 121.30 kB +1.15% 27.72 kB 28.04 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +1.30% 28.71 kB 29.08 kB +0.79% 9.43 kB 9.50 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +1.30% 28.71 kB 29.08 kB +0.79% 9.43 kB 9.50 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +1.29% 28.81 kB 29.18 kB +0.84% 9.55 kB 9.63 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +1.29% 28.81 kB 29.18 kB +0.84% 9.55 kB 9.63 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +1.27% 122.66 kB 124.21 kB +1.05% 28.35 kB 28.65 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +1.27% 122.66 kB 124.21 kB +1.05% 28.35 kB 28.65 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +1.26% 123.55 kB 125.11 kB +1.04% 28.58 kB 28.88 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +1.26% 123.55 kB 125.11 kB +1.04% 28.58 kB 28.88 kB
oss-stable-semver/react-server-dom-turbopack/umd/react-server-dom-turbopack-server.browser.development.js +1.25% 129.39 kB 131.01 kB +1.07% 28.70 kB 29.01 kB
oss-stable/react-server-dom-turbopack/umd/react-server-dom-turbopack-server.browser.development.js +1.25% 129.39 kB 131.01 kB +1.07% 28.70 kB 29.01 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +1.24% 125.11 kB 126.66 kB +1.02% 29.02 kB 29.32 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +1.24% 125.11 kB 126.66 kB +1.02% 29.02 kB 29.32 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.min.js +1.24% 29.49 kB 29.86 kB +0.86% 9.75 kB 9.84 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.min.js +1.24% 29.49 kB 29.86 kB +0.86% 9.75 kB 9.84 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +1.24% 125.48 kB 127.04 kB +1.02% 29.09 kB 29.38 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +1.24% 125.48 kB 127.04 kB +1.02% 29.09 kB 29.38 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.development.js +1.24% 125.91 kB 127.46 kB +1.04% 28.76 kB 29.06 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.development.js +1.24% 125.91 kB 127.46 kB +1.04% 28.76 kB 29.06 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js +1.23% 131.96 kB 133.58 kB +1.04% 29.38 kB 29.68 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js +1.23% 131.96 kB 133.58 kB +1.04% 29.38 kB 29.68 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.min.js +1.22% 30.07 kB 30.43 kB +0.88% 9.90 kB 9.98 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.min.js +1.22% 30.07 kB 30.43 kB +0.88% 9.90 kB 9.98 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.min.js +1.22% 29.99 kB 30.36 kB +0.90% 9.91 kB 9.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.min.js +1.22% 29.99 kB 30.36 kB +0.90% 9.91 kB 9.99 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +1.21% 128.20 kB 129.75 kB +1.00% 29.34 kB 29.64 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +1.21% 128.20 kB 129.75 kB +1.00% 29.34 kB 29.64 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +1.21% 128.55 kB 130.11 kB +1.00% 29.57 kB 29.87 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +1.21% 128.55 kB 130.11 kB +1.00% 29.57 kB 29.87 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.min.js +1.20% 28.70 kB 29.05 kB +0.62% 9.46 kB 9.52 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.min.js +1.20% 28.70 kB 29.05 kB +0.62% 9.46 kB 9.52 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.min.js +1.19% 30.57 kB 30.94 kB +0.90% 10.06 kB 10.15 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.min.js +1.19% 30.57 kB 30.94 kB +0.90% 10.06 kB 10.15 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +1.19% 130.83 kB 132.39 kB +1.00% 30.18 kB 30.48 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +1.19% 130.83 kB 132.39 kB +1.00% 30.18 kB 30.48 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +1.18% 29.11 kB 29.45 kB +0.63% 9.56 kB 9.62 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +1.18% 29.11 kB 29.45 kB +0.63% 9.56 kB 9.62 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js +1.16% 99.17 kB 100.31 kB +1.00% 23.73 kB 23.97 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js +1.16% 99.17 kB 100.31 kB +1.00% 23.73 kB 23.97 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.js +1.13% 101.85 kB 102.99 kB +1.02% 24.33 kB 24.57 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.js +1.13% 101.85 kB 102.99 kB +1.02% 24.33 kB 24.57 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js +1.12% 102.69 kB 103.84 kB +1.02% 24.55 kB 24.80 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js +1.12% 102.69 kB 103.84 kB +1.02% 24.55 kB 24.80 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.js +1.10% 104.10 kB 105.24 kB +0.99% 24.93 kB 25.18 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.js +1.10% 104.10 kB 105.24 kB +0.99% 24.93 kB 25.18 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js +1.10% 104.42 kB 105.56 kB +0.99% 24.98 kB 25.23 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js +1.10% 104.42 kB 105.56 kB +0.99% 24.98 kB 25.23 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.js +1.09% 105.32 kB 106.46 kB +1.00% 24.70 kB 24.95 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.js +1.09% 105.32 kB 106.46 kB +1.00% 24.70 kB 24.95 kB
facebook-www/ReactFlightDOMServer-dev.modern.js +1.08% 104.86 kB 106.00 kB +0.99% 21.80 kB 22.02 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.js +1.07% 107.40 kB 108.54 kB +1.00% 25.19 kB 25.44 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.js +1.07% 107.40 kB 108.54 kB +1.00% 25.19 kB 25.44 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js +1.06% 107.98 kB 109.13 kB +1.03% 25.54 kB 25.81 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js +1.06% 107.98 kB 109.13 kB +1.03% 25.54 kB 25.81 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js +1.04% 110.05 kB 111.20 kB +0.99% 26.09 kB 26.34 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js +1.04% 110.05 kB 111.20 kB +0.99% 26.09 kB 26.34 kB
facebook-www/ReactFlightDOMClient-dev.modern.js +0.83% 42.55 kB 42.91 kB +0.65% 9.71 kB 9.77 kB
oss-stable-semver/react-server-dom-turbopack/umd/react-server-dom-turbopack-client.browser.development.js +0.50% 69.38 kB 69.73 kB +0.46% 16.01 kB 16.08 kB
oss-stable/react-server-dom-turbopack/umd/react-server-dom-turbopack-client.browser.development.js +0.50% 69.38 kB 69.73 kB +0.46% 16.01 kB 16.08 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +0.50% 69.92 kB 70.27 kB +0.46% 16.20 kB 16.27 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +0.50% 69.92 kB 70.27 kB +0.46% 16.20 kB 16.27 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js +0.49% 61.83 kB 62.13 kB +0.47% 15.03 kB 15.10 kB
oss-stable/react-client/cjs/react-client-flight.development.js +0.49% 61.83 kB 62.13 kB +0.47% 15.03 kB 15.10 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +0.49% 61.84 kB 62.14 kB +0.47% 14.74 kB 14.80 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +0.49% 61.84 kB 62.14 kB +0.47% 14.74 kB 14.80 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +0.49% 62.08 kB 62.38 kB +0.47% 14.80 kB 14.87 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +0.49% 62.08 kB 62.38 kB +0.47% 14.80 kB 14.87 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +0.46% 65.33 kB 65.63 kB +0.43% 15.77 kB 15.84 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +0.46% 65.33 kB 65.63 kB +0.43% 15.77 kB 15.84 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +0.46% 65.84 kB 66.14 kB +0.44% 15.94 kB 16.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +0.46% 65.84 kB 66.14 kB +0.44% 15.94 kB 16.01 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.js +0.45% 45.46 kB 45.66 kB +0.29% 11.07 kB 11.10 kB
oss-stable/react-client/cjs/react-client-flight.production.js +0.45% 45.46 kB 45.66 kB +0.29% 11.07 kB 11.10 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.min.js +0.45% 45.54 kB 45.74 kB +0.31% 10.69 kB 10.73 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.min.js +0.45% 45.54 kB 45.74 kB +0.31% 10.69 kB 10.73 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +0.45% 45.69 kB 45.90 kB +0.31% 10.72 kB 10.76 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +0.45% 45.69 kB 45.90 kB +0.31% 10.72 kB 10.76 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +0.43% 69.76 kB 70.06 kB +0.42% 16.83 kB 16.90 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +0.43% 69.76 kB 70.06 kB +0.42% 16.83 kB 16.90 kB
facebook-www/ReactFlightDOMClient-prod.modern.js +0.42% 19.88 kB 19.97 kB +0.31% 4.81 kB 4.82 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.development.js +0.42% 71.54 kB 71.84 kB +0.41% 17.40 kB 17.47 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.development.js +0.42% 71.54 kB 71.84 kB +0.41% 17.40 kB 17.47 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +0.42% 71.57 kB 71.87 kB +0.41% 17.42 kB 17.49 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +0.42% 71.57 kB 71.87 kB +0.41% 17.42 kB 17.49 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js +0.42% 48.95 kB 49.16 kB +0.26% 11.66 kB 11.69 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js +0.42% 48.95 kB 49.16 kB +0.26% 11.66 kB 11.69 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js +0.42% 49.47 kB 49.68 kB +0.28% 11.82 kB 11.86 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js +0.42% 49.47 kB 49.68 kB +0.28% 11.82 kB 11.86 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +0.41% 72.97 kB 73.28 kB +0.40% 17.76 kB 17.83 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +0.41% 72.97 kB 73.28 kB +0.40% 17.76 kB 17.83 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +0.41% 73.00 kB 73.30 kB +0.39% 17.80 kB 17.87 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +0.41% 73.00 kB 73.30 kB +0.39% 17.80 kB 17.87 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +0.41% 74.04 kB 74.35 kB +0.39% 17.97 kB 18.04 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +0.41% 74.04 kB 74.35 kB +0.39% 17.97 kB 18.04 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +0.41% 74.07 kB 74.37 kB +0.39% 18.02 kB 18.09 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +0.41% 74.07 kB 74.37 kB +0.39% 18.02 kB 18.09 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js +0.39% 52.75 kB 52.96 kB +0.30% 12.52 kB 12.55 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js +0.39% 52.75 kB 52.96 kB +0.30% 12.52 kB 12.55 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.js +0.38% 54.54 kB 54.74 kB +0.31% 13.07 kB 13.11 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.js +0.38% 54.54 kB 54.74 kB +0.31% 13.07 kB 13.11 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js +0.38% 54.57 kB 54.78 kB +0.30% 13.09 kB 13.13 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js +0.38% 54.57 kB 54.78 kB +0.30% 13.09 kB 13.13 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js +0.37% 55.98 kB 56.18 kB +0.29% 13.43 kB 13.47 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js +0.37% 55.98 kB 56.18 kB +0.29% 13.43 kB 13.47 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js +0.37% 56.00 kB 56.21 kB +0.30% 13.47 kB 13.51 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js +0.37% 56.00 kB 56.21 kB +0.30% 13.47 kB 13.51 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js +0.36% 57.09 kB 57.29 kB +0.27% 13.64 kB 13.68 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js +0.36% 57.09 kB 57.29 kB +0.27% 13.64 kB 13.68 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js +0.36% 57.11 kB 57.32 kB +0.27% 13.69 kB 13.72 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js +0.36% 57.11 kB 57.32 kB +0.27% 13.69 kB 13.72 kB
oss-stable-semver/react-server/cjs/react-server.production.js +0.27% 155.14 kB 155.57 kB +0.36% 36.59 kB 36.72 kB
oss-stable/react-server/cjs/react-server.production.js +0.27% 155.14 kB 155.57 kB +0.36% 36.59 kB 36.72 kB
oss-experimental/react-server/cjs/react-server.production.js +0.26% 166.64 kB 167.07 kB +0.37% 38.52 kB 38.67 kB
oss-stable-semver/react-server/cjs/react-server.development.js +0.22% 196.72 kB 197.15 kB +0.29% 46.46 kB 46.59 kB
oss-stable/react-server/cjs/react-server.development.js +0.22% 196.72 kB 197.15 kB +0.29% 46.46 kB 46.59 kB
oss-experimental/react-server/cjs/react-server.development.js +0.20% 208.18 kB 208.61 kB +0.29% 48.42 kB 48.56 kB
test_utils/ReactAllWarnings.js Deleted 64.44 kB 0.00 kB Deleted 16.10 kB 0.00 kB

Generated by 🚫 dangerJS against 0fddb4e

@sebmarkbage sebmarkbage force-pushed the flightreadablestream branch from fb5a64b to 561970b Compare April 16, 2024 02:59
@sebmarkbage sebmarkbage force-pushed the flightreadablestream branch from 561970b to 0fddb4e Compare April 16, 2024 03:08
@sebmarkbage sebmarkbage merged commit 7909d8e into facebook:main Apr 16, 2024
38 checks passed
github-actions bot pushed a commit that referenced this pull request Apr 16, 2024
This adds support in Flight for serializing four kinds of streams:

- `ReadableStream` with objects as a model. This is a single shot
iterator so you can read it only once. It can contain any value
including Server Components. Chunks are encoded as is so if you send in
10 typed arrays, you get the same typed arrays out on the other side.
- Binary `ReadableStream` with `type: 'bytes'` option. This supports the
BYOB protocol. In this mode, the receiving side just gets `Uint8Array`s
and they can be split across any single byte boundary into arbitrary
chunks.
- `AsyncIterable` where the `AsyncIterator` function is different than
the `AsyncIterable` itself. In this case we assume that this might be a
multi-shot iterable and so we buffer its value and you can iterate it
multiple times on the other side. We support the `return` value as a
value in the single completion slot, but you can't pass values in
`next()`. If you want single-shot, return the AsyncIterator instead.
- `AsyncIterator`. These gets serialized as a single-shot as it's just
an iterator.

`AsyncIterable`/`AsyncIterator` yield Promises that are instrumented
with our `.status`/`.value` convention so that they can be synchronously
looped over if available. They are also lazily parsed upon read.

We can't do this with `ReadableStream` because we use the native
implementation of `ReadableStream` which owns the promises.

The format is a leading row that indicates which type of stream it is.
Then a new row with the same ID is emitted for every chunk. Followed by
either an error or close row.

`AsyncIterable`s can also be returned as children of Server Components
and then they're conceptually the same as fragment arrays/iterables.
They can't actually be used as children in Fizz/Fiber but there's a
separate plan for that. Only `AsyncIterable` not `AsyncIterator` will be
valid as children - just like sync `Iterable` is already supported but
single-shot `Iterator` is not. Notably, neither of these streams
represent updates over time to a value. They represent multiple values
in a list.

When the server stream is aborted we also close the underlying stream.
However, closing a stream on the client, doesn't close the underlying
stream.

A couple of possible follow ups I'm not planning on doing right now:

- [ ] Free memory by releasing the buffer if an Iterator has been
exhausted. Single shots could be optimized further to release individual
items as you go.
- [ ] We could clean up the underlying stream if the only pending data
that's still flowing is from streams and all the streams have cleaned
up. It's not very reliable though. It's better to do cancellation for
the whole stream - e.g. at the framework level.
- [ ] Implement smarter Binary Stream chunk handling. Currently we wait
until we've received a whole row for binary chunks and copy them into
consecutive memory. We need this to preserve semantics when passing
typed arrays. However, for binary streams we don't need that. We can
just send whatever pieces we have so far.

DiffTrain build for [7909d8e](7909d8e)
@sebmarkbage
Copy link
Collaborator Author

sebmarkbage commented Apr 16, 2024

While the protocol supports all four, here's my recommendations for how to use it.

Mainly stick to binary ReadableStream for data pass-through or AsyncIterable for complex objects/components.

Only use ReadableStream / AsyncIterator / AsyncGenerator in Server Actions. They're also mutable objects. These are imperative constructs that should only be used in imperative contexts like Actions, Event handlers and Effects. You shouldn't really pass them between components nor hooks whether it's client or server. Props should be immutable so that the inner part can rerender without the outer part. You can't do that if it gets mutated.

If you use it, it needs to be only passed through render without iterated and then passed to an event handler or useEffect, that knows how to deal with it. That's the same recommendation for any mutable object nested inside. React doesn't have strong recommendations for how to deal with this but one convention is to wrap it in a createRef to indicate that the inner object is mutable and should only be accessed in effects. This can be used to for example create a stream of events that should only happen once and fired from an effect.

For things that needs to be read during render, use a multi-shot AsyncIterable (or if #28849 lands, a Generator Server Component).

I also recommend never really using the non-binary version of ReadableStream. It's an unnecessary construct with overhead that has no known use over AsyncIterable. The binary form is useful for directly passing the result from fetch through to the Client. Even nested RSCs.

You can also use Blob for data pass-through.

facebook-github-bot pushed a commit to facebook/react-native that referenced this pull request Apr 19, 2024
Summary:
This sync includes the changes from:
- D56103750
- [TODO] A shim for SECRET_INTERNALS

This sync includes the following changes:
- **[b5e5ce8e0](facebook/react@b5e5ce8e0 )**: Update ReactNativeTypes for root options (part 2) ([#28857](facebook/react#28857)) //<Ricky>//
- **[da6ba53b1](facebook/react@da6ba53b1 )**: [UMD] Remove umd builds ([#28735](facebook/react#28735)) //<Josh Story>//
- **[0c245df1d](facebook/react@0c245df1d )**: Complete the typo fix ([#28856](facebook/react#28856)) //<Sebastian Silbermann>//
- **[f82051d7a](facebook/react@f82051d7a )**: console test utils fix: match entire string, not just first letter ([#28855](facebook/react#28855)) //<Andrew Clark>//
- **[4ca20fd36](facebook/react@4ca20fd36 )**: Test top level fragment inside lazy semantics ([#28852](facebook/react#28852)) //<Sebastian Markbåge>//
- **[c0cf7c696](facebook/react@c0cf7c696 )**: Promote ASYNC_ITERATOR symbol to React Symbols ([#28851](facebook/react#28851)) //<Sebastian Markbåge>//
- **[657428a9e](facebook/react@657428a9e )**: Add ReactNativeTypes for root options ([#28850](facebook/react#28850)) //<Ricky>//
- **[7909d8eab](facebook/react@7909d8eab )**: [Flight] Encode ReadableStream and AsyncIterables ([#28847](facebook/react#28847)) //<Sebastian Markbåge>//
- **[13eb61d05](facebook/react@13eb61d05 )**: Move enableUseDeferredValueInitialArg to canary ([#28818](facebook/react#28818)) //<Andrew Clark>//
- **[8afa144bd](facebook/react@8afa144bd )**: Enable flag disableClientCache ([#28846](facebook/react#28846)) //<Jan Kassens>//
- **[734956ace](facebook/react@734956ace )**: Devtools: Add support for useFormStatus ([#28413](facebook/react#28413)) //<Sebastian Silbermann>//
- **[17e920c00](facebook/react@17e920c00 )**: [Flight Reply] Encode Typed Arrays and Blobs ([#28819](facebook/react#28819)) //<Sebastian Markbåge>//
- **[0347fcd00](facebook/react@0347fcd00 )**: Add on(Caught|Uncaught|Recoverable) opts to RN ([#28836](facebook/react#28836)) //<Ricky>//
- **[c113503ad](facebook/react@c113503ad )**: Flush direct streams in Bun ([#28837](facebook/react#28837)) //<Kenta Iwasaki>//
- **[9defcd56b](facebook/react@9defcd56b )**: Remove redundant props assign ([#28829](facebook/react#28829)) //<Sebastian Silbermann>//
- **[ed4023603](facebook/react@ed4023603 )**: Fix mistaken "react-server" condition ([#28835](facebook/react#28835)) //<Sebastian Markbåge>//
- **[c8a035036](facebook/react@c8a035036 )**: [Fizz] hoistables should never flush before the preamble ([#28802](facebook/react#28802)) //<Josh Story>//
- **[4f5c812a3](facebook/react@4f5c812a3 )**: DevTools: Rely on sourcemaps to compute hook name of built-in hooks in newer versions ([#28593](facebook/react#28593)) //<Sebastian Silbermann>//
- **[435415962](facebook/react@435415962 )**: Backwards compatibility for string refs on WWW ([#28826](facebook/react#28826)) //<Jack Pope>//
- **[608edcc90](facebook/react@608edcc90 )**: [tests] add `assertConsole<method>Dev` helpers ([#28732](facebook/react#28732)) //<Ricky>//
- **[da69b6af9](facebook/react@da69b6af9 )**: ReactDOM.requestFormReset  ([#28809](facebook/react#28809)) //<Andrew Clark>//
- **[374b5d26c](facebook/react@374b5d26c )**: Scaffolding for requestFormReset API ([#28808](facebook/react#28808)) //<Andrew Clark>//
- **[41950d14a](facebook/react@41950d14a )**: Automatically reset forms after action finishes ([#28804](facebook/react#28804)) //<Andrew Clark>//
- **[dc6a7e01e](facebook/react@dc6a7e01e )**: [Float] Don't preload images inside `<noscript>` ([#28815](facebook/react#28815)) //<Josh Story>//
- **[3f947b1b4](facebook/react@3f947b1b4 )**: [tests] Assert scheduler log empty in internalAct ([#28737](facebook/react#28737)) //<Ricky>//
- **[bf09089f6](facebook/react@bf09089f6 )**: Remove Scheduler.log from ReactSuspenseFuzz-test ([#28812](facebook/react#28812)) //<Ricky>//
- **[84cb3b4cb](facebook/react@84cb3b4cb )**: Hardcode disableIEWorkarounds for www ([#28811](facebook/react#28811)) //<Ricky>//
- **[2243b40ab](facebook/react@2243b40ab )**: [tests] assertLog before act in useEffectEvent ([#28763](facebook/react#28763)) //<Ricky>//
- **[dfc64c6e3](facebook/react@dfc64c6e3 )**: [tests] assertLog before act in ReactUse ([#28762](facebook/react#28762)) //<Ricky>//
- **[42eff4bc7](facebook/react@42eff4bc7 )**: [tests] Fix assertions not flushed before act ([#28745](facebook/react#28745)) //<Ricky>//
- **[ed3c65caf](facebook/react@ed3c65caf )**: Warn if outdated JSX transform is detected ([#28781](facebook/react#28781)) //<Andrew Clark>//
- **[3f9e237a2](facebook/react@3f9e237a2 )**: Fix: Suspend while recovering from hydration error ([#28800](facebook/react#28800)) //<Andrew Clark>//
- **[7f5d25e23](facebook/react@7f5d25e23 )**: Fix cloneElement using string ref w no owner ([#28797](facebook/react#28797)) //<Joseph Savona>//
- **[bf40b0244](facebook/react@bf40b0244 )**: [Fizz] Stop publishing external-runtime to stable channel ([#28796](facebook/react#28796)) //<Josh Story>//
- **[7f93cb41c](facebook/react@7f93cb41c )**: [DOM] Infer react-server entries bundles if not explicitly configured ([#28795](facebook/react#28795)) //<Josh Story>//
- **[f61316535](facebook/react@f61316535 )**: Rename SECRET INTERNALS to `__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE` ([#28789](facebook/react#28789)) //<Sebastian Markbåge>//
- **[9644d206e](facebook/react@9644d206e )**: Soften useFormState warning ([#28788](facebook/react#28788)) //<Ricky>//
- **[c771016e1](facebook/react@c771016e1 )**: Rename The Secret Export of Server Internals ([#28786](facebook/react#28786)) //<Sebastian Markbåge>//
- **[d50323eb8](facebook/react@d50323eb8 )**: Flatten ReactSharedInternals ([#28783](facebook/react#28783)) //<Sebastian Markbåge>//
- **[f62cf8c62](facebook/react@f62cf8c62 )**: [Float] treat `props.async` in Float consistent with the rest of react-dom ([#26760](facebook/react#26760)) //<Josh Story>//
- **[dfd3d5af8](facebook/react@dfd3d5af8 )**: Add support for transition{run,start,cancel} events ([#27345](facebook/react#27345)) //<Hugo Sales>//
- **[1f8327f83](facebook/react@1f8327f83 )**: [Fiber] Use real event priority for hydration scheduling ([#28765](facebook/react#28765)) //<Josh Story>//
- **[97c90ed88](facebook/react@97c90ed88 )**: [DOM] Shrink ReactDOMCurrentDispatcher method names ([#28770](facebook/react#28770)) //<Josh Story>//
- **[9007fdc8f](facebook/react@9007fdc8f )**: [DOM] Shrink ReactDOMSharedInternals source representation ([#28771](facebook/react#28771)) //<Josh Story>//
- **[14f50ad15](facebook/react@14f50ad15 )**: [Flight] Allow lazily resolving outlined models ([#28780](facebook/react#28780)) //<Sebastian Markbåge>//
- **[4c12339ce](facebook/react@4c12339ce )**: [DOM] move `flushSync` out of the reconciler ([#28500](facebook/react#28500)) //<Josh Story>//
- **[8e1462e8c](facebook/react@8e1462e8c )**: [Fiber] Move updatePriority tracking to renderers ([#28751](facebook/react#28751)) //<Josh Story>//
- **[0b3b8a6a3](facebook/react@0b3b8a6a3 )**: jsx: Remove unnecessary hasOwnProperty check ([#28775](facebook/react#28775)) //<Andrew Clark>//
- **[2acfb7b60](facebook/react@2acfb7b60 )**: [Flight] Support FormData from Server to Client ([#28754](facebook/react#28754)) //<Sebastian Markbåge>//
- **[d1547defe](facebook/react@d1547defe )**: Fast JSX: Don't clone props object ([#28768](facebook/react#28768)) //<Andrew Clark>//
- **[bfd8da807](facebook/react@bfd8da807 )**: Make class prop resolution faster ([#28766](facebook/react#28766)) //<Andrew Clark>//
- **[cbb6f2b54](facebook/react@cbb6f2b54 )**: [Flight] Support Blobs from Server to Client ([#28755](facebook/react#28755)) //<Sebastian Markbåge>//
- **[f33a6b69c](facebook/react@f33a6b69c )**: Track Owner for Server Components in DEV ([#28753](facebook/react#28753)) //<Sebastian Markbåge>//
- **[e3ebcd54b](facebook/react@e3ebcd54b )**: Move string ref coercion to JSX runtime ([#28473](facebook/react#28473)) //<Andrew Clark>//
- **[fd0da3eef](facebook/react@fd0da3eef )**: Remove _owner field from JSX elements in prod if string refs are disabled ([#28739](facebook/react#28739)) //<Sebastian Markbåge>//

Changelog:
[General][Changed] - React Native sync for revisions 48b4ecc...b5e5ce8

jest_e2e[run_all_tests]
bypass-github-export-checks

Reviewed By: kassens

Differential Revision: D56251607

fbshipit-source-id: e16db2fa101fc7ed1e009158c76388206beabd5f
sebmarkbage added a commit that referenced this pull request Apr 21, 2024
)

For [`AsyncIterable`](#28847) we
encode `AsyncIterator` as a separate tag.

Previously we encoded `Iterator` as just an Array. This adds a special
encoding for this. Technically this is a breaking change.

This is kind of an edge case that you'd care about the difference but it
becomes more important to treat these correctly for the warnings here
#28853.
sebmarkbage added a commit that referenced this pull request May 3, 2024
Same as #28847 but in the other direction.

Like other promises, this doesn't actually stream in the outgoing
direction. It buffers until the stream is done. This is mainly due to
our protocol remains compatible with Safari's lack of outgoing streams
until recently.

However, the stream chunks are encoded as separate fields and so does
support the busboy streaming on the receiving side.
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