DEV Community

Yuki Shindo
Yuki Shindo

Posted on

How to read keystrokes from stdin at Deno

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); 
Enter fullscreen mode Exit fullscreen mode

If you want to use Deno.setRaw, you need to run it with the --unstable option.

deno run --unstable sample.ts 
Enter fullscreen mode Exit fullscreen mode

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 of output.
  • I haven't been able to track when the nread variable returns null, but since there is a possibility that it will return null, I've included the processing for that.
  • There is no particular reason for the bufferSize to be 16.

Top comments (0)