'use strict'; const Wt = require('wt'); const fs = require('fs'); const Base = require('sdk-base'); // only used by local dev enviroment class DevelopmentEventSource extends Base { constructor() { super(); this.wt = new Wt({ // check if the under-watch directory is still alive every minute rewatchInterval: 60000, }) .on('all', (...args) => this._onWtChange(...args)) .on('error', (...args) => this.emit('error', ...args)); this._fileWatching = new Map(); this.ready(true); } watch(path) { try { const stat = fs.statSync(path); if (stat.isFile(path)) { const handler = fs.watch(path, this._onFsWatchChange.bind(this, path)); // 保存 handler,用于接触监听 this._fileWatching.set(path, handler); } else if (stat.isDirectory()) { this.wt.watch(path); } } catch (e) { // file not exist, do nothing // do not emit error, in case of too many logs } } unwatch(path) { if (!path) return; const h = this._fileWatching.get(path); if (h) { // fs.watch 文件监听 h.removeAllListeners(); h.close(); this._fileWatching.delete(path); } else { // wt 文件夹监听 this.wt.unwatch(path); } } _onWtChange(info) { // debug('got %s, info %j', info.event, info); // { event: 'change', // path: '/Users/mk2/git/changing/test/fixtures/foo.js', // stat: // { dev: 16777220, // mode: 33188, // nlink: 1, // uid: 501, // gid: 20, // rdev: 0, // blksize: 4096, // ino: 72656587, // size: 11, // blocks: 8, // atime: Wed Jun 17 2015 00:08:11 GMT+0800 (CST), // mtime: Wed Jun 17 2015 00:08:38 GMT+0800 (CST), // ctime: Wed Jun 17 2015 00:08:38 GMT+0800 (CST), // birthtime: Tue Jun 16 2015 23:19:13 GMT+0800 (CST) } } this.emit('change', info); } _onFsWatchChange(path, event) { const info = { path, event, stat: fs.statSync(path), }; // this.emit(info.event, info); this.emit('change', info); } } module.exports = DevelopmentEventSource;