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.
This commit is contained in:
XeonCore 2014-10-12 19:30:22 +11:00
parent 0ba67481fb
commit 8a61e4e969
1 changed files with 88 additions and 30 deletions

View File

@ -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);
});
};