import type { APIContext } from "./context.js"; import { LoggingHandlerPlugin } from "@orpc/experimental-pino"; import { RPCHandler } from "@orpc/server/fetch"; import { createDb } from "@reviq/db"; import pino from "pino"; import { DEFAULT_PORT, DEFAULT_RP_NAME, getAllowedOrigins, } from "./constants.js"; import { router } from "./router.js"; const logger = pino({ transport: { target: "pino-pretty", options: { colorize: true, }, }, }); const db = createDb(); const handler = new RPCHandler(router, { plugins: [ new LoggingHandlerPlugin({ logger, logRequestResponse: true, }), ], }); const port = Bun.env.PORT ?? DEFAULT_PORT; const allowedOrigins = getAllowedOrigins(); const rpName = Bun.env.RP_NAME ?? DEFAULT_RP_NAME; Bun.serve({ port, async fetch(request) { const url = new URL(request.url); if (url.pathname.startsWith("/api/v1/rpc")) { // Build context for the request const origin = request.headers.get("origin") ?? `http://localhost:${String(port)}`; // Create response headers for setting cookies const resHeaders = new Headers(); const context: APIContext = { db, origin, allowedOrigins, rpName, reqHeaders: request.headers, resHeaders, }; const { response } = await handler.handle(request, { prefix: "/api/v1/rpc", context, }); // Merge response headers (cookies) into the response if (response) { resHeaders.forEach((value, key) => { response.headers.append(key, value); }); } return response ?? new Response("Not Found", { status: 404 }); } return new Response("Not Found", { status: 404 }); }, }); logger.info({ port }, "API server running");