ip-city
Version:
Quick geolocation lookup from IP address
69 lines (58 loc) • 1.95 kB
JavaScript
var fs = require('fs'),
path = require('path'),
FSWatcher = {}
/**
* Takes a directory/file and watch for change. Upon change, call the
* callback.
*
* @param {String} name: name of this watcher
* @param {String} directory: path to the directory to watch
* @param {String} [filename]: (optional) specific filename to watch for,
* watches for all files in the directory if unspecified
* @param {Integer} cooldownDelay: delay to wait before triggering the callback
* @param {Function} callback: function () : called when changes are detected
**/
function makeFsWatchFilter(name, directory, filename, cooldownDelay, callback) {
var cooldownId = null
//Delete the cooldownId and callback the outer function
function timeoutCallback() {
cooldownId = null
callback()
}
//This function is called when there is a change in the data directory
//It sets a timer to wait for the change to be completed
function onWatchEvent(event, changedFile) {
var filePath = path.join(directory, changedFile)
if (!filename || filename === changedFile) {
if(!fs.existsSync(filePath)) return
//If a cooldownId already exists, we delete it
if (cooldownId !== null) {
clearTimeout(cooldownId)
cooldownId = null
}
//Once the cooldownDelay has passed, the timeoutCallback function will be called
cooldownId = setTimeout(timeoutCallback, cooldownDelay)
}
}
//Manage the case where filename is missing (because it's optionnal)
if (typeof cooldownDelay === 'function') {
callback = cooldownDelay
cooldownDelay = filename
filename = null
}
if (FSWatcher[name]) {
stopWatching(name)
}
FSWatcher[name] = fs.watch(directory, onWatchEvent)
}
/**
* Take a FSWatcher object and close it.
*
* @param {string} name: name of the watcher to close
*
**/
function stopWatching(name) {
FSWatcher[name].close()
}
module.exports.makeFsWatchFilter = makeFsWatchFilter
module.exports.stopWatching = stopWatching