classroom-job-runner.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { createLogger } from '@/lib/logger';
  2. import { generateClassroom, type GenerateClassroomInput } from '@/lib/server/classroom-generation';
  3. import {
  4. markClassroomGenerationJobFailed,
  5. markClassroomGenerationJobRunning,
  6. markClassroomGenerationJobSucceeded,
  7. updateClassroomGenerationJobProgress,
  8. } from '@/lib/server/classroom-job-store';
  9. const log = createLogger('ClassroomJob');
  10. const runningJobs = new Map<string, Promise<void>>();
  11. export function runClassroomGenerationJob(
  12. jobId: string,
  13. input: GenerateClassroomInput,
  14. baseUrl: string,
  15. ): Promise<void> {
  16. const existing = runningJobs.get(jobId);
  17. if (existing) {
  18. return existing;
  19. }
  20. const jobPromise = (async () => {
  21. try {
  22. await markClassroomGenerationJobRunning(jobId);
  23. const result = await generateClassroom(input, {
  24. baseUrl,
  25. onProgress: async (progress) => {
  26. await updateClassroomGenerationJobProgress(jobId, progress);
  27. },
  28. });
  29. await markClassroomGenerationJobSucceeded(jobId, result);
  30. } catch (error) {
  31. const message = error instanceof Error ? error.message : String(error);
  32. log.error(`Classroom generation job ${jobId} failed:`, error);
  33. try {
  34. await markClassroomGenerationJobFailed(jobId, message);
  35. } catch (markFailedError) {
  36. log.error(`Failed to persist failed status for job ${jobId}:`, markFailedError);
  37. }
  38. } finally {
  39. runningJobs.delete(jobId);
  40. }
  41. })();
  42. runningJobs.set(jobId, jobPromise);
  43. return jobPromise;
  44. }