From 800ee351a7836046543ad4a86046668bc4fd0f23 Mon Sep 17 00:00:00 2001 From: Janka Uryga Date: Thu, 26 Feb 2026 19:01:43 +0100 Subject: [PATCH] remove runInContext from stream-ops --- .../next/src/server/app-render/app-render.tsx | 142 ++++++++++-------- .../src/server/app-render/stream-ops.web.ts | 30 ++-- 2 files changed, 87 insertions(+), 85 deletions(-) diff --git a/packages/next/src/server/app-render/app-render.tsx b/packages/next/src/server/app-render/app-render.tsx index 436b185fb31ebf..a61034b154118d 100644 --- a/packages/next/src/server/app-render/app-render.tsx +++ b/packages/next/src/server/app-render/app-render.tsx @@ -723,7 +723,9 @@ async function generateDynamicFlightRenderResult( options ) - const flightStream = renderToFlightStream( + const flightStream = workUnitAsyncStorage.run( + requestStore, + renderToFlightStream, ctx.componentMod, rscPayload, clientModules, @@ -732,8 +734,7 @@ async function generateDynamicFlightRenderResult( temporaryReferences: options?.temporaryReferences, filterStackFrame, debugChannel: debugChannel?.serverSide, - }, - (fn) => workUnitAsyncStorage.run(requestStore, fn) + } ) return new FlightRenderResult( @@ -902,15 +903,16 @@ async function stagedRenderToReadableStreamWithoutCachesInDev( return await runInSequentialTasks( () => { stageController.advanceStage(RenderStage.Static) - return renderToFlightStream( + return workUnitAsyncStorage.run( + requestStore, + renderToFlightStream, ctx.componentMod, rscPayload, clientModules, { ...options, environmentName, - }, - (fn) => workUnitAsyncStorage.run(requestStore, fn) + } ) }, () => { @@ -2906,7 +2908,9 @@ async function renderToStream( } reactServerResult = new ReactServerResult( - renderToFlightStream( + workUnitAsyncStorage.run( + requestStore, + renderToFlightStream, ctx.componentMod, RSCPayload, clientModules, @@ -2914,8 +2918,7 @@ async function renderToStream( filterStackFrame, onError: serverComponentsErrorHandler, debugChannel: debugChannel?.serverSide, - }, - (fn) => workUnitAsyncStorage.run(requestStore, fn) + } ) ) } @@ -2966,12 +2969,14 @@ async function renderToStream( tracingMetadata: tracingMetadata, }) - const { stream: htmlStream, allReady } = await resumeToFizzStream( - resumeAppElement, - postponed, - { onError: htmlRendererErrorHandler, nonce }, - (fn) => workUnitAsyncStorage.run(requestStore, fn) - ) + const { stream: htmlStream, allReady } = + await workUnitAsyncStorage.run( + requestStore, + resumeToFizzStream, + resumeAppElement, + postponed, + { onError: htmlRendererErrorHandler, nonce } + ) // End the render span only after React completed rendering (including anything inside Suspense boundaries) allReady.finally(() => { @@ -3031,10 +3036,11 @@ async function renderToStream( formState, } - const { stream: htmlStream, allReady } = await renderToFizzStream( + const { stream: htmlStream, allReady } = await workUnitAsyncStorage.run( + requestStore, + renderToFizzStream, appElement, - fizzOptions, - (fn) => workUnitAsyncStorage.run(requestStore, fn) + fizzOptions ) // End the render span only after React completed rendering (including anything inside Suspense boundaries) @@ -3136,15 +3142,16 @@ async function renderToStream( errorType ) - errorServerStream = renderToFlightStream( + errorServerStream = workUnitAsyncStorage.run( + requestStore, + renderToFlightStream, ctx.componentMod, errorRSCPayload, clientModules, { filterStackFrame, onError: serverComponentsErrorHandler, - }, - (fn) => workUnitAsyncStorage.run(requestStore, fn) + } ) if (reactServerResult === null) { @@ -3163,7 +3170,9 @@ async function renderToStream( supportsDynamicResponse !== true || !!shouldWaitOnAllReady const { stream: errorHtmlStream, allReady: errorAllReady } = - await renderToFizzStream( + await workUnitAsyncStorage.run( + requestStore, + renderToFizzStream, workUnitAsyncStorage.run(requestStore, fn) + } ) // End the render span only after React completed rendering (including anything inside Suspense boundaries) @@ -3310,20 +3318,23 @@ async function renderWithRestartOnCacheMissInDev( initialStageController.advanceStage(RenderStage.EarlyStatic) startTime = performance.now() + performance.timeOrigin - const streamPair = renderToFlightStream( - ComponentMod, - initialRscPayload, - clientModules, - { - onError, - environmentName, - startTime, - filterStackFrame, - debugChannel: debugChannel?.serverSide, - signal: initialReactController.signal, - }, - (fn) => workUnitAsyncStorage.run(requestStore, fn) - ).tee() + const streamPair = workUnitAsyncStorage + .run( + requestStore, + renderToFlightStream, + ComponentMod, + initialRscPayload, + clientModules, + { + onError, + environmentName, + startTime, + filterStackFrame, + debugChannel: debugChannel?.serverSide, + signal: initialReactController.signal, + } + ) + .tee() // If we abort the render, we want to reject the stage-dependent promises as well. // Note that we want to install this listener after the render is started @@ -3457,19 +3468,22 @@ async function renderWithRestartOnCacheMissInDev( finalStageController.advanceStage(RenderStage.EarlyStatic) startTime = performance.now() + performance.timeOrigin - const streamPair = renderToFlightStream( - ComponentMod, - finalRscPayload, - clientModules, - { - onError, - environmentName, - startTime, - filterStackFrame, - debugChannel: debugChannel?.serverSide, - }, - (fn) => workUnitAsyncStorage.run(requestStore, fn) - ).tee() + const streamPair = workUnitAsyncStorage + .run( + requestStore, + renderToFlightStream, + ComponentMod, + finalRscPayload, + clientModules, + { + onError, + environmentName, + startTime, + filterStackFrame, + debugChannel: debugChannel?.serverSide, + } + ) + .tee() return { stream: streamPair[0], @@ -5782,7 +5796,9 @@ async function prerenderToStream( ) ) - const { stream: htmlStream } = await renderToFizzStream( + const { stream: htmlStream } = await workUnitAsyncStorage.run( + prerenderLegacyStore, + renderToFizzStream, // eslint-disable-next-line @next/internal/no-ambiguous-jsx workUnitAsyncStorage.run(prerenderLegacyStore, fn) + } ) if (shouldGenerateStaticFlightData(workStore)) { @@ -5936,24 +5951,22 @@ async function prerenderToStream( errorType ) - // Keep prerender-legacy async storage stable across node stream event - // callbacks and pipeable renderer hooks. - const runInLegacyContext = (fn: () => T): T => - workUnitAsyncStorage.run(prerenderLegacyStore, fn) - - const errorServerStream = renderToFlightStream( + const errorServerStream = workUnitAsyncStorage.run( + prerenderLegacyStore, + renderToFlightStream, ComponentMod, errorRSCPayload, clientModules, { filterStackFrame, onError: serverComponentsErrorHandler, - }, - runInLegacyContext + } ) try { - const { stream: errorHtmlStream } = await renderToFizzStream( + const { stream: errorHtmlStream } = await workUnitAsyncStorage.run( + prerenderLegacyStore, + renderToFizzStream, // eslint-disable-next-line @next/internal/no-ambiguous-jsx (fn: () => T) => T + opts: FlightRenderOptions ): AnyStream { - const run: (fn: () => T) => T = runInContext ?? ((fn) => fn()) - return run(() => - ComponentMod.renderToReadableStream(payload, clientModules, opts) - ) + return ComponentMod.renderToReadableStream(payload, clientModules, opts) } export async function streamToString(stream: AnyStream): Promise { @@ -162,28 +158,22 @@ export async function streamToString(stream: AnyStream): Promise { export async function renderToFizzStream( element: React.ReactElement, - streamOptions: any, - runInContext?: (fn: () => T) => T + streamOptions: any ): Promise { - const run: (fn: () => T) => T = runInContext ?? ((fn) => fn()) - const stream = await run(() => - renderToInitialFizzStream({ - ReactDOMServer: { renderToReadableStream }, - element, - streamOptions, - }) - ) + const stream = await renderToInitialFizzStream({ + ReactDOMServer: { renderToReadableStream }, + element, + streamOptions, + }) return { stream, allReady: stream.allReady, abort: undefined } } export async function resumeToFizzStream( element: React.ReactElement, postponedState: PostponedState, - streamOptions: any, - runInContext?: (fn: () => T) => T + streamOptions: any ): Promise { - const run: (fn: () => T) => T = runInContext ?? ((fn) => fn()) - const stream = await run(() => resume(element, postponedState, streamOptions)) + const stream = await resume(element, postponedState, streamOptions) return { stream, allReady: stream.allReady, abort: undefined } }