Skip to content

Instantly share code, notes, and snippets.

@TimBeyer
Forked from dazld/index.js
Created September 10, 2013 10:06
Show Gist options
  • Save TimBeyer/6507399 to your computer and use it in GitHub Desktop.
Save TimBeyer/6507399 to your computer and use it in GitHub Desktop.
'use strict';
var assert = require('assert'),
director = require('director'),
EventEmitter = require('events').EventEmitter,
ns,// = require('continuation-local-storage').createNamespace('testing'),
express = require('express'),
app = express(),
domain = require('domain');
var domainStorage = (function () {
var id = 0;
var storage = {};
return {
run: function (func) {
var currDomain = domain.create();
currDomain.run(function () {
var currId = id;
process.domain.id = currId;
storage[currId] = {};
id++;
func();
});
},
set: function (key, value) {
storage[process.domain.id][key] = value;
},
get: function (key) {
return storage[process.domain.id][key];
}
};
}());
ns = domainStorage;
/*
* CONSTANTS
*/
var NUM_TESTS = 1000;
function createRouter() {
var emitter = new EventEmitter(),
router = new director.http.Router();
var createHandler = function() {
return function() {
assert(ns.get('req'), "req propagated to Router handler");
emitter.emit('routeMatched', ns.get('req').someId);
};
};
var ret = {
_createHandler: createHandler,
initialize: function() {
router.on('get', '/page/:id', ret._createHandler( /* route, routeFunction */ ));
},
on: emitter.on.bind(emitter),
once: emitter.once.bind(emitter),
dispatch: function(req, res) {
assert(ns.get('req'), "req propagated to Router dispatch");
router.dispatch(req, res, function(err) {
console.log(err);
});
}
};
return ret;
}
var router = createRouter();
router.initialize();
// use a real req object from express
app.use(function(req, res, next) {
ns.run(function() {
req.someId = Math.floor(Math.random() * Date.now());
ns.set('someId', req.someId);
next();
});
});
app.use(function(req, res, next) {
ns.set('req', req);
ns.set('res', res);
router.dispatch(req, res, function() {
next();
});
})
app.listen(4567);
// fake request test
function spawnAsync(i) {
var req = {
url: '/page/' + i,
method: 'get',
someId: Math.floor(Math.random() * Date.now()),
headers: {
'content-type': 'text/html'
}
};
ns.set('req', req);
process.nextTick(router.dispatch.bind(router, req));
}
router.on('routeMatched', function(id) {
assert(id, "id passed to routeMatched listener");
assert(ns.get('req'), "req propagated to routeMatched listener");
assert.equal(id, ns.get('req').someId, "passed id and req.someId match");
console.log('ok');
});
// actually do the thing
for (var i = 0; i < NUM_TESTS; i++) ns.run(spawnAsync.bind(null, i));
{
"name": "clsbughunt",
"dependencies": {
"continuation-local-storage": "~2.1.1",
"director": "~1.2.0",
"express": "~3.4.0"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment