Skip to content

Commit 630c5e8

Browse files
fix: use discriminated union for formatExceptionMessage to show render-specific label
Rendering callers now pass { renderingRequest } and get the original "JS code for rendering request was:" label, while non-rendering callers (upload-assets) pass { label, content } with an explicit label. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 16d6458 commit 630c5e8

4 files changed

Lines changed: 28 additions & 15 deletions

File tree

packages/react-on-rails-pro-node-renderer/src/shared/utils.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,20 @@ export function errorResponseResult(msg: string, tracingContext?: TracingContext
5858
};
5959
}
6060

61+
export type RequestInfo = { renderingRequest: string } | { label: string; content: string };
62+
6163
/**
62-
* @param requestDescription A description of the request that caused the error (e.g. JS code or a task description)
64+
* @param request Either a rendering request (auto-labeled) or a { label, content } pair
6365
* @param error The error that was thrown (typed as `unknown` to minimize casts in `catch`)
6466
* @param context Optional context to include in the error message
6567
*/
66-
export function formatExceptionMessage(requestDescription: string, error: unknown, context?: string) {
68+
export function formatExceptionMessage(request: RequestInfo, error: unknown, context?: string) {
69+
const label = 'renderingRequest' in request ? 'JS code for rendering request was:' : request.label;
70+
const content = 'renderingRequest' in request ? request.renderingRequest : request.content;
71+
6772
return `${context ? `\nContext:\n${context}\n` : ''}
68-
Request:
69-
${smartTrim(requestDescription)}
73+
${label}
74+
${smartTrim(content)}
7075
7176
EXCEPTION MESSAGE:
7277
${(error as Error).message || error}

packages/react-on-rails-pro-node-renderer/src/worker.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -300,15 +300,15 @@ export default function run(config: Partial<Config>) {
300300
await setResponse(result, res);
301301
} catch (err) {
302302
const exceptionMessage = formatExceptionMessage(
303-
renderingRequest,
303+
{ renderingRequest },
304304
err,
305305
'UNHANDLED error in handleRenderRequest',
306306
);
307307
await setResponse(errorResponseResult(exceptionMessage, context), res);
308308
}
309309
}, startSsrRequestOptions({ renderingRequest }));
310310
} catch (theErr) {
311-
const exceptionMessage = formatExceptionMessage(renderingRequest, theErr);
311+
const exceptionMessage = formatExceptionMessage({ renderingRequest }, theErr);
312312
await setResponse(errorResponseResult(`Unhandled top level error: ${exceptionMessage}`), res);
313313
}
314314
});
@@ -353,7 +353,7 @@ export default function run(config: Partial<Config>) {
353353

354354
if (!wasLockAcquired) {
355355
const msg = formatExceptionMessage(
356-
taskDescription,
356+
{ label: 'Request:', content: taskDescription },
357357
errorMessage,
358358
`Failed to acquire lock ${lockfileName}. Worker: ${workerIdLabel()}.`,
359359
);

packages/react-on-rails-pro-node-renderer/src/worker/handleRenderRequest.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,11 @@ async function prepareResult(
4242
let exceptionMessage = null;
4343
if (!result) {
4444
const error = new Error('INVALID NIL or NULL result for rendering');
45-
exceptionMessage = formatExceptionMessage(renderingRequest, error, 'INVALID result for prepareResult');
45+
exceptionMessage = formatExceptionMessage(
46+
{ renderingRequest },
47+
error,
48+
'INVALID result for prepareResult',
49+
);
4650
} else if (isErrorRenderResult(result)) {
4751
({ exceptionMessage } = result);
4852
}
@@ -65,7 +69,11 @@ async function prepareResult(
6569
data: result,
6670
};
6771
} catch (err) {
68-
const exceptionMessage = formatExceptionMessage(renderingRequest, err, 'Unknown error calling runInVM');
72+
const exceptionMessage = formatExceptionMessage(
73+
{ renderingRequest },
74+
err,
75+
'Unknown error calling runInVM',
76+
);
6977
return errorResponseResult(exceptionMessage);
7078
}
7179
}
@@ -95,7 +103,7 @@ async function handleNewBundleProvided(
95103

96104
if (!wasLockAcquired) {
97105
const msg = formatExceptionMessage(
98-
renderingRequest,
106+
{ renderingRequest },
99107
errorMessage,
100108
`Failed to acquire lock ${lockfileName}. Worker: ${workerIdLabel()}.`,
101109
);
@@ -118,7 +126,7 @@ async function handleNewBundleProvided(
118126
const fileExists = await fileExistsAsync(bundleFilePathPerTimestamp);
119127
if (!fileExists) {
120128
const msg = formatExceptionMessage(
121-
renderingRequest,
129+
{ renderingRequest },
122130
error,
123131
`Unexpected error when moving the bundle from ${providedNewBundle.bundle.savedFilePath} \
124132
to ${bundleFilePathPerTimestamp})`,
@@ -140,7 +148,7 @@ to ${bundleFilePathPerTimestamp})`,
140148
await unlock(lockfileName);
141149
} catch (error) {
142150
const msg = formatExceptionMessage(
143-
renderingRequest,
151+
{ renderingRequest },
144152
error,
145153
`Error unlocking ${lockfileName} from worker ${workerIdLabel()}.`,
146154
);
@@ -258,7 +266,7 @@ export async function handleRenderRequest({
258266
return await prepareResult(renderingRequest, entryBundleFilePath);
259267
} catch (error) {
260268
const msg = formatExceptionMessage(
261-
renderingRequest,
269+
{ renderingRequest },
262270
error,
263271
'Caught top level error in handleRenderRequest',
264272
);

packages/react-on-rails-pro-node-renderer/src/worker/vm.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ ${smartTrim(renderingRequest)}`);
153153

154154
if (isReadableStream(result)) {
155155
const newStreamAfterHandlingError = handleStreamError(result, (error) => {
156-
const msg = formatExceptionMessage(renderingRequest, error, 'Error in a rendering stream');
156+
const msg = formatExceptionMessage({ renderingRequest }, error, 'Error in a rendering stream');
157157
errorReporter.message(msg);
158158
});
159159
return newStreamAfterHandlingError;
@@ -172,7 +172,7 @@ ${smartTrim(result)}`);
172172

173173
return result;
174174
} catch (exception) {
175-
const exceptionMessage = formatExceptionMessage(renderingRequest, exception);
175+
const exceptionMessage = formatExceptionMessage({ renderingRequest }, exception);
176176
log.debug('Caught exception in rendering request: %s', exceptionMessage);
177177
return Promise.resolve({ exceptionMessage });
178178
}

0 commit comments

Comments
 (0)