2021-04-27 16:14:39 +02:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
const {
|
|
|
|
Promise,
|
|
|
|
} = primordials;
|
|
|
|
|
|
|
|
const {
|
|
|
|
Readline,
|
|
|
|
} = require('internal/readline/promises');
|
|
|
|
|
|
|
|
const {
|
|
|
|
Interface: _Interface,
|
|
|
|
kQuestionCancel,
|
|
|
|
} = require('internal/readline/interface');
|
|
|
|
|
|
|
|
const {
|
|
|
|
AbortError,
|
|
|
|
} = require('internal/errors');
|
2021-05-02 11:47:01 +02:00
|
|
|
const { validateAbortSignal } = require('internal/validators');
|
2021-04-27 16:14:39 +02:00
|
|
|
|
|
|
|
class Interface extends _Interface {
|
|
|
|
// eslint-disable-next-line no-useless-constructor
|
|
|
|
constructor(input, output, completer, terminal) {
|
|
|
|
super(input, output, completer, terminal);
|
|
|
|
}
|
|
|
|
question(query, options = {}) {
|
|
|
|
return new Promise((resolve, reject) => {
|
2021-05-02 11:47:01 +02:00
|
|
|
let cb = resolve;
|
|
|
|
|
|
|
|
if (options?.signal) {
|
|
|
|
validateAbortSignal(options.signal, 'options.signal');
|
2021-04-27 16:14:39 +02:00
|
|
|
if (options.signal.aborted) {
|
2021-11-28 12:43:49 -08:00
|
|
|
return reject(
|
|
|
|
new AbortError(undefined, { cause: options.signal.reason }));
|
2021-04-27 16:14:39 +02:00
|
|
|
}
|
|
|
|
|
2021-05-02 11:47:01 +02:00
|
|
|
const onAbort = () => {
|
2021-04-27 16:14:39 +02:00
|
|
|
this[kQuestionCancel]();
|
2021-11-28 12:43:49 -08:00
|
|
|
reject(new AbortError(undefined, { cause: options.signal.reason }));
|
2021-05-02 11:47:01 +02:00
|
|
|
};
|
|
|
|
options.signal.addEventListener('abort', onAbort, { once: true });
|
|
|
|
cb = (answer) => {
|
|
|
|
options.signal.removeEventListener('abort', onAbort);
|
|
|
|
resolve(answer);
|
|
|
|
};
|
2021-04-27 16:14:39 +02:00
|
|
|
}
|
|
|
|
|
2021-05-02 11:47:01 +02:00
|
|
|
super.question(query, cb);
|
2021-04-27 16:14:39 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function createInterface(input, output, completer, terminal) {
|
|
|
|
return new Interface(input, output, completer, terminal);
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
Interface,
|
|
|
|
Readline,
|
|
|
|
createInterface,
|
|
|
|
};
|