Skip to content

Instantly share code, notes, and snippets.

@aalimovs
Created June 22, 2017 17:28
Show Gist options
  • Save aalimovs/2d300178e815f2871f921f6fdc352e4b to your computer and use it in GitHub Desktop.
Save aalimovs/2d300178e815f2871f921f6fdc352e4b to your computer and use it in GitHub Desktop.
'use strict';
require('dotenv').config({ silent: true });
const Hapi = require('hapi');
const Assert = require('assert');
// Expect minimum env variables
Assert(process.env.NODE_ENV, 'expecting NODE_ENV');
// Create a server with a host and port
const server = new Hapi.Server({});
server.connection({
port: process.env.PORT || 3000,
routes: {
cors: true,
},
});
const options = {
sequelize: {
host: process.env.SEQUELIZE_HOST,
username: process.env.SEQUELIZE_USER,
password: process.env.SEQUELIZE_PASSWORD,
database: process.env.SEQUELIZE_DATABASE,
},
datadog: {
name: require('./../package.json').name,
},
rollbar: {
token: process.env.ROLLBAR_TOKEN,
codeVersion: require('./../package.json').version,
environment: require('./../package.json').name,
},
};
// Load plugins for all environments
const plugins = [
{ register: require('hapi-auth-jwt2') },
{ register: require('zeavo-hapi-jsonapi'), options: { links: false, meta: { version: require('../package.json').version } } },
{ register: require('zeavo-hapi-sequelize'), options: options.sequelize },
{ register: require('./routes') },
];
// Avoid error/logging/metrics in test env
if (process.env.NODE_ENV !== 'test') {
plugins.push({ register: require('zeavo-hapi-good'), options: { name: require('../package.json').name } });
}
// Rollbar is optional unless in production. Always excluded from test
if ((process.env.ROLLBAR_TOKEN || process.env.NODE_ENV === 'production') && process.env.NODE_ENV !== 'test') {
plugins.push({ register: require('zeavo-hapi-rollbar'), options: options.rollbar });
}
// Load plugins for development or test environments only (hapi-swagger)
if (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'test') {
plugins.push(
{ register: require('inert') },
{ register: require('vision') },
{ register: require('lout') },
{
register: require('hapi-swagger'),
options: {
info: {
title: require('./../package').name + ' Documentation',
version: require('./../package').version,
},
securityDefinitions: {
Bearer: {
type: 'apiKey',
name: 'Authorization',
in: 'header',
},
},
},
});
}
// Load plugins for production env only (datadog metrics)
if (process.env.NODE_ENV === 'production') {
plugins.push({ register: require('zeavo-hapi-bootstrap') });
plugins.push({ register: require('zeavo-hapi-datadog'), options: options.datadog });
}
// Load plugins and start server
server.register(plugins, (err) => {
if (err) {
throw err;
}
let key;
let algorithm;
if (process.env.NODE_ENV === 'production') {
key = Buffer.from(server.plugins['zeavo-hapi-bootstrap'].jwt_public_key, 'base64');
algorithm = ['RS256'];
} else {
Assert(process.env.JWT_KEY, 'expecting JWT_KEY');
key = process.env.JWT_KEY;
algorithm = ['HS256'];
}
server.auth.strategy('jwt', 'jwt', {
key: key,
validateFunc: (decoded, request, callback) => {
if (decoded.tenant && decoded.scope) {
return callback(null, true);
}
return callback(null, false);
},
verifyOptions: { algorithms: algorithm },
});
server.auth.default('jwt');
// Start the server
server.start((err) => {
if (err) {
throw err;
}
server.log('info', { msg: 'Server running at: ' + server.info.uri });
});
});
module.exports = server;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment