import axios from "axios"; import { NextResponse } from "next/server"; async function GET( req: Request, target: string ) { const reqUrl = new URL(req.url); const url: string = target + reqUrl.pathname + "?" + reqUrl.searchParams.toString(); const headers: { [key: string]: string } = { Authorization: req.headers.get("Authorization") || "", Cookie: req.headers.get("Cookie") || "", }; const externalResponse = await axios.get(url, { headers: headers, responseType: "stream", }); return new NextResponse(nodeReadableToReadableStream(externalResponse.data), { status: externalResponse.status, }); } async function POST(req: Request) { const reqUrl = new URL(req.url); const body = await req.text(); const url: string = process.env.EDITOR_SERVICE_URL + reqUrl.pathname + "?" + reqUrl.searchParams.toString(); const headers: { [key: string]: string } = { "Content-Type": req.headers.get("Content-Type") || "", Authorization: req.headers.get("Authorization") || "", Cookie: req.headers.get("Cookie") || "", }; const externalResponse = await axios.post(url, body, { headers: headers, responseType: "stream", }); const responseHeaders = getResponseHeaders(externalResponse); return new NextResponse(nodeReadableToReadableStream(externalResponse.data), { status: externalResponse.status, headers: responseHeaders, }); } const getResponseHeaders = (externalResponse: any) => { const responseHeaders = new Headers(); responseHeaders.set( "Content-Type", externalResponse.headers["content-type"] || "" ); responseHeaders.set( "Set-Cookie", externalResponse.headers["set-cookie"] || "" ); return responseHeaders; }; function nodeReadableToReadableStream( nodeStream: NodeJS.ReadableStream ): ReadableStream { return new ReadableStream({ start(controller) { nodeStream.on("data", (chunk: Buffer) => { controller.enqueue(new Uint8Array(chunk)); }); nodeStream.on("end", () => { controller.close(); }); nodeStream.on("error", (err: Error) => { controller.error(err); }); }, pull() {}, cancel() {}, }); } export const proxy = { POST, GET, };