whale-plus
Version:
A Component Library for Vue 3
1 lines • 4.42 kB
Source Map (JSON)
{"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;;;;"}