Skip to content

Commit cb51ef2

Browse files
atlowChemiruyadorno
authored andcommitted
readline: use addAbortListener
PR-URL: #48550 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
1 parent be88f7c commit cb51ef2

File tree

3 files changed

+18
-12
lines changed

3 files changed

+18
-12
lines changed

lib/internal/readline/interface.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const {
2929
StringPrototypeStartsWith,
3030
StringPrototypeTrim,
3131
Symbol,
32+
SymbolDispose,
3233
SymbolAsyncIterator,
3334
SafeStringIterator,
3435
} = primordials;
@@ -332,8 +333,8 @@ function InterfaceConstructor(input, output, completer, terminal) {
332333
if (signal.aborted) {
333334
process.nextTick(onAborted);
334335
} else {
335-
signal.addEventListener('abort', onAborted, { once: true });
336-
self.once('close', () => signal.removeEventListener('abort', onAborted));
336+
const disposable = EventEmitter.addAbortListener(signal, onAborted);
337+
self.once('close', disposable[SymbolDispose]);
337338
}
338339
}
339340

lib/readline.js

+9-8
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const {
3030
Promise,
3131
PromiseReject,
3232
StringPrototypeSlice,
33+
SymbolDispose,
3334
} = primordials;
3435

3536
const {
@@ -94,6 +95,7 @@ const {
9495
kWordRight,
9596
kWriteToOutput,
9697
} = require('internal/readline/interface');
98+
let addAbortListener;
9799

98100
function Interface(input, output, completer, terminal) {
99101
if (!(this instanceof Interface)) {
@@ -144,15 +146,13 @@ Interface.prototype.question = function(query, options, cb) {
144146
const onAbort = () => {
145147
this[kQuestionCancel]();
146148
};
147-
options.signal.addEventListener('abort', onAbort, { once: true });
148-
const cleanup = () => {
149-
options.signal.removeEventListener('abort', onAbort);
150-
};
149+
addAbortListener ??= require('events').addAbortListener;
150+
const disposable = addAbortListener(options.signal, onAbort);
151151
const originalCb = cb;
152152
cb = typeof cb === 'function' ? (answer) => {
153-
cleanup();
153+
disposable[SymbolDispose]();
154154
return originalCb(answer);
155-
} : cleanup;
155+
} : disposable[SymbolDispose];
156156
}
157157

158158
if (typeof cb === 'function') {
@@ -176,9 +176,10 @@ Interface.prototype.question[promisify.custom] = function question(query, option
176176
const onAbort = () => {
177177
reject(new AbortError(undefined, { cause: options.signal.reason }));
178178
};
179-
options.signal.addEventListener('abort', onAbort, { once: true });
179+
addAbortListener ??= require('events').addAbortListener;
180+
const disposable = addAbortListener(options.signal, onAbort);
180181
cb = (answer) => {
181-
options.signal.removeEventListener('abort', onAbort);
182+
disposable[SymbolDispose]();
182183
resolve(answer);
183184
};
184185
}

lib/readline/promises.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
const {
44
Promise,
5+
SymbolDispose,
56
} = primordials;
67

78
const {
@@ -21,6 +22,7 @@ const { validateAbortSignal } = require('internal/validators');
2122
const {
2223
kEmptyObject,
2324
} = require('internal/util');
25+
let addAbortListener;
2426

2527
class Interface extends _Interface {
2628
// eslint-disable-next-line no-useless-constructor
@@ -42,9 +44,11 @@ class Interface extends _Interface {
4244
this[kQuestionCancel]();
4345
reject(new AbortError(undefined, { cause: options.signal.reason }));
4446
};
45-
options.signal.addEventListener('abort', onAbort, { once: true });
47+
addAbortListener ??= require('events').addAbortListener;
48+
const disposable = addAbortListener(options.signal, onAbort);
49+
4650
cb = (answer) => {
47-
options.signal.removeEventListener('abort', onAbort);
51+
disposable[SymbolDispose]();
4852
resolve(answer);
4953
};
5054
}

0 commit comments

Comments
 (0)