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 = 'build' let mime import('mime').then((res) => { mime = res.default }) let proxys = require('../../../src/proxy.cjs') const httpOk = 200 const httpBadRequest = 400 const matchProxy = (request, response) => { const match = request.url.split('/')[1] const proxyInfo = proxys['/' + match] if (proxyInfo) { delete request.headers.host request.url = proxyInfo.rewrite(request.url) proxy.web(request, response, { target: proxyInfo.target, 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) response.writeHead(httpOk, { 'Content-Type': mimetype }) 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 = await 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, }