-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathHttpServer.js
72 lines (68 loc) · 1.96 KB
/
HttpServer.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
const http = require('http')
/**
* @name HttpServer
*
* @synopsis
* ```coffeescript [specscript]
* HttpServer(
* httpHandler (
* request http.IncomingMessage,
* response http.ServerResponse,
* )=>Promise<>|(),
* ) -> server HttpServer
* ```
*
* @description
* Creates an instance of a Node.js `http.Server` ([Node.js docs](https://nodejs.org/api/net.html#net_class_net_server))
*
* ```javascript
* const requestBodyToString = request => new Promise((resolve, reject) => {
* let body = []
* request.on('data', chunk => {
* body.push(chunk)
* }).on('end', () => {
* body = Buffer.concat(body).toString()
* resolve(body)
* }).on('error', reject)
* })
*
* HttpServer(async (request, response) => {
* request.startTime = Date.now()
* switch (request.path) {
* case '/':
* response.writeHead(200, {
* 'Content-Type': 'application/json',
* 'X-Powered-By': 'presidium',
* })
* response.write(JSON.stringify({ greeting: 'Hello World' }))
* case '/echo':
* response.writeHead(200, {
* 'Content-Type': 'text/plain',
* 'X-Powered-By': 'presidium',
* })
* response.write(await requestBodyToString(request))
* default:
* response.writeHead(404, {
* 'Content-Type': 'text/html',
* 'X-Powered-By': 'presidium',
* })
* response.write('<p>Not Found</p>')
* }
* response.end()
* console.log(`${request.method} ${request.path} complete in ${Date.now() - request.startTime}`)
* }).on('connection', socket => {}).listen(3000)
* ```
*/
const HttpServer = function (httpHandler) {
const server = http.createServer(httpHandler)
server.ready = new Promise(resolve => {
server._listeningResolve = resolve
})
const originalListen = server.listen
server.listen = (...args) => {
server._listeningResolve()
return originalListen.apply(server, args)
}
return server
}
module.exports = HttpServer