From c4459cbb0f71e83e8b1713557758416a91dd8edf Mon Sep 17 00:00:00 2001 From: Sebastian Markbage Date: Wed, 6 Sep 2023 22:25:05 -0400 Subject: [PATCH] Split createRequest into createRequest, createPrerenderRequest and resumeRequest This is what encodes what type of work we'll do. --- .../src/server/ReactDOMFizzServerBrowser.js | 7 +- .../src/server/ReactDOMFizzServerEdge.js | 7 +- .../src/server/ReactDOMFizzServerNode.js | 7 +- .../src/server/ReactDOMFizzStaticBrowser.js | 4 +- .../src/server/ReactDOMFizzStaticEdge.js | 4 +- .../src/server/ReactDOMFizzStaticNode.js | 4 +- packages/react-server/src/ReactFizzServer.js | 106 +++++++++++++++++- 7 files changed, 115 insertions(+), 24 deletions(-) diff --git a/packages/react-dom/src/server/ReactDOMFizzServerBrowser.js b/packages/react-dom/src/server/ReactDOMFizzServerBrowser.js index 0de26739b5696..44df0fb2deecc 100644 --- a/packages/react-dom/src/server/ReactDOMFizzServerBrowser.js +++ b/packages/react-dom/src/server/ReactDOMFizzServerBrowser.js @@ -16,6 +16,7 @@ import ReactVersion from 'shared/ReactVersion'; import { createRequest, + resumeRequest, startWork, startFlowing, abort, @@ -171,16 +172,14 @@ function resume( allReady.catch(() => {}); reject(error); } - const request = createRequest( + const request = resumeRequest( children, - postponedState.resumableState, + postponedState, createRenderState( postponedState.resumableState, options ? options.nonce : undefined, undefined, // importMap ), - postponedState.rootFormatContext, - postponedState.progressiveChunkSize, options ? options.onError : undefined, onAllReady, onShellReady, diff --git a/packages/react-dom/src/server/ReactDOMFizzServerEdge.js b/packages/react-dom/src/server/ReactDOMFizzServerEdge.js index 0de26739b5696..44df0fb2deecc 100644 --- a/packages/react-dom/src/server/ReactDOMFizzServerEdge.js +++ b/packages/react-dom/src/server/ReactDOMFizzServerEdge.js @@ -16,6 +16,7 @@ import ReactVersion from 'shared/ReactVersion'; import { createRequest, + resumeRequest, startWork, startFlowing, abort, @@ -171,16 +172,14 @@ function resume( allReady.catch(() => {}); reject(error); } - const request = createRequest( + const request = resumeRequest( children, - postponedState.resumableState, + postponedState, createRenderState( postponedState.resumableState, options ? options.nonce : undefined, undefined, // importMap ), - postponedState.rootFormatContext, - postponedState.progressiveChunkSize, options ? options.onError : undefined, onAllReady, onShellReady, diff --git a/packages/react-dom/src/server/ReactDOMFizzServerNode.js b/packages/react-dom/src/server/ReactDOMFizzServerNode.js index 89332ef5dc7de..c7de8e073e16e 100644 --- a/packages/react-dom/src/server/ReactDOMFizzServerNode.js +++ b/packages/react-dom/src/server/ReactDOMFizzServerNode.js @@ -18,6 +18,7 @@ import ReactVersion from 'shared/ReactVersion'; import { createRequest, + resumeRequest, startWork, startFlowing, abort, @@ -140,16 +141,14 @@ function resumeRequestImpl( postponedState: PostponedState, options: void | ResumeOptions, ) { - return createRequest( + return resumeRequest( children, - postponedState.resumableState, + postponedState, createRenderState( postponedState.resumableState, options ? options.nonce : undefined, undefined, // importMap ), - postponedState.rootFormatContext, - postponedState.progressiveChunkSize, options ? options.onError : undefined, options ? options.onAllReady : undefined, options ? options.onShellReady : undefined, diff --git a/packages/react-dom/src/server/ReactDOMFizzStaticBrowser.js b/packages/react-dom/src/server/ReactDOMFizzStaticBrowser.js index 0e03530b2d885..fe61a1ba271a0 100644 --- a/packages/react-dom/src/server/ReactDOMFizzStaticBrowser.js +++ b/packages/react-dom/src/server/ReactDOMFizzStaticBrowser.js @@ -15,7 +15,7 @@ import type {ImportMap} from '../shared/ReactDOMTypes'; import ReactVersion from 'shared/ReactVersion'; import { - createRequest, + createPrerenderRequest, startWork, startFlowing, abort, @@ -80,7 +80,7 @@ function prerender( options ? options.bootstrapModules : undefined, options ? options.unstable_externalRuntimeSrc : undefined, ); - const request = createRequest( + const request = createPrerenderRequest( children, resources, createRenderState( diff --git a/packages/react-dom/src/server/ReactDOMFizzStaticEdge.js b/packages/react-dom/src/server/ReactDOMFizzStaticEdge.js index 0e03530b2d885..fe61a1ba271a0 100644 --- a/packages/react-dom/src/server/ReactDOMFizzStaticEdge.js +++ b/packages/react-dom/src/server/ReactDOMFizzStaticEdge.js @@ -15,7 +15,7 @@ import type {ImportMap} from '../shared/ReactDOMTypes'; import ReactVersion from 'shared/ReactVersion'; import { - createRequest, + createPrerenderRequest, startWork, startFlowing, abort, @@ -80,7 +80,7 @@ function prerender( options ? options.bootstrapModules : undefined, options ? options.unstable_externalRuntimeSrc : undefined, ); - const request = createRequest( + const request = createPrerenderRequest( children, resources, createRenderState( diff --git a/packages/react-dom/src/server/ReactDOMFizzStaticNode.js b/packages/react-dom/src/server/ReactDOMFizzStaticNode.js index d538eb9f81ce9..4c6260ca920f7 100644 --- a/packages/react-dom/src/server/ReactDOMFizzStaticNode.js +++ b/packages/react-dom/src/server/ReactDOMFizzStaticNode.js @@ -17,7 +17,7 @@ import {Writable, Readable} from 'stream'; import ReactVersion from 'shared/ReactVersion'; import { - createRequest, + createPrerenderRequest, startWork, startFlowing, abort, @@ -94,7 +94,7 @@ function prerenderToNodeStream( options ? options.bootstrapModules : undefined, options ? options.unstable_externalRuntimeSrc : undefined, ); - const request = createRequest( + const request = createPrerenderRequest( children, resumableState, createRenderState( diff --git a/packages/react-server/src/ReactFizzServer.js b/packages/react-server/src/ReactFizzServer.js index 04e9da639a49e..4d01fc3504d7d 100644 --- a/packages/react-server/src/ReactFizzServer.js +++ b/packages/react-server/src/ReactFizzServer.js @@ -396,6 +396,106 @@ export function createRequest( return request; } +export function createPrerenderRequest( + children: ReactNodeList, + resumableState: ResumableState, + renderState: RenderState, + rootFormatContext: FormatContext, + progressiveChunkSize: void | number, + onError: void | ((error: mixed) => ?string), + onAllReady: void | (() => void), + onShellReady: void | (() => void), + onShellError: void | ((error: mixed) => void), + onFatalError: void | ((error: mixed) => void), + onPostpone: void | ((reason: string) => void), +): Request { + const request = createRequest( + children, + resumableState, + renderState, + rootFormatContext, + progressiveChunkSize, + onError, + onAllReady, + onShellReady, + onShellError, + onFatalError, + onPostpone, + ); + // Start tracking postponed holes during this render. + request.trackedPostpones = {workingMap: new Map(), root: []}; + return request; +} + +export function resumeRequest( + children: ReactNodeList, + postponedState: PostponedState, + renderState: RenderState, + onError: void | ((error: mixed) => ?string), + onAllReady: void | (() => void), + onShellReady: void | (() => void), + onShellError: void | ((error: mixed) => void), + onFatalError: void | ((error: mixed) => void), + onPostpone: void | ((reason: string) => void), +): Request { + prepareHostDispatcher(); + const pingedTasks: Array = []; + const abortSet: Set = new Set(); + const request: Request = { + destination: null, + flushScheduled: false, + resumableState: postponedState.resumableState, + renderState, + rootFormatContext: postponedState.rootFormatContext, + progressiveChunkSize: postponedState.progressiveChunkSize, + status: OPEN, + fatalError: null, + nextSegmentId: 0, + allPendingTasks: 0, + pendingRootTasks: 0, + completedRootSegment: null, + abortableTasks: abortSet, + pingedTasks: pingedTasks, + clientRenderedBoundaries: ([]: Array), + completedBoundaries: ([]: Array), + partialBoundaries: ([]: Array), + trackedPostpones: null, + onError: onError === undefined ? defaultErrorHandler : onError, + onPostpone: onPostpone === undefined ? noop : onPostpone, + onAllReady: onAllReady === undefined ? noop : onAllReady, + onShellReady: onShellReady === undefined ? noop : onShellReady, + onShellError: onShellError === undefined ? noop : onShellError, + onFatalError: onFatalError === undefined ? noop : onFatalError, + }; + // This segment represents the root fallback. + const rootSegment = createPendingSegment( + request, + 0, + null, + postponedState.rootFormatContext, + // Root segments are never embedded in Text on either edge + false, + false, + ); + // There is no parent so conceptually, we're unblocked to flush this segment. + rootSegment.parentFlushed = true; + const rootTask = createTask( + request, + null, + children, + null, + rootSegment, + abortSet, + null, + postponedState.rootFormatContext, + emptyContextObject, + rootContextSnapshot, + emptyTreeContext, + ); + pingedTasks.push(rootTask); + return request; +} + let currentRequest: null | Request = null; export function resolveRequest(): null | Request { @@ -2760,12 +2860,6 @@ export function startWork(request: Request): void { } } -export function startPrerenderWork(request: Request): void { - // Start tracking postponed holes during this render. - request.trackedPostpones = {workingMap: new Map(), root: []}; - startWork(request); -} - function enqueueFlush(request: Request): void { if ( request.flushScheduled === false &&