UNPKG

rasengan

Version:

The modern React Framework

47 lines (46 loc) 1.51 kB
import ReactDOM from 'react-dom/server'; import { renderToPipeableStream } from 'react-dom/server'; import { isServerMode, ServerMode } from '../runtime/mode.js'; /** * Render a React component to a stream. * @param Component * @param res * @param options * @returns */ export const renderToStream = async (Component, res, options) => { const ABORT_DELAY = 10_000; let bootstrap = []; if (isServerMode(process.env.NODE_ENV) && process.env.NODE_ENV === ServerMode.Development) { bootstrap.push('/src/index'); } return new Promise(async (resolve, reject) => { let shellRendered = false; const { pipe, abort } = renderToPipeableStream(Component, { bootstrapModules: bootstrap, onShellReady() { shellRendered = true; if (!res.headersSent && options?.responseHeaders) { res.writeHead(options.statusCode ?? 200, options.responseHeaders); } resolve(res); pipe(res); }, onShellError(error) { reject(error); }, onError(error) { if (shellRendered) { console.error(error); abort(); } }, }); setTimeout(abort, ABORT_DELAY); }); }; export const renderToString = (Component) => { const html = ReactDOM.renderToString(Component); return `<!DOCTYPE html>\n${html}`; };