Skip to content

Commit f38ed50

Browse files
make render function returns Readable stream instead of PassThrough
1 parent 0d426c7 commit f38ed50

File tree

3 files changed

+11
-10
lines changed

3 files changed

+11
-10
lines changed

node_package/src/ReactOnRails.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { ReactElement } from 'react';
2-
import type { PassThrough } from 'stream';
2+
import type { Readable } from 'stream';
33

44
import * as ClientStartup from './clientStartup';
55
import handleError from './handleError';
@@ -246,7 +246,7 @@ ctx.ReactOnRails = {
246246
* Used by server rendering by Rails
247247
* @param options
248248
*/
249-
streamServerRenderedReactComponent(options: RenderParams): PassThrough {
249+
streamServerRenderedReactComponent(options: RenderParams): Readable {
250250
return streamServerRenderedReactComponent(options);
251251
},
252252

node_package/src/serverRenderReactComponent.ts

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import ReactDOMServer from 'react-dom/server';
2-
import { PassThrough } from 'stream';
2+
import { PassThrough, Readable } from 'stream';
33
import type { ReactElement } from 'react';
44

55
import ComponentRegistry from './ComponentRegistry';
@@ -167,17 +167,17 @@ const serverRenderReactComponent: typeof serverRenderReactComponentInternal = (o
167167
}
168168
};
169169

170-
const stringToStream = (str: string) => {
170+
const stringToStream = (str: string): Readable => {
171171
const stream = new PassThrough();
172172
stream.push(str);
173173
stream.push(null);
174174
return stream;
175175
};
176176

177-
export const streamServerRenderedReactComponent = (options: RenderParams) => {
177+
export const streamServerRenderedReactComponent = (options: RenderParams): Readable => {
178178
const { name, domNodeId, trace, props, railsContext, throwJsErrors } = options;
179179

180-
let renderResult: null | PassThrough = null;
180+
let renderResult: null | Readable = null;
181181

182182
try {
183183
const componentObj = ComponentRegistry.get(name);
@@ -199,8 +199,9 @@ See https://github.com/shakacode/react_on_rails#renderer-functions`);
199199
throw new Error('Server rendering of streams is not supported for server render hashes or promises.');
200200
}
201201

202-
renderResult = new PassThrough();
203-
ReactDOMServer.renderToPipeableStream(reactRenderingResult).pipe(renderResult);
202+
const renderStream = new PassThrough();
203+
ReactDOMServer.renderToPipeableStream(reactRenderingResult).pipe(renderStream);
204+
renderResult = renderStream;
204205

205206
// TODO: Add console replay script to the stream
206207
// Ensure to avoid console messages leaking between different components rendering

node_package/src/types/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { ReactElement, ReactNode, Component, ComponentType } from 'react';
2-
import type { PassThrough } from 'stream';
2+
import type { Readable } from 'stream';
33

44
// Don't import redux just for the type definitions
55
// See https://github.com/shakacode/react_on_rails/issues/1321
@@ -138,7 +138,7 @@ export interface ReactOnRails {
138138
): RenderReturnType;
139139
getComponent(name: string): RegisteredComponent;
140140
serverRenderReactComponent(options: RenderParams): null | string | Promise<RenderResult>;
141-
streamServerRenderedReactComponent(options: RenderParams): PassThrough;
141+
streamServerRenderedReactComponent(options: RenderParams): Readable;
142142
handleError(options: ErrorOptions): string | undefined;
143143
buildConsoleReplay(): string;
144144
registeredComponents(): Map<string, RegisteredComponent>;

0 commit comments

Comments
 (0)