const rankSize = 16 function blobLength(b) { if (typeof b.byteLength !== 'undefined') return b.byteLength if (typeof b.size !== 'undefined') return b.size return b.length } export default class ChunkedBlob { constructor() { this.size = 0 this.ranks = [[]] } add(b) { this.size += blobLength(b) this.ranks[0].push(b) for (let i = 0; i < this.ranks.length; i++) { let rank = this.ranks[i] if (rank.length === rankSize) { this.ranks[i + 1] = this.ranks[i + 1] || [] this.ranks[i + 1].push(new Blob(rank)) this.ranks[i] = [] } } } toBlob() { let allRanks = [].concat(...this.ranks) return new Blob(allRanks) } }