Skip to content

Commit 4e8d41c

Browse files
introduce StreamableComponentResult for improved type safety in streaming components
1 parent e575b64 commit 4e8d41c

File tree

3 files changed

+8
-10
lines changed

3 files changed

+8
-10
lines changed

node_package/src/ReactOnRailsRSC.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import { renderToPipeableStream } from 'react-on-rails-rsc/server.node';
22
import { PassThrough, Readable } from 'stream';
3-
import type { ReactElement } from 'react';
43

5-
import { RSCRenderParams, StreamRenderState } from './types';
4+
import { RSCRenderParams, StreamRenderState, StreamableComponentResult } from './types';
65
import ReactOnRails from './ReactOnRails.full';
76
import buildConsoleReplay from './buildConsoleReplay';
87
import handleError from './handleError';
@@ -22,7 +21,7 @@ const stringToStream = (str: string) => {
2221
};
2322

2423
const streamRenderRSCComponent = (
25-
reactRenderingResult: ReactElement | Promise<ReactElement | string>,
24+
reactRenderingResult: StreamableComponentResult,
2625
options: RSCRenderParams,
2726
): Readable => {
2827
const { throwJsErrors, reactClientManifestFileName } = options;

node_package/src/streamServerRenderedReactComponent.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
import * as React from 'react';
22
import * as ReactDOMServer from 'react-dom/server';
33
import { PassThrough, Readable } from 'stream';
4-
import type { ReactElement } from 'react';
54

65
import ComponentRegistry from './ComponentRegistry';
76
import createReactOutput from './createReactOutput';
87
import { isPromise, isServerRenderHash } from './isServerRenderResult';
98
import buildConsoleReplay from './buildConsoleReplay';
109
import handleError from './handleError';
1110
import { createResultObject, convertToError, validateComponent } from './serverRenderUtils';
12-
import type { RenderParams, StreamRenderState } from './types';
11+
import type { RenderParams, StreamRenderState, StreamableComponentResult } from './types';
1312

1413
type BufferedEvent = {
1514
event: 'data' | 'error' | 'end';
@@ -123,7 +122,7 @@ export const transformRenderStreamChunksToResultObject = (renderState: StreamRen
123122
};
124123

125124
const streamRenderReactComponent = (
126-
reactRenderingResult: ReactElement | Promise<ReactElement | string>,
125+
reactRenderingResult: StreamableComponentResult,
127126
options: RenderParams,
128127
) => {
129128
const { name: componentName, throwJsErrors, domNodeId } = options;
@@ -188,10 +187,7 @@ const streamRenderReactComponent = (
188187
return readableStream;
189188
};
190189

191-
type StreamRenderer<T, P extends RenderParams> = (
192-
reactElement: ReactElement | Promise<ReactElement | string>,
193-
options: P,
194-
) => T;
190+
type StreamRenderer<T, P extends RenderParams> = (reactElement: StreamableComponentResult, options: P) => T;
195191

196192
export const streamServerRenderedComponent = <T, P extends RenderParams>(
197193
options: P,

node_package/src/types/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ type RenderFunctionAsyncResult = Promise<string | ServerRenderHashRenderedHtml |
6969

7070
type RenderFunctionResult = RenderFunctionSyncResult | RenderFunctionAsyncResult;
7171

72+
type StreamableComponentResult = ReactElement | Promise<ReactElement | string>;
73+
7274
/**
7375
* Render functions are used to create dynamic React components or server-rendered HTML with side effects.
7476
* They receive two arguments: props and railsContext.
@@ -117,6 +119,7 @@ export type {
117119
CreateReactOutputAsyncResult,
118120
RenderFunctionSyncResult,
119121
RenderFunctionAsyncResult,
122+
StreamableComponentResult,
120123
};
121124

122125
export interface RegisteredComponent {

0 commit comments

Comments
 (0)