diff --git a/lib/config.js b/lib/config.js index d2cbb49..f1802de 100644 --- a/lib/config.js +++ b/lib/config.js @@ -80,6 +80,10 @@ module.exports = function (options) { configStore.set('dbAuth', config.db.auth) } + if (!config.db.auth) { + throw new Error('Authentication details missing from database URL') + } + if (!config.db.password) { config.db.password = config.db.auth.split(':')[1] } diff --git a/lib/hapi/index.js b/lib/hapi/index.js index 7750eae..9c61a37 100644 --- a/lib/hapi/index.js +++ b/lib/hapi/index.js @@ -1,6 +1,15 @@ +var url = require('url') + +var _ = require('lodash') + var plugins = [require('inert'), require('h2o2')] module.exports = function (env_config) { + var defaultOpts = { + couchdb: url.format(_.omit(env_config.db, 'auth')), + prefix: '/hoodie/account' + } + return plugins.concat([ require('./api'), require('./directories'), @@ -13,5 +22,19 @@ module.exports = function (env_config) { app: env_config } } - })) + }), [{ + register: require('hapi-couchdb-store/lib/routes/couchdb-proxy'), + options: _.defaults({prefix: '/hoodie/store'}, defaultOpts) + }, { + register: require('hapi-couchdb-account/lib/routes/session'), + options: defaultOpts + }, { + register: require('hapi-couchdb-account/lib/routes/account'), + options: defaultOpts + }], + _(env_config) + .values() + .pluck('hooks.hapi') + .compact() + .value()) } diff --git a/lib/index.js b/lib/index.js index 63995f9..9e70129 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,70 +1,44 @@ -var url = require('url') - var _ = require('lodash') +var async = require('async') +var hapi = require('hapi') var log = require('npmlog') -var exports = module.exports = function (options, callback) { +module.exports = function (options, callback) { 'use strict' - var env_config = require('./config')(options) - log.level = options.loglevel || 'warn' - if (!env_config.db.auth) { - return callback(new Error('Authentication details missing from database URL')) - } + var env_config - exports.init(env_config, callback) -} - -exports.init = function (env_config, callback) { - var async = require('async') - var hapi = require('hapi') + try { + env_config = require('./config')(options) + } catch (err) { + return callback(err) + } - var options = {} - _.set(options, 'connections.routes.payload.maxBytes', 1048576 * 10) // 10 MB + var serverOptions = {} + _.set(serverOptions, 'connections.routes.payload.maxBytes', 1048576 * 10) // 10 MB - var server = new hapi.Server(options) + var server = new hapi.Server(serverOptions) async.applyEachSeries([ require('./database/start'), require('./database/install'), require('./bundle'), - require('./plugins'), - async.apply(exports.configureServer, server) + require('./plugins') ], env_config, function (err) { if (err) return callback(err) - callback(null, server, env_config) - }) -} - -exports.configureServer = function (server, env_config, callback) { - server.connection({ - port: env_config.app.port - }) + server.connection({ + port: env_config.app.port + }) - log.silly('hapi', 'Registering internal plugins') - var defaultOpts = { - couchdb: url.format(_.omit(env_config.db, 'auth')), - prefix: '/hoodie/account' - } - - var hoodieClient = [{ - register: require('hapi-couchdb-store/lib/routes/couchdb-proxy'), - options: _.defaults({prefix: '/hoodie/store'}, defaultOpts) - }, { - register: require('hapi-couchdb-account/lib/routes/session'), - options: defaultOpts - }, { - register: require('hapi-couchdb-account/lib/routes/account'), - options: defaultOpts - }] - - server.register(require('./hapi')(env_config).concat(hoodieClient), function (err) { - if (err) return callback(err) + log.silly('hapi', 'Registering internal plugins') + server.register(require('./hapi')(env_config), function (err) { + if (err) return callback(err) - log.verbose('hapi', 'Registerd internal plugins') - server.register(_.compact(_.pluck(_.values(env_config.plugins), 'hooks.hapi')), callback) + log.verbose('hapi', 'Registerd internal plugins') + callback(null, server, env_config) + }) }) } diff --git a/test/integration/security.js b/test/integration/security.js index e1e26ca..6a0cc9f 100644 --- a/test/integration/security.js +++ b/test/integration/security.js @@ -8,8 +8,7 @@ var rimraf = require('rimraf') var tap = require('tap') var test = tap.test -var app = require('../../lib/index') -var config = require('../../lib/config') +var app = require('../../lib') var startServerTest = require('./lib/start-server-test') @@ -37,16 +36,16 @@ startServerTest(test, 'block _all_dbs', function (t, env_config, end) { t.test('check config dbs are private to admin', function (tt) { var projectDir = path.resolve(__dirname, './lib/fixtures/project1') - var env_config = config({ + var options = { inMemory: true, id: 'hoodie-test-fixture', path: projectDir, adminPassword: 'testing' - }) + } async.waterfall([ - async.apply(rimraf, env_config.paths.data), - async.apply(app.init, env_config), + async.apply(rimraf, path.join(projectDir, 'data')), + async.apply(app, options), function (server, env_config, cb) { server.start(cb) },