Skip to content

Commit

Permalink
Feat: send chunk uploading request to slave server
Browse files Browse the repository at this point in the history
  • Loading branch information
HFO4 committed Feb 28, 2022
1 parent 98dba63 commit eb3f329
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 7 deletions.
34 changes: 33 additions & 1 deletion src/component/Uploader/core/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
CreateUploadSessionError,
DeleteUploadSessionError,
LocalChunkUploadError,
SlaveChunkUploadError,
} from "../errors";
import { ChunkInfo } from "../uploader/chunk";
import { Progress } from "../uploader/base";
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;
}
16 changes: 15 additions & 1 deletion src/component/Uploader/core/errors/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export enum UploaderErrorName {
FailedDeleteUploadSession = "FailedDeleteUploadSession",
HTTPRequestFailed = "HTTPRequestFailed",
LocalChunkUploadFailed = "LocalChunkUploadFailed",
SlaveChunkUploadFailed = "SlaveChunkUploadFailed",
WriteCtxFailed = "WriteCtxFailed",
RemoveCtxFailed = "RemoveCtxFailed",
ReadCtxFailed = "ReadCtxFailed",
Expand All @@ -21,6 +22,7 @@ const RETRY_ERROR_LIST = [
UploaderErrorName.FailedCreateUploadSession,
UploaderErrorName.HTTPRequestFailed,
UploaderErrorName.LocalChunkUploadFailed,
UploaderErrorName.SlaveChunkUploadFailed,
UploaderErrorName.RequestCanceled,
];

Expand Down Expand Up @@ -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);
Expand All @@ -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);
}
}
2 changes: 2 additions & 0 deletions src/component/Uploader/core/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,6 @@ export interface UploadCredential {
sessionID: string;
expires: number;
chunkSize: number;
uploadURLs: string[];
credential: string;
}
4 changes: 2 additions & 2 deletions src/component/Uploader/core/uploader/local.ts
Original file line number Diff line number Diff line change
@@ -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) => {
Expand Down
7 changes: 4 additions & 3 deletions src/component/Uploader/core/uploader/remote.ts
Original file line number Diff line number Diff line change
@@ -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);
Expand Down

0 comments on commit eb3f329

Please sign in to comment.