Browse Source

make sure to call each plugin handler in the context of the plugin instance

master
Brett Langdon 12 years ago
parent
commit
3ef217fdfd
3 changed files with 25 additions and 13 deletions
  1. +10
    -4
      lib/server.js
  2. +11
    -7
      test/server.registerPlugins.js
  3. +4
    -2
      test/server.rootHandler.js

+ 10
- 4
lib/server.js View File

@ -5,7 +5,8 @@ var yaps_plugin = require("./plugin.js");
var handler_chain = function(handlers, request, server, response, not_found){ var handler_chain = function(handlers, request, server, response, not_found){
if(handlers.length){ if(handlers.length){
handlers[0](request, server, function(status, body){
var plugin = server.enabledPlugins[0][1];
handlers[0][0].call(plugin, request, server, function(status, body){
if(status === null || status === undefined){ if(status === null || status === undefined){
handler_chain(handlers.slice(1), request, server, response, not_found); handler_chain(handlers.slice(1), request, server, response, not_found);
} else{ } else{
@ -89,18 +90,23 @@ server.prototype.registerPlugin = function(plugin_constructor){
util._extend(new_plugin.prototype, plugin_constructor.prototype); util._extend(new_plugin.prototype, plugin_constructor.prototype);
var plugin = new new_plugin(this.settings); var plugin = new new_plugin(this.settings);
this.enabledPlugins.push(plugin); this.enabledPlugins.push(plugin);
var position = this.enabledPlugins.length - 1;
for(var method in plugin.routes){ for(var method in plugin.routes){
this.routes[method] = this.routes[method] || {}; this.routes[method] = this.routes[method] || {};
for(var route in plugin.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] || [];
this.routes[method][route] = this.routes[method][route].concat(plugin.routes[method][route]);
for(var i in plugin.routes[method][route]){
this.routes[method][route].push([plugin.routes[method][route][i], position]);
}
} }
} }
if(plugin.notFound){ if(plugin.notFound){
this.notFound.push(plugin.notFound);
this.notFound.push([plugin.notFound, position]);
} }
if(plugin.setup && plugin.setup.length){ if(plugin.setup && plugin.setup.length){
this.setup = this.setup.concat(plugin.setup);
for(var i in plugin.setup){
this.setup.push([plugin.setup[i], position]);
}
} }
}; };


+ 11
- 7
test/server.registerPlugins.js View File

@ -41,8 +41,8 @@ suite("Server.RegisterPlugin", function(){
assert.ok(server.routes.GET); assert.ok(server.routes.GET);
assert.ok(server.routes.TEST); assert.ok(server.routes.TEST);
assert.deepEqual(server.routes.GET["/test"], ["handler_1", "handler_2"]);
assert.deepEqual(server.routes.TEST["/test"], ["handler_3", "handler_4"]);
assert.deepEqual(server.routes.GET["/test"], [["handler_1", 0], ["handler_2", 0]]);
assert.deepEqual(server.routes.TEST["/test"], [["handler_3", 0], ["handler_4", 0]]);
}); });
test("should transfer routes from multiple plugins without overwriting any", function(){ test("should transfer routes from multiple plugins without overwriting any", function(){
@ -72,7 +72,9 @@ suite("Server.RegisterPlugin", function(){
server.registerPlugin(plugin_2); server.registerPlugin(plugin_2);
assert.ok(server.routes.GET); assert.ok(server.routes.GET);
assert.deepEqual(server.routes.GET["/test"], ["handler_1", "handler_2", "handler_3", "handler_4"]);
assert.deepEqual(server.routes.GET["/test"], [
["handler_1", 0], ["handler_2", 0], ["handler_3", 1], ["handler_4", 1]
]);
}); });
test("should append plugins notFound to server", function(){ test("should append plugins notFound to server", function(){
@ -81,7 +83,7 @@ suite("Server.RegisterPlugin", function(){
}; };
var server = new yaps.server(); var server = new yaps.server();
server.registerPlugin(plugin); server.registerPlugin(plugin);
assert.deepEqual(server.notFound, ["handler"]);
assert.deepEqual(server.notFound, [["handler", 0]]);
}); });
test("should append notFound from multiple plugins", function(){ test("should append notFound from multiple plugins", function(){
@ -95,7 +97,7 @@ suite("Server.RegisterPlugin", function(){
var server = new yaps.server(); var server = new yaps.server();
server.registerPlugin(plugin_1); server.registerPlugin(plugin_1);
server.registerPlugin(plugin_2); server.registerPlugin(plugin_2);
assert.deepEqual(server.notFound, ["handler_1", "handler_2"]);
assert.deepEqual(server.notFound, [["handler_1", 0], ["handler_2", 1]]);
}); });
test("should append plugins setup to server", function(){ test("should append plugins setup to server", function(){
@ -104,7 +106,7 @@ suite("Server.RegisterPlugin", function(){
}; };
var server = new yaps.server(); var server = new yaps.server();
server.registerPlugin(plugin); server.registerPlugin(plugin);
assert.deepEqual(server.setup, ["handler_1", "handler_2"]);
assert.deepEqual(server.setup, [["handler_1", 0], ["handler_2", 0]]);
}); });
test("should append setup from multiple plugins", function(){ test("should append setup from multiple plugins", function(){
@ -117,6 +119,8 @@ suite("Server.RegisterPlugin", function(){
var server = new yaps.server(); var server = new yaps.server();
server.registerPlugin(plugin_1); server.registerPlugin(plugin_1);
server.registerPlugin(plugin_2); server.registerPlugin(plugin_2);
assert.deepEqual(server.setup, ["handler_1", "handler_2", "handler_3", "handler_4"]);
assert.deepEqual(server.setup, [
["handler_1", 0], ["handler_2", 0], ["handler_3", 1], ["handler_4", 1]
]);
}); });
}); });

+ 4
- 2
test/server.rootHandler.js View File

@ -51,9 +51,10 @@ suite("Server.RootHandler", function(){
}); });
var server = new yaps.server(); var server = new yaps.server();
server.enabledPlugins = [{}];
server.routes.GET = { server.routes.GET = {
"/test": [ "/test": [
handler_spy,
[handler_spy, 0],
] ]
}; };
@ -113,9 +114,10 @@ suite("Server.RootHandler", function(){
}); });
var server = new yaps.server(); var server = new yaps.server();
server.enabledPlugins = [{}];
server.routes.GET = { server.routes.GET = {
"/test": [ "/test": [
handler_spy,
[handler_spy, 0],
] ]
}; };


Loading…
Cancel
Save