summaryrefslogtreecommitdiff
path: root/std/node/_fs/_fs_appendFile.ts
diff options
context:
space:
mode:
authorChris Knight <cknight1234@gmail.com>2020-03-12 14:12:27 +0000
committerGitHub <noreply@github.com>2020-03-12 10:12:27 -0400
commitcabe63eb05f334bc9921dc8633b254b05519b434 (patch)
tree4e6ad72e742a2acca605c0cf253e1f97586ce9da /std/node/_fs/_fs_appendFile.ts
parent3ed6ccc905394ed9c5d9cbcb8fa2426151780788 (diff)
fix: Node polyfill fsAppend rework (#4322)
* My original implementation of `fs.appendFile` used an async API, which, though it would work fine as a polyfill, wasn't an exact match with the Node API. This PR reworks that API to mimic the Node API fully as a synchronous void function with an async internal implementation. * Refactor move of other internal fs `dirent` and `dir` classes to the _fs internal directory.
Diffstat (limited to 'std/node/_fs/_fs_appendFile.ts')
-rw-r--r--std/node/_fs/_fs_appendFile.ts84
1 files changed, 46 insertions, 38 deletions
diff --git a/std/node/_fs/_fs_appendFile.ts b/std/node/_fs/_fs_appendFile.ts
index 962f44884..193badf1f 100644
--- a/std/node/_fs/_fs_appendFile.ts
+++ b/std/node/_fs/_fs_appendFile.ts
@@ -1,18 +1,18 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
-import { FileOptions, isFileOptions } from "./_fs_common.ts";
+import { FileOptions, isFileOptions, CallbackWithError } from "./_fs_common.ts";
import { notImplemented } from "../_utils.ts";
/**
* TODO: Also accept 'data' parameter as a Node polyfill Buffer type once this
* is implemented. See https://github.com/denoland/deno/issues/3403
*/
-export async function appendFile(
+export function appendFile(
pathOrRid: string | number,
data: string,
- optionsOrCallback: string | FileOptions | Function,
- callback?: Function
-): Promise<void> {
- const callbackFn: Function | undefined =
+ optionsOrCallback: string | FileOptions | CallbackWithError,
+ callback?: CallbackWithError
+): void {
+ const callbackFn: CallbackWithError | undefined =
optionsOrCallback instanceof Function ? optionsOrCallback : callback;
const options: string | FileOptions | undefined =
optionsOrCallback instanceof Function ? undefined : optionsOrCallback;
@@ -23,37 +23,48 @@ export async function appendFile(
validateEncoding(options);
let rid = -1;
- try {
- if (typeof pathOrRid === "number") {
- rid = pathOrRid;
- } else {
- const mode: number | undefined = isFileOptions(options)
- ? options.mode
- : undefined;
- const flag: string | undefined = isFileOptions(options)
- ? options.flag
- : undefined;
-
- if (mode) {
- //TODO rework once https://github.com/denoland/deno/issues/4017 completes
- notImplemented("Deno does not yet support setting mode on create");
+ new Promise(async (resolve, reject) => {
+ try {
+ if (typeof pathOrRid === "number") {
+ rid = pathOrRid;
+ } else {
+ const mode: number | undefined = isFileOptions(options)
+ ? options.mode
+ : undefined;
+ const flag: string | undefined = isFileOptions(options)
+ ? options.flag
+ : undefined;
+
+ if (mode) {
+ //TODO rework once https://github.com/denoland/deno/issues/4017 completes
+ notImplemented("Deno does not yet support setting mode on create");
+ }
+ const file = await Deno.open(pathOrRid, getOpenOptions(flag));
+ rid = file.rid;
}
- const file = await Deno.open(pathOrRid, getOpenOptions(flag));
- rid = file.rid;
- }
-
- const buffer: Uint8Array = new TextEncoder().encode(data);
+ const buffer: Uint8Array = new TextEncoder().encode(data);
+
+ await Deno.write(rid, buffer);
+ resolve();
+ } catch (err) {
+ reject(err);
+ }
+ })
+ .then(() => {
+ closeRidIfNecessary(typeof pathOrRid === "string", rid);
+ callbackFn();
+ })
+ .catch(err => {
+ closeRidIfNecessary(typeof pathOrRid === "string", rid);
+ callbackFn(err);
+ });
+}
- await Deno.write(rid, buffer);
- callbackFn();
- } catch (err) {
- callbackFn(err);
- } finally {
- if (typeof pathOrRid === "string" && rid != -1) {
- //Only close if a path was supplied and a rid allocated
- Deno.close(rid);
- }
+function closeRidIfNecessary(isPathString: boolean, rid: number): void {
+ if (isPathString && rid != -1) {
+ //Only close if a path was supplied and a rid allocated
+ Deno.close(rid);
}
}
@@ -94,10 +105,7 @@ export function appendFileSync(
Deno.writeSync(rid, buffer);
} finally {
- if (typeof pathOrRid === "string" && rid != -1) {
- //Only close if a 'string' path was supplied and a rid allocated
- Deno.close(rid);
- }
+ closeRidIfNecessary(typeof pathOrRid === "string", rid);
}
}