Skip to content

Commit ebccced

Browse files
committed
Revert "Stop outlining unless absolutely necessary"
This reverts commit cec2e82.
1 parent cec2e82 commit ebccced

2 files changed

Lines changed: 26 additions & 10 deletions

File tree

packages/react-client/src/ReactFlightClient.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3559,8 +3559,18 @@ function resolveErrorDev(
35593559

35603560
(error: any).name = name;
35613561
(error: any).environmentName = env;
3562-
if ('cause' in errorInfo) {
3563-
(error: any).cause = errorInfo.cause;
3562+
const causeInfo = errorInfo.cause;
3563+
if (typeof causeInfo === 'string') {
3564+
// TODO: What bad things can I do by controling the cause reference?
3565+
const causeReference = causeInfo.slice(1);
3566+
const cause = getOutlinedModel(
3567+
response,
3568+
causeReference,
3569+
{},
3570+
'',
3571+
createModel,
3572+
);
3573+
(error: any).cause = cause;
35643574
}
35653575
return error;
35663576
}

packages/react-server/src/ReactFlightServer.js

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4173,7 +4173,9 @@ function serializeErrorValue(request: Request, error: Error): string {
41734173
}
41744174
const errorInfo: ReactErrorInfoDev = {name, message, stack, env};
41754175
if ('cause' in error) {
4176-
errorInfo.cause = error.cause;
4176+
const cause: ReactClientValue = (error.cause: any);
4177+
const causeId = outlineModel(request, cause);
4178+
errorInfo.cause = serializeByValueID(causeId);
41774179
}
41784180
const id = outlineModel(request, errorInfo);
41794181
return '$Z' + id.toString(16);
@@ -4185,7 +4187,11 @@ function serializeErrorValue(request: Request, error: Error): string {
41854187
}
41864188
}
41874189

4188-
function serializeDebugErrorValue(request: Request, error: Error): string {
4190+
function serializeDebugErrorValue(
4191+
request: Request,
4192+
counter: {objectLimit: number},
4193+
error: Error,
4194+
): string {
41894195
if (__DEV__) {
41904196
let name: string = 'Error';
41914197
let message: string;
@@ -4208,7 +4214,10 @@ function serializeDebugErrorValue(request: Request, error: Error): string {
42084214
}
42094215
const errorInfo: ReactErrorInfoDev = {name, message, stack, env};
42104216
if ('cause' in error) {
4211-
errorInfo.cause = error.cause;
4217+
counter.objectLimit--;
4218+
const cause: ReactClientValue = (error.cause: any);
4219+
const causeId = outlineDebugModel(request, counter, cause);
4220+
errorInfo.cause = serializeByValueID(causeId);
42124221
}
42134222
const id = outlineDebugModel(
42144223
request,
@@ -4252,10 +4261,7 @@ function emitErrorChunk(
42524261
env = errorEnv;
42534262
}
42544263
if ('cause' in error) {
4255-
// We're stringifying the error info without a replacer so we need to
4256-
// make sure the Flight Client can revive the cause.
4257-
// TODO: outline model accepts a serializeable value instead of a ready Client value
4258-
const cause: ReactClientValue = (error.cause: $FlowFixMe);
4264+
const cause: ReactClientValue = (error.cause: any);
42594265
const causeId = debug
42604266
? outlineDebugModel(request, {objectLimit: 5}, cause)
42614267
: outlineModel(request, cause);
@@ -4990,7 +4996,7 @@ function renderDebugModel(
49904996
return serializeDebugFormData(request, value);
49914997
}
49924998
if (value instanceof Error) {
4993-
return serializeDebugErrorValue(request, value);
4999+
return serializeDebugErrorValue(request, counter, value);
49945000
}
49955001
if (value instanceof ArrayBuffer) {
49965002
return serializeDebugTypedArray(request, 'A', new Uint8Array(value));

0 commit comments

Comments
 (0)