import { uppzy } from "./uppzy-client.js";
import { getJob, markJobCompleted, markJobFailed, saveRequestId } from "./queue-client.js";
const SITE_ID = process.env.UPPZY_SITE_ID;
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
async function waitForRequest(requestId, { intervalMs = 2500, timeoutMs = 45000 } = {}) {
const startedAt = Date.now();
while (Date.now() - startedAt < timeoutMs) {
const status = await uppzy(`/m2m/sites/${SITE_ID}/chat/requests/${requestId}`);
if (status.status === "completed") {
return status;
}
if (status.status === "failed") {
throw new Error(status.error || "Async chat failed");
}
await sleep(intervalMs);
}
throw new Error("Async chat polling timed out");
}
export async function processUppzyChatJob(jobId) {
const job = await getJob(jobId);
try {
const request = await uppzy(`/m2m/sites/${SITE_ID}/chat/async`, {
method: "POST",
body: {
session_id: job.session_id,
message: job.message,
response_language: job.response_language || "en",
},
});
await saveRequestId(jobId, request.request_id);
const result = await waitForRequest(request.request_id);
await markJobCompleted(jobId, {
session_id: result.session_id,
request_id: result.request_id,
answer: result.answer,
});
} catch (error) {
await markJobFailed(jobId, {
reason: error.message,
retryable: error.status === 429 || error.status >= 500,
});
}
}