{"version":3,"file":"ChunkSplitor.mjs","sources":["../../../../../../../packages/upload-sdk/src/upload-client/split/ChunkSplitor.ts"],"sourcesContent":["// 分片的相关事件\n// chunks: 一部分分片产生了\n// wholeHash: 整个文件的hash计算完成\n// drain: 所有分片处理完成\nimport SparkMD5 from 'spark-md5';\nimport { EventEmitter } from '../../upload-core/EventEmitter';\nimport { createChunk } from './FileChunk';\nimport type { Chunk } from './FileChunk';\n\nexport type ChunkSplitorEvents = 'chunks' | 'wholeHash' | 'drain';\n\nexport abstract class ChunkSplitor extends EventEmitter<ChunkSplitorEvents> {\n  protected chunkSize: number; // 分片大小（单位字节）\n  protected file: File; // 待分片的文件\n  protected hash?: string; // 整个文件的hash\n  protected chunks: Chunk[]; // 分片列表\n  private handleChunkCount = 0; // 已计算hash的分片数量\n  private hasSplited = false; // 是否已经分片\n\n  constructor(file: File, chunkSize: number = 1024 * 1024 * 5) {\n    super();\n    this.file = file;\n    this.chunkSize = chunkSize;\n    // 获取分片数组\n    const chunkCount = Math.ceil(this.file.size / this.chunkSize);\n    this.chunks = Array.from({ length: chunkCount })\n      .fill(0)\n      .map((_, index) => createChunk(this.file, index, this.chunkSize));\n  }\n\n  split() {\n    if (this.hasSplited) {\n      return;\n    }\n    this.hasSplited = true;\n    const emitter = new EventEmitter<'chunks'>();\n    const list = [] as any[];\n    const chunksHanlder = (chunks: Chunk[]) => {\n      this.emit('chunks', chunks);\n      chunks.forEach((chunk) => {\n        // this.spark.append(chunk.hash);\n        list.push({\n          index: chunk.index,\n          sparkResult: chunk.sparkResult,\n        });\n      });\n      this.handleChunkCount += chunks.length;\n      if (this.handleChunkCount === this.chunks.length) {\n        // 计算完成\n        emitter.off('chunks', chunksHanlder);\n        const spark2 = new SparkMD5.ArrayBuffer();\n        list.sort((a, b) => a.index - b.index);\n        list.forEach((item) => {\n          spark2.append(item.sparkResult);\n        });\n        //读取整个文件hash\n        this.emit('wholeHash', spark2.end());\n        spark2.destroy();\n        this.emit('drain');\n      }\n    };\n    emitter.on('chunks', chunksHanlder);\n    this.calcHash(this.chunks, emitter);\n  }\n\n  // 计算每一个分片的hash\n  abstract calcHash(chunks: Chunk[], emitter: EventEmitter<'chunks'>): void;\n\n  // 分片完成后一些需要销毁的工作\n  abstract dispose(): void;\n}\n"],"names":[],"mappings":";;;;AAWO,MAAe,qBAAqB,YAAiC,CAAA;AAAA,EAQ1E,WAAY,CAAA,IAAA,EAAY,SAAoB,GAAA,IAAA,GAAO,OAAO,CAAG,EAAA;AAC3D,IAAM,KAAA,EAAA,CAAA;AAJR,IAAA,IAAA,CAAQ,gBAAmB,GAAA,CAAA,CAAA;AAC3B,IAAA,IAAA,CAAQ,UAAa,GAAA,KAAA,CAAA;AAInB,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAA;AACZ,IAAA,IAAA,CAAK,SAAY,GAAA,SAAA,CAAA;AAEjB,IAAA,MAAM,aAAa,IAAK,CAAA,IAAA,CAAK,KAAK,IAAK,CAAA,IAAA,GAAO,KAAK,SAAS,CAAA,CAAA;AAC5D,IAAK,IAAA,CAAA,MAAA,GAAS,MAAM,IAAK,CAAA,EAAE,QAAQ,UAAW,EAAC,EAC5C,IAAK,CAAA,CAAC,EACN,GAAI,CAAA,CAAC,GAAG,KAAU,KAAA,WAAA,CAAY,KAAK,IAAM,EAAA,KAAA,EAAO,IAAK,CAAA,SAAS,CAAC,CAAA,CAAA;AAAA,GACpE;AAAA,EAEA,KAAQ,GAAA;AACN,IAAA,IAAI,KAAK,UAAY,EAAA;AACnB,MAAA,OAAA;AAAA,KACF;AACA,IAAA,IAAA,CAAK,UAAa,GAAA,IAAA,CAAA;AAClB,IAAM,MAAA,OAAA,GAAU,IAAI,YAAuB,EAAA,CAAA;AAC3C,IAAA,MAAM,OAAO,EAAC,CAAA;AACd,IAAM,MAAA,aAAA,GAAgB,CAAC,MAAoB,KAAA;AACzC,MAAK,IAAA,CAAA,IAAA,CAAK,UAAU,MAAM,CAAA,CAAA;AAC1B,MAAO,MAAA,CAAA,OAAA,CAAQ,CAAC,KAAU,KAAA;AAExB,QAAA,IAAA,CAAK,IAAK,CAAA;AAAA,UACR,OAAO,KAAM,CAAA,KAAA;AAAA,UACb,aAAa,KAAM,CAAA,WAAA;AAAA,SACpB,CAAA,CAAA;AAAA,OACF,CAAA,CAAA;AACD,MAAA,IAAA,CAAK,oBAAoB,MAAO,CAAA,MAAA,CAAA;AAChC,MAAA,IAAI,IAAK,CAAA,gBAAA,KAAqB,IAAK,CAAA,MAAA,CAAO,MAAQ,EAAA;AAEhD,QAAQ,OAAA,CAAA,GAAA,CAAI,UAAU,aAAa,CAAA,CAAA;AACnC,QAAM,MAAA,MAAA,GAAS,IAAI,QAAA,CAAS,WAAY,EAAA,CAAA;AACxC,QAAA,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,MAAM,CAAE,CAAA,KAAA,GAAQ,EAAE,KAAK,CAAA,CAAA;AACrC,QAAK,IAAA,CAAA,OAAA,CAAQ,CAAC,IAAS,KAAA;AACrB,UAAO,MAAA,CAAA,MAAA,CAAO,KAAK,WAAW,CAAA,CAAA;AAAA,SAC/B,CAAA,CAAA;AAED,QAAA,IAAA,CAAK,IAAK,CAAA,WAAA,EAAa,MAAO,CAAA,GAAA,EAAK,CAAA,CAAA;AACnC,QAAA,MAAA,CAAO,OAAQ,EAAA,CAAA;AACf,QAAA,IAAA,CAAK,KAAK,OAAO,CAAA,CAAA;AAAA,OACnB;AAAA,KACF,CAAA;AACA,IAAQ,OAAA,CAAA,EAAA,CAAG,UAAU,aAAa,CAAA,CAAA;AAClC,IAAK,IAAA,CAAA,QAAA,CAAS,IAAK,CAAA,MAAA,EAAQ,OAAO,CAAA,CAAA;AAAA,GACpC;AAOF;;;;"}