forked from SonjayaJetBrain/best-of
-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
114 lines (105 loc) · 3.06 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
'use strict'
require('loadenv')('optimus:env')
const cat = require('error-cat')
const CriticalError = require('error-cat/errors/critical-error')
const express = require('express')
const logger = require('./logger')
const monitor = require('monitor-dog')
const Promise = require('bluebird')
const RouteError = require('error-cat/errors/route-error')
const transform = require('./transform')
const version = require('../package.json').version
/**
* Port on which optimus runs.
* @type {number}
*/
const port = process.env.PORT
/**
* Optimus middlewares.
* @type {Object}
*/
const middlewares = {
connectDatadog: require('connect-datadog'),
bodyParser: require('body-parser').json(),
logger: require('express-bunyan-logger'),
applyRules: transform.applyRules,
versionResponder: function (req, res) {
res.send({ name: 'optimus', version: version })
},
notFound: function (req, res, next) {
next(new RouteError('Not Found', 404))
},
errorResponder: function (err, req, res, next) {
let statusCode = err.isBoom ? err.output.statusCode : 500
res.status(statusCode)
res.send(err.message)
}
}
/**
* The optimus application.
* @class
* @author Ryan Sandor Richards
*/
class App {
/**
* Starts the optimus express server.
* @return {Promise} Resolves when the server has started.
*/
start () {
const log = logger.child({ method: 'start' })
const instance = this.getInstance()
return Promise.resolve()
.then(() => {
return Promise.fromCallback((cb) => {
const server = instance.listen(port, function (err) {
if (err) { return cb(err) }
log.info({ port: port }, 'Optimus server listening')
cb(null, server)
})
})
})
.catch((err) => {
const critical = new CriticalError('Unable to start server', {
err: err,
port: port
})
log.fatal({ err: critical }, critical.message)
throw critical
})
}
/**
* Creates and returns an application instance for optimus.
* @return {express} The express application for optimus.
*/
getInstance () {
const app = express()
app.use('/health', function (req, res) { res.send(200) } )
app.use(middlewares.connectDatadog({
'dogstatsd': monitor,
'response_code': true,
'method': true,
'tags': [
'name:optimus',
'logType:express',
`env: ${process.env.NODE_ENV}`
]
}))
app.use(middlewares.logger({ logger: logger }))
app.use(middlewares.bodyParser)
app.get('/version', middlewares.versionResponder)
app.put('/', middlewares.applyRules)
app.use(cat.middleware)
app.use((err, req, res, next) => {
logger.error({ err: err }, err.message || 'An error occurred')
next(err)
})
app.use(middlewares.notFound)
app.use(middlewares.errorResponder)
return app
}
}
/**
* The optimus application module.
* @module optimus:app
*/
module.exports = new App()