readline: add AbortSignal support to interface · nodejs/node@a1123f0
@@ -31,7 +31,7 @@ const {
3131 getStringWidth,
3232 stripVTControlCharacters
3333} = require('internal/util/inspect');
34-const EventEmitter = require('events').EventEmitter;
34+const { EventEmitter, getEventListeners } = require('events');
3535const { Writable, Readable } = require('stream');
36363737class FakeInput extends EventEmitter {
@@ -1132,3 +1132,58 @@ for (let i = 0; i < 12; i++) {
11321132rl.line = `a${' '.repeat(1e6)}a`;
11331133rl.cursor = rl.line.length;
11341134}
1135+1136+{
1137+const fi = new FakeInput();
1138+const signal = AbortSignal.abort();
1139+1140+const rl = readline.createInterface({
1141+input: fi,
1142+output: fi,
1143+ signal,
1144+});
1145+rl.on('close', common.mustCall());
1146+assert.strictEqual(getEventListeners(signal, 'abort').length, 0);
1147+}
1148+1149+{
1150+const fi = new FakeInput();
1151+const ac = new AbortController();
1152+const { signal } = ac;
1153+const rl = readline.createInterface({
1154+input: fi,
1155+output: fi,
1156+ signal,
1157+});
1158+assert.strictEqual(getEventListeners(signal, 'abort').length, 1);
1159+rl.on('close', common.mustCall());
1160+ac.abort();
1161+assert.strictEqual(getEventListeners(signal, 'abort').length, 0);
1162+}
1163+1164+{
1165+const fi = new FakeInput();
1166+const ac = new AbortController();
1167+const { signal } = ac;
1168+const rl = readline.createInterface({
1169+input: fi,
1170+output: fi,
1171+ signal,
1172+});
1173+assert.strictEqual(getEventListeners(signal, 'abort').length, 1);
1174+rl.close();
1175+assert.strictEqual(getEventListeners(signal, 'abort').length, 0);
1176+}
1177+1178+{
1179+// Constructor throws if signal is not an abort signal
1180+assert.throws(() => {
1181+readline.createInterface({
1182+input: new FakeInput(),
1183+signal: {},
1184+});
1185+}, {
1186+name: 'TypeError',
1187+code: 'ERR_INVALID_ARG_TYPE'
1188+});
1189+}