summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--std/io/ioutil.ts5
-rw-r--r--std/io/ioutil_test.ts15
2 files changed, 18 insertions, 2 deletions
diff --git a/std/io/ioutil.ts b/std/io/ioutil.ts
index 7b6761708..c7b92fc1d 100644
--- a/std/io/ioutil.ts
+++ b/std/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/std/io/ioutil_test.ts b/std/io/ioutil_test.ts
index 4d7d0f4ca..1f552d0e6 100644
--- a/std/io/ioutil_test.ts
+++ b/std/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<void> {
assertEquals(n, 10);
assertEquals(w.toString(), "abcdefghij");
});
+
+Deno.test("copyNWriteAllData", async function (): Promise<void> {
+ 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);
+});