/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @flow */ import type {ReactModel} from 'react-server/src/ReactFlightServer'; import type {ServerContextJSONValue} from 'shared/ReactTypes'; import type {BundlerConfig} from './ReactFlightServerWebpackBundlerConfig'; import { createRequest, startWork, startFlowing, abort, } from 'react-server/src/ReactFlightServer'; type Options = { identifierPrefix?: string, signal?: AbortSignal, context?: Array<[string, ServerContextJSONValue]>, onError?: (error: mixed) => void, }; function renderToReadableStream( model: ReactModel, webpackMap: BundlerConfig, options?: Options, ): ReadableStream { const request = createRequest( model, webpackMap, options ? options.onError : undefined, options ? options.context : undefined, options ? options.identifierPrefix : undefined, ); if (options && options.signal) { const signal = options.signal; if (signal.aborted) { abort(request, (signal: any).reason); } else { const listener = () => { abort(request, (signal: any).reason); signal.removeEventListener('abort', listener); }; signal.addEventListener('abort', listener); } } const stream = new ReadableStream( { type: 'bytes', start: (controller): ?Promise => { startWork(request); }, pull: (controller): ?Promise => { startFlowing(request, controller); }, cancel: (reason): ?Promise => {}, }, // $FlowFixMe size() methods are not allowed on byte streams. {highWaterMark: 0}, ); return stream; } export {renderToReadableStream};