Feat: send chunk uploading request to slave server

This commit is contained in:
HFO4 2022-02-28 17:47:01 +08:00
parent 98dba63496
commit eb3f32922a
5 changed files with 56 additions and 7 deletions

View File

@ -4,6 +4,7 @@ import {
CreateUploadSessionError,
DeleteUploadSessionError,
LocalChunkUploadError,
SlaveChunkUploadError,
} from "../errors";
import { ChunkInfo } from "../uploader/chunk";
import { Progress } from "../uploader/base";
@ -38,7 +39,7 @@ export async function deleteUploadSession(id: string): Promise<any> {
return res.data.data;
}
export async function loadUploadChunk(
export async function localUploadChunk(
sessionID: string,
chunk: ChunkInfo,
onProgress: (p: Progress) => void,
@ -66,3 +67,34 @@ export async function loadUploadChunk(
return res.data.data;
}
export async function slaveUploadChunk(
url: string,
credential: string,
chunk: ChunkInfo,
onProgress: (p: Progress) => void,
cancel: CancelToken
): Promise<any> {
const res = await requestAPI<any>(`${url}?chunk=${chunk.index}`, {
method: "post",
headers: {
"content-type": "application/octet-stream",
Authorization: credential,
},
data: chunk.chunk,
onUploadProgress: (progressEvent) => {
onProgress({
loaded: progressEvent.loaded,
total: progressEvent.total,
});
},
cancelToken: cancel,
withCredentials: false,
});
if (res.data.code !== 0) {
throw new SlaveChunkUploadError(res.data, chunk.index);
}
return res.data.data;
}

View File

@ -9,6 +9,7 @@ export enum UploaderErrorName {
FailedDeleteUploadSession = "FailedDeleteUploadSession",
HTTPRequestFailed = "HTTPRequestFailed",
LocalChunkUploadFailed = "LocalChunkUploadFailed",
SlaveChunkUploadFailed = "SlaveChunkUploadFailed",
WriteCtxFailed = "WriteCtxFailed",
RemoveCtxFailed = "RemoveCtxFailed",
ReadCtxFailed = "ReadCtxFailed",
@ -21,6 +22,7 @@ const RETRY_ERROR_LIST = [
UploaderErrorName.FailedCreateUploadSession,
UploaderErrorName.HTTPRequestFailed,
UploaderErrorName.LocalChunkUploadFailed,
UploaderErrorName.SlaveChunkUploadFailed,
UploaderErrorName.RequestCanceled,
];
@ -142,7 +144,7 @@ export class HTTPError extends UploaderError {
}
}
// 无法创建上传会话
// 本地分块上传失败
export class LocalChunkUploadError extends APIError {
constructor(response: Response<any>, protected chunkIndex: number) {
super(UploaderErrorName.LocalChunkUploadFailed, "", response);
@ -160,3 +162,15 @@ export class RequestCanceledError extends UploaderError {
super(UploaderErrorName.RequestCanceled, "Request canceled");
}
}
// 从机分块上传失败
export class SlaveChunkUploadError extends APIError {
constructor(response: Response<any>, protected chunkIndex: number) {
super(UploaderErrorName.SlaveChunkUploadFailed, "", response);
}
public Message(i18n: string): string {
this.message = `分片 [${this.chunkIndex}] 上传失败`;
return super.Message(i18n);
}
}

View File

@ -54,4 +54,6 @@ export interface UploadCredential {
sessionID: string;
expires: number;
chunkSize: number;
uploadURLs: string[];
credential: string;
}

View File

@ -1,9 +1,9 @@
import Chunk, { ChunkInfo } from "./chunk";
import { loadUploadChunk } from "../api";
import { localUploadChunk } from "../api";
export default class Local extends Chunk {
protected async uploadChunk(chunkInfo: ChunkInfo) {
return loadUploadChunk(
return localUploadChunk(
this.task.session?.sessionID!,
chunkInfo,
(p) => {

View File

@ -1,10 +1,11 @@
import Chunk, { ChunkInfo } from "./chunk";
import { loadUploadChunk } from "../api";
import { slaveUploadChunk } from "../api";
export default class Remote extends Chunk {
protected async uploadChunk(chunkInfo: ChunkInfo) {
return loadUploadChunk(
this.task.session?.sessionID!,
return slaveUploadChunk(
`${this.task.session?.uploadURLs[0]!}`,
this.task.session?.credential!,
chunkInfo,
(p) => {
this.updateChunkProgress(p.loaded, chunkInfo.index);