var http = require('http'); var fs = require('fs'); var uglify = require('uglify-js'); var winston = require('winston'); var connect = require('connect'); var route = require('connect-route'); var connect_st = require('st'); var DocumentHandler = require('./lib/document_handler'); // Load the configuration and set some defaults var config = JSON.parse(fs.readFileSync('./config.js', 'utf8')); config.port = process.env.PORT || config.port || 7777; config.host = process.env.HOST || config.host || 'localhost'; // Set up the logger if (config.logging) { try { winston.remove(winston.transports.Console); } catch(e) { /* was not present */ } var detail, type; for (var i = 0; i < config.logging.length; i++) { detail = config.logging[i]; type = detail.type; delete detail.type; winston.add(winston.transports[type], detail); } } var Store = require('./lib/document_store'); store = new Store(); // Compress the static javascript assets if (config.recompressStaticAssets) { var list = fs.readdirSync('./static'); for (var j = 0; j < list.length; j++) { var item = list[j]; if ((item.indexOf('.js') === item.length - 3) && (item.indexOf('.min.js') === -1)) { var dest = item.substring(0, item.length - 3) + '.min' + item.substring(item.length - 3); var orig_code = fs.readFileSync('./static/' + item, 'utf8'); fs.writeFileSync('./static/' + dest, uglify.minify(orig_code).code, 'utf8'); winston.info('compressed ' + item + ' into ' + dest); } } } // Pick up a key generator var KeyGenerator = require('./lib/key_generator'); var keyGenerator = new KeyGenerator(); // Configure the document handler var documentHandler = new DocumentHandler({ store: store, maxLength: config.maxLength, keyLength: config.keyLength, keyGenerator: keyGenerator }); var app = connect(); // first look at API calls app.use(route(function(router) { // get raw documents - support getting with extension router.get('/raw/:id', function(request, response) { var key = request.params.id.split('.')[0]; return documentHandler.handleRawGet(key, response); }); // add documents router.post('/documents', function(request, response) { return documentHandler.handlePost(request, response); }); // get documents router.get('/documents/:id', function(request, response) { var key = request.params.id.split('.')[0]; return documentHandler.handleGet(key, response); }); })); // Otherwise, try to match static files app.use(connect_st({ path: __dirname + '/static', content: { maxAge: config.staticMaxAge }, passthrough: true, index: false })); // Then we can loop back - and everything else should be a token, // so route it back to / app.use(route(function(router) { router.get('/:id', function(request, response, next) { request.sturl = '/'; next(); }); })); // And match index app.use(connect_st({ path: __dirname + '/static', content: { maxAge: config.staticMaxAge }, index: 'index.html' })); http.createServer(app).listen(config.port, config.host); winston.info('listening on ' + config.host + ':' + config.port);