UNPKG

html5-to-pdf

Version:
88 lines (77 loc) 1.86 kB
const fs = require("fs") const http = require("http") const path = require("path") const { URL, parse } = require("url") class StaticServer { constructor({ templatePath }) { this.templatePath = templatePath this.server = http.createServer(this._handleRequest.bind(this)) } address() { let { address, port } = this.server.address() if (address === "::") { address = "localhost" } return new URL(`http://${address}:${port}`).toString() } listen() { return new Promise((resolve, reject) => { this.server.listen(err => { if (err) { return reject(err) } resolve() }) }) } close() { return new Promise((resolve, reject) => { this.server.close(err => { if (err) { return reject(err) } resolve() }) }) } _handleRequest(req, res) { const { pathname } = parse(req.url) let filePath = path.join(this.templatePath, pathname) fs.exists(filePath, exists => { if (!exists) { res.statusCode = 404 return res.end(`File ${filePath} not found!`) } if (fs.statSync(filePath).isDirectory()) { filePath += "/index.html" } fs.readFile(filePath, (err, data) => { if (err) { res.statusCode = 500 res.end(`Error getting the file: ${err}.`) } else { res.end(data) } }) }) } } class ExistingServer { constructor({ templateUrl }) { this.templateUrl = templateUrl } async listen() {} address() { return new URL(this.templateUrl).toString() } async close() {} } class Server { constructor({ templatePath, templateUrl }) { if (templateUrl) { return new ExistingServer({ templateUrl }) } return new StaticServer({ templatePath }) } } module.exports = Server