restana
Version:
Super fast and minimalist web framework for building REST micro-services.
87 lines (68 loc) • 1.73 kB
JavaScript
/**
* restana Web Framework implementation
*
* @license MIT
*/
const requestRouter = require('./libs/request-router')
const exts = {
request: {},
response: require('./libs/response-extensions')
}
module.exports = (options = {}) => {
options.errorHandler =
options.errorHandler ||
((err, req, res) => {
res.send(err)
})
const server = options.server || require('http').createServer()
const prp = undefined === options.prioRequestsProcessing ? true : options.prioRequestsProcessing
if (prp) {
server.on('request', (req, res) => {
setImmediate(() => service.handle(req, res))
})
} else {
server.on('request', (req, res) => {
service.handle(req, res)
})
}
const handle = (req, res) => {
// request object population
res.send = exts.response.send(options, req, res)
service.getRouter().lookup(req, res)
}
const service = handle
const service_ = {
errorHandler: options.errorHandler,
newRouter () {
return requestRouter(options)
},
getServer () {
return server
},
getConfigOptions () {
return options
},
handle,
start: (...args) =>
new Promise((resolve, reject) => {
if (!args || !args.length) args = [3000]
server.listen(...args, (err) => {
if (err) reject(err)
resolve(server)
})
}),
close: () =>
new Promise((resolve, reject) => {
server.close((err) => {
if (err) reject(err)
resolve()
})
})
}
Object.assign(service, service_)
// apply router capabilities
requestRouter(options, service)
service.callback = () => service.handle
return service
}