watcher/dist_ts/watcher_poller.js
2024-04-18 21:12:37 +02:00

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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