env-manage-plugin
Version:
A dev env plugin that integrates an Express server with request proxying capabilities.
108 lines (107 loc) • 4.03 kB
JavaScript
;
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;