12345678910111213141516171819202122232425262728293031 |
- export class ChunkedReader{fileSize(){}
- loadedSize(){}
- fileName(){}
- cancel(){}
- error(){}}
- export class ChunkedFileReader{constructor(blob,chunkSize,chunkTransferredCallback){this._file=blob;this._fileSize=blob.size;this._loadedSize=0;this._chunkSize=chunkSize;this._chunkTransferredCallback=chunkTransferredCallback;this._decoder=new TextDecoder();this._isCanceled=false;this._error=null;}
- read(output){if(this._chunkTransferredCallback){this._chunkTransferredCallback(this);}
- this._output=output;this._reader=new FileReader();this._reader.onload=this._onChunkLoaded.bind(this);this._reader.onerror=this._onError.bind(this);this._loadChunk();return new Promise(resolve=>this._transferFinished=resolve);}
- cancel(){this._isCanceled=true;}
- loadedSize(){return this._loadedSize;}
- fileSize(){return this._fileSize;}
- fileName(){return this._file.name;}
- error(){return this._error;}
- _onChunkLoaded(event){if(this._isCanceled){return;}
- if(event.target.readyState!==FileReader.DONE){return;}
- const buffer=this._reader.result;this._loadedSize+=buffer.byteLength;const endOfFile=this._loadedSize===this._fileSize;const decodedString=this._decoder.decode(buffer,{stream:!endOfFile});this._output.write(decodedString);if(this._isCanceled){return;}
- if(this._chunkTransferredCallback){this._chunkTransferredCallback(this);}
- if(endOfFile){this._file=null;this._reader=null;this._output.close();this._transferFinished(!this._error);return;}
- this._loadChunk();}
- _loadChunk(){const chunkStart=this._loadedSize;const chunkEnd=Math.min(this._fileSize,chunkStart+this._chunkSize);const nextPart=this._file.slice(chunkStart,chunkEnd);this._reader.readAsArrayBuffer(nextPart);}
- _onError(event){this._error=event.target.error;this._transferFinished(false);}}
- export class FileOutputStream{async open(fileName){this._closed=false;this._writeCallbacks=[];this._fileName=fileName;const saveResponse=await Workspace.fileManager.save(this._fileName,'',true);if(saveResponse){Workspace.fileManager.addEventListener(Workspace.FileManager.Events.AppendedToURL,this._onAppendDone,this);}
- return!!saveResponse;}
- write(data){return new Promise(resolve=>{this._writeCallbacks.push(resolve);Workspace.fileManager.append(this._fileName,data);});}
- async close(){this._closed=true;if(this._writeCallbacks.length){return;}
- Workspace.fileManager.removeEventListener(Workspace.FileManager.Events.AppendedToURL,this._onAppendDone,this);Workspace.fileManager.close(this._fileName);}
- _onAppendDone(event){if(event.data!==this._fileName){return;}
- this._writeCallbacks.shift()();if(this._writeCallbacks.length){return;}
- if(!this._closed){return;}
- Workspace.fileManager.removeEventListener(Workspace.FileManager.Events.AppendedToURL,this._onAppendDone,this);Workspace.fileManager.close(this._fileName);}}
- self.Bindings=self.Bindings||{};Bindings=Bindings||{};Bindings.ChunkedReader=ChunkedReader;Bindings.ChunkedFileReader=ChunkedFileReader;Bindings.FileOutputStream=FileOutputStream;
|