@samitouri / QOS-React-1 / commits / 272441a9ad

[Flight] Add `unstable_allowPartialStream` option to Flight Client (#35731)

When using a partial prerender stream, i.e. a prerender that is intentionally aborted before all I/O has resolved, consumers of `createFromReadableStream` would need to keep the stream unclosed to prevent React Flight from erroring on unresolved chunks. However, some browsers (e.g. Chrome, Firefox) keep unclosed ReadableStreams with pending reads as native GC roots, retaining the entire Flight response. With this PR we're adding an `unstable_allowPartialStream` option, that allows consumers to close the stream normally. The Flight Client's `close()` function then transitions pending chunks to halted instead of erroring them. Halted chunks keep Suspense fallbacks showing (i.e. they never resolve), and their `.then()` is a no-op so no new listeners accumulate. Inner stream chunks (ReadableStream/AsyncIterable) are closed gracefully, and `getChunk()` returns halted chunks for new IDs that are accessed after closing the response. Blocked chunks are left alone because they may be waiting on client-side async operations like module loading, or on forward references to chunks that appeared later in the stream, both of which resolve independently of closing.

Hendrik Liebau committed Feb 9, 2026 at 19:19 UTC 272441a9ade6bf84de11ba73039eb4c80668fa6a
17 files changed +278 -10
packages/react-client/src/ReactFlightClient.js
+57 -8
@@ -359,6 +359,7 @@ type Response = {
359 _stringDecoder: StringDecoder,
360 _closed: boolean,
361 _closedReason: mixed,
362 + _allowPartialStream: boolean,
363 _tempRefs: void | TemporaryReferenceSet, // the set temporary references can be resolved from
364 _timeOrigin: number, // Profiling-only
365 _pendingInitialRender: null | TimeoutID, // Profiling-only,
@@ -1456,9 +1457,19 @@ function getChunk(response: Response, id: number): SomeChunk<any> {
1457 let chunk = chunks.get(id);
1458 if (!chunk) {
1459 if (response._closed) {
1459 - // We have already errored the response and we're not going to get
1460 - // anything more streaming in so this will immediately error.
1461 - chunk = createErrorChunk(response, response._closedReason);
1460 + if (response._allowPartialStream) {
1461 + // For partial streams, chunks accessed after close should be HALTED
1462 + // (never resolve).
1463 + chunk = createPendingChunk(response);
1464 + const haltedChunk: HaltedChunk<any> = (chunk: any);
1465 + haltedChunk.status = HALTED;
1466 + haltedChunk.value = null;
1467 + haltedChunk.reason = null;
1468 + } else {
1469 + // We have already errored the response and we're not going to get
1470 + // anything more streaming in so this will immediately error.
1471 + chunk = createErrorChunk(response, response._closedReason);
1472 + }
1473 } else {
1474 chunk = createPendingChunk(response);
1475 }
@@ -2655,6 +2666,7 @@ function ResponseInstance(
2666 encodeFormAction: void | EncodeFormActionCallback,
2667 nonce: void | string,
2668 temporaryReferences: void | TemporaryReferenceSet,
2669 + allowPartialStream: boolean,
2670 findSourceMapURL: void | FindSourceMapURLCallback, // DEV-only
2671 replayConsole: boolean, // DEV-only
2672 environmentName: void | string, // DEV-only
@@ -2674,6 +2686,7 @@ function ResponseInstance(
2686 this._fromJSON = (null: any);
2687 this._closed = false;
2688 this._closedReason = null;
2689 + this._allowPartialStream = allowPartialStream;
2690 this._tempRefs = temporaryReferences;
2691 if (enableProfilerTimer && enableComponentPerformanceTrack) {
2692 this._timeOrigin = 0;
@@ -2767,6 +2780,7 @@ export function createResponse(
2780 encodeFormAction: void | EncodeFormActionCallback,
2781 nonce: void | string,
2782 temporaryReferences: void | TemporaryReferenceSet,
2783 + allowPartialStream: boolean,
2784 findSourceMapURL: void | FindSourceMapURLCallback, // DEV-only
2785 replayConsole: boolean, // DEV-only
2786 environmentName: void | string, // DEV-only
@@ -2792,6 +2806,7 @@ export function createResponse(
2806 encodeFormAction,
2807 nonce,
2808 temporaryReferences,
2809 + allowPartialStream,
2810 findSourceMapURL,
2811 replayConsole,
2812 environmentName,
@@ -5243,11 +5258,45 @@ function createFromJSONCallback(response: Response) {
5258 }
5259
5260 export function close(weakResponse: WeakResponse): void {
5246 - // In case there are any remaining unresolved chunks, they won't
5247 - // be resolved now. So we need to issue an error to those.
5248 - // Ideally we should be able to early bail out if we kept a
5249 - // ref count of pending chunks.
5250 - reportGlobalError(weakResponse, new Error('Connection closed.'));
5261 + // In case there are any remaining unresolved chunks, they won't be resolved
5262 + // now. So we either error or halt them depending on whether partial streams
5263 + // are allowed.
5264 + // TODO: Ideally we should be able to bail out early if we kept a ref count of
5265 + // pending chunks.
5266 + if (hasGCedResponse(weakResponse)) {
5267 + return;
5268 + }
5269 + const response = unwrapWeakResponse(weakResponse);
5270 + if (response._allowPartialStream) {
5271 + // For partial streams, we halt pending chunks instead of erroring them.
5272 + response._closed = true;
5273 + response._chunks.forEach(chunk => {
5274 + if (chunk.status === PENDING) {
5275 + // Clear listeners to release closures and transition to HALTED.
5276 + // Future .then() calls on HALTED chunks are no-ops.
5277 + releasePendingChunk(response, chunk);
5278 + const haltedChunk: HaltedChunk<any> = (chunk: any);
5279 + haltedChunk.status = HALTED;
5280 + haltedChunk.value = null;
5281 + haltedChunk.reason = null;
5282 + } else if (chunk.status === INITIALIZED && chunk.reason !== null) {
5283 + // Stream chunk - close gracefully instead of erroring.
5284 + chunk.reason.close('"$undefined"');
5285 + }
5286 + });
5287 + if (__DEV__) {
5288 + const debugChannel = response._debugChannel;
5289 + if (debugChannel !== undefined) {
5290 + closeDebugChannel(debugChannel);
5291 + response._debugChannel = undefined;
5292 + if (debugChannelRegistry !== null) {
5293 + debugChannelRegistry.unregister(response);
5294 + }
5295 + }
5296 + }
5297 + } else {
5298 + reportGlobalError(weakResponse, new Error('Connection closed.'));
5299 + }
5300 }
5301
5302 function getCurrentOwnerInDEV(): null | ReactComponentInfo {
packages/react-markup/src/ReactMarkupServer.js
+1
@@ -89,6 +89,7 @@ export function experimental_renderToHTML(
89 noServerCallOrFormAction,
90 undefined,
91 undefined,
92 + false,
93 undefined,
94 false,
95 undefined,
packages/react-noop-renderer/src/ReactNoopFlightClient.js
+1
@@ -71,6 +71,7 @@ function read<T>(source: Source, options: ReadOptions): Thenable<T> {
71 undefined,
72 undefined,
73 undefined,
74 + false,
75 options !== undefined ? options.findSourceMapURL : undefined,
76 true,
77 undefined,
packages/react-server-dom-esm/src/client/ReactFlightDOMClientBrowser.js
+4
@@ -49,6 +49,7 @@ export type Options = {
49 callServer?: CallServerCallback,
50 debugChannel?: {writable?: WritableStream, readable?: ReadableStream, ...},
51 temporaryReferences?: TemporaryReferenceSet,
52 + unstable_allowPartialStream?: boolean,
53 findSourceMapURL?: FindSourceMapURLCallback,
54 replayConsoleLogs?: boolean,
55 environmentName?: string,
@@ -98,6 +99,9 @@ function createResponseFromOptions(options: void | Options) {
99 options && options.temporaryReferences
100 ? options.temporaryReferences
101 : undefined,
102 + options && options.unstable_allowPartialStream
103 + ? options.unstable_allowPartialStream
104 + : false,
105 __DEV__ && options && options.findSourceMapURL
106 ? options.findSourceMapURL
107 : undefined,
packages/react-server-dom-esm/src/client/ReactFlightDOMClientNode.js
+4
@@ -54,6 +54,7 @@ type EncodeFormActionCallback = <A>(
54 export type Options = {
55 nonce?: string,
56 encodeFormAction?: EncodeFormActionCallback,
57 + unstable_allowPartialStream?: boolean,
58 findSourceMapURL?: FindSourceMapURLCallback,
59 replayConsoleLogs?: boolean,
60 environmentName?: string,
@@ -104,6 +105,9 @@ function createFromNodeStream<T>(
105 options ? options.encodeFormAction : undefined,
106 options && typeof options.nonce === 'string' ? options.nonce : undefined,
107 undefined, // TODO: If encodeReply is supported, this should support temporaryReferences
108 + options && options.unstable_allowPartialStream
109 + ? options.unstable_allowPartialStream
110 + : false,
111 __DEV__ && options && options.findSourceMapURL
112 ? options.findSourceMapURL
113 : undefined,
packages/react-server-dom-parcel/src/client/ReactFlightDOMClientBrowser.js
+4
@@ -124,6 +124,9 @@ function createResponseFromOptions(options: void | Options) {
124 options && options.temporaryReferences
125 ? options.temporaryReferences
126 : undefined,
127 + options && options.unstable_allowPartialStream
128 + ? options.unstable_allowPartialStream
129 + : false,
130 __DEV__ ? findSourceMapURL : undefined,
131 __DEV__ ? (options ? options.replayConsoleLogs !== false : true) : false, // defaults to true
132 __DEV__ && options && options.environmentName
@@ -207,6 +210,7 @@ function startReadingFromStream(
210 export type Options = {
211 debugChannel?: {writable?: WritableStream, readable?: ReadableStream, ...},
212 temporaryReferences?: TemporaryReferenceSet,
213 + unstable_allowPartialStream?: boolean,
214 replayConsoleLogs?: boolean,
215 environmentName?: string,
216 startTime?: number,
packages/react-server-dom-parcel/src/client/ReactFlightDOMClientEdge.js
+4
@@ -77,6 +77,7 @@ export type Options = {
77 nonce?: string,
78 encodeFormAction?: EncodeFormActionCallback,
79 temporaryReferences?: TemporaryReferenceSet,
80 + unstable_allowPartialStream?: boolean,
81 replayConsoleLogs?: boolean,
82 environmentName?: string,
83 startTime?: number,
@@ -104,6 +105,9 @@ function createResponseFromOptions(options?: Options) {
105 options && options.temporaryReferences
106 ? options.temporaryReferences
107 : undefined,
108 + options && options.unstable_allowPartialStream
109 + ? options.unstable_allowPartialStream
110 + : false,
111 __DEV__ ? findSourceMapURL : undefined,
112 __DEV__ && options ? options.replayConsoleLogs === true : false, // defaults to false
113 __DEV__ && options && options.environmentName
packages/react-server-dom-parcel/src/client/ReactFlightDOMClientNode.js
+4
@@ -50,6 +50,7 @@ type EncodeFormActionCallback = <A>(
50 export type Options = {
51 nonce?: string,
52 encodeFormAction?: EncodeFormActionCallback,
53 + unstable_allowPartialStream?: boolean,
54 replayConsoleLogs?: boolean,
55 environmentName?: string,
56 startTime?: number,
@@ -97,6 +98,9 @@ export function createFromNodeStream<T>(
98 options ? options.encodeFormAction : undefined,
99 options && typeof options.nonce === 'string' ? options.nonce : undefined,
100 undefined, // TODO: If encodeReply is supported, this should support temporaryReferences
101 + options && options.unstable_allowPartialStream
102 + ? options.unstable_allowPartialStream
103 + : false,
104 __DEV__ ? findSourceMapURL : undefined,
105 __DEV__ && options ? options.replayConsoleLogs === true : false, // defaults to false
106 __DEV__ && options && options.environmentName
packages/react-server-dom-turbopack/src/client/ReactFlightDOMClientBrowser.js
+4
@@ -48,6 +48,7 @@ export type Options = {
48 callServer?: CallServerCallback,
49 debugChannel?: {writable?: WritableStream, readable?: ReadableStream, ...},
50 temporaryReferences?: TemporaryReferenceSet,
51 + unstable_allowPartialStream?: boolean,
52 findSourceMapURL?: FindSourceMapURLCallback,
53 replayConsoleLogs?: boolean,
54 environmentName?: string,
@@ -97,6 +98,9 @@ function createResponseFromOptions(options: void | Options) {
98 options && options.temporaryReferences
99 ? options.temporaryReferences
100 : undefined,
101 + options && options.unstable_allowPartialStream
102 + ? options.unstable_allowPartialStream
103 + : false,
104 __DEV__ && options && options.findSourceMapURL
105 ? options.findSourceMapURL
106 : undefined,
packages/react-server-dom-turbopack/src/client/ReactFlightDOMClientEdge.js
+4
@@ -76,6 +76,7 @@ export type Options = {
76 nonce?: string,
77 encodeFormAction?: EncodeFormActionCallback,
78 temporaryReferences?: TemporaryReferenceSet,
79 + unstable_allowPartialStream?: boolean,
80 findSourceMapURL?: FindSourceMapURLCallback,
81 replayConsoleLogs?: boolean,
82 environmentName?: string,
@@ -104,6 +105,9 @@ function createResponseFromOptions(options: Options) {
105 options && options.temporaryReferences
106 ? options.temporaryReferences
107 : undefined,
108 + options && options.unstable_allowPartialStream
109 + ? options.unstable_allowPartialStream
110 + : false,
111 __DEV__ && options && options.findSourceMapURL
112 ? options.findSourceMapURL
113 : undefined,
packages/react-server-dom-turbopack/src/client/ReactFlightDOMClientNode.js
+4
@@ -57,6 +57,7 @@ type EncodeFormActionCallback = <A>(
57 export type Options = {
58 nonce?: string,
59 encodeFormAction?: EncodeFormActionCallback,
60 + unstable_allowPartialStream?: boolean,
61 findSourceMapURL?: FindSourceMapURLCallback,
62 replayConsoleLogs?: boolean,
63 environmentName?: string,
@@ -106,6 +107,9 @@ function createFromNodeStream<T>(
107 options ? options.encodeFormAction : undefined,
108 options && typeof options.nonce === 'string' ? options.nonce : undefined,
109 undefined, // TODO: If encodeReply is supported, this should support temporaryReferences
110 + options && options.unstable_allowPartialStream
111 + ? options.unstable_allowPartialStream
112 + : false,
113 __DEV__ && options && options.findSourceMapURL
114 ? options.findSourceMapURL
115 : undefined,
packages/react-server-dom-unbundled/src/client/ReactFlightDOMClientEdge.js
+4
@@ -76,6 +76,7 @@ export type Options = {
76 nonce?: string,
77 encodeFormAction?: EncodeFormActionCallback,
78 temporaryReferences?: TemporaryReferenceSet,
79 + unstable_allowPartialStream?: boolean,
80 findSourceMapURL?: FindSourceMapURLCallback,
81 replayConsoleLogs?: boolean,
82 environmentName?: string,
@@ -104,6 +105,9 @@ function createResponseFromOptions(options: Options) {
105 options && options.temporaryReferences
106 ? options.temporaryReferences
107 : undefined,
108 + options && options.unstable_allowPartialStream
109 + ? options.unstable_allowPartialStream
110 + : false,
111 __DEV__ && options && options.findSourceMapURL
112 ? options.findSourceMapURL
113 : undefined,
packages/react-server-dom-unbundled/src/client/ReactFlightDOMClientNode.js
+4
@@ -57,6 +57,7 @@ type EncodeFormActionCallback = <A>(
57 export type Options = {
58 nonce?: string,
59 encodeFormAction?: EncodeFormActionCallback,
60 + unstable_allowPartialStream?: boolean,
61 findSourceMapURL?: FindSourceMapURLCallback,
62 replayConsoleLogs?: boolean,
63 environmentName?: string,
@@ -106,6 +107,9 @@ function createFromNodeStream<T>(
107 options ? options.encodeFormAction : undefined,
108 options && typeof options.nonce === 'string' ? options.nonce : undefined,
109 undefined, // TODO: If encodeReply is supported, this should support temporaryReferences
110 + options && options.unstable_allowPartialStream
111 + ? options.unstable_allowPartialStream
112 + : false,
113 __DEV__ && options && options.findSourceMapURL
114 ? options.findSourceMapURL
115 : undefined,
packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js
+167 -2
@@ -2504,6 +2504,171 @@ describe('ReactFlightDOMBrowser', () => {
2504 expect(container.innerHTML).toBe('');
2505 });
2506
2507 + it('renders Suspense fallback for unresolved promises with unstable_allowPartialStream', async () => {
2508 + let resolveGreeting;
2509 + const greetingPromise = new Promise(resolve => {
2510 + resolveGreeting = resolve;
2511 + });
2512 +
2513 + function App() {
2514 + return (
2515 + <Suspense fallback="loading...">
2516 + <Greeting />
2517 + </Suspense>
2518 + );
2519 + }
2520 +
2521 + async function Greeting() {
2522 + const greeting = await greetingPromise;
2523 + return greeting;
2524 + }
2525 +
2526 + const controller = new AbortController();
2527 + const {pendingResult} = await serverAct(async () => {
2528 + return {
2529 + pendingResult: ReactServerDOMStaticServer.prerender(
2530 + <App />,
2531 + webpackMap,
2532 + {
2533 + signal: controller.signal,
2534 + },
2535 + ),
2536 + };
2537 + });
2538 +
2539 + controller.abort();
2540 + resolveGreeting('Hello, World!');
2541 + const {prelude} = await serverAct(() => pendingResult);
2542 +
2543 + function ClientRoot({response}) {
2544 + return use(response);
2545 + }
2546 +
2547 + const response = ReactServerDOMClient.createFromReadableStream(
2548 + passThrough(prelude),
2549 + {
2550 + unstable_allowPartialStream: true,
2551 + },
2552 + );
2553 + const container = document.createElement('div');
2554 + const errors = [];
2555 + const root = ReactDOMClient.createRoot(container, {
2556 + onUncaughtError(err) {
2557 + errors.push(err);
2558 + },
2559 + });
2560 +
2561 + await act(() => {
2562 + root.render(<ClientRoot response={response} />);
2563 + });
2564 +
2565 + // With `unstable_allowPartialStream`, we should see the fallback instead of a
2566 + // 'Connection closed.' error
2567 + expect(errors).toEqual([]);
2568 + expect(container.innerHTML).toBe('loading...');
2569 + });
2570 +
2571 + it('renders client components that are blocked on chunks with unstable_allowPartialStream', async () => {
2572 + let resolveClientComponentChunk;
2573 +
2574 + const ClientComponent = clientExports(
2575 + function ClientComponent({children}) {
2576 + return <div>{children}</div>;
2577 + },
2578 + '42',
2579 + '/test.js',
2580 + new Promise(resolve => (resolveClientComponentChunk = resolve)),
2581 + );
2582 +
2583 + function App() {
2584 + return <ClientComponent>Hello, World!</ClientComponent>;
2585 + }
2586 +
2587 + const controller = new AbortController();
2588 + const {pendingResult} = await serverAct(async () => {
2589 + return {
2590 + pendingResult: ReactServerDOMStaticServer.prerender(
2591 + <App />,
2592 + webpackMap,
2593 + {
2594 + signal: controller.signal,
2595 + },
2596 + ),
2597 + };
2598 + });
2599 +
2600 + controller.abort();
2601 + const {prelude} = await serverAct(() => pendingResult);
2602 +
2603 + function ClientRoot({response}) {
2604 + return use(response);
2605 + }
2606 +
2607 + const response = ReactServerDOMClient.createFromReadableStream(
2608 + passThrough(prelude),
2609 + {
2610 + unstable_allowPartialStream: true,
2611 + },
2612 + );
2613 + const container = document.createElement('div');
2614 + const root = ReactDOMClient.createRoot(container);
2615 +
2616 + await act(() => {
2617 + root.render(<ClientRoot response={response} />);
2618 + });
2619 +
2620 + expect(container.innerHTML).toBe('');
2621 +
2622 + await act(() => {
2623 + resolveClientComponentChunk();
2624 + });
2625 +
2626 + expect(container.innerHTML).toBe('<div>Hello, World!</div>');
2627 + });
2628 +
2629 + it('closes inner ReadableStreams gracefully with unstable_allowPartialStream', async () => {
2630 + let streamController;
2631 + const innerStream = new ReadableStream({
2632 + start(c) {
2633 + streamController = c;
2634 + },
2635 + });
2636 +
2637 + const abortController = new AbortController();
2638 + const {pendingResult} = await serverAct(async () => {
2639 + streamController.enqueue({hello: 'world'});
2640 + return {
2641 + pendingResult: ReactServerDOMStaticServer.prerender(
2642 + {stream: innerStream},
2643 + webpackMap,
2644 + {
2645 + signal: abortController.signal,
2646 + },
2647 + ),
2648 + };
2649 + });
2650 +
2651 + abortController.abort();
2652 + const {prelude} = await serverAct(() => pendingResult);
2653 +
2654 + const response = await ReactServerDOMClient.createFromReadableStream(
2655 + passThrough(prelude),
2656 + {
2657 + unstable_allowPartialStream: true,
2658 + },
2659 + );
2660 +
2661 + // The inner stream should be readable up to what was enqueued.
2662 + const reader = response.stream.getReader();
2663 + const {value, done} = await reader.read();
2664 + expect(value).toEqual({hello: 'world'});
2665 + expect(done).toBe(false);
2666 +
2667 + // The next read should signal the stream is done (closed, not errored).
2668 + const final = await reader.read();
2669 + expect(final.done).toBe(true);
2670 + });
2671 +
2672 it('can dedupe references inside promises', async () => {
2673 const foo = {};
2674 const bar = {
@@ -2902,9 +3067,9 @@ describe('ReactFlightDOMBrowser', () => {
3067 [
3068 "Object.<anonymous>",
3069 "/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js",
2905 - 2824,
3070 + 2989,
3071 19,
2907 - 2808,
3072 + 2973,
3073 89,
3074 ],
3075 ],
packages/react-server-dom-webpack/src/client/ReactFlightDOMClientBrowser.js
+4
@@ -48,6 +48,7 @@ export type Options = {
48 callServer?: CallServerCallback,
49 debugChannel?: {writable?: WritableStream, readable?: ReadableStream, ...},
50 temporaryReferences?: TemporaryReferenceSet,
51 + unstable_allowPartialStream?: boolean,
52 findSourceMapURL?: FindSourceMapURLCallback,
53 replayConsoleLogs?: boolean,
54 environmentName?: string,
@@ -97,6 +98,9 @@ function createResponseFromOptions(options: void | Options) {
98 options && options.temporaryReferences
99 ? options.temporaryReferences
100 : undefined,
101 + options && options.unstable_allowPartialStream
102 + ? options.unstable_allowPartialStream
103 + : false,
104 __DEV__ && options && options.findSourceMapURL
105 ? options.findSourceMapURL
106 : undefined,
packages/react-server-dom-webpack/src/client/ReactFlightDOMClientEdge.js
+4
@@ -76,6 +76,7 @@ export type Options = {
76 nonce?: string,
77 encodeFormAction?: EncodeFormActionCallback,
78 temporaryReferences?: TemporaryReferenceSet,
79 + unstable_allowPartialStream?: boolean,
80 findSourceMapURL?: FindSourceMapURLCallback,
81 replayConsoleLogs?: boolean,
82 environmentName?: string,
@@ -104,6 +105,9 @@ function createResponseFromOptions(options: Options) {
105 options && options.temporaryReferences
106 ? options.temporaryReferences
107 : undefined,
108 + options && options.unstable_allowPartialStream
109 + ? options.unstable_allowPartialStream
110 + : false,
111 __DEV__ && options && options.findSourceMapURL
112 ? options.findSourceMapURL
113 : undefined,
packages/react-server-dom-webpack/src/client/ReactFlightDOMClientNode.js
+4
@@ -57,6 +57,7 @@ type EncodeFormActionCallback = <A>(
57 export type Options = {
58 nonce?: string,
59 encodeFormAction?: EncodeFormActionCallback,
60 + unstable_allowPartialStream?: boolean,
61 findSourceMapURL?: FindSourceMapURLCallback,
62 replayConsoleLogs?: boolean,
63 environmentName?: string,
@@ -106,6 +107,9 @@ function createFromNodeStream<T>(
107 options ? options.encodeFormAction : undefined,
108 options && typeof options.nonce === 'string' ? options.nonce : undefined,
109 undefined, // TODO: If encodeReply is supported, this should support temporaryReferences
110 + options && options.unstable_allowPartialStream
111 + ? options.unstable_allowPartialStream
112 + : false,
113 __DEV__ && options && options.findSourceMapURL
114 ? options.findSourceMapURL
115 : undefined,