@@ -19,17 +19,18 @@ const { addAbortListener } = require('internal/events/abort_listener');
19
19
const { watch } = require ( 'fs' ) ;
20
20
const { fileURLToPath } = require ( 'internal/url' ) ;
21
21
const { resolve, dirname } = require ( 'path' ) ;
22
- const { setTimeout } = require ( 'timers' ) ;
22
+ const { setTimeout, clearTimeout } = require ( 'timers' ) ;
23
23
24
24
const supportsRecursiveWatching = process . platform === 'win32' ||
25
25
process . platform === 'darwin' ;
26
26
27
27
class FilesWatcher extends EventEmitter {
28
28
#watchers = new SafeMap ( ) ;
29
29
#filteredFiles = new SafeSet ( ) ;
30
- #debouncing = new SafeSet ( ) ;
31
30
#depencencyOwners = new SafeMap ( ) ;
32
31
#ownerDependencies = new SafeMap ( ) ;
32
+ #debounceOwners = new SafeSet ( ) ;
33
+ #debounceTimer;
33
34
#debounce;
34
35
#mode;
35
36
#signal;
@@ -80,17 +81,20 @@ class FilesWatcher extends EventEmitter {
80
81
}
81
82
82
83
#onChange( trigger ) {
83
- if ( this . #debouncing. has ( trigger ) ) {
84
- return ;
85
- }
86
84
if ( this . #mode === 'filter' && ! this . #filteredFiles. has ( trigger ) ) {
87
85
return ;
88
86
}
89
- this . #debouncing. add ( trigger ) ;
90
87
const owners = this . #depencencyOwners. get ( trigger ) ;
91
- setTimeout ( ( ) => {
92
- this . #debouncing. delete ( trigger ) ;
93
- this . emit ( 'changed' , { owners } ) ;
88
+ if ( owners ) {
89
+ for ( const owner of owners ) {
90
+ this . #debounceOwners. add ( owner ) ;
91
+ }
92
+ }
93
+ clearTimeout ( this . #debounceTimer) ;
94
+ this . #debounceTimer = setTimeout ( ( ) => {
95
+ this . #debounceTimer = null ;
96
+ this . emit ( 'changed' , { owners : this . #debounceOwners } ) ;
97
+ this . #debounceOwners. clear ( ) ;
94
98
} , this . #debounce) . unref ( ) ;
95
99
}
96
100
0 commit comments