UNPKG

env-manage-plugin

Version:

A dev env plugin that integrates an Express server with request proxying capabilities.

84 lines (83 loc) 2.85 kB
import { join } from "path"; import { WebSocketServer } from "ws"; import express from "express"; import expressStaticGzip from "express-static-gzip"; import { createProxyMiddleware } from "http-proxy-middleware"; import { getConfig } from "./utils/ResolveConfig.js"; import { createRouter } from "./routes/index.js"; import { globalErrorHandler } from "./middleware/globalErrorHandler.js"; import { responseEnhancer } from "./middleware/responseEnhancer.js"; const currentModuleUrl = import.meta.url; // 转换为文件系统路径 import { fileURLToPath } from "url"; const __filename = fileURLToPath(currentModuleUrl); // 当前文件的完整路径 // 获取目录路径 import { dirname } from "path"; const __dirname = dirname(__filename); // 当前文件所在的目录路径 import { envLogger } from "./utils/logger.js"; /** * 后置代理服务器---同时也是管理页面的服务器 */ class PostProxyServer { get config() { return getConfig(); } constructor(app = express()) { this.app = app; // 代理中间件 app.use(this.createPostProxyMiddleware()); // 静态资源 app.use(expressStaticGzip(join(__dirname, "client"), {})); // 统一处理响应 app.use(responseEnhancer); // 初始化管理路由 app.use(this.config.apiPrefix, createRouter()); // 全局错误处理中间件 app.use(globalErrorHandler); // 启动服务器 const server = this.startServer(); this.registerWs(server); } /** * 启动服务 */ startServer() { return this.app.listen(this.config.port, () => { envLogger.info(`Post Proxy Middleware is running on http://localhost:${this.config.port}`); }); } /** * 注册ws服务用于通知客户端更新 * @param server */ registerWs(server) { const wss = new WebSocketServer({ noServer: true }); server.on("upgrade", (request, socket, head) => { if (request?.url?.startsWith(this.config.apiPrefix)) { wss.handleUpgrade(request, socket, head, () => { }); } }); } /** * 创建后置服务器 代理转发中间件 * @returns */ createPostProxyMiddleware() { // 定义路径过滤函数,排除 管理url const pathFilter = (path, req) => { return !!req.headers["x-api-server"]; }; return createProxyMiddleware({ pathFilter, ws: true, changeOrigin: true, router: async (req) => { if (req.headers["x-api-server"]) { const target = req.headers["x-api-server"]; return target; } }, }); } } export default PostProxyServer;