whale-plus
Version:
A Component Library for Vue 3
50 lines (47 loc) • 1.54 kB
JavaScript
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