From 6d273763f714d3e744e9a6ac125ec3532c6f6876 Mon Sep 17 00:00:00 2001 From: Gibson Fahnestock Date: Sun, 28 May 2017 13:35:33 +0100 Subject: [PATCH 1/3] readline: clean up event listener in onNewListener Once the Readline interface is closed, the 'data' event listener should be removed. Refs: https://github.com/nodejs/node/pull/9447#discussion_r86599214 --- lib/readline.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/readline.js b/lib/readline.js index 60864f40afdbc1..1c37ba817a7a8f 100644 --- a/lib/readline.js +++ b/lib/readline.js @@ -1030,6 +1030,7 @@ function emitKeypressEvents(stream, iface) { function onNewListener(event) { if (event === 'keypress') { stream.on('data', onData); + iface.once('close', () => { stream.removeListener('data', onData); }); stream.removeListener('newListener', onNewListener); } } From eb7ea78078438e7c5719e2146f63e0954fdf3c60 Mon Sep 17 00:00:00 2001 From: Gibson Fahnestock Date: Sun, 28 May 2017 14:03:03 +0100 Subject: [PATCH 2/3] squash! add handler for event listener --- lib/readline.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/readline.js b/lib/readline.js index 1c37ba817a7a8f..6a1ed150d72cd2 100644 --- a/lib/readline.js +++ b/lib/readline.js @@ -1030,7 +1030,6 @@ function emitKeypressEvents(stream, iface) { function onNewListener(event) { if (event === 'keypress') { stream.on('data', onData); - iface.once('close', () => { stream.removeListener('data', onData); }); stream.removeListener('newListener', onNewListener); } } @@ -1040,6 +1039,9 @@ function emitKeypressEvents(stream, iface) { } else { stream.on('newListener', onNewListener); } + if (iface) { + iface.once('close', () => { stream.removeListener('data', onData); }); + } } /** From ff47f20b13649523a18db3c1569b27baea63ec2b Mon Sep 17 00:00:00 2001 From: Gibson Fahnestock Date: Sun, 28 May 2017 14:31:41 +0100 Subject: [PATCH 3/3] squash! modify test to handle change --- test/parallel/test-readline-set-raw-mode.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/parallel/test-readline-set-raw-mode.js b/test/parallel/test-readline-set-raw-mode.js index db42a5a9495a9e..ddffd131d0baff 100644 --- a/test/parallel/test-readline-set-raw-mode.js +++ b/test/parallel/test-readline-set-raw-mode.js @@ -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);