@chunk-master/core
Version:
Core library for chunk-based file upload with resumable functionality
252 lines (228 loc) • 7.25 kB
TypeScript
import { Requestor } from '@net-vert/core';
import { UnifiedRequestor } from '@net-vert/core';
declare class BigFileUploader implements Uploader {
file: File;
private _status;
tasks: UploadTask[];
totalChunks: number;
fileInfo: any | null;
constructor(file: File);
start(): Promise<any>;
private preupload;
private uploadFile;
private uploadChunks;
setTask(chunk: UploadChunk, index: number): void;
private mergeChunks;
pause(): void;
cancel(): void;
get progressInfo(): {
total: number;
loaded: number;
progress: number;
};
get status(): STATUS;
}
declare type ChunkParams = {
/** 原始文件 */
file: File;
/** 切片起始位置 */
start: number;
/** 切片结束位置 */
end: number;
/** 配置的切片大小 */
chunkSize: number;
};
export declare const config: (cfg: UserConfig) => {
requestor: Requestor;
};
export declare function createFileUploader(file: File): SimpleFileUploader | BigFileUploader;
declare type Pool = {
add: (id: string, task: Task) => Promise<any>;
remove: (id: string) => void;
} & Record<string, any>;
declare interface PoolConfig {
/** 并发上传的切片数量 */
parallelCount?: number;
/** 每个分片上传失败后的最大重试次数 */
retries?: number;
}
declare type ProgressInfo = {
loaded: number;
total: number;
progress: number;
};
declare type SetTask = (chunk: UploadChunk, index: number) => void;
declare class SimpleFileUploader implements Uploader {
file: File;
private _status;
tasks: UploadTask[];
fileInfo: any | null;
constructor(file: File);
start(): Promise<any>;
private uploadFile;
pause(): void;
cancel(): void;
get progressInfo(): ProgressInfo;
get status(): STATUS;
}
declare type SliceFile = (e: ChunkParams, callBack: SetTask) => Promise<UploadChunk[]>;
export declare enum STATUS {
PREPARING = "preparing",//准备中,可能有增强文件信息需要异步获取
PREPARE_FAILED = "prepare_failed",// 准备失败状态
PENDING = "pending",//上传前,没点击开始上传
PAUSE = "pause",//上传暂停
UPLOADING = "uploading",//上传中
SUCCESS = "success",//上传成功
FAIL = "fail"
}
declare type Task = () => Promise<any>;
declare enum TASK_STATUS {
PENDING = "pending",//等待中
SUCCESS = "success",
FAIL = "fail"
}
declare interface UploadChunk {
/** 文件数据 */
readonly chunk: Blob;
/** 文件位序 */
readonly index: number;
/** 开始位置 */
readonly start: number;
/** 结束位置 */
readonly end: number;
/** 文件大小 */
readonly size: number;
/** 文件哈希 */
readonly hash?: string;
}
declare interface UploadConfig<N extends Number = number, R extends any = any> {
/** 最大允许上传的文件大小(单位:字节), 若开启 mergeApi, 超过会走大文件上传 */
maxSize: N;
/**
* 切片大小(单位:字节),默认建议 1~10MB
* 注意: 当自定义 sliceFile 函数时,应当遵循此处设置的 chunkSize 值进行切片
* 如果必须使用不同的切片大小,请确保上传逻辑能够正确处理
*/
chunkSize: N | number;
/** hash 接口(可选) */
hashApi?: (hash: string) => boolean | Promise<boolean>;
/** 自定义hash计算函数 */
hashcalculation?: (blob: Blob) => string | Promise<string>;
/** 多线程计算 */
multiThread: boolean;
/** 请求者 */
requestor: Requestor;
/**
* 上传接口地址
*/
uploadUrl: string;
/**
* 上传接口方式
*/
uploadMethod: "get" | "post" | "delete" | "put";
/**
* 上传前处理钩子
* 用于处理上传数据,返回最终发送的数据
* @param chunk 上传块信息
* @returns 处理后的请求数据
*/
beforeUpload?: (chunk: UploadChunk, uploader: Uploader) => FormData | Record<string, any> | Promise<FormData | Record<string, any>>;
/**
* 合并切片接口地址(可选)
*/
mergeApi?: (results: R[], uploader: Uploader) => any | Promise<any>;
/**
* 合并前处理钩子(可选)
* 用于处理合并请求的数据
* @param results 所有切片上传成功的结果数组
* @returns 处理后的合并请求数据
*/
beforeMerge?: (results: R[], uploader: Uploader) => any | Promise<any>;
/**
* 自定义文件切片
* @param file 要切片的文件
* @param chunkSize 配置中指定的切片大小,建议遵循此值
* @param callback 每个切片的回调函数
*/
sliceFile: SliceFile;
/**
* 异步文件信息提供器(可选)
* 在上传开始前异步获取或增强文件信息
* @param file 原始文件对象
* @returns Promise 返回原始File或增强的文件信息
*/
prepareFileInfo?: (file: File) => Promise<any>;
/** 自定义并发池 */
pool: Pool;
}
export declare interface Uploader {
progressInfo: ProgressInfo;
status: UploadStatus;
tasks: UploadTask[];
file: File;
start: () => Promise<void>;
pause: () => void;
cancel: () => void;
}
export declare interface Uploader {
progressInfo: ProgressInfo;
status: UploadStatus;
tasks: UploadTask[];
file: File;
fileInfo: any;
start: () => Promise<void>;
pause: () => void;
cancel: () => void;
}
declare type UploadStatus = STATUS;
declare interface UploadTask<T = any> {
/** 唯一任务标识 */
readonly id: string;
/** 任务进度 0-任务大小 */
progressInfo: ProgressInfo;
/** 任务状态 */
status: TASK_STATUS;
/** 剩余重试次数 */
/** 取消控制器 */
controller: AbortController;
/** 执行任务 */
execute: () => Promise<T>;
/** 取消任务 */
cancel: () => void;
/** 暂停任务 */
pause: () => void;
/** 文件元数据 */
metadata: UploadChunk;
/** 父上传器信息 */
uploader: Uploader;
/** 当前任务promise */
promise: Promise<T>;
}
declare interface UploadTask<T = any> {
/** 唯一任务标识 */
readonly id: string;
/** 任务进度 0-任务大小 */
progressInfo: ProgressInfo;
/** 任务状态 */
status: TASK_STATUS;
/** 剩余重试次数 */
/** 取消控制器 */
controller: AbortController;
/** 执行任务 */
execute: () => Promise<T>;
/** 取消任务 */
cancel: () => void;
/** 暂停任务 */
pause: () => void;
/** 文件元数据 */
metadata: UploadChunk;
/** 当前任务promise */
promise: Promise<T>;
}
declare type UserConfig<R extends any = any> = UserRequestConfig & PoolConfig & Partial<UploadConfig<number, R>>;
declare type UserRequestConfig = {
/** 接口 请求体 */
request: UnifiedRequestor;
uploadUrl: string;
};
export { }