diff options
| author | 2023-07-27 04:27:09 -0700 | |
|---|---|---|
| committer | 2023-07-27 04:27:09 -0700 | |
| commit | 704ee133923a4e28bd51bc95b56eb54d50424c17 (patch) | |
| tree | 3f4068d3a0d777a2a712739bf24a7e4e499f5cb0 /src/js/node | |
| parent | d7aebc2222daa293dc41c4fb9e230f1848cea3ad (diff) | |
| download | bun-704ee133923a4e28bd51bc95b56eb54d50424c17.tar.gz bun-704ee133923a4e28bd51bc95b56eb54d50424c17.tar.zst bun-704ee133923a4e28bd51bc95b56eb54d50424c17.zip | |
Make readdir() async, fix crash in large directory trees (#3838)
* Fix unsafe GC behavior on large arrays returned by fs
* Fix crash in large arrays of strings
* async readdir
* Add tests for large number of files returned by readdir
* Move this down
* Fix encoding edgecase in path.join
* Async stat & lstat
* add test
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Diffstat (limited to 'src/js/node')
| -rw-r--r-- | src/js/node/fs.js | 28 | ||||
| -rw-r--r-- | src/js/node/fs.promises.ts | 31 |
2 files changed, 28 insertions, 31 deletions
diff --git a/src/js/node/fs.js b/src/js/node/fs.js index 5e72d6e27..f847cf179 100644 --- a/src/js/node/fs.js +++ b/src/js/node/fs.js @@ -122,9 +122,6 @@ export var access = function access(...args) { link = function link(...args) { callbackify(fs.linkSync, args); }, - lstat = function lstat(...args) { - callbackify(fs.lstatSync, args); - }, mkdir = function mkdir(...args) { callbackify(fs.mkdirSync, args); }, @@ -141,7 +138,13 @@ export var access = function access(...args) { callbackify(fs.writeSync, args); }, readdir = function readdir(...args) { - callbackify(fs.readdirSync, args); + const callback = args[args.length - 1]; + if (typeof callback !== "function") { + // TODO: set code + throw new TypeError("Callback must be a function"); + } + + fs.readdir(...args).then(result => callback(null, result), callback); }, readFile = function readFile(...args) { callbackify(fs.readFileSync, args); @@ -158,8 +161,23 @@ export var access = function access(...args) { rename = function rename(...args) { callbackify(fs.renameSync, args); }, + lstat = function lstat(...args) { + const callback = args[args.length - 1]; + if (typeof callback !== "function") { + // TODO: set code + throw new TypeError("Callback must be a function"); + } + + fs.lstat(...args).then(result => callback(null, result), callback); + }, stat = function stat(...args) { - callbackify(fs.statSync, args); + const callback = args[args.length - 1]; + if (typeof callback !== "function") { + // TODO: set code + throw new TypeError("Callback must be a function"); + } + + fs.stat(...args).then(result => callback(null, result), callback); }, symlink = function symlink(...args) { callbackify(fs.symlinkSync, args); diff --git a/src/js/node/fs.promises.ts b/src/js/node/fs.promises.ts index 12278ef53..1826586ae 100644 --- a/src/js/node/fs.promises.ts +++ b/src/js/node/fs.promises.ts @@ -11,30 +11,9 @@ var fs = Bun.fs(); const notrace = "::bunternal::"; var promisify = { [notrace]: fsFunction => { - // TODO: remove variadic arguments - // we can use new Function() here instead - // based on fsFucntion.length - var func = { - [notrace]: function (resolve, reject, args) { - var result; - try { - result = fsFunction.apply(fs, args); - args = undefined; - } catch (err) { - args = undefined; - reject(err); - return; - } - - resolve(result); - }, - }[notrace]; - return async function (...args) { - // we await it so that the stack is captured - return await new Promise((resolve, reject) => { - process.nextTick(func, resolve, reject, args); - }); + await 1; + return fsFunction.apply(fs, args); }; }, }[notrace]; @@ -104,19 +83,19 @@ export var access = promisify(fs.accessSync), lchmod = promisify(fs.lchmodSync), lchown = promisify(fs.lchownSync), link = promisify(fs.linkSync), - lstat = promisify(fs.lstatSync), + lstat = fs.lstat.bind(fs), mkdir = promisify(fs.mkdirSync), mkdtemp = promisify(fs.mkdtempSync), open = promisify(fs.openSync), read = promisify(fs.readSync), write = promisify(fs.writeSync), - readdir = promisify(fs.readdirSync), + readdir = fs.readdir.bind(fs), readFile = promisify(fs.readFileSync), writeFile = promisify(fs.writeFileSync), readlink = promisify(fs.readlinkSync), realpath = promisify(fs.realpathSync), rename = promisify(fs.renameSync), - stat = promisify(fs.statSync), + stat = fs.stat.bind(fs), symlink = promisify(fs.symlinkSync), truncate = promisify(fs.truncateSync), unlink = promisify(fs.unlinkSync), |
