UNPKG

findr

Version:

monitor a directory

168 lines (148 loc) 4.13 kB
// Generated by CoffeeScript 1.6.2 var events, fs, noFilter, path, walk, watch, __hasProp = {}.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; fs = require('fs'); path = require('path'); events = require('events'); noFilter = function() { return true; }; exports.walk = walk = function(dir, filter, fn) { var err, traverse; dir = path.resolve(dir); if (arguments.length === 2) { fn = filter; filter = noFilter; } if (typeof filter !== 'function') { filter = noFilter; } fn.files || (fn.files = {}); try { fn.files[dir] = fs.statSync(dir); } catch (_error) { err = _error; fn(err); } traverse = function(dir) { var files; try { files = fs.readdirSync(dir); } catch (_error) { err = _error; fn(err); } return files.forEach(function(filename) { var file, stat; file = path.join(dir, filename); try { stat = fs.statSync(file); } catch (_error) { err = _error; fn(err); } if (!filter(file, stat)) { return; } fn.files[file] = stat; if (stat.isDirectory()) { return traverse(file); } }); }; traverse(dir); return fn(null, fn.files); }; exports.watch = watch = function(dir, filter, fn) { return walk(dir, filter, function(err, files) { var file, watcher; if (err) { return console.error(err); } watcher = function(f) { return fs.watchFile(f, { interval: 50, persistent: true }, function(curr, prev) { if (files[f] && files[f].isFile() && curr.nlink !== 0 && curr.mtime.getTime() === prev.mtime.getTime()) { return; } files[f] = curr; if (files[f].isFile()) { return fn(f, curr, prev); } if (curr.nlink === 0) { delete files[f]; fs.unwatchFile(f); return fn(f, curr, prev); } return fs.readdir(f, function(err, dirFiles) { if (err) { return console.error("err loading " + f + " : " + err); } return dirFiles.forEach(function(filename) { var file; file = path.join(f, filename); if (!files[file]) { return fs.stat(file, function(err, stat) { if (err) { return console.error("err loading " + file + " : " + err); } if (filter(file, stat)) { fn(file, stat, null); files[file] = stat; return watcher(file); } }); } }); }); }); }; for (file in files) { watcher(file); } return fn(files, null, null); }); }; exports.Monitor = (function(_super) { __extends(Monitor, _super); function Monitor(name, dir, filter) { this.name = name; this.dir = dir; this.filter = filter; this.state = 'stopped'; this.files = {}; } Monitor.prototype.start = function() { var _this = this; if (this.state !== 'stopped') { return; } this.state = 'running'; return watch(this.dir, this.filter, function(f, curr, prev) { if (curr === null && prev === null) { return _this.emit('started', _this.files = f); } else if (prev === null) { return _this.emit('created', f, curr, prev); } else if (curr.nlink === 0) { return _this.emit('removed', f, curr, prev); } else { return _this.emit('changed', f, curr, prev); } }); }; Monitor.prototype.stop = function() { var file; if (this.state !== 'running') { return; } this.state = 'stopped'; for (file in this.files) { fs.unwatchFile(file); } return this.emit('stopped'); }; return Monitor; })(events.EventEmitter);