UNPKG

env-manage-plugin

Version:

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

108 lines (107 loc) 4.03 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const path_1 = require("path"); const ws_1 = tslib_1.__importStar(require("ws")); const express_1 = tslib_1.__importDefault(require("express")); const express_static_gzip_1 = tslib_1.__importDefault(require("express-static-gzip")); const http_proxy_middleware_1 = require("http-proxy-middleware"); const ManageRouter_js_1 = tslib_1.__importDefault(require("./ManageRouter.js")); const PreProxyServer_js_1 = tslib_1.__importDefault(require("./PreProxyServer.js")); const Config_js_1 = require("./Config.js"); /** * 后置代理服务器---同时也是管理页面的服务器 */ class PostProxyServer { constructor() { this.config = new Config_js_1.Config(); // 初始化服务器 this.app = this.initializeServer(); // 初始化管理路由 const manageRouter = new ManageRouter_js_1.default(); this.app.use(this.config.envmConfig.basePath, manageRouter.getRouter()); // 全局错误处理中间件 this.app.use((err, req, res, next) => { console.error("未捕获的错误:", err); res.status(500).send("服务器内部错误"); }); // 启动服务器 const server = this.startServer(); this.registerWs(server); } initializeServer() { const app = (0, express_1.default)(); // 代理中间件 app.use(this.createPostProxyMiddleware()); // 无需代理的数据继续下一个中间件 app.use(this.errorHandler); // 静态资源 app.use((0, express_static_gzip_1.default)((0, path_1.join)(__dirname, "client"), {})); return app; } /** * 注册ws服务用于通知客户端更新 * @param server */ registerWs(server) { const wss = new ws_1.WebSocketServer({ noServer: true }); server.on("upgrade", (request, socket, head) => { if (request.url.startsWith(this.config.envmConfig.basePath)) { wss.handleUpgrade(request, socket, head, (ws) => { }); } }); this.config.bus.on(Config_js_1.FILE_CHANGE_EVENT, (data) => { const message = JSON.stringify(data); wss.clients.forEach((client) => { if (client.readyState === ws_1.default.OPEN) { client.send(message); } }); }); } /** * 创建后置服务器 代理转发中间件 * @returns */ createPostProxyMiddleware() { // 定义路径过滤函数,排除 管理url const pathFilter = (path, req) => { return !!req.headers["x-api-server"]; }; return (0, http_proxy_middleware_1.createProxyMiddleware)({ pathFilter, ws: true, changeOrigin: true, router: async (req) => { if (req.headers["x-api-server"]) { const port = req.headers["x-api-server"]; const envKey = PreProxyServer_js_1.default.appMap[`${port}`].envKey; const env = this.config.envMap.get(envKey); if (env?.router) { return await env.router(req, env); } if (env?.target) { return env.target; } return env?.target; } throw new Error("SKIP_PROXY"); }, }); } errorHandler(err, req, res, next) { if (err.message === "SKIP_PROXY") { return next(); } res.status(500).send("代理服务器出错"); } /** * 启动服务 */ startServer() { return this.app.listen(this.config.envmConfig.port, () => { console.log(`Post Proxy Middleware is running on http://localhost:${this.config.envmConfig.port}`); }); } } exports.default = PostProxyServer;