diff options
Diffstat (limited to 'src/js/node/fs.promises.ts')
-rw-r--r-- | src/js/node/fs.promises.ts | 85 |
1 files changed, 84 insertions, 1 deletions
diff --git a/src/js/node/fs.promises.ts b/src/js/node/fs.promises.ts index de802928b..12278ef53 100644 --- a/src/js/node/fs.promises.ts +++ b/src/js/node/fs.promises.ts @@ -1,4 +1,5 @@ // Hardcoded module "node:fs/promises" + // Note: `constants` is injected into the top of this file declare var constants: typeof import("node:fs/promises").constants; @@ -38,6 +39,55 @@ var promisify = { }, }[notrace]; +export function watch( + filename: string | Buffer | URL, + options: { encoding?: BufferEncoding; persistent?: boolean; recursive?: boolean; signal?: AbortSignal } = {}, +) { + type Event = { + eventType: string; + filename: string | Buffer | undefined; + }; + const events: Array<Event> = []; + if (filename instanceof URL) { + throw new TypeError("Watch URLs are not supported yet"); + } else if (Buffer.isBuffer(filename)) { + filename = filename.toString(); + } else if (typeof filename !== "string") { + throw new TypeError("Expected path to be a string or Buffer"); + } + let nextEventResolve: Function | null = null; + if (typeof options === "string") { + options = { encoding: options }; + } + fs.watch(filename, options || {}, (eventType: string, filename: string | Buffer | undefined) => { + events.push({ eventType, filename }); + if (nextEventResolve) { + const resolve = nextEventResolve; + nextEventResolve = null; + resolve(); + } + }); + return { + async *[Symbol.asyncIterator]() { + let closed = false; + while (!closed) { + while (events.length) { + let event = events.shift() as Event; + if (event.eventType === "close") { + closed = true; + break; + } + if (event.eventType === "error") { + closed = true; + throw event.filename; + } + yield event; + } + await new Promise((resolve: Function) => (nextEventResolve = resolve)); + } + }, + }; +} export var access = promisify(fs.accessSync), appendFile = promisify(fs.appendFileSync), close = promisify(fs.closeSync), @@ -73,7 +123,37 @@ export var access = promisify(fs.accessSync), utimes = promisify(fs.utimesSync), lutimes = promisify(fs.lutimesSync), rm = promisify(fs.rmSync), - rmdir = promisify(fs.rmdirSync); + rmdir = promisify(fs.rmdirSync), + writev = (fd, buffers, position) => { + return new Promise((resolve, reject) => { + try { + var bytesWritten = fs.writevSync(fd, buffers, position); + } catch (err) { + reject(err); + return; + } + + resolve({ + bytesWritten, + buffers, + }); + }); + }, + readv = (fd, buffers, position) => { + return new Promise((resolve, reject) => { + try { + var bytesRead = fs.readvSync(fd, buffers, position); + } catch (err) { + reject(err); + return; + } + + resolve({ + bytesRead, + buffers, + }); + }); + }; export default { access, @@ -112,6 +192,9 @@ export default { lutimes, rm, rmdir, + watch, + writev, + readv, constants, [Symbol.for("CommonJS")]: 0, }; |