Skip to content

Commit

Permalink
Fixed for polling servers
Browse files Browse the repository at this point in the history
It should now be able to watch symlinks that lead to outside of the watched folder when polling
  • Loading branch information
ArjhanToteck committed May 19, 2024
1 parent c54bf67 commit ef86439
Showing 1 changed file with 47 additions and 24 deletions.
71 changes: 47 additions & 24 deletions lib/DirectoryWatcher.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ class DirectoryWatcher extends EventEmitter {
this.watcherManager = watcherManager;
this.options = options;
this.path = directoryPath;
this.watchingSymlink = false;
// safeTime is the point in time after which reading is safe to be unchanged
// timestamp is a value that should be compared with another timestamp (mtime)
/** @type {Map<string, { safeTime: number, timestamp: number }} */
Expand Down Expand Up @@ -111,8 +112,8 @@ class DirectoryWatcher extends EventEmitter {
this.watchInParentDirectory();
}
this.watcher = watchEventSource.watch(this.path);
this.watcher.on("change", this.onWatchEvent.bind(this));
this.watcher.on("error", this.onWatcherError.bind(this));
this.watcher.on("change", this.onWatchEvent.bind(this));
}
} catch (err) {
this.onWatcherError(err);
Expand Down Expand Up @@ -550,7 +551,9 @@ class DirectoryWatcher extends EventEmitter {
fs.readdir(this.path, (err, items) => {
if (this.closed) return;
if (err) {
if (err.code === "ENOENT" || err.code === "EPERM") {
if (this.watchingSymlink && err.code == "ENOTDIR") {
return;
} else if (err.code === "ENOENT" || err.code === "EPERM") {
this.onDirectoryRemoved("scan readdir failed");
} else {
this.onScanError(err);
Expand Down Expand Up @@ -627,22 +630,7 @@ class DirectoryWatcher extends EventEmitter {
}
});
for (const itemPath of itemPaths) {
const handleStats = (err2, stats) => {
if (this.closed) return;
if (err2) {
if (
err2.code === "ENOENT" ||
err2.code === "EPERM" ||
err2.code === "EACCES" ||
err2.code === "EBUSY"
) {
this.setMissing(itemPath, initial, "scan (" + err2.code + ")");
} else {
this.onScanError(err2);
}
itemFinished();
return;
}
const handleStats = (stats, symlinkStats) => {
if (stats.isFile() || stats.isSymbolicLink()) {
if (stats.mtime) {
ensureFsAccuracy(stats.mtime);
Expand All @@ -654,7 +642,11 @@ class DirectoryWatcher extends EventEmitter {
true,
"scan (file)"
);
} else if (stats.isDirectory()) {
}
if (
stats.isDirectory() ||
(symlinkStats && symlinkStats.isDirectory())
) {
if (!initial || !this.directories.has(itemPath))
this.setDirectory(
itemPath,
Expand All @@ -665,11 +657,42 @@ class DirectoryWatcher extends EventEmitter {
}
itemFinished();
};
if (this.watcherManager.options.followSymlinks) {
fs.stat(itemPath, handleStats);
} else {
fs.lstat(itemPath, handleStats);
}
fs.lstat(itemPath, (err2, stats) => {
if (this.closed) return;
if (err2) {
if (
err2.code === "ENOENT" ||
err2.code === "EPERM" ||
err2.code === "EACCES" ||
err2.code === "EBUSY"
) {
this.setMissing(itemPath, initial, "scan (" + err2.code + ")");
} else {
this.onScanError(err2);
}
itemFinished();
return;
}
if (
stats.isSymbolicLink() &&
this.watcherManager.options.followSymlinks
) {
fs.stat(itemPath, (err3, symlinkStats) => {
if (this.closed) return;
// something is wrong with the symlink, but not with the file itself
if (err3) {
handleStats(stats);
this.watchingSymlink = false;
return;
}
this.watchingSymlink = true;
handleStats(stats, symlinkStats);
});
} else {
this.watchingSymlink = false;
handleStats(stats);
}
});
}
itemFinished();
});
Expand Down

0 comments on commit ef86439

Please sign in to comment.