Skip to content

Instantly share code, notes, and snippets.

@Xample
Created May 2, 2018 06:00
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Xample/c1b7664ba33e09335b94379e48a00c8e to your computer and use it in GitHub Desktop.
Save Xample/c1b7664ba33e09335b94379e48a00c8e to your computer and use it in GitHub Desktop.
A class to read a file (or blob) chunk by chunk
export type bytes = number;
export class BlobStreamer {
protected readonly defaultChunkSize = 64 * 1024; // 64k (more is faster but makes chrome crash on large blobs?!)
private offset: bytes = 0;
constructor(private blob: Blob) {
this.rewind();
}
public rewind(bytesLength: bytes = this.offset): void {
this.offset -= bytesLength;
}
public isEndOfBlob(): boolean {
return this.offset >= this.getBlobSize();
}
public readBlockAsArrayBuffer(length: bytes = this.defaultChunkSize): Promise<ArrayBuffer> {
const fileReader: FileReader = new FileReader();
const blob: Blob = this.blob.slice(this.offset, this.offset + length);
return new Promise<ArrayBuffer>((resolve, reject) => {
fileReader.onload = (event: Event) => {
const data = this.getArrayBufferFromEvent(event);
this.shiftOffset(blob.size);
resolve(data);
};
fileReader.onerror = (event: ErrorEvent) => {
reject(event.error);
};
fileReader.readAsArrayBuffer(blob);
});
}
protected shiftOffset(bytesRead: bytes): void {
this.offset += bytesRead;
}
protected getArrayBufferFromEvent(event: Event): ArrayBuffer {
const target: FileReader = (event.target) as FileReader;
return target.result;
}
private getTextFromEvent(event: Event): string {
const target: FileReader = (event.target) as FileReader;
return target.result;
}
private testEndOfFile(): void {
if (this.isEndOfBlob()) {
console.log('Done reading blob');
}
}
private getBlobSize(): number {
return this.blob.size;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment