ionian/src/diff/watcher/recursive_watcher.ts
2023-06-01 14:18:53 +09:00

61 lines
2 KiB
TypeScript

import { FSWatcher, watch } from "chokidar";
import { EventEmitter } from "events";
import { join } from "path";
import { DocumentAccessor } from "../../model/doc";
import { DiffWatcherEvent, IDiffWatcher } from "../watcher";
import { setupHelp, setupRecursive } from "./util";
type RecursiveWatcherOption = {
/** @default true */
watchFile?: boolean;
/** @default false */
watchDir?: boolean;
};
export class RecursiveWatcher extends EventEmitter implements IDiffWatcher {
on<U extends keyof DiffWatcherEvent>(event: U, listener: DiffWatcherEvent[U]): this {
return super.on(event, listener);
}
emit<U extends keyof DiffWatcherEvent>(event: U, ...arg: Parameters<DiffWatcherEvent[U]>): boolean {
return super.emit(event, ...arg);
}
readonly path: string;
private watcher: FSWatcher;
constructor(path: string, option: RecursiveWatcherOption = {
watchDir: false,
watchFile: true,
}) {
super();
this.path = path;
this.watcher = watch(path, {
persistent: true,
ignoreInitial: true,
depth: 100,
});
option.watchFile ??= true;
if (option.watchFile) {
this.watcher.on("add", path => {
const cpath = path;
// console.log("add ", cpath);
this.emit("create", cpath);
}).on("unlink", path => {
const cpath = path;
// console.log("unlink ", cpath);
this.emit("delete", cpath);
});
}
if (option.watchDir) {
this.watcher.on("addDir", path => {
const cpath = path;
this.emit("create", cpath);
}).on("unlinkDir", path => {
const cpath = path;
this.emit("delete", cpath);
});
}
}
async setup(cntr: DocumentAccessor): Promise<void> {
await setupRecursive(this, this.path, cntr);
}
}