Files
ZYZ/web-server/app/middleware/proxy.ts
2026-03-13 01:38:40 +00:00

117 lines
3.8 KiB
TypeScript

import { RegionModel } from '@db/Region';
import { ServerlistModel } from '@db/Serverlist';
import proxy from './egg-proxy';
import { Context } from 'egg';
interface ProxyOptions {
[key: string]: {
target: string;
changeOrigin: boolean;
secure: boolean;
pathRewrite?: (path: string) => string;
headers?: { [key: string]: string };
};
}
module.exports = () => {
return async function (ctx: Context, next: () => Promise<any>) {
if(!ctx.app.config.envToHost) {
let envToHost = new Map<string, string>();
let regions = await RegionModel.getAllRegion();
for(let { env, webHost } of regions) {
envToHost.set(env, webHost);
}
ctx.app.config.envToHost = envToHost;
}
if(!ctx.app.config.sidToHost) {
await getNewHost(ctx);
}
let options: ProxyOptions = {};
for(let [env, webHost] of ctx.app.config.envToHost) {
options[`/web/${env}/`] = {
target: webHost,
changeOrigin: true,
secure: true,
pathRewrite: function(path: string) {
console.log('proxy', path, path.replace(`/web/${env}/`, '/web/'))
return path.replace(`/web/${env}/`, '/web/')
}
}
}
if(ctx.request.header['is-proxy'] != 'true') {
let url = getProxyUrl(ctx.request.url);
if(url) {
let sid = getServerId(url, ctx);
if(!ctx.app.config.sidToHost.has(sid)) {
await getNewHost(ctx);
}
if(!!ctx.app.config.sidToHost.get(sid)) {
options[url] = {
target: ctx.app.config.sidToHost.get(sid) as string,
changeOrigin: true,
secure: true,
headers: { "is-proxy": "true" }
}
}
}
}
return proxy(options)(ctx, next);
};
};
async function getNewHost(ctx: Context) {
let envToHost = ctx.app.config.envToHost||new Map();
let sidToHost = new Map<string, string>();
let servers = await ServerlistModel.getAllServerList();
for(let { id, env, isMain } of servers) {
let webHost = envToHost.get(env);
sidToHost.set(id.toString(), webHost as string);
if(isMain) sidToHost.set('main', webHost as string);
}
if(!sidToHost.has('main') && servers.length > 0) sidToHost.set('main', envToHost.get(servers[0].env) as string);
ctx.app.config.sidToHost = sidToHost;
}
function getProxyUrl(url: string): string | undefined {
const urls = [
'/cb/treatusername',
'/cb/treatguildname',
'/cb/getguildbyuser',
'/cb/refundioscallback',
'/cb/sendgiftcode',
'/cb/getrolebyserver',
'/cb/getserverinfo',
'/cb/getrolebyuid',
'/cb/getrolebyuidandserver',
];
for(let str of urls) {
if(url && url.startsWith(str)) {
return str;
}
}
return undefined;
}
function getServerId(url: string, ctx: Context): string {
switch(url) {
case '/cb/treatusername':
case '/cb/treatguildname':
case '/cb/getguildbyuser':
return ctx.query.sid.toString();
case '/cb/refundioscallback':
return ctx.request.body.sid.toString();
case '/cb/sendgiftcode':
return ctx.request.body.server_id.toString();
case '/cb/getrolebyserver':
case '/cb/getserverinfo':
return ctx.query.server_id.toString();
case '/cb/getrolebyuidandserver':
return ctx.query? ctx.query.dsid.toString(): ctx.request.body.dsid.toString();
case '/cb/getrolebyuid':
return 'main';
default:
return 'main';
}
}