UNPKG

@typespec/ts-http-runtime

Version:

Isomorphic client library for making HTTP requests in node.js and browser.

51 lines 2.21 kB
// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. import { isWebReadableStream } from "./typeGuards-react-native.mjs"; /** * Utility function that concatenates a set of binary inputs into one combined output. * * React Native runs on the Hermes engine, which implements a subset of web * APIs with narrower type contracts than full browsers: * * - **Blob**: natively supported, but its constructor only accepts * `(Blob | string)[]` — NOT the full `BlobPart[]` union. Passing a * `Uint8Array` to `new Blob([uint8])` throws at runtime. * See https://github.com/facebook/react-native/issues/44125 * * - **Uint8Array**: works as a data type, but cannot be passed to the Blob * constructor without a polyfill (e.g. react-native-blob-jsi-helper). * See https://github.com/facebook/react-native/issues/41079 * * - **ReadableStream / Response**: not available by default. Apps can polyfill * these (e.g. web-streams-polyfill + react-native-fetch-api). * * This implementation handles all source types and defers to the runtime, * so apps with the appropriate polyfills get correct behavior while apps * without them get the engine's native error. * * @param sources - array of sources for the concatenation * @returns a `Blob` representing all the concatenated inputs. * * @internal */ export async function concat(sources) { const parts = []; for (const source of sources) { const resolved = typeof source === "function" ? source() : source; if (resolved instanceof Blob || resolved instanceof Uint8Array) { parts.push(resolved); } else if (isWebReadableStream(resolved)) { // Requires ReadableStream + Response polyfills in RN parts.push(await new Response(resolved).blob()); } else { throw new Error(`Unsupported source type: ${typeof resolved}`); } } // Hermes's Blob constructor natively accepts only (Blob | string)[]. // Uint8Array requires a polyfill — the cast lets it through at compile // time and defers the check to the runtime. return new Blob(parts); } //# sourceMappingURL=concat-react-native.mjs.map