UNPKG

ss-localconfigs

Version:

load and apply per app configuration from client/code/<apps>/socketstream.json

90 lines (77 loc) 2.04 kB
/** * 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;