the-shepherd
Version:
Control a herd of wild processes.
156 lines (138 loc) • 3.9 kB
JavaScript
// Generated by CoffeeScript 1.8.0
(function() {
var $, BasicAuth, Express, Helpers, Http, Opts, app, basicAuth, http_password, http_username, log, method, plain, server, _fn, _i, _len, _ref, _ref1, _ref2;
$ = require('bling');
Express = require('express');
BasicAuth = require("basic-auth");
Http = require('http');
Helpers = require('./helpers');
Opts = require("./opts");
log = $.logger("[http]");
app = Express();
http_username = (_ref = Opts.username) != null ? _ref : "demo";
http_password = (_ref1 = Opts.password) != null ? _ref1 : "demo";
plain = function(next) {
return basicAuth(http_username, http_password, function(req, res) {
res.contentType = "text/plain";
res.send = function(status, content, enc) {
var err;
if (enc == null) {
enc = "utf8";
}
res.statusCode = status;
try {
return res.end(content, enc);
} catch (_error) {
err = _error;
res.statusCode = 500;
return res.end(String(err), enc);
}
};
res.pass = function(content) {
return res.send(200, (function() {
switch ($.type(content)) {
case "string":
case "buffer":
return content;
case "object":
case "array":
case "bling":
return JSON.stringify(content, null, " ");
default:
return $.toRepr(content);
}
})());
};
res.fail = function(err) {
return res.send(500, (function() {
switch ($.type(err)) {
case "error":
return err.stack;
case "string":
case "buffer":
return err;
case "object":
case "array":
case "bling":
return JSON.stringify(err);
default:
return $.toRepr(content);
}
})());
};
return next(req, res);
});
};
basicAuth = function(user, pass, next) {
return function(req, res) {
var credentials;
credentials = BasicAuth(req);
if (!((credentials != null) && credentials.name === user && credentials.pass === pass)) {
res.writeHead(401, {
"WWW-Authenticate": 'Basic realm="shepherd"'
});
return res.end();
} else {
return next(req, res);
}
};
};
$.subscribe('http-route', function(method, path, handler) {
method = method.toLowerCase();
if (Opts.verbose) {
log("adding published route:", method, path);
}
return app[method].call(app, path, plain(handler));
});
server = Http.createServer(app);
$.extend(module.exports, {
listen: function(port) {
var p, _err;
try {
return p = $.Promise();
} finally {
try {
server.listen(port, function(err) {
if (err) {
return p.reject(err);
} else {
return p.resolve(port);
}
});
} catch (_error) {
_err = _error;
p.reject(_err);
}
}
},
close: function() {
var p, _err;
try {
return p = $.Promise();
} finally {
try {
server.close(function(err) {
if (err) {
return p.reject(err);
} else {
return p.resolve();
}
});
} catch (_error) {
_err = _error;
p.reject(_err);
}
}
}
});
_ref2 = ["get", "put", "post", "delete"];
_fn = function(method) {
return module.exports[method] = function(path, handler) {
return $.publish("http-route", method, path, handler);
};
};
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
method = _ref2[_i];
_fn(method);
}
}).call(this);