-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathcreateApiServer.js
94 lines (76 loc) · 2.24 KB
/
createApiServer.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
const fs = require('fs')
const url = require('url')
const assert = require('assert')
const { join, basename } = require('path')
const merge = require('ramda/src/merge')
const forEachObjIndexed = require('ramda/src/forEachObjIndexed')
const feathers = require('feathers')
const httpLogger = require('pino-http')
const compress = require('compression')
const helmet = require('helmet')
const cors = require('cors')
const favicon = require('serve-favicon')
const errorHandler = require('feathers-errors/handler')
const configuration = require('feathers-configuration')
const hooks = require('feathers-hooks')
const rest = require('feathers-rest')
const socketio = require('feathers-socketio')
const forceSsl = require('express-enforces-ssl')
const createLog = require('./createLog')
const normalizePort = require('./lib/normalizePort')
const startServer = require('./lib/startServer')
module.exports = createServer
function createServer (options) {
const {
cwd = process.cwd(),
db,
services = []
} = options
const app = feathers()
// load config from ./config
app.configure(configuration())
const logConfig = app.get('log')
const log = createLog({ name: basename(cwd), level: logConfig.level })
app.set('log', log)
app.set('db', db)
const apiConfig = app.get('api')
const apiUrl = url.parse(apiConfig.url)
app.set('port', apiConfig.port)
app.set('host', apiUrl.hostname)
// log requests and responses
app.use(httpLogger({ logger: log }))
if (app.get('env') === 'production') {
app.enable('trust proxy')
app.use(forceSsl())
}
// gzip compression
app.use(compress())
// http security headers
app.use(helmet())
// cors requests
const assetConfig = app.get('asset')
app.use(cors({
origin: url.parse(assetConfig.url) // TODO: allow for whitelist to be passed
}))
// feathers hooks
app.configure(hooks())
// transports
app.configure(rest())
app.configure(socketio({
wsEngine: 'uws'
}))
// services (plugins)
services.forEach(service => {
app.configure(service)
})
// log errors
app.use(function (err, req, res, next) {
if (err) console.error('error', err)
next(err)
})
// error handler
app.use(errorHandler())
return (cb) => {
return startServer(app, cb)
}
}