// Save as app/api/order/route.js in a separate Next.js App Router project. import OpenAI from "openai"; import { runOrder } from "../../../lib/order-runner.mjs"; export const runtime = "nodejs"; export async function POST(request) { const url = new URL(request.url); if (process.env.NODE_ENV !== "development" || !["localhost", "127.0.0.1"].includes(url.hostname) || request.headers.get("origin") !== url.origin) { return new Response("Local development only", { status: 403 }); } if (!process.env.OPENAI_API_KEY) { return new Response("Set OPENAI_API_KEY on the server", { status: 503 }); } const client = new OpenAI({ maxRetries: 0, timeout: 30000 }); const controller = new AbortController(); const timer = setTimeout(() => controller.abort(), 90000); const encoder = new TextEncoder(); let connected = true; const stream = new ReadableStream({ async start(out) { const send = (data) => { if (connected) out.enqueue(encoder.encode(JSON.stringify(data) + "\n")); }; try { const result = await runOrder(client, { // Local fixture identity, not a production authentication mechanism. userId: "demo-user", signal: controller.signal, onProgress: (event) => send({ kind: "progress", ...event }), }); send({ kind: "result", ...result }); } catch (error) { send({ kind: "error", sessionId: error.sessionId, message: "Run interrupted. Inspect the saved session before retrying." }); } finally { clearTimeout(timer); if (connected) out.close(); } }, cancel() { connected = false; controller.abort(); }, }); return new Response(stream, { headers: { "Content-Type": "application/x-ndjson", "Cache-Control": "no-store", } }); }