Created
May 2, 2018 06:00
-
-
Save Xample/c1b7664ba33e09335b94379e48a00c8e to your computer and use it in GitHub Desktop.
A class to read a file (or blob) chunk by chunk
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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