Skip to content

Commit f691dca

Browse files
atlowChemijuanarbol
authored andcommitted
readline: use addAbortListener
PR-URL: #48550 Reviewed-By: Benjamin Gruenbaum <[email protected]> Reviewed-By: Matteo Collina <[email protected]>
1 parent e4333ac commit f691dca

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
@@ -28,6 +28,7 @@ const {
2828
StringPrototypeStartsWith,
2929
StringPrototypeTrim,
3030
Symbol,
31+
SymbolDispose,
3132
SymbolAsyncIterator,
3233
SafeStringIterator,
3334
} = primordials;
@@ -325,8 +326,8 @@ function InterfaceConstructor(input, output, completer, terminal) {
325326
if (signal.aborted) {
326327
process.nextTick(onAborted);
327328
} else {
328-
signal.addEventListener('abort', onAborted, { once: true });
329-
self.once('close', () => signal.removeEventListener('abort', onAborted));
329+
const disposable = EventEmitter.addAbortListener(signal, onAborted);
330+
self.once('close', disposable[SymbolDispose]);
330331
}
331332
}
332333

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 {
@@ -95,6 +96,7 @@ const {
9596
kWordRight,
9697
kWriteToOutput,
9798
} = require('internal/readline/interface');
99+
let addAbortListener;
98100

99101
function Interface(input, output, completer, terminal) {
100102
if (!(this instanceof Interface)) {
@@ -143,15 +145,13 @@ Interface.prototype.question = function question(query, options, cb) {
143145
const onAbort = () => {
144146
this[kQuestionCancel]();
145147
};
146-
options.signal.addEventListener('abort', onAbort, { once: true });
147-
const cleanup = () => {
148-
options.signal.removeEventListener('abort', onAbort);
149-
};
148+
addAbortListener ??= require('events').addAbortListener;
149+
const disposable = addAbortListener(options.signal, onAbort);
150150
const originalCb = cb;
151151
cb = typeof cb === 'function' ? (answer) => {
152-
cleanup();
152+
disposable[SymbolDispose]();
153153
return originalCb(answer);
154-
} : cleanup;
154+
} : disposable[SymbolDispose];
155155
}
156156

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

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 {
@@ -22,6 +23,7 @@ const { validateAbortSignal } = require('internal/validators');
2223
const {
2324
kEmptyObject,
2425
} = require('internal/util');
26+
let addAbortListener;
2527

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

0 commit comments

Comments
 (0)