| 'use strict'; |
| |
| const { |
| Promise, |
| } = primordials; |
| |
| const { |
| Readline, |
| } = require('internal/readline/promises'); |
| |
| const { |
| Interface: _Interface, |
| kQuestion, |
| kQuestionCancel, |
| } = require('internal/readline/interface'); |
| |
| const { |
| AbortError, |
| } = require('internal/errors'); |
| const { validateAbortSignal } = require('internal/validators'); |
| |
| const { |
| kEmptyObject, |
| } = require('internal/util'); |
| |
| class Interface extends _Interface { |
| // eslint-disable-next-line no-useless-constructor |
| constructor(input, output, completer, terminal) { |
| super(input, output, completer, terminal); |
| } |
| question(query, options = kEmptyObject) { |
| return new Promise((resolve, reject) => { |
| let cb = resolve; |
| |
| if (options?.signal) { |
| validateAbortSignal(options.signal, 'options.signal'); |
| if (options.signal.aborted) { |
| return reject( |
| new AbortError(undefined, { cause: options.signal.reason })); |
| } |
| |
| const onAbort = () => { |
| this[kQuestionCancel](); |
| reject(new AbortError(undefined, { cause: options.signal.reason })); |
| }; |
| options.signal.addEventListener('abort', onAbort, { once: true }); |
| cb = (answer) => { |
| options.signal.removeEventListener('abort', onAbort); |
| resolve(answer); |
| }; |
| } |
| |
| this[kQuestion](query, cb); |
| }); |
| } |
| } |
| |
| function createInterface(input, output, completer, terminal) { |
| return new Interface(input, output, completer, terminal); |
| } |
| |
| module.exports = { |
| Interface, |
| Readline, |
| createInterface, |
| }; |