1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- '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;
|