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

140 lines
11 KiB
JavaScript

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