From b4263f57174686c36899ce536370c434db78e9d1 Mon Sep 17 00:00:00 2001 From: Dmitriy Mozgovoy Date: Sun, 14 Jun 2020 14:07:36 +0300 Subject: [PATCH] Fixes #262 waitFor listeners leakage --- CHANGELOG.md | 5 ++++ README.md | 2 +- lib/eventemitter2.js | 1 + test/{simple => waitFor}/waitFor.js | 39 +++++++++++++++++++++++++++++ 4 files changed, 46 insertions(+), 1 deletion(-) rename test/{simple => waitFor}/waitFor.js (74%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c67e442..cef85f4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/). For changes before version 2.2.0, please see the commit history +## [6.4.3] - 2020-06-14 + +### Fixed +- waitFor listeners leakage issue (#262) @DigitalBrainJS + ## [6.4.2] - 2020-05-28 ### Fixed diff --git a/README.md b/README.md index ea91f78d..bc75260b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ [![Build Status](https://travis-ci.org/EventEmitter2/EventEmitter2.svg?branch=master)](https://travis-ci.org/EventEmitter2/EventEmitter2) -[![Coverage Status](https://coveralls.io/repos/github/EventEmitter2/EventEmitter2/badge.svg?branch=v6.4.1)](https://coveralls.io/github/EventEmitter2/EventEmitter2?branch=v6.4.1) +[![Coverage Status](https://coveralls.io/repos/github/EventEmitter2/EventEmitter2/badge.svg?branch=v6.4.3)](https://coveralls.io/github/EventEmitter2/EventEmitter2?branch=v6.4.1) [![NPM version](https://badge.fury.io/js/eventemitter2.svg)](http://badge.fury.io/js/eventemitter2) [![Dependency Status](https://img.shields.io/david/asyncly/eventemitter2.svg)](https://david-dm.org/asyncly/eventemitter2) [![npm](https://img.shields.io/npm/dm/eventemitter2.svg?maxAge=2592000)]() diff --git a/lib/eventemitter2.js b/lib/eventemitter2.js index 06e87ee6..bd6bf26f 100644 --- a/lib/eventemitter2.js +++ b/lib/eventemitter2.js @@ -1494,6 +1494,7 @@ if (filter && !filter.apply(self, arguments)) { return; } + self.off(event, listener); if (options.handleError) { var err = arguments[0]; err ? reject(err) : resolve(toArray.apply(null, arguments).slice(1)); diff --git a/test/simple/waitFor.js b/test/waitFor/waitFor.js similarity index 74% rename from test/simple/waitFor.js rename to test/waitFor/waitFor.js index 5d70a18e..a3175176 100644 --- a/test/simple/waitFor.js +++ b/test/waitFor/waitFor.js @@ -1,6 +1,7 @@ var simpleEvents = require('nodeunit').testCase; var file = '../../lib/eventemitter2'; var EventEmitter2; +var assert= require('assert'); if (typeof require !== 'undefined') { EventEmitter2 = require(file).EventEmitter2; @@ -110,5 +111,43 @@ module.exports = simpleEvents({ emitter.emit('foo', 1); emitter.emit('foo', 2); + }, + + '6. should clear internal listeners once its promise resolved': function (done) { + var emitter = new EventEmitter2({verbose: true}); + + emitter.waitFor('foo', { + filter: function (arg0) { + return arg0 === 2; + }, + timeout: 50 + }).then(function (data) { + assert.equal(data[0], 2); + assert.equal(emitter.listenerCount(), 0); + done(); + }).catch(done); + + assert.equal(emitter.listenerCount(), 1); + + emitter.emit('foo', 2); + }, + + '7. should clear internal listeners once its promise resolved (wildcard)': function (done) { + var emitter = new EventEmitter2({verbose: true, wildcard: true}); + + emitter.waitFor('foo.*', { + filter: function (arg0) { + return arg0 === 2; + }, + timeout: 50 + }).then(function (data) { + assert.equal(data[0], 2); + assert.equal(emitter.listenerCount('**'), 0); + done(); + }).catch(done); + + assert.equal(emitter.listenerCount('**'), 1); + + emitter.emit('foo.bar', 2); } });