From b2205684d3ee60d4d36d0c22e5c57b75d565466b Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Wed, 6 Mar 2024 14:46:54 +0100 Subject: [PATCH] watch: allow listening for grouped changes --- lib/internal/watch_mode/files_watcher.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/internal/watch_mode/files_watcher.js b/lib/internal/watch_mode/files_watcher.js index e3f37557a627dc9..452e6d5e33b3c48 100644 --- a/lib/internal/watch_mode/files_watcher.js +++ b/lib/internal/watch_mode/files_watcher.js @@ -17,7 +17,7 @@ const { addAbortListener } = require('internal/events/abort_listener'); const { watch } = require('fs'); const { fileURLToPath } = require('internal/url'); const { resolve, dirname } = require('path'); -const { setTimeout } = require('timers'); +const { setTimeout, clearTimeout } = require('timers'); const supportsRecursiveWatching = process.platform === 'win32' || process.platform === 'darwin'; @@ -25,9 +25,10 @@ const supportsRecursiveWatching = process.platform === 'win32' || class FilesWatcher extends EventEmitter { #watchers = new SafeMap(); #filteredFiles = new SafeSet(); - #debouncing = new SafeSet(); #depencencyOwners = new SafeMap(); #ownerDependencies = new SafeMap(); + #debounceOwners = new SafeSet(); + #debounceTimer; #debounce; #mode; #signal; @@ -75,17 +76,20 @@ class FilesWatcher extends EventEmitter { } #onChange(trigger) { - if (this.#debouncing.has(trigger)) { - return; - } if (this.#mode === 'filter' && !this.#filteredFiles.has(trigger)) { return; } - this.#debouncing.add(trigger); const owners = this.#depencencyOwners.get(trigger); - setTimeout(() => { - this.#debouncing.delete(trigger); - this.emit('changed', { owners }); + if (owners) { + for (const owner of owners) { + this.#debounceOwners.add(owner); + } + } + clearTimeout(this.#debounceTimer); + this.#debounceTimer = setTimeout(() => { + this.#debounceTimer = null; + this.emit('changed', { owners: this.#debounceOwners }); + this.#debounceOwners.clear(); }, this.#debounce).unref(); }