diff options
| author | Divy Srivastava <dj.srivastava23@gmail.com> | 2024-01-05 18:28:33 +0530 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-05 18:28:33 +0530 |
| commit | df062d2c788fd76546d59c67452d8d0fe569c533 (patch) | |
| tree | b82a837378469c3eb1456aeea40354601b040793 /ext/node/polyfills/_fs | |
| parent | bac51f66aa89dd9b79a3c4e844423c3a3399ea13 (diff) | |
fix(ext/node): add fs.cp, fs.cpSync, promises.cp (#21745)
Fixes https://github.com/denoland/deno/issues/20803
Fixes https://github.com/denoland/deno/issues/21723
Performance: copying a 48GiB rust `target` folder (recursive)
| Platform | `deno` | `node v21.5` | Improvement |
| -------- | ------- | ------- | ------- |
| macOS (APFS) | 3.1secs | 127.99 secs | **42x** |
| Windows | 18.3secs | 67.2secs | **3.8x** |
Copying files with varying sizes:

Diffstat (limited to 'ext/node/polyfills/_fs')
| -rw-r--r-- | ext/node/polyfills/_fs/_fs_cp.js | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/ext/node/polyfills/_fs/_fs_cp.js b/ext/node/polyfills/_fs/_fs_cp.js new file mode 100644 index 000000000..dbe327974 --- /dev/null +++ b/ext/node/polyfills/_fs/_fs_cp.js @@ -0,0 +1,41 @@ +// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. + +// deno-lint-ignore-file prefer-primordials + +import { + getValidatedPath, + validateCpOptions, +} from "ext:deno_node/internal/fs/utils.mjs"; +import { promisify } from "ext:deno_node/internal/util.mjs"; + +const core = globalThis.__bootstrap.core; +const ops = core.ops; +const { op_node_cp } = core.ensureFastOps(); + +export function cpSync(src, dest, options) { + validateCpOptions(options); + const srcPath = getValidatedPath(src, "src"); + const destPath = getValidatedPath(dest, "dest"); + + ops.op_node_cp_sync(srcPath, destPath); +} + +export function cp(src, dest, options, callback) { + if (typeof options === "function") { + callback = options; + options = {}; + } + validateCpOptions(options); + const srcPath = getValidatedPath(src, "src"); + const destPath = getValidatedPath(dest, "dest"); + + op_node_cp( + srcPath, + destPath, + ).then( + (res) => callback(null, res), + (err) => callback(err, null), + ); +} + +export const cpPromise = promisify(cp); |
