@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 2.59 kB
JavaScript
import*as Workspace from"../workspace/workspace.js";export class ChunkedFileReader{#e;#i;#r;#t;#s;#a;#n;#l;#h;#o;#d;#c;constructor(e,i,r){this.#e=e,this.#i=e.size,this.#r=0,this.#s=i,this.#a=r,this.#n=new TextDecoder,this.#l=!1,this.#h=null,this.#t=null}async read(e){if(this.#a&&this.#a(this),this.#e?.type.endsWith("gzip")){const e=this.#e.stream(),i=this.decompressStream(e);this.#t=i.getReader()}else this.#c=new FileReader,this.#c.onload=this.onChunkLoaded.bind(this),this.#c.onerror=this.onError.bind(this);return this.#d=e,this.loadChunk(),new Promise((e=>{this.#o=e}))}cancel(){this.#l=!0}loadedSize(){return this.#r}fileSize(){return this.#i}fileName(){return this.#e?this.#e.name:""}error(){return this.#h}decompressStream(e){const i=new DecompressionStream("gzip");return e.pipeThrough(i)}onChunkLoaded(e){if(this.#l)return;if(e.target.readyState!==FileReader.DONE)return;if(!this.#c)return;const i=this.#c.result;this.#r+=i.byteLength;const r=this.#r===this.#i;this.decodeChunkBuffer(i,r)}async decodeChunkBuffer(e,i){if(!this.#d)return;const r=this.#n.decode(e,{stream:!i});await this.#d.write(r),this.#l||(this.#a&&this.#a(this),i?this.finishRead():this.loadChunk())}async finishRead(){this.#d&&(this.#e=null,this.#c=null,await this.#d.close(),this.#o(!this.#h))}async loadChunk(){if(this.#d&&this.#e){if(this.#t){const{value:e,done:i}=await this.#t.read();if(i||!e)return this.finishRead();this.decodeChunkBuffer(e.buffer,!1)}if(this.#c){const e=this.#r,i=Math.min(this.#i,e+this.#s),r=this.#e.slice(e,i);this.#c.readAsArrayBuffer(r)}}}onError(e){const i=e.target;this.#h=i.error,this.#o(!1)}}export class FileOutputStream{#u;#f;#p;constructor(){this.#u=[]}async open(e){this.#p=!1,this.#u=[],this.#f=e;const i=await Workspace.FileManager.FileManager.instance().save(this.#f,"",!0);return i&&Workspace.FileManager.FileManager.instance().addEventListener(Workspace.FileManager.Events.AppendedToURL,this.onAppendDone,this),Boolean(i)}write(e){return new Promise((i=>{this.#u.push(i),Workspace.FileManager.FileManager.instance().append(this.#f,e)}))}async close(){this.#p=!0,this.#u.length||(Workspace.FileManager.FileManager.instance().removeEventListener(Workspace.FileManager.Events.AppendedToURL,this.onAppendDone,this),Workspace.FileManager.FileManager.instance().close(this.#f))}onAppendDone(e){if(e.data!==this.#f)return;const i=this.#u.shift();i&&i(),this.#u.length||this.#p&&(Workspace.FileManager.FileManager.instance().removeEventListener(Workspace.FileManager.Events.AppendedToURL,this.onAppendDone,this),Workspace.FileManager.FileManager.instance().close(this.#f))}}