class BlobSlicer { constructor(blob, size) { this.blob = blob this.size = size this.index = 0 } start(controller) {} pull(controller) { return new Promise((resolve, reject) => { const bytesLeft = this.blob.size - this.index if (bytesLeft <= 0) { controller.close() return resolve() } const size = Math.min(this.size, bytesLeft) const blob = this.blob.slice(this.index, this.index + size) const reader = new FileReader() reader.onload = function () { controller.enqueue(new Uint8Array(this.result)) resolve() } reader.onerror = reject reader.readAsArrayBuffer(blob) this.index += size }) } cancel(reason) {} } export default class BlobSliceStream extends ReadableStream { constructor(blob, size) { super(new BlobSlicer(blob, size)) } }