@samitouri / QOS-React / commits / 969a9790ad

[Flight] Track I/O Entry for the RSC Stream itself (#34425)

One thing that can suspend is the downloading of the RSC stream itself. This tracks an I/O entry for each Promise (`SomeChunk<T>`) that represents the request to the RSC stream. As the value we use the `Response` for `createFromFetch` (or the `ReadableStream` for `createFromReadableStream`). The start time is when you called those. Since we're not awaiting the whole stream, each I/O entry represents the part of the stream up until it got unblocked. However, in a production environment with TLS packets and buffering in practice the chunks received by the client isn't exactly at the boundary of each row. It's a bit longer into larger chunks. From testing, it seems like multiples of 16kb or 64kb uncompressed are common. To simulate a production environment we group into roughly 64kb chunks if they happen in rapid sequence. Note that this might be too small to give a good idea because of the throttle many boundaries might be skipped anyway so this might show too many. The React DevTools will see each I/O entry as separate but dedupe if an outer boundary already depends on the same chunk. This deduping makes it so that small boundaries that are blocked on the same chunk, don't get treated as having unique suspenders. If you have a boundary with large content, then that content will likely be in a separate chunk which is not in the parent and then it gets marked as. This is all just an approximation. The goal of this is just to highlight that very large boundaries will very likely suspend even if they don't suspend on any I/O on the server. In practice, these boundaries can float around a lot and it's really any Suspense boundary that might suspend but some are more likely than others which this is meant to highlight. It also just lets you inspect how many bytes needs to be transferred before you can show a particular part of the content, to give you an idea that it's not just I/O on the server that might suspend. If you don't use the debug channel it can be misleading since the data in development mode stream will have a lot more data in it which leads to more chunking. Similarly to "client references" these I/O infos don't have an "env" since it's the client that has the I/O and so those are excluded from flushing in the Server performance tracks. Note that currently the same Response can appear many times in the same Instance of SuspenseNode in DevTools when there are multiple chunks. In a follow up I'll show only the last one per Response at any given level. Note that when a separate debugChannel is used it has its own I/O entry that's on the `_debugInfo` for the debug chunks in that channel. However, if everything works correctly these should never leak into the DevTools UI since they should never be propagated from a debug chunk to the values waited by the runtime. This is easy to break though.

Sebastian Markbåge committed Sep 9, 2025 at 16:46 UTC 969a9790ad58cc27eea63df9e5cf992b66bf1fd5
19 files changed +2038 -405
fixtures/flight/src/App.js
+7
@@ -21,6 +21,8 @@ import {Note} from './cjs/Note.js';
21
22 import {GenerateImage} from './GenerateImage.js';
23
24 +import LargeContent from './LargeContent.js';
25 +
26 import {like, greet, increment} from './actions.js';
27
28 import {getServerState} from './ServerState.js';
@@ -233,6 +235,11 @@ export default async function App({prerender, noCache}) {
235 <Foo>{dedupedChild}</Foo>
236 <Bar>{Promise.resolve([dedupedChild])}</Bar>
237 <Navigate />
238 + {prerender ? null : ( // TODO: prerender is broken for large content for some reason.
239 + <React.Suspense fallback={null}>
240 + <LargeContent />
241 + </React.Suspense>
242 + )}
243 </Container>
244 </body>
245 </html>
fixtures/flight/src/LargeContent.js new
+1115
@@ -0,0 +1,1115 @@
1 +import * as React from 'react';
2 +
3 +export default async function LargeContent() {
4 + return (
5 + <div>
6 + <p>
7 + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras auctor
8 + dapibus nunc, at feugiat sem tempor id. Pellentesque euismod a libero in
9 + dignissim. Curabitur consequat urna blandit eros pellentesque sagittis.
10 + Quisque sed odio elit. Vivamus semper, ipsum eget congue ornare, neque
11 + nibh suscipit mauris, in luctus ligula urna nec ligula. Interdum et
12 + malesuada fames ac ante ipsum primis in faucibus. Vivamus in ligula sit
13 + amet ligula gravida accumsan. Suspendisse potenti. Suspendisse vulputate
14 + auctor ligula nec scelerisque. Praesent tempus diam nec porta malesuada.
15 + Cras pellentesque euismod sapien, ut luctus risus egestas id. Nam sed
16 + neque vehicula, tempor lacus non, maximus felis. Curabitur lobortis
17 + efficitur massa, sed volutpat elit vulputate eget. Nullam posuere risus
18 + vel purus bibendum placerat at nec libero.
19 + </p>
20 + <p>
21 + Pellentesque eget laoreet nulla, in dictum ex. Maecenas odio nulla,
22 + laoreet sed dapibus eget, fermentum ut ipsum. Nam nec gravida massa, non
23 + scelerisque augue. Donec vulputate nibh at sem convallis, quis imperdiet
24 + arcu vestibulum. Duis eget nibh sapien. Praesent nulla arcu, mattis et
25 + velit sit amet, viverra facilisis leo. Integer gravida nisi urna, in
26 + fermentum purus sagittis a. Integer a convallis dui. Nunc gravida erat
27 + nec nunc porttitor, eu pharetra nibh varius. Vestibulum ante ipsum
28 + primis in faucibus orci luctus et ultrices posuere cubilia curae; Cras
29 + quis lobortis sapien, et accumsan mi. Sed in interdum libero. Vivamus
30 + congue, est mollis elementum porta, lectus nulla maximus urna, sed
31 + cursus ex est sit amet lorem. Morbi et porta urna, sit amet varius
32 + magna. Maecenas tincidunt lorem nec dolor venenatis elementum.
33 + </p>
34 + <p>
35 + Vivamus dapibus mi urna. Aliquam rutrum accumsan nisi, vitae convallis
36 + risus rhoncus a. Phasellus ultrices rutrum leo. Phasellus eget diam et
37 + turpis porttitor tincidunt eget et massa. Aliquam quis pellentesque
38 + orci, eu auctor urna. Maecenas hendrerit nisi vestibulum ligula blandit,
39 + id vestibulum erat facilisis. Phasellus ac pulvinar nibh. Fusce
40 + suscipit, lectus vel viverra blandit, risus erat congue urna, in cursus
41 + tortor lorem nec eros. Mauris dapibus, justo ac gravida mattis, nunc
42 + massa euismod elit, vel eleifend ipsum nisi vitae massa. Cras id
43 + volutpat magna, in semper quam.
44 + </p>
45 + <p>
46 + Ut id vehicula turpis. Nullam ac iaculis sem, pulvinar elementum odio.
47 + Aliquam venenatis feugiat risus ut lacinia. Pellentesque habitant morbi
48 + tristique senectus et netus et malesuada fames ac turpis egestas. Cras
49 + quis blandit tellus. Ut vitae imperdiet dolor. Duis rutrum a tortor in
50 + porta. Nulla sed euismod leo. Etiam urna nisi, eleifend tristique velit
51 + sit amet, bibendum eleifend turpis. Pellentesque tellus purus, faucibus
52 + quis pellentesque ac, finibus sed mi. Aenean eget lobortis neque.
53 + </p>
54 + <p>
55 + Sed fermentum pulvinar dolor, a euismod felis pulvinar sed. Aliquam et
56 + vestibulum eros. Pellentesque mattis efficitur erat. Quisque scelerisque
57 + sem venenatis eros bibendum porta. Fusce a elit et ante rutrum gravida.
58 + Sed ex orci, venenatis non elementum id, faucibus et diam. Nullam
59 + posuere viverra tempus. Duis faucibus metus urna, sit amet bibendum
60 + lorem fermentum ut. Quisque laoreet ultrices purus.
61 + </p>
62 + <p>
63 + Praesent placerat laoreet augue, eu mollis mi vulputate in. Sed commodo
64 + est at sapien laoreet pulvinar. Interdum et malesuada fames ac ante
65 + ipsum primis in faucibus. Sed libero velit, porttitor vitae lectus sit
66 + amet, accumsan rhoncus mi. Donec tincidunt purus odio. Aliquam ac
67 + molestie nisi, sed hendrerit sem. Nulla facilisi. Sed tempor odio eu
68 + nisl facilisis, vel porttitor augue auctor. Fusce in ex euismod,
69 + dignissim diam quis, lacinia purus. Interdum et malesuada fames ac ante
70 + ipsum primis in faucibus. Integer non nibh odio. Ut ut ligula felis.
71 + Curabitur tempor lacus a risus condimentum, eu accumsan turpis sagittis.
72 + Nulla facilisi. Quisque at congue nunc, at suscipit neque.
73 + </p>
74 + <p>
75 + Integer feugiat ligula quis nunc ultrices, eget sodales metus elementum.
76 + Proin ex justo, mollis a pulvinar ullamcorper, fermentum sit amet
77 + tellus. Fusce id euismod nisi. Cras mattis placerat purus nec venenatis.
78 + Aenean sed dui faucibus, egestas ipsum at, tempus purus. Proin facilisis
79 + tellus quis odio ultrices, a tincidunt elit congue. Nam tempus sapien
80 + vel quam sodales tempus. Ut blandit pellentesque lorem vel imperdiet.
81 + Cras nisi turpis, volutpat a mauris nec, faucibus ultrices tortor.
82 + Praesent a ornare augue. Ut eget neque sed felis imperdiet vestibulum et
83 + ut metus. Maecenas vel dolor ante. Vivamus posuere risus interdum lacus
84 + pulvinar, eget tincidunt velit tempus. Sed viverra erat tellus, nec
85 + iaculis dolor tincidunt et. Sed rhoncus mauris nibh, non lacinia lorem
86 + vehicula nec.
87 + </p>
88 + <p>
89 + Maecenas ultrices malesuada urna quis maximus. Proin vel dictum ipsum.
90 + Duis lacinia turpis vel molestie pharetra. Nullam iaculis porta rhoncus.
91 + Maecenas ullamcorper massa non velit sagittis suscipit. Quisque lobortis
92 + blandit diam, vehicula cursus quam faucibus in. Duis eget mauris vitae
93 + augue convallis interdum. Ut ac iaculis ex, quis maximus justo. Ut sed
94 + fermentum tellus. Pellentesque facilisis turpis nisi, id molestie tortor
95 + aliquam dignissim. Aenean luctus quam at arcu viverra venenatis. Proin
96 + quis pellentesque nisi. Donec iaculis nunc id ornare pharetra. Donec id
97 + ligula mollis, hendrerit ipsum in, vulputate justo. Praesent in
98 + condimentum sem. Pellentesque malesuada velit ullamcorper dui pharetra
99 + placerat.
100 + </p>
101 + <p>
102 + In lacus nibh, finibus sed nulla ut, dictum feugiat magna. Aliquam
103 + semper turpis non placerat scelerisque. Maecenas lobortis, est vitae
104 + aliquam maximus, metus tortor porta dolor, vitae ullamcorper elit enim
105 + vel tellus. Vestibulum volutpat posuere luctus. Nullam eros leo, aliquam
106 + et ullamcorper sed, viverra in erat. Nam mauris metus, imperdiet non
107 + convallis et, viverra et tortor. Nulla quis pretium tellus. In
108 + scelerisque finibus mi convallis euismod. Pellentesque ante tellus,
109 + vestibulum non egestas in, volutpat eu arcu. Donec malesuada risus nisi,
110 + eget consequat massa rhoncus ut. Maecenas eget magna a metus consectetur
111 + interdum. Sed lorem est, eleifend sed mattis in, feugiat ac magna.
112 + Pellentesque iaculis nunc sed metus laoreet, ac feugiat est maximus.
113 + Aenean velit magna, dapibus ut scelerisque ac, sollicitudin sed justo.
114 + Phasellus venenatis metus sit amet dapibus imperdiet.
115 + </p>
116 + <p>
117 + Nullam nec volutpat purus. Duis elementum ex risus, id consectetur
118 + lectus commodo molestie. Duis tristique nisl non convallis tristique.
119 + Nam eget lectus tempor, porta orci ut, fermentum nibh. Morbi egestas
120 + semper tempor. Nunc est lacus, aliquet id pellentesque vel, tincidunt id
121 + eros. Suspendisse vitae nibh vitae ligula faucibus tristique eu eu
122 + lorem. Donec nec turpis consequat, laoreet sapien ut, condimentum orci.
123 + Mauris imperdiet feugiat consectetur. Nam vel ultrices arcu. Donec quis
124 + pharetra augue, in egestas quam. Ut vitae ligula bibendum, suscipit
125 + risus non, malesuada tellus. Praesent quis dui nec odio rutrum tempor
126 + vitae nec augue.
127 + </p>
128 + <p>
129 + Nam tristique erat vitae congue venenatis. Suspendisse sed mattis nisi.
130 + Aliquam erat volutpat. Quisque vitae odio eu sapien hendrerit pretium.
131 + Etiam sollicitudin orci purus, a bibendum erat tincidunt at. Nunc
132 + ultricies ac arcu eget consectetur. Cras augue libero, hendrerit et
133 + placerat in, imperdiet sed lectus. Pellentesque varius enim laoreet est
134 + finibus, vitae vulputate leo venenatis. Nam tincidunt metus eget neque
135 + tristique pretium.
136 + </p>
137 + <p>
138 + Ut ultrices dapibus ornare. Aliquam et est eu nisl mattis fermentum.
139 + Aliquam luctus est sed lobortis aliquam. Donec vel pretium purus. Donec
140 + augue augue, euismod viverra orci a, lacinia maximus risus. Nam sagittis
141 + nibh eget urna feugiat, et venenatis erat facilisis. Donec fermentum non
142 + nisi ut pretium. Aenean sodales fermentum lacus, vitae fermentum elit
143 + efficitur hendrerit. Proin dictum pretium lacus, vestibulum efficitur
144 + orci hendrerit ac. Maecenas non elementum diam, vel venenatis eros.
145 + Donec finibus luctus arcu, porttitor condimentum tortor tincidunt vel.
146 + </p>
147 + <p>
148 + Interdum et malesuada fames ac ante ipsum primis in faucibus. Phasellus
149 + viverra massa diam, in dignissim nunc dapibus eu. Phasellus tincidunt
150 + fermentum libero vitae eleifend. Nullam vel pellentesque libero, et
151 + sagittis turpis. Quisque euismod quis diam quis ornare. Cras id quam
152 + elementum, suscipit augue id, sodales eros. Vivamus egestas, quam vitae
153 + sagittis pellentesque, justo purus aliquam purus, vel bibendum turpis
154 + nisi quis lectus. Ut ac libero vitae mauris placerat luctus et eget
155 + velit. Nullam semper eros elementum, efficitur lacus eget, consequat
156 + magna. Ut eu tincidunt urna, vel congue sapien. Vestibulum ante ipsum
157 + primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec
158 + odio velit, rutrum sit amet porta et, imperdiet a augue.
159 + </p>
160 + <p>
161 + Nunc nec odio nec ipsum convallis mattis. Nulla ut aliquet quam. Morbi
162 + enim tortor, dignissim sit amet volutpat non, consequat in neque.
163 + Maecenas vitae enim blandit, dictum lorem eget, placerat turpis.
164 + Suspendisse potenti. Integer dapibus efficitur nunc non dignissim. Proin
165 + rhoncus laoreet imperdiet. Aenean nec iaculis est. Praesent placerat
166 + nibh ac augue blandit pulvinar. Suspendisse vitae ipsum eget sapien
167 + aliquet fermentum in a urna.
168 + </p>
169 + <p>
170 + Quisque porta odio eu blandit vehicula. Maecenas sapien libero, sodales
171 + quis quam ut, pharetra finibus libero. Etiam vel neque ipsum. Aliquam
172 + quis dui mi. Vestibulum vitae massa nulla. Ut est nibh, elementum vitae
173 + nisi fermentum, viverra consectetur risus. Phasellus cursus egestas
174 + felis quis interdum. Nam non ipsum et mauris dignissim vehicula nec nec
175 + est. Duis quis venenatis mi. Pellentesque blandit ullamcorper felis,
176 + commodo ultricies ligula faucibus vel. Maecenas scelerisque neque a erat
177 + consequat vehicula. Ut finibus tempus facilisis. In sodales lacus at
178 + magna tincidunt, in maximus neque convallis. In at lorem eu purus
179 + volutpat aliquam at vitae enim. Sed sit amet mauris vitae tortor finibus
180 + scelerisque ut et eros.
181 + </p>
182 + <p>
183 + Integer in fermentum massa, a maximus purus. Donec rhoncus, lectus sit
184 + amet consequat vestibulum, neque ante cursus urna, eleifend varius felis
185 + ante sed enim. In dui mi, euismod ac mollis id, porttitor vel leo.
186 + Pellentesque habitant morbi tristique senectus et netus et malesuada
187 + fames ac turpis egestas. Nunc nisl sapien, convallis bibendum vehicula
188 + non, convallis ut sem. Nullam non molestie massa. Phasellus eu volutpat
189 + mi. Pellentesque porta ex sed turpis commodo, sit amet aliquet ex
190 + sagittis. Vestibulum molestie ante a magna eleifend imperdiet. In
191 + hendrerit nibh sed eleifend facilisis. Mauris malesuada cursus tortor
192 + non fringilla. Sed a nibh sed sem accumsan finibus. Vivamus egestas
193 + mauris porta, ultricies felis at, sodales arcu. Ut eu lacinia eros.
194 + Aliquam consequat laoreet ante, in interdum eros lacinia ac. Nunc luctus
195 + nisl eget nulla vehicula, a fermentum diam porta.
196 + </p>
197 + <p>
198 + Proin vel tellus placerat, lacinia arcu pretium, gravida ligula.
199 + Vestibulum pharetra diam non ultrices finibus. Quisque facilisis
200 + imperdiet lorem, ullamcorper molestie odio laoreet in. Praesent tellus
201 + quam, laoreet et orci quis, consequat ullamcorper magna. Nam lobortis id
202 + ligula ut sodales. Quisque venenatis, lacus non accumsan fermentum,
203 + magna mauris dignissim mi, vel finibus nulla leo id nibh. Integer
204 + condimentum nulla et diam scelerisque mollis. Interdum et malesuada
205 + fames ac ante ipsum primis in faucibus.
206 + </p>
207 + <p>
208 + Fusce gravida ultrices hendrerit. Mauris aliquet, risus in feugiat
209 + dictum, sem ligula mattis odio, consequat consectetur mi tellus non
210 + nulla. Duis quis rhoncus ex, at vehicula urna. Quisque vitae dolor
211 + tincidunt, egestas mauris id, tristique mauris. Mauris hendrerit iaculis
212 + urna. Mauris molestie dictum massa, non porttitor arcu commodo id.
213 + Praesent enim erat, malesuada dictum orci id, gravida consequat metus.
214 + Duis vel magna ultricies, ultrices mi eu, euismod lectus. Quisque non
215 + mauris ut urna efficitur vestibulum eu eget sem. Integer bibendum
216 + bibendum arcu, at placerat felis luctus faucibus.
217 + </p>
218 + <p>
219 + Quisque porttitor euismod justo, in mattis tortor gravida et. Aliquam
220 + dapibus enim ut purus blandit consectetur. Quisque erat est, pretium
221 + eget mattis in, finibus at urna. Nulla pulvinar euismod magna eu
222 + sollicitudin. Sed varius sapien quis dolor vehicula rhoncus. Etiam eget
223 + arcu vel mi placerat scelerisque. Proin sed viverra est. Nullam sit amet
224 + porta urna. In hac habitasse platea dictumst. Etiam eget ullamcorper
225 + ipsum. Aenean nisi magna, efficitur sed maximus nec, finibus ut massa.
226 + </p>
227 + <p>
228 + Nullam vitae condimentum odio. In tempus velit vel lacus molestie
229 + vestibulum at congue lacus. Vestibulum sed ante elit. Aliquam suscipit
230 + est sed metus mollis, ut gravida dolor scelerisque. Mauris placerat
231 + risus turpis, nec varius neque malesuada non. Fusce ultrices facilisis
232 + tempus. Praesent consectetur aliquam nulla. Quisque a luctus leo. Nam
233 + odio elit, consectetur quis turpis ut, vestibulum laoreet leo. Sed vitae
234 + purus quis metus dignissim viverra. Proin lobortis tempor tincidunt.
235 + Phasellus posuere tristique nisl, et laoreet mauris sodales quis. Donec
236 + finibus leo arcu, a ultrices mi viverra at. Aenean lacinia ex quis
237 + pretium vehicula. In hac habitasse platea dictumst.
238 + </p>
239 + <p>
240 + Morbi gravida sit amet leo aliquam mattis. Aliquam vestibulum, est ac
241 + rutrum sollicitudin, dui dolor mollis turpis, finibus euismod purus est
242 + id purus. Proin eleifend leo consequat augue suscipit accumsan. Sed nec
243 + dolor id sem tincidunt tempor. Morbi neque nisl, malesuada nec placerat
244 + eget, finibus viverra quam. In id leo gravida, lobortis libero quis,
245 + bibendum diam. Aliquam et fermentum augue, et pretium lacus.
246 + </p>
247 + <p>
248 + Phasellus quis massa in mi suscipit auctor eget in ante. Phasellus a
249 + efficitur lectus. Nam porta eros a est aliquet, interdum luctus tortor
250 + accumsan. Nam ac mollis est. Duis vitae sagittis magna. Pellentesque
251 + molestie vehicula tortor. Curabitur in semper sapien. Phasellus vitae
252 + bibendum ligula, in bibendum leo. Phasellus pellentesque mi sed ante
253 + tristique, et condimentum enim fringilla. Nulla facilisi.
254 + </p>
255 + <p>
256 + Phasellus porta risus eu lobortis dapibus. Nulla ut leo sem. Vivamus nec
257 + nisi erat. Proin vel dolor auctor, tristique purus at, congue nisi. In
258 + sit amet fermentum tortor. Nullam volutpat, massa sit amet tempor
259 + sollicitudin, orci risus aliquet elit, et consequat ante nisl vel odio.
260 + Sed auctor mollis justo, vel gravida lacus aliquam vel. Sed elit tellus,
261 + blandit nec dictum a, tempus quis libero.
262 + </p>
263 + <p>
264 + Mauris molestie in elit ac faucibus. Praesent a velit diam. Praesent ut
265 + dapibus arcu, ut molestie quam. Cras eget pretium sem. Sed quis lacus
266 + hendrerit, auctor nisi eget, venenatis dui. Cras id nisl aliquam,
267 + elementum lacus ac, sodales purus. Cras venenatis quam eu leo mattis,
268 + feugiat venenatis turpis rutrum. Vestibulum non leo lectus. Aenean at
269 + leo pellentesque ex efficitur sollicitudin. Sed nec nunc eu elit
270 + hendrerit ultrices. Nullam porta tincidunt vestibulum. Aliquam convallis
271 + nisl eu ipsum posuere, vitae aliquam diam tempor.
272 + </p>
273 + <p>
274 + Cras vitae auctor risus. Morbi aliquam aliquet massa, et varius sem
275 + interdum eu. Praesent purus ligula, rhoncus sed consequat id, rutrum ut
276 + elit. Aenean in est eu velit fermentum consequat. Sed vulputate placerat
277 + augue, vel cursus purus placerat ut. Maecenas mauris velit, tristique
278 + fringilla fermentum eu, hendrerit in dui. Fusce vestibulum ligula non
279 + sem tempus, pellentesque vulputate nibh iaculis. Curabitur eleifend vel
280 + ante non malesuada. Mauris a dolor nec leo sagittis convallis nec non
281 + velit. Maecenas accumsan est at ligula malesuada, eu pulvinar ligula
282 + consequat. Suspendisse potenti. Nullam nec urna id metus efficitur
283 + posuere et in dui. Maecenas varius, eros vitae sollicitudin pulvinar,
284 + sem nisi rhoncus arcu, id feugiat nunc tellus id velit. Vestibulum sit
285 + amet dictum lectus. Praesent eget massa pulvinar, mollis leo at, tempor
286 + erat.
287 + </p>
288 + <p>
289 + Duis ut mi ac ex fringilla molestie. Sed ultricies rutrum purus. Nam
290 + varius placerat varius. Pellentesque libero ligula, gravida at egestas
291 + sed, tempor vel nisi. Suspendisse convallis tortor et mi convallis,
292 + vitae tempus felis dignissim. Nulla facilisi. Sed at augue eget purus
293 + rutrum volutpat. Mauris auctor arcu a arcu placerat pulvinar. Maecenas
294 + in tortor ipsum. Integer quam nulla, congue et velit sodales, ornare
295 + semper mauris. Etiam luctus nisl vitae risus condimentum, vitae sagittis
296 + metus vehicula. Etiam non nulla mi. Vivamus ornare accumsan est, sit
297 + amet condimentum est pretium a.
298 + </p>
299 + <p>
300 + Donec faucibus erat quis libero lobortis dictum. Proin lacus arcu,
301 + laoreet id semper a, dictum eget lacus. Sed consectetur metus turpis,
302 + non sodales massa fringilla sit amet. Donec ultrices rutrum risus, vitae
303 + facilisis est porta non. Integer congue scelerisque enim sed
304 + condimentum. Cras rutrum ex ullamcorper ultrices malesuada. Suspendisse
305 + potenti. Donec pretium eros ipsum, id pharetra tortor posuere non. Proin
306 + accumsan tempus ipsum, eget lobortis tellus. Proin blandit mi ut orci
307 + consectetur, sed elementum nibh tempor. Ut eu tincidunt nunc, sit amet
308 + aliquam turpis. Nulla facilisis felis lectus, a ultricies dolor
309 + efficitur eget. In a pellentesque libero.
310 + </p>
311 + <p>
312 + Aenean cursus orci sed est tincidunt finibus. Duis efficitur nec turpis
313 + ut placerat. Aenean aliquet tortor lorem, eget elementum orci dapibus
314 + eu. Etiam imperdiet congue sollicitudin. Nunc congue, ante quis molestie
315 + porta, lorem nunc gravida felis, id lacinia lorem risus nec metus. Donec
316 + orci magna, tempus id urna sed, feugiat malesuada felis. Aliquam nec
317 + eleifend arcu. Vivamus ac lectus tempor, tempus leo in, lacinia est. Nam
318 + ut viverra lectus. Sed sit amet rhoncus neque. Sed mollis in urna id
319 + volutpat.
320 + </p>
321 + <p>
322 + Fusce vestibulum in odio nec tempor. Praesent nulla lorem, commodo vel
323 + ligula et, accumsan bibendum mauris. Mauris ornare nulla sapien, sit
324 + amet dapibus lacus dignissim in. Donec dapibus dui ac nisl feugiat, et
325 + gravida risus facilisis. Sed gravida, odio non consectetur efficitur,
326 + urna metus venenatis nisl, sit amet vulputate ante mauris in lectus.
327 + Phasellus tincidunt, risus nec interdum dictum, mi tellus malesuada
328 + justo, vel tempus leo enim quis orci. Sed in commodo ligula. Mauris non
329 + interdum elit, id dapibus quam.
330 + </p>
331 + <p>
332 + Proin a velit sit amet nunc congue feugiat sit amet ut lorem. Mauris vel
333 + iaculis nisi. Praesent purus massa, accumsan ac euismod hendrerit,
334 + auctor et arcu. Curabitur tempus ornare velit interdum tempor. Morbi a
335 + turpis vel mauris luctus tincidunt ut id quam. Aliquam tincidunt nec
336 + erat a volutpat. Donec ultricies accumsan tortor, ut pulvinar mauris
337 + consectetur in. Duis condimentum blandit ipsum, sit amet dapibus risus
338 + dignissim et. Vestibulum sodales imperdiet facilisis. Donec gravida
339 + tellus a posuere faucibus. Nunc vitae placerat lorem.
340 + </p>
341 + <p>
342 + Mauris dictum nunc sed turpis commodo, eget elementum nibh lobortis.
343 + Vivamus ut condimentum sem. Etiam dui diam, facilisis vel egestas et,
344 + fringilla eget odio. Pellentesque quis sapien mattis, dignissim nisi
345 + quis, volutpat massa. Vivamus eget pulvinar risus. Aliquam tristique
346 + elit vel viverra facilisis. Vestibulum ac malesuada ex. Lorem ipsum
347 + dolor sit amet, consectetur adipiscing elit. Phasellus condimentum est
348 + nec iaculis dignissim. Aenean congue, odio quis vestibulum malesuada,
349 + justo enim tristique sapien, tempor lobortis erat tortor vitae felis.
350 + Aliquam erat volutpat. Nullam vel mattis mauris, ut dictum lacus. Fusce
351 + tincidunt accumsan magna quis tincidunt. Aenean nec diam convallis,
352 + facilisis ex ut, varius nunc.
353 + </p>
354 + <p>
355 + Nullam facilisis congue semper. Aenean placerat ipsum ut felis semper,
356 + ut sagittis eros congue. Duis non volutpat sapien, eu ullamcorper lorem.
357 + Donec consectetur mauris vitae neque pharetra, eu sollicitudin ex
358 + scelerisque. Donec at urna feugiat leo mollis viverra. Integer imperdiet
359 + tincidunt quam, in congue turpis finibus vel. Phasellus porta maximus
360 + ullamcorper. Etiam ultrices nec diam non tempus. Sed vitae lacus et leo
361 + finibus elementum. Suspendisse potenti. Fusce tincidunt mattis sapien
362 + nec maximus.
363 + </p>
364 + <p>
365 + Aenean ultricies purus sit amet dapibus vehicula. Fusce quis libero
366 + orci. Vestibulum interdum rutrum augue eget ornare. Nullam euismod
367 + tellus a erat ornare, sed feugiat est sodales. Donec iaculis orci nisl.
368 + Nulla ligula nisi, euismod in varius et, consectetur eget lorem. Vivamus
369 + eu magna vel turpis interdum varius non non magna. Pellentesque sit amet
370 + velit eget justo eleifend pharetra.
371 + </p>
372 + <p>
373 + Fusce scelerisque sapien magna, eget mollis orci tincidunt a. Quisque at
374 + dolor iaculis, euismod quam et, facilisis risus. Morbi eget tincidunt
375 + turpis, nec sodales sem. Morbi ut sem eget dui pretium molestie eget ac
376 + neque. Proin scelerisque tellus sed congue tincidunt. Suspendisse
377 + sagittis condimentum elit, at lobortis mauris varius ut. Proin bibendum
378 + ultricies maximus. Suspendisse tempor orci ultrices diam tristique
379 + maximus.
380 + </p>
381 + <p>
382 + Cras et odio id ex eleifend varius ac at metus. Class aptent taciti
383 + sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
384 + Proin congue quam efficitur sapien vestibulum pretium. Nulla fringilla,
385 + augue ac consectetur maximus, nibh ligula elementum risus, eget
386 + tincidunt dui sapien eu libero. Phasellus quis nulla quis nunc pretium
387 + faucibus. Quisque vel lacinia massa, ac rhoncus nulla. Nullam a erat non
388 + quam ultricies maximus. Donec non dui ac nisl aliquet eleifend. Praesent
389 + elementum nunc eu ultrices viverra. Maecenas congue, tortor ut fringilla
390 + sollicitudin, purus ligula aliquet neque, vel egestas ex lorem sit amet
391 + nisl. Fusce dignissim leo quis ante placerat, eu interdum dolor
392 + tristique. In porttitor vestibulum ante, sit amet imperdiet nulla
393 + facilisis a. Duis posuere auctor orci, ut tristique nulla. Morbi congue
394 + ante dignissim lacus varius, ac volutpat felis fermentum. Morbi ipsum
395 + mi, tincidunt vitae nunc vel, molestie porta ante.
396 + </p>
397 + <p>
398 + Sed sollicitudin mauris a iaculis porta. Nunc sit amet congue lorem, vel
399 + porta est. Nulla a nibh suscipit, cursus mi nec, rhoncus enim. Cras
400 + hendrerit faucibus dui, sit amet viverra sem ultricies sit amet.
401 + Pellentesque non luctus orci, ornare porttitor dolor. Cras id tincidunt
402 + justo. Integer vestibulum, libero ac convallis malesuada, quam quam
403 + feugiat sapien, ac eleifend sapien ante eget leo. Aenean eu nisl nisl.
404 + Pellentesque et congue nunc. Integer odio ante, laoreet eu lectus in,
405 + auctor blandit diam. Maecenas ultrices gravida magna, in mattis leo
406 + aliquam ut.
407 + </p>
408 + <p>
409 + Pellentesque nec felis at felis auctor congue. Integer ut finibus lacus.
410 + Nullam viverra porttitor elit, non rutrum metus auctor sit amet. Lorem
411 + ipsum dolor sit amet, consectetur adipiscing elit. Integer vitae tellus
412 + a nunc sodales placerat. Class aptent taciti sociosqu ad litora torquent
413 + per conubia nostra, per inceptos himenaeos. Maecenas egestas rhoncus
414 + quam, quis eleifend massa condimentum vel. In id nunc a tortor
415 + pellentesque congue sed ac arcu. Cras vestibulum quis leo sed pulvinar.
416 + Nulla nec commodo urna. Aliquam maximus vel ex sed efficitur. Praesent
417 + tincidunt, metus sed facilisis mattis, felis ex mollis leo, sit amet
418 + tincidunt ante tellus sit amet mi.
419 + </p>
420 + <p>
421 + Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
422 + inceptos himenaeos. Aliquam erat volutpat. Duis porta efficitur rhoncus.
423 + Phasellus viverra nunc tellus, in mollis augue tempor non. Nullam at
424 + metus urna. Fusce vitae ligula eu lectus vulputate porta. Nullam
425 + convallis, nulla in placerat ultrices, lorem nunc lobortis diam, ac
426 + sodales quam orci a mi. Ut sodales placerat lectus id aliquet. Morbi
427 + vestibulum, eros et sodales molestie, felis justo aliquet dui, vitae
428 + dignissim tortor sapien vel quam. Nunc in pretium metus. Aliquam erat
429 + justo, vestibulum quis arcu sed, luctus sagittis lacus. Nam consectetur
430 + efficitur volutpat.
431 + </p>
432 + <p>
433 + Etiam odio lorem, tincidunt a convallis eu, vestibulum eu massa. Integer
434 + faucibus sed purus sed malesuada. Sed sollicitudin, nisi at fermentum
435 + accumsan, eros odio luctus nisl, vel placerat ante turpis at metus.
436 + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque
437 + faucibus dui odio, imperdiet aliquam ex ullamcorper ac. Aenean leo ex,
438 + tincidunt sit amet venenatis eget, congue in elit. Vestibulum tempus
439 + iaculis nunc vitae volutpat. Nullam eu maximus risus. Cras ut volutpat
440 + nulla, et pulvinar orci. Nunc et vestibulum mauris. Donec sit amet nunc
441 + hendrerit, malesuada neque non, malesuada neque. Aenean id sagittis
442 + massa. Morbi non lectus ipsum. Donec facilisis fermentum augue non
443 + laoreet. Nunc pulvinar tincidunt lacus laoreet condimentum. Aliquam
444 + rutrum ultricies diam ac maximus.
445 + </p>
446 + <p>
447 + Sed sagittis nisi ut metus imperdiet, sed tempus sem ornare. Duis
448 + vehicula interdum mauris, eu facilisis sapien egestas et. Donec eget
449 + libero neque. Curabitur volutpat dolor sit amet neque ultrices, vitae
450 + viverra ipsum congue. Cras et quam ullamcorper, tempor nisi vel,
451 + convallis lectus. Donec sagittis, felis vitae finibus auctor, neque odio
452 + mollis sapien, quis euismod lacus mi et augue. Vestibulum tincidunt
453 + lorem vel auctor dictum. Nam ultrices nisi at blandit dignissim.
454 + </p>
455 + <p>
456 + Proin cursus, erat a hendrerit dictum, urna nisl laoreet orci, vel
457 + posuere libero arcu vitae purus. Etiam ac nulla sit amet ligula feugiat
458 + aliquam eu et ex. In hac habitasse platea dictumst. Nullam id
459 + condimentum justo, quis vulputate enim. Donec consequat fringilla ipsum
460 + sit amet vulputate. Suspendisse potenti. Etiam iaculis lorem non
461 + facilisis aliquam. Ut at lobortis leo. Aenean fermentum augue vel leo
462 + vehicula condimentum et vitae ex.
463 + </p>
464 + <p>
465 + Etiam auctor arcu placerat, semper turpis non, aliquet lorem. Proin
466 + auctor pharetra augue vitae tempus. Duis semper magna metus. Nam quis
467 + nunc non augue mattis porta nec sed est. Sed at porta tortor. Fusce eget
468 + consequat turpis, et dignissim enim. Ut non mollis erat, nec volutpat
469 + ipsum. Vivamus eget felis ipsum. Nullam aliquet bibendum semper. Proin
470 + id sapien eget libero ultricies iaculis. Praesent dictum mauris et justo
471 + porttitor luctus. Mauris imperdiet est eget feugiat egestas. Aenean
472 + cursus facilisis ipsum, sed convallis eros vulputate ut. Vivamus laoreet
473 + urna vel justo molestie tincidunt. Sed tristique justo quis nunc
474 + tincidunt, viverra aliquet lorem sodales. Nam aliquam venenatis turpis,
475 + quis accumsan lorem gravida nec.
476 + </p>
477 + <p>
478 + Interdum et malesuada fames ac ante ipsum primis in faucibus. Curabitur
479 + eget sapien in ipsum suscipit aliquam. Phasellus dui nulla, egestas quis
480 + orci in, pulvinar hendrerit tellus. Sed faucibus, urna non dignissim
481 + sollicitudin, turpis arcu imperdiet velit, ut tristique lacus lorem
482 + bibendum elit. Donec ullamcorper justo nisl, nec rhoncus purus venenatis
483 + quis. Praesent vestibulum venenatis erat, sit amet iaculis risus
484 + ullamcorper at. Aenean ligula odio, pulvinar vitae metus placerat, porta
485 + finibus enim. Etiam suscipit, odio vel accumsan varius, lorem leo
486 + consectetur magna, id bibendum est dolor varius nibh. Nullam erat ante,
487 + placerat ac ante sed, suscipit gravida nunc. Vivamus euismod fermentum
488 + dolor, eu fermentum est dictum in.
489 + </p>
490 + <p>
491 + Interdum et malesuada fames ac ante ipsum primis in faucibus. Nullam
492 + placerat volutpat iaculis. Morbi ligula felis, congue non hendrerit
493 + vitae, ultricies eu felis. Fusce elementum, lorem id ultricies semper,
494 + purus libero vulputate turpis, vitae pellentesque enim nisi vel urna.
495 + Nunc mi odio, dapibus id velit eu, commodo varius sapien. Donec et nulla
496 + volutpat, semper ipsum ac, molestie enim. Vivamus non quam mattis,
497 + viverra massa nec, maximus lectus. Aliquam eleifend dolor quis fringilla
498 + tincidunt. Donec tincidunt suscipit urna efficitur hendrerit. Cras
499 + lectus metus, vulputate vitae dolor eu, condimentum lobortis nisi. Sed
500 + sodales elementum orci. Suspendisse hendrerit tortor nulla.
501 + </p>
502 + <p>
503 + Proin bibendum vel justo non fringilla. Praesent auctor at tortor et
504 + eleifend. Sed finibus tempor interdum. Sed dui diam, feugiat dictum
505 + faucibus sit amet, dictum ut lacus. Suspendisse consectetur varius
506 + fringilla. In sit amet leo nunc. Maecenas mollis mauris ut arcu rutrum
507 + finibus. Pellentesque magna elit, efficitur at nisl ac, porta
508 + scelerisque nisl. In vitae metus a libero euismod vestibulum. Donec
509 + faucibus augue at dolor volutpat gravida. Vivamus feugiat sagittis leo
510 + id hendrerit. Quisque placerat, augue at eleifend tempor, nibh lorem
511 + sodales orci, quis maximus eros diam in dui. Pellentesque habitant morbi
512 + tristique senectus et netus et malesuada fames ac turpis egestas. Nunc
513 + luctus mauris scelerisque, ullamcorper erat a, volutpat diam. Mauris id
514 + lacinia turpis. Proin in ligula bibendum, molestie leo ut, accumsan
515 + elit.
516 + </p>
517 + <p>
518 + Integer tempus, elit ac tincidunt iaculis, nibh quam rutrum augue, at
519 + maximus quam ligula non odio. Integer commodo ullamcorper tempor. Mauris
520 + vestibulum, nisi eu maximus bibendum, sem est eleifend magna, porttitor
521 + dignissim nulla lorem id ante. Aliquam erat volutpat. Donec vitae
522 + ullamcorper quam, lobortis porttitor eros. Quisque vitae tempor eros.
523 + Sed faucibus a arcu suscipit suscipit. Etiam eros justo, aliquet at
524 + velit id, tempor rutrum elit. Quisque et purus sit amet felis lacinia
525 + condimentum. Suspendisse potenti. Nunc ex mi, commodo blandit tempus in,
526 + tempor vel lacus. Cras urna enim, tempor eget lacus sit amet, accumsan
527 + maximus ligula. Donec quis lorem quam. Etiam at est ut justo rutrum
528 + bibendum. Vivamus lectus felis, mollis a enim a, tincidunt vehicula
529 + purus.
530 + </p>
531 + <p>
532 + Phasellus vehicula congue sapien, in volutpat felis posuere id. Aliquam
533 + non urna eu purus placerat sollicitudin id a elit. Morbi pharetra est
534 + non augue porttitor, sed volutpat ipsum fermentum. Fusce sed velit
535 + risus. Sed id dolor ac dolor rhoncus lobortis eu ut leo. In dapibus est
536 + lobortis, dictum nulla in, suscipit risus. Aliquam tincidunt, dolor sit
537 + amet laoreet egestas, eros mi pulvinar nisi, sed varius elit arcu et
538 + massa. Orci varius natoque penatibus et magnis dis parturient montes,
539 + nascetur ridiculus mus. Mauris finibus neque nec gravida aliquet. Etiam
540 + nec neque sem. Donec eget eros ex. Nam porta eget libero vitae
541 + porttitor. In hac habitasse platea dictumst.
542 + </p>
543 + <p>
544 + Integer a dictum urna. Etiam nulla leo, molestie eu hendrerit non,
545 + finibus at tellus. Sed hendrerit non mauris in imperdiet. Donec eleifend
546 + elementum felis eget posuere. Proin in massa rutrum dui tempor bibendum.
547 + Vivamus eget nisi porta tellus tempor volutpat nec non purus. Aenean eu
548 + nisi dolor. Morbi in sodales lectus, at lacinia lacus.
549 + </p>
550 + <p>
551 + Morbi ligula lacus, auctor eu aliquet et, ultricies sagittis odio.
552 + Phasellus in diam a metus congue dapibus ut ac mi. In hac habitasse
553 + platea dictumst. Pellentesque et commodo magna, ut molestie nibh. Donec
554 + ac justo ut nisl pharetra ultrices non vitae diam. Cras convallis erat
555 + nulla, ac consequat justo condimentum vitae. Etiam vitae magna vitae
556 + risus molestie luctus vitae at ipsum. Duis in nisl interdum risus
557 + facilisis pretium. Donec tempus elementum faucibus. Etiam eu molestie
558 + elit, ac egestas sem. Sed consequat diam vel venenatis pharetra.
559 + Vestibulum efficitur eget sapien in ultricies.
560 + </p>
561 + <p>
562 + Nunc mauris magna, scelerisque vel aliquam ultrices, tincidunt vel nisl.
563 + Duis luctus quis nisl quis vehicula. Nullam non tristique felis.
564 + Curabitur semper ipsum non lacus dictum ullamcorper. Proin sed sodales
565 + elit. Suspendisse volutpat vehicula elit, nec mattis tortor sagittis ut.
566 + Praesent eu sem enim. Fusce sit amet odio in velit sagittis fringilla.
567 + Nulla facilisi. Pellentesque non massa sit amet ligula vehicula
568 + vestibulum ac et lorem. Ut elementum orci orci, ut facilisis massa
569 + cursus in.
570 + </p>
571 + <p>
572 + Praesent ultrices urna eu ultrices ultricies. Phasellus sapien purus,
573 + accumsan quis dui a, tempor ornare augue. Pellentesque tempor dolor et
574 + placerat dapibus. Pellentesque fermentum dictum tellus vitae elementum.
575 + Morbi in erat pharetra, posuere odio et, semper nisl. Integer quis
576 + consectetur massa. Sed ac mi elit. Fusce aliquam enim nulla, in
577 + consequat urna dignissim sit amet. Duis porttitor placerat elit vel
578 + ornare. Praesent malesuada dictum mollis. Suspendisse vitae sem quis
579 + felis posuere finibus. Donec a porta metus. Class aptent taciti sociosqu
580 + ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus
581 + mattis tempor sapien, non scelerisque turpis auctor venenatis. Aenean
582 + sed metus vitae orci facilisis luctus. Pellentesque vestibulum varius
583 + gravida.
584 + </p>
585 + <p>
586 + Nulla id elit sit amet ligula aliquam tristique. Vestibulum eleifend
587 + suscipit velit a rutrum. Suspendisse ultrices iaculis libero ut
588 + ullamcorper. Vivamus interdum dignissim mi, vitae tempus lectus
589 + tristique non. Fusce consectetur feugiat fermentum. Donec sagittis non
590 + est vel porttitor. Pellentesque iaculis massa vitae quam lobortis
591 + vehicula accumsan in elit. Aliquam erat volutpat. Nam sit amet metus
592 + odio. Nulla condimentum justo eget purus interdum faucibus. Quisque
593 + facilisis nisl blandit, gravida nisl in, ornare neque.
594 + </p>
595 + <p>
596 + Orci varius natoque penatibus et magnis dis parturient montes, nascetur
597 + ridiculus mus. Donec sed nunc vel lacus ornare dictum. Donec lacinia
598 + iaculis sollicitudin. Nunc tempor eleifend ligula in dignissim.
599 + Suspendisse id accumsan tellus. Praesent vulputate elit est, sed
600 + sagittis neque suscipit ut. Etiam in tincidunt ipsum.
601 + </p>
602 + <p>
603 + Praesent tincidunt lectus eu nisl eleifend varius. Sed rutrum imperdiet
604 + lorem, a volutpat augue posuere elementum. Praesent luctus aliquam
605 + ligula id mollis. Curabitur lorem nisl, vulputate sit amet velit
606 + dapibus, dictum aliquet nisl. Donec vitae ornare magna, ut facilisis
607 + ipsum. Vestibulum volutpat ligula et ipsum hendrerit vehicula. Donec
608 + scelerisque accumsan turpis sit amet porta.
609 + </p>
610 + <p>
611 + Curabitur aliquet varius felis, sit amet condimentum urna commodo vitae.
612 + Pellentesque eget nisl tincidunt, dictum quam ut, feugiat est. In
613 + vulputate metus at nunc faucibus aliquam. Aenean vulputate, nunc at
614 + pharetra iaculis, dui lacus porta diam, id consectetur magna magna ac
615 + massa. Class aptent taciti sociosqu ad litora torquent per conubia
616 + nostra, per inceptos himenaeos. Ut dapibus sollicitudin neque, tempor
617 + luctus dui lacinia ac. Fusce quis ex id ligula varius feugiat eget et
618 + enim. Pellentesque bibendum elit massa, vel tempor neque gravida quis.
619 + Nulla facilisi. Etiam ut mauris sit amet ipsum imperdiet venenatis. Ut
620 + porta vestibulum dolor eu suscipit. Vivamus mollis interdum ipsum sed
621 + posuere.
622 + </p>
623 + <p>
624 + Aliquam tristique mi eget lacinia maximus. Ut auctor leo sit amet risus
625 + sodales, quis tempor justo accumsan. Sed eu tincidunt risus. Suspendisse
626 + orci metus, rutrum sit amet risus non, lobortis facilisis augue. Nunc
627 + dolor turpis, posuere ut condimentum nec, euismod sed eros. Donec mattis
628 + dignissim mi in pulvinar. Curabitur ut metus magna. Nulla facilisi.
629 + </p>
630 + <p>
631 + Proin vel porttitor ipsum. Fusce in lectus in ipsum bibendum mollis.
632 + Donec pellentesque iaculis tincidunt. Etiam sit amet mi porttitor,
633 + condimentum nibh non, dictum purus. Nulla dapibus suscipit maximus. Cras
634 + eu dignissim libero. Pellentesque habitant morbi tristique senectus et
635 + netus et malesuada fames ac turpis egestas. Praesent tempor placerat
636 + tincidunt. Vestibulum nec sapien blandit, mollis neque rhoncus,
637 + sollicitudin sapien. Donec et consequat enim.
638 + </p>
639 + <p>
640 + Pellentesque fringilla egestas sapien eget egestas. Curabitur malesuada
641 + elit quis nulla pretium, aliquam semper orci pharetra. In pellentesque,
642 + metus quis tempus aliquet, ligula lorem scelerisque ligula, ut maximus
643 + risus orci hendrerit lectus. Fusce in quam non turpis ultricies pulvinar
644 + sed id nunc. Nullam blandit varius risus eget ultricies. Cras ut dolor
645 + et elit eleifend ornare. In hac habitasse platea dictumst. Lorem ipsum
646 + dolor sit amet, consectetur adipiscing elit. Suspendisse sollicitudin
647 + vitae nibh eget pellentesque. Nam luctus congue massa, sed semper mauris
648 + tincidunt non. Nulla facilisi. Suspendisse quis rutrum leo. Donec
649 + aliquam sem nibh, quis egestas augue egestas vitae. Duis consequat
650 + sapien eget sem venenatis ornare. Curabitur tincidunt lobortis orci, nec
651 + viverra justo pulvinar tincidunt. Maecenas iaculis bibendum est, nec
652 + dapibus massa tempor quis.
653 + </p>
654 + <p>
655 + Aliquam in nulla eget erat euismod posuere. Proin consectetur, lorem eu
656 + fringilla posuere, ante quam imperdiet ligula, quis suscipit neque risus
657 + ac est. Fusce congue nibh viverra nibh aliquet, sit amet ullamcorper
658 + lectus lacinia. Fusce quis auctor diam. Orci varius natoque penatibus et
659 + magnis dis parturient montes, nascetur ridiculus mus. Etiam tristique
660 + elit ac arcu interdum ullamcorper. Pellentesque lobortis sollicitudin
661 + metus sit amet faucibus. Sed vehicula elementum justo vel egestas.
662 + Suspendisse varius laoreet lacinia. Nullam eget venenatis lacus. Aliquam
663 + in orci consequat, rhoncus ligula in, faucibus lorem. Maecenas feugiat
664 + luctus tristique. Nunc turpis felis, pellentesque sed molestie ac,
665 + cursus eu arcu. In vitae metus hendrerit, interdum tortor eget,
666 + scelerisque sem. Proin quis tortor libero. Sed euismod cursus tortor,
667 + nec pellentesque magna.
668 + </p>
669 + <p>
670 + In a ex accumsan, semper nisl vitae, porttitor turpis. Morbi sed blandit
671 + tortor, vitae venenatis ex. Mauris eu fermentum nunc, vitae rutrum
672 + neque. Donec eu diam vulputate, venenatis sem dictum, placerat magna.
673 + Cras ante enim, imperdiet eu lacinia ut, tempor eget lectus. Praesent
674 + molestie turpis massa, sed commodo mauris dignissim at. Etiam ultrices
675 + ex a purus mollis varius. Ut ac erat diam. Maecenas laoreet massa purus.
676 + </p>
677 + <p>
678 + Suspendisse luctus leo egestas est vulputate consectetur. Sed porttitor
679 + nisi id orci lobortis consectetur. Praesent id neque ac eros tincidunt
680 + mollis ac eget mi. Aliquam fringilla lorem ligula, quis maximus tortor
681 + mattis vitae. Pellentesque faucibus neque vel commodo blandit. Integer a
682 + dictum mi, id auctor metus. Vestibulum efficitur ornare felis eu
683 + lobortis. Quisque ac viverra eros. Ut mattis accumsan justo.
684 + </p>
685 + <p>
686 + Curabitur convallis tellus neque, a ornare dui pulvinar ut. Nulla
687 + sagittis sit amet tellus quis dignissim. Aliquam convallis commodo
688 + tellus vitae ultricies. Pellentesque habitant morbi tristique senectus
689 + et netus et malesuada fames ac turpis egestas. Proin nunc augue, maximus
690 + at eros in, iaculis lobortis turpis. Aliquam ut sapien sit amet ante
691 + condimentum sollicitudin. Quisque rhoncus sollicitudin imperdiet.
692 + Integer luctus laoreet maximus. Donec pulvinar porta metus, sit amet
693 + tristique erat tempor at. In convallis mi quis justo pretium varius sit
694 + amet nec diam. Suspendisse potenti. Morbi pulvinar tristique elit id
695 + semper. Donec pulvinar cursus volutpat.
696 + </p>
697 + <p>
698 + Nulla consequat felis felis, sed vehicula turpis rhoncus a. Suspendisse
699 + potenti. Sed tortor ante, aliquet in eros in, tempor finibus diam.
700 + Aliquam neque lorem, commodo pretium vestibulum id, tincidunt vel ipsum.
701 + Nunc feugiat augue a magna tempor, vitae suscipit est elementum. Proin
702 + imperdiet dui ante, ut auctor nulla consequat sed. Aenean bibendum massa
703 + a lectus egestas, nec posuere nisi tempor. Praesent et rhoncus magna.
704 + Maecenas nec diam vitae risus malesuada sodales nec id risus. Mauris
705 + pulvinar mi at nulla feugiat, nec faucibus ex efficitur. Aenean a risus
706 + vel diam commodo congue nec et purus. Curabitur lobortis hendrerit nibh
707 + sed feugiat. Praesent sollicitudin porttitor mauris, consequat consequat
708 + odio vulputate eget. Quisque convallis velit quam, ut ornare sem
709 + faucibus et. In posuere ullamcorper hendrerit. Nam vel sapien risus.
710 + </p>
711 + <p>
712 + Mauris venenatis nunc sit amet diam faucibus accumsan. Maecenas sed
713 + augue nec dolor eleifend placerat vulputate eu metus. Aliquam eu purus
714 + quis orci dapibus aliquam id ut elit. Quisque ornare, dui blandit
715 + ullamcorper posuere, magna urna dictum est, sit amet faucibus magna mi
716 + eu neque. Cras sodales aliquet sem, ac vulputate eros facilisis
717 + interdum. Duis ut gravida neque. Sed facilisis lectus et lorem finibus
718 + imperdiet. Vestibulum quis libero et nunc tristique suscipit. Ut at
719 + purus tortor.
720 + </p>
721 + <p>
722 + Sed dolor est, mattis eget molestie in, convallis a odio. Nulla quis
723 + consectetur metus. Nulla et lacus blandit, rutrum eros sit amet,
724 + condimentum lectus. Suspendisse feugiat felis dignissim eros accumsan
725 + feugiat. Etiam lobortis orci massa, vel rutrum urna feugiat vel. Donec
726 + mollis nisl eget ex laoreet aliquet. Donec neque arcu, finibus et nisl
727 + sed, ultricies facilisis nibh. Sed condimentum tortor est, ut dignissim
728 + nulla bibendum et. Donec sagittis posuere est dictum tempor.
729 + </p>
730 + <p>
731 + Vestibulum pretium justo metus, eget lobortis augue consectetur at.
732 + Quisque sodales magna quis consectetur eleifend. Duis eu dapibus erat.
733 + Donec eros nibh, facilisis eu neque at, egestas commodo purus.
734 + Pellentesque id urna erat. Aenean lacinia diam eu leo convallis, et
735 + volutpat justo dignissim. Etiam id dolor elementum, porta dui at, porta
736 + arcu. Proin elementum ac ex sit amet viverra. Aenean nec sagittis magna.
737 + </p>
738 + <p>
739 + Aliquam suscipit est sed ipsum finibus laoreet. Proin porta lacus in
740 + neque sollicitudin, non posuere lacus luctus. Cras ultricies imperdiet
741 + tempor. Nulla sit amet magna facilisis, semper nunc a, placerat nunc.
742 + Cras commodo, sapien vitae bibendum ornare, odio mi iaculis leo, eu
743 + volutpat risus libero id turpis. Morbi sollicitudin, augue nec dictum
744 + dignissim, nulla tortor tincidunt eros, nec finibus metus leo ac nisi.
745 + Mauris rhoncus, urna sed lacinia posuere, ante magna suscipit arcu,
746 + vitae vestibulum lacus odio vel ligula. Integer aliquam euismod
747 + ullamcorper. Vestibulum ante ipsum primis in faucibus orci luctus et
748 + ultrices posuere cubilia curae; Integer non lectus massa. In ac odio
749 + condimentum urna aliquet aliquam sed nec ligula. Sed ut dolor varius
750 + felis eleifend tincidunt quis sed sapien.
751 + </p>
752 + <p>
753 + Vestibulum ornare tellus orci, a pretium libero congue et. Praesent in
754 + egestas diam, quis fermentum nisl. Vivamus eu scelerisque metus, et
755 + sagittis justo. Aenean pulvinar justo felis, at cursus ante gravida ut.
756 + Mauris tristique mi placerat rutrum elementum. Vestibulum porta sagittis
757 + ligula, ut tristique urna egestas eget. Aliquam et sagittis turpis.
758 + Vestibulum accumsan nunc in nibh iaculis, eget pretium justo elementum.
759 + Donec varius ex sed quam pellentesque, eu auctor dolor pulvinar.
760 + </p>
761 + <p>
762 + Nulla et purus lacus. Sed fringilla finibus sodales. Etiam venenatis dui
763 + vitae felis condimentum, vitae venenatis orci vulputate. Phasellus
764 + rhoncus arcu id vehicula pretium. Sed sit amet dolor arcu. Fusce nec
765 + commodo risus. Orci varius natoque penatibus et magnis dis parturient
766 + montes, nascetur ridiculus mus.
767 + </p>
768 + <p>
769 + Nam sit amet dapibus est. Mauris imperdiet ex ac elit mattis tempus. Nam
770 + placerat felis eu mauris commodo euismod. In hac habitasse platea
771 + dictumst. Quisque auctor nec arcu quis varius. Integer iaculis est sed
772 + egestas elementum. Aenean gravida auctor erat sed efficitur. Donec
773 + sapien urna, condimentum at libero eu, viverra porta metus. Proin
774 + sodales erat lorem, eget hendrerit massa dictum vitae. Quisque sit amet
775 + fringilla ex. Vivamus lobortis tempor nulla, id feugiat neque aliquet
776 + et. Cras et placerat turpis, sed hendrerit justo. Ut in placerat risus.
777 + Praesent id nibh eu velit consequat efficitur eget nec magna.
778 + </p>
779 + <p>
780 + Praesent nec consequat nisi. Integer ac nulla eget nunc condimentum
781 + lobortis ac non lacus. In eu porta magna. Etiam dapibus ultrices turpis,
782 + vel placerat tellus lacinia non. Pellentesque aliquam libero in massa
783 + sodales, nec tincidunt ligula pretium. Nulla blandit neque turpis, nec
784 + accumsan nibh pulvinar blandit. Cras facilisis gravida placerat.
785 + Curabitur pellentesque velit quis lorem imperdiet vulputate viverra in
786 + metus. Proin et tellus dictum dui lacinia varius ac ut metus. Nullam
787 + dignissim eros erat, id dignissim ante sagittis sit amet. Sed lobortis,
788 + quam volutpat rutrum consequat, velit nunc lobortis eros, at ultricies
789 + ex nibh sit amet ligula. Phasellus tempor mi at dolor consequat, eget
790 + sodales mauris consequat. Orci varius natoque penatibus et magnis dis
791 + parturient montes, nascetur ridiculus mus. Aliquam convallis ex vel
792 + lectus bibendum, in gravida lectus dictum. Orci varius natoque penatibus
793 + et magnis dis parturient montes, nascetur ridiculus mus. Curabitur
794 + volutpat lectus quis magna interdum ornare.
795 + </p>
796 + <p>
797 + Pellentesque rutrum maximus purus vitae commodo. Vivamus imperdiet vitae
798 + mi sit amet cursus. Nullam bibendum consequat felis at tincidunt.
799 + Quisque pellentesque diam leo, eget vestibulum risus gravida quis.
800 + Phasellus ipsum sapien, scelerisque eget nisi eu, sodales fringilla est.
801 + Nam purus lacus, euismod eget sem et, accumsan auctor lectus. Sed
802 + porttitor ex non nunc commodo, et posuere erat hendrerit. Praesent eu
803 + dolor id dolor ullamcorper cursus at eu risus. Nam tincidunt, ipsum in
804 + tempus tristique, neque quam tempus mauris, quis fringilla quam purus
805 + vitae elit. Maecenas finibus efficitur consequat. Curabitur et suscipit
806 + nibh. Cras eleifend ultricies molestie.
807 + </p>
808 + <p>
809 + Fusce eu hendrerit nisl. Etiam at arcu in nisl aliquam ultricies sit
810 + amet ut orci. Class aptent taciti sociosqu ad litora torquent per
811 + conubia nostra, per inceptos himenaeos. Quisque volutpat ex quis ante
812 + lobortis dignissim. Fusce pulvinar sodales aliquam. Mauris felis augue,
813 + vulputate non nunc vitae, mollis volutpat odio. Suspendisse lobortis
814 + ligula nec dolor hendrerit aliquet.
815 + </p>
816 + <p>
817 + Suspendisse gravida, diam vitae rutrum varius, mauris erat lacinia mi,
818 + non fringilla nisi lorem eget lectus. Suspendisse iaculis condimentum
819 + eros, quis sodales turpis maximus ut. Sed congue posuere mi at congue.
820 + Phasellus eget lacus vitae urna molestie aliquet sed sed felis. Donec
821 + fermentum urna at dolor condimentum consectetur. Aenean sed pretium
822 + tortor. Suspendisse sed lectus risus. Sed sapien erat, tincidunt
823 + scelerisque urna vitae, congue condimentum est. Mauris eget urna id
824 + purus vestibulum lacinia ut non augue. Nunc id elementum nisi, interdum
825 + sollicitudin neque. Pellentesque massa risus, varius nec leo nec, mollis
826 + cursus nisl. Mauris aliquet hendrerit risus. Vestibulum congue interdum
827 + massa, ac ultrices nibh mollis id. Phasellus justo lorem, malesuada sit
828 + amet accumsan vel, mollis ut urna.
829 + </p>
830 + <p>
831 + Curabitur nec tortor sodales, maximus diam in, efficitur quam. Ut rutrum
832 + mi id libero tristique luctus. Phasellus et neque sollicitudin purus
833 + interdum dapibus eget at ex. Duis non mi at massa molestie tempor a sed
834 + tortor. In placerat metus nec condimentum fermentum. Maecenas varius
835 + velit in velit tempus dignissim fermentum id justo. Pellentesque
836 + dignissim tempus porttitor. Fusce scelerisque bibendum sagittis. Donec
837 + tristique tellus ut placerat auctor. Nunc porta tempus risus, at maximus
838 + quam lobortis id.
839 + </p>
840 + <p>
841 + Vivamus volutpat tortor sed justo lobortis porttitor. Etiam a aliquam
842 + lorem. Nullam rutrum accumsan augue, eget sagittis tellus posuere nec.
843 + Aliquam dignissim urna at tellus blandit fermentum. Nunc fermentum justo
844 + ut odio pharetra fringilla. Nunc aliquet eleifend magna nec mattis.
845 + Pellentesque ac tristique dui. Suspendisse nec nunc et lorem tincidunt
846 + congue egestas nec tortor. Suspendisse tincidunt eros felis, nec
847 + ultricies turpis varius ut. Morbi leo sapien, eleifend vitae aliquet at,
848 + suscipit ut arcu. Nulla pretium placerat nunc, quis tempus lorem semper
849 + sit amet. Vestibulum tempus, libero ut ultricies egestas, nisi ex mollis
850 + diam, vel porta nisl augue vitae nulla. Nullam ante ipsum, convallis
851 + finibus sem id, hendrerit ultrices velit. Praesent tincidunt, urna ac
852 + viverra facilisis, nisi massa eleifend sapien, ac congue leo ex vitae
853 + lorem. Cras at pulvinar elit, non vestibulum urna.
854 + </p>
855 + <p>
856 + Quisque consectetur posuere erat, eget finibus turpis semper in. Ut
857 + commodo leo turpis, a elementum tortor lacinia id. Nunc tempor ligula eu
858 + nunc semper porta. Maecenas luctus turpis in justo faucibus iaculis.
859 + Integer rutrum, nunc ac tincidunt pellentesque, velit ipsum gravida
860 + urna, a pretium nunc eros eget dui. Phasellus maximus consectetur elit,
861 + in fermentum odio interdum id. In feugiat tincidunt semper. Phasellus
862 + porta ultricies orci a gravida. Etiam lobortis velit sapien, vitae
863 + consectetur felis laoreet at. Morbi ac metus velit. Aliquam mollis neque
864 + at purus tempus lobortis.
865 + </p>
866 + <p>
867 + Ut ornare justo nec euismod iaculis. Orci varius natoque penatibus et
868 + magnis dis parturient montes, nascetur ridiculus mus. In sit amet
869 + tristique sem. Donec ut tincidunt eros, nec sagittis risus. Morbi at
870 + tellus leo. Cras eu feugiat velit. Praesent a fermentum urna, eget
871 + dapibus felis. Nullam tempor dictum neque semper faucibus. Vestibulum et
872 + sem accumsan, dignissim metus quis, pretium massa. Proin vestibulum
873 + convallis ante, at tempor metus rhoncus vitae. Nunc bibendum nisi ac
874 + magna viverra condimentum. Sed vehicula neque ex, ut auctor leo mollis
875 + eu. Etiam dapibus pellentesque diam, eget cursus odio. Proin sit amet
876 + eleifend est. In eget ex vitae tellus mattis dictum.
877 + </p>
878 + <p>
879 + Vestibulum ullamcorper ut felis vitae placerat. Proin suscipit orci
880 + sapien, in tincidunt magna tempor at. Proin ut dui sed sapien mattis
881 + sollicitudin. Aliquam id velit vitae nunc tincidunt sagittis vitae ut
882 + enim. Nulla vulputate placerat mollis. Nullam facilisis nulla iaculis
883 + risus molestie pulvinar. Quisque iaculis, dui eget vulputate auctor,
884 + lacus turpis ultricies diam, vel faucibus sem nulla quis orci. Nulla et
885 + commodo massa.
886 + </p>
887 + <p>
888 + Proin aliquet purus ut eros tincidunt dignissim. Phasellus vel diam quis
889 + elit malesuada dignissim. Pellentesque habitant morbi tristique senectus
890 + et netus et malesuada fames ac turpis egestas. Sed pretium at purus sed
891 + tempus. Curabitur pulvinar euismod augue, sed convallis sem tempus
892 + fringilla. Curabitur a dictum arcu. Vivamus finibus ante nec ante
893 + consequat venenatis. Nulla mi magna, placerat ut laoreet non, lobortis
894 + nec lorem. Curabitur quis pharetra arcu. Sed sit amet diam in diam
895 + tincidunt iaculis eget a leo. Fusce laoreet felis vitae tristique
896 + efficitur. Fusce feugiat risus non mi scelerisque, nec fringilla risus
897 + efficitur. Aenean arcu enim, condimentum a neque scelerisque, dignissim
898 + gravida quam. Praesent viverra euismod sapien, quis tristique diam
899 + dictum id.
900 + </p>
901 + <p>
902 + Fusce convallis vulputate justo in egestas. Proin at dui volutpat,
903 + eleifend lectus at, pretium nulla. Mauris mi ex, rhoncus non sodales
904 + nec, volutpat vel libero. Praesent nisl tellus, egestas non sem a,
905 + malesuada tincidunt magna. Integer condimentum, lacus nec mattis luctus,
906 + urna risus tristique nibh, nec euismod sapien eros a ex. Morbi pharetra,
907 + ex eget dapibus aliquam, ligula leo semper turpis, sit amet ullamcorper
908 + tortor mi sed neque. Proin congue velit urna, a viverra elit consectetur
909 + et. Pellentesque turpis massa, iaculis maximus nibh ac, elementum
910 + aliquet sapien. Aliquam at nulla nec nisi accumsan pharetra ac a velit.
911 + </p>
912 + <p>
913 + Quisque ac vulputate sapien, nec suscipit augue. Integer vehicula
914 + convallis faucibus. Fusce nec felis auctor, scelerisque augue sit amet,
915 + vulputate risus. Nullam suscipit blandit mauris sed ultricies. Sed non
916 + magna non lorem molestie vestibulum. Proin dictum malesuada nisl, nec
917 + efficitur ipsum venenatis et. Nulla non sapien et tortor ultricies
918 + vulputate et id turpis. Etiam consectetur suscipit quam, in fermentum
919 + augue tincidunt eget. Nullam mattis gravida gravida. Sed posuere quam at
920 + accumsan maximus. Nam commodo elit eu sem dapibus, a ullamcorper tortor
921 + elementum. Vivamus et sapien in nibh bibendum semper vel eget lorem. Sed
922 + nec risus erat.
923 + </p>
924 + <p>
925 + Sed porttitor elementum tempor. Integer egestas scelerisque turpis ut
926 + consectetur. Integer eu nisl nisi. Nunc nec ligula eget neque dapibus
927 + feugiat sit amet quis turpis. Nullam volutpat consequat est, et tempor
928 + neque egestas vel. In sit amet massa sem. Sed nibh libero, elementum ac
929 + maximus a, fringilla vel leo. Praesent at sapien ultrices, interdum elit
930 + eget, scelerisque risus.
931 + </p>
932 + <p>
933 + Morbi dictum urna sit amet augue fringilla pellentesque vitae vitae
934 + dolor. Aliquam dignissim, odio nec blandit tempor, diam nulla blandit
935 + urna, nec sagittis sapien libero id libero. Ut libero sem, ultrices non
936 + viverra non, iaculis sed magna. Aenean at dignissim turpis. Donec nibh
937 + dolor, sodales vitae mollis ut, sodales nec arcu. Sed vitae nunc
938 + ullamcorper augue fermentum tincidunt et et sem. Proin erat dolor,
939 + venenatis non leo eget, cursus facilisis urna. Ut non orci sollicitudin,
940 + blandit neque et, molestie ipsum. Pellentesque finibus, nulla vitae
941 + lobortis luctus, magna est ultrices est, ut aliquam elit nisi sit amet
942 + nisl. Suspendisse id sodales nunc. Maecenas tempus mattis diam ac
943 + feugiat. Donec quis efficitur lorem. Vestibulum lobortis dapibus sem, a
944 + ultricies quam feugiat non. Pellentesque consectetur semper nunc non
945 + iaculis.
946 + </p>
947 + <p>
948 + Nulla ullamcorper eros nec ullamcorper pharetra. Quisque eget mi rutrum
949 + nunc hendrerit porta vel nec ex. Sed lacinia arcu ex, eu faucibus ante
950 + porta quis. Phasellus vitae tincidunt enim. Nunc in purus in justo
951 + luctus dignissim. In pellentesque, lorem id dictum consectetur, dolor
952 + massa sodales tellus, eget efficitur odio nunc vestibulum nunc. Donec
953 + sit amet quam eget erat convallis fringilla. Etiam at pretium sem.
954 + Mauris hendrerit justo mauris, ut ornare felis condimentum eu.
955 + Pellentesque habitant morbi tristique senectus et netus et malesuada
956 + fames ac turpis egestas.
957 + </p>
958 + <p>
959 + Cras ut lectus lacus. In maximus, lectus sit amet ultrices venenatis,
960 + quam urna feugiat velit, vel tempor libero est ut diam. Praesent et
961 + ligula sit amet leo egestas vulputate eget non lorem. Integer a diam ac
962 + justo molestie feugiat vel bibendum diam. Donec aliquam, magna vulputate
963 + auctor volutpat, sem nunc pharetra libero, at condimentum purus tortor a
964 + magna. Maecenas non mollis arcu. Aliquam vulputate neque at lectus
965 + gravida sodales.
966 + </p>
967 + <p>
968 + Sed sit amet maximus lectus. Fusce id lorem quis mi sodales varius a
969 + quis justo. Proin est dui, porta non nisl sodales, feugiat faucibus
970 + nisl. Sed id ex consectetur, faucibus eros sit amet, efficitur quam. Ut
971 + vitae venenatis urna, non convallis magna. Integer dapibus ac sem eget
972 + dictum. Integer ut nisi tincidunt, sollicitudin dui vel, faucibus purus.
973 + Nunc rhoncus turpis eget sem commodo, eu ornare lorem vulputate.
974 + Praesent libero nunc, lacinia sit amet lectus vitae, eleifend hendrerit
975 + diam. In nec lacus mattis, rutrum orci fermentum, vestibulum eros. Nunc
976 + a lobortis purus.
977 + </p>
978 + <p>
979 + Duis nisl diam, pharetra non leo id, facilisis sollicitudin tortor.
980 + Donec efficitur augue lorem, lacinia scelerisque magna eleifend in.
981 + Nulla vestibulum dolor nec fermentum maximus. Maecenas facilisis, nisi
982 + at tempor eleifend, quam tortor ultricies tellus, id convallis enim
983 + dolor nec sapien. Pellentesque sed blandit est. Morbi eu nisi
984 + sollicitudin, elementum libero et, tempor justo. Donec et justo quis
985 + dolor semper tempus et at arcu. Donec in sem id erat maximus feugiat.
986 + Cras ultricies nisi turpis, vitae tincidunt sapien mollis ac. Maecenas
987 + efficitur sed lectus a ullamcorper. Ut lacus tellus, viverra vel
988 + consequat et, suscipit a urna. Proin id ultricies arcu. Etiam non
989 + condimentum enim, sodales laoreet orci.
990 + </p>
991 + <p>
992 + Aliquam bibendum bibendum ornare. Aliquam ultricies diam quis dui
993 + maximus, nec dictum velit convallis. Proin tempor scelerisque libero ac
994 + convallis. Cras sollicitudin dignissim ipsum quis iaculis. Sed aliquam
995 + congue magna, vitae malesuada ipsum dignissim porttitor. Maecenas libero
996 + ante, faucibus nec pretium ut, sollicitudin sit amet neque. Donec
997 + sodales risus neque, a tincidunt purus ultrices quis. In mattis nisi
998 + ipsum, et lacinia dui suscipit ac. Donec dictum, dolor id tincidunt
999 + accumsan, tortor lorem posuere nisl, id consequat dui nisi fringilla
1000 + nisi. Fusce arcu justo, ornare nec vehicula eget, egestas tincidunt
1001 + lorem. Nunc dignissim lobortis velit, id efficitur magna aliquam id.
1002 + Donec at massa at purus elementum ornare. Cras id finibus sapien. In hac
1003 + habitasse platea dictumst.
1004 + </p>
1005 + <p>
1006 + Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
1007 + inceptos himenaeos. Nunc et urna leo. Etiam mattis ornare eros. Etiam
1008 + aliquet nibh orci, in iaculis orci pretium id. Etiam nibh elit, viverra
1009 + non viverra eu, imperdiet eu tellus. Pellentesque lobortis leo a finibus
1010 + cursus. Orci varius natoque penatibus et magnis dis parturient montes,
1011 + nascetur ridiculus mus. Donec tristique tempor tristique. Morbi iaculis
1012 + posuere aliquet. Donec mattis sed dui a fringilla. Sed urna tellus,
1013 + pulvinar in mollis ut, congue vel risus.
1014 + </p>
1015 + <p>
1016 + Nullam scelerisque quam at lorem tempus, sed vulputate dui venenatis.
1017 + Donec porttitor, tellus at vehicula laoreet, lacus nulla consectetur
1018 + nisi, ut posuere massa turpis a arcu. Quisque tellus arcu, consectetur
1019 + vitae molestie eu, posuere vitae nunc. Sed vestibulum justo ultricies
1020 + magna rutrum molestie. Pellentesque lobortis erat vel fermentum
1021 + faucibus. Phasellus in arcu sit amet quam tincidunt sollicitudin quis
1022 + sed ipsum. Nullam bibendum ac metus et mollis. Nunc tempor vel mi id
1023 + fermentum. Morbi maximus turpis lobortis, pretium nibh ac, blandit
1024 + metus. In elementum nisl ac ex maximus, in commodo libero egestas. Morbi
1025 + molestie cursus massa, laoreet tempor tortor vestibulum venenatis.
1026 + Curabitur semper fringilla dolor, ut sagittis lorem elementum ut.
1027 + </p>
1028 + <p>
1029 + Duis porttitor massa nulla, id congue erat luctus at. Aliquam id
1030 + tristique quam. Morbi pharetra scelerisque elit. Donec porttitor ipsum
1031 + vitae risus hendrerit faucibus. Praesent finibus placerat leo nec
1032 + facilisis. Vestibulum ante ipsum primis in faucibus orci luctus et
1033 + ultrices posuere cubilia curae; Proin molestie interdum turpis id
1034 + ornare. Ut vestibulum libero in magna porta, sed porta dolor viverra.
1035 + </p>
1036 + <p>
1037 + Duis eget congue orci, ac malesuada leo. Fusce ut mattis nibh. Ut
1038 + pretium lectus in neque hendrerit, ut eleifend neque ultrices. Nam id
1039 + sollicitudin est. Suspendisse eget vehicula urna, a eleifend diam.
1040 + Aenean nibh nisl, finibus ullamcorper cursus sit amet, efficitur gravida
1041 + nulla. Proin leo massa, volutpat sit amet dolor ut, suscipit rutrum
1042 + justo. Proin nec elit blandit, porttitor ipsum sed, sodales ipsum. In
1043 + venenatis dolor lacus. Vestibulum et volutpat augue. Cras vehicula sem
1044 + ac augue vestibulum, id feugiat elit consectetur. Nullam consectetur
1045 + elit enim, eget aliquam eros venenatis eget.
1046 + </p>
1047 + <p>
1048 + Donec sodales ipsum ut ante aliquam, non molestie massa faucibus.
1049 + Aliquam eget vehicula metus. Aenean lacinia nulla quis nulla ultricies
1050 + tristique. Vestibulum sit amet consequat nunc. Nullam sagittis dolor at
1051 + sodales varius. Integer odio eros, sodales quis orci id, commodo luctus
1052 + diam. Nullam dapibus ullamcorper lobortis. Suspendisse posuere ipsum
1053 + ipsum, ac ultrices quam porttitor quis. Maecenas auctor justo et egestas
1054 + congue. Etiam pharetra libero eget nisl rhoncus congue. Cras vehicula
1055 + dolor finibus tortor dignissim ultrices.
1056 + </p>
1057 + <p>
1058 + Vestibulum quis aliquet neque, non pretium ligula. Donec imperdiet
1059 + tellus nec dolor accumsan, at congue ante euismod. Praesent egestas ac
1060 + lectus in auctor. Praesent euismod faucibus enim eget vulputate. Lorem
1061 + ipsum dolor sit amet, consectetur adipiscing elit. Nunc vitae convallis
1062 + tortor. Sed eleifend tellus quis nisl faucibus, sit amet aliquet tellus
1063 + placerat. Morbi ultrices enim mauris, et tincidunt lorem semper sed.
1064 + </p>
1065 + <p>
1066 + Duis tincidunt ligula lacus, a cursus tortor tincidunt ac. Duis nulla
1067 + nulla, viverra sit amet augue vitae, lobortis consequat nibh. Morbi
1068 + dignissim, est nec consequat elementum, dolor est tempus velit, eu
1069 + laoreet mauris nibh eu nunc. Aenean finibus at justo eget consectetur.
1070 + Nam cursus sem felis, vitae blandit quam tincidunt sed. Praesent
1071 + bibendum luctus enim ut tempor. Phasellus tincidunt lectus vel laoreet
1072 + elementum. Maecenas sed quam sodales, porttitor augue in, faucibus eros.
1073 + Cras lacinia tortor sed lacus auctor, sit amet imperdiet dolor
1074 + hendrerit.
1075 + </p>
1076 + <p>
1077 + Aliquam vel porta libero. In nec aliquam nisi. Donec pulvinar sapien
1078 + lacus, eu condimentum enim vestibulum eu. Aliquam erat volutpat. Aliquam
1079 + erat volutpat. Integer ac nisl ipsum. Nulla at congue quam. Etiam nec
1080 + libero ac dolor efficitur sodales ut et diam. Cras in sodales dolor.
1081 + Quisque elementum mattis elit non sagittis.
1082 + </p>
1083 + <p>
1084 + Aliquam maximus nisl semper tristique blandit. Vivamus et porttitor
1085 + urna. Nulla facilisi. Nullam vitae condimentum purus. Lorem ipsum dolor
1086 + sit amet, consectetur adipiscing elit. Nulla dignissim dolor id felis
1087 + pellentesque, quis sodales dolor tincidunt. Morbi non posuere est.
1088 + Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
1089 + cubilia curae;
1090 + </p>
1091 + <p>
1092 + Fusce nec metus sit amet ligula pulvinar lobortis. Suspendisse dictum
1093 + lorem vitae quam tempor facilisis. Duis cursus eu lacus in volutpat.
1094 + Suspendisse fermentum nulla a purus vestibulum, in blandit lacus
1095 + hendrerit. Praesent rhoncus, nulla non varius dapibus, sapien nulla
1096 + blandit lorem, a aliquet ex ligula a sapien. Vivamus ac tortor
1097 + ultricies, molestie ex vitae, placerat elit. Ut lobortis nisl nec sapien
1098 + pretium ullamcorper convallis sed tortor. Suspendisse blandit urna eu
1099 + dolor pharetra, a pretium nibh consequat. Integer at vulputate erat. Nam
1100 + in mi urna. Aenean lectus mauris, condimentum in porttitor et, posuere
1101 + vitae elit. Aenean tempor ipsum ut pharetra porta.
1102 + </p>
1103 + <p>
1104 + Fusce efficitur elementum lectus, vitae euismod leo luctus quis. Duis
1105 + faucibus, metus non rhoncus ornare, neque sapien pretium nisi, ut
1106 + ullamcorper massa justo at turpis. Maecenas vestibulum facilisis nulla
1107 + vel tristique. Aliquam vitae mi dolor. Aliquam imperdiet ullamcorper
1108 + auctor. Sed nibh nulla, imperdiet vel sagittis in, dapibus a turpis. Ut
1109 + pulvinar ac dolor ac euismod. Morbi quis euismod nisl, sagittis interdum
1110 + velit. Integer condimentum quam ac quam malesuada, in ultrices risus
1111 + pulvinar.
1112 + </p>
1113 + </div>
1114 + );
1115 +}
packages/react-client/src/ReactFlightClient.js
+332 -43
@@ -366,6 +366,7 @@ type Response = {
366 _debugRootOwner?: null | ReactComponentInfo, // DEV-only
367 _debugRootStack?: null | Error, // DEV-only
368 _debugRootTask?: null | ConsoleTask, // DEV-only
369 + _debugStartTime: number, // DEV-only
370 _debugFindSourceMapURL?: void | FindSourceMapURLCallback, // DEV-only
371 _debugChannel?: void | DebugChannel, // DEV-only
372 _blockedConsole?: null | SomeChunk<ConsoleEntry>, // DEV-only
@@ -822,6 +823,7 @@ type InitializationReference = {
823 key: string,
824 ) => any,
825 path: Array<string>,
826 + isDebug?: boolean, // DEV-only
827 };
828 type InitializationHandler = {
829 parent: null | InitializationHandler,
@@ -872,6 +874,7 @@ function initializeDebugChunk(
874 response,
875 initializeDebugInfo,
876 [''], // path
877 + true,
878 );
879 break;
880 }
@@ -894,6 +897,7 @@ function initializeDebugChunk(
897 response,
898 initializeDebugInfo,
899 [''], // path
900 + true,
901 );
902 break;
903 }
@@ -1407,8 +1411,6 @@ function fulfillReference(
1411 const mappedValue = map(response, value, parentObject, key);
1412 parentObject[key] = mappedValue;
1413
1410 - transferReferencedDebugInfo(handler.chunk, fulfilledChunk, mappedValue);
1411 -
1414 // If this is the root object for a model reference, where `handler.value`
1415 // is a stale `null`, the resolved value can be used directly.
1416 if (key === '' && handler.value === null) {
@@ -1427,19 +1429,27 @@ function fulfillReference(
1429 const element: any = handler.value;
1430 switch (key) {
1431 case '3':
1432 + transferReferencedDebugInfo(handler.chunk, fulfilledChunk, mappedValue);
1433 element.props = mappedValue;
1434 break;
1435 case '4':
1436 + // This path doesn't call transferReferencedDebugInfo because this reference is to a debug chunk.
1437 if (__DEV__) {
1438 element._owner = mappedValue;
1439 }
1440 break;
1441 case '5':
1442 + // This path doesn't call transferReferencedDebugInfo because this reference is to a debug chunk.
1443 if (__DEV__) {
1444 element._debugStack = mappedValue;
1445 }
1446 break;
1447 + default:
1448 + transferReferencedDebugInfo(handler.chunk, fulfilledChunk, mappedValue);
1449 + break;
1450 }
1451 + } else if (__DEV__ && !reference.isDebug) {
1452 + transferReferencedDebugInfo(handler.chunk, fulfilledChunk, mappedValue);
1453 }
1454
1455 handler.deps--;
@@ -1518,6 +1528,7 @@ function waitForReference<T>(
1528 response: Response,
1529 map: (response: Response, model: any, parentObject: Object, key: string) => T,
1530 path: Array<string>,
1531 + isAwaitingDebugInfo: boolean, // DEV-only
1532 ): T {
1533 if (
1534 __DEV__ &&
@@ -1562,6 +1573,9 @@ function waitForReference<T>(
1573 map,
1574 path,
1575 };
1576 + if (__DEV__) {
1577 + reference.isDebug = isAwaitingDebugInfo;
1578 + }
1579
1580 // Add "listener".
1581 if (referencedChunk.value === null) {
@@ -1865,6 +1879,7 @@ function getOutlinedModel<T>(
1879 response,
1880 map,
1881 path.slice(i - 1),
1882 + false,
1883 );
1884 }
1885 case HALTED: {
@@ -1910,11 +1925,27 @@ function getOutlinedModel<T>(
1925 value = value[path[i]];
1926 }
1927 const chunkValue = map(response, value, parentObject, key);
1913 - transferReferencedDebugInfo(initializingChunk, chunk, chunkValue);
1928 + if (
1929 + parentObject[0] === REACT_ELEMENT_TYPE &&
1930 + (key === '4' || key === '5')
1931 + ) {
1932 + // If we're resolving the "owner" or "stack" slot of an Element array, we don't call
1933 + // transferReferencedDebugInfo because this reference is to a debug chunk.
1934 + } else {
1935 + transferReferencedDebugInfo(initializingChunk, chunk, chunkValue);
1936 + }
1937 return chunkValue;
1938 case PENDING:
1939 case BLOCKED:
1917 - return waitForReference(chunk, parentObject, key, response, map, path);
1940 + return waitForReference(
1941 + chunk,
1942 + parentObject,
1943 + key,
1944 + response,
1945 + map,
1946 + path,
1947 + false,
1948 + );
1949 case HALTED: {
1950 // Add a dependency that will never resolve.
1951 // TODO: Mark downstreams as halted too.
@@ -2452,6 +2483,13 @@ function ResponseInstance(
2483 '"use ' + rootEnv.toLowerCase() + '"',
2484 );
2485 }
2486 + if (enableAsyncDebugInfo) {
2487 + // Track the start of the fetch to the best of our knowledge.
2488 + // Note: createFromFetch allows this to be marked at the start of the fetch
2489 + // where as if you use createFromReadableStream from the body of the fetch
2490 + // then the start time is when the headers resolved.
2491 + this._debugStartTime = performance.now();
2492 + }
2493 this._debugFindSourceMapURL = findSourceMapURL;
2494 this._debugChannel = debugChannel;
2495 this._blockedConsole = null;
@@ -2520,16 +2558,99 @@ export type StreamState = {
2558 _rowTag: number, // 0 indicates that we're currently parsing the row ID
2559 _rowLength: number, // remaining bytes in the row. 0 indicates that we're looking for a newline.
2560 _buffer: Array<Uint8Array>, // chunks received so far as part of this row
2561 + _debugInfo: ReactIOInfo, // DEV-only
2562 + _debugTargetChunkSize: number, // DEV-only
2563 };
2564
2525 -export function createStreamState(): StreamState {
2526 - return {
2565 +export function createStreamState(
2566 + weakResponse: WeakResponse, // DEV-only
2567 + streamDebugValue: mixed, // DEV-only
2568 +): StreamState {
2569 + const streamState: StreamState = (({
2570 _rowState: 0,
2571 _rowID: 0,
2572 _rowTag: 0,
2573 _rowLength: 0,
2574 _buffer: [],
2532 - };
2575 + }: Omit<StreamState, '_debugInfo' | '_debugTargetChunkSize'>): any);
2576 + if (__DEV__ && enableAsyncDebugInfo) {
2577 + const response = unwrapWeakResponse(weakResponse);
2578 + // Create an entry for the I/O to load the stream itself.
2579 + const debugValuePromise = Promise.resolve(streamDebugValue);
2580 + (debugValuePromise: any).status = 'fulfilled';
2581 + (debugValuePromise: any).value = streamDebugValue;
2582 + streamState._debugInfo = {
2583 + name: 'RSC stream',
2584 + start: response._debugStartTime,
2585 + end: response._debugStartTime, // will be updated once we finish a chunk
2586 + byteSize: 0, // will be updated as we resolve a data chunk
2587 + value: debugValuePromise,
2588 + owner: response._debugRootOwner,
2589 + debugStack: response._debugRootStack,
2590 + debugTask: response._debugRootTask,
2591 + };
2592 + streamState._debugTargetChunkSize = MIN_CHUNK_SIZE;
2593 + }
2594 + return streamState;
2595 +}
2596 +
2597 +// Depending on set up the chunks of a TLS connection can vary in size. However in practice it's often
2598 +// at 64kb or even multiples of 64kb. It can also be smaller but in practice it also happens that 64kb
2599 +// is around what you can download on fast 4G connection in 300ms which is what we throttle reveals at
2600 +// anyway. The net effect is that in practice, you won't really reveal anything in smaller units than
2601 +// 64kb if they're revealing at maximum speed in production. Therefore we group smaller chunks into
2602 +// these larger chunks since in production that's more realistic.
2603 +// TODO: If the stream is compressed, then you could fit much more in a single 300ms so maybe it should
2604 +// actually be larger.
2605 +const MIN_CHUNK_SIZE = 65536;
2606 +
2607 +function incrementChunkDebugInfo(
2608 + streamState: StreamState,
2609 + chunkLength: number,
2610 +): void {
2611 + if (__DEV__ && enableAsyncDebugInfo) {
2612 + const debugInfo: ReactIOInfo = streamState._debugInfo;
2613 + const endTime = performance.now();
2614 + const previousEndTime = debugInfo.end;
2615 + const newByteLength = ((debugInfo.byteSize: any): number) + chunkLength;
2616 + if (
2617 + newByteLength > streamState._debugTargetChunkSize ||
2618 + endTime > previousEndTime + 10
2619 + ) {
2620 + // This new chunk would overshoot the chunk size so therefore we treat it as its own new chunk
2621 + // by cloning the old one. Similarly, if some time has passed we assume that it was actually
2622 + // due to the server being unable to flush chunks faster e.g. due to I/O so it would be a
2623 + // new chunk in production even if the buffer hasn't been reached.
2624 + streamState._debugInfo = {
2625 + name: debugInfo.name,
2626 + start: debugInfo.start,
2627 + end: endTime,
2628 + byteSize: newByteLength,
2629 + value: debugInfo.value,
2630 + owner: debugInfo.owner,
2631 + debugStack: debugInfo.debugStack,
2632 + debugTask: debugInfo.debugTask,
2633 + };
2634 + streamState._debugTargetChunkSize = newByteLength + MIN_CHUNK_SIZE;
2635 + } else {
2636 + // Otherwise we reuse the old chunk but update the end time and byteSize to the latest.
2637 + // $FlowFixMe[cannot-write]
2638 + debugInfo.end = endTime;
2639 + // $FlowFixMe[cannot-write]
2640 + debugInfo.byteSize = newByteLength;
2641 + }
2642 + }
2643 +}
2644 +
2645 +function resolveChunkDebugInfo(
2646 + streamState: StreamState,
2647 + chunk: SomeChunk<any>,
2648 +): void {
2649 + if (__DEV__ && enableAsyncDebugInfo) {
2650 + // Push the currently resolving chunk's debug info representing the stream on the Promise
2651 + // that was waiting on the stream.
2652 + chunk._debugInfo.push({awaited: streamState._debugInfo});
2653 + }
2654 }
2655
2656 function resolveDebugHalt(response: Response, id: number): void {
@@ -2553,17 +2674,33 @@ function resolveModel(
2674 response: Response,
2675 id: number,
2676 model: UninitializedModel,
2677 + streamState: StreamState,
2678 ): void {
2679 const chunks = response._chunks;
2680 const chunk = chunks.get(id);
2681 if (!chunk) {
2560 - chunks.set(id, createResolvedModelChunk(response, model));
2682 + const newChunk: ResolvedModelChunk<any> = createResolvedModelChunk(
2683 + response,
2684 + model,
2685 + );
2686 + if (__DEV__) {
2687 + resolveChunkDebugInfo(streamState, newChunk);
2688 + }
2689 + chunks.set(id, newChunk);
2690 } else {
2691 + if (__DEV__) {
2692 + resolveChunkDebugInfo(streamState, chunk);
2693 + }
2694 resolveModelChunk(response, chunk, model);
2695 }
2696 }
2697
2566 -function resolveText(response: Response, id: number, text: string): void {
2698 +function resolveText(
2699 + response: Response,
2700 + id: number,
2701 + text: string,
2702 + streamState: StreamState,
2703 +): void {
2704 const chunks = response._chunks;
2705 const chunk = chunks.get(id);
2706 if (chunk && chunk.status !== PENDING) {
@@ -2577,13 +2714,18 @@ function resolveText(response: Response, id: number, text: string): void {
2714 if (chunk) {
2715 releasePendingChunk(response, chunk);
2716 }
2580 - chunks.set(id, createInitializedTextChunk(response, text));
2717 + const newChunk = createInitializedTextChunk(response, text);
2718 + if (__DEV__) {
2719 + resolveChunkDebugInfo(streamState, newChunk);
2720 + }
2721 + chunks.set(id, newChunk);
2722 }
2723
2724 function resolveBuffer(
2725 response: Response,
2726 id: number,
2727 buffer: $ArrayBufferView | ArrayBuffer,
2728 + streamState: StreamState,
2729 ): void {
2730 const chunks = response._chunks;
2731 const chunk = chunks.get(id);
@@ -2598,13 +2740,18 @@ function resolveBuffer(
2740 if (chunk) {
2741 releasePendingChunk(response, chunk);
2742 }
2601 - chunks.set(id, createInitializedBufferChunk(response, buffer));
2743 + const newChunk = createInitializedBufferChunk(response, buffer);
2744 + if (__DEV__) {
2745 + resolveChunkDebugInfo(streamState, newChunk);
2746 + }
2747 + chunks.set(id, newChunk);
2748 }
2749
2750 function resolveModule(
2751 response: Response,
2752 id: number,
2753 model: UninitializedModel,
2754 + streamState: StreamState,
2755 ): void {
2756 const chunks = response._chunks;
2757 const chunk = chunks.get(id);
@@ -2641,14 +2788,24 @@ function resolveModule(
2788 blockedChunk = (chunk: any);
2789 blockedChunk.status = BLOCKED;
2790 }
2791 + if (__DEV__) {
2792 + resolveChunkDebugInfo(streamState, blockedChunk);
2793 + }
2794 promise.then(
2795 () => resolveModuleChunk(response, blockedChunk, clientReference),
2796 error => triggerErrorOnChunk(response, blockedChunk, error),
2797 );
2798 } else {
2799 if (!chunk) {
2650 - chunks.set(id, createResolvedModuleChunk(response, clientReference));
2800 + const newChunk = createResolvedModuleChunk(response, clientReference);
2801 + if (__DEV__) {
2802 + resolveChunkDebugInfo(streamState, newChunk);
2803 + }
2804 + chunks.set(id, newChunk);
2805 } else {
2806 + if (__DEV__) {
2807 + resolveChunkDebugInfo(streamState, chunk);
2808 + }
2809 // This can't actually happen because we don't have any forward
2810 // references to modules.
2811 resolveModuleChunk(response, chunk, clientReference);
@@ -2661,13 +2818,21 @@ function resolveStream<T: ReadableStream | $AsyncIterable<any, any, void>>(
2818 id: number,
2819 stream: T,
2820 controller: FlightStreamController,
2821 + streamState: StreamState,
2822 ): void {
2823 const chunks = response._chunks;
2824 const chunk = chunks.get(id);
2825 if (!chunk) {
2668 - chunks.set(id, createInitializedStreamChunk(response, stream, controller));
2826 + const newChunk = createInitializedStreamChunk(response, stream, controller);
2827 + if (__DEV__) {
2828 + resolveChunkDebugInfo(streamState, newChunk);
2829 + }
2830 + chunks.set(id, newChunk);
2831 return;
2832 }
2833 + if (__DEV__) {
2834 + resolveChunkDebugInfo(streamState, chunk);
2835 + }
2836 if (chunk.status !== PENDING) {
2837 // We already resolved. We didn't expect to see this.
2838 return;
@@ -2723,6 +2888,7 @@ function startReadableStream<T>(
2888 response: Response,
2889 id: number,
2890 type: void | 'bytes',
2891 + streamState: StreamState,
2892 ): void {
2893 let controller: ReadableStreamController = (null: any);
2894 const stream = new ReadableStream({
@@ -2803,7 +2969,7 @@ function startReadableStream<T>(
2969 }
2970 },
2971 };
2806 - resolveStream(response, id, stream, flightController);
2972 + resolveStream(response, id, stream, flightController, streamState);
2973 }
2974
2975 function asyncIterator(this: $AsyncIterator<any, any, void>) {
@@ -2829,6 +2995,7 @@ function startAsyncIterable<T>(
2995 response: Response,
2996 id: number,
2997 iterator: boolean,
2998 + streamState: StreamState,
2999 ): void {
3000 const buffer: Array<SomeChunk<IteratorResult<T, T>>> = [];
3001 let closed = false;
@@ -2946,6 +3113,7 @@ function startAsyncIterable<T>(
3113 id,
3114 iterator ? iterable[ASYNC_ITERATOR]() : iterable,
3115 flightController,
3116 + streamState,
3117 );
3118 }
3119
@@ -3025,7 +3193,11 @@ function resolveErrorDev(
3193 return error;
3194 }
3195
3028 -function resolvePostponeProd(response: Response, id: number): void {
3196 +function resolvePostponeProd(
3197 + response: Response,
3198 + id: number,
3199 + streamState: StreamState,
3200 +): void {
3201 if (__DEV__) {
3202 // These errors should never make it into a build so we don't need to encode them in codes.json
3203 // eslint-disable-next-line react-internal/prod-error-codes
@@ -3043,7 +3215,11 @@ function resolvePostponeProd(response: Response, id: number): void {
3215 const chunks = response._chunks;
3216 const chunk = chunks.get(id);
3217 if (!chunk) {
3046 - chunks.set(id, createErrorChunk(response, postponeInstance));
3218 + const newChunk: ErroredChunk<any> = createErrorChunk(
3219 + response,
3220 + postponeInstance,
3221 + );
3222 + chunks.set(id, newChunk);
3223 } else {
3224 triggerErrorOnChunk(response, chunk, postponeInstance);
3225 }
@@ -3055,6 +3231,7 @@ function resolvePostponeDev(
3231 reason: string,
3232 stack: ReactStackTrace,
3233 env: string,
3234 + streamState: StreamState,
3235 ): void {
3236 if (!__DEV__) {
3237 // These errors should never make it into a build so we don't need to encode them in codes.json
@@ -3082,8 +3259,18 @@ function resolvePostponeDev(
3259 const chunks = response._chunks;
3260 const chunk = chunks.get(id);
3261 if (!chunk) {
3085 - chunks.set(id, createErrorChunk(response, postponeInstance));
3262 + const newChunk: ErroredChunk<any> = createErrorChunk(
3263 + response,
3264 + postponeInstance,
3265 + );
3266 + if (__DEV__) {
3267 + resolveChunkDebugInfo(streamState, newChunk);
3268 + }
3269 + chunks.set(id, newChunk);
3270 } else {
3271 + if (__DEV__) {
3272 + resolveChunkDebugInfo(streamState, chunk);
3273 + }
3274 triggerErrorOnChunk(response, chunk, postponeInstance);
3275 }
3276 }
@@ -3092,6 +3279,7 @@ function resolveErrorModel(
3279 response: Response,
3280 id: number,
3281 row: UninitializedModel,
3282 + streamState: StreamState,
3283 ): void {
3284 const chunks = response._chunks;
3285 const chunk = chunks.get(id);
@@ -3105,8 +3293,18 @@ function resolveErrorModel(
3293 (error: any).digest = errorInfo.digest;
3294 const errorWithDigest: ErrorWithDigest = (error: any);
3295 if (!chunk) {
3108 - chunks.set(id, createErrorChunk(response, errorWithDigest));
3296 + const newChunk: ErroredChunk<any> = createErrorChunk(
3297 + response,
3298 + errorWithDigest,
3299 + );
3300 + if (__DEV__) {
3301 + resolveChunkDebugInfo(streamState, newChunk);
3302 + }
3303 + chunks.set(id, newChunk);
3304 } else {
3305 + if (__DEV__) {
3306 + resolveChunkDebugInfo(streamState, chunk);
3307 + }
3308 triggerErrorOnChunk(response, chunk, errorWithDigest);
3309 }
3310 }
@@ -3841,6 +4039,7 @@ function resolveTypedArray(
4039 lastChunk: Uint8Array,
4040 constructor: any,
4041 bytesPerElement: number,
4042 + streamState: StreamState,
4043 ): void {
4044 // If the view fits into one original buffer, we just reuse that buffer instead of
4045 // copying it out to a separate copy. This means that it's not always possible to
@@ -3860,7 +4059,7 @@ function resolveTypedArray(
4059 chunk.byteOffset,
4060 chunk.byteLength / bytesPerElement,
4061 );
3863 - resolveBuffer(response, id, view);
4062 + resolveBuffer(response, id, view, streamState);
4063 }
4064
4065 function logComponentInfo(
@@ -4177,6 +4376,7 @@ function flushInitialRenderPerformance(response: Response): void {
4376
4377 function processFullBinaryRow(
4378 response: Response,
4379 + streamState: StreamState,
4380 id: number,
4381 tag: number,
4382 buffer: Array<Uint8Array>,
@@ -4185,47 +4385,125 @@ function processFullBinaryRow(
4385 switch (tag) {
4386 case 65 /* "A" */:
4387 // We must always clone to extract it into a separate buffer instead of just a view.
4188 - resolveBuffer(response, id, mergeBuffer(buffer, chunk).buffer);
4388 + resolveBuffer(
4389 + response,
4390 + id,
4391 + mergeBuffer(buffer, chunk).buffer,
4392 + streamState,
4393 + );
4394 return;
4395 case 79 /* "O" */:
4191 - resolveTypedArray(response, id, buffer, chunk, Int8Array, 1);
4396 + resolveTypedArray(response, id, buffer, chunk, Int8Array, 1, streamState);
4397 return;
4398 case 111 /* "o" */:
4399 resolveBuffer(
4400 response,
4401 id,
4402 buffer.length === 0 ? chunk : mergeBuffer(buffer, chunk),
4403 + streamState,
4404 );
4405 return;
4406 case 85 /* "U" */:
4201 - resolveTypedArray(response, id, buffer, chunk, Uint8ClampedArray, 1);
4407 + resolveTypedArray(
4408 + response,
4409 + id,
4410 + buffer,
4411 + chunk,
4412 + Uint8ClampedArray,
4413 + 1,
4414 + streamState,
4415 + );
4416 return;
4417 case 83 /* "S" */:
4204 - resolveTypedArray(response, id, buffer, chunk, Int16Array, 2);
4418 + resolveTypedArray(
4419 + response,
4420 + id,
4421 + buffer,
4422 + chunk,
4423 + Int16Array,
4424 + 2,
4425 + streamState,
4426 + );
4427 return;
4428 case 115 /* "s" */:
4207 - resolveTypedArray(response, id, buffer, chunk, Uint16Array, 2);
4429 + resolveTypedArray(
4430 + response,
4431 + id,
4432 + buffer,
4433 + chunk,
4434 + Uint16Array,
4435 + 2,
4436 + streamState,
4437 + );
4438 return;
4439 case 76 /* "L" */:
4210 - resolveTypedArray(response, id, buffer, chunk, Int32Array, 4);
4440 + resolveTypedArray(
4441 + response,
4442 + id,
4443 + buffer,
4444 + chunk,
4445 + Int32Array,
4446 + 4,
4447 + streamState,
4448 + );
4449 return;
4450 case 108 /* "l" */:
4213 - resolveTypedArray(response, id, buffer, chunk, Uint32Array, 4);
4451 + resolveTypedArray(
4452 + response,
4453 + id,
4454 + buffer,
4455 + chunk,
4456 + Uint32Array,
4457 + 4,
4458 + streamState,
4459 + );
4460 return;
4461 case 71 /* "G" */:
4216 - resolveTypedArray(response, id, buffer, chunk, Float32Array, 4);
4462 + resolveTypedArray(
4463 + response,
4464 + id,
4465 + buffer,
4466 + chunk,
4467 + Float32Array,
4468 + 4,
4469 + streamState,
4470 + );
4471 return;
4472 case 103 /* "g" */:
4219 - resolveTypedArray(response, id, buffer, chunk, Float64Array, 8);
4473 + resolveTypedArray(
4474 + response,
4475 + id,
4476 + buffer,
4477 + chunk,
4478 + Float64Array,
4479 + 8,
4480 + streamState,
4481 + );
4482 return;
4483 case 77 /* "M" */:
4222 - resolveTypedArray(response, id, buffer, chunk, BigInt64Array, 8);
4484 + resolveTypedArray(
4485 + response,
4486 + id,
4487 + buffer,
4488 + chunk,
4489 + BigInt64Array,
4490 + 8,
4491 + streamState,
4492 + );
4493 return;
4494 case 109 /* "m" */:
4225 - resolveTypedArray(response, id, buffer, chunk, BigUint64Array, 8);
4495 + resolveTypedArray(
4496 + response,
4497 + id,
4498 + buffer,
4499 + chunk,
4500 + BigUint64Array,
4501 + 8,
4502 + streamState,
4503 + );
4504 return;
4505 case 86 /* "V" */:
4228 - resolveTypedArray(response, id, buffer, chunk, DataView, 1);
4506 + resolveTypedArray(response, id, buffer, chunk, DataView, 1, streamState);
4507 return;
4508 }
4509
@@ -4235,18 +4513,19 @@ function processFullBinaryRow(
4513 row += readPartialStringChunk(stringDecoder, buffer[i]);
4514 }
4515 row += readFinalStringChunk(stringDecoder, chunk);
4238 - processFullStringRow(response, id, tag, row);
4516 + processFullStringRow(response, streamState, id, tag, row);
4517 }
4518
4519 function processFullStringRow(
4520 response: Response,
4521 + streamState: StreamState,
4522 id: number,
4523 tag: number,
4524 row: string,
4525 ): void {
4526 switch (tag) {
4527 case 73 /* "I" */: {
4249 - resolveModule(response, id, row);
4528 + resolveModule(response, id, row, streamState);
4529 return;
4530 }
4531 case 72 /* "H" */: {
@@ -4255,11 +4534,11 @@ function processFullStringRow(
4534 return;
4535 }
4536 case 69 /* "E" */: {
4258 - resolveErrorModel(response, id, row);
4537 + resolveErrorModel(response, id, row, streamState);
4538 return;
4539 }
4540 case 84 /* "T" */: {
4262 - resolveText(response, id, row);
4541 + resolveText(response, id, row, streamState);
4542 return;
4543 }
4544 case 78 /* "N" */: {
@@ -4304,22 +4583,22 @@ function processFullStringRow(
4583 );
4584 }
4585 case 82 /* "R" */: {
4307 - startReadableStream(response, id, undefined);
4586 + startReadableStream(response, id, undefined, streamState);
4587 return;
4588 }
4589 // Fallthrough
4590 case 114 /* "r" */: {
4312 - startReadableStream(response, id, 'bytes');
4591 + startReadableStream(response, id, 'bytes', streamState);
4592 return;
4593 }
4594 // Fallthrough
4595 case 88 /* "X" */: {
4317 - startAsyncIterable(response, id, false);
4596 + startAsyncIterable(response, id, false, streamState);
4597 return;
4598 }
4599 // Fallthrough
4600 case 120 /* "x" */: {
4322 - startAsyncIterable(response, id, true);
4601 + startAsyncIterable(response, id, true, streamState);
4602 return;
4603 }
4604 // Fallthrough
@@ -4338,9 +4617,10 @@ function processFullStringRow(
4617 postponeInfo.reason,
4618 postponeInfo.stack,
4619 postponeInfo.env,
4620 + streamState,
4621 );
4622 } else {
4343 - resolvePostponeProd(response, id);
4623 + resolvePostponeProd(response, id, streamState);
4624 }
4625 return;
4626 }
@@ -4352,7 +4632,7 @@ function processFullStringRow(
4632 return;
4633 }
4634 // We assume anything else is JSON.
4355 - resolveModel(response, id, row);
4635 + resolveModel(response, id, row, streamState);
4636 return;
4637 }
4638 }
@@ -4375,6 +4655,7 @@ export function processBinaryChunk(
4655 let rowLength = streamState._rowLength;
4656 const buffer = streamState._buffer;
4657 const chunkLength = chunk.length;
4658 + incrementChunkDebugInfo(streamState, chunkLength);
4659 while (i < chunkLength) {
4660 let lastIdx = -1;
4661 switch (rowState) {
@@ -4454,7 +4735,14 @@ export function processBinaryChunk(
4735 // We found the last chunk of the row
4736 const length = lastIdx - i;
4737 const lastChunk = new Uint8Array(chunk.buffer, offset, length);
4457 - processFullBinaryRow(response, rowID, rowTag, buffer, lastChunk);
4738 + processFullBinaryRow(
4739 + response,
4740 + streamState,
4741 + rowID,
4742 + rowTag,
4743 + buffer,
4744 + lastChunk,
4745 + );
4746 // Reset state machine for a new row
4747 i = lastIdx;
4748 if (rowState === ROW_CHUNK_BY_NEWLINE) {
@@ -4509,6 +4797,7 @@ export function processStringChunk(
4797 let rowLength = streamState._rowLength;
4798 const buffer = streamState._buffer;
4799 const chunkLength = chunk.length;
4800 + incrementChunkDebugInfo(streamState, chunkLength);
4801 while (i < chunkLength) {
4802 let lastIdx = -1;
4803 switch (rowState) {
@@ -4607,7 +4896,7 @@ export function processStringChunk(
4896 );
4897 }
4898 const lastChunk = chunk.slice(i, lastIdx);
4610 - processFullStringRow(response, rowID, rowTag, lastChunk);
4899 + processFullStringRow(response, streamState, rowID, rowTag, lastChunk);
4900 // Reset state machine for a new row
4901 i = lastIdx;
4902 if (rowState === ROW_CHUNK_BY_NEWLINE) {
packages/react-client/src/__tests__/ReactFlight-test.js
+23 -17
@@ -85,7 +85,11 @@ function getDebugInfo(obj) {
85 if (debugInfo) {
86 const copy = [];
87 for (let i = 0; i < debugInfo.length; i++) {
88 - copy.push(normalizeComponentInfo(debugInfo[i]));
88 + if (debugInfo[i].awaited && debugInfo[i].awaited.name === 'RSC stream') {
89 + // Ignore RSC stream I/O info.
90 + } else {
91 + copy.push(normalizeComponentInfo(debugInfo[i]));
92 + }
93 }
94 return copy;
95 }
@@ -2832,7 +2836,7 @@ describe('ReactFlight', () => {
2836 transport: expect.arrayContaining([]),
2837 },
2838 },
2835 - {time: gate(flags => flags.enableAsyncDebugInfo) ? 23 : 21},
2839 + {time: gate(flags => flags.enableAsyncDebugInfo) ? 53 : 21},
2840 ]
2841 : undefined,
2842 );
@@ -2843,7 +2847,7 @@ describe('ReactFlight', () => {
2847 expect(getDebugInfo(thirdPartyChildren[0])).toEqual(
2848 __DEV__
2849 ? [
2846 - {time: gate(flags => flags.enableAsyncDebugInfo) ? 24 : 22}, // Clamped to the start
2850 + {time: gate(flags => flags.enableAsyncDebugInfo) ? 54 : 22}, // Clamped to the start
2851 {
2852 name: 'ThirdPartyComponent',
2853 env: 'third-party',
@@ -2851,15 +2855,15 @@ describe('ReactFlight', () => {
2855 stack: ' in Object.<anonymous> (at **)',
2856 props: {},
2857 },
2854 - {time: gate(flags => flags.enableAsyncDebugInfo) ? 24 : 22},
2855 - {time: gate(flags => flags.enableAsyncDebugInfo) ? 25 : 23}, // This last one is when the promise resolved into the first party.
2858 + {time: gate(flags => flags.enableAsyncDebugInfo) ? 54 : 22},
2859 + {time: gate(flags => flags.enableAsyncDebugInfo) ? 55 : 23}, // This last one is when the promise resolved into the first party.
2860 ]
2861 : undefined,
2862 );
2863 expect(getDebugInfo(thirdPartyChildren[1])).toEqual(
2864 __DEV__
2865 ? [
2862 - {time: gate(flags => flags.enableAsyncDebugInfo) ? 24 : 22}, // Clamped to the start
2866 + {time: gate(flags => flags.enableAsyncDebugInfo) ? 54 : 22}, // Clamped to the start
2867 {
2868 name: 'ThirdPartyLazyComponent',
2869 env: 'third-party',
@@ -2867,14 +2871,14 @@ describe('ReactFlight', () => {
2871 stack: ' in myLazy (at **)\n in lazyInitializer (at **)',
2872 props: {},
2873 },
2870 - {time: gate(flags => flags.enableAsyncDebugInfo) ? 24 : 22},
2874 + {time: gate(flags => flags.enableAsyncDebugInfo) ? 54 : 22},
2875 ]
2876 : undefined,
2877 );
2878 expect(getDebugInfo(thirdPartyChildren[2])).toEqual(
2879 __DEV__
2880 ? [
2877 - {time: gate(flags => flags.enableAsyncDebugInfo) ? 24 : 22},
2881 + {time: gate(flags => flags.enableAsyncDebugInfo) ? 54 : 22},
2882 {
2883 name: 'ThirdPartyFragmentComponent',
2884 env: 'third-party',
@@ -2882,7 +2886,7 @@ describe('ReactFlight', () => {
2886 stack: ' in Object.<anonymous> (at **)',
2887 props: {},
2888 },
2885 - {time: gate(flags => flags.enableAsyncDebugInfo) ? 24 : 22},
2889 + {time: gate(flags => flags.enableAsyncDebugInfo) ? 54 : 22},
2890 ]
2891 : undefined,
2892 );
@@ -2963,7 +2967,7 @@ describe('ReactFlight', () => {
2967 {
2968 time: 16,
2969 },
2966 - {time: 17},
2970 + {time: 31},
2971 ]
2972 : undefined,
2973 );
@@ -2972,7 +2976,7 @@ describe('ReactFlight', () => {
2976 expect(getDebugInfo(thirdPartyFragment)).toEqual(
2977 __DEV__
2978 ? [
2975 - {time: 18},
2979 + {time: 32},
2980 {
2981 name: 'Keyed',
2982 env: 'Server',
@@ -2983,12 +2987,14 @@ describe('ReactFlight', () => {
2987 },
2988 },
2989 {
2986 - time: 19,
2990 + time: 33,
2991 + },
2992 + {
2993 + time: 33,
2994 },
2995 {
2989 - time: 19,
2996 + time: 33,
2997 },
2991 - {time: 19},
2998 ]
2999 : undefined,
3000 );
@@ -2996,7 +3002,7 @@ describe('ReactFlight', () => {
3002 expect(getDebugInfo(thirdPartyFragment.props.children)).toEqual(
3003 __DEV__
3004 ? [
2999 - {time: 19}, // Clamp to the start
3005 + {time: 33}, // Clamp to the start
3006 {
3007 name: 'ThirdPartyAsyncIterableComponent',
3008 env: 'third-party',
@@ -3004,7 +3010,7 @@ describe('ReactFlight', () => {
3010 stack: ' in Object.<anonymous> (at **)',
3011 props: {},
3012 },
3007 - {time: 19},
3013 + {time: 33},
3014 ]
3015 : undefined,
3016 );
@@ -3067,7 +3073,7 @@ describe('ReactFlight', () => {
3073 props: {},
3074 },
3075 {time: 16},
3070 - {time: 17},
3076 + {time: gate(flags => flags.enableAsyncDebugInfo) ? 24 : 17},
3077 ]
3078 : undefined,
3079 );
packages/react-markup/src/ReactMarkupServer.js
+12 -12
@@ -81,7 +81,18 @@ export function experimental_renderToHTML(
81 options?: MarkupOptions,
82 ): Promise<string> {
83 return new Promise((resolve, reject) => {
84 - const streamState = createFlightStreamState();
84 + const flightResponse = createFlightResponse(
85 + null,
86 + null,
87 + null,
88 + noServerCallOrFormAction,
89 + noServerCallOrFormAction,
90 + undefined,
91 + undefined,
92 + undefined,
93 + false,
94 + );
95 + const streamState = createFlightStreamState(flightResponse, null);
96 const flightDestination = {
97 push(chunk: string | null): boolean {
98 if (chunk !== null) {
@@ -175,17 +186,6 @@ export function experimental_renderToHTML(
186 undefined,
187 false,
188 );
178 - const flightResponse = createFlightResponse(
179 - null,
180 - null,
181 - null,
182 - noServerCallOrFormAction,
183 - noServerCallOrFormAction,
184 - undefined,
185 - undefined,
186 - undefined,
187 - false,
188 - );
189 const resumableState = createResumableState(
190 options ? options.identifierPrefix : undefined,
191 undefined,
packages/react-noop-renderer/src/ReactNoopFlightClient.js
+1 -1
@@ -77,7 +77,7 @@ function read<T>(source: Source, options: ReadOptions): Thenable<T> {
77 ? options.debugChannel.onMessage
78 : undefined,
79 );
80 - const streamState = createStreamState();
80 + const streamState = createStreamState(response, source);
81 for (let i = 0; i < source.length; i++) {
82 processBinaryChunk(response, streamState, source[i], 0);
83 }
packages/react-server-dom-esm/src/client/ReactFlightDOMClientBrowser.js
+12 -5
@@ -115,7 +115,7 @@ function startReadingFromUniversalStream(
115 // This is the same as startReadingFromStream except this allows WebSocketStreams which
116 // return ArrayBuffer and string chunks instead of Uint8Array chunks. We could potentially
117 // always allow streams with variable chunk types.
118 - const streamState = createStreamState();
118 + const streamState = createStreamState(response, stream);
119 const reader = stream.getReader();
120 function progress({
121 done,
@@ -149,8 +149,9 @@ function startReadingFromStream(
149 response: FlightResponse,
150 stream: ReadableStream,
151 onDone: () => void,
152 + debugValue: mixed,
153 ): void {
153 - const streamState = createStreamState();
154 + const streamState = createStreamState(response, debugValue);
155 const reader = stream.getReader();
156 function progress({
157 done,
@@ -194,9 +195,14 @@ function createFromReadableStream<T>(
195 options.debugChannel.readable,
196 handleDone,
197 );
197 - startReadingFromStream(response, stream, handleDone);
198 + startReadingFromStream(response, stream, handleDone, stream);
199 } else {
199 - startReadingFromStream(response, stream, close.bind(null, response));
200 + startReadingFromStream(
201 + response,
202 + stream,
203 + close.bind(null, response),
204 + stream,
205 + );
206 }
207 return getRoot(response);
208 }
@@ -225,12 +231,13 @@ function createFromFetch<T>(
231 options.debugChannel.readable,
232 handleDone,
233 );
228 - startReadingFromStream(response, (r.body: any), handleDone);
234 + startReadingFromStream(response, (r.body: any), handleDone, r);
235 } else {
236 startReadingFromStream(
237 response,
238 (r.body: any),
239 close.bind(null, response),
240 + r,
241 );
242 }
243 },
packages/react-server-dom-esm/src/client/ReactFlightDOMClientNode.js
+1 -1
@@ -66,7 +66,7 @@ function startReadingFromStream(
66 stream: Readable,
67 onEnd: () => void,
68 ): void {
69 - const streamState = createStreamState();
69 + const streamState = createStreamState(response, stream);
70
71 stream.on('data', chunk => {
72 if (typeof chunk === 'string') {
packages/react-server-dom-parcel/src/client/ReactFlightDOMClientBrowser.js
+12 -5
@@ -141,7 +141,7 @@ function startReadingFromUniversalStream(
141 // This is the same as startReadingFromStream except this allows WebSocketStreams which
142 // return ArrayBuffer and string chunks instead of Uint8Array chunks. We could potentially
143 // always allow streams with variable chunk types.
144 - const streamState = createStreamState();
144 + const streamState = createStreamState(response, stream);
145 const reader = stream.getReader();
146 function progress({
147 done,
@@ -175,8 +175,9 @@ function startReadingFromStream(
175 response: FlightResponse,
176 stream: ReadableStream,
177 onDone: () => void,
178 + debugValue: mixed,
179 ): void {
179 - const streamState = createStreamState();
180 + const streamState = createStreamState(response, debugValue);
181 const reader = stream.getReader();
182 function progress({
183 done,
@@ -228,9 +229,14 @@ export function createFromReadableStream<T>(
229 options.debugChannel.readable,
230 handleDone,
231 );
231 - startReadingFromStream(response, stream, handleDone);
232 + startReadingFromStream(response, stream, handleDone, stream);
233 } else {
233 - startReadingFromStream(response, stream, close.bind(null, response));
234 + startReadingFromStream(
235 + response,
236 + stream,
237 + close.bind(null, response),
238 + stream,
239 + );
240 }
241 return getRoot(response);
242 }
@@ -259,12 +265,13 @@ export function createFromFetch<T>(
265 options.debugChannel.readable,
266 handleDone,
267 );
262 - startReadingFromStream(response, (r.body: any), handleDone);
268 + startReadingFromStream(response, (r.body: any), handleDone, r);
269 } else {
270 startReadingFromStream(
271 response,
272 (r.body: any),
273 close.bind(null, response),
274 + r,
275 );
276 }
277 },
packages/react-server-dom-parcel/src/client/ReactFlightDOMClientEdge.js
+11 -4
@@ -115,8 +115,9 @@ function startReadingFromStream(
115 response: FlightResponse,
116 stream: ReadableStream,
117 onDone: () => void,
118 + debugValue: mixed,
119 ): void {
119 - const streamState = createStreamState();
120 + const streamState = createStreamState(response, debugValue);
121 const reader = stream.getReader();
122 function progress({
123 done,
@@ -158,9 +159,14 @@ export function createFromReadableStream<T>(
159 }
160 };
161 startReadingFromStream(response, options.debugChannel.readable, handleDone);
161 - startReadingFromStream(response, stream, handleDone);
162 + startReadingFromStream(response, stream, handleDone, stream);
163 } else {
163 - startReadingFromStream(response, stream, close.bind(null, response));
164 + startReadingFromStream(
165 + response,
166 + stream,
167 + close.bind(null, response),
168 + stream,
169 + );
170 }
171
172 return getRoot(response);
@@ -190,12 +196,13 @@ export function createFromFetch<T>(
196 options.debugChannel.readable,
197 handleDone,
198 );
193 - startReadingFromStream(response, (r.body: any), handleDone);
199 + startReadingFromStream(response, (r.body: any), handleDone, r);
200 } else {
201 startReadingFromStream(
202 response,
203 (r.body: any),
204 close.bind(null, response),
205 + r,
206 );
207 }
208 },
packages/react-server-dom-parcel/src/client/ReactFlightDOMClientNode.js
+1 -1
@@ -61,7 +61,7 @@ function startReadingFromStream(
61 stream: Readable,
62 onEnd: () => void,
63 ): void {
64 - const streamState = createStreamState();
64 + const streamState = createStreamState(response, stream);
65
66 stream.on('data', chunk => {
67 if (typeof chunk === 'string') {
packages/react-server-dom-turbopack/src/client/ReactFlightDOMClientBrowser.js
+12 -5
@@ -114,7 +114,7 @@ function startReadingFromUniversalStream(
114 // This is the same as startReadingFromStream except this allows WebSocketStreams which
115 // return ArrayBuffer and string chunks instead of Uint8Array chunks. We could potentially
116 // always allow streams with variable chunk types.
117 - const streamState = createStreamState();
117 + const streamState = createStreamState(response, stream);
118 const reader = stream.getReader();
119 function progress({
120 done,
@@ -148,8 +148,9 @@ function startReadingFromStream(
148 response: FlightResponse,
149 stream: ReadableStream,
150 onDone: () => void,
151 + debugValue: mixed,
152 ): void {
152 - const streamState = createStreamState();
153 + const streamState = createStreamState(response, debugValue);
154 const reader = stream.getReader();
155 function progress({
156 done,
@@ -194,9 +195,14 @@ function createFromReadableStream<T>(
195 options.debugChannel.readable,
196 handleDone,
197 );
197 - startReadingFromStream(response, stream, handleDone);
198 + startReadingFromStream(response, stream, handleDone, stream);
199 } else {
199 - startReadingFromStream(response, stream, close.bind(null, response));
200 + startReadingFromStream(
201 + response,
202 + stream,
203 + close.bind(null, response),
204 + stream,
205 + );
206 }
207 return getRoot(response);
208 }
@@ -225,12 +231,13 @@ function createFromFetch<T>(
231 options.debugChannel.readable,
232 handleDone,
233 );
228 - startReadingFromStream(response, (r.body: any), handleDone);
234 + startReadingFromStream(response, (r.body: any), handleDone, r);
235 } else {
236 startReadingFromStream(
237 response,
238 (r.body: any),
239 close.bind(null, response),
240 + r,
241 );
242 }
243 },
packages/react-server-dom-turbopack/src/client/ReactFlightDOMClientEdge.js
+11 -4
@@ -117,8 +117,9 @@ function startReadingFromStream(
117 response: FlightResponse,
118 stream: ReadableStream,
119 onDone: () => void,
120 + debugValue: mixed,
121 ): void {
121 - const streamState = createStreamState();
122 + const streamState = createStreamState(response, debugValue);
123 const reader = stream.getReader();
124 function progress({
125 done,
@@ -160,9 +161,14 @@ function createFromReadableStream<T>(
161 }
162 };
163 startReadingFromStream(response, options.debugChannel.readable, handleDone);
163 - startReadingFromStream(response, stream, handleDone);
164 + startReadingFromStream(response, stream, handleDone, stream);
165 } else {
165 - startReadingFromStream(response, stream, close.bind(null, response));
166 + startReadingFromStream(
167 + response,
168 + stream,
169 + close.bind(null, response),
170 + stream,
171 + );
172 }
173
174 return getRoot(response);
@@ -192,12 +198,13 @@ function createFromFetch<T>(
198 options.debugChannel.readable,
199 handleDone,
200 );
195 - startReadingFromStream(response, (r.body: any), handleDone);
201 + startReadingFromStream(response, (r.body: any), handleDone, r);
202 } else {
203 startReadingFromStream(
204 response,
205 (r.body: any),
206 close.bind(null, response),
207 + r,
208 );
209 }
210 },
packages/react-server-dom-turbopack/src/client/ReactFlightDOMClientNode.js
+1 -1
@@ -69,7 +69,7 @@ function startReadingFromStream(
69 stream: Readable,
70 onEnd: () => void,
71 ): void {
72 - const streamState = createStreamState();
72 + const streamState = createStreamState(response, stream);
73
74 stream.on('data', chunk => {
75 if (typeof chunk === 'string') {
packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js
+18 -11
@@ -1239,17 +1239,24 @@ describe('ReactFlightDOMEdge', () => {
1239 name: 'Greeting',
1240 env: 'Server',
1241 });
1242 - expect(lazyWrapper._debugInfo).toEqual([
1243 - {time: 12},
1244 - greetInfo,
1245 - {time: 13},
1246 - expect.objectContaining({
1247 - name: 'Container',
1248 - env: 'Server',
1249 - owner: greetInfo,
1250 - }),
1251 - {time: 14},
1252 - ]);
1242 + if (gate(flags => flags.enableAsyncDebugInfo)) {
1243 + expect(lazyWrapper._debugInfo).toEqual([
1244 + {time: 12},
1245 + greetInfo,
1246 + {time: 13},
1247 + expect.objectContaining({
1248 + name: 'Container',
1249 + env: 'Server',
1250 + owner: greetInfo,
1251 + }),
1252 + {time: 14},
1253 + expect.objectContaining({
1254 + awaited: expect.objectContaining({
1255 + name: 'RSC stream',
1256 + }),
1257 + }),
1258 + ]);
1259 + }
1260 // The owner that created the span was the outer server component.
1261 // We expect the debug info to be referentially equal to the owner.
1262 expect(greeting._owner).toBe(lazyWrapper._debugInfo[1]);
packages/react-server-dom-webpack/src/client/ReactFlightDOMClientBrowser.js
+12 -5
@@ -114,7 +114,7 @@ function startReadingFromUniversalStream(
114 // This is the same as startReadingFromStream except this allows WebSocketStreams which
115 // return ArrayBuffer and string chunks instead of Uint8Array chunks. We could potentially
116 // always allow streams with variable chunk types.
117 - const streamState = createStreamState();
117 + const streamState = createStreamState(response, stream);
118 const reader = stream.getReader();
119 function progress({
120 done,
@@ -148,8 +148,9 @@ function startReadingFromStream(
148 response: FlightResponse,
149 stream: ReadableStream,
150 onDone: () => void,
151 + debugValue: mixed,
152 ): void {
152 - const streamState = createStreamState();
153 + const streamState = createStreamState(response, debugValue);
154 const reader = stream.getReader();
155 function progress({
156 done,
@@ -194,9 +195,14 @@ function createFromReadableStream<T>(
195 options.debugChannel.readable,
196 handleDone,
197 );
197 - startReadingFromStream(response, stream, handleDone);
198 + startReadingFromStream(response, stream, handleDone, stream);
199 } else {
199 - startReadingFromStream(response, stream, close.bind(null, response));
200 + startReadingFromStream(
201 + response,
202 + stream,
203 + close.bind(null, response),
204 + stream,
205 + );
206 }
207 return getRoot(response);
208 }
@@ -225,12 +231,13 @@ function createFromFetch<T>(
231 options.debugChannel.readable,
232 handleDone,
233 );
228 - startReadingFromStream(response, (r.body: any), handleDone);
234 + startReadingFromStream(response, (r.body: any), handleDone, r);
235 } else {
236 startReadingFromStream(
237 response,
238 (r.body: any),
239 close.bind(null, response),
240 + r,
241 );
242 }
243 },
packages/react-server-dom-webpack/src/client/ReactFlightDOMClientEdge.js
+11 -4
@@ -117,8 +117,9 @@ function startReadingFromStream(
117 response: FlightResponse,
118 stream: ReadableStream,
119 onDone: () => void,
120 + debugValue: mixed,
121 ): void {
121 - const streamState = createStreamState();
122 + const streamState = createStreamState(response, debugValue);
123 const reader = stream.getReader();
124 function progress({
125 done,
@@ -160,9 +161,14 @@ function createFromReadableStream<T>(
161 }
162 };
163 startReadingFromStream(response, options.debugChannel.readable, handleDone);
163 - startReadingFromStream(response, stream, handleDone);
164 + startReadingFromStream(response, stream, handleDone, stream);
165 } else {
165 - startReadingFromStream(response, stream, close.bind(null, response));
166 + startReadingFromStream(
167 + response,
168 + stream,
169 + close.bind(null, response),
170 + stream,
171 + );
172 }
173
174 return getRoot(response);
@@ -192,12 +198,13 @@ function createFromFetch<T>(
198 options.debugChannel.readable,
199 handleDone,
200 );
195 - startReadingFromStream(response, (r.body: any), handleDone);
201 + startReadingFromStream(response, (r.body: any), handleDone, r);
202 } else {
203 startReadingFromStream(
204 response,
205 (r.body: any),
206 close.bind(null, response),
207 + r,
208 );
209 }
210 },
packages/react-server-dom-webpack/src/client/ReactFlightDOMClientNode.js
+1 -1
@@ -69,7 +69,7 @@ function startReadingFromStream(
69 stream: Readable,
70 onEnd: () => void,
71 ): void {
72 - const streamState = createStreamState();
72 + const streamState = createStreamState(response, stream);
73
74 stream.on('data', chunk => {
75 if (typeof chunk === 'string') {
packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js
+445 -285
@@ -58,9 +58,16 @@ function normalizeIOInfo(ioInfo) {
58 if (promise) {
59 promise.then(); // init
60 if (promise.status === 'fulfilled') {
61 - copy.value = {
62 - value: promise.value,
63 - };
61 + if (ioInfo.name === 'RSC stream') {
62 + copy.byteSize = 0;
63 + copy.value = {
64 + value: 'stream',
65 + };
66 + } else {
67 + copy.value = {
68 + value: promise.value,
69 + };
70 + }
71 } else if (promise.status === 'rejected') {
72 copy.value = {
73 reason: promise.reason,
@@ -76,11 +83,11 @@ function normalizeIOInfo(ioInfo) {
83
84 function normalizeDebugInfo(original) {
85 const {debugTask, debugStack, debugLocation, ...debugInfo} = original;
79 - if (debugInfo.owner) {
80 - debugInfo.owner = normalizeDebugInfo(debugInfo.owner);
86 + if (original.owner) {
87 + debugInfo.owner = normalizeDebugInfo(original.owner);
88 }
82 - if (debugInfo.awaited) {
83 - debugInfo.awaited = normalizeIOInfo(debugInfo.awaited);
89 + if (original.awaited) {
90 + debugInfo.awaited = normalizeIOInfo(original.awaited);
91 }
92 if (debugInfo.props) {
93 debugInfo.props = {};
@@ -90,8 +97,6 @@ function normalizeDebugInfo(original) {
97 return debugInfo;
98 } else if (typeof debugInfo.time === 'number') {
99 return {...debugInfo, time: 0};
93 - } else if (debugInfo.awaited) {
94 - return {...debugInfo, awaited: normalizeIOInfo(debugInfo.awaited)};
100 } else {
101 return debugInfo;
102 }
@@ -242,9 +247,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
247 [
248 "Object.<anonymous>",
249 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
245 - 211,
250 + 216,
251 109,
247 - 191,
252 + 196,
253 50,
254 ],
255 ],
@@ -266,9 +271,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
271 [
272 "Object.<anonymous>",
273 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
269 - 211,
274 + 216,
275 109,
271 - 191,
276 + 196,
277 50,
278 ],
279 ],
@@ -277,25 +282,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
282 [
283 "delay",
284 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
280 - 169,
285 + 174,
286 12,
282 - 168,
287 + 173,
288 3,
289 ],
290 [
291 "getData",
292 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
288 - 193,
293 + 198,
294 13,
290 - 192,
295 + 197,
296 5,
297 ],
298 [
299 "Component",
300 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
296 - 200,
301 + 205,
302 26,
298 - 199,
303 + 204,
304 5,
305 ],
306 ],
@@ -314,9 +319,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
319 [
320 "Object.<anonymous>",
321 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
317 - 211,
322 + 216,
323 109,
319 - 191,
324 + 196,
325 50,
326 ],
327 ],
@@ -325,17 +330,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
330 [
331 "getData",
332 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
328 - 193,
333 + 198,
334 13,
330 - 192,
335 + 197,
336 5,
337 ],
338 [
339 "Component",
340 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
336 - 200,
341 + 205,
342 26,
338 - 199,
343 + 204,
344 5,
345 ],
346 ],
@@ -360,9 +365,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
365 [
366 "Object.<anonymous>",
367 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
363 - 211,
368 + 216,
369 109,
365 - 191,
370 + 196,
371 50,
372 ],
373 ],
@@ -371,25 +376,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
376 [
377 "delay",
378 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
374 - 169,
379 + 174,
380 12,
376 - 168,
381 + 173,
382 3,
383 ],
384 [
385 "getData",
386 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
382 - 194,
387 + 199,
388 21,
384 - 192,
389 + 197,
390 5,
391 ],
392 [
393 "Component",
394 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
390 - 200,
395 + 205,
396 20,
392 - 199,
397 + 204,
398 5,
399 ],
400 ],
@@ -408,9 +413,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
413 [
414 "Object.<anonymous>",
415 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
411 - 211,
416 + 216,
417 109,
413 - 191,
418 + 196,
419 50,
420 ],
421 ],
@@ -419,17 +424,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
424 [
425 "getData",
426 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
422 - 195,
427 + 200,
428 21,
424 - 192,
429 + 197,
430 5,
431 ],
432 [
433 "Component",
434 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
430 - 200,
435 + 205,
436 20,
432 - 199,
437 + 204,
438 5,
439 ],
440 ],
@@ -449,9 +454,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
454 [
455 "Component",
456 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
452 - 202,
457 + 207,
458 60,
454 - 199,
459 + 204,
460 5,
461 ],
462 ],
@@ -473,9 +478,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
478 [
479 "Object.<anonymous>",
480 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
476 - 211,
481 + 216,
482 109,
478 - 191,
483 + 196,
484 50,
485 ],
486 ],
@@ -484,17 +489,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
489 [
490 "delay",
491 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
487 - 169,
492 + 174,
493 12,
489 - 168,
494 + 173,
495 3,
496 ],
497 [
498 "getData",
499 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
495 - 194,
500 + 199,
501 21,
497 - 192,
502 + 197,
503 5,
504 ],
505 ],
@@ -513,9 +518,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
518 [
519 "Component",
520 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
516 - 202,
521 + 207,
522 60,
518 - 199,
523 + 204,
524 5,
525 ],
526 ],
@@ -524,9 +529,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
529 [
530 "InnerComponent",
531 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
527 - 208,
532 + 213,
533 35,
529 - 205,
534 + 210,
535 5,
536 ],
537 ],
@@ -537,6 +542,18 @@ describe('ReactFlightAsyncDebugInfo', () => {
542 {
543 "time": 0,
544 },
545 + {
546 + "awaited": {
547 + "byteSize": 0,
548 + "end": 0,
549 + "name": "RSC stream",
550 + "owner": null,
551 + "start": 0,
552 + "value": {
553 + "value": "stream",
554 + },
555 + },
556 + },
557 ]
558 `);
559 }
@@ -695,9 +712,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
712 [
713 "Object.<anonymous>",
714 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
698 - 659,
715 + 676,
716 40,
700 - 640,
717 + 657,
718 49,
719 ],
720 [
@@ -727,9 +744,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
744 [
745 "Object.<anonymous>",
746 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
730 - 659,
747 + 676,
748 40,
732 - 640,
749 + 657,
750 49,
751 ],
752 [
@@ -746,25 +763,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
763 [
764 "delay",
765 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
749 - 169,
766 + 174,
767 12,
751 - 168,
768 + 173,
769 3,
770 ],
771 [
772 "getData",
773 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
757 - 642,
774 + 659,
775 13,
759 - 641,
776 + 658,
777 5,
778 ],
779 [
780 "Component",
781 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
765 - 647,
782 + 664,
783 36,
767 - 646,
784 + 663,
785 5,
786 ],
787 ],
@@ -783,9 +800,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
800 [
801 "Object.<anonymous>",
802 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
786 - 659,
803 + 676,
804 40,
788 - 640,
805 + 657,
806 49,
807 ],
808 [
@@ -802,17 +819,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
819 [
820 "getData",
821 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
805 - 642,
822 + 659,
823 13,
807 - 641,
824 + 658,
825 5,
826 ],
827 [
828 "Component",
829 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
813 - 647,
830 + 664,
831 36,
815 - 646,
832 + 663,
833 5,
834 ],
835 ],
@@ -832,9 +849,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
849 [
850 "Component",
851 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
835 - 649,
852 + 666,
853 60,
837 - 646,
854 + 663,
855 5,
856 ],
857 ],
@@ -853,9 +870,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
870 [
871 "Object.<anonymous>",
872 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
856 - 659,
873 + 676,
874 40,
858 - 640,
875 + 657,
876 49,
877 ],
878 [
@@ -872,25 +889,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
889 [
890 "delay",
891 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
875 - 169,
892 + 174,
893 12,
877 - 168,
894 + 173,
895 3,
896 ],
897 [
898 "getData",
899 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
883 - 642,
900 + 659,
901 13,
885 - 641,
902 + 658,
903 5,
904 ],
905 [
906 "Component",
907 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
891 - 648,
908 + 665,
909 22,
893 - 646,
910 + 663,
911 5,
912 ],
913 ],
@@ -909,9 +926,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
926 [
927 "Component",
928 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
912 - 649,
929 + 666,
930 60,
914 - 646,
931 + 663,
932 5,
933 ],
934 ],
@@ -920,9 +937,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
937 [
938 "InnerComponent",
939 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
923 - 655,
940 + 672,
941 40,
925 - 652,
942 + 669,
943 5,
944 ],
945 ],
@@ -933,6 +950,18 @@ describe('ReactFlightAsyncDebugInfo', () => {
950 {
951 "time": 0,
952 },
953 + {
954 + "awaited": {
955 + "byteSize": 0,
956 + "end": 0,
957 + "name": "RSC stream",
958 + "owner": null,
959 + "start": 0,
960 + "value": {
961 + "value": "stream",
962 + },
963 + },
964 + },
965 ]
966 `);
967 }
@@ -985,9 +1014,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1014 [
1015 "Object.<anonymous>",
1016 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
988 - 954,
1017 + 983,
1018 109,
990 - 941,
1019 + 970,
1020 80,
1021 ],
1022 ],
@@ -1006,9 +1035,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1035 [
1036 "Object.<anonymous>",
1037 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1009 - 954,
1038 + 983,
1039 109,
1011 - 941,
1040 + 970,
1041 80,
1042 ],
1043 ],
@@ -1025,9 +1054,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1054 [
1055 "Object.<anonymous>",
1056 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1028 - 954,
1057 + 983,
1058 109,
1030 - 941,
1059 + 970,
1060 80,
1061 ],
1062 ],
@@ -1039,6 +1068,18 @@ describe('ReactFlightAsyncDebugInfo', () => {
1068 {
1069 "time": 0,
1070 },
1071 + {
1072 + "awaited": {
1073 + "byteSize": 0,
1074 + "end": 0,
1075 + "name": "RSC stream",
1076 + "owner": null,
1077 + "start": 0,
1078 + "value": {
1079 + "value": "stream",
1080 + },
1081 + },
1082 + },
1083 ]
1084 `);
1085 }
@@ -1087,9 +1128,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1128 [
1129 "Object.<anonymous>",
1130 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1090 - 1056,
1131 + 1097,
1132 109,
1092 - 1047,
1133 + 1088,
1134 94,
1135 ],
1136 ],
@@ -1097,6 +1138,18 @@ describe('ReactFlightAsyncDebugInfo', () => {
1138 {
1139 "time": 0,
1140 },
1141 + {
1142 + "awaited": {
1143 + "byteSize": 0,
1144 + "end": 0,
1145 + "name": "RSC stream",
1146 + "owner": null,
1147 + "start": 0,
1148 + "value": {
1149 + "value": "stream",
1150 + },
1151 + },
1152 + },
1153 ]
1154 `);
1155 }
@@ -1160,9 +1213,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1213 [
1214 "Object.<anonymous>",
1215 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1163 - 1129,
1216 + 1182,
1217 109,
1165 - 1105,
1218 + 1158,
1219 50,
1220 ],
1221 ],
@@ -1188,6 +1241,18 @@ describe('ReactFlightAsyncDebugInfo', () => {
1241 {
1242 "time": 0,
1243 },
1244 + {
1245 + "awaited": {
1246 + "byteSize": 0,
1247 + "end": 0,
1248 + "name": "RSC stream",
1249 + "owner": null,
1250 + "start": 0,
1251 + "value": {
1252 + "value": "stream",
1253 + },
1254 + },
1255 + },
1256 ]
1257 `);
1258 }
@@ -1244,9 +1309,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1309 [
1310 "Object.<anonymous>",
1311 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1247 - 1213,
1312 + 1278,
1313 109,
1249 - 1196,
1314 + 1261,
1315 63,
1316 ],
1317 ],
@@ -1263,17 +1328,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1328 [
1329 "fetchThirdParty",
1330 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1266 - 176,
1331 + 181,
1332 40,
1268 - 174,
1333 + 179,
1334 3,
1335 ],
1336 [
1337 "Component",
1338 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1274 - 1209,
1339 + 1274,
1340 24,
1276 - 1208,
1341 + 1273,
1342 5,
1343 ],
1344 ],
@@ -1295,17 +1360,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1360 [
1361 "fetchThirdParty",
1362 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1298 - 176,
1363 + 181,
1364 40,
1300 - 174,
1365 + 179,
1366 3,
1367 ],
1368 [
1369 "Component",
1370 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1306 - 1209,
1371 + 1274,
1372 24,
1308 - 1208,
1373 + 1273,
1374 5,
1375 ],
1376 ],
@@ -1314,25 +1379,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
1379 [
1380 "delay",
1381 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1317 - 169,
1382 + 174,
1383 12,
1319 - 168,
1384 + 173,
1385 3,
1386 ],
1387 [
1388 "getData",
1389 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1325 - 1198,
1390 + 1263,
1391 13,
1327 - 1197,
1392 + 1262,
1393 5,
1394 ],
1395 [
1396 "ThirdPartyComponent",
1397 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1333 - 1204,
1398 + 1269,
1399 24,
1335 - 1203,
1400 + 1268,
1401 5,
1402 ],
1403 ],
@@ -1351,17 +1416,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1416 [
1417 "fetchThirdParty",
1418 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1354 - 176,
1419 + 181,
1420 40,
1356 - 174,
1421 + 179,
1422 3,
1423 ],
1424 [
1425 "Component",
1426 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1362 - 1209,
1427 + 1274,
1428 24,
1364 - 1208,
1429 + 1273,
1430 5,
1431 ],
1432 ],
@@ -1370,17 +1435,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1435 [
1436 "getData",
1437 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1373 - 1198,
1438 + 1263,
1439 13,
1375 - 1197,
1440 + 1262,
1441 5,
1442 ],
1443 [
1444 "ThirdPartyComponent",
1445 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1381 - 1204,
1446 + 1269,
1447 24,
1383 - 1203,
1448 + 1268,
1449 5,
1450 ],
1451 ],
@@ -1405,17 +1470,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1470 [
1471 "fetchThirdParty",
1472 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1408 - 176,
1473 + 181,
1474 40,
1410 - 174,
1475 + 179,
1476 3,
1477 ],
1478 [
1479 "Component",
1480 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1416 - 1209,
1481 + 1274,
1482 24,
1418 - 1208,
1483 + 1273,
1484 5,
1485 ],
1486 ],
@@ -1424,25 +1489,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
1489 [
1490 "delay",
1491 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1427 - 169,
1492 + 174,
1493 12,
1429 - 168,
1494 + 173,
1495 3,
1496 ],
1497 [
1498 "getData",
1499 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1435 - 1199,
1500 + 1264,
1501 13,
1437 - 1197,
1502 + 1262,
1503 5,
1504 ],
1505 [
1506 "ThirdPartyComponent",
1507 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1443 - 1204,
1508 + 1269,
1509 18,
1445 - 1203,
1510 + 1268,
1511 5,
1512 ],
1513 ],
@@ -1461,17 +1526,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1526 [
1527 "fetchThirdParty",
1528 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1464 - 176,
1529 + 181,
1530 40,
1466 - 174,
1531 + 179,
1532 3,
1533 ],
1534 [
1535 "Component",
1536 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1472 - 1209,
1537 + 1274,
1538 24,
1474 - 1208,
1539 + 1273,
1540 5,
1541 ],
1542 ],
@@ -1480,17 +1545,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1545 [
1546 "getData",
1547 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1483 - 1199,
1548 + 1264,
1549 13,
1485 - 1197,
1550 + 1262,
1551 5,
1552 ],
1553 [
1554 "ThirdPartyComponent",
1555 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1491 - 1204,
1556 + 1269,
1557 18,
1493 - 1203,
1558 + 1268,
1559 5,
1560 ],
1561 ],
@@ -1501,9 +1566,32 @@ describe('ReactFlightAsyncDebugInfo', () => {
1566 {
1567 "time": 0,
1568 },
1569 + {
1570 + "awaited": {
1571 + "byteSize": 0,
1572 + "end": 0,
1573 + "name": "RSC stream",
1574 + "start": 0,
1575 + "value": {
1576 + "value": "stream",
1577 + },
1578 + },
1579 + },
1580 {
1581 "time": 0,
1582 },
1583 + {
1584 + "awaited": {
1585 + "byteSize": 0,
1586 + "end": 0,
1587 + "name": "RSC stream",
1588 + "owner": null,
1589 + "start": 0,
1590 + "value": {
1591 + "value": "stream",
1592 + },
1593 + },
1594 + },
1595 ]
1596 `);
1597 }
@@ -1565,9 +1653,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1653 [
1654 "Object.<anonymous>",
1655 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1568 - 1529,
1656 + 1617,
1657 40,
1570 - 1512,
1658 + 1600,
1659 62,
1660 ],
1661 [
@@ -1597,9 +1685,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1685 [
1686 "Object.<anonymous>",
1687 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1600 - 1529,
1688 + 1617,
1689 40,
1602 - 1512,
1690 + 1600,
1691 62,
1692 ],
1693 [
@@ -1616,25 +1704,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
1704 [
1705 "delay",
1706 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1619 - 169,
1707 + 174,
1708 12,
1621 - 168,
1709 + 173,
1710 3,
1711 ],
1712 [
1713 "getData",
1714 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1627 - 1514,
1715 + 1602,
1716 13,
1629 - 1513,
1717 + 1601,
1718 25,
1719 ],
1720 [
1721 "Component",
1722 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1635 - 1524,
1723 + 1612,
1724 13,
1637 - 1523,
1725 + 1611,
1726 5,
1727 ],
1728 ],
@@ -1653,9 +1741,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1741 [
1742 "Object.<anonymous>",
1743 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1656 - 1529,
1744 + 1617,
1745 40,
1658 - 1512,
1746 + 1600,
1747 62,
1748 ],
1749 [
@@ -1672,17 +1760,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
1760 [
1761 "getData",
1762 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1675 - 1514,
1763 + 1602,
1764 13,
1677 - 1513,
1765 + 1601,
1766 25,
1767 ],
1768 [
1769 "Component",
1770 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1683 - 1524,
1771 + 1612,
1772 13,
1685 - 1523,
1773 + 1611,
1774 5,
1775 ],
1776 ],
@@ -1702,9 +1790,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1790 [
1791 "Component",
1792 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1705 - 1525,
1793 + 1613,
1794 60,
1707 - 1523,
1795 + 1611,
1796 5,
1797 ],
1798 ],
@@ -1726,9 +1814,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1814 [
1815 "Object.<anonymous>",
1816 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1729 - 1529,
1817 + 1617,
1818 40,
1731 - 1512,
1819 + 1600,
1820 62,
1821 ],
1822 [
@@ -1745,25 +1833,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
1833 [
1834 "delay",
1835 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1748 - 169,
1836 + 174,
1837 12,
1750 - 168,
1838 + 173,
1839 3,
1840 ],
1841 [
1842 "getData",
1843 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1756 - 1514,
1844 + 1602,
1845 13,
1758 - 1513,
1846 + 1601,
1847 25,
1848 ],
1849 [
1850 "Component",
1851 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1764 - 1524,
1852 + 1612,
1853 13,
1766 - 1523,
1854 + 1611,
1855 5,
1856 ],
1857 ],
@@ -1782,9 +1870,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1870 [
1871 "Component",
1872 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1785 - 1525,
1873 + 1613,
1874 60,
1787 - 1523,
1875 + 1611,
1876 5,
1877 ],
1878 ],
@@ -1793,9 +1881,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1881 [
1882 "Child",
1883 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1796 - 1519,
1884 + 1607,
1885 28,
1798 - 1518,
1886 + 1606,
1887 5,
1888 ],
1889 ],
@@ -1806,6 +1894,18 @@ describe('ReactFlightAsyncDebugInfo', () => {
1894 {
1895 "time": 0,
1896 },
1897 + {
1898 + "awaited": {
1899 + "byteSize": 0,
1900 + "end": 0,
1901 + "name": "RSC stream",
1902 + "owner": null,
1903 + "start": 0,
1904 + "value": {
1905 + "value": "stream",
1906 + },
1907 + },
1908 + },
1909 ]
1910 `);
1911 }
@@ -1866,9 +1966,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1966 [
1967 "Object.<anonymous>",
1968 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1869 - 1830,
1969 + 1930,
1970 40,
1871 - 1814,
1971 + 1914,
1972 57,
1973 ],
1974 [
@@ -1898,9 +1998,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
1998 [
1999 "Object.<anonymous>",
2000 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1901 - 1830,
2001 + 1930,
2002 40,
1903 - 1814,
2003 + 1914,
2004 57,
2005 ],
2006 [
@@ -1917,25 +2017,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
2017 [
2018 "delay",
2019 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1920 - 169,
2020 + 174,
2021 12,
1922 - 168,
2022 + 173,
2023 3,
2024 ],
2025 [
2026 "getData",
2027 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1928 - 1816,
2028 + 1916,
2029 13,
1930 - 1815,
2030 + 1915,
2031 25,
2032 ],
2033 [
2034 "Component",
2035 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1936 - 1825,
2036 + 1925,
2037 23,
1938 - 1824,
2038 + 1924,
2039 5,
2040 ],
2041 ],
@@ -1954,9 +2054,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2054 [
2055 "Object.<anonymous>",
2056 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1957 - 1830,
2057 + 1930,
2058 40,
1959 - 1814,
2059 + 1914,
2060 57,
2061 ],
2062 [
@@ -1973,17 +2073,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
2073 [
2074 "getData",
2075 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1976 - 1816,
2076 + 1916,
2077 13,
1978 - 1815,
2078 + 1915,
2079 25,
2080 ],
2081 [
2082 "Component",
2083 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
1984 - 1825,
2084 + 1925,
2085 23,
1986 - 1824,
2086 + 1924,
2087 5,
2088 ],
2089 ],
@@ -2003,9 +2103,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2103 [
2104 "Component",
2105 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2006 - 1826,
2106 + 1926,
2107 60,
2008 - 1824,
2108 + 1924,
2109 5,
2110 ],
2111 ],
@@ -2024,9 +2124,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2124 [
2125 "Object.<anonymous>",
2126 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2027 - 1830,
2127 + 1930,
2128 40,
2029 - 1814,
2129 + 1914,
2130 57,
2131 ],
2132 [
@@ -2043,25 +2143,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
2143 [
2144 "delay",
2145 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2046 - 169,
2146 + 174,
2147 12,
2048 - 168,
2148 + 173,
2149 3,
2150 ],
2151 [
2152 "getData",
2153 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2054 - 1816,
2154 + 1916,
2155 13,
2056 - 1815,
2156 + 1915,
2157 25,
2158 ],
2159 [
2160 "Component",
2161 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2062 - 1825,
2162 + 1925,
2163 23,
2064 - 1824,
2164 + 1924,
2165 5,
2166 ],
2167 ],
@@ -2075,9 +2175,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2175 [
2176 "Component",
2177 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2078 - 1826,
2178 + 1926,
2179 60,
2080 - 1824,
2180 + 1924,
2181 5,
2182 ],
2183 ],
@@ -2088,6 +2188,18 @@ describe('ReactFlightAsyncDebugInfo', () => {
2188 {
2189 "time": 0,
2190 },
2191 + {
2192 + "awaited": {
2193 + "byteSize": 0,
2194 + "end": 0,
2195 + "name": "RSC stream",
2196 + "owner": null,
2197 + "start": 0,
2198 + "value": {
2199 + "value": "stream",
2200 + },
2201 + },
2202 + },
2203 ]
2204 `);
2205 }
@@ -2150,9 +2262,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2262 [
2263 "Object.<anonymous>",
2264 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2153 - 2114,
2265 + 2226,
2266 40,
2155 - 2096,
2267 + 2208,
2268 80,
2269 ],
2270 [
@@ -2182,9 +2294,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2294 [
2295 "Object.<anonymous>",
2296 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2185 - 2114,
2297 + 2226,
2298 40,
2187 - 2096,
2299 + 2208,
2300 80,
2301 ],
2302 [
@@ -2201,25 +2313,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
2313 [
2314 "delay",
2315 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2204 - 169,
2316 + 174,
2317 12,
2206 - 168,
2318 + 173,
2319 3,
2320 ],
2321 [
2322 "delayTrice",
2323 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2212 - 2104,
2324 + 2216,
2325 13,
2214 - 2102,
2326 + 2214,
2327 5,
2328 ],
2329 [
2330 "Bar",
2331 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2220 - 2109,
2332 + 2221,
2333 13,
2222 - 2108,
2334 + 2220,
2335 5,
2336 ],
2337 ],
@@ -2238,9 +2350,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2350 [
2351 "Object.<anonymous>",
2352 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2241 - 2114,
2353 + 2226,
2354 40,
2243 - 2096,
2355 + 2208,
2356 80,
2357 ],
2358 [
@@ -2257,17 +2369,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
2369 [
2370 "delayTrice",
2371 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2260 - 2104,
2372 + 2216,
2373 13,
2262 - 2102,
2374 + 2214,
2375 5,
2376 ],
2377 [
2378 "Bar",
2379 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2268 - 2109,
2380 + 2221,
2381 13,
2270 - 2108,
2382 + 2220,
2383 5,
2384 ],
2385 ],
@@ -2289,9 +2401,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2401 [
2402 "Object.<anonymous>",
2403 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2292 - 2114,
2404 + 2226,
2405 40,
2294 - 2096,
2406 + 2208,
2407 80,
2408 ],
2409 [
@@ -2308,33 +2420,33 @@ describe('ReactFlightAsyncDebugInfo', () => {
2420 [
2421 "delay",
2422 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2311 - 169,
2423 + 174,
2424 12,
2313 - 168,
2425 + 173,
2426 3,
2427 ],
2428 [
2429 "delayTwice",
2430 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2319 - 2098,
2431 + 2210,
2432 13,
2321 - 2097,
2433 + 2209,
2434 5,
2435 ],
2436 [
2437 "delayTrice",
2438 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2327 - 2103,
2439 + 2215,
2440 15,
2329 - 2102,
2441 + 2214,
2442 5,
2443 ],
2444 [
2445 "Bar",
2446 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2335 - 2109,
2447 + 2221,
2448 13,
2337 - 2108,
2449 + 2220,
2450 5,
2451 ],
2452 ],
@@ -2353,9 +2465,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2465 [
2466 "Object.<anonymous>",
2467 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2356 - 2114,
2468 + 2226,
2469 40,
2358 - 2096,
2470 + 2208,
2471 80,
2472 ],
2473 [
@@ -2372,25 +2484,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
2484 [
2485 "delayTwice",
2486 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2375 - 2098,
2487 + 2210,
2488 13,
2377 - 2097,
2489 + 2209,
2490 5,
2491 ],
2492 [
2493 "delayTrice",
2494 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2383 - 2103,
2495 + 2215,
2496 15,
2385 - 2102,
2497 + 2214,
2498 5,
2499 ],
2500 [
2501 "Bar",
2502 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2391 - 2109,
2503 + 2221,
2504 13,
2393 - 2108,
2505 + 2220,
2506 5,
2507 ],
2508 ],
@@ -2412,9 +2524,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2524 [
2525 "Object.<anonymous>",
2526 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2415 - 2114,
2527 + 2226,
2528 40,
2417 - 2096,
2529 + 2208,
2530 80,
2531 ],
2532 [
@@ -2431,17 +2543,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
2543 [
2544 "delay",
2545 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2434 - 169,
2546 + 174,
2547 12,
2436 - 168,
2548 + 173,
2549 3,
2550 ],
2551 [
2552 "delayTwice",
2553 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2442 - 2099,
2554 + 2211,
2555 13,
2444 - 2097,
2556 + 2209,
2557 5,
2558 ],
2559 ],
@@ -2460,9 +2572,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2572 [
2573 "Object.<anonymous>",
2574 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2463 - 2114,
2575 + 2226,
2576 40,
2465 - 2096,
2577 + 2208,
2578 80,
2579 ],
2580 [
@@ -2479,9 +2591,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2591 [
2592 "delayTwice",
2593 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2482 - 2099,
2594 + 2211,
2595 13,
2484 - 2097,
2596 + 2209,
2597 5,
2598 ],
2599 ],
@@ -2492,6 +2604,18 @@ describe('ReactFlightAsyncDebugInfo', () => {
2604 {
2605 "time": 0,
2606 },
2607 + {
2608 + "awaited": {
2609 + "byteSize": 0,
2610 + "end": 0,
2611 + "name": "RSC stream",
2612 + "owner": null,
2613 + "start": 0,
2614 + "value": {
2615 + "value": "stream",
2616 + },
2617 + },
2618 + },
2619 ]
2620 `);
2621 }
@@ -2542,9 +2666,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2666 [
2667 "Object.<anonymous>",
2668 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2545 - 2511,
2669 + 2635,
2670 109,
2547 - 2500,
2671 + 2624,
2672 58,
2673 ],
2674 ],
@@ -2566,9 +2690,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2690 [
2691 "Object.<anonymous>",
2692 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2569 - 2511,
2693 + 2635,
2694 109,
2571 - 2500,
2695 + 2624,
2696 58,
2697 ],
2698 ],
@@ -2577,25 +2701,25 @@ describe('ReactFlightAsyncDebugInfo', () => {
2701 [
2702 "delay",
2703 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2580 - 169,
2704 + 174,
2705 12,
2582 - 168,
2706 + 173,
2707 3,
2708 ],
2709 [
2710 "getData",
2711 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2588 - 2502,
2712 + 2626,
2713 14,
2590 - 2501,
2714 + 2625,
2715 5,
2716 ],
2717 [
2718 "Component",
2719 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2596 - 2508,
2720 + 2632,
2721 20,
2598 - 2507,
2722 + 2631,
2723 5,
2724 ],
2725 ],
@@ -2614,9 +2738,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2738 [
2739 "Object.<anonymous>",
2740 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2617 - 2511,
2741 + 2635,
2742 109,
2619 - 2500,
2743 + 2624,
2744 58,
2745 ],
2746 ],
@@ -2625,17 +2749,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
2749 [
2750 "getData",
2751 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2628 - 2502,
2752 + 2626,
2753 23,
2630 - 2501,
2754 + 2625,
2755 5,
2756 ],
2757 [
2758 "Component",
2759 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2636 - 2508,
2760 + 2632,
2761 20,
2638 - 2507,
2762 + 2631,
2763 5,
2764 ],
2765 ],
@@ -2646,6 +2770,18 @@ describe('ReactFlightAsyncDebugInfo', () => {
2770 {
2771 "time": 0,
2772 },
2773 + {
2774 + "awaited": {
2775 + "byteSize": 0,
2776 + "end": 0,
2777 + "name": "RSC stream",
2778 + "owner": null,
2779 + "start": 0,
2780 + "value": {
2781 + "value": "stream",
2782 + },
2783 + },
2784 + },
2785 ]
2786 `);
2787 }
@@ -2702,9 +2838,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2838 [
2839 "Object.<anonymous>",
2840 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2705 - 2666,
2841 + 2802,
2842 40,
2707 - 2654,
2843 + 2790,
2844 56,
2845 ],
2846 [
@@ -2734,9 +2870,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2870 [
2871 "Object.<anonymous>",
2872 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2737 - 2666,
2873 + 2802,
2874 40,
2739 - 2654,
2875 + 2790,
2876 56,
2877 ],
2878 [
@@ -2753,17 +2889,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
2889 [
2890 "delay",
2891 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2756 - 169,
2892 + 174,
2893 12,
2758 - 168,
2894 + 173,
2895 3,
2896 ],
2897 [
2898 "Component",
2899 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2764 - 2662,
2900 + 2798,
2901 20,
2766 - 2661,
2902 + 2797,
2903 5,
2904 ],
2905 ],
@@ -2782,9 +2918,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2918 [
2919 "Object.<anonymous>",
2920 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2785 - 2666,
2921 + 2802,
2922 40,
2787 - 2654,
2923 + 2790,
2924 56,
2925 ],
2926 [
@@ -2801,9 +2937,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
2937 [
2938 "Component",
2939 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2804 - 2662,
2940 + 2798,
2941 20,
2806 - 2661,
2942 + 2797,
2943 5,
2944 ],
2945 ],
@@ -2814,6 +2950,18 @@ describe('ReactFlightAsyncDebugInfo', () => {
2950 {
2951 "time": 0,
2952 },
2953 + {
2954 + "awaited": {
2955 + "byteSize": 0,
2956 + "end": 0,
2957 + "name": "RSC stream",
2958 + "owner": null,
2959 + "start": 0,
2960 + "value": {
2961 + "value": "stream",
2962 + },
2963 + },
2964 + },
2965 ]
2966 `);
2967 }
@@ -2884,9 +3032,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3032 [
3033 "Object.<anonymous>",
3034 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2887 - 2843,
3035 + 2991,
3036 40,
2889 - 2822,
3037 + 2970,
3038 42,
3039 ],
3040 [
@@ -2916,9 +3064,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3064 [
3065 "Object.<anonymous>",
3066 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2919 - 2843,
3067 + 2991,
3068 40,
2921 - 2822,
3069 + 2970,
3070 42,
3071 ],
3072 [
@@ -2935,17 +3083,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
3083 [
3084 "",
3085 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2938 - 2829,
3086 + 2977,
3087 15,
2940 - 2828,
3088 + 2976,
3089 15,
3090 ],
3091 [
3092 "Component",
3093 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2946 - 2838,
3094 + 2986,
3095 19,
2948 - 2837,
3096 + 2985,
3097 5,
3098 ],
3099 ],
@@ -2964,9 +3112,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3112 [
3113 "Object.<anonymous>",
3114 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2967 - 2843,
3115 + 2991,
3116 40,
2969 - 2822,
3117 + 2970,
3118 42,
3119 ],
3120 [
@@ -2983,17 +3131,17 @@ describe('ReactFlightAsyncDebugInfo', () => {
3131 [
3132 "",
3133 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2986 - 2829,
3134 + 2977,
3135 15,
2988 - 2828,
3136 + 2976,
3137 15,
3138 ],
3139 [
3140 "Component",
3141 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
2994 - 2838,
3142 + 2986,
3143 19,
2996 - 2837,
3144 + 2985,
3145 5,
3146 ],
3147 ],
@@ -3015,9 +3163,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3163 [
3164 "Object.<anonymous>",
3165 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3018 - 2843,
3166 + 2991,
3167 40,
3020 - 2822,
3168 + 2970,
3169 42,
3170 ],
3171 [
@@ -3034,9 +3182,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3182 [
3183 "Component",
3184 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3037 - 2838,
3185 + 2986,
3186 25,
3039 - 2837,
3187 + 2985,
3188 5,
3189 ],
3190 ],
@@ -3055,9 +3203,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3203 [
3204 "Object.<anonymous>",
3205 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3058 - 2843,
3206 + 2991,
3207 40,
3060 - 2822,
3208 + 2970,
3209 42,
3210 ],
3211 [
@@ -3074,9 +3222,9 @@ describe('ReactFlightAsyncDebugInfo', () => {
3222 [
3223 "Component",
3224 "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js",
3077 - 2838,
3225 + 2986,
3226 25,
3079 - 2837,
3227 + 2985,
3228 5,
3229 ],
3230 ],
@@ -3087,6 +3235,18 @@ describe('ReactFlightAsyncDebugInfo', () => {
3235 {
3236 "time": 0,
3237 },
3238 + {
3239 + "awaited": {
3240 + "byteSize": 0,
3241 + "end": 0,
3242 + "name": "RSC stream",
3243 + "owner": null,
3244 + "start": 0,
3245 + "value": {
3246 + "value": "stream",
3247 + },
3248 + },
3249 + },
3250 ]
3251 `);
3252 }