From 62c34bc21e8864ec5701ad493c73224367627580 Mon Sep 17 00:00:00 2001 From: Marcos Casagrande Date: Wed, 20 May 2020 01:01:06 +0200 Subject: fix(std/node) improve fs.close compatibility (#5649) --- std/node/_fs/_fs_close.ts | 14 ++++---------- std/node/_fs/_fs_close_test.ts | 43 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 12 deletions(-) (limited to 'std/node/_fs') diff --git a/std/node/_fs/_fs_close.ts b/std/node/_fs/_fs_close.ts index 469bdc77b..cdd815ad9 100644 --- a/std/node/_fs/_fs_close.ts +++ b/std/node/_fs/_fs_close.ts @@ -3,20 +3,14 @@ import { CallbackWithError } from "./_fs_common.ts"; export function close(fd: number, callback: CallbackWithError): void { - new Promise((resolve, reject) => { + queueMicrotask(() => { try { Deno.close(fd); - resolve(); + callback(null); } catch (err) { - reject(err); - } - }) - .then(() => { - callback(); - }) - .catch((err) => { callback(err); - }); + } + }); } export function closeSync(fd: number): void { diff --git a/std/node/_fs/_fs_close_test.ts b/std/node/_fs/_fs_close_test.ts index 8bcd662c9..1ea324cb4 100644 --- a/std/node/_fs/_fs_close_test.ts +++ b/std/node/_fs/_fs_close_test.ts @@ -1,6 +1,6 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. const { test } = Deno; -import { fail, assert } from "../../testing/asserts.ts"; +import { fail, assert, assertThrows } from "../../testing/asserts.ts"; import { close, closeSync } from "./_fs_close.ts"; test({ @@ -12,7 +12,7 @@ test({ assert(Deno.resources()[file.rid]); await new Promise((resolve, reject) => { close(file.rid, (err) => { - if (err) reject(); + if (err !== null) reject(); else resolve(); }); }) @@ -28,6 +28,38 @@ test({ }, }); +test({ + name: "ASYNC: Invalid fd", + async fn() { + await new Promise((resolve, reject) => { + close(-1, (err) => { + if (err !== null) return resolve(); + reject(); + }); + }); + }, +}); + +test({ + name: "close callback should be asynchronous", + async fn() { + const tempFile: string = Deno.makeTempFileSync(); + const file: Deno.File = Deno.openSync(tempFile); + + let foo: string; + const promise = new Promise((resolve) => { + close(file.rid, () => { + assert(foo === "bar"); + resolve(); + }); + foo = "bar"; + }); + + await promise; + Deno.removeSync(tempFile); + }, +}); + test({ name: "SYNC: File is closed", fn() { @@ -40,3 +72,10 @@ test({ Deno.removeSync(tempFile); }, }); + +test({ + name: "SYNC: Invalid fd", + fn() { + assertThrows(() => closeSync(-1)); + }, +}); -- cgit v1.2.3