Skip to content

Commit

Permalink
added end proxy this fixes #3
Browse files Browse the repository at this point in the history
  • Loading branch information
Jhorlin committed Oct 15, 2015
1 parent f10073e commit 22bbf21
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 17 deletions.
20 changes: 20 additions & 0 deletions lib/conductor.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,24 @@
return exports.extend(express());
}

function responseEnd (req, res, next){
var end = res.end,
ended = false;
res.end = function(){
ended = true;
end.apply(res, arguments);
};
if('composerResponding' in res){
return next();
}
Object.defineProperty(res, 'composerResponding', {
get: function () {
return ended;
}
});
next();
}

/**
* Extends an express app if it was not created with express-compose
* @example
Expand All @@ -53,6 +71,8 @@
*/
exports.extend = function extend (app) {
mixin(app, appProto);
//set up end so composer knows exactly when a request is done
app.use(responseEnd);
return app;
}

Expand Down
25 changes: 13 additions & 12 deletions lib/handler.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
var Promise = require('bluebird'),
util = require('util');

function HeadersSent () {
function Responding () {
};

var noop = function () {
Expand All @@ -29,26 +29,27 @@
var scope = req.expressComposerScopeCache.get(scopeProvider.key);

Promise.each(handlers, function (handler) {
if (res.headersSent) {
return Promise.reject(new HeadersSent());
if (res.composerResponding) {
return Promise.reject(new Responding());
}
return (handler.length <= 2 ?
Promise.resolve(handler.call(scope, req, res))
:
Promise.promisify(handler).call(scope, req, res))
.then(function (result) {
if (handler.name && result !== undefined && !res.headersSent) {
if (handler.name && result !== undefined && !res.composerResponding) {
scope.addResult(handler.name, result)
}
})
}).then(function () {
if (!res.headersSent) {
if (!res.composerResponding) {
next();
}
})
.catch(HeadersSent, noop)
//if a response has been sent don't do anything
.catch(Responding, noop)
.catch(function (err) {
if (!res.headersSent) {
if (!res.composerResponding) {
next(err);
}
})
Expand All @@ -66,25 +67,25 @@
var scope = req.expressComposerScopeCache.get(scopeProvider.key);

return Promise.each(handlers, function (handler) {
if (res.headersSent) {
return Promise.reject(new HeadersSent());
if (res.composerResponding) {
return Promise.reject(new Responding());
}
return (handler.length <= 3 ?
Promise.try(handler.bind(scope, err, req, res))
:
Promise.promisify(handler).call(scope, err, req, res))
.then(function (result) {
if (handler.name && result !== undefined && !res.headersSent) {
if (handler.name && result !== undefined && !res.composerResponding) {
scope.addError(handler.name, result)
}
}, noop)

}).then(function () {
if (!res.headersSent) {
if (!res.composerResponding) {
next(err);
}
})
.catch(HeadersSent, noop)
.catch(Responding, noop)
};
},
/**
Expand Down
7 changes: 2 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "express-composer",
"version": "1.0.1",
"version": "1.0.2",
"description": "A composition library to help organize your express routes and handlers",
"main": "index.js",
"scripts": {
Expand Down Expand Up @@ -46,9 +46,6 @@
"run-sequence": "^1.1.4",
"supertest-as-promised": "^2.0.2"
},
"peerDependencies": {
"express": ">4.0.0"
},
"dependencies": {
"async-require": "^1.2.1",
"bluebird": "^2.10.2",
Expand All @@ -59,6 +56,6 @@
"node-uuid": "^1.4.3",
"supertest": "^1.1.0",
"utils-merge": "^1.0.0",
"vhost": "^3.0.1"
"vhost": "^3.0.2"
}
}

0 comments on commit 22bbf21

Please sign in to comment.