hinoki
Version:
sane, simple dependency injection and more
97 lines (83 loc) • 2.15 kB
JavaScript
var hinoki = require('hinoki');
var Promise = require('bluebird');
////////////////////////////////////////////////////////////////////////////////
// process lifetime
processLifetime = {};
processLifetime.values = {
env: {
IS_ADMIN_REQUIRED: 'true'
}
};
processLifetime.factories = {
configIsAdminRequired: function(env) {
return env.IS_ADMIN_REQUIRED === 'true'
},
isUserAdminWhereId: function() {
return function(userId) {
// would usually depend on the database connection and access the database...
return Promise.delay(userId === 8000, 100);
};
}
};
////////////////////////////////////////////////////////////////////////////////
// request lifetime
// assume this to be created for every request
requestLifetime = {};
requestLifetime.values = {
// assume this is a nodejs request object
req: {
url: '/protected',
session: {
userId: 9000
}
},
// assume this is a nodejs response object
res: {
write: function(string) {
console.log('req.write:', string);
},
end: function() {
console.log('req.end');
}
}
};
requestLifetime.factories = {
url: function(req) {
return req.url;
},
session: function(req) {
return req.session;
},
currentUserId: function(session) {
return session.userId;
},
isCurrentUserAdmin: function(isUserAdminWhereId, currentUserId) {
return isUserAdminWhereId(currentUserId);
},
sendForbidden: function(res) {
return function() {
res.statusCode = 403;
res.write('Forbidden');
res.end();
}
}
};
////////////////////////////////////////////////////////////////////////////////
// injection
var lifetimes = [
requestLifetime,
processLifetime
];
var factory = function(
url,
isCurrentUserAdmin,
sendForbidden,
configIsAdminRequired
) {
if (url === '/protected' && !isCurrentUserAdmin && configIsAdminRequired) {
sendForbidden();
}
console.log('processLifetime.values', processLifetime.values);
console.log('requestLifetime.values', requestLifetime.values);
};
hinoki(lifetimes, hinoki.parseFunctionArguments(factory)).spread(factory);