| @ -1,5 +1,114 @@ | |||||
| var server = function(settings){ | |||||
| var http = require("http"); | |||||
| var util = require("util"); | |||||
| var yaps_plugin = require("./plugin.js"); | |||||
| var handler_chain = function(handlers, request, server, response, not_found){ | |||||
| if(handlers.length){ | |||||
| handlers[0](request, server, function(status, body, headers){ | |||||
| if(status == null || status == undefined){ | |||||
| handler_chain(handlers.slice(1), request, server, response, not_found); | |||||
| } else{ | |||||
| response.writeHead(status, headers); | |||||
| response.end(body); | |||||
| } | |||||
| }); | |||||
| } else{ | |||||
| not_found(); | |||||
| } | |||||
| }; | |||||
| var server = function(settings, http_server){ | |||||
| this.settings = settings || {}; | this.settings = settings || {}; | ||||
| this.bind = this.settings["bind"] || "0.0.0.0:8000"; | |||||
| this.enabledPlugins = []; | |||||
| this.routes = {}; | |||||
| this.notFound = []; | |||||
| this.setup = []; | |||||
| // they gave us an http server, lets use that | |||||
| if(http_server != null || http_server != undefined){ | |||||
| this.server = http_server; | |||||
| } else{ | |||||
| this.server = new http.Server(); | |||||
| } | |||||
| this.server.yaps = this; | |||||
| }; | |||||
| server.prototype.rootHandler = function(request, response){ | |||||
| var self = this.yaps; | |||||
| var handlers = []; | |||||
| var method = request.method.toUpperCase(); | |||||
| for(var route in self.routes[method]){ | |||||
| if(!self.routes[method][route].length){ | |||||
| continue; | |||||
| } | |||||
| var pattern = new RegExp(route); | |||||
| if(pattern.test(request.url)){ | |||||
| handlers = handlers.concat(self.routes[method][route]); | |||||
| } | |||||
| } | |||||
| handlers = self.setup.concat(handlers); | |||||
| if(handlers.length){ | |||||
| handler_chain(handlers, request, self, response, function(){ | |||||
| handler_chain(self.notFound, request, self, response, function(){ | |||||
| response.writeHead(404); | |||||
| response.end("Not Found"); | |||||
| }); | |||||
| }); | |||||
| } else{ | |||||
| handler_chain(self.notFound, request, self, response, function(){ | |||||
| response.writeHead(404); | |||||
| response.end("Not Found"); | |||||
| }); | |||||
| } | |||||
| }; | |||||
| server.prototype.errorHandler = function(error){ | |||||
| console.log("Error:", error); | |||||
| }; | |||||
| server.prototype.registerPlugin = function(plugin_constructor){ | |||||
| util.inherits(plugin_constructor, yaps_plugin); | |||||
| var plugin = new plugin_constructor(this.settings); | |||||
| this.enabledPlugins.push(plugin); | |||||
| for(var method in plugin.routes){ | |||||
| this.routes[method] = this.routes[method] || {}; | |||||
| for(var route in plugin.routes[method]){ | |||||
| this.routes[method][route] = this.routes[method][route] || []; | |||||
| this.routes[method][route] = this.routes[method][route].concat(plugin.routes[method][route]); | |||||
| } | |||||
| } | |||||
| if(plugin.notFound){ | |||||
| this.notFound.push(plugin.notFound); | |||||
| } | |||||
| if(plugin.setup && plugin.setup.length){ | |||||
| this.setup = this.setup.concat(plugin.setup); | |||||
| } | |||||
| }; | |||||
| server.prototype.start = function(){ | |||||
| this.server.on("error", this.errorHandler); | |||||
| this.server.on("request", this.rootHandler); | |||||
| var bind_parts = [undefined, undefined]; | |||||
| if(this.bind.indexOf("unix://") == 0){ | |||||
| bind_parts[1] = this.bind; | |||||
| } else{ | |||||
| if(!~this.bind.indexOf(":")){ | |||||
| bind_parts = [this.bind, "0.0.0.0"]; | |||||
| } else{ | |||||
| bind_parts = this.bind.split(":"); | |||||
| } | |||||
| } | |||||
| this.server.listen(bind_parts[1], bind_parts[0]); | |||||
| }; | |||||
| server.prototype.stop = function(){ | |||||
| this.server.close(); | |||||
| }; | }; | ||||
| module.exports = server; | module.exports = server; | ||||