var EventEmitter = require('events') var Logger = require('./Logger') var chokidar = require('chokidar') class FolderWatcher extends EventEmitter { constructor(audiobookPath) { super() this.AudiobookPath = audiobookPath this.folderMap = {} this.watcher = null } initWatcher() { try { Logger.info('[WATCHER] Initializing..') this.watcher = chokidar.watch(this.AudiobookPath, { ignoreInitial: true, ignored: /(^|[\/\\])\../, // ignore dotfiles persistent: true, awaitWriteFinish: { stabilityThreshold: 2500, pollInterval: 500 } }) this.watcher .on('add', (path) => { this.onNewFile(path) }).on('change', (path) => { this.onFileUpdated(path) }).on('unlink', path => { this.onFileRemoved(path) }).on('error', (error) => { Logger.error(`Watcher error: ${error}`) }).on('ready', () => { Logger.info('[WATCHER] Ready') }) } catch (error) { Logger.error('Chokidar watcher failed', error) } } close() { return this.watcher.close() } onNewFile(path) { Logger.info('FolderWatcher: New File', path) this.emit('file_added', { path: path.replace(this.AudiobookPath, ''), fullPath: path }) } onFileRemoved(path) { Logger.info('FolderWatcher: File Removed', path) this.emit('file_removed', { path: path.replace(this.AudiobookPath, ''), fullPath: path }) } onFileUpdated(path) { Logger.info('FolderWatcher: Updated File', path) this.emit('file_updated', { path: path.replace(this.AudiobookPath, ''), fullPath: path }) } } module.exports = FolderWatcher