Leon4gr45/builder
0
1// lib/server-generate/build-delegation-handler.ts2import { vfs } from '@/lib/vfs';3import { handleFilesChanged } from './file-sync-handler';4 5export async function handleBuildRequested(data: {6 sourceProjectId: string;7 taskId: string;8 fileManifest?: Record<string, number>;9}): Promise<void> {10 const { sourceProjectId, taskId, fileManifest } = data;11 12 try {13 if (fileManifest) {14 const stalePaths = Object.keys(fileManifest);15 if (stalePaths.length > 0) {16 await handleFilesChanged({ sourceProjectId, paths: stalePaths, taskId });17 }18 }19 20 const { VirtualServer } = await import('@/lib/preview/virtual-server');21 const { drainCompileErrors } = await import('@/lib/preview/compile-errors');22 23 const project = await vfs.getProject(sourceProjectId);24 if (!project) {25 await postBuildResult(taskId, false, ['Project not found']);26 return;27 }28 29 const server = new VirtualServer(vfs, sourceProjectId, { runtime: project.settings?.runtime });30 await server.compileProject();31 server.cleanupBlobUrls();32 33 const compileErrors = drainCompileErrors();34 const errorMessages = compileErrors.map((e) => `${e.file}: ${e.error}`);35 await postBuildResult(taskId, errorMessages.length === 0, errorMessages);36 } catch (error) {37 const message = error instanceof Error ? error.message : String(error);38 await postBuildResult(taskId, false, [message]);39 }40}41 42async function postBuildResult(taskId: string, success: boolean, errors?: string[]): Promise<void> {43 await fetch('/api/server-generate/build-result', {44 method: 'POST',45 headers: { 'Content-Type': 'application/json' },46 body: JSON.stringify({ taskId, success, errors }),47 });48}49 