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))
  }
}