fox-send/app/blobslicer.js

42 lines
1.1 KiB
JavaScript
Raw Normal View History

2018-06-04 17:47:55 +00:00
const streams = require('web-streams-polyfill');
class BlobSlicer {
constructor(blob, size, decrypt) {
this.blob = blob;
this.size = size;
this.index = 0;
this.decrypt = decrypt;
}
pull(controller) {
return new Promise((resolve, reject) => {
const bytesLeft = this.blob.size - this.index;
if (bytesLeft <= 0) {
controller.close();
return resolve();
}
let size = 0;
if (this.decrypt && this.index === 0) {
size = Math.min(21, bytesLeft);
} else {
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;
});
}
}
export default class BlobSliceStream extends streams.ReadableStream {
constructor(blob, size, decrypt) {
super(new BlobSlicer(blob, size, decrypt));
}
}