| 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; |