File size: 1,715 Bytes
391c43e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
// lib/server-generate/build-delegation-handler.ts
import { vfs } from '@/lib/vfs';
import { handleFilesChanged } from './file-sync-handler';

export async function handleBuildRequested(data: {
  sourceProjectId: string;
  taskId: string;
  fileManifest?: Record<string, number>;
}): Promise<void> {
  const { sourceProjectId, taskId, fileManifest } = data;

  try {
    if (fileManifest) {
      const stalePaths = Object.keys(fileManifest);
      if (stalePaths.length > 0) {
        await handleFilesChanged({ sourceProjectId, paths: stalePaths, taskId });
      }
    }

    const { VirtualServer } = await import('@/lib/preview/virtual-server');
    const { drainCompileErrors } = await import('@/lib/preview/compile-errors');

    const project = await vfs.getProject(sourceProjectId);
    if (!project) {
      await postBuildResult(taskId, false, ['Project not found']);
      return;
    }

    const server = new VirtualServer(vfs, sourceProjectId, { runtime: project.settings?.runtime });
    await server.compileProject();
    server.cleanupBlobUrls();

    const compileErrors = drainCompileErrors();
    const errorMessages = compileErrors.map((e) => `${e.file}: ${e.error}`);
    await postBuildResult(taskId, errorMessages.length === 0, errorMessages);
  } catch (error) {
    const message = error instanceof Error ? error.message : String(error);
    await postBuildResult(taskId, false, [message]);
  }
}

async function postBuildResult(taskId: string, success: boolean, errors?: string[]): Promise<void> {
  await fetch('/api/server-generate/build-result', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ taskId, success, errors }),
  });
}