diff options
Diffstat (limited to 'src/js/node/fs.js')
-rw-r--r-- | src/js/node/fs.js | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/src/js/node/fs.js b/src/js/node/fs.js index 3dc3e2da7..9cc0748cb 100644 --- a/src/js/node/fs.js +++ b/src/js/node/fs.js @@ -4,6 +4,7 @@ var WriteStream; const EventEmitter = require("node:events"); const promises = require("node:fs/promises"); const Stream = require("node:stream"); +const { isArrayBufferView } = require("node:util/types"); var fs = Bun.fs(); class FSWatcher extends EventEmitter { @@ -126,8 +127,37 @@ var access = function access(...args) { open = function open(...args) { callbackify(fs.openSync, args); }, - read = function read(...args) { - callbackify(fs.readSync, args); + read = function read(fd, buffer, offsetOrOptions, length, position, callback) { + let offset = offsetOrOptions; + let params = null; + if (arguments.length <= 4) { + if (arguments.length === 4) { + // fs.read(fd, buffer, options, callback) + callback = length; + params = offsetOrOptions; + } else if (arguments.length === 3) { + // fs.read(fd, bufferOrParams, callback) + if (!isArrayBufferView(buffer)) { + // fs.read(fd, params, callback) + params = buffer; + ({ buffer = Buffer.alloc(16384) } = params ?? {}); + } + callback = offsetOrOptions; + } else { + // fs.read(fd, callback) + callback = buffer; + buffer = Buffer.alloc(16384); + } + ({ offset = 0, length = buffer?.byteLength - offset, position = null } = params ?? {}); + } + queueMicrotask(() => { + try { + var bytesRead = fs.readSync(fd, buffer, offset, length, position); + } catch (e) { + callback(e); + } + callback(null, bytesRead, buffer); + }); }, write = function write(...args) { callbackify(fs.writeSync, args); |