0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-10-29 08:58:01 -04:00

feat: deprecate Deno.{stdin,stdout,stderr}.rid (#22073)

For removal in Deno v2. There are two issues:
1. Any script being run causes the output of `warnOnDeprecatedApi()` to
be printed, even when none of the `rid` properties are called.
2. `.rid` of these classes is used in multiple tests. I'm not sure how
to account for that. I thought of having `STDIN_RID`, and friends,
constants, whose values can be shared between the tests and the classes
themselves. Should we go with that or do something else?

---------

Co-authored-by: Bartek Iwańczuk <biwanczuk@gmail.com>
This commit is contained in:
Asher Gomez 2024-01-25 06:09:49 +11:00 committed by GitHub
parent 547468e625
commit 300eeb343e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 77 additions and 27 deletions

View file

@ -2727,8 +2727,13 @@ declare namespace Deno {
* @category I/O * @category I/O
*/ */
export const stdin: Reader & ReaderSync & Closer & { export const stdin: Reader & ReaderSync & Closer & {
/** The resource ID assigned to `stdin`. This can be used with the discreet /**
* I/O functions in the `Deno` namespace. */ * The resource ID assigned to `stdin`. This can be used with the discreet
* I/O functions in the `Deno` namespace.
*
* @deprecated Use {@linkcode Deno.stdin} instance methods instead.
* {@linkcode Deno.stdin.rid} will be removed in Deno 2.0.
*/
readonly rid: number; readonly rid: number;
/** A readable stream interface to `stdin`. */ /** A readable stream interface to `stdin`. */
readonly readable: ReadableStream<Uint8Array>; readonly readable: ReadableStream<Uint8Array>;
@ -2769,8 +2774,13 @@ declare namespace Deno {
* @category I/O * @category I/O
*/ */
export const stdout: Writer & WriterSync & Closer & { export const stdout: Writer & WriterSync & Closer & {
/** The resource ID assigned to `stdout`. This can be used with the discreet /**
* I/O functions in the `Deno` namespace. */ * The resource ID assigned to `stdout`. This can be used with the discreet
* I/O functions in the `Deno` namespace.
*
* @deprecated Use {@linkcode Deno.stdout} instance methods instead.
* {@linkcode Deno.stdout.rid} will be removed in Deno 2.0.
*/
readonly rid: number; readonly rid: number;
/** A writable stream interface to `stdout`. */ /** A writable stream interface to `stdout`. */
readonly writable: WritableStream<Uint8Array>; readonly writable: WritableStream<Uint8Array>;
@ -2797,8 +2807,13 @@ declare namespace Deno {
* @category I/O * @category I/O
*/ */
export const stderr: Writer & WriterSync & Closer & { export const stderr: Writer & WriterSync & Closer & {
/** The resource ID assigned to `stderr`. This can be used with the discreet /**
* I/O functions in the `Deno` namespace. */ * The resource ID assigned to `stderr`. This can be used with the discreet
* I/O functions in the `Deno` namespace.
*
* @deprecated Use {@linkcode Deno.stderr} instance methods instead.
* {@linkcode Deno.stderr.rid} will be removed in Deno 2.0.
*/
readonly rid: number; readonly rid: number;
/** A writable stream interface to `stderr`. */ /** A writable stream interface to `stderr`. */
readonly writable: WritableStream<Uint8Array>; readonly writable: WritableStream<Uint8Array>;

View file

@ -3,6 +3,7 @@
// Interfaces 100% copied from Go. // Interfaces 100% copied from Go.
// Documentation liberally lifted from them too. // Documentation liberally lifted from them too.
// Thank you! We love Go! <3 // Thank you! We love Go! <3
import { core, internals, primordials } from "ext:core/mod.js"; import { core, internals, primordials } from "ext:core/mod.js";
const { const {
op_stdin_set_raw, op_stdin_set_raw,
@ -179,31 +180,41 @@ function concatBuffers(buffers) {
return contents; return contents;
} }
const STDIN_RID = 0;
const STDOUT_RID = 1;
const STDERR_RID = 2;
class Stdin { class Stdin {
#rid = STDIN_RID;
#readable; #readable;
constructor() { constructor() {
} }
get rid() { get rid() {
return 0; internals.warnOnDeprecatedApi(
"Deno.stdin.rid",
new Error().stack,
"Use `Deno.stdin` instance methods instead.",
);
return this.#rid;
} }
read(p) { read(p) {
return read(this.rid, p); return read(this.#rid, p);
} }
readSync(p) { readSync(p) {
return readSync(this.rid, p); return readSync(this.#rid, p);
} }
close() { close() {
core.tryClose(this.rid); core.tryClose(this.#rid);
} }
get readable() { get readable() {
if (this.#readable === undefined) { if (this.#readable === undefined) {
this.#readable = readableStreamForRid(this.rid); this.#readable = readableStreamForRid(this.#rid);
} }
return this.#readable; return this.#readable;
} }
@ -214,75 +225,87 @@ class Stdin {
} }
isTerminal() { isTerminal() {
return op_is_terminal(this.rid); return op_is_terminal(this.#rid);
} }
} }
class Stdout { class Stdout {
#rid = STDOUT_RID;
#writable; #writable;
constructor() { constructor() {
} }
get rid() { get rid() {
return 1; internals.warnOnDeprecatedApi(
"Deno.stdout.rid",
new Error().stack,
"Use `Deno.stdout` instance methods instead.",
);
return this.#rid;
} }
write(p) { write(p) {
return write(this.rid, p); return write(this.#rid, p);
} }
writeSync(p) { writeSync(p) {
return writeSync(this.rid, p); return writeSync(this.#rid, p);
} }
close() { close() {
core.close(this.rid); core.close(this.#rid);
} }
get writable() { get writable() {
if (this.#writable === undefined) { if (this.#writable === undefined) {
this.#writable = writableStreamForRid(this.rid); this.#writable = writableStreamForRid(this.#rid);
} }
return this.#writable; return this.#writable;
} }
isTerminal() { isTerminal() {
return op_is_terminal(this.rid); return op_is_terminal(this.#rid);
} }
} }
class Stderr { class Stderr {
#rid = STDERR_RID;
#writable; #writable;
constructor() { constructor() {
} }
get rid() { get rid() {
return 2; internals.warnOnDeprecatedApi(
"Deno.stderr.rid",
new Error().stack,
"Use `Deno.stderr` instance methods instead.",
);
return this.#rid;
} }
write(p) { write(p) {
return write(this.rid, p); return write(this.#rid, p);
} }
writeSync(p) { writeSync(p) {
return writeSync(this.rid, p); return writeSync(this.#rid, p);
} }
close() { close() {
core.close(this.rid); core.close(this.#rid);
} }
get writable() { get writable() {
if (this.#writable === undefined) { if (this.#writable === undefined) {
this.#writable = writableStreamForRid(this.rid); this.#writable = writableStreamForRid(this.#rid);
} }
return this.#writable; return this.#writable;
} }
isTerminal() { isTerminal() {
return op_is_terminal(this.rid); return op_is_terminal(this.#rid);
} }
} }
@ -299,9 +322,14 @@ export {
readAllSync, readAllSync,
readSync, readSync,
SeekMode, SeekMode,
Stderr,
stderr, stderr,
STDERR_RID,
stdin, stdin,
STDIN_RID,
Stdout,
stdout, stdout,
STDOUT_RID,
write, write,
writeSync, writeSync,
}; };

View file

@ -37,7 +37,14 @@ export function createWritableStdioStream(writer, name) {
} }
}, },
}); });
stream.fd = writer?.rid ?? -1; let fd = -1;
if (writer instanceof io.Stdout) {
fd = io.STDOUT_RID;
} else if (writer instanceof io.Stderr) {
fd = io.STDERR_RID;
}
stream.fd = fd;
stream.destroySoon = stream.destroy; stream.destroySoon = stream.destroy;
stream._isStdio = true; stream._isStdio = true;
stream.once("close", () => writer?.close()); stream.once("close", () => writer?.close());
@ -117,7 +124,7 @@ export function setReadStream(s) {
// https://github.com/nodejs/node/blob/v18.12.1/lib/internal/bootstrap/switches/is_main_thread.js#L189 // https://github.com/nodejs/node/blob/v18.12.1/lib/internal/bootstrap/switches/is_main_thread.js#L189
/** Create process.stdin */ /** Create process.stdin */
export const initStdin = () => { export const initStdin = () => {
const fd = io.stdin?.rid; const fd = io.stdin ? io.STDIN_RID : undefined;
let stdin; let stdin;
const stdinType = _guessStdinType(fd); const stdinType = _guessStdinType(fd);
@ -172,7 +179,7 @@ export const initStdin = () => {
} }
stdin.on("close", () => io.stdin?.close()); stdin.on("close", () => io.stdin?.close());
stdin.fd = io.stdin?.rid ?? -1; stdin.fd = io.stdin ? io.STDIN_RID : -1;
Object.defineProperty(stdin, "isTTY", { Object.defineProperty(stdin, "isTTY", {
enumerable: true, enumerable: true,
configurable: true, configurable: true,