diff --git a/src/util.js b/src/util.js index df6a29a..dab047f 100644 --- a/src/util.js +++ b/src/util.js @@ -92,19 +92,22 @@ export const stealth = async context => { // alternative inquirer is big (node_modules 29MB, enquirer 9.7MB, prompts 9.8MB, none 9.4MB) and slower // open issue: prevents handleSIGINT() to work if prompt is cancelled with Ctrl-C instead of Escape: https://github.com/enquirer/enquirer/issues/372 import Enquirer from 'enquirer'; const enquirer = new Enquirer(); -const timeoutPlugin = defaultTimeout => enquirer => { // cancel prompt after timeout ms; can be disabled per prompt via options.timeout = 0 - const onPrompt = prompt => { - const effectiveTimeout = prompt.options?.timeout ?? defaultTimeout; - if (!effectiveTimeout) return; - const t = setTimeout(() => { - prompt.hint = () => 'timeout'; - prompt.cancel(); - }, effectiveTimeout); - const clear = () => clearTimeout(t); - prompt.on('submit', clear); - prompt.on('cancel', clear); - }; - enquirer.on('prompt', onPrompt); +const timeoutHint = () => 'timeout'; +const cancelPromptWithHint = prompt => { + prompt.hint = timeoutHint; + prompt.cancel(); +}; +const applyPromptTimeout = (prompt, timeout) => { + if (!timeout) return; + const timer = setTimeout(cancelPromptWithHint, timeout, prompt); + const clearTimer = () => clearTimeout(timer); + prompt.on('submit', clearTimer); + prompt.on('cancel', clearTimer); +}; +// cancel prompt after timeout ms; can be disabled per prompt via options.timeout = 0 +const timeoutPlugin = defaultTimeout => enquirerInstance => { + const onPrompt = prompt => applyPromptTimeout(prompt, prompt.options?.timeout ?? defaultTimeout); + enquirerInstance.on('prompt', onPrompt); }; enquirer.use(timeoutPlugin(cfg.login_timeout)); // single prompt that just returns the non-empty value instead of an object