2024-01-12 07:34:12 +00:00
|
|
|
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
|
|
|
// This module is browser compatible.
|
|
|
|
|
|
|
|
import { DEFAULT_BUFFER_SIZE } from "./_constants.ts";
|
2024-07-30 05:52:20 +00:00
|
|
|
import { writeAll } from "./write_all.ts";
|
2024-01-12 07:34:12 +00:00
|
|
|
import type { Reader, Writer } from "./types.ts";
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Copies from `src` to `dst` until either EOF (`null`) is read from `src` or
|
|
|
|
* an error occurs. It resolves to the number of bytes copied or rejects with
|
|
|
|
* the first error encountered while copying.
|
|
|
|
*
|
2024-08-08 14:20:43 +00:00
|
|
|
* @example Usage
|
2024-09-19 23:29:31 +00:00
|
|
|
* ```ts ignore
|
2024-04-29 02:57:30 +00:00
|
|
|
* import { copy } from "@std/io/copy";
|
2024-01-12 07:34:12 +00:00
|
|
|
*
|
|
|
|
* const source = await Deno.open("my_file.txt");
|
|
|
|
* const bytesCopied1 = await copy(source, Deno.stdout);
|
|
|
|
* const destination = await Deno.create("my_file_2.txt");
|
|
|
|
* const bytesCopied2 = await copy(source, destination);
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* @param src The source to copy from
|
|
|
|
* @param dst The destination to copy to
|
|
|
|
* @param options Can be used to tune size of the buffer. Default size is 32kB
|
2024-07-30 05:52:20 +00:00
|
|
|
* @returns Number of bytes copied
|
2024-01-12 07:34:12 +00:00
|
|
|
*/
|
|
|
|
export async function copy(
|
|
|
|
src: Reader,
|
|
|
|
dst: Writer,
|
|
|
|
options?: {
|
|
|
|
bufSize?: number;
|
|
|
|
},
|
|
|
|
): Promise<number> {
|
|
|
|
let n = 0;
|
2024-07-30 05:52:20 +00:00
|
|
|
const b = new Uint8Array(options?.bufSize ?? DEFAULT_BUFFER_SIZE);
|
|
|
|
while (true) {
|
2024-01-12 07:34:12 +00:00
|
|
|
const result = await src.read(b);
|
2024-07-30 05:52:20 +00:00
|
|
|
if (result === null) break;
|
|
|
|
await writeAll(dst, b.subarray(0, result));
|
|
|
|
n += result;
|
2024-01-12 07:34:12 +00:00
|
|
|
}
|
|
|
|
return n;
|
|
|
|
}
|