summaryrefslogtreecommitdiff
path: root/std/node/_fs/_fs_open.ts
diff options
context:
space:
mode:
authorali ahmed <48116123+AliBasicCoder@users.noreply.github.com>2020-10-14 17:59:28 +0200
committerGitHub <noreply@github.com>2020-10-14 11:59:28 -0400
commit5bed06fb94214db70a27cca8fa8eff717d537dba (patch)
tree7f208b9f87cd3c5d3f8f330af5b6b0fe3b4038d2 /std/node/_fs/_fs_open.ts
parentf75bd89aff7cffafceb394d629995479af54a156 (diff)
feat(std/fs/node): adding some functions (#7921)
Diffstat (limited to 'std/node/_fs/_fs_open.ts')
-rw-r--r--std/node/_fs/_fs_open.ts103
1 files changed, 103 insertions, 0 deletions
diff --git a/std/node/_fs/_fs_open.ts b/std/node/_fs/_fs_open.ts
new file mode 100644
index 000000000..bf53115de
--- /dev/null
+++ b/std/node/_fs/_fs_open.ts
@@ -0,0 +1,103 @@
+import { existsSync } from "../../fs/mod.ts";
+import { fromFileUrl } from "../path.ts";
+import { getOpenOptions } from "./_fs_common.ts";
+
+type openFlags =
+ | "a"
+ | "ax"
+ | "a+"
+ | "ax+"
+ | "as"
+ | "as+"
+ | "r"
+ | "r+"
+ | "rs+"
+ | "w"
+ | "wx"
+ | "w+"
+ | "wx+";
+
+type openCallback = (err: Error | undefined, fd: number) => void;
+
+function convertFlagAndModeToOptions(
+ flag?: openFlags,
+ mode?: number,
+): Deno.OpenOptions | undefined {
+ if (!flag && !mode) return undefined;
+ if (!flag && mode) return { mode };
+ return { ...getOpenOptions(flag), mode };
+}
+
+export function open(path: string | URL, callback: openCallback): void;
+export function open(
+ path: string | URL,
+ flags: openFlags,
+ callback: openCallback,
+): void;
+export function open(
+ path: string | URL,
+ flags: openFlags,
+ mode: number,
+ callback: openCallback,
+): void;
+export function open(
+ path: string | URL,
+ flagsOrCallback: openCallback | openFlags,
+ callbackOrMode?: openCallback | number,
+ maybeCallback?: openCallback,
+) {
+ const flags = typeof flagsOrCallback === "string"
+ ? flagsOrCallback
+ : undefined;
+ const callback = typeof flagsOrCallback === "function"
+ ? flagsOrCallback
+ : typeof callbackOrMode === "function"
+ ? callbackOrMode
+ : maybeCallback;
+ const mode = typeof callbackOrMode === "number" ? callbackOrMode : undefined;
+ path = path instanceof URL ? fromFileUrl(path) : path;
+
+ if (!callback) throw new Error("No callback function supplied");
+
+ if (["ax", "ax+", "wx", "wx+"].includes(flags || "") && existsSync(path)) {
+ const err = new Error(`EEXIST: file already exists, open '${path}'`);
+ callback(err, 0);
+ } else {
+ if (flags === "as" || flags === "as+") {
+ try {
+ const res = openSync(path, flags, mode);
+ callback(undefined, res);
+ } catch (error) {
+ callback(error, error);
+ }
+ return;
+ }
+ Deno.open(path, convertFlagAndModeToOptions(flags, mode))
+ .then((file) => callback(undefined, file.rid))
+ .catch((err) => callback(err, err));
+ }
+}
+
+export function openSync(path: string | URL): number;
+export function openSync(path: string | URL, flags?: openFlags): number;
+export function openSync(path: string | URL, mode?: number): number;
+export function openSync(
+ path: string | URL,
+ flags?: openFlags,
+ mode?: number,
+): number;
+export function openSync(
+ path: string | URL,
+ flagsOrMode?: openFlags | number,
+ maybeMode?: number,
+) {
+ const flags = typeof flagsOrMode === "string" ? flagsOrMode : undefined;
+ const mode = typeof flagsOrMode === "number" ? flagsOrMode : maybeMode;
+ path = path instanceof URL ? fromFileUrl(path) : path;
+
+ if (["ax", "ax+", "wx", "wx+"].includes(flags || "") && existsSync(path)) {
+ throw new Error(`EEXIST: file already exists, open '${path}'`);
+ }
+
+ return Deno.openSync(path, convertFlagAndModeToOptions(flags, mode)).rid;
+}