/
FlashFS.min.js
1 lines (1 loc) · 5.02 KB
/
FlashFS.min.js
1
let params={PAGE_SIZE:4096,FILE_NAME_LENGTH:32,FILE_SIZE_LENGTH:4,FILE_ADDR_LENGTH:4,BOF_LENGTH:1,EOF_LENGTH:1,HEADER_BYTES:[70,83],BOF_BYTE:250,EOF_BYTE:251,flash:void 0,flash_addr:void 0,flash_length:void 0};function FlashFS(a,b,c){params.flash=a,params.flash_addr=b,params.flash_length=c}FlashFS.prototype.b4u32=function(a){return a[3]|a[2]<<8|a[1]<<16|a[0]<<24},FlashFS.prototype.u32b4=function(a){return[255&a>>24,255&a>>16,255&a>>8,255&a>>0]},FlashFS.prototype.check=function(){return!(params.flash.read(params.HEADER_BYTES.length,params.flash_addr)!=params.HEADER_BYTES)},FlashFS.prototype.prepare=function(){return params.flash.write(params.HEADER_BYTES,params.flash_addr),this.check()},FlashFS.prototype.format=function(){for(let a=params.flash_addr;a<params.flash_addr+params.flash_length;a+=params.PAGE_SIZE)params.flash.erasePage(a);return this.prepare()},FlashFS.prototype.exists=function(a){let b=this.list().find(b=>b.path.toLowerCase()==a.toLowerCase());return b!=null},FlashFS.prototype.list=function(a){if(this.check()){let b=params.HEADER_BYTES.length,c=[];for(;[params.BOF_BYTE]==params.flash.read(params.BOF_LENGTH,params.flash_addr+b);){let d={};if(a&&(d.bof=b),b+=params.BOF_LENGTH,d.path=E.toString(params.flash.read(params.FILE_NAME_LENGTH,params.flash_addr+b)).trim(),b+=params.FILE_NAME_LENGTH,d.length=this.b4u32(params.flash.read(params.FILE_SIZE_LENGTH,params.flash_addr+b)),b+=params.FILE_SIZE_LENGTH,a&&(d.addr=this.b4u32(params.flash.read(params.FILE_ADDR_LENGTH,params.flash_addr+b))),b+=params.FILE_ADDR_LENGTH,[params.EOF_BYTE]==params.flash.read(params.EOF_LENGTH,params.flash_addr+b))a&&(d.eof=b),b+=params.EOF_LENGTH;else throw new Error("FS: file '"+d.path+"' hasn't EOF!");c.push(d)}return c}throw new Error("FS not created yet!")},FlashFS.prototype.openFile=function(a,b){let c=this.list(!0),d=c.find(b=>b.path.toLowerCase()==a.toLowerCase());switch(b){case"w":if(d)throw new Error("FS: file '"+a+"' already exists! Try another name for write!");if(a.length>params.FILE_NAME_LENGTH)throw new Error("FS: name must be maximum '"+params.FILE_NAME_LENGTH+"' chars!");let e,f,g=a.padEnd(params.FILE_NAME_LENGTH," ");if(0<c.length){let a=c[c.length-1];e=a.eof+params.EOF_LENGTH,f=a.addr+a.length-1}else e=params.HEADER_BYTES.length,f=params.PAGE_SIZE-1;let h=e+params.BOF_LENGTH+params.FILE_NAME_LENGTH+params.FILE_SIZE_LENGTH+params.FILE_ADDR_LENGTH+params.EOF_LENGTH;if(h>params.PAGE_SIZE-1)throw new Error("FS has maximum files!");let i=f+1;if(i>=params.flash_length)throw new Error("FS is full!");params.flash.write(params.BOF_BYTE,params.flash_addr+e),params.flash.write(g,params.flash_addr+e+params.BOF_LENGTH),params.flash.write(this.u32b4(i),params.flash_addr+e+params.BOF_LENGTH+params.FILE_NAME_LENGTH+params.FILE_SIZE_LENGTH),params.flash.write(params.EOF_BYTE,params.flash_addr+e+params.BOF_LENGTH+params.FILE_NAME_LENGTH+params.FILE_SIZE_LENGTH+params.FILE_ADDR_LENGTH);let j={bof:e,addr:i};return new FileFS(this,j,b);case"r":if(d)return new FileFS(this,d,b);throw new Error("FS: file '"+a+"' not exists!");default:throw new Error("FS: mode '"+b+"' is not allowed!");}};function FileFS(a,b,c){this.fs=a,this.fileIndex=b,this.mode=c,this.seekAddr=0}FileFS.prototype.pipe=function(a,b){function c(){(d=this.read(f))?(a.write(d),d=null):(clearInterval(e),b&&!0==b.end&&a.end(),b&&"function"==typeof b.complete&&b.complete())}let d,e,f=b&&b.chunkSize||32;e=setInterval(c.bind(this))},FileFS.prototype.seek=function(a){if(a!=null){if("w"==this.mode)throw new Error("FS: Can't seek in write mode!");if(0>a)throw new Error("FS: Seek value should be positive number!");if(a>this.fileIndex.length)throw new Error("FS: Wrong position to seek!");this.seekAddr=a}return this.seekAddr},FileFS.prototype.skip=function(a){if(a){if("r"==this.mode)throw new Error("FS: Can't skip in read mode!");if(0>a)throw new Error("FS: Skip value should be positive number!");let b=this.seekAddr+a;if(this.fileIndex.addr+b>params.flash_length)throw new Error("FS: Skip position can't be less than begin of file or over flash length!");this.seekAddr=b}return this.seekAddr},FileFS.prototype.read=function(a){let b=this.readBytes(a);return b?E.toString(b):void 0},FileFS.prototype.readBytes=function(a){if("w"==this.mode)throw new Error("FS: Can't read in write mode!");let b=this.fileIndex.length-(this.seekAddr+a);if(b=0<b?a:this.fileIndex.length-this.seekAddr,0<b){let a=params.flash.read(b,params.flash_addr+this.fileIndex.addr+this.seekAddr);return this.seekAddr+=b,a}},FileFS.prototype.write=function(a){if("r"==this.mode)throw new Error("FS: Can't write in read mode!");let b;if(b="object"==typeof a||"string"==typeof a?a.length:1,this.fileIndex.addr+this.seekAddr+b>params.flash_length)throw new Error("FS: Can't write. Not enough free space!");return params.flash.write(a,params.flash_addr+this.fileIndex.addr+this.seekAddr),this.seekAddr+=b,b},FileFS.prototype.close=function(){if("w"==this.mode){let a=this.seekAddr-this.fileIndex.addr;params.flash.write(this.fs.u32b4(a),params.flash_addr+this.fileIndex.bof+params.BOF_LENGTH+params.FILE_NAME_LENGTH)}return!0},exports=function(a,b,c){return new FlashFS(a,b,c)};