Files
pikasTech-HWLAB/internal/dev-entrypoint/cloud-web-routes.mjs
T
2026-05-31 11:45:10 +08:00

66 lines
1.9 KiB
JavaScript

const GET_PROXY_PREFIXES = Object.freeze(["/v1/"]);
const GET_PROXY_ROUTES = new Set(["/v1", "/auth/session"]);
const POST_PROXY_ROUTES = new Set([
"/auth/login",
"/auth/logout",
"/json-rpc",
"/v1/agent/chat",
"/v1/agent/chat/cancel",
"/v1/m3/io",
"/v1/skills/uploads"
]);
const PUBLIC_PROXY_ROUTES = new Set([
"GET /auth/session",
"POST /auth/login",
"POST /auth/logout",
"POST /v1/agent/chat",
"POST /v1/agent/chat/cancel"
]);
export function cloudWebProxyRoutePolicy(method, pathname) {
const normalizedMethod = normalizeMethod(method);
const normalizedPath = normalizePathname(pathname);
const routeKey = `${normalizedMethod} ${normalizedPath}`;
const proxy = isCloudApiProxyRoute(normalizedMethod, normalizedPath);
const publicRoute = proxy && (
PUBLIC_PROXY_ROUTES.has(routeKey) ||
isPublicCodeAgentPollRoute(normalizedMethod, normalizedPath)
);
return {
proxy,
authRequired: proxy && !publicRoute,
publicRoute,
routeKey
};
}
export function isCloudApiProxyRoute(method, pathname) {
const normalizedMethod = normalizeMethod(method);
const normalizedPath = normalizePathname(pathname);
if (normalizedMethod === "GET") {
return GET_PROXY_ROUTES.has(normalizedPath) ||
GET_PROXY_PREFIXES.some((prefix) => normalizedPath.startsWith(prefix));
}
if (normalizedMethod === "POST") {
return POST_PROXY_ROUTES.has(normalizedPath);
}
return false;
}
function isPublicCodeAgentPollRoute(method, pathname) {
return method === "GET" && (
pathname.startsWith("/v1/agent/chat/result/") ||
pathname.startsWith("/v1/agent/chat/trace/")
);
}
function normalizeMethod(method) {
return String(method || "GET").trim().toUpperCase() || "GET";
}
function normalizePathname(pathname) {
const value = String(pathname || "/").trim();
if (!value || value[0] !== "/") return "/";
return value.replace(/\/+$/u, "") || "/";
}