|
|
@@ -1,10 +1,14 @@
|
|
|
import { Hono, type Context } from "hono"
|
|
|
+import { describeRoute, resolver, validator } from "hono-openapi"
|
|
|
+import { z } from "zod"
|
|
|
import { AsyncQueue } from "../util/queue"
|
|
|
|
|
|
-interface Request {
|
|
|
- path: string
|
|
|
- body: any
|
|
|
-}
|
|
|
+const TuiRequest = z.object({
|
|
|
+ path: z.string(),
|
|
|
+ body: z.any(),
|
|
|
+})
|
|
|
+
|
|
|
+type Request = z.infer<typeof TuiRequest>
|
|
|
|
|
|
const request = new AsyncQueue<Request>()
|
|
|
const response = new AsyncQueue<any>()
|
|
|
@@ -19,12 +23,47 @@ export async function callTui(ctx: Context) {
|
|
|
}
|
|
|
|
|
|
export const TuiRoute = new Hono()
|
|
|
- .get("/next", async (c) => {
|
|
|
- const req = await request.next()
|
|
|
- return c.json(req)
|
|
|
- })
|
|
|
- .post("/response", async (c) => {
|
|
|
- const body = await c.req.json()
|
|
|
- response.push(body)
|
|
|
- return c.json(true)
|
|
|
- })
|
|
|
+ .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)
|
|
|
+ },
|
|
|
+ )
|