readline: clean up event listener in onNewListener

Once the Readline interface is closed, the 'data' event listener should
be removed.

PR-URL: https://github.com/nodejs/node/pull/13266
Ref: https://github.com/nodejs/node/pull/9447#discussion_r86599214
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Gibson Fahnestock 2017-05-28 13:35:33 +01:00 committed by James M Snell
parent b7d143842c
commit 7d53abad8b
2 changed files with 7 additions and 2 deletions

View File

@ -1039,6 +1039,9 @@ function emitKeypressEvents(stream, iface) {
} else {
stream.on('newListener', onNewListener);
}
if (iface) {
iface.once('close', () => { stream.removeListener('data', onData); });
}
}
/**

View File

@ -74,6 +74,8 @@ assert(!rawModeCalled);
assert(resumeCalled);
assert(!pauseCalled);
// One data listener for the keypress events.
assert.strictEqual(stream.listeners('data').length, 1);
// close() should call setRawMode(false)
expectedRawMode = false;
@ -86,5 +88,5 @@ assert(!resumeCalled);
assert(pauseCalled);
assert.deepStrictEqual(stream.listeners('keypress'), []);
// one data listener for the keypress events.
assert.strictEqual(stream.listeners('data').length, 1);
// Data listener is removed once interface is closed.
assert.strictEqual(stream.listeners('data').length, 0);