// @flow import http from 'http' import express from 'express' import Module from './Module' import { ExtendedError } from './errorUtils' import type { $Application } from 'express' const { MODULE_NAME, log, warn, error, noteGauge, noteCount, trackOp } = new Module(__filename) // eslint-disable-line no-unused-vars export default class ExpressApp { expressApp: $Application expressServer: ?Object constructor() { this.expressApp = express() } start = async (port: number) => { noteCount('ServerStart') await this.initExpress() // $FlowIgnore this.expressServer = await new Promise((res, rej) => { const server = http.createServer(this.expressApp) server.on('error', (err: Error) => { rej(new ExtendedError('Failed to start server', { err })) }) server.on('listening', () => { log('Server started', { port: port }) res(server) }) server.listen(port, undefined); }) } stop = async () => { // eslint-disable-line require-await if (this.expressServer) { // $FlowIgnore await new Promise((resp, rej) => this.expressServer.close((err) => err ? rej(err) : resp())) this.expressServer = null } noteCount('ServerStop') log('Server stopped') } initExpress = async () => { } }