When using Deno, there was a case where I wanted to process input one character at a time.
I don't fully understand the code yet, so the code itself could be improved, but this is how it worked.
Deno.setRaw(0, true);
const bufferSize = 16;
const buf = new Uint8Array(bufferSize);
let output = "";
while (true) {
const nread = await Deno.stdin.read(buf);
if (nread === null) {
console.log("nread is null");
console.log("Exit");
break;
}
// If you press Ctrl + C, the process will exit.
if (buf && buf[0] === 0x03) {
console.log("Ctrl+C");
console.log("Exit");
break;
}
// If the Enter key is pressed,
// the text of the output will be displayed and the process will be terminated.
if (buf && buf[0] === 13) {
console.log("Ouput: ", output);
break;
}
const text = new TextDecoder().decode(buf.subarray(0, nread));
output = output + text;
console.log(output);
}
Deno.setRaw(0, false);
If you want to use Deno.setRaw
, you need to run it with the --unstable
option.
deno run --unstable sample.ts
Here are some additional explanations for the code above.
- One by one, the entered characters will be added to the variable of
output
. - Press
Ctrl + C
to finish the process. - Pressing the
Enter
key will do the same, but the process will end after outputting the string from the variable ofoutput
. - I haven't been able to track when the
nread
variable returnsnull
, but since there is a possibility that it will returnnull
, I've included the processing for that. - There is no particular reason for the
bufferSize
to be16
.
Top comments (0)