diff --git a/src/lib/transport.js b/src/lib/transport.js index d20a02703..dc3062c0e 100644 --- a/src/lib/transport.js +++ b/src/lib/transport.js @@ -140,6 +140,10 @@ Transport.prototype.request = function (params, cb) { // determine the response based on the presense of a callback if (typeof cb === 'function') { + // handle callbacks within a domain + if (process.domain) { + cb = process.domain.bind(cb); + } ret = { abort: abortRequest }; diff --git a/test/unit/specs/transport.js b/test/unit/specs/transport.js index e00b03207..e4ff46511 100644 --- a/test/unit/specs/transport.js +++ b/test/unit/specs/transport.js @@ -670,6 +670,35 @@ describe('Transport Class', function () { }); }); + describe('handles process.domain', function () { + if (process && process.hasOwnProperty('domain')) { + it('works without a domain', function () { + expect(process.domain).to.be(null); + var tran = new Transport(); + shortCircuitRequest(tran); + tran.request({}, function(err, result, status) { + expect(process.domain).to.be(null); + }); + }); + + it('binds the callback to the correct domain', function () { + expect(process.domain).to.be(null); + var domain = require('domain').create(); + domain.run(function() { + var tran = new Transport(); + shortCircuitRequest(tran); + expect(process.domain).not.to.be(null); + var startingDomain = process.domain + tran.request({}, function(err, result, status) { + expect(process.domain).not.to.be(null); + expect(process.domain).to.be(startingDomain); + process.domain.exit(); + }); + }); + }); + } + }); + describe('aborting', function () { it('prevents the request from starting if called in the same tick', function () { var tran = new Transport({