Files
react/packages/react-server-dom-webpack/src/ReactFlightDOMClient.js
Sebastian Markbåge 5fd9db732d [Flight] Rename react-transport-... packages to react-server-... (#20403)
* Move files

* Update paths

* Rename import variables

* Rename /server to /writer

This is mainly because "React Server Server" is weird so we need another
dimension.

* Use "react-server" convention to enforce that writer is only loaded in a server
2020-12-08 08:08:57 -05:00

85 lines
2.2 KiB
JavaScript

/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
*/
import type {Response as FlightResponse} from 'react-client/src/ReactFlightClientStream';
import {
createResponse,
reportGlobalError,
processStringChunk,
processBinaryChunk,
close,
} from 'react-client/src/ReactFlightClientStream';
function startReadingFromStream(
response: FlightResponse,
stream: ReadableStream,
): void {
const reader = stream.getReader();
function progress({done, value}) {
if (done) {
close(response);
return;
}
const buffer: Uint8Array = (value: any);
processBinaryChunk(response, buffer);
return reader.read().then(progress, error);
}
function error(e) {
reportGlobalError(response, e);
}
reader.read().then(progress, error);
}
function createFromReadableStream(stream: ReadableStream): FlightResponse {
const response: FlightResponse = createResponse();
startReadingFromStream(response, stream);
return response;
}
function createFromFetch(
promiseForResponse: Promise<Response>,
): FlightResponse {
const response: FlightResponse = createResponse();
promiseForResponse.then(
function(r) {
startReadingFromStream(response, (r.body: any));
},
function(e) {
reportGlobalError(response, e);
},
);
return response;
}
function createFromXHR(request: XMLHttpRequest): FlightResponse {
const response: FlightResponse = createResponse();
let processedLength = 0;
function progress(e: ProgressEvent): void {
const chunk = request.responseText;
processStringChunk(response, chunk, processedLength);
processedLength = chunk.length;
}
function load(e: ProgressEvent): void {
progress(e);
close(response);
}
function error(e: ProgressEvent): void {
reportGlobalError(response, new TypeError('Network error'));
}
request.addEventListener('progress', progress);
request.addEventListener('load', load);
request.addEventListener('error', error);
request.addEventListener('abort', error);
request.addEventListener('timeout', error);
return response;
}
export {createFromXHR, createFromFetch, createFromReadableStream};