aboutsummaryrefslogtreecommitdiff
path: root/src/js/node
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2023-07-27 04:27:09 -0700
committerGravatar GitHub <noreply@github.com> 2023-07-27 04:27:09 -0700
commit704ee133923a4e28bd51bc95b56eb54d50424c17 (patch)
tree3f4068d3a0d777a2a712739bf24a7e4e499f5cb0 /src/js/node
parentd7aebc2222daa293dc41c4fb9e230f1848cea3ad (diff)
downloadbun-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.js28
-rw-r--r--src/js/node/fs.promises.ts31
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),