Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"Keypress" not working when we await answer to a "question" placed in a promise #42800

Open
0xARROWK opened this issue Apr 20, 2022 · 1 comment

Comments

@0xARROWK
Copy link

0xARROWK commented Apr 20, 2022

Version

v16.13.0

Platform

Ubuntu 18.04

Subsystem

No response

What steps will reproduce the bug?

Hello, I have to use keypress after asking a question to a user. For those 2 actions I use readline as follow :

import readline from "readline";

const menu = readline.createInterface({input: process.stdin, output: process.stdout});
let answer = 0;

const myFunc = async () => {
    return new Promise((resolve, reject) => {
        menu.question('Choose an exchange to use : ', function (answer) {
            if (isNaN(answer) || parseInt(answer) < 1 || parseInt(answer) > 10) answer = undefined;
            menu.close();
            resolve(answer);
        });
    });
}

answer = await myFunc();

readline.emitKeypressEvents(process.stdin)
process.stdin.setRawMode(true);
process.stdin.on('keypress', async (character, key) => {
    if (key.name === 'c' && key.ctrl) {
        process.exit()
    }

    if (key.name === '1' || key.name === '2' || key.name === '3' || key.name === '4') {
        console.log(key.name)
    }
});

But I have notice that keypress event is definitely not working when I ask a question before. If I just remove the question part, it works as expected.

How often does it reproduce? Is there a required condition?

It always happens when the condition of asking a question before is respected. I have noticed that when I remove "await" before the function call, it works as expected

What is the expected behavior?

The expected behaviour is : program print "1", "2", "3", "4", when I hit one of these keys, or exit when I hit ctrl+c

What do you see instead?

Instead I see nothing and program doesn't exit.

Additional information

No response

@0xARROWK 0xARROWK changed the title Keypress not working after using createInterface "Keypress" not working after using "question" Apr 20, 2022
@0xARROWK 0xARROWK changed the title "Keypress" not working after using "question" "Keypress" not working when we await answer to a "question" placed in a promise Apr 20, 2022
@aduh95
Copy link
Contributor

aduh95 commented Apr 20, 2022

The await myFunc is blocking the rest of the code to be executed, which results on the 'keypress' event listener to be added only after the 'question' event has been emitted. If you move the answer = await myFunc() after the process.stdin.on('keypress', …) call, it should work as expected.

FWIW, you can use node:readline/promises module on Node.js 17+:

import { createInterface } from 'node:readline/promises';
import { emitKeypressEvents } from 'node:readline';

const menu = createInterface({
  input: process.stdin,
  output: process.stdout,
});
let answer = 0;

emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);
process.stdin.on('keypress', async (character, key) => {
  switch (key.name) {
    case '1':
    case '2':
    case '3':
    case '4':
      console.log(key.name);
      break;

    case 'c':
      if (key.ctrl) process.exit();
    default:
  }
});

answer = await menu.question('Choose an exchange to use : ');

if (isNaN(answer) || parseInt(answer) < 1 || parseInt(answer) > 10)
  answer = undefined;
menu.close();

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants