Skip to content

Commit 4bdc1b0

Browse files
committed
allow overriding request.timeOrigin via options.startTime
1 parent 49046be commit 4bdc1b0

File tree

12 files changed

+85
-9
lines changed

12 files changed

+85
-9
lines changed

packages/react-server-dom-esm/src/server/ReactFlightDOMServerNode.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import type {ServerManifest} from 'react-client/src/ReactFlightClientConfig';
1717
import type {Busboy} from 'busboy';
1818
import type {Writable} from 'stream';
1919
import type {Thenable} from 'shared/ReactTypes';
20+
import {enableProfilerTimer} from 'shared/ReactFeatureFlags';
2021

2122
import type {Duplex} from 'stream';
2223

@@ -146,6 +147,7 @@ type Options = {
146147
onError?: (error: mixed) => void,
147148
identifierPrefix?: string,
148149
temporaryReferences?: TemporaryReferenceSet,
150+
startTime?: number,
149151
};
150152

151153
type PipeableStream = {
@@ -183,6 +185,7 @@ function renderToPipeableStream(
183185
options ? options.onError : undefined,
184186
options ? options.identifierPrefix : undefined,
185187
options ? options.temporaryReferences : undefined,
188+
enableProfilerTimer && options ? options.startTime : undefined,
186189
__DEV__ && options ? options.environmentName : undefined,
187190
__DEV__ && options ? options.filterStackFrame : undefined,
188191
debugChannel !== undefined,
@@ -272,6 +275,7 @@ type PrerenderOptions = {
272275
identifierPrefix?: string,
273276
temporaryReferences?: TemporaryReferenceSet,
274277
signal?: AbortSignal,
278+
startTime?: number,
275279
};
276280

277281
type StaticResult = {
@@ -303,6 +307,7 @@ function prerenderToNodeStream(
303307
options ? options.onError : undefined,
304308
options ? options.identifierPrefix : undefined,
305309
options ? options.temporaryReferences : undefined,
310+
enableProfilerTimer && options ? options.startTime : undefined,
306311
__DEV__ && options ? options.environmentName : undefined,
307312
__DEV__ && options ? options.filterStackFrame : undefined,
308313
false,

packages/react-server-dom-parcel/src/server/ReactFlightDOMServerBrowser.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ import type {
1212
ReactClientValue,
1313
} from 'react-server/src/ReactFlightServer';
1414
import type {ReactFormState, Thenable} from 'shared/ReactTypes';
15+
16+
import {enableProfilerTimer} from 'shared/ReactFeatureFlags';
17+
1518
import {
1619
preloadModule,
1720
requireModule,
@@ -67,6 +70,7 @@ type Options = {
6770
signal?: AbortSignal,
6871
temporaryReferences?: TemporaryReferenceSet,
6972
onError?: (error: mixed) => void,
73+
startTime?: number,
7074
};
7175

7276
function startReadingFromDebugChannelReadableStream(
@@ -128,6 +132,7 @@ export function renderToReadableStream(
128132
options ? options.onError : undefined,
129133
options ? options.identifierPrefix : undefined,
130134
options ? options.temporaryReferences : undefined,
135+
enableProfilerTimer && options ? options.startTime : undefined,
131136
__DEV__ && options ? options.environmentName : undefined,
132137
__DEV__ && options ? options.filterStackFrame : undefined,
133138
debugChannelReadable !== undefined,
@@ -215,6 +220,7 @@ export function prerender(
215220
options ? options.onError : undefined,
216221
options ? options.identifierPrefix : undefined,
217222
options ? options.temporaryReferences : undefined,
223+
enableProfilerTimer && options ? options.startTime : undefined,
218224
__DEV__ && options ? options.environmentName : undefined,
219225
__DEV__ && options ? options.filterStackFrame : undefined,
220226
false,

packages/react-server-dom-parcel/src/server/ReactFlightDOMServerEdge.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import type {
1212
ReactClientValue,
1313
} from 'react-server/src/ReactFlightServer';
1414
import type {ReactFormState, Thenable} from 'shared/ReactTypes';
15+
import {enableProfilerTimer} from 'shared/ReactFeatureFlags';
16+
1517
import {
1618
preloadModule,
1719
requireModule,
@@ -72,6 +74,7 @@ type Options = {
7274
signal?: AbortSignal,
7375
temporaryReferences?: TemporaryReferenceSet,
7476
onError?: (error: mixed) => void,
77+
startTime?: number,
7578
};
7679

7780
function startReadingFromDebugChannelReadableStream(
@@ -133,6 +136,7 @@ export function renderToReadableStream(
133136
options ? options.onError : undefined,
134137
options ? options.identifierPrefix : undefined,
135138
options ? options.temporaryReferences : undefined,
139+
enableProfilerTimer && options ? options.startTime : undefined,
136140
__DEV__ && options ? options.environmentName : undefined,
137141
__DEV__ && options ? options.filterStackFrame : undefined,
138142
debugChannelReadable !== undefined,
@@ -220,6 +224,7 @@ export function prerender(
220224
options ? options.onError : undefined,
221225
options ? options.identifierPrefix : undefined,
222226
options ? options.temporaryReferences : undefined,
227+
enableProfilerTimer && options ? options.startTime : undefined,
223228
__DEV__ && options ? options.environmentName : undefined,
224229
__DEV__ && options ? options.filterStackFrame : undefined,
225230
false,

packages/react-server-dom-parcel/src/server/ReactFlightDOMServerNode.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import type {Destination} from 'react-server/src/ReactServerStreamConfigNode';
1515
import type {Busboy} from 'busboy';
1616
import type {Writable} from 'stream';
1717
import type {ReactFormState, Thenable} from 'shared/ReactTypes';
18+
import {enableProfilerTimer} from 'shared/ReactFeatureFlags';
1819
import type {
1920
ServerManifest,
2021
ServerReferenceId,
@@ -159,6 +160,7 @@ type Options = {
159160
onError?: (error: mixed) => void,
160161
identifierPrefix?: string,
161162
temporaryReferences?: TemporaryReferenceSet,
163+
startTime?: number,
162164
};
163165

164166
type PipeableStream = {
@@ -195,6 +197,7 @@ export function renderToPipeableStream(
195197
options ? options.onError : undefined,
196198
options ? options.identifierPrefix : undefined,
197199
options ? options.temporaryReferences : undefined,
200+
enableProfilerTimer && options ? options.startTime : undefined,
198201
__DEV__ && options ? options.environmentName : undefined,
199202
__DEV__ && options ? options.filterStackFrame : undefined,
200203
debugChannel !== undefined,
@@ -434,6 +437,7 @@ type PrerenderOptions = {
434437
identifierPrefix?: string,
435438
temporaryReferences?: TemporaryReferenceSet,
436439
signal?: AbortSignal,
440+
startTime?: number,
437441
};
438442

439443
type StaticResult = {
@@ -464,6 +468,7 @@ export function prerenderToNodeStream(
464468
options ? options.onError : undefined,
465469
options ? options.identifierPrefix : undefined,
466470
options ? options.temporaryReferences : undefined,
471+
enableProfilerTimer && options ? options.startTime : undefined,
467472
__DEV__ && options ? options.environmentName : undefined,
468473
__DEV__ && options ? options.filterStackFrame : undefined,
469474
false,

packages/react-server-dom-turbopack/src/server/ReactFlightDOMServerBrowser.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import type {
1212
ReactClientValue,
1313
} from 'react-server/src/ReactFlightServer';
1414
import type {Thenable} from 'shared/ReactTypes';
15+
import {enableProfilerTimer} from 'shared/ReactFeatureFlags';
1516
import type {ClientManifest} from './ReactFlightServerConfigTurbopackBundler';
1617
import type {ServerManifest} from 'react-client/src/ReactFlightClientConfig';
1718

@@ -64,6 +65,7 @@ type Options = {
6465
signal?: AbortSignal,
6566
temporaryReferences?: TemporaryReferenceSet,
6667
onError?: (error: mixed) => void,
68+
startTime?: number,
6769
};
6870

6971
function startReadingFromDebugChannelReadableStream(
@@ -126,6 +128,7 @@ function renderToReadableStream(
126128
options ? options.onError : undefined,
127129
options ? options.identifierPrefix : undefined,
128130
options ? options.temporaryReferences : undefined,
131+
enableProfilerTimer && options ? options.startTime : undefined,
129132
__DEV__ && options ? options.environmentName : undefined,
130133
__DEV__ && options ? options.filterStackFrame : undefined,
131134
debugChannelReadable !== undefined,
@@ -214,6 +217,7 @@ function prerender(
214217
options ? options.onError : undefined,
215218
options ? options.identifierPrefix : undefined,
216219
options ? options.temporaryReferences : undefined,
220+
enableProfilerTimer && options ? options.startTime : undefined,
217221
__DEV__ && options ? options.environmentName : undefined,
218222
__DEV__ && options ? options.filterStackFrame : undefined,
219223
false,

packages/react-server-dom-turbopack/src/server/ReactFlightDOMServerEdge.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import type {
1212
ReactClientValue,
1313
} from 'react-server/src/ReactFlightServer';
1414
import type {Thenable} from 'shared/ReactTypes';
15+
import {enableProfilerTimer} from 'shared/ReactFeatureFlags';
1516
import type {ClientManifest} from './ReactFlightServerConfigTurbopackBundler';
1617
import type {ServerManifest} from 'react-client/src/ReactFlightClientConfig';
1718

@@ -69,6 +70,7 @@ type Options = {
6970
signal?: AbortSignal,
7071
temporaryReferences?: TemporaryReferenceSet,
7172
onError?: (error: mixed) => void,
73+
startTime?: number,
7274
};
7375

7476
function startReadingFromDebugChannelReadableStream(
@@ -131,6 +133,7 @@ function renderToReadableStream(
131133
options ? options.onError : undefined,
132134
options ? options.identifierPrefix : undefined,
133135
options ? options.temporaryReferences : undefined,
136+
enableProfilerTimer && options ? options.startTime : undefined,
134137
__DEV__ && options ? options.environmentName : undefined,
135138
__DEV__ && options ? options.filterStackFrame : undefined,
136139
debugChannelReadable !== undefined,
@@ -219,6 +222,7 @@ function prerender(
219222
options ? options.onError : undefined,
220223
options ? options.identifierPrefix : undefined,
221224
options ? options.temporaryReferences : undefined,
225+
enableProfilerTimer && options ? options.startTime : undefined,
222226
__DEV__ && options ? options.environmentName : undefined,
223227
__DEV__ && options ? options.filterStackFrame : undefined,
224228
false,

packages/react-server-dom-turbopack/src/server/ReactFlightDOMServerNode.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import type {ServerManifest} from 'react-client/src/ReactFlightClientConfig';
1717
import type {Busboy} from 'busboy';
1818
import type {Writable} from 'stream';
1919
import type {Thenable} from 'shared/ReactTypes';
20+
import {enableProfilerTimer} from 'shared/ReactFeatureFlags';
2021

2122
import type {Duplex} from 'stream';
2223

@@ -152,6 +153,7 @@ type Options = {
152153
onError?: (error: mixed) => void,
153154
identifierPrefix?: string,
154155
temporaryReferences?: TemporaryReferenceSet,
156+
startTime?: number,
155157
};
156158

157159
type PipeableStream = {
@@ -189,6 +191,7 @@ function renderToPipeableStream(
189191
options ? options.onError : undefined,
190192
options ? options.identifierPrefix : undefined,
191193
options ? options.temporaryReferences : undefined,
194+
enableProfilerTimer && options ? options.startTime : undefined,
192195
__DEV__ && options ? options.environmentName : undefined,
193196
__DEV__ && options ? options.filterStackFrame : undefined,
194197
debugChannel !== undefined,
@@ -429,6 +432,7 @@ type PrerenderOptions = {
429432
identifierPrefix?: string,
430433
temporaryReferences?: TemporaryReferenceSet,
431434
signal?: AbortSignal,
435+
startTime?: number,
432436
};
433437

434438
type StaticResult = {
@@ -460,6 +464,7 @@ function prerenderToNodeStream(
460464
options ? options.onError : undefined,
461465
options ? options.identifierPrefix : undefined,
462466
options ? options.temporaryReferences : undefined,
467+
enableProfilerTimer && options ? options.startTime : undefined,
463468
__DEV__ && options ? options.environmentName : undefined,
464469
__DEV__ && options ? options.filterStackFrame : undefined,
465470
false,

packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMNode-test.js

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1635,6 +1635,7 @@ describe('ReactFlightDOMNode', () => {
16351635
async function reencodeFlightStream(
16361636
staticChunks,
16371637
dynamicChunks,
1638+
startTime,
16381639
serverConsumerManifest,
16391640
) {
16401641
let staticEndTime = -1;
@@ -1663,7 +1664,11 @@ describe('ReactFlightDOMNode', () => {
16631664
const stream = ReactServerDOMServer.renderToPipeableStream(
16641665
decoded,
16651666
webpackMap,
1666-
{filterStackFrame},
1667+
{
1668+
filterStackFrame,
1669+
// Pass in the original render's startTime to avoid omitting its IO info.
1670+
startTime,
1671+
},
16671672
);
16681673

16691674
const passThrough = new Stream.PassThrough(streamOptions);
@@ -1732,6 +1737,8 @@ describe('ReactFlightDOMNode', () => {
17321737

17331738
// 1. Render <App />, dividing the output into static and dynamic content.
17341739

1740+
let startTime = -1;
1741+
17351742
let isStatic = true;
17361743
const chunks1 = {
17371744
static: [],
@@ -1740,11 +1747,14 @@ describe('ReactFlightDOMNode', () => {
17401747

17411748
await new Promise(resolve => {
17421749
setTimeout(async () => {
1750+
startTime = performance.now() + performance.timeOrigin;
1751+
17431752
const stream = ReactServerDOMServer.renderToPipeableStream(
17441753
ReactServer.createElement(App),
17451754
webpackMap,
17461755
{
17471756
filterStackFrame,
1757+
startTime,
17481758
environmentName() {
17491759
return isStatic ? 'Prerender' : 'Server';
17501760
},
@@ -1783,6 +1793,7 @@ describe('ReactFlightDOMNode', () => {
17831793
await reencodeFlightStream(
17841794
chunks1.static,
17851795
chunks1.dynamic,
1796+
startTime,
17861797
serverConsumerManifest,
17871798
);
17881799

@@ -1851,9 +1862,7 @@ describe('ReactFlightDOMNode', () => {
18511862

18521863
expect(normalizeCodeLocInfo(componentStack)).toBe(
18531864
'\n' +
1854-
// TODO: IO info is getting omitted when reencoding
1855-
// ' in Dynamic (at **)\n' +
1856-
' in Dynamic\n' +
1865+
' in Dynamic (at **)\n' +
18571866
' in section\n' +
18581867
' in Suspense\n' +
18591868
' in body\n' +
@@ -1862,10 +1871,7 @@ describe('ReactFlightDOMNode', () => {
18621871
' in ClientRoot (at **)',
18631872
);
18641873
expect(normalizeCodeLocInfo(ownerStack)).toBe(
1865-
'\n' +
1866-
// TODO: IO info is getting omitted when reencoding
1867-
// ' in Dynamic (at **)\n' +
1868-
' in App (at **)',
1874+
'\n' + ' in Dynamic (at **)\n' + ' in App (at **)',
18691875
);
18701876

18711877
expect(result).toContain(
@@ -1948,6 +1954,8 @@ describe('ReactFlightDOMNode', () => {
19481954

19491955
// 1. Render <App />, dividing the output into static and dynamic content.
19501956

1957+
let startTime = -1;
1958+
19511959
let isStatic = true;
19521960
const chunks1 = {
19531961
static: [],
@@ -1956,11 +1964,14 @@ describe('ReactFlightDOMNode', () => {
19561964

19571965
await new Promise(resolve => {
19581966
setTimeout(async () => {
1967+
startTime = performance.now() + performance.timeOrigin;
1968+
19591969
const stream = ReactServerDOMServer.renderToPipeableStream(
19601970
ReactServer.createElement(App),
19611971
webpackMap,
19621972
{
19631973
filterStackFrame,
1974+
startTime,
19641975
environmentName() {
19651976
return isStatic ? 'Prerender' : 'Server';
19661977
},
@@ -1994,6 +2005,7 @@ describe('ReactFlightDOMNode', () => {
19942005
await reencodeFlightStream(
19952006
chunks1.static,
19962007
chunks1.dynamic,
2008+
startTime,
19972009
serverConsumerManifestForFlight,
19982010
);
19992011

packages/react-server-dom-webpack/src/server/ReactFlightDOMServerBrowser.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import type {Thenable} from 'shared/ReactTypes';
1515
import type {ClientManifest} from './ReactFlightServerConfigWebpackBundler';
1616
import type {ServerManifest} from 'react-client/src/ReactFlightClientConfig';
1717

18+
import {enableProfilerTimer} from 'shared/ReactFeatureFlags';
19+
1820
import {
1921
createRequest,
2022
createPrerenderRequest,
@@ -64,6 +66,7 @@ type Options = {
6466
signal?: AbortSignal,
6567
temporaryReferences?: TemporaryReferenceSet,
6668
onError?: (error: mixed) => void,
69+
startTime?: number,
6770
};
6871

6972
function startReadingFromDebugChannelReadableStream(
@@ -126,6 +129,7 @@ function renderToReadableStream(
126129
options ? options.onError : undefined,
127130
options ? options.identifierPrefix : undefined,
128131
options ? options.temporaryReferences : undefined,
132+
enableProfilerTimer && options ? options.startTime : undefined,
129133
__DEV__ && options ? options.environmentName : undefined,
130134
__DEV__ && options ? options.filterStackFrame : undefined,
131135
debugChannelReadable !== undefined,
@@ -214,6 +218,7 @@ function prerender(
214218
options ? options.onError : undefined,
215219
options ? options.identifierPrefix : undefined,
216220
options ? options.temporaryReferences : undefined,
221+
enableProfilerTimer && options ? options.startTime : undefined,
217222
__DEV__ && options ? options.environmentName : undefined,
218223
__DEV__ && options ? options.filterStackFrame : undefined,
219224
false,

0 commit comments

Comments
 (0)