import {blobConstruct} from './bin_utils'; export class FileManager { public blobSupported = true; constructor() { try { blobConstruct([], ''); } catch(e) { this.blobSupported = false; } } public isAvailable() { return this.blobSupported; } public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | {file: any}): Promise { if('file' in bytes) { return bytes.file((file: any) => { return fileWriter.write(file); }); } else if(bytes instanceof Blob) { // is file bytes return new Promise((resolve, reject) => { let fileReader = new FileReader(); fileReader.onload = function(event) { let arrayBuffer = event.target.result as ArrayBuffer; let arr = new Uint8Array(arrayBuffer); fileWriter.write(arr).then(resolve, reject); }; fileReader.readAsArrayBuffer(bytes); }); } else { return fileWriter.write(bytes); } } public getFakeFileWriter(mimeType: string, saveFileCallback: (blob: Blob) => Promise) { let blobParts: Array = []; const fakeFileWriter = { write: async(blob: Uint8Array) => { if(!this.blobSupported) { throw false; } blobParts.push(blob); }, truncate: () => { blobParts = []; }, finalize: () => { const blob = blobConstruct(blobParts, mimeType) as Blob; if(saveFileCallback) { saveFileCallback(blob); } return blob; } }; return fakeFileWriter; } } export default new FileManager();