{"version":3,"file":"MaxFileUpload.mjs","sources":["../../../../../../packages/upload-sdk/src/upload-client/MaxFileUpload.ts"],"sourcesContent":["import { Task, TaskQueue } from '../upload-core/TaskQueue';\nimport { EventEmitter } from '../upload-core/EventEmitter';\nimport { MultiThreadSplitor } from './split/imp-work/MultiThreadSplitor';\nimport { TestRequest } from './testRequest';\nimport type { RequestStrategy } from './RequestStrategy.ts';\nimport type { ChunkSplitor } from './split/ChunkSplitor.ts';\nimport type { Chunk } from './split/FileChunk.ts';\n\nexport interface FileListener {\n  uploadSuccessListener(chunk: Chunk): void;\n\n  chunkListener(chunks: Chunk[]): void;\n\n  chunkEndListener(hash: string): void;\n}\n\nexport class MaxFileUpload {\n  private requestStrategy: RequestStrategy; // 请求策略，没有传递则使用默认策略\n  private splitStrategy: ChunkSplitor; // 分片策略，没有传递则默认多线程分片\n  private taskQueue: TaskQueue; // 任务队列\n  private file: File;\n  private token = '';\n  private uploadEmitter = new EventEmitter<'progress' | 'end'>();\n  private chunkSize: number = 5 * 1024 * 1024;\n\n  private fileListener: FileListener | null = null;\n\n  setFileListener(listener: FileListener) {\n    this.fileListener = listener;\n    return this;\n  }\n\n  // 设置请求策略\n  setRequestStrategy(requestStrategy: RequestStrategy) {\n    this.requestStrategy = requestStrategy;\n    return this;\n  }\n\n  // 设置分片策略\n  setSplitStrategy(splitStrategy: ChunkSplitor) {\n    this.splitStrategy = splitStrategy;\n    return this;\n  }\n\n  // 设置任务队列\n  setTaskQueue(taskQueue: TaskQueue) {\n    this.taskQueue = taskQueue;\n    return this;\n  }\n\n  // 设置文件\n  setFile(file: File) {\n    this.file = file;\n    return this;\n  }\n\n  // 设置token\n  setToken(token: string) {\n    this.token = token;\n    return this;\n  }\n\n  // 设置分片大小\n  setChunkSize(chunkSize: number) {\n    this.chunkSize = chunkSize;\n    return this;\n  }\n\n  static with(file: File) {\n    return new MaxFileUpload(file);\n  }\n\n  private constructor(file: File) {\n    // 私有构造函数，禁止直接实例化\n    this.file = file;\n    this.requestStrategy = new TestRequest();\n    this.taskQueue = new TaskQueue(4);\n    this.splitStrategy = new MultiThreadSplitor(this.file, this.chunkSize);\n  }\n\n  // 初始化\n  async start() {\n    // 获取文件token\n    this.token = await this.requestStrategy.createFile(this.file);\n    // 开始分片\n    this.splitStrategy.split();\n    // 分片事件监听\n    this.splitStrategy.on('chunks', this.handleChunks.bind(this));\n    this.splitStrategy.on('wholeHash', this.handleWholeHash.bind(this));\n\n    // this.uploadEmitter.on('progress', (chunk: Chunk) => {\n    //   // 上传进度事件\n    //   // ...\n    // });\n    this.uploadEmitter.on('end', (chunk: Chunk) => {\n      // 上传结束事件\n      // ...\n      // console.log('上传结束事件----', chunk.index);\n      if (this.fileListener?.uploadSuccessListener) {\n        this.fileListener.uploadSuccessListener(chunk);\n      }\n    });\n  }\n\n  // 分片事件处理\n  private handleChunks(chunks: Chunk[]) {\n    if (this.fileListener?.chunkListener) {\n      this.fileListener.chunkListener(chunks);\n    }\n    // 分片上传任务加入队列\n    chunks.forEach((chunk) => {\n      this.taskQueue.addAndStart(new Task(this.uploadChunk.bind(this), chunk));\n    });\n  }\n\n  async uploadChunk(chunk: Chunk) {\n    // hash校验\n    const resp = await this.requestStrategy.patchHash(\n      this.token,\n      chunk.hash,\n      'chunk'\n    );\n    if (resp.hasFile) {\n      // 文件已存在\n      return;\n    }\n    // 分片上传\n    await this.requestStrategy.uploadChunk(chunk, this.uploadEmitter);\n  }\n\n  // 整体hash事件处理\n  private async handleWholeHash(hash: string) {\n    // console.log('整个文件hash', hash);\n    if (this.fileListener?.chunkEndListener) {\n      this.fileListener.chunkEndListener(hash);\n    }\n    // hash校验\n    const resp = await this.requestStrategy.patchHash(this.token, hash, 'file');\n    if (resp.hasFile) {\n      // 文件已存在\n      // this.emit('end', resp.url);\n      return;\n    }\n    // 根据resp.rest重新编排后续任务\n    // ...\n  }\n}\n"],"names":[],"mappings":"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"}