From 8a61e4e969cff39def108f41796314719236329a Mon Sep 17 00:00:00 2001 From: XeonCore Date: Sun, 12 Oct 2014 19:30:22 +1100 Subject: [PATCH] Refactored Autoload Autoload now uses kernel events to watch files on disk. This greatly increases performance and reliability. Autoload will also watch user.json files for changes and reload the users data. --- src/clientManager.js | 118 ++++++++++++++++++++++++++++++++----------- 1 file changed, 88 insertions(+), 30 deletions(-) diff --git a/src/clientManager.js b/src/clientManager.js index 2f437969..9ef422ee 100644 --- a/src/clientManager.js +++ b/src/clientManager.js @@ -13,7 +13,7 @@ function ClientManager() { if(!/^win/.test(process.platform)) { process.on('SIGHUP', function() { console.log("Received 'SIGHUP'. Reloading Users."); - self.loadUsers(); + self.reloadUsers(); }); } } @@ -55,9 +55,35 @@ ClientManager.prototype.loadUser = function(name) { name, json )); - console.log( - "User '" + name + "' loaded." - ); + console.log("User '%s' loaded.", name); + } +}; + +ClientManager.prototype.reloadUsers = function() { + var users = this.getUsers(); + for (var i in users) { + this.reloadUser(users[i]); + } +}; + +ClientManager.prototype.reloadUser = function(name) { + var client = this.findClient(name); + if (client) { + try { + var json = fs.readFileSync( + Helper.HOME + "/users/" + name + "/user.json", + "utf-8" + ); + json = JSON.parse(json); + } catch(e) { + console.log(e); + return; + } + if (!json) { + return; + } + client.config = json; + console.log("User '%s' reloaded.", name); } }; @@ -117,34 +143,66 @@ ClientManager.prototype.removeUser = function(name) { return true; }; +ClientManager.prototype.watchUser = function(name) { + var self = this; + var client = this.findClient(name); + if(!client || client.watcher) { + return; + } + var path = Helper.HOME + "/users/" + client.name + "/user.json"; + var lastReload = Date.now(); + client.watcher = fs.watch(path, {persistent: false}, function(event, filename) { + switch (event) { + case "change": + // user.json modified + if(Date.now() - lastReload > 50) { + self.reloadUser(client.name); + lastReload = Date.now(); + } + break; + default: + break; + } + }); +}; + ClientManager.prototype.autoload = function(sockets) { var self = this; - var loaded = ["erming"]; - setInterval(function() { - var loaded = _.pluck( - self.clients, - "name" - ); - var added = _.difference(self.getUsers(), loaded); - _.each(added, function(name) { - self.loadUser(name); - }); - - var removed = _.difference(loaded, self.getUsers()); - _.each(removed, function(name) { - var client = _.find( - self.clients, { - name: name - } - ); - if (client) { - client.quit(); - self.clients = _.without(self.clients, client); - console.log( - "User '" + name + "' disconnected." - ); + // Listen to new users being added/removed + fs.watch(Helper.HOME + "/users/", { persistent: false }, function(event, filename) { + switch (event) { + case "rename": + if(filename === null) { + // User removed. + var removed = _(self.clients) + .pluck('name') + .difference(self.getUsers()) + .value(); + _.each(removed, function(name) { + var client = self.findClient(name); + if (client) { + client.quit(); + if(client.watcher) { + client.watcher.close(); + } + self.clients = _.without(self.clients, client); + console.log("User '%s' disconnected.", name); + } + }); + } else { + // User created. + self.loadUser(filename); + self.watchUser(filename); } - }); - }, 1000); + break; + default: + break; + } + }); + + // Listen to user modification + _.each(this.clients, function(client) { + self.watchUser(client.name); + }); };