Wrapper library for directory and file watching.
watchpack high level API doesn't map directly to watchers. Instead a three level architecture ensures that for each directory only a single watcher exists.
- The high level API requests
DirectoryWatchers
from aWatcherManager
, which ensures that only a singleDirectoryWatcher
per directory is created. - A user-faced
Watcher
can be obtained from aDirectoryWatcher
and provides a filtered view on theDirectoryWatcher
. - Reference-counting is used on the
DirectoryWatcher
andWatcher
to decide when to close them. - The real watchers are created by the
DirectoryWatcher
. - Files are never watched directly. This should keep the watcher count low.
- Watching can be started in the past. This way watching can start after file reading.
- Symlinks are not followed, instead the symlink is watched.
var Watchpack = require("watchpack");
var wp = new Watchpack({
// options:
aggregateTimeout: 1000,
// fire "aggregated" event when after a change for 1000ms no additional change occurred
// aggregated defaults to undefined, which doesn't fire an "aggregated" event
poll: true,
// poll: true - use polling with the default interval
// poll: 10000 - use polling with an interval of 10s
// poll defaults to undefined, which prefer native watching methods
// Note: enable polling when watching on a network path
// When WATCHPACK_POLLING environment variable is set it will override this option
followSymlinks: true,
// true: follows symlinks and watches symlinks and real files
// (This makes sense when symlinks has not been resolved yet, comes with a performance hit)
// false (default): watches only specified item they may be real files or symlinks
// (This makes sense when symlinks has already been resolved)
ignored: "**/.git"
// ignored: "string" - a glob pattern for files or folders that should not be watched
// ignored: ["string", "string"] - multiple glob patterns that should be ignored
// All subdirectories are ignored too
});
// Watchpack.prototype.watch(files: string[], directories: string[], startTime?: number)
wp.watch(listOfFiles, listOfDirectories, Date.now() - 10000);
// starts watching these files and directories
// calling this again will override the files and directories
wp.on("change", function(filePath, mtime) {
// filePath: the changed file
// mtime: last modified time for the changed file (null if file was removed)
// for folders it's a time before that all changes in the directory happened
});
wp.on("aggregated", function(changes, removals) {
// changes: a Set of all changed files
// removals: a Set of all removed files
});
// Watchpack.prototype.pause()
wp.pause();
// stops emitting events, but keeps watchers open
// next "watch" call can reuse the watchers
// Watchpack.prototype.close()
wp.close();
// stops emitting events and closes all watchers
// Watchpack.prototype.getTimeInfoEntries()
var fileTimes = wp.getTimeInfoEntries();
// returns a Map with all known time info objects for files and directories
// this include info from files not directly watched
// key: absolute path, value: object with { safeTime, timestamp }
// safeTime: the time before that all changes happened
// timestamp: only for files, the mtime timestamp of the file
// (deprecated)
// Watchpack.prototype.getTimes()
var fileTimes = wp.getTimes();
// returns an object with all known change times for files
// this include timestamps from files not directly watched
// key: absolute path, value: timestamp as number