This repository has been archived on 2021-07-14. You can view files and clone it, but cannot push or open issues or pull requests.
scriptcraft/src/main/js/modules/watcher.js

190 lines
4.8 KiB
JavaScript

'use strict';
/*global setTimeout, exports, require*/
var File = java.io.File;
/************************************************************************
## The watcher Module
This module exposes functions for watching for changes to files or directories.
### watcher.watchFile() function
Watches for changes to the given file or directory and calls the function provided
when the file changes.
#### Parameters
* File - the file to watch (can be a file or directory)
* Callback - The callback to invoke when the file has changed. The callback takes the
changed file as a parameter.
#### Example
```javascript
var watcher = require('watcher');
watcher.watchFile( 'test.txt', function( file ) {
console.log( file + ' has changed');
});
```
***/
var filesWatched = {};
var dirsWatched = {};
exports.watchFile = function( file, callback ) {
if ( typeof file == 'string' ) {
file = new File(file);
}
filesWatched[file.canonicalPath] = {
callback: callback,
lastModified: file.lastModified()
};
};
/************************************************************************
### watcher.watchDir() function
Watches for changes to the given directory and calls the function provided
when the directory changes. It works by calling watchFile/watchDir for each
file/subdirectory.
#### Parameters
* Dir - the file to watch (can be a file or directory)
* Callback - The callback to invoke when the directory has changed.
The callback takes the changed file as a parameter.
For each change inside the directory the callback will also
be called.
#### Example
```javascript
var watcher = require('watcher');
watcher.watchDir( 'players/_ial', function( dir ) {
console.log( dir + ' has changed');
});
```
***/
exports.watchDir = function( dir, callback ) {
if ( typeof dir == 'string' ) {
dir = new File(dir);
}
dirsWatched[dir.canonicalPath] = {
callback: callback,
lastModified: dir.lastModified()
};
var files = dir.listFiles(),file;
if ( !files ) {
return;
}
for ( var i = 0; i < files.length; i++ ) {
file = files[i];
if (file.isDirectory( )) {
exports.watchDir(file,callback);
}else{
exports.watchFile(file,callback);
}
}
};
/************************************************************************
### watcher.unwatchFile() function
Removes a file from the watch list.
#### Example
```javascript
var watcher = require('watcher');
watcher.unwatchFile('test.txt');
```
***/
exports.unwatchFile = function( file, callback ) {
if ( typeof file == 'string' ) {
file = new File(file);
}
delete filesWatched[file.canonicalPath];
};
/************************************************************************
### watcher.unwatchDir() function
Removes a directory from the watch list and all files inside the directory
are also "unwatched"
#### Example
```javascript
var watcher = require('watcher');
watcher.unwatchDir ('players/_ial');
```
Would cause also
```javascript
watcher.unwatchFile (file);
```
for each file inside directory (and unwatchDir for each directory inside it)
***/
exports.unwatchDir = function( dir, callback ) {
if ( typeof dir == 'string' ) {
dir = new File(dir);
}
delete dirsWatched[dir.canonicalPath];
var files = dir.listFiles(),file;
if ( !files ) {
return;
}
for ( var i = 0; i < files.length; i++ ) {
file = files[i];
if (file.isDirectory( )) {
exports.unwatchDir(file,callback);
}else{
exports.unwatchFile(file,callback);
}
}
};
function fileWatcher(calledCallbacks) {
for (var file in filesWatched) {
var fileObject = new File(file);
var lm = fileObject.lastModified();
if ( lm != filesWatched[file].lastModified ) {
filesWatched[file].lastModified = lm;
filesWatched[file].callback(fileObject);
if (!fileObject.exists()) {
exports.unwatchFile(file,filesWatched[file].callback);
}
}
}
};
//monitors directories for time change
//when a change is detected watchFiles are invoked for each of the files in directory
//and callback is called
function dirWatcher(calledCallbacks) {
for (var dir in dirsWatched) {
var dirObject = new File(dir);
var lm = dirObject.lastModified();
var dw = dirsWatched[dir];
if ( lm != dirsWatched[dir].lastModified ) {
dirsWatched[dir].lastModified = lm;
dirsWatched[dir].callback(dirObject);
exports.unwatchDir(dir, dw.callback);
//causes all files to be rewatched
if (dirObject.exists()) {
exports.watchDir(dir, dw.callback);
}
}
}
};
//guarantees that a callback is only called once for each change
function monitorDirAndFiles() {
fileWatcher ();
dirWatcher ();
setTimeout( monitorDirAndFiles, 3000 );
};
setTimeout( monitorDirAndFiles, 3000 );