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 url = require('url') const axios = require('axios') 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 } } function getMimeType(filePath) { const ext = filePath.split('.').pop()?.toLowerCase() const defaultMimes = { png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif', webp: 'image/webp', svg: 'image/svg+xml', ico: 'image/x-icon', js: 'text/javascript', css: 'text/css', html: 'text/html', json: 'application/json', woff: 'font/woff', woff2: 'font/woff2', ttf: 'font/ttf', otf: 'font/otf' } if (ext && defaultMimes[ext]) { return defaultMimes[ext] } if (mime && typeof mime.getType === 'function') { return mime.getType(filePath) || 'application/octet-stream' } return 'application/octet-stream' } const matchFile = async (request, response) => { return new Promise((resolve) => { const cleanPath = decodeURIComponent(request.url.split('?')[0]) fs.readFile(dist + cleanPath, (err, file) => { if (!err) { const mimetype = getMimeType(cleanPath) const responseHdeaders = { 'Content-Type': mimetype } if (cleanPath.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) => { fs.readFile(dist + '/index.html', 'utf-8', async (err, html) => { if (!err) { let finalHtml = html try { const parsedUrl = url.parse(request.url, true) if (parsedUrl.pathname === '/article-detail' && parsedUrl.query.id) { const id = parsedUrl.query.id const res = await axios.get(`http://wechat.wenyitu.com/api/articles/${id}`) const article = res.data if (article) { if (article.title) { finalHtml = finalHtml.replace(/