@mantris/appify
Version:
Very opinionated Node.js API boilerplate as module.
72 lines (61 loc) • 1.93 kB
JavaScript
const debug = require('debug')('appify:server')
const serverConfigFactory = require('./server-config-factory.js')
const spdy = require('spdy')
/**
* @param {Object} options Custom config options.
* @returns {Object} Spdy options.
*/
const spdyoptions = ({ spdy: { key, cert, ...spdy } }) => {
return { key, cert, spdy }
}
/**
* @param {Object} config Config object.
* @returns {String} Socket binding info.
*/
const socketbindinfo = (config) => {
return `pipe ${config.binding.socket}`
}
/**
* @param {Object} config Config object.
* @returns {String} HTTP bind info.
*/
const httpbindinfo = (config) => {
return `http://${config.binding.ip}:${config.binding.port}/`
}
/**
* @param {Object} logger Logger object.
* @returns {Function} Curry'ed onListening handler function.
*/
const onListening = (logger, bind) => {
return (err) => {
if (err) {
logger.error(err)
process.exit(1)
}
debug(`listening on ${bind}`)
}
}
/**
* @param {Function<Express>} appFactory Express app factory.
* @param {Object} configFactory Custom config options.
* @param {String} environment Environment name.
* @param {Object} logger Logger object, default to `console`.
* @returns {Promise<import('spdy').Server>} Running stance of spdy server.
*/
module.exports = async (appFactory, configFactory, environment, logger = console) => {
const config = configFactory(environment)
const serverConfig = serverConfigFactory(config)
return appFactory({ config, environment, logger }).then((app) => {
const server = spdy.createServer(spdyoptions(serverConfig), app)
if (serverConfig.binding.socket) return server.listen(
serverConfig.binding.socket,
onListening(logger, socketbindinfo(serverConfig))
)
return server.listen(
serverConfig.binding.port,
serverConfig.binding.ip,
onListening(logger, httpbindinfo(serverConfig))
)
})
}