UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 1.85 kB
import{EventHandler as e}from"../../core/event-handler.js";class t extends e{constructor(e,t=""){super(),this.headerSize=512,this.paddingSize=512,this.bytesRead=0,this.bytesReceived=0,this.headerRead=!1,this.reader=null,this.data=new Uint8Array(0),this.decoder=null,this.prefix="",this.fileName="",this.fileSize=0,this.fileType="",this.ustarFormat="",this.prefix=t||"",this.reader=e.body.getReader(),this.reader.read().then((e=>{this.pump(e.done,e.value)})).catch((e=>{this.fire("error",e)}))}pump(e,t){if(e)return this.fire("done"),null;this.bytesReceived+=t.byteLength;const i=new Uint8Array(this.data.length+t.length);for(i.set(this.data),i.set(t,this.data.length),this.data=i;this.readFile(););return this.reader.read().then((e=>{this.pump(e.done,e.value)})).catch((e=>{this.fire("error",e)}))}readFile(){if(!this.headerRead&&this.bytesReceived>this.bytesRead+this.headerSize){this.headerRead=!0;const e=new DataView(this.data.buffer,this.bytesRead,this.headerSize);null!=this.decoder||(this.decoder=new TextDecoder("windows-1252"));const t=this.decoder.decode(e);if(this.fileName=t.substring(0,100).replace(/\0/g,""),this.fileSize=parseInt(t.substring(124,136),8),this.fileType=t.substring(156,157),this.ustarFormat=t.substring(257,263),-1!==this.ustarFormat.indexOf("ustar")){const e=t.substring(345,500).replace(/\0/g,"");e.length>0&&(this.fileName=e.trim()+this.fileName.trim())}this.bytesRead+=512}if(this.headerRead){if(this.bytesReceived<this.bytesRead+this.fileSize)return!1;if(""===this.fileType||"0"===this.fileType){const e=new DataView(this.data.buffer,this.bytesRead,this.fileSize),t={name:this.prefix+this.fileName,size:this.fileSize,data:e};this.fire("file",t)}this.bytesRead+=this.fileSize,this.headerRead=!1;const e=this.bytesRead%this.paddingSize;return 0!==e&&(this.bytesRead+=this.paddingSize-e),!0}return!1}}export{t as Untar};