Skip to content

Commit 9cd81f9

Browse files
Enhance error handling in server component rendering and RSC payload processing by adding catch blocks for promise rejections and error events in streams.
1 parent f428d6b commit 9cd81f9

File tree

4 files changed

+22
-11
lines changed

4 files changed

+22
-11
lines changed

node_package/src/ReactOnRailsRSC.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,12 @@ const streamRenderRSCComponent = (
5050

5151
const initializeAndRender = async () => {
5252
if (!serverRendererPromise) {
53-
serverRendererPromise = loadJsonFile<BundleManifest>(reactClientManifestFileName).then(
54-
(reactClientManifest) => buildServerRenderer(reactClientManifest),
55-
);
53+
serverRendererPromise = loadJsonFile<BundleManifest>(reactClientManifestFileName)
54+
.then((reactClientManifest) => buildServerRenderer(reactClientManifest))
55+
.catch((err: unknown) => {
56+
serverRendererPromise = undefined;
57+
throw err;
58+
});
5659
}
5760

5861
const { renderToPipeableStream } = await serverRendererPromise;

node_package/src/getReactServerComponent.server.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,14 @@ const createFromReactOnRailsNodeStream = async (
2121
clientRendererPromise = Promise.all([
2222
loadJsonFile<BundleManifest>(reactServerManifestFileName),
2323
loadJsonFile<BundleManifest>(reactClientManifestFileName),
24-
]).then(([reactServerManifest, reactClientManifest]) =>
25-
buildClientRenderer(reactClientManifest, reactServerManifest),
26-
);
24+
])
25+
.then(([reactServerManifest, reactClientManifest]) =>
26+
buildClientRenderer(reactClientManifest, reactServerManifest),
27+
)
28+
.catch((err: unknown) => {
29+
clientRendererPromise = undefined;
30+
throw err;
31+
});
2732
}
2833

2934
const { createFromNodeStream } = await clientRendererPromise;

node_package/src/injectRSCPayload.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,10 @@ export default function injectRSCPayload(
122122
}, 0);
123123
});
124124

125+
htmlStream.on('error', (err) => {
126+
resultStream.emit('error', err);
127+
});
128+
125129
htmlStream.on('end', () => {
126130
if (timeout) {
127131
clearTimeout(timeout);

node_package/src/types/index.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -481,11 +481,10 @@ export interface ReactOnRailsInternal extends ReactOnRails {
481481
) => Promise<NodeJS.ReadableStream>;
482482

483483
/**
484-
/**
485-
* Retrieves all React Server Component (RSC) payload streams generated for a specific rendering request.
486-
* @param railsContext - The Rails context of the current rendering request.
487-
* @returns An array of objects, each containing the component name and its corresponding NodeJS.ReadableStream.
488-
*/
484+
* Retrieves all React Server Component (RSC) payload streams generated for a specific rendering request.
485+
* @param railsContext - The Rails context of the current rendering request.
486+
* @returns An array of objects, each containing the component name and its corresponding NodeJS.ReadableStream.
487+
*/
489488
getRSCPayloadStreams?: (railsContext: RailsContextWithServerComponentCapabilities) => {
490489
componentName: string;
491490
props: unknown;

0 commit comments

Comments
 (0)