MCPcopy Index your code
hub / github.com/simstudioai/sim / completeOne

Function completeOne

apps/sim/app/api/files/multipart/route.ts:333–381  ·  view source on GitHub ↗
(payload: UploadTokenPayload, parts: ClientCompletedPart[])

Source from the content-addressed store, hash-verified

331 storageProvider === 'blob' ? await import('@/lib/uploads/providers/blob/client') : null
332
333 const completeOne = async (payload: UploadTokenPayload, parts: ClientCompletedPart[]) => {
334 const { uploadId, key, context } = payload
335 const config = getStorageConfig(context)
336
337 let completed: { location: string; path: string; key: string }
338 if (storageProvider === 's3' && s3Module) {
339 const { completeS3MultipartUpload } = s3Module
340 const s3Parts = parts.map((p) => {
341 if (!p.etag) {
342 throw new Error(`Missing etag for S3 part ${p.partNumber}`)
343 }
344 return { ETag: p.etag, PartNumber: p.partNumber }
345 })
346 completed = await completeS3MultipartUpload(
347 key,
348 uploadId,
349 s3Parts,
350 buildS3CustomConfig(config)
351 )
352 } else if (storageProvider === 'blob' && blobModule) {
353 const { completeMultipartUpload, deriveBlobBlockId } = blobModule
354 const blobParts = parts.map((p) => ({
355 partNumber: p.partNumber,
356 blockId: deriveBlobBlockId(p.partNumber),
357 }))
358 completed = await completeMultipartUpload(key, blobParts, buildBlobCustomConfig(config))
359 } else {
360 throw new Error(`Unsupported storage provider: ${storageProvider}`)
361 }
362
363 try {
364 await recordKnowledgeBaseOwnership(payload, completed.key)
365 } catch (error) {
366 // The object is committed, but without an ownership binding a KB file
367 // is unreadable and undeletable via the KB paths. Remove the orphan
368 // best-effort and surface a retryable error so the client re-uploads.
369 if (payload.context === 'knowledge-base') {
370 await deleteFile({ key: completed.key, context: 'knowledge-base' }).catch(() => {})
371 }
372 throw error
373 }
374
375 return {
376 success: true as const,
377 location: completed.location,
378 path: completed.path,
379 key: completed.key,
380 }
381 }
382
383 if ('uploads' in data && Array.isArray(data.uploads)) {
384 const verified: Array<{ payload: UploadTokenPayload; parts: ClientCompletedPart[] }> = []

Callers 1

route.tsFile · 0.85

Calls 8

getStorageConfigFunction · 0.90
deleteFileFunction · 0.90
buildS3CustomConfigFunction · 0.85
deriveBlobBlockIdFunction · 0.85
completeMultipartUploadFunction · 0.85
buildBlobCustomConfigFunction · 0.85

Tested by

no test coverage detected