2026-06-10 21:17:21 +07:00
|
|
|
/**
|
2026-06-10 21:20:16 +07:00
|
|
|
* Vercel-compatible relay handler (Bun runtime).
|
2026-06-10 21:17:21 +07:00
|
|
|
*
|
2026-06-24 23:48:16 +07:00
|
|
|
* Thin wrapper around the shared router in src/lib/router.ts.
|
|
|
|
|
* Does NOT call Bun.serve() (Vercel manages the server).
|
|
|
|
|
* Does NOT support WebSocket upgrades.
|
2026-06-10 21:17:21 +07:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
import {
|
2026-06-24 23:48:16 +07:00
|
|
|
handleRelayPlain,
|
|
|
|
|
handleRequest,
|
|
|
|
|
getClientIP,
|
|
|
|
|
} from "../src/lib/router";
|
|
|
|
|
import type { RouterEnv } from "../src/lib/router";
|
2026-06-10 21:17:21 +07:00
|
|
|
|
2026-06-24 18:18:49 +07:00
|
|
|
import { getTestPageHtml } from "../src/lib/test-page";
|
2026-06-10 21:17:21 +07:00
|
|
|
|
2026-06-24 23:48:16 +07:00
|
|
|
// --- Singletons (survives warm invocations) ----------------------------------
|
2026-06-10 21:17:21 +07:00
|
|
|
|
2026-06-24 23:48:16 +07:00
|
|
|
const routerEnv: RouterEnv = {};
|
2026-06-10 21:17:21 +07:00
|
|
|
|
|
|
|
|
/**
|
2026-06-24 20:59:00 +07:00
|
|
|
* Hybrid handler for Vercel/Node web-api and Bun/Workers runtimes.
|
2026-06-10 21:17:21 +07:00
|
|
|
*/
|
2026-06-24 20:59:00 +07:00
|
|
|
async function fetchHandler(req: Request): Promise<Response> {
|
|
|
|
|
const url = new URL(req.url);
|
2026-06-24 23:48:16 +07:00
|
|
|
const clientIP = getClientIP(req);
|
2026-06-10 21:17:21 +07:00
|
|
|
|
2026-06-24 23:48:16 +07:00
|
|
|
// Static routes
|
|
|
|
|
if (url.pathname === "/health") {
|
|
|
|
|
const { handleHealth } = await import("../src/lib/router");
|
|
|
|
|
return handleHealth();
|
|
|
|
|
}
|
2026-06-24 20:59:00 +07:00
|
|
|
if (url.pathname === "/docs" || url.pathname === "/test") {
|
|
|
|
|
return new Response(getTestPageHtml(), {
|
|
|
|
|
headers: { "Content-Type": "text/html; charset=utf-8" },
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
if (
|
|
|
|
|
url.pathname === "/" &&
|
|
|
|
|
req.method === "GET" &&
|
|
|
|
|
!req.headers.get("x-relay-target")
|
|
|
|
|
) {
|
2026-06-24 23:48:16 +07:00
|
|
|
const { handleIndex } = await import("../src/lib/router");
|
2026-06-24 20:59:00 +07:00
|
|
|
return handleIndex();
|
|
|
|
|
}
|
2026-06-10 21:17:21 +07:00
|
|
|
|
2026-06-24 23:48:16 +07:00
|
|
|
// Delegate to shared router (handles AI proxy, model list, relay)
|
|
|
|
|
const result = await handleRequest(req, routerEnv, clientIP, {
|
|
|
|
|
isWebSocketSupported: false,
|
|
|
|
|
skipProxyPool: true,
|
|
|
|
|
});
|
|
|
|
|
if (result !== undefined) return result;
|
2026-06-10 21:17:21 +07:00
|
|
|
|
2026-06-24 23:48:16 +07:00
|
|
|
// Fallback (shouldn't reach here for relay)
|
|
|
|
|
return handleRelayPlain(req, routerEnv, clientIP);
|
2026-06-24 20:59:00 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default Object.assign(fetchHandler, {
|
|
|
|
|
fetch: fetchHandler,
|
|
|
|
|
});
|