@nzz/q-server
Version:
__Q__ is a system that lets journalists create visual elements for stories. It is developed by [NZZ Storytelling](https://www.nzz.ch/storytelling) and used in the [NZZ](https://www.nzz.ch) newsroom.
112 lines (91 loc) • 2.96 kB
JavaScript
const Hoek = require('hoek');
const Hapi = require('hapi');
const getServer = require('./server.js').getServer;
const setServer = require('./server.js').setServer;
const connectDb = require('./db.js').connect;
const defaults = {
misc: require('./defaults/misc.js')
}
const defaultOptions = {
cache: [
{
name: 'memoryCache',
engine: require('catbox-memory'),
options: {
maxByteSize: 150000000
}
}
]
}
module.exports.init = async function(options = {hapi: {}, config: {}}, callbacks) {
let hapiOptions = Object.assign(
defaultOptions,
options.hapi,
{
app: options.config
}
);
let server = new Hapi.Server(hapiOptions);
setServer(server);
connectDb(server.settings.app.misc.get('/db'));
server.connection({
port: options.config.misc.get('/port'),
routes: {
cors: {
headers: ["Accept", "Authorization", "Content-Type", "If-None-Match", "Accept-language"]
}
}
});
if (typeof callbacks === 'object' && callbacks['onBeforePlugins']) {
await callbacks['onBeforePlugins'](server)
}
let plugins = require('./server-plugins');
// if couchdb-cookie-auth-strategy is enabled, we load the required plugin
const couchdbCookieStrategy = options.config.misc.get('/authStrategy/couchdb_cookie');
if (couchdbCookieStrategy) {
plugins = plugins.concat(require('./auth/couchdb-cookie/plugins'));
}
// add good logging if configured
const loggingConfig = Object.assign(defaults.misc.get('/logging'), options.config.misc.get('/logging'));
if (loggingConfig.good && loggingConfig.good.options) {
plugins = plugins.concat({
register: require('good'),
options: loggingConfig.good.options
})
}
if (server.settings.plugins && server.settings.plugins.hasOwnProperty('q-screenshot')) {
plugins = plugins.concat(require('./plugins/q-screenshot/index.js'));
}
server.register(plugins, async (err) => {
try {
Hoek.assert(!err, err);
if (typeof callbacks === 'object' && callbacks['onBeforeRoutes']) {
await callbacks['onBeforeRoutes'](server)
}
// register the auth strategy if any
if (couchdbCookieStrategy) {
require('./auth/couchdb-cookie/strategy');
require('./auth/couchdb-cookie/state');
server.route(require('./auth/couchdb-cookie/routes'));
}
let routes = require('./routes/routes').getRoutes();
server.route(routes);
if (typeof callbacks === 'object' && callbacks['onAfterRoutes']) {
await callbacks['onAfterRoutes'](server)
}
} catch (e) {
console.log(e);
process.exit(1);
}
});
}
module.exports.start = function(callback) {
let server = getServer();
server.start(() => {
server.log(['info'], `server running: ${server.info.uri}`);
console.log('server running: ', server.info.uri);
if (callback) {
callback(server.info);
}
})
}