diff --git a/io/ioutil.ts b/io/ioutil.ts index 7b6761708173..c7b92fc1d211 100644 --- a/io/ioutil.ts +++ b/io/ioutil.ts @@ -24,7 +24,10 @@ export async function copyN( const nread = result ?? 0; bytesRead += nread; if (nread > 0) { - const n = await dest.write(buf.slice(0, nread)); + let n = 0; + while (n < nread) { + n += await dest.write(buf.slice(n, nread)); + } assert(n === nread, "could not write"); } if (result === null) { diff --git a/io/ioutil_test.ts b/io/ioutil_test.ts index 4d7d0f4ca0c0..1f552d0e6d2d 100644 --- a/io/ioutil_test.ts +++ b/io/ioutil_test.ts @@ -10,7 +10,8 @@ import { sliceLongToBytes, } from "./ioutil.ts"; import { BufReader } from "./bufio.ts"; -import { stringsReader } from "./util.ts"; +import { stringsReader, tempFile } from "./util.ts"; +import * as path from "../path/mod.ts"; class BinaryReader implements Reader { index = 0; @@ -85,3 +86,15 @@ Deno.test("testCopyN2", async function (): Promise { assertEquals(n, 10); assertEquals(w.toString(), "abcdefghij"); }); + +Deno.test("copyNWriteAllData", async function (): Promise { + const { filepath, file } = await tempFile(path.resolve("io")); + const size = 16 * 1024 + 1; + const data = "a".repeat(32 * 1024); + const r = stringsReader(data); + const n = await copyN(r, file, size); // Over max file possible buffer + file.close(); + await Deno.remove(filepath); + + assertEquals(n, size); +});