vudash/vudash

View on GitHub
packages/core/src/server.js

Summary

Maintainability
A
1 hr
Test Coverage
'use strict'

const requirePaths = require('app-module-path')
requirePaths.addPath(process.cwd())
requirePaths.addPath(`${process.cwd()}/node_modules`)

const Hapi = require('hapi')
const fs = require('fs')
const Path = require('path')
const chalk = require('chalk')
const unhandled = require('unhandled-rejection')
const id = require('./id-gen')

const rejectionEmitter = unhandled({
  timeout: 5
})

rejectionEmitter.on('unhandledRejection', (error, promise) => {
  console.error(error)
})

function register () {
  const server = new Hapi.Server()
  server.connection({ port: process.env.PORT || 3300 })

  server.settings.app = { serverUrl: process.env.SERVER_URL || server.info.uri }
  const apiKey = process.env['API_KEY'] || id()

  return server.register([
    require('vision'),
    require('inert'),
    require('./plugins/socket'),
    require('./plugins/static'),
    require('./plugins/ui'),
    {
      register: require('hapi-api-secret-key').plugin,
      options: {
        secrets: [ apiKey ]
      }
    },
    require('./plugins/api')
  ])
    .then(() => {
      server.views({
        engines: {
          html: require('handlebars')
        },
        relativeTo: __dirname,
        path: './views'
      })

      console.log(`Loading dashboards from ${chalk.blue(process.cwd())}`)
      console.log(`Server ${chalk.green.bold('running')}`)
      console.log(`Api key: ${chalk.magenta.bold(apiKey)}`)
      console.log('Dashboards available:')
      const dashboardDir = Path.join(process.cwd(), 'dashboards')
      const boards = fs.readdirSync(dashboardDir)
      for (let board of boards) {
        const loaded = require(Path.join(dashboardDir, board))
        const boardUrl = `${Path.basename(board, '.json')}.dashboard`
        console.log(chalk.blue.bold(loaded.name), 'at', chalk.cyan.underline(`${server.settings.app.serverUrl}/${boardUrl}`))
      }

      return Promise.resolve(server)
    })
}

function start (server) {
  return server.start()
    .then(() => {
      if (process.env.BROWSER_SYNC) {
        const bs = require('browser-sync').create()

        bs.init({
          open: false,
          proxy: server.info.uri,
          files: ['src/public/**/*.{js,css}']
        })
      }

      return Promise.resolve()
    })
}

function cleanup (server) {
  const cache = Object.values(server.plugins.ui.dashboards)
  cache.forEach(dashboard => {
    dashboard.destroy()
  })
}

function stop (server) {
  server.stop({
    timeout: 60000
  }, () => {
    cleanup(server)
    return Promise.resolve()
  })
}

module.exports = {
  register,
  start,
  stop
}