'use strict'; const { EventEmitter } = require('events'); const logger = require('./logger')('server-impl.js'); const migrator = require('../migrator'); const getApp = require('./app'); const { startMonitoring } = require('./metrics'); const { createStores } = require('./db'); const { createOptions } = require('./options'); const User = require('./user'); const AuthenticationRequired = require('./authentication-required'); function createApp(options) { // Database dependecies (statefull) const stores = createStores(options); const eventBus = new EventEmitter(); const config = Object.assign( { stores, eventBus, }, options ); const app = getApp(config); startMonitoring(options.serverMetrics, eventBus); const server = app.listen({ port: options.port, host: options.host }, () => logger.info(`Unleash started on port ${server.address().port}`) ); return new Promise((resolve, reject) => { server.on('listening', () => resolve({ app, server, eventBus })); server.on('error', reject); }); } function start(opts) { const options = createOptions(opts); return migrator({ databaseUrl: options.databaseUrl }) .catch(err => logger.error('failed to migrate db', err)) .then(() => createApp(options)); } module.exports = { start, User, AuthenticationRequired, };