diff --git a/.gitignore b/.gitignore index 1942c0d..ecb0735 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,6 @@ node_modules out dist *.tgz -api # code coverage coverage diff --git a/api/index.ts b/api/index.ts new file mode 100644 index 0000000..b4a57f6 --- /dev/null +++ b/api/index.ts @@ -0,0 +1,50 @@ +import { + buildRelayRequest, + createRelayResponse, + normalizeTargetUrl, + stripRelayHeaders, + isAllowedTarget, +} from "../relay-utils"; + +export const config = { runtime: "edge" }; + +const ALLOWED_METHODS = new Set(["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"]); + +export default async function handler(req: Request): Promise { + if (!ALLOWED_METHODS.has(req.method)) { + return new Response(JSON.stringify({ error: "Method not allowed" }), { + status: 405, + headers: { "content-type": "application/json" }, + }); + } + + const target = req.headers.get("x-relay-target"); + const relayPath = req.headers.get("x-relay-path") || "/"; + + const targetUrl = normalizeTargetUrl(target, relayPath); + if (!targetUrl) { + return new Response( + JSON.stringify({ error: "Missing x-relay-target header" }), + { + status: 400, + headers: { "content-type": "application/json" }, + }, + ); + } + + if (!isAllowedTarget(targetUrl)) { + return new Response( + JSON.stringify({ error: "Target domain not allowed" }), + { + status: 403, + headers: { "content-type": "application/json" }, + }, + ); + } + + const headers = stripRelayHeaders(new Headers(req.headers)); + const fetchOptions = buildRelayRequest(req, headers); + + const response = await fetch(targetUrl, fetchOptions); + return createRelayResponse(response); +} diff --git a/package.json b/package.json index 775e100..ce529df 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "type": "module", "private": true, "scripts": { - "build": "bun build src/index.ts --target=bun --outdir=api && mkdir -p dist && cp public/index.html dist/index.html", + "build": "mkdir -p dist && cp public/index.html dist/index.html", "start": "bun run src/index.ts", "dev": "bun --hot run src/index.ts", "test": "bun test", diff --git a/vercel.json b/vercel.json index 9fbbe05..b645402 100644 --- a/vercel.json +++ b/vercel.json @@ -1,5 +1,12 @@ { "$schema": "https://openapi.vercel.sh/vercel.json", "bunVersion": "1", - "installCommand": "bun install" -} \ No newline at end of file + "installCommand": "bun install", + "outputDirectory": "dist", + "rewrites": [ + { + "source": "/api/(.*)", + "destination": "/api/index.ts" + } + ] +}