UNPKG

whale-plus

Version:

A Component Library for Vue 3

50 lines (47 loc) 1.54 kB
import SparkMD5 from 'spark-md5'; import { EventEmitter } from '../../upload-core/EventEmitter.mjs'; import { createChunk } from './FileChunk.mjs'; class ChunkSplitor extends EventEmitter { constructor(file, chunkSize = 1024 * 1024 * 5) { super(); this.handleChunkCount = 0; this.hasSplited = false; this.file = file; this.chunkSize = chunkSize; const chunkCount = Math.ceil(this.file.size / this.chunkSize); this.chunks = Array.from({ length: chunkCount }).fill(0).map((_, index) => createChunk(this.file, index, this.chunkSize)); } split() { if (this.hasSplited) { return; } this.hasSplited = true; const emitter = new EventEmitter(); const list = []; const chunksHanlder = (chunks) => { this.emit("chunks", chunks); chunks.forEach((chunk) => { list.push({ index: chunk.index, sparkResult: chunk.sparkResult }); }); this.handleChunkCount += chunks.length; if (this.handleChunkCount === this.chunks.length) { emitter.off("chunks", chunksHanlder); const spark2 = new SparkMD5.ArrayBuffer(); list.sort((a, b) => a.index - b.index); list.forEach((item) => { spark2.append(item.sparkResult); }); this.emit("wholeHash", spark2.end()); spark2.destroy(); this.emit("drain"); } }; emitter.on("chunks", chunksHanlder); this.calcHash(this.chunks, emitter); } } export { ChunkSplitor }; //# sourceMappingURL=ChunkSplitor.mjs.map