diff --git a/js/deno.ts b/js/deno.ts index 346997d4dcceec..e32071ed20ba1a 100644 --- a/js/deno.ts +++ b/js/deno.ts @@ -7,6 +7,7 @@ export { chdir, cwd } from "./dir"; export { File, open, stdin, stdout, stderr, read, write, close } from "./files"; export { copy, + toAsyncIterator, ReadResult, Reader, Writer, diff --git a/js/files_test.ts b/js/files_test.ts index 9759e0b261aeeb..37f63d9fa270ad 100644 --- a/js/files_test.ts +++ b/js/files_test.ts @@ -17,3 +17,15 @@ test(async function filesCopyToStdout() { assertEqual(bytesWritten, fileSize); console.log("bytes written", bytesWritten); }); + +test(async function filesToAsyncIterator() { + const filename = "tests/hello.txt"; + const file = await deno.open(filename); + + let totalSize = 0; + for await (const buf of deno.toAsyncIterator(file)) { + totalSize += buf.byteLength; + } + + assertEqual(totalSize, 12); +}); diff --git a/js/io.ts b/js/io.ts index aa041585b943ae..4e37355bbb7a9a 100644 --- a/js/io.ts +++ b/js/io.ts @@ -115,3 +115,30 @@ export async function copy(dst: Writer, src: Reader): Promise { } return n; } + +/** + * Turns `r` into async iterator. + * + * for await (const chunk of readerIterator(reader)) { + * console.log(chunk) + * } + */ +export function toAsyncIterator( + r: Reader +): AsyncIterableIterator { + const b = new Uint8Array(1024); + + return { + [Symbol.asyncIterator]() { + return this; + }, + + async next(): Promise> { + const result = await r.read(b); + return { + value: b.subarray(0, result.nread), + done: result.eof + }; + } + }; +}