aboutsummaryrefslogtreecommitdiff
path: root/src/js/node/fs.promises.ts
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2023-07-11 19:14:34 -0700
committerGravatar GitHub <noreply@github.com> 2023-07-11 19:14:34 -0700
commitcbb88672f217a90db1aa1eb29cd92d5d9035b22b (patch)
tree43a00501f3cde495967e116f0b660777051551f8 /src/js/node/fs.promises.ts
parent1f900cff453700b19bca2acadfe26da4468c1282 (diff)
parent34b0e7a2bbd8bf8097341cdb0075d0908283e834 (diff)
downloadbun-jarred/esm-conditions.tar.gz
bun-jarred/esm-conditions.tar.zst
bun-jarred/esm-conditions.zip
Merge branch 'main' into jarred/esm-conditionsjarred/esm-conditions
Diffstat (limited to 'src/js/node/fs.promises.ts')
-rw-r--r--src/js/node/fs.promises.ts85
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,
};