@@ -17,17 +17,18 @@ const { addAbortListener } = require('internal/events/abort_listener');
17
17
const { watch } = require ( 'fs' ) ;
18
18
const { fileURLToPath } = require ( 'internal/url' ) ;
19
19
const { resolve, dirname } = require ( 'path' ) ;
20
- const { setTimeout } = require ( 'timers' ) ;
20
+ const { setTimeout, clearTimeout } = require ( 'timers' ) ;
21
21
22
22
const supportsRecursiveWatching = process . platform === 'win32' ||
23
23
process . platform === 'darwin' ;
24
24
25
25
class FilesWatcher extends EventEmitter {
26
26
#watchers = new SafeMap ( ) ;
27
27
#filteredFiles = new SafeSet ( ) ;
28
- #debouncing = new SafeSet ( ) ;
29
28
#depencencyOwners = new SafeMap ( ) ;
30
29
#ownerDependencies = new SafeMap ( ) ;
30
+ #debounceOwners = new SafeSet ( ) ;
31
+ #debounceTimer;
31
32
#debounce;
32
33
#mode;
33
34
#signal;
@@ -75,17 +76,27 @@ class FilesWatcher extends EventEmitter {
75
76
}
76
77
77
78
#onChange( trigger ) {
78
- if ( this . #debouncing. has ( trigger ) ) {
79
- return ;
80
- }
81
79
if ( this . #mode === 'filter' && ! this . #filteredFiles. has ( trigger ) ) {
82
80
return ;
83
81
}
84
- this . #debouncing . add ( trigger ) ;
82
+
85
83
const owners = this . #depencencyOwners. get ( trigger ) ;
86
- setTimeout ( ( ) => {
87
- this . #debouncing. delete ( trigger ) ;
84
+ if ( owners ) {
85
+ for ( const owner of owners ) {
86
+ this . #debounceOwners. add ( owner ) ;
87
+ }
88
+ }
89
+
90
+ clearTimeout ( this . #debounceTimer) ;
91
+ this . #debounceTimer = setTimeout ( ( ) => {
92
+ this . #debounceTimer = null ;
93
+ // In order to allow async processing of the 'changed' event, let's
94
+ // make sure the Set emitted is a new instance. We could emit using a copy
95
+ // of #debounceOwners, then clear #debounceOwners, but that would be
96
+ // slower than just replacing #debounceOwners with an empty Set.
97
+ const owners = this . #debounceOwners;
88
98
this . emit ( 'changed' , { owners } ) ;
99
+ this . #debounceOwners = new SafeSet ( ) ;
89
100
} , this . #debounce) . unref ( ) ;
90
101
}
91
102
0 commit comments