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 }),
});
}
|