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');

3535

const { Writable, Readable } = require('stream');

36363737

class FakeInput extends EventEmitter {

@@ -1132,3 +1132,58 @@ for (let i = 0; i < 12; i++) {

11321132

rl.line = `a${' '.repeat(1e6)}a`;

11331133

rl.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+

}