51 lines
1.5 KiB
TypeScript
51 lines
1.5 KiB
TypeScript
import { createLogger } from '@/lib/logger';
|
|
import { generateClassroom, type GenerateClassroomInput } from '@/lib/server/classroom-generation';
|
|
import {
|
|
markClassroomGenerationJobFailed,
|
|
markClassroomGenerationJobRunning,
|
|
markClassroomGenerationJobSucceeded,
|
|
updateClassroomGenerationJobProgress,
|
|
} from '@/lib/server/classroom-job-store';
|
|
|
|
const log = createLogger('ClassroomJob');
|
|
const runningJobs = new Map<string, Promise<void>>();
|
|
|
|
export function runClassroomGenerationJob(
|
|
jobId: string,
|
|
input: GenerateClassroomInput,
|
|
baseUrl: string,
|
|
): Promise<void> {
|
|
const existing = runningJobs.get(jobId);
|
|
if (existing) {
|
|
return existing;
|
|
}
|
|
|
|
const jobPromise = (async () => {
|
|
try {
|
|
await markClassroomGenerationJobRunning(jobId);
|
|
|
|
const result = await generateClassroom(input, {
|
|
baseUrl,
|
|
onProgress: async (progress) => {
|
|
await updateClassroomGenerationJobProgress(jobId, progress);
|
|
},
|
|
});
|
|
|
|
await markClassroomGenerationJobSucceeded(jobId, result);
|
|
} catch (error) {
|
|
const message = error instanceof Error ? error.message : String(error);
|
|
log.error(`Classroom generation job ${jobId} failed:`, error);
|
|
try {
|
|
await markClassroomGenerationJobFailed(jobId, message);
|
|
} catch (markFailedError) {
|
|
log.error(`Failed to persist failed status for job ${jobId}:`, markFailedError);
|
|
}
|
|
} finally {
|
|
runningJobs.delete(jobId);
|
|
}
|
|
})();
|
|
|
|
runningJobs.set(jobId, jobPromise);
|
|
return jobPromise;
|
|
}
|