fix: fallback when desktop release direct upload is missing

This commit is contained in:
2026-06-23 00:26:12 +08:00
parent d5e592e290
commit 8e92737bc2
@@ -85,6 +85,8 @@ const DESKTOP_CLIENT_RELEASE_COMPLETE_TIMEOUT_MS = 10 * 60 * 1000
const DESKTOP_CLIENT_RELEASE_CHUNK_SIZE_BYTES = 16 * 1024 * 1024 const DESKTOP_CLIENT_RELEASE_CHUNK_SIZE_BYTES = 16 * 1024 * 1024
const DESKTOP_CLIENT_RELEASE_HASH_CHUNK_SIZE_BYTES = 8 * 1024 * 1024 const DESKTOP_CLIENT_RELEASE_HASH_CHUNK_SIZE_BYTES = 8 * 1024 * 1024
const DESKTOP_CLIENT_RELEASE_CHUNK_RETRIES = 2 const DESKTOP_CLIENT_RELEASE_CHUNK_RETRIES = 2
const DIRECT_UPLOAD_NOT_FOUND_ERROR_CODE = 40078
const DIRECT_UPLOAD_NOT_FOUND_ERROR_MESSAGE = 'direct_upload_not_found'
export interface DesktopClientReleaseUploadProgress { export interface DesktopClientReleaseUploadProgress {
loaded: number loaded: number
@@ -199,6 +201,7 @@ export const desktopClientReleaseApi = {
total: file.size, total: file.size,
percent: 0, percent: 0,
stage: 'uploading', stage: 'uploading',
message: '直传未完成,已切换为后端分片上传',
}) })
return uploadOSSInChunks(file, target) return uploadOSSInChunks(file, target)
} }
@@ -330,7 +333,11 @@ async function completeDirectUpload(
} }
function isDirectUploadNotFoundError(error: unknown): boolean { function isDirectUploadNotFoundError(error: unknown): boolean {
return error instanceof OpsApiError && error.code === 40078 return (
error instanceof OpsApiError &&
(error.code === DIRECT_UPLOAD_NOT_FOUND_ERROR_CODE ||
error.message === DIRECT_UPLOAD_NOT_FOUND_ERROR_MESSAGE)
)
} }
function directUploadHeaders(headers: Record<string, string> | undefined): Record<string, string> { function directUploadHeaders(headers: Record<string, string> | undefined): Record<string, string> {
@@ -342,6 +349,7 @@ function directUploadHeaders(headers: Record<string, string> | undefined): Recor
function shouldFallbackToChunkedUpload(error: unknown): boolean { function shouldFallbackToChunkedUpload(error: unknown): boolean {
if (axios.isAxiosError(error)) return true if (axios.isAxiosError(error)) return true
if (isDirectUploadNotFoundError(error)) return true
return error instanceof Error && error.message === 'missing_direct_upload_url' return error instanceof Error && error.message === 'missing_direct_upload_url'
} }
@@ -377,6 +385,10 @@ async function pollCompleteJob(
if (job.status === 'failed') { if (job.status === 'failed') {
throw new OpsApiError({ throw new OpsApiError({
message: job.error_code || 'desktop_client_release_upload_failed', message: job.error_code || 'desktop_client_release_upload_failed',
code:
job.error_code === DIRECT_UPLOAD_NOT_FOUND_ERROR_MESSAGE
? DIRECT_UPLOAD_NOT_FOUND_ERROR_CODE
: undefined,
detail: job.error || job.message || '上传确认失败', detail: job.error || job.message || '上传确认失败',
}) })
} }