1. 'use strict';
    
  2. 
    
  3. const http2Server = require('http2');
    
  4. const httpServer = require('http-server');
    
  5. const {existsSync, statSync, createReadStream} = require('fs');
    
  6. const {join} = require('path');
    
  7. const argv = require('minimist')(process.argv.slice(2));
    
  8. const mime = require('mime');
    
  9. 
    
  10. function sendFile(filename, response) {
    
  11.   response.setHeader('Content-Type', mime.lookup(filename));
    
  12.   response.writeHead(200);
    
  13.   const fileStream = createReadStream(filename);
    
  14.   fileStream.pipe(response);
    
  15.   fileStream.on('finish', response.end);
    
  16. }
    
  17. 
    
  18. function createHTTP2Server(benchmark) {
    
  19.   const server = http2Server.createServer({}, (request, response) => {
    
  20.     const filename = join(
    
  21.       __dirname,
    
  22.       'benchmarks',
    
  23.       benchmark,
    
  24.       request.url
    
  25.     ).replace(/\?.*/g, '');
    
  26. 
    
  27.     if (existsSync(filename) && statSync(filename).isFile()) {
    
  28.       sendFile(filename, response);
    
  29.     } else {
    
  30.       const indexHtmlPath = join(filename, 'index.html');
    
  31. 
    
  32.       if (existsSync(indexHtmlPath)) {
    
  33.         sendFile(indexHtmlPath, response);
    
  34.       } else {
    
  35.         response.writeHead(404);
    
  36.         response.end();
    
  37.       }
    
  38.     }
    
  39.   });
    
  40.   server.listen(8080);
    
  41.   return server;
    
  42. }
    
  43. 
    
  44. function createHTTPServer() {
    
  45.   const server = httpServer.createServer({
    
  46.     root: join(__dirname, 'benchmarks'),
    
  47.     robots: true,
    
  48.     cache: 'no-store',
    
  49.     headers: {
    
  50.       'Access-Control-Allow-Origin': '*',
    
  51.       'Access-Control-Allow-Credentials': 'true',
    
  52.     },
    
  53.   });
    
  54.   server.listen(8080);
    
  55.   return server;
    
  56. }
    
  57. 
    
  58. function serveBenchmark(benchmark, http2) {
    
  59.   if (http2) {
    
  60.     return createHTTP2Server(benchmark);
    
  61.   } else {
    
  62.     return createHTTPServer();
    
  63.   }
    
  64. }
    
  65. 
    
  66. // if run directly via CLI
    
  67. if (require.main === module) {
    
  68.   const benchmarkInput = argv._[0];
    
  69. 
    
  70.   if (benchmarkInput) {
    
  71.     serveBenchmark(benchmarkInput);
    
  72.   } else {
    
  73.     console.error('Please specify a benchmark directory to serve!');
    
  74.     process.exit(1);
    
  75.   }
    
  76. }
    
  77. 
    
  78. module.exports = serveBenchmark;