qwebs
Version:
Back-end web server
137 lines (115 loc) • 3.87 kB
JavaScript
/*!
* qwebs
* Copyright(c) 2015 Benoît Claveau
* MIT Licensed
*/
;
var url = require("url"),
querystring = require("querystring"),
Get = require("./routes/get"),
Post = require("./routes/post"),
Delete = require("./routes/delete"),
Put = require("./routes/put"),
Asset = require("./routes/asset"),
DataError = require("./dataerror"),
Tree = require("./utils/tree"),
Q = require("q");
function Router ($qwebs) {
this.$qwebs = $qwebs;
this.getTree = new Tree();
this.postTree = new Tree();
this.deleteTree = new Tree();
this.putTree = new Tree();
this.assetTree = new Tree();
};
Router.prototype.load = function() {
var self = this;
self.getTree.forEachRouter(function(router){
router.load(self.$qwebs);
});
self.postTree.forEachRouter(function(router){
router.load(self.$qwebs);
});
self.putTree.forEachRouter(function(router){
router.load(self.$qwebs);
});
self.deleteTree.forEachRouter(function(router){
router.load(self.$qwebs);
});
};
Router.prototype.get = function(route) {
var item = new Get(this.$qwebs, route);
this.getTree.push(item);
return item;
};
Router.prototype.post = function(route) {
var item = new Post(this.$qwebs, route);
this.postTree.push(item);
return item;
};
Router.prototype.delete = function(route) {
var item = new Delete(this.$qwebs, route);
this.deleteTree.push(item);
return item;
};
Router.prototype.put = function(route) {
var item = new Put(this.$qwebs, route);
this.putTree.push(item);
return item;
};
Router.prototype.asset = function(asset) {
this.assetTree.push(asset);
return asset;
};
Router.prototype.assets = function(assets) {
for (var i in assets) {
var asset = assets[i];
if (!asset) throw new DataError({ message: "Asset is not defined." });
this.assetTree.push(asset);
};
return assets;
};
Router.prototype.leaf = function(request) {
var self = this;
switch(request.method)
{
case "GET":
var asset = self.assetTree.findOne(request.pathname);
if (asset) return asset;
return self.getTree.findOne(request.pathname);
case "POST":
return self.postTree.findOne(request.pathname);
case "PUT":
return self.putTree.findOne(request.pathname);
case "DELETE":
return self.deleteTree.findOne(request.pathname);
};
};
Router.prototype.invoke = function(request, response, overridenUrl) {
var self = this;
return Q.try(function () {
if(overridenUrl) request.url = overridenUrl;
var part = url.parse(request.url);
request.pathname = part.pathname;
request.query = querystring.parse(part.query) || {};
var leaf = self.leaf(request);
if (leaf) {
if (!self.$qwebs.loaded) {
var header = {
"Content-Type": "text/html",
"Retry-After": 30
};
throw new DataError({ statusCode: 503, message: "Server is loading.", data: request.url, header: header });
}
request.params = leaf.params;
return leaf.router.invoke(request, response);
}
else {
var header = {
"Content-Type": "text/html",
};
throw new DataError({ statusCode: 404, message: "Unknwon route.", data: request.url, header: header });
}
});
};
exports = module.exports = Router;