rsbuild-plugin-react-router
Version:
React Router plugin for Rsbuild
31 lines (30 loc) • 1.65 kB
JavaScript
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);
});
};