diff options
author | Samy Pessé <samypesse@gmail.com> | 2015-01-24 11:23:53 +0100 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2015-01-24 11:23:53 +0100 |
commit | 2efd234824c8ec0a87bd20f807867b16cf169ecc (patch) | |
tree | d634e72c4a3a96c8f1d9fdb22b62f605c0a0fff0 /lib/utils | |
parent | 8be4304b5c7bc0d4a3043ea5cfbedb0057b678ef (diff) | |
download | gitbook-2efd234824c8ec0a87bd20f807867b16cf169ecc.zip gitbook-2efd234824c8ec0a87bd20f807867b16cf169ecc.tar.gz gitbook-2efd234824c8ec0a87bd20f807867b16cf169ecc.tar.bz2 |
Complete serve command
Diffstat (limited to 'lib/utils')
-rw-r--r-- | lib/utils/server.js | 96 | ||||
-rw-r--r-- | lib/utils/string.js | 3 | ||||
-rw-r--r-- | lib/utils/watch.js | 27 |
3 files changed, 125 insertions, 1 deletions
diff --git a/lib/utils/server.js b/lib/utils/server.js new file mode 100644 index 0000000..2b97fe8 --- /dev/null +++ b/lib/utils/server.js @@ -0,0 +1,96 @@ +var Q = require('q'); +var _ = require('lodash'); + +var events = require('events'); +var http = require('http'); +var send = require('send'); +var util = require('util'); +var url = require('url'); + +var Server = function() { + this.running = null; + this.dir = null; + this.port = 0; + this.sockets = []; +}; +util.inherits(Server, events.EventEmitter); + +// Return true if the server is running +Server.prototype.isRunning = function() { + return this.running != null; +}; + +// Stop the server +Server.prototype.stop = function() { + var that = this; + if (!this.isRunning()) return Q(); + + var d = Q.defer(); + this.running.close(function(err) { + that.running = null; + that.emit("state", false); + + if (err) d.reject(err); + else d.resolve(); + }); + + for (var i = 0; i < this.sockets.length; i++) { + this.sockets[i].destroy(); + } + + return d.promise; +}; + +Server.prototype.start = function(dir, port) { + var that = this, pre = Q(); + port = port || 8004; + + if (that.isRunning()) pre = this.stop(); + return pre + .then(function() { + var d = Q.defer(); + + that.running = http.createServer(function(req, res){ + // Render error + function error(err) { + res.statusCode = err.status || 500; + res.end(err.message); + } + + // Redirect to directory's index.html + function redirect() { + res.statusCode = 301; + res.setHeader('Location', req.url + '/'); + res.end('Redirecting to ' + req.url + '/'); + } + + // Send file + send(req, url.parse(req.url).pathname) + .root(dir) + .on('error', error) + .on('directory', redirect) + .pipe(res); + }); + + that.running.on('connection', function (socket) { + that.sockets.push(socket); + socket.setTimeout(4000); + socket.on('close', function () { + that.sockets.splice(that.sockets.indexOf(socket), 1); + }); + }); + + that.running.listen(port, function(err) { + if (err) return d.reject(err); + + that.port = port; + that.dir = dir; + that.emit("state", true); + d.resolve(); + }); + + return d.promise; + }); +} + +module.exports = Server; diff --git a/lib/utils/string.js b/lib/utils/string.js index 54c4c66..72a9ca0 100644 --- a/lib/utils/string.js +++ b/lib/utils/string.js @@ -22,5 +22,6 @@ function optionsToShellArgs(options) { module.exports = { escapeShellArg: escapeShellArg, - optionsToShellArgs: optionsToShellArgs + optionsToShellArgs: optionsToShellArgs, + toLowerCase: String.prototype.toLowerCase.call.bind(String.prototype.toLowerCase) }; diff --git a/lib/utils/watch.js b/lib/utils/watch.js new file mode 100644 index 0000000..715179d --- /dev/null +++ b/lib/utils/watch.js @@ -0,0 +1,27 @@ +var Q = require('q'); +var path = require('path'); +var Gaze = require('gaze').Gaze; + +function watch(dir) { + var d = Q.defer(); + dir = path.resolve(dir); + + var gaze = new Gaze("**/*.md", { + cwd: dir + }); + + gaze.once("all", function(e, filepath) { + gaze.close(); + + d.resolve(filepath); + }); + gaze.once("error", function(err) { + gaze.close(); + + d.reject(err); + }); + + return d.promise; +} + +module.exports = watch; |