diff --git a/app/api/sandbox/upload/route.ts b/app/api/sandbox/upload/route.ts index 48f2395c5..2fb52414b 100644 --- a/app/api/sandbox/upload/route.ts +++ b/app/api/sandbox/upload/route.ts @@ -25,6 +25,7 @@ export async function POST(request: Request): Promise { return { maximumSizeInBytes: 100 * 1024 * 1024, // 100MB + addRandomSuffix: true, }; }, onUploadCompleted: async () => {}, diff --git a/lib/sandboxes/uploadSandboxFiles.ts b/lib/sandboxes/uploadSandboxFiles.ts index d0e3f56ca..c7db2d161 100644 --- a/lib/sandboxes/uploadSandboxFiles.ts +++ b/lib/sandboxes/uploadSandboxFiles.ts @@ -36,7 +36,7 @@ export async function uploadSandboxFiles({ path?: string; message?: string; }): Promise<{ uploaded: UploadedFile[]; errors?: string[] }> { - const blobFiles = await Promise.all( + const results = await Promise.allSettled( files.map(async (file) => { const blob = await upload(file.name, file, { access: "public", @@ -47,6 +47,23 @@ export async function uploadSandboxFiles({ }), ); + const blobFiles: { url: string; name: string }[] = []; + const blobErrors: string[] = []; + + results.forEach((r, i) => { + if (r.status === "fulfilled") { + blobFiles.push(r.value); + } else { + blobErrors.push(`${files[i].name}: ${r.reason?.message || "Upload failed"}`); + } + }); + + if (blobFiles.length === 0) { + throw new Error( + blobErrors[0] || "Failed to upload files to temporary storage", + ); + } + const response = await fetch(`${NEW_API_BASE_URL}/api/sandboxes/files`, { method: "POST", headers: { @@ -66,8 +83,10 @@ export async function uploadSandboxFiles({ throw new Error(data.error || "Failed to upload files"); } + const allErrors = [...blobErrors, ...(data.errors || [])]; + return { uploaded: data.uploaded || [], - errors: data.errors, + ...(allErrors.length > 0 && { errors: allErrors }), }; }