import { Hono, type Context } from "hono" import { describeRoute, resolver, validator } from "hono-openapi" import { z } from "zod" import { AsyncQueue } from "../util/queue" const TuiRequest = z.object({ path: z.string(), body: z.any(), }) type TuiRequest = z.infer const request = new AsyncQueue() const response = new AsyncQueue() export async function callTui(ctx: Context) { const body = await ctx.req.json() request.push({ path: ctx.req.path, body, }) return response.next() } export const TuiRoute = new Hono() .get( "/next", describeRoute({ description: "Get the next TUI request from the queue", operationId: "tui.control.next", responses: { 200: { description: "Next TUI request", content: { "application/json": { schema: resolver(TuiRequest), }, }, }, }, }), async (c) => { const req = await request.next() return c.json(req) }, ) .post( "/response", describeRoute({ description: "Submit a response to the TUI request queue", operationId: "tui.control.response", responses: { 200: { description: "Response submitted successfully", content: { "application/json": { schema: resolver(z.boolean()), }, }, }, }, }), validator("json", z.any()), async (c) => { const body = c.req.valid("json") response.push(body) return c.json(true) }, )