UNPKG

@mieweb/wikigdrive

Version:

Google Drive to MarkDown synchronization

55 lines (54 loc) 1.82 kB
// Copyright 2018-2025 the Deno authors. 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 Usage * ```ts no-assert * import { toReadableStream } from "@std/io/to-readable-stream"; * * using file = await Deno.open("./README.md", { read: true }); * const fileStream = toReadableStream(file); * ``` * * @param reader The reader to read from * @param options The options * @returns The readable stream */ export function toReadableStream(reader, options) { const { autoClose = true, chunkSize = DEFAULT_CHUNK_SIZE, strategy, } = options ?? {}; 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); }