From d67a896b3257ece3d80c7b698f17b6b7d37a3e82 Mon Sep 17 00:00:00 2001 From: ImBenji Date: Tue, 28 Apr 2026 18:58:49 +0100 Subject: [PATCH] harden database interactions and improve error handling --- server/plugins/repairBrokenLessons.ts | 12 ++++++------ server/utils/generateTTS.ts | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/server/plugins/repairBrokenLessons.ts b/server/plugins/repairBrokenLessons.ts index 37d206e..5861fe1 100644 --- a/server/plugins/repairBrokenLessons.ts +++ b/server/plugins/repairBrokenLessons.ts @@ -11,10 +11,11 @@ import { } from "../utils/generateTTS"; const INTERVAL_MS = 5 * 60 * 1000; -const STALE_MINUTES = 15; +const STALE_PENDING_MINUTES = 15; +const STALE_GENERATING_MINUTES = 45; // generating can take a while for big lessons -function staleCutoff() { - return new Date(Date.now() - STALE_MINUTES * 60 * 1000).toISOString(); +function staleCutoff(minutes: number) { + return new Date(Date.now() - minutes * 60 * 1000).toISOString(); } async function repairCycle() { @@ -49,7 +50,6 @@ async function repairCycle() { where: eq(topics.status, "generating"), }); - const cutoff = staleCutoff(); for (const t of stuckGenerating) { const lesson = await db.query.lessons.findFirst({ where: eq(lessons.topicId, t.id) }); @@ -93,7 +93,7 @@ async function repairCycle() { // ── 4. stale generating branches (server died mid-branch) ──────────────── try { - const cutoff = staleCutoff(); + const cutoff = staleCutoff(STALE_GENERATING_MINUTES); const stale = await db .update(lessons) @@ -121,7 +121,7 @@ async function repairCycle() { // ── 5. stale pending branches (never kicked off or abandoned) ──────────── try { - const cutoff = staleCutoff(); + const cutoff = staleCutoff(STALE_PENDING_MINUTES); const stale = await db .update(lessons) diff --git a/server/utils/generateTTS.ts b/server/utils/generateTTS.ts index 03379ce..04aba43 100644 --- a/server/utils/generateTTS.ts +++ b/server/utils/generateTTS.ts @@ -1,5 +1,5 @@ import { mkdir, writeFile, access } from "fs/promises"; -import { resolve } from "path"; +import { resolve, dirname } from "path"; import { askAI } from "./openrouter"; import { ttsLimiter } from "./limiter"; @@ -378,7 +378,7 @@ export async function generateClip( buffer = Buffer.from(await res.arrayBuffer()); } - await mkdir(resolve(process.cwd(), "data/audio/labels"), { recursive: true }); + await mkdir(dirname(outPath), { recursive: true }); await writeFile(outPath, buffer); return { cost }; } catch (err: any) {