43 lines
1.3 KiB
JavaScript
43 lines
1.3 KiB
JavaScript
// Runs inside the application container. No external cron service or browser is required.
|
|
const secret = process.env.NOTDIENST_JOB_SECRET;
|
|
if (!secret || secret.length < 32) {
|
|
console.error(
|
|
"Notdienst-Fristprüfung deaktiviert: NOTDIENST_JOB_SECRET muss mindestens 32 Zeichen haben.",
|
|
);
|
|
process.exit(1);
|
|
}
|
|
const port = Number(process.env.PORT || 3000);
|
|
if (!Number.isInteger(port) || port < 1 || port > 65535) process.exit(1);
|
|
let stopped = false;
|
|
let timer;
|
|
async function tick() {
|
|
const started = Date.now();
|
|
try {
|
|
const response = await fetch(
|
|
`http://127.0.0.1:${port}/api/jobs/notdienstalarme`,
|
|
{
|
|
method: "POST",
|
|
headers: { authorization: `Bearer ${secret}` },
|
|
signal: AbortSignal.timeout(50000),
|
|
},
|
|
);
|
|
if (!response.ok)
|
|
console.error(
|
|
`Notdienst-Fristprüfung: HTTP ${response.status}; erneuter Versuch in einer Minute.`,
|
|
);
|
|
} catch {
|
|
console.error(
|
|
"Notdienst-Fristprüfung momentan nicht erreichbar; erneuter Versuch in einer Minute.",
|
|
);
|
|
}
|
|
if (!stopped)
|
|
timer = setTimeout(tick, Math.max(1000, 60000 - (Date.now() - started)));
|
|
}
|
|
for (const signal of ["SIGINT", "SIGTERM"])
|
|
process.on(signal, () => {
|
|
stopped = true;
|
|
clearTimeout(timer);
|
|
process.exit(0);
|
|
});
|
|
timer = setTimeout(tick, 5000);
|