1 | "use strict"
|
2 |
|
3 | const http = require("http")
|
4 | const stoppable = require("stoppable")
|
5 | const {promisify} = require("util")
|
6 |
|
7 | module.exports = async (logger, requestListener, options={}) => {
|
8 | const server = createServer(requestListener)
|
9 | const origListen = server.listen.bind(server)
|
10 |
|
11 | stoppable(server, options.stopTimeout || 1000)
|
12 | server.stop = promisify(server.stop)
|
13 | server.listen = (...args) => {
|
14 | return new Promise((resolve, reject) => {
|
15 | server.once("listening", resolve)
|
16 | server.once("error", reject)
|
17 | origListen(...args)
|
18 | }).then(() => {
|
19 | let host = args[1] || "0.0.0.0"
|
20 | let port = (args[0] && args[0].toString() !== "80") ? `:${args[0]}`: ""
|
21 | logger.info(`Listening for requests on http://${host}${port}...`)
|
22 | })
|
23 | }
|
24 |
|
25 | return server
|
26 | }
|
27 |
|
28 | function createServer(requestListener) {
|
29 | const server = http.createServer(requestListener)
|
30 | server.allowHalfOpen = false
|
31 |
|
32 | return server
|
33 | }
|