/* IMPORT */ import { RENAME_TIMEOUT } from './constants.js'; import { FileType, TargetEvent } from './enums.js'; import Utils from './utils.js'; import WatcherLocksResolver from './watcher_locks_resolver.js'; /* MAIN */ //TODO: Use a better name for this thing, maybe "RenameDetector" class WatcherLocker { static { this.DIR_EVENTS = { add: TargetEvent.ADD_DIR, rename: TargetEvent.RENAME_DIR, unlink: TargetEvent.UNLINK_DIR }; } static { this.FILE_EVENTS = { add: TargetEvent.ADD, change: TargetEvent.CHANGE, rename: TargetEvent.RENAME, unlink: TargetEvent.UNLINK }; } /* CONSTRUCTOR */ constructor(watcher) { this._watcher = watcher; this.reset(); } /* API */ getLockAdd(config, timeout = RENAME_TIMEOUT) { const { ino, targetPath, events, locks } = config; const emit = () => { const otherPath = this._watcher._poller.paths.find(ino || -1, path => path !== targetPath); // Maybe this is actually a rename in a case-insensitive filesystem if (otherPath && otherPath !== targetPath) { if (Utils.fs.getRealPath(targetPath, true) === otherPath) return; //TODO: This seems a little too special-casey this._watcher.event(events.rename, otherPath, targetPath); } else { this._watcher.event(events.add, targetPath); } }; if (!ino) return emit(); const cleanup = () => { locks.add.delete(ino); WatcherLocksResolver.remove(free); }; const free = () => { cleanup(); emit(); }; WatcherLocksResolver.add(free, timeout); const resolve = () => { const unlink = locks.unlink.get(ino); if (!unlink) return; // No matching "unlink" lock found, skipping cleanup(); const targetPathPrev = unlink(); if (targetPath === targetPathPrev) { if (events.change) { if (this._watcher._poller.stats.has(targetPath)) { this._watcher.event(events.change, targetPath); } } } else { this._watcher.event(events.rename, targetPathPrev, targetPath); } }; locks.add.set(ino, resolve); resolve(); } getLockUnlink(config, timeout = RENAME_TIMEOUT) { const { ino, targetPath, events, locks } = config; const emit = () => { this._watcher.event(events.unlink, targetPath); }; if (!ino) return emit(); const cleanup = () => { locks.unlink.delete(ino); WatcherLocksResolver.remove(free); }; const free = () => { cleanup(); emit(); }; WatcherLocksResolver.add(free, timeout); const overridden = () => { cleanup(); return targetPath; }; locks.unlink.set(ino, overridden); locks.add.get(ino)?.(); } getLockTargetAdd(targetPath, timeout) { const ino = this._watcher._poller.getIno(targetPath, TargetEvent.ADD, FileType.FILE); return this.getLockAdd({ ino, targetPath, events: WatcherLocker.FILE_EVENTS, locks: this._locksFile }, timeout); } getLockTargetAddDir(targetPath, timeout) { const ino = this._watcher._poller.getIno(targetPath, TargetEvent.ADD_DIR, FileType.DIR); return this.getLockAdd({ ino, targetPath, events: WatcherLocker.DIR_EVENTS, locks: this._locksDir }, timeout); } getLockTargetUnlink(targetPath, timeout) { const ino = this._watcher._poller.getIno(targetPath, TargetEvent.UNLINK, FileType.FILE); return this.getLockUnlink({ ino, targetPath, events: WatcherLocker.FILE_EVENTS, locks: this._locksFile }, timeout); } getLockTargetUnlinkDir(targetPath, timeout) { const ino = this._watcher._poller.getIno(targetPath, TargetEvent.UNLINK_DIR, FileType.DIR); return this.getLockUnlink({ ino, targetPath, events: WatcherLocker.DIR_EVENTS, locks: this._locksDir }, timeout); } reset() { this._locksAdd = new Map(); this._locksAddDir = new Map(); this._locksUnlink = new Map(); this._locksUnlinkDir = new Map(); this._locksDir = { add: this._locksAddDir, unlink: this._locksUnlinkDir }; this._locksFile = { add: this._locksAdd, unlink: this._locksUnlink }; } } /* EXPORT */ export default WatcherLocker; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlcl9sb2NrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy93YXRjaGVyX2xvY2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxZQUFZO0FBRVosT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxRQUFRLEVBQUUsV0FBVyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ2pELE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLG9CQUFvQixNQUFNLDZCQUE2QixDQUFDO0FBSS9ELFVBQVU7QUFFVixnRUFBZ0U7QUFFaEUsTUFBTSxhQUFhO2FBWVYsZUFBVSxHQUFXO1FBQzFCLEdBQUcsRUFBRSxXQUFXLENBQUMsT0FBTztRQUN4QixNQUFNLEVBQUUsV0FBVyxDQUFDLFVBQVU7UUFDOUIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxVQUFVO0tBQy9CLENBQUM7YUFFSyxnQkFBVyxHQUFXO1FBQzNCLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztRQUNwQixNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU07UUFDMUIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNO1FBQzFCLE1BQU0sRUFBRSxXQUFXLENBQUMsTUFBTTtLQUMzQixDQUFDO0lBRUYsaUJBQWlCO0lBRWpCLFlBQWMsT0FBZ0I7UUFFNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFFeEIsSUFBSSxDQUFDLEtBQUssRUFBRyxDQUFDO0lBRWhCLENBQUM7SUFFRCxTQUFTO0lBRVQsVUFBVSxDQUFHLE1BQWtCLEVBQUUsVUFBa0IsY0FBYztRQUUvRCxNQUFNLEVBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO1FBRWhELE1BQU0sSUFBSSxHQUFHLEdBQVMsRUFBRTtZQUN0QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FB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