23
24
import {
25
createPrerenderRequest,
26
+ resumeAndPrerenderRequest,
27
startWork,
28
startFlowing,
29
stopFlowing,
34
import {
35
createResumableState,
36
createRenderState,
37
+ resumeRenderState,
38
createRootFormatContext,
39
} from 'react-dom-bindings/src/server/ReactFizzConfigDOM';
40
143
});
144
}
145
144
-export {prerender, ReactVersion as version};
146
+type ResumeOptions = {
147
+ nonce?: string,
148
+ signal?: AbortSignal,
149
+ onError?: (error: mixed) => ?string,
150
+ onPostpone?: (reason: string) => void,
151
+ unstable_externalRuntimeSrc?: string | BootstrapScriptDescriptor,
152
+};
153
+
154
+function resumeAndPrerender(
155
+ children: ReactNodeList,
156
+ postponedState: PostponedState,
157
+ options?: ResumeOptions,
158
+): Promise<StaticResult> {
159
+ return new Promise((resolve, reject) => {
160
+ const onFatalError = reject;
161
+
162
+ function onAllReady() {
163
+ const stream = new ReadableStream(
164
+ {
165
+ type: 'bytes',
166
+ pull: (controller): ?Promise<void> => {
167
+ startFlowing(request, controller);
168
+ },
169
+ cancel: (reason): ?Promise<void> => {
170
+ stopFlowing(request);
171
+ abort(request, reason);
172
+ },
173
+ },
174
+ // $FlowFixMe[prop-missing] size() methods are not allowed on byte streams.
175
+ {highWaterMark: 0},
176
+ );
177
+
178
+ const result = {
179
+ postponed: getPostponedState(request),
180
+ prelude: stream,
181
+ };
182
+ resolve(result);
183
+ }
184
+
185
+ const request = resumeAndPrerenderRequest(
186
+ children,
187
+ postponedState,
188
+ resumeRenderState(
189
+ postponedState.resumableState,
190
+ options ? options.nonce : undefined,
191
+ ),
192
+ options ? options.onError : undefined,
193
+ onAllReady,
194
+ undefined,
195
+ undefined,
196
+ onFatalError,
197
+ options ? options.onPostpone : undefined,
198
+ );
199
+ if (options && options.signal) {
200
+ const signal = options.signal;
201
+ if (signal.aborted) {
202
+ abort(request, (signal: any).reason);
203
+ } else {
204
+ const listener = () => {
205
+ abort(request, (signal: any).reason);
206
+ signal.removeEventListener('abort', listener);
207
+ };
208
+ signal.addEventListener('abort', listener);
209
+ }
210
+ }
211
+ startWork(request);
212
+ });
213
+}
214
+
215
+export {prerender, resumeAndPrerender, ReactVersion as version};