File size: 1,537 Bytes
f56a29b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 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;
}
|