node/lib/readline/promises.js
Antoine du Hamel 7c58645aca
lib: move Symbol[Async]Dispose polyfills to internal/util
PR-URL: https://github.com/nodejs/node/pull/54853
Reviewed-By: Moshe Atlow <moshe@atlow.co.il>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
2024-09-10 21:24:56 +00:00

71 lines
1.6 KiB
JavaScript

'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,
SymbolDispose,
} = require('internal/util');
let addAbortListener;
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 }));
};
addAbortListener ??= require('internal/events/abort_listener').addAbortListener;
const disposable = addAbortListener(options.signal, onAbort);
cb = (answer) => {
disposable[SymbolDispose]();
resolve(answer);
};
}
this[kQuestion](query, cb);
});
}
}
function createInterface(input, output, completer, terminal) {
return new Interface(input, output, completer, terminal);
}
module.exports = {
Interface,
Readline,
createInterface,
};