UNPKG

siegel

Version:

Web application development ecosystem

55 lines (54 loc) 2.65 kB
import http2 from 'http2'; import { HEADER_ACCEPT_INDEX } from '../constants.js'; import extractSSL from '../extract_ssl_key.js'; import getStaticServingData from '../get_static_file_response_data/index.js'; async function createHTTP2Server(params) { const { devMiddlewares, config } = params; const { publicDir, server } = config; const { ssl, serveCompressionsPriority, appServer, HTTP2PreFileSend } = server; const { HTTP2_HEADER_CONTENT_ENCODING, HTTP2_HEADER_ACCEPT, HTTP2_HEADER_ACCEPT_ENCODING, HTTP2_HEADER_PATH, HTTP2_HEADER_STATUS, HTTP2_HEADER_METHOD, HTTP2_HEADER_CACHE_CONTROL, HTTP2_HEADER_CONTENT_TYPE, HTTP2_METHOD_GET } = http2.constants; const staticServer = ssl ? http2.createSecureServer(extractSSL(ssl)) : http2.createServer(); staticServer.on('error', console.error); staticServer.on('stream', (stream, headers, flags) => { const cancelFurtherPricessing = onStreamCb?.(stream, headers, flags); if (!(devMiddlewares.length || cancelFurtherPricessing)) { const reqUrl = headers[HTTP2_HEADER_METHOD] == HTTP2_METHOD_GET && headers[HTTP2_HEADER_ACCEPT]?.includes(HEADER_ACCEPT_INDEX) ? '/index.html' : headers[HTTP2_HEADER_PATH]; const staticServingData = getStaticServingData({ reqUrl, serveCompressionsPriority, publicDir: publicDir, acceptEncoding: headers[HTTP2_HEADER_ACCEPT_ENCODING], cacheControl: headers[HTTP2_HEADER_CACHE_CONTROL] }); const { pathToFile, encoding, contentType, cacheControl } = staticServingData; const resHeaders = {}; contentType && (resHeaders[HTTP2_HEADER_CONTENT_TYPE] = contentType); encoding && (resHeaders[HTTP2_HEADER_CONTENT_ENCODING] = encoding); cacheControl && (resHeaders[HTTP2_HEADER_CACHE_CONTROL] = cacheControl); if (!HTTP2PreFileSend?.(stream, headers, resHeaders, staticServingData)) { stream.respondWithFile(pathToFile, resHeaders, { onError(err) { console.log(err); stream.respond({ [HTTP2_HEADER_STATUS]: err.code == 'ENOENT' ? 404 : 500 }); stream.end(); } }); } } }); let onStreamCb; appServer && await appServer({ staticServer, onStream(cb) { onStreamCb = cb; } }, config); return staticServer; } export default createHTTP2Server;