Off mutes debounced events

This commit is contained in:
2026-08-07 12:44:18 +00:00
parent e981bf8095
commit 2e4f4bbfa1
+13 -11
View File
@@ -122,19 +122,21 @@ export class EventEmitter<T extends EventMap> {
const listeners = this.#listeners.get(type); const listeners = this.#listeners.get(type);
if (!listeners) return; if (!listeners) return;
// If no listener is provided, remove all listeners for the event type. // Find the listener entries (If a listener was provided, only 1 entry will be returned. Otherwise, all entries will be returned).
const listenerEntries = Array.from(listeners).filter((entry) => !listener || entry.listener === listener || entry.wrappedListener === listener);
// Remove the listener entries from the listeners set.
listenerEntries.forEach((entry) => {
// Set the wrapped listener to a no-op function to prevent it from being called by debounced events after it's been removed.
entry.wrappedListener = (): void => {};
// Remove the listener entry from the listeners set.
listeners.delete(entry);
});
// If no listener was provided, remove the listeners set from the listeners map.
if (!listener) { if (!listener) {
this.#listeners.delete(type); this.#listeners.delete(type);
return;
}
// Find the listener entry.
const listenerEntry = Array.from(listeners).find((entry) => entry.listener === listener || entry.wrappedListener === listener);
// If the listener entry is found, remove it from the listeners map.
if (listenerEntry) {
listeners.delete(listenerEntry);
} }
} }