fix(fs): instanceof check for Deno.FsFile (#22121)

Regression caused by https://github.com/denoland/deno/pull/22072.

I added a relevant test so we don't regress again.

Fixes https://github.com/denoland/deno/issues/22115
This commit is contained in:
Bartek Iwańczuk 2024-01-25 23:51:29 +01:00 committed by GitHub
parent 7038074c85
commit 0b0fb94ce2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 49 additions and 31 deletions

View file

@ -19,6 +19,8 @@ Deno.test(function filesStdioFileDescriptors() {
Deno.test({ permissions: { read: true } }, async function filesCopyToStdout() {
const filename = "cli/tests/testdata/assets/fixture.json";
using file = await Deno.open(filename);
assert(file instanceof Deno.File);
assert(file instanceof Deno.FsFile);
assert(file.rid > 2);
const bytesWritten = await copy(file, Deno.stdout);
const fileSize = Deno.statSync(filename).size;

View file

@ -88,6 +88,7 @@ const {
StringPrototypeStartsWith,
SymbolAsyncIterator,
SymbolIterator,
SymbolFor,
Uint32Array,
} = primordials;
@ -619,7 +620,7 @@ function openSync(
options,
);
return new FsFile(rid);
return new FsFile(rid, SymbolFor("Deno.internal.FsFile"));
}
async function open(
@ -632,7 +633,7 @@ async function open(
options,
);
return new FsFile(rid);
return new FsFile(rid, SymbolFor("Deno.internal.FsFile"));
}
function createSync(path) {
@ -659,8 +660,15 @@ class FsFile {
#readable;
#writable;
constructor(rid) {
constructor(rid, symbol) {
this.#rid = rid;
if (!symbol || symbol !== SymbolFor("Deno.internal.FsFile")) {
internals.warnOnDeprecatedApi(
"new Deno.FsFile()",
new Error().stack,
"Use `Deno.open` or `Deno.openSync` instead.",
);
}
}
get rid() {

View file

@ -10,9 +10,12 @@ export function fdatasync(
fd: number,
callback: CallbackWithError,
) {
new FsFile(fd).syncData().then(() => callback(null), callback);
new FsFile(fd, Symbol.for("Deno.internal.FsFile")).syncData().then(
() => callback(null),
callback,
);
}
export function fdatasyncSync(fd: number) {
new FsFile(fd).syncDataSync();
new FsFile(fd, Symbol.for("Deno.internal.FsFile")).syncDataSync();
}

View file

@ -41,7 +41,7 @@ export function fstat(
if (!callback) throw new Error("No callback function supplied");
new FsFile(fd).stat().then(
new FsFile(fd, Symbol.for("Deno.internal.FsFile")).stat().then(
(stat) => callback(null, CFISBIS(stat, options.bigint)),
(err) => callback(err),
);
@ -60,6 +60,6 @@ export function fstatSync(
fd: number,
options?: statOptions,
): Stats | BigIntStats {
const origin = new FsFile(fd).statSync();
const origin = new FsFile(fd, Symbol.for("Deno.internal.FsFile")).statSync();
return CFISBIS(origin, options?.bigint || false);
}

View file

@ -10,9 +10,12 @@ export function fsync(
fd: number,
callback: CallbackWithError,
) {
new FsFile(fd).sync().then(() => callback(null), callback);
new FsFile(fd, Symbol.for("Deno.internal.FsFile")).sync().then(
() => callback(null),
callback,
);
}
export function fsyncSync(fd: number) {
new FsFile(fd).syncSync();
new FsFile(fd, Symbol.for("Deno.internal.FsFile")).syncSync();
}

View file

@ -20,9 +20,12 @@ export function ftruncate(
if (!callback) throw new Error("No callback function supplied");
new FsFile(fd).truncate(len).then(() => callback(null), callback);
new FsFile(fd, Symbol.for("Deno.internal.FsFile")).truncate(len).then(
() => callback(null),
callback,
);
}
export function ftruncateSync(fd: number, len?: number) {
new FsFile(fd).truncateSync(len);
new FsFile(fd, Symbol.for("Deno.internal.FsFile")).truncateSync(len);
}

View file

@ -40,7 +40,10 @@ export function futimes(
mtime = getValidTime(mtime, "mtime");
// TODO(@littledivy): Treat `fd` as real file descriptor.
new FsFile(fd).utime(atime, mtime).then(() => callback(null), callback);
new FsFile(fd, Symbol.for("Deno.internal.FsFile")).utime(atime, mtime).then(
() => callback(null),
callback,
);
}
export function futimesSync(
@ -52,5 +55,5 @@ export function futimesSync(
mtime = getValidTime(mtime, "mtime");
// TODO(@littledivy): Treat `fd` as real file descriptor.
new FsFile(fd).utimeSync(atime, mtime);
new FsFile(fd, Symbol.for("Deno.internal.FsFile")).utimeSync(atime, mtime);
}

View file

@ -73,7 +73,7 @@ export function readFile(
let p: Promise<Uint8Array>;
if (path instanceof FileHandle) {
const fsFile = new FsFile(path.fd);
const fsFile = new FsFile(path.fd, Symbol.for("Deno.internal.FsFile"));
p = readAll(fsFile);
} else {
p = Deno.readFile(path);

View file

@ -74,7 +74,7 @@ export function writeFile(
(async () => {
try {
file = isRid
? new FsFile(pathOrRid as number)
? new FsFile(pathOrRid as number, Symbol.for("Deno.internal.FsFile"))
: await Deno.open(pathOrRid as string, openOptions);
// ignore mode because it's not supported on windows
@ -139,7 +139,7 @@ export function writeFileSync(
let error: Error | null = null;
try {
file = isRid
? new FsFile(pathOrRid as number)
? new FsFile(pathOrRid as number, Symbol.for("Deno.internal.FsFile"))
: Deno.openSync(pathOrRid as string, openOptions);
// ignore mode because it's not supported on windows

View file

@ -21,6 +21,7 @@ const {
PromisePrototypeThen,
SafePromiseAll,
Symbol,
SymbolFor,
} = primordials;
import { FsFile } from "ext:deno_fs/30_fs.js";
@ -76,15 +77,21 @@ class Process {
this.pid = res.pid;
if (res.stdinRid && res.stdinRid > 0) {
this.stdin = new FsFile(res.stdinRid);
this.stdin = new FsFile(res.stdinRid, SymbolFor("Deno.internal.FsFile"));
}
if (res.stdoutRid && res.stdoutRid > 0) {
this.stdout = new FsFile(res.stdoutRid);
this.stdout = new FsFile(
res.stdoutRid,
SymbolFor("Deno.internal.FsFile"),
);
}
if (res.stderrRid && res.stderrRid > 0) {
this.stderr = new FsFile(res.stderrRid);
this.stderr = new FsFile(
res.stderrRid,
SymbolFor("Deno.internal.FsFile"),
);
}
}

View file

@ -31,17 +31,6 @@ import * as kv from "ext:deno_kv/01_db.ts";
import * as cron from "ext:deno_cron/01_cron.ts";
import * as webgpuSurface from "ext:deno_webgpu/02_surface.js";
class FsFile extends fs.FsFile {
constructor(rid) {
super(rid);
internals.warnOnDeprecatedApi(
"Deno.Fs",
new Error().stack,
"Use `Deno.open()` or `Deno.openSync()` instead.",
);
}
}
const denoNs = {
metrics: () => {
internals.warnOnDeprecatedApi("Deno.metrics()", new Error().stack);
@ -171,7 +160,7 @@ const denoNs = {
return io.writeSync(rid, data);
},
File: fs.File,
FsFile,
FsFile: fs.FsFile,
open: fs.open,
openSync: fs.openSync,
create: fs.create,