ss-localconfigs
Version:
load and apply per app configuration from client/code/<apps>/socketstream.json
90 lines (77 loc) • 2.04 kB
JavaScript
/**
* Fetch configurations locally
*/
var _ = require('underscore');
var Error = require('errno-codes');
var fs = require('fs');
var path = require('path');
var catchExcept = function(fn, error) {
try {
return fn();
} catch(err) {
if(err.errno == error.errno) {
return false;
} else {
throw err;
}
}
}
var isFileSync = function(filename) {
return catchExcept( function() {
return fs.statSync(filename).isFile();
}, Error.ENOENT);
}
var isDirectorySync = function(filename) {
return catchExcept(function() {
return fs.statSync(filename).isDirectory();
}, Error.ENOENT)
}
var debug = function(h) {
console.log(h);
return h;
}
var postfixFilename = function(file, dir) {
return path.join(dir, file);
}
var fillNameRoute = function(app) {
var dirname = path.basename(path.dirname(app[0]));
if(!app[1].name) {
app[1].name = dirname;
}
if(!app[1].route) {
app[1].route = '/' + dirname;
}
return app[1];
}
var getConfigurations = function(directory, filename) {
var configFiles = _.chain(fs.readdirSync(directory))
.map(path.join.bind(null, directory))
.filter(isDirectorySync)
.compact()
.map(postfixFilename.bind(null, filename))
.filter(isFileSync)
.compact()
.value();
var configs = _.chain(configFiles)
.map(function(name) {
// map also passing a second parameter that we get rid of
// otherwise readFileSync will interpret as the encoding
// parameter...
return fs.readFileSync(name);
})
.map(JSON.parse)
.value();
return _.map(_.zip(configFiles, configs), fillNameRoute);
}
function defineApp(ss, config) {
console.log('adding ' + config.name + ' at ' + config.route);
ss.client.define(config.name, config);
ss.http.route(config.route, function(req, res) {
res.serveClient(config.name);
});
}
function applyConfigs(ss, dir, filename) {
_.chain(getConfigurations(dir, filename))
.map(defineApp.bind(null, ss));
}
exports.applyConfigs = applyConfigs;