Fix memory leak in dev server
This commit is contained in:
@@ -180,8 +180,27 @@ export default async function genWebHTML({
|
||||
let render_error: any;
|
||||
let has_render_error = false;
|
||||
|
||||
const render_timeout_ms =
|
||||
global.BUNEXT_CONFIG.ssr_render_timeout_ms ||
|
||||
AppData["DefaultSSRRenderTimeoutMs"];
|
||||
|
||||
// Without a deadline, a Suspense boundary that never settles keeps the
|
||||
// request (and its whole render tree) alive forever. The timer is
|
||||
// cleared once the render ends so finished requests don't linger.
|
||||
const render_abort = new AbortController();
|
||||
const render_timeout = setTimeout(
|
||||
() =>
|
||||
render_abort.abort(
|
||||
new RenderTimeoutError(
|
||||
`Page render timed out after ${render_timeout_ms}ms`,
|
||||
),
|
||||
),
|
||||
render_timeout_ms,
|
||||
);
|
||||
|
||||
try {
|
||||
const stream = await renderToReadableStream(final_component, {
|
||||
signal: render_abort.signal,
|
||||
onError(error: any) {
|
||||
if (error?.message?.includes('unique "key" prop')) return;
|
||||
|
||||
@@ -190,12 +209,16 @@ export default async function genWebHTML({
|
||||
render_error = error;
|
||||
}
|
||||
|
||||
original_console.error(error);
|
||||
// A timeout has no useful stack; it's logged upstream.
|
||||
if (!(error instanceof RenderTimeoutError)) {
|
||||
original_console.error(error);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
htmlBody = await new Response(stream).text();
|
||||
} finally {
|
||||
clearTimeout(render_timeout);
|
||||
restoreConsole();
|
||||
}
|
||||
|
||||
@@ -211,6 +234,8 @@ export default async function genWebHTML({
|
||||
return html;
|
||||
}
|
||||
|
||||
class RenderTimeoutError extends Error {}
|
||||
|
||||
let original_console: Pick<
|
||||
Console,
|
||||
"log" | "warn" | "error" | "info" | "debug"
|
||||
|
||||
Reference in New Issue
Block a user