fix: fallback when desktop release direct upload is missing
This commit is contained in:
@@ -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 || '上传确认失败',
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user