From a1c111005340254e2f0faf890a27a905f5635dc9 Mon Sep 17 00:00:00 2001 From: Mike Pirog Date: Thu, 14 Mar 2024 08:48:49 -0400 Subject: [PATCH] fixed bug causing once events to run more than once --- CHANGELOG.md | 1 + lib/events.js | 22 +++++++--------------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c68b2e0a0..b9fa72015 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ ### Fixes * Fixed prompt showing in `non-interactive` environments +* Fixed `once` events running more than `once` ## v3.21.0-beta.9 - [March 10, 2024](https://github.com/lando/core/releases/tag/v3.21.0-beta.9) diff --git a/lib/events.js b/lib/events.js index 3a37453fa..53559e559 100644 --- a/lib/events.js +++ b/lib/events.js @@ -103,11 +103,7 @@ class AsyncEvents extends EventEmitter { .value(); // Map to array of func - const fns = _.map(evnts, evnt => evnt.fn); - - // if (name === 'engine-autostart') { - // console.log(fns); - // } + const fns = _.map(evnts, evnt => ({fn: evnt.fn, id: evnt.id})); // Log non engine events so we can keep things quiet if (!_.includes(name, '-engine-')) { @@ -116,11 +112,16 @@ class AsyncEvents extends EventEmitter { } // Make listener functions to a promise in series. - return Promise.each(fns, fn => { + return Promise.each(fns, listener => { + const {fn, id} = listener; // Clone function arguments. const fnArgs = args.slice(); // Add listener function to front of arguments. fnArgs.unshift(fn); + // If its a onetimer then remove it from listeners + if (fn.name && fn.name.includes('onceWrapper')) { + this._listeners = this._listeners.filter(listener => listener.id !== id); + } // Apply function that calls the listener function and returns a promise. return handle.apply(self, fnArgs); }) @@ -128,15 +129,6 @@ class AsyncEvents extends EventEmitter { // Make sure to wait for all mappings. .all() - // .then(() => { - // if (name === 'engine-autostart') { - // console.log(_(this._listeners) - // .filter(listener => listener.name === 'engine-autostart') - // .sortBy('priority') - // .value()); - // } - // }) - // Return true if event had listeners just like the original emit function. .return(!!fns.length); };