api-proxy-mock/index.api.ts
2026-06-04 12:13:28 +08:00

69 lines
2.5 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import * as fs from "fs";
import * as path from "path";
import { migrateApiListFromJsonIfNeeded } from "./src/api-list";
import { loadConfig } from "./src/config";
import { getActiveRoutes } from "./src/route-matching";
import { initDatabase } from "./src/db";
import { initMockFilesFromFsIfNeeded } from "./src/mock-files";
import {
createProxyServer,
getEffectiveTargetHttps,
getEffectiveTargetPort,
} from "./src/proxy";
import { state } from "./src/state";
function startServer(): void {
const proxyServer = createProxyServer();
proxyServer.listen(state.config.proxyPort, "0.0.0.0", () => {
const targetPort = getEffectiveTargetPort();
const https = getEffectiveTargetHttps();
const proto = https ? "https" : "http";
const defaultPort = https ? 443 : 80;
console.log(`========================================`);
console.log(
`代理服务器运行在: http://localhost:${state.config.proxyPort}`,
);
console.log(
`目标服务器: ${proto}://${state.config.targetHost}${targetPort !== defaultPort ? `:${targetPort}` : ""}`,
);
console.log(`数据库: data/mock-mappings.sqlite3`);
const activeRoutes = getActiveRoutes();
console.log(
`已配置Mock路由: ${Object.keys(activeRoutes).length} 个${state.config.mockEnabled !== false ? "" : "(当前 mockEnabled=false,未生效)"}`,
);
console.log(`========================================`);
console.log(`管理接口:`);
console.log(
` GET http://localhost:${state.config.proxyPort}/__config 查看当前配置`,
);
console.log(
` POST http://localhost:${state.config.proxyPort}/__reload-config 重新加载配置`,
);
console.log(
` GET http://localhost:${state.config.proxyPort}/__admin 管理面板`,
);
console.log(`========================================`);
console.log(`Mock路由列表:`);
for (const [route, file] of Object.entries(activeRoutes)) {
const filePath = path.join(__dirname, file);
const exists = fs.existsSync(filePath) ? "✓" : "✗";
console.log(` ${exists} ${route} -> ${file}`);
}
console.log(`========================================`);
});
}
async function bootstrap(): Promise<void> {
await initDatabase();
await initMockFilesFromFsIfNeeded();
await migrateApiListFromJsonIfNeeded();
await loadConfig();
startServer();
}
bootstrap().catch((error) => {
console.error("[BOOTSTRAP] 启动失败:", error);
process.exit(1);
});