2025-02-04 01:30:36 -05:00

105 lines
2.8 KiB
TypeScript

import { FSWatcher } from 'chokidar';
import * as chokidar from 'chokidar';
import Store from 'electron-store';
import { ServiceError } from '../types';
const store = new Store<{
watchedPaths: string[];
excludedPaths: string[];
}>();
class FileSystemService {
private watchers: Map<string, FSWatcher>;
private excludedPaths: Set<string>;
constructor() {
this.watchers = new Map();
this.excludedPaths = new Set(store.get('excludedPaths', []));
// Add example paths
const examplePaths = [
'C:/example/llm-only',
'C:/example/ocr-only',
'C:/example/both-enabled'
];
// Set initial watched paths
store.set('watchedPaths', examplePaths);
// Start watching example paths
examplePaths.forEach(path => {
this.watchers.set(path, null); // Add to watchers without actual watcher since paths don't exist
});
}
public async startWatching(dirPath: string): Promise<void> {
if (this.watchers.has(dirPath)) {
throw new ServiceError(`Already watching directory: ${dirPath}`);
}
const watcher = chokidar.watch(dirPath, {
ignored: [
/(^|[\/\\])\../, // Ignore dotfiles
'**/node_modules/**',
...Array.from(this.excludedPaths),
],
persistent: true,
ignoreInitial: false,
});
watcher.on('add', path => {
console.log(`File ${path} has been added`);
// TODO: Process file
});
watcher.on('change', path => {
console.log(`File ${path} has been changed`);
// TODO: Process file changes
});
watcher.on('unlink', path => {
console.log(`File ${path} has been removed`);
// TODO: Remove from vector store
});
this.watchers.set(dirPath, watcher);
const watchedPaths = store.get('watchedPaths', []);
if (!watchedPaths.includes(dirPath)) {
store.set('watchedPaths', [...watchedPaths, dirPath]);
}
}
public async stopWatching(dirPath: string): Promise<void> {
const watcher = this.watchers.get(dirPath);
if (!watcher) {
throw new ServiceError(`Not watching directory: ${dirPath}`);
}
await watcher.close();
this.watchers.delete(dirPath);
const watchedPaths = store.get('watchedPaths', []);
store.set('watchedPaths', watchedPaths.filter(p => p !== dirPath));
}
public addExcludedPath(path: string): void {
this.excludedPaths.add(path);
store.set('excludedPaths', Array.from(this.excludedPaths));
// Update all watchers with new excluded path
this.watchers.forEach(watcher => {
watcher.unwatch(path);
});
}
public getWatchedPaths(): string[] {
return Array.from(this.watchers.keys());
}
public getExcludedPaths(): string[] {
return Array.from(this.excludedPaths);
}
}
export const fileSystemService = new FileSystemService();