140 lines
11 KiB
JavaScript
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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
|