UNPKG

sniper

Version:

Renders snippets on demand

121 lines (107 loc) 2.98 kB
var union = require('union'); var director = require('director'); var ecstatic = require('ecstatic'); var router = new director.http.Router(); var path = require('path'); var join = path.join; var favicon = require('serve-favicon'); var EventEmitter = require('events').EventEmitter; var Minilog = require('minilog'); var deepcopy = require('deepcopy'); var Routes = require('./routes'); var readConfig = require('./read_config'); module.exports = function(opts) { var dirname = opts.dirname || __dirname; var self = this; this.port = opts.port || 9090; this.rootURL = process.env.SNIPER_ROOTURL || "/"; var filename = join(dirname, opts.config); var dirOpts = { dirname: dirname, filename: filename }; var log = Minilog("index"); this.evt = new EventEmitter(); // init the server this.parsed = readConfig(dirOpts); if (!this.parsed) { console.log("see https://github.com/biojs/biojs-sniper for more help"); process.exit(1); } var errorHandler = function(err, req, res) { res.statusCode = err.status; if (err.status === 404) { console.log("404: ", req.url); } else { console.log(err); } res.end(); }; // reload the config on every request function refreshMiddleware(req, res) { console.log("url", req.url); try { var newParsed = readConfig(dirOpts); if (JSON.stringify(self.parsed) !== JSON.stringify(newParsed)) { self.parsed = deepcopy(newParsed); self.evt.emit("config:update", newParsed); } res.emit('next'); return true; } catch (err) { res.writeHead(400); console.warn(err.stack); res.end('Invalid package.json'); return false; } } var options = { onError: errorHandler, before: [ favicon(__dirname + '/../favicon.ico'), function(req, res) { var found = router.dispatch(req, res); if (!found) { res.emit('next'); } }, /* function(req, res, next) { // removes all trailing slashes if (req.url.substr(-1) === '/' && req.url.length > 1) { res.writeHead(301, { location: req.url.slice(0, -1) }); res.end(); } else { next(); } }, */ refreshMiddleware, ecstatic({ baseDir: this.rootURL, root: dirname, showDir: true, }) ] }; // init the server this.server = union.createServer(options); this.server.on("error", function(err) { if (err.code === "EADDRINUSE") { console.log(""); console.log("Another biojs-sniper is running. Terminate it or use -p to run on another port"); } else { console.log(err); } }); // init the routes this.routes = new Routes({ router: router, parsed: deepcopy(self.parsed), evt: self.evt, dirOpts: dirOpts, templates: opts.templates, rootURL: this.rootURL }); this.server.listen(this.port); };