Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Add postponed result to store resumable state
  • Loading branch information
sebmarkbage committed Aug 22, 2023
commit f90fba744c01865b8f9ada2ec8f907ed8195d3df
2 changes: 2 additions & 0 deletions packages/react-dom/src/__tests__/ReactDOMFizzStatic-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,8 @@ describe('ReactDOMFizzStatic', () => {

const result = await promise;

expect(result.postponed).toBe(null);

await act(async () => {
result.prelude.pipe(writable);
});
Expand Down
10 changes: 6 additions & 4 deletions packages/react-dom/src/server/ReactDOMFizzStaticBrowser.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,16 @@

import type {ReactNodeList} from 'shared/ReactTypes';
import type {BootstrapScriptDescriptor} from 'react-dom-bindings/src/server/ReactFizzConfigDOM';
import type {ResumableState} from 'react-server/src/ReactFizzServer';

import ReactVersion from 'shared/ReactVersion';

import {
createRequest,
createPrerenderRequest,
startWork,
startFlowing,
abort,
getPostponedState,
} from 'react-server/src/ReactFizzServer';

import {
Expand All @@ -39,6 +41,7 @@ type Options = {
};

type StaticResult = {
postponed: null | ResumableState,
prelude: ReadableStream,
};

Expand All @@ -62,12 +65,13 @@ function prerender(
);

const result = {
postponed: getPostponedState(request),
prelude: stream,
};
resolve(result);
}
const resources = createResources();
const request = createRequest(
const request = createPrerenderRequest(
children,
resources,
createResponseState(
Expand All @@ -83,8 +87,6 @@ function prerender(
options ? options.progressiveChunkSize : undefined,
options ? options.onError : undefined,
onAllReady,
undefined,
undefined,
onFatalError,
options ? options.onPostpone : undefined,
);
Expand Down
10 changes: 6 additions & 4 deletions packages/react-dom/src/server/ReactDOMFizzStaticEdge.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,16 @@

import type {ReactNodeList} from 'shared/ReactTypes';
import type {BootstrapScriptDescriptor} from 'react-dom-bindings/src/server/ReactFizzConfigDOM';
import type {ResumableState} from 'react-server/src/ReactFizzServer';

import ReactVersion from 'shared/ReactVersion';

import {
createRequest,
createPrerenderRequest,
startWork,
startFlowing,
abort,
getPostponedState,
} from 'react-server/src/ReactFizzServer';

import {
Expand All @@ -39,6 +41,7 @@ type Options = {
};

type StaticResult = {
postponed: null | ResumableState,
prelude: ReadableStream,
};

Expand All @@ -62,12 +65,13 @@ function prerender(
);

const result = {
postponed: getPostponedState(request),
prelude: stream,
};
resolve(result);
}
const resources = createResources();
const request = createRequest(
const request = createPrerenderRequest(
children,
resources,
createResponseState(
Expand All @@ -83,8 +87,6 @@ function prerender(
options ? options.progressiveChunkSize : undefined,
options ? options.onError : undefined,
onAllReady,
undefined,
undefined,
onFatalError,
options ? options.onPostpone : undefined,
);
Expand Down
10 changes: 6 additions & 4 deletions packages/react-dom/src/server/ReactDOMFizzStaticNode.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,18 @@

import type {ReactNodeList} from 'shared/ReactTypes';
import type {BootstrapScriptDescriptor} from 'react-dom-bindings/src/server/ReactFizzConfigDOM';
import type {ResumableState} from 'react-server/src/ReactFizzServer';

import {Writable, Readable} from 'stream';

import ReactVersion from 'shared/ReactVersion';

import {
createRequest,
createPrerenderRequest,
startWork,
startFlowing,
abort,
getPostponedState,
} from 'react-server/src/ReactFizzServer';

import {
Expand All @@ -41,6 +43,7 @@ type Options = {
};

type StaticResult = {
postponed: null | ResumableState,
prelude: Readable,
};

Expand Down Expand Up @@ -76,12 +79,13 @@ function prerenderToNodeStreams(
const writable = createFakeWritable(readable);

const result = {
postponed: getPostponedState(request),
prelude: readable,
};
resolve(result);
}
const resources = createResources();
const request = createRequest(
const request = createPrerenderRequest(
children,
resources,
createResponseState(
Expand All @@ -97,8 +101,6 @@ function prerenderToNodeStreams(
options ? options.progressiveChunkSize : undefined,
options ? options.onError : undefined,
onAllReady,
undefined,
undefined,
onFatalError,
options ? options.onPostpone : undefined,
);
Expand Down
94 changes: 93 additions & 1 deletion packages/react-server/src/ReactFizzServer.js
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ function defaultErrorHandler(error: mixed) {

function noop(): void {}

export function createRequest(
function createRequestImpl(
children: ReactNodeList,
resources: Resources,
responseState: ResponseState,
Expand Down Expand Up @@ -352,6 +352,85 @@ export function createRequest(
return request;
}

export function createRequest(
children: ReactNodeList,
resources: Resources,
responseState: ResponseState,
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 {
return createRequestImpl(
children,
resources,
responseState,
rootFormatContext,
progressiveChunkSize,
onError,
onAllReady,
onShellReady,
onShellError,
onFatalError,
onPostpone,
);
}

export function createPrerenderRequest(
children: ReactNodeList,
resources: Resources,
responseState: ResponseState,
rootFormatContext: FormatContext,
progressiveChunkSize: void | number,
onError: void | ((error: mixed) => ?string),
onAllReady: void | (() => void),
onFatalError: void | ((error: mixed) => void),
onPostpone: void | ((reason: string) => void),
): Request {
return createRequestImpl(
children,
resources,
responseState,
rootFormatContext,
progressiveChunkSize,
onError,
onAllReady,
undefined,
undefined,
onFatalError,
onPostpone,
);
}

export function resumeRequest(
children: ReactNodeList,
resumableState: ResumableState,
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 {
return createRequestImpl(
children,
resumableState.resources,
resumableState.responseState,
resumableState.rootFormatContext,
resumableState.progressiveChunkSize,
onError,
onAllReady,
onShellReady,
onShellError,
onFatalError,
onPostpone,
);
}

let currentRequest: null | Request = null;

export function resolveRequest(): null | Request {
Expand Down Expand Up @@ -2613,3 +2692,16 @@ export function flushResources(request: Request): void {
export function getResources(request: Request): Resources {
return request.resources;
}

export type ResumableState = {
nextSegmentId: number,
rootFormatContext: FormatContext,
progressiveChunkSize: number,
responseState: ResponseState,
resources: Resources,
};

// Returns the state of a postponed request or null if nothing was postponed.
export function getPostponedState(request: Request): null | ResumableState {
return null;
}