mirror of
https://github.com/melgarafael/DeskcommCRM.git
synced 2026-10-02 09:34:46 +08:00
71 lines
2.2 KiB
TypeScript
71 lines
2.2 KiB
TypeScript
/**
|
|
* Relógio local dos crons HTTP. Em prod o crontab da VPS chama as mesmas
|
|
* rotas; o Next em `pnpm dev` não chama sozinho.
|
|
*
|
|
* Não mexe em produção: só faz POST em NEXT_PUBLIC_APP_URL (default
|
|
* localhost:3000). O risco é o *banco*: se .env.local aponta para o mesmo
|
|
* Supabase da VPS, este loop compete com o cron de lá.
|
|
*
|
|
* Uso (app já no ar):
|
|
* pnpm dev:crons
|
|
*/
|
|
const INTERVAL_MS = Number(process.env.DEV_CRON_INTERVAL_MS ?? "15000");
|
|
|
|
const PATHS = [
|
|
"/api/v1/cron/prospecting",
|
|
"/api/v1/cron/event-log-drain",
|
|
"/api/v1/cron/followup-flow-worker",
|
|
] as const;
|
|
|
|
function requiredEnv(name: string): string {
|
|
const v = process.env[name]?.trim();
|
|
if (!v) {
|
|
throw new Error(`${name} ausente — rode com --env-file=.env.local`);
|
|
}
|
|
return v;
|
|
}
|
|
|
|
function supabaseHost(): string {
|
|
try {
|
|
return new URL(process.env.NEXT_PUBLIC_SUPABASE_URL ?? "").host || "(sem URL)";
|
|
} catch {
|
|
return "(URL inválida)";
|
|
}
|
|
}
|
|
|
|
async function tick(base: string, secret: string): Promise<void> {
|
|
for (const path of PATHS) {
|
|
const res = await fetch(`${base}${path}`, {
|
|
method: "POST",
|
|
headers: { Authorization: `Bearer ${secret}` },
|
|
});
|
|
const body = await res.text();
|
|
const snippet = body.length > 240 ? `${body.slice(0, 240)}…` : body;
|
|
console.info(`[dev-crons] ${path} → ${res.status} ${snippet}`);
|
|
}
|
|
}
|
|
|
|
async function main(): Promise<void> {
|
|
const base = (process.env.NEXT_PUBLIC_APP_URL ?? "http://localhost:3000").replace(/\/$/, "");
|
|
const secret = process.env.INTERNAL_CRON_SECRET?.trim() || requiredEnv("INTERNAL_SECRET");
|
|
|
|
console.info("[dev-crons] alvo HTTP", base);
|
|
console.info("[dev-crons] banco (Supabase)", supabaseHost());
|
|
console.info(
|
|
"[dev-crons] se esse host for o da VPS, pare — o drain local disputa event_log/job_queue com produção",
|
|
);
|
|
console.info(`[dev-crons] intervalo ${INTERVAL_MS}ms — Ctrl+C encerra`);
|
|
|
|
await tick(base, secret);
|
|
setInterval(() => {
|
|
void tick(base, secret).catch((err: unknown) => {
|
|
console.error("[dev-crons] tick falhou", err instanceof Error ? err.message : err);
|
|
});
|
|
}, INTERVAL_MS);
|
|
}
|
|
|
|
void main().catch((err: unknown) => {
|
|
console.error(err instanceof Error ? err.message : err);
|
|
process.exit(1);
|
|
});
|