UNPKG

2.25 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.createHTTPServer = createHTTPServer;
7
8var _http = _interopRequireDefault(require("http"));
9
10var _http2 = require("http2");
11
12var _nullthrows = _interopRequireDefault(require("nullthrows"));
13
14var _ = require("../");
15
16function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
18// $FlowFixMe Flow does not know of http2's existance
19// Creates either an http or https server with an awaitable dispose
20// that closes any connections
21async function createHTTPServer(options) {
22 let server;
23
24 if (!options.https) {
25 server = _http.default.createServer(options.listener);
26 } else if (options.https === true) {
27 let {
28 cert,
29 key
30 } = await (0, _.generateCertificate)(options.outputFS, options.cacheDir, options.host);
31 server = (0, _http2.createSecureServer)({
32 cert,
33 key,
34 allowHTTP1: true
35 }, options.listener);
36 } else {
37 let {
38 cert,
39 key
40 } = await (0, _.getCertificate)(options.inputFS, options.https);
41 server = (0, _http2.createSecureServer)({
42 cert,
43 key,
44 allowHTTP1: true
45 }, options.listener);
46 } // HTTPServer#close only stops accepting new connections, and does not close existing ones.
47 // Before closing, destroy any active connections through their sockets. Additionally, remove sockets when they close:
48 // https://stackoverflow.com/questions/18874689/force-close-all-connections-in-a-node-js-http-server
49 // https://stackoverflow.com/questions/14626636/how-do-i-shutdown-a-node-js-https-server-immediately/14636625#14636625
50
51
52 let sockets = new Set();
53 server.on('connection', socket => {
54 (0, _nullthrows.default)(sockets).add(socket);
55 socket.on('close', () => {
56 (0, _nullthrows.default)(sockets).delete(socket);
57 });
58 });
59 return {
60 server,
61
62 stop() {
63 return new Promise((resolve, reject) => {
64 for (let socket of (0, _nullthrows.default)(sockets)) {
65 socket.destroy();
66 }
67
68 sockets = new Set();
69 server.close(err => {
70 if (err != null) {
71 reject(err);
72 return;
73 }
74
75 resolve();
76 });
77 });
78 }
79
80 };
81}
\No newline at end of file