import { Hono } from "hono"; import { Client } from "@upstash/qstash"; import { serve } from "@hono/node-server"; import dotenv from "dotenv"; import Redis from "ioredis"; dotenv.config(); const redis = new Redis({ host: "localhost", port: 7777, password: "xlfvpQ0ma2BkkkPX", }); // redis.set("test", "test"); // console.log(await redis.get("test")); // console.log(await redis.get("user-1-processing")); const app = new Hono(); console.log("QStash Token:", process.env.PUBLIC_URL); const qstash = new Client({ token: process.env.QSTASH_TOKEN as string, }); const queue = qstash.queue({ queueName: "deployments", }); // Endpoint que publica un mensaje en QStash app.post("/enqueue", async (c) => { const { userId, deploymentId } = await c.req.json(); const response = await qstash.publishJSON({ url: `${process.env.PUBLIC_URL}/process`, // Endpoint para procesar la tarea body: { userId, deploymentId }, // Datos del despliegue }); return c.json({ message: "Task enqueued", id: response.messageId }); }); // Endpoint que recibe el mensaje procesado app.post("/process", async (c) => { const { userId, deploymentId } = await c.req.json(); const isProcessing = await redis.get(`user-${userId}-processing`); console.log(`isProcessing for user ${userId}:`, isProcessing); if (isProcessing === "true") { console.log( `User ${userId} is already processing a deployment. Queuing the next one.`, ); return c.json( { status: "User is already processing a deployment, waiting...", }, { status: 400, }, ); } redis.set(`user-${userId}-processing`, "true"); try { await new Promise((resolve) => setTimeout(resolve, 5000)); } catch (error) { } finally { await redis.del(`user-${userId}-processing`); } return c.json({ status: "Processed", userId, deploymentId }); }); // Inicia el servidor en el puerto 3000 const port = 3000; console.log(`Server is running on port http://localhost:${port}`); serve({ fetch: app.fetch, port, }); // 18