@oazmi/build-tools
Version:
general deno build tool scripts which I practically use in all of my typescript repos
50 lines (49 loc) • 1.68 kB
JavaScript
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
// This module is browser compatible.
import { DEFAULT_CHUNK_SIZE } from "./_constants.js";
import { isCloser } from "./_common.js";
/**
* Create a {@linkcode ReadableStream} of {@linkcode Uint8Array}s from a
* {@linkcode Reader}.
*
* When the pull algorithm is called on the stream, a chunk from the reader
* will be read. When `null` is returned from the reader, the stream will be
* closed along with the reader (if it is also a `Closer`).
*
* @example
* ```ts
* import { toReadableStream } from "@std/io/to-readable-stream";
*
* const file = await Deno.open("./file.txt", { read: true });
* const fileStream = toReadableStream(file);
* ```
*/
export function toReadableStream(reader, { autoClose = true, chunkSize = DEFAULT_CHUNK_SIZE, strategy, } = {}) {
return new ReadableStream({
async pull(controller) {
const chunk = new Uint8Array(chunkSize);
try {
const read = await reader.read(chunk);
if (read === null) {
if (isCloser(reader) && autoClose) {
reader.close();
}
controller.close();
return;
}
controller.enqueue(chunk.subarray(0, read));
}
catch (e) {
controller.error(e);
if (isCloser(reader)) {
reader.close();
}
}
},
cancel() {
if (isCloser(reader) && autoClose) {
reader.close();
}
},
}, strategy);
}