gameflow-deck/src/bun/api/clients.ts
Simeon Radivoev f15bf9a1e0
feat: Implemented launching and downloading of roms
This is just an initial implementation lots of kings to iron out
2026-02-19 16:10:29 +02:00

45 lines
1.5 KiB
TypeScript

import z from "zod";
import Elysia from "elysia";
import { config, jar } from "./app";
import games from "./games/games";
import platforms from "./games/platforms";
import auth from "./auth";
export default new Elysia({ prefix: "/api/romm" })
.use([games, platforms, auth])
.all("/*", async ({ request, params, set }) =>
{
if (!config.has('rommAddress') && !config.get('rommAddress'))
{
return new Response("Romm Address Not Found", { status: 404 });
}
const rommUrl = new URL(config.get('rommAddress')!);
const url = new URL(request.url);
url.pathname = url.pathname.replace(/^\/api\/romm/, '');
url.host = rommUrl.host;
url.port = rommUrl.port;
url.protocol = rommUrl.protocol;
// Forward headers (optional: remove host if needed)
const headers = new Headers(request.headers);
headers.delete('host');
headers.set("accept-encoding", "identity");
headers.set('cookie', await jar.getCookieString(rommUrl.href));
let rommResponse = await fetch(url, {
method: request.method,
headers,
body: await request.arrayBuffer(),
redirect: 'manual', // avoid ROMM redirects
});
set.status = rommResponse.status;
rommResponse.headers.forEach((value, key) =>
{
set.headers[key] = value;
});
return new Response(rommResponse.body, { status: rommResponse.status });
}, { response: z.instanceof(Response) });