diff --git a/lib/readline.js b/lib/readline.js index 759b9ca2469201..11514614c33ab9 100644 --- a/lib/readline.js +++ b/lib/readline.js @@ -157,7 +157,8 @@ Interface.prototype.question[promisify.custom] = function(query, options) { options = typeof options === 'object' && options !== null ? options : {}; if (options.signal && options.signal.aborted) { - return PromiseReject(new AbortError()); + return PromiseReject( + new AbortError(undefined, { cause: options.signal.reason })); } return new Promise((resolve, reject) => { @@ -165,7 +166,7 @@ Interface.prototype.question[promisify.custom] = function(query, options) { if (options.signal) { const onAbort = () => { - reject(new AbortError()); + reject(new AbortError(undefined, { cause: options.signal.reason })); }; options.signal.addEventListener('abort', onAbort, { once: true }); cb = (answer) => { diff --git a/lib/readline/promises.js b/lib/readline/promises.js index 649f92f181758c..534558ec31ffdc 100644 --- a/lib/readline/promises.js +++ b/lib/readline/promises.js @@ -30,12 +30,13 @@ class Interface extends _Interface { if (options?.signal) { validateAbortSignal(options.signal, 'options.signal'); if (options.signal.aborted) { - return reject(new AbortError()); + return reject( + new AbortError(undefined, { cause: options.signal.reason })); } const onAbort = () => { this[kQuestionCancel](); - reject(new AbortError()); + reject(new AbortError(undefined, { cause: options.signal.reason })); }; options.signal.addEventListener('abort', onAbort, { once: true }); cb = (answer) => { diff --git a/test/parallel/test-readline-promises-interface.js b/test/parallel/test-readline-promises-interface.js index e137886fa19690..e4bf483c3dc851 100644 --- a/test/parallel/test-readline-promises-interface.js +++ b/test/parallel/test-readline-promises-interface.js @@ -910,6 +910,15 @@ for (let i = 0; i < 12; i++) { rli.close(); } + (async () => { + const [rli] = getInterface({ terminal }); + const signal = AbortSignal.abort('boom'); + await assert.rejects(rli.question('hello', { signal }), { + cause: 'boom', + }); + rli.close(); + })().then(common.mustCall()); + // Throw an error when question is executed with an aborted signal { const ac = new AbortController();