@typespec/ts-http-runtime
Version:
Isomorphic client library for making HTTP requests in node.js and browser.
69 lines • 2.02 kB
JavaScript
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
import { Readable } from "stream";
import { isBlob } from "./typeGuards.js";
async function* streamAsyncIterator() {
const reader = this.getReader();
try {
while (true) {
const { done, value } = await reader.read();
if (done) {
return;
}
yield value;
}
}
finally {
reader.releaseLock();
}
}
function makeAsyncIterable(webStream) {
if (!webStream[Symbol.asyncIterator]) {
webStream[Symbol.asyncIterator] = streamAsyncIterator.bind(webStream);
}
if (!webStream.values) {
webStream.values = streamAsyncIterator.bind(webStream);
}
}
function ensureNodeStream(stream) {
if (stream instanceof ReadableStream) {
makeAsyncIterable(stream);
return Readable.fromWeb(stream);
}
else {
return stream;
}
}
function toStream(source) {
if (source instanceof Uint8Array) {
return Readable.from(Buffer.from(source));
}
else if (isBlob(source)) {
return ensureNodeStream(source.stream());
}
else {
return ensureNodeStream(source);
}
}
/**
* Utility function that concatenates a set of binary inputs into one combined output.
*
* @param sources - array of sources for the concatenation
* @returns - in Node, a (() =\> NodeJS.ReadableStream) which, when read, produces a concatenation of all the inputs.
* In browser, returns a `Blob` representing all the concatenated inputs.
*
* @internal
*/
export async function concat(sources) {
return function () {
const streams = sources.map((x) => (typeof x === "function" ? x() : x)).map(toStream);
return Readable.from((async function* () {
for (const stream of streams) {
for await (const chunk of stream) {
yield chunk;
}
}
})());
};
}
//# sourceMappingURL=concat.js.map