summaryrefslogtreecommitdiff
path: root/ext/node
diff options
context:
space:
mode:
authorNathan Whitaker <17734409+nathanwhit@users.noreply.github.com>2024-10-18 10:11:06 -0700
committerGitHub <noreply@github.com>2024-10-18 10:11:06 -0700
commit1bccf45ecb8b5ce2aa685d650c6654bf6c25e605 (patch)
treeddf3cf459f2185da65cd4f46aeb524b7b7b5d574 /ext/node
parent85a99eb405ef3ec5f8e478d93b2c866afbc53f95 (diff)
fix(ext/node): properly map reparse point error in readlink (#26375)
Diffstat (limited to 'ext/node')
-rw-r--r--ext/node/ops/winerror.rs1
-rw-r--r--ext/node/polyfills/_fs/_fs_readlink.ts33
2 files changed, 22 insertions, 12 deletions
diff --git a/ext/node/ops/winerror.rs b/ext/node/ops/winerror.rs
index c0d66f7d0..e9dbadb6f 100644
--- a/ext/node/ops/winerror.rs
+++ b/ext/node/ops/winerror.rs
@@ -66,6 +66,7 @@ pub fn op_node_sys_to_uv_error(err: i32) -> String {
ERROR_INVALID_PARAMETER => "EINVAL",
WSAEINVAL => "EINVAL",
WSAEPFNOSUPPORT => "EINVAL",
+ ERROR_NOT_A_REPARSE_POINT => "EINVAL",
ERROR_BEGINNING_OF_MEDIA => "EIO",
ERROR_BUS_RESET => "EIO",
ERROR_CRC => "EIO",
diff --git a/ext/node/polyfills/_fs/_fs_readlink.ts b/ext/node/polyfills/_fs/_fs_readlink.ts
index 5f2312798..08bea843f 100644
--- a/ext/node/polyfills/_fs/_fs_readlink.ts
+++ b/ext/node/polyfills/_fs/_fs_readlink.ts
@@ -4,13 +4,10 @@
// deno-lint-ignore-file prefer-primordials
import { TextEncoder } from "ext:deno_web/08_text_encoding.js";
-import {
- intoCallbackAPIWithIntercept,
- MaybeEmpty,
- notImplemented,
-} from "ext:deno_node/_utils.ts";
+import { MaybeEmpty, notImplemented } from "ext:deno_node/_utils.ts";
import { pathFromURL } from "ext:deno_web/00_infra.js";
import { promisify } from "ext:deno_node/internal/util.mjs";
+import { denoErrorToNodeError } from "ext:deno_node/internal/errors.ts";
type ReadlinkCallback = (
err: MaybeEmpty<Error>,
@@ -69,12 +66,17 @@ export function readlink(
const encoding = getEncoding(optOrCallback);
- intoCallbackAPIWithIntercept<string, Uint8Array | string>(
- Deno.readLink,
- (data: string): string | Uint8Array => maybeEncode(data, encoding),
- cb,
- path,
- );
+ Deno.readLink(path).then((data: string) => {
+ const res = maybeEncode(data, encoding);
+ if (cb) cb(null, res);
+ }, (err: Error) => {
+ if (cb) {
+ (cb as (e: Error) => void)(denoErrorToNodeError(err, {
+ syscall: "readlink",
+ path,
+ }));
+ }
+ });
}
export const readlinkPromise = promisify(readlink) as (
@@ -88,5 +90,12 @@ export function readlinkSync(
): string | Uint8Array {
path = path instanceof URL ? pathFromURL(path) : path;
- return maybeEncode(Deno.readLinkSync(path), getEncoding(opt));
+ try {
+ return maybeEncode(Deno.readLinkSync(path), getEncoding(opt));
+ } catch (error) {
+ throw denoErrorToNodeError(error, {
+ syscall: "readlink",
+ path,
+ });
+ }
}