117 lines
10 KiB
JavaScript
117 lines
10 KiB
JavaScript
/* IMPORT */
|
|
import { FileType, TargetEvent } from './enums.js';
|
|
import LazyMapSet from './lazy_map_set.js';
|
|
import Utils from './utils.js';
|
|
import WatcherStats from './watcher_stats.js';
|
|
/* MAIN */
|
|
class WatcherPoller {
|
|
constructor() {
|
|
/* VARIABLES */
|
|
this.inos = {};
|
|
this.paths = new LazyMapSet();
|
|
this.stats = new Map();
|
|
}
|
|
/* API */
|
|
getIno(targetPath, event, type) {
|
|
const inos = this.inos[event];
|
|
if (!inos)
|
|
return;
|
|
const ino = inos[targetPath];
|
|
if (!ino)
|
|
return;
|
|
if (type && ino[1] !== type)
|
|
return;
|
|
return ino[0];
|
|
}
|
|
getStats(targetPath) {
|
|
return this.stats.get(targetPath);
|
|
}
|
|
async poll(targetPath, timeout) {
|
|
const stats = await Utils.fs.poll(targetPath, timeout);
|
|
if (!stats)
|
|
return;
|
|
const isSupported = stats.isFile() || stats.isDirectory();
|
|
if (!isSupported)
|
|
return;
|
|
return new WatcherStats(stats);
|
|
}
|
|
reset() {
|
|
this.inos = {};
|
|
this.paths = new LazyMapSet();
|
|
this.stats = new Map();
|
|
}
|
|
async update(targetPath, timeout) {
|
|
const prev = this.getStats(targetPath);
|
|
const next = await this.poll(targetPath, timeout);
|
|
this.updateStats(targetPath, next);
|
|
if (!prev && next) {
|
|
if (next.isFile()) {
|
|
this.updateIno(targetPath, TargetEvent.ADD, next);
|
|
return [TargetEvent.ADD];
|
|
}
|
|
if (next.isDirectory()) {
|
|
this.updateIno(targetPath, TargetEvent.ADD_DIR, next);
|
|
return [TargetEvent.ADD_DIR];
|
|
}
|
|
}
|
|
else if (prev && !next) {
|
|
if (prev.isFile()) {
|
|
this.updateIno(targetPath, TargetEvent.UNLINK, prev);
|
|
return [TargetEvent.UNLINK];
|
|
}
|
|
if (prev.isDirectory()) {
|
|
this.updateIno(targetPath, TargetEvent.UNLINK_DIR, prev);
|
|
return [TargetEvent.UNLINK_DIR];
|
|
}
|
|
}
|
|
else if (prev && next) {
|
|
if (prev.isFile()) {
|
|
if (next.isFile()) {
|
|
if (prev.ino === next.ino && !prev.size && !next.size)
|
|
return []; // Same path, same content and same file, nothing actually changed
|
|
this.updateIno(targetPath, TargetEvent.CHANGE, next);
|
|
return [TargetEvent.CHANGE];
|
|
}
|
|
if (next.isDirectory()) {
|
|
this.updateIno(targetPath, TargetEvent.UNLINK, prev);
|
|
this.updateIno(targetPath, TargetEvent.ADD_DIR, next);
|
|
return [TargetEvent.UNLINK, TargetEvent.ADD_DIR];
|
|
}
|
|
}
|
|
else if (prev.isDirectory()) {
|
|
if (next.isFile()) {
|
|
this.updateIno(targetPath, TargetEvent.UNLINK_DIR, prev);
|
|
this.updateIno(targetPath, TargetEvent.ADD, next);
|
|
return [TargetEvent.UNLINK_DIR, TargetEvent.ADD];
|
|
}
|
|
if (next.isDirectory()) {
|
|
if (prev.ino === next.ino)
|
|
return []; // Same path and same directory, nothing actually changed
|
|
this.updateIno(targetPath, TargetEvent.UNLINK_DIR, prev);
|
|
this.updateIno(targetPath, TargetEvent.ADD_DIR, next);
|
|
return [TargetEvent.UNLINK_DIR, TargetEvent.ADD_DIR];
|
|
}
|
|
}
|
|
}
|
|
return [];
|
|
}
|
|
updateIno(targetPath, event, stats) {
|
|
const inos = this.inos[event] = this.inos[event] || (this.inos[event] = {});
|
|
const type = stats.isFile() ? FileType.FILE : FileType.DIR;
|
|
inos[targetPath] = [stats.ino, type];
|
|
}
|
|
updateStats(targetPath, stats) {
|
|
if (stats) {
|
|
this.paths.set(stats.ino, targetPath);
|
|
this.stats.set(targetPath, stats);
|
|
}
|
|
else {
|
|
const ino = this.stats.get(targetPath)?.ino || -1;
|
|
this.paths.delete(ino, targetPath);
|
|
this.stats.delete(targetPath);
|
|
}
|
|
}
|
|
}
|
|
/* EXPORT */
|
|
export default WatcherPoller;
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlcl9wb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy93YXRjaGVyX3BvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxZQUFZO0FBRVosT0FBTyxFQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDakQsT0FBTyxVQUFVLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sWUFBWSxNQUFNLG9CQUFvQixDQUFDO0FBRzlDLFVBQVU7QUFFVixNQUFNLGFBQWE7SUFBbkI7UUFFRSxlQUFlO1FBRWYsU0FBSSxHQUFnRSxFQUFFLENBQUM7UUFDdkUsVUFBSyxHQUEwQixJQUFJLFVBQVUsRUFBRyxDQUFDO1FBQ2pELFVBQUssR0FBNEIsSUFBSSxHQUFHLEVBQUcsQ0FBQztJQTJLOUMsQ0FBQztJQXpLQyxTQUFTO0lBRVQsTUFBTSxDQUFHLFVBQWdCLEVBQUUsS0FBa0IsRUFBRSxJQUFlO1FBRTVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUIsSUFBSyxDQUFDLElBQUk7WUFBRyxPQUFPO1FBRXBCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU3QixJQUFLLENBQUMsR0FBRztZQUFHLE9BQU87UUFFbkIsSUFBSyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUk7WUFBRyxPQUFPO1FBRXRDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWhCLENBQUM7SUFFRCxRQUFRLENBQUcsVUFBZ0I7UUFFekIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBRyxVQUFVLENBQUUsQ0FBQztJQUV2QyxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBRyxVQUFnQixFQUFFLE9BQWdCO1FBRTdDLE1BQU0sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUcsVUFBVSxFQUFFLE9BQU8sQ0FBRSxDQUFDO1FBRTFELElBQUssQ0FBQyxLQUFLO1lBQUcsT0FBTztRQUVyQixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFHLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRyxDQUFDO1FBRTVELElBQUssQ0FBQyxXQUFXO1lBQUcsT0FBTztRQUUzQixPQUFPLElBQUksWUFBWSxDQUFHLEtBQUssQ0FBRSxDQUFDO0lBRXBDLENBQUM7SUFFRCxLQUFLO1FBRUgsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksVUFBVSxFQUFHLENBQUM7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBRyxDQUFDO0lBRTFCLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFHLFVBQWdCLEVBQUUsT0FBZ0I7UUFFL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBRyxVQUFVLENBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUcsVUFBVSxFQUFFLE9BQU8sQ0FBRSxDQUFDO1FBRXJELElBQUksQ0FBQyxXQUFXLENBQUcsVUFBVSxFQUFFLElBQUksQ0FBRSxDQUFDO1FBRXRDLElBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFHLENBQUM7WUFFcEIsSUFBSyxJQUFJLENBQUMsTUFBTSxFQUFHLEVBQUcsQ0FBQztnQkFFckIsSUFBSSxDQUFDLFNBQVMsQ0FBRyxVQUFVLEVBQUUsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUUsQ0FBQztnQkFFckQsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUUzQixDQUFDO1lBRUQsSUFBSyxJQUFJLENBQUMsV0FBVyxFQUFHLEVBQUcsQ0FBQztnQkFFMUIsSUFBSSxDQUFDLFNBQVMsQ0FBRyxVQUFVLEVBQUUs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
|