UNPKG

rsbuild-plugin-react-router

Version:
31 lines (30 loc) 1.65 kB
import { PassThrough } from "node:stream"; import { createReadableStreamFromReadable } from "@react-router/node"; import { isbot } from "isbot"; import { renderToPipeableStream } from "react-dom/server"; import { ServerRouter } from "react-router"; import * as __rspack_external_react from "react"; export default function(request, responseStatusCode, responseHeaders, routerContext) { return new Promise((resolve, reject)=>{ let abortDelay, shellRendered = !1, statusCode = responseStatusCode, userAgent = request.headers.get('user-agent'), readyOption = userAgent && isbot(userAgent) || routerContext.isSpaMode ? 'onAllReady' : 'onShellReady', ready = !1, { pipe, abort } = renderToPipeableStream(__rspack_external_react.createElement(ServerRouter, { context: routerContext, url: request.url }), { [readyOption] () { ready = !0, 'onAllReady' === readyOption && abortDelay && clearTimeout(abortDelay), shellRendered = !0; let body = new PassThrough(), stream = createReadableStreamFromReadable(body); responseHeaders.set('Content-Type', 'text/html'), resolve(new Response(stream, { headers: responseHeaders, status: statusCode })), pipe(body); }, onShellError (error) { reject(error); }, onError (error) { statusCode = 500, shellRendered && console.error(error); } }); abortDelay = setTimeout(abort, 5000), 'onAllReady' === readyOption && ready && clearTimeout(abortDelay); }); };