const logger = require('../utils/log.cjs') const routes = require('./routes.cjs') const httpProxy = require('http-proxy') const proxy = httpProxy.createProxyServer({}) const fs = require('fs') const dist = 'dist' let mime import('mime').then((res) => { mime = res.default }) let proxys = require('../../../src/proxy.cjs') const { Exception } = require("sass"); const httpOk = 200 const httpBadRequest = 400 const matchProxy = (request, response) => { const match = request.url.split('/')[1] const proxyInfo = proxys['/' + match] if (proxyInfo) { const host = request.headers.host; delete request.headers.host if (typeof proxyInfo.rewrite === 'function') { request.url = proxyInfo.rewrite(request.url) } proxy.web(request, response, { target: proxyInfo.target || ("http://" + host), changeOrigin: proxyInfo.changeOrigin }) logger.info(`${request.method} ${httpOk} ${request.url}`) return true } else { return null } } const matchRouter = async (request, response) => { let [url] = request.url.split('?') let route = routes let url_sp = url.split('/') for (let p of url_sp) { if (!p) { continue } if (route[p]) { route = route[p] } else { return false } } if (typeof route === 'function') { await route(request, response) // response.writeHead(httpOk, { 'Content-Type': 'application/json' }) // response.end(JSON.stringify(res)) logger.info(`${request.method} ${httpOk} ${request.url}`) return true } else { return false } } const matchFile = async (request, response) => { return new Promise((resolve) => { const path = request.url.split('?')[0] fs.readFile(dist + decodeURIComponent(path), (err, file) => { if (!err) { const mimetype = mime.getType(request.url) const responseHdeaders = { 'Content-Type': mimetype } if (path.endsWith("-sw.js")) { responseHdeaders["Service-Worker-Allowed"] = '/' } response.writeHead(httpOk, responseHdeaders) response.end(file) // logger.info(`${request.method} ${httpOk} ${request.url}`) resolve(true) } else { resolve(false) } }) }) } const endIndex = async (request, response) => { console.log(dist + '/index.html') fs.readFile(dist + '/index.html', (err, html) => { if (!err) { response.writeHead(httpOk, { 'Content-type': 'text/html;charset=utf-8' }) response.end(html) logger.info(`${request.method} ${httpOk} ${request.url}`) } }) } const matchType = async (request, response) => { const isRouter = await matchRouter(request, response) if (isRouter) { return } let isProxy = matchProxy(request, response) if (isProxy) { return } let isFile = await matchFile(request, response) if (isFile) { return } await endIndex(request, response) } const httpService = async (request, response) => { try { await matchType(request, response) } catch (e) { response.writeHead(httpBadRequest, { 'Content-Type': 'application/json' }) response.end( JSON.stringify({ code: -1, message: String(e) }) ) logger.info(`${request.method} ${httpBadRequest} ${request.url}`) } } module.exports = { httpService, matchType, matchRouter, matchFile, endIndex, matchProxy, }