diff --git a/cmake/sources/CxxSources.txt b/cmake/sources/CxxSources.txt index ddc959fa37..30c3a4025c 100644 --- a/cmake/sources/CxxSources.txt +++ b/cmake/sources/CxxSources.txt @@ -3,6 +3,7 @@ packages/bun-usockets/src/crypto/sni_tree.cpp src/bake/BakeGlobalObject.cpp src/bake/BakeProduction.cpp src/bake/BakeSourceProvider.cpp +src/bake/DevServerSourceProvider.cpp src/bun.js/bindings/ActiveDOMCallback.cpp src/bun.js/bindings/AsymmetricKeyValue.cpp src/bun.js/bindings/AsyncContextFrame.cpp diff --git a/src/bake/bun-framework-react/server.tsx b/src/bake/bun-framework-react/server.tsx index 292413e31e..a4b9b7927c 100644 --- a/src/bake/bun-framework-react/server.tsx +++ b/src/bake/bun-framework-react/server.tsx @@ -86,11 +86,13 @@ export async function render(request: Request, meta: Bake.RouteMetadata): Promis const signal: MiniAbortSignal = { aborted: false, abort: null! }; ({ pipe, abort: signal.abort } = renderToPipeableStream(page, serverManifest, { onError: err => { + // console.error("onError renderToPipeableStream", !!signal.aborted); if (signal.aborted) return; // Mark as aborted and call the abort function - signal.aborted = true; - signal.abort(); + signal.aborted = err; + signal.abort(err); + rscPayload.destroy(err); // For PassThrough streams, we need to properly close them // when an error occurs during React rendering // process.nextTick(() => { @@ -106,8 +108,9 @@ export async function render(request: Request, meta: Bake.RouteMetadata): Promis pipe(rscPayload); rscPayload.on("error", err => { + // console.error("rscPayload.on('error')", !!signal.aborted); if (signal.aborted) return; - console.error(err); + // console.error(err); }); if (skipSSR) { diff --git a/src/bake/bun-framework-react/ssr.tsx b/src/bake/bun-framework-react/ssr.tsx index 6d67462650..d375deaef5 100644 --- a/src/bake/bun-framework-react/ssr.tsx +++ b/src/bake/bun-framework-react/ssr.tsx @@ -58,8 +58,8 @@ export function renderToHtml( // If the signal is already aborted, we should not proceed if (signal.aborted) { - controller.close(); - return Promise.resolve(); + controller.close(signal.aborted); + return Promise.reject(signal.aborted); } // `renderToPipeableStream` is what actually generates HTML. @@ -69,7 +69,7 @@ export function renderToHtml( bootstrapModules, onError(error) { if (!signal.aborted) { - console.error(error); + // console.error(error); // Abort the rendering and close the stream signal.aborted = true; abort(); @@ -87,8 +87,8 @@ export function renderToHtml( // Promise resolved after all data is combined. return stream.finished; }, - cancel() { - signal.aborted = true; + cancel(err) { + // console.error("renderToHtml.cancel"); signal.abort(); abort?.(); }, @@ -306,7 +306,7 @@ class StaticRscInjectionStream extends EventEmitter { } destroy(error) { - console.error(error); + // console.error(error); this.reject(error); } }