@pixagram/lacerta-db 0.11.4 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.min.js +4 -4
- package/dist/index.min.js +4 -4
- package/index.js +746 -184
- package/package.json +2 -2
package/dist/browser.min.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
(e=>{var t={};function i(r){var s;return(t[r]||(s=t[r]={i:r,l:!1,exports:{}},e[r].call(s.exports,s,s.exports,i),s.l=!0,s)).exports}i.m=e,i.c=t,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)i.d(r,s,function(t){return e[t]}.bind(null,s));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=2)})([function(e,t){var i={},r=new Float32Array(4);function s(e,t){if((0|e)!==e)throw new TypeError("Lane index must be an int32");if(e<0||t<=e)throw new RangeError("Lane index must be in bounds")}new Int32Array(r.buffer),new Int16Array(r.buffer),new Int8Array(r.buffer),new Uint32Array(r.buffer),new Uint16Array(r.buffer),new Uint8Array(r.buffer),void 0!==i.Int8x16&&void 0!==i.Int8x16.extractLane||(i.Int8x16=function(e,t,r,s,a,n,o,h,c,l,d,u,_,f,p,y){if(!(this instanceof i.Int8x16))return new i.Int8x16(e,t,r,s,a,n,o,h,c,l,d,u,_,f,p,y);this.s_=new Int8Array([e,t,r,s,a,n,o,h,c,l,d,u,_,f,p,y])},i.Int8x16.check=function(e){if(e instanceof i.Int8x16)return e;throw new TypeError("Argument is not a Int8x16.")},i.Int8x16.splat=function(e){return new i.Int8x16(e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e)},i.Int8x16.extractLane=function(e,t){return e=i.Int8x16.check(e),s(t,16),e.s_[t]},i.Int8x16.replaceLane=function(e,t,r){return e=i.Int8x16.check(e),s(t,16),(e=Array.from(e.s_))[t]=r,new i.Int8x16(...e)},i.Int8x16.shuffle=function(e,t,r,a,n,o,h,c,l,d,u,_,f,p,y,w,m,g){var v=[r,a,n,o,h,c,l,d,u,_,f,p,y,w,m,g],b=[];e=i.Int8x16.check(e),t=i.Int8x16.check(t);for(var A=0;A<16;A++){var x=v[A];s(x,32),b[A]=x<16?e.s_[x]:t.s_[x-16]}return new i.Int8x16(...b)}),void 0!==i.Uint8x16&&void 0!==i.Uint8x16.extractLane||(i.Uint8x16=function(e,t,r,s,a,n,o,h,c,l,d,u,_,f,p,y){if(!(this instanceof i.Uint8x16))return new i.Uint8x16(e,t,r,s,a,n,o,h,c,l,d,u,_,f,p,y);this.s_=new Uint8Array([e,t,r,s,a,n,o,h,c,l,d,u,_,f,p,y])},i.Uint8x16.check=function(e){if(e instanceof i.Uint8x16)return e;throw new TypeError("Argument is not a Uint8x16.")},i.Uint8x16.splat=function(e){return new i.Uint8x16(e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e)},i.Uint8x16.extractLane=function(e,t){return e=i.Uint8x16.check(e),s(t,16),e.s_[t]},i.Uint8x16.load=function(e,t){if(t<0||t*e.BYTES_PER_ELEMENT+16>e.byteLength)throw new RangeError("The value of index is invalid.");return new i.Uint8x16(...e.subarray(t,t+16))},i.Uint8x16.store=function(e,t,i){if(t<0||t*e.BYTES_PER_ELEMENT+16>e.byteLength)throw new RangeError("The value of index is invalid.");return e.set(i.s_,t),i},i.Uint8x16.shuffle=function(e,t,r,a,n,o,h,c,l,d,u,_,f,p,y,w,m,g){var v=[r,a,n,o,h,c,l,d,u,_,f,p,y,w,m,g],b=[];e=i.Uint8x16.check(e),t=i.Uint8x16.check(t);for(var A=0;A<16;A++){var x=v[A];s(x,32),b[A]=x<16?e.s_[x]:t.s_[x-16]}return new i.Uint8x16(...b)},i.Uint8x16.and=function(e,t){for(var r=[],s=0;s<16;++s)r[s]=e.s_[s]&t.s_[s];return new i.Uint8x16(...r)},i.Uint8x16.or=function(e,t){for(var r=[],s=0;s<16;++s)r[s]=e.s_[s]|t.s_[s];return new i.Uint8x16(...r)},i.Uint8x16.shiftLeftByScalar=function(e,t){for(var r=[],s=0;s<16;++s)r[s]=e.s_[s]<<t;return new i.Uint8x16(...r)},i.Uint8x16.shiftRightByScalar=function(e,t){for(var r=[],s=0;s<16;++s)r[s]=e.s_[s]>>>t;return new i.Uint8x16(...r)}),e.exports=class{constructor(){this.ENC_SHUFFLE=i.Int8x16(10,11,9,10,7,8,6,7,4,5,3,4,1,2,0,1),this.ENC_LUT="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",this.ENC_LUT_SIMD=[i.Uint8x16.splat(0),i.Uint8x16.splat(0),i.Uint8x16.splat(0),i.Uint8x16.splat(0)];for(let t=0;t<4;t++){var e=this.ENC_LUT.substring(16*t,16*(t+1));this.ENC_LUT_SIMD[t]=i.Uint8x16(...Array.from(e).map(e=>e.charCodeAt(0)))}this.DEC_DELTA_ASSO=i.Uint8x16(1,1,1,1,1,1,1,1,0,0,0,0,0,15,0,15),this.DEC_DELTA_VALUES=i.Int8x16(0,0,0,19,4,191,191,185,185,0,16,195,191,191,185,185),this.DEC_SHUFFLE=i.Int8x16(-1,-1,-1,-1,12,13,14,8,9,10,4,5,6,0,1,2),this.SCALAR_ENC_LUT="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",this.SCALAR_DEC_LUT={};for(let e=0;e<this.SCALAR_ENC_LUT.length;e++)this.SCALAR_DEC_LUT[this.SCALAR_ENC_LUT.charAt(e)]=e;this.SCALAR_DEC_LUT["="]=0}_scalar_encode(e){let t="";for(let a=0;a<e.length;a+=3){var i=e[a],r=a+1<e.length?e[a+1]:0,s=a+2<e.length?e[a+2]:0;t+=this.SCALAR_ENC_LUT[i>>2]+this.SCALAR_ENC_LUT[(3&i)<<4|r>>4],a+1<e.length?t+=this.SCALAR_ENC_LUT[(15&r)<<2|s>>6]:t+="=",a+2<e.length?t+=this.SCALAR_ENC_LUT[63&s]:t+="="}return t}encode(e){var t=e.length,i=4*Math.ceil(t/3),r=new Uint8Array(i);let s=0,a=0;for(;s+12<=t;){var n=e.subarray(s,s+12),o=new Uint8Array(16);o[0]=n[0]>>2,o[1]=(3&n[0])<<4|n[1]>>4,o[2]=(15&n[1])<<2|n[2]>>6,o[3]=63&n[2],o[4]=n[3]>>2,o[5]=(3&n[3])<<4|n[4]>>4,o[6]=(15&n[4])<<2|n[5]>>6,o[7]=63&n[5],o[8]=n[6]>>2,o[9]=(3&n[6])<<4|n[7]>>4,o[10]=(15&n[7])<<2|n[8]>>6,o[11]=63&n[8],o[12]=n[9]>>2,o[13]=(3&n[9])<<4|n[10]>>4,o[14]=(15&n[10])<<2|n[11]>>6,o[15]=63&n[11];for(let e=0;e<16;e++)r[a+e]=this.SCALAR_ENC_LUT.charCodeAt(o[e]);s+=12,a+=16}let h=(new TextDecoder).decode(r.subarray(0,a));return s<t&&(h+=this._scalar_encode(e.subarray(s))),h}_scalar_decode(e){e=e.replace(/=+$/,"");var t=Math.floor(3*e.length/4),i=new Uint8Array(t);let r=0;for(let h=0;h<e.length;h+=4){var s=this.SCALAR_DEC_LUT[e[h]],a=this.SCALAR_DEC_LUT[e[h+1]],n=h+2<e.length?this.SCALAR_DEC_LUT[e[h+2]]:0,o=h+3<e.length?this.SCALAR_DEC_LUT[e[h+3]]:0;i[r++]=s<<2|a>>4,r<t&&(i[r++]=(15&a)<<4|n>>2),r<t&&(i[r++]=(3&n)<<6|o)}return i}decode(e){var t=e.length;if(t%4!=0)throw new Error("Invalid Base64 string length.");var i=(e.match(/=/g)||[]).length,r=new Uint8Array(3*t/4-i);let s=0,a=0;for(var n;s+16<=t-i;){var o=Array.from(e.substring(s,s+16)).map(e=>this.SCALAR_DEC_LUT[e]),h=new Uint8Array(12);h[0]=o[0]<<2|o[1]>>4,h[1]=(15&o[1])<<4|o[2]>>2,h[2]=(3&o[2])<<6|o[3],h[3]=o[4]<<2|o[5]>>4,h[4]=(15&o[5])<<4|o[6]>>2,h[5]=(3&o[6])<<6|o[7],h[6]=o[8]<<2|o[9]>>4,h[7]=(15&o[9])<<4|o[10]>>2,h[8]=(3&o[10])<<6|o[11],h[9]=o[12]<<2|o[13]>>4,h[10]=(15&o[13])<<4|o[14]>>2,h[11]=(3&o[14])<<6|o[15],r.set(h,a),s+=16,a+=12}return s<t&&(n=this._scalar_decode(e.substring(s)),r.set(n,a)),r}}},function(e,t,i){i.r(t);let r=240,s=0,a=16,n=32,o=48,h=64,c=80,l=96,d=112,u=128,_=144,f=160,p=176,y=192,w=224,m=240,g=0,v=1,b=2,A=3,x=16,S=17,k=18,z=19,I=20,E=21,U=22,C=23,D=24,M=25,T=26,B=32,V=33,L=34,P=35,F=48,O=49,K=50,q=51,R=52,$=53,j=54,N=55,H=64,G=65,W=66,Q=67,J=68,Y=69,X=70,Z=71,ee=80,te=81,ie=82,re=83,se=84,ae=85,ne=96,oe=97,he=98,ce=99,le=100,de=101,ue=102,_e=103,fe=104,pe=105,ye=106,we=107,me=112,ge=113,ve=114,be=128,Ae=129,xe=144,Se=145,ke=160,ze=161,Ie=162,Ee=163,Ue=164,Ce=165,De=166,Me=167,Te=168,Be=176,Ve=192,Le=193,Pe=208,Fe=209,Oe=224,Ke=225,qe=226,Re=227,$e=240,je=new Uint8Array(256),Ne=new Uint8Array(256);new Map;let He=new Map,Ge=new Map;var We=[[S,2],[k,4],[z,4],[I,4],[E,8],[B,8],[V,8]];for(let e=0;e<We.length;e++)je[We[e][0]]=We[e][1];var Qe,Je=[[ne,1],[oe,1],[he,1],[ce,2],[le,2],[de,4],[ue,4],[_e,4],[fe,8],[pe,8],[ye,8],[Q,1],[J,2],[Y,4],[X,4],[Z,8]];for(let e=0;e<Je.length;e++)Ne[Je[e][0]]=Je[e][1];for(Qe of["asyncIterator","hasInstance","isConcatSpreadable","iterator","match","matchAll","replace","search","species","split","toPrimitive","toStringTag","unscopables"]){var Ye=Symbol[Qe];Ye&&(He.set(Ye,Qe),Ge.set(Qe,Ye))}class Xe{constructor(e=65536){this.size=(e+128-1&-128)>>>0,this.buffer=new ArrayBuffer(this.size),this.offset=0,this.u8=new Uint8Array(this.buffer),this.view=new DataView(this.buffer),this.pos=0,this.f32View=null,this.f64View=null,this.i32View=null}ensure(e){var t,i;(e=this.pos+(e|=0)|0)>this.size&&(e=(128+(0|Math.max(this.size<<1,128+e))-1&-128)>>>0,t=new ArrayBuffer(e),(i=new Uint8Array(t)).set(this.u8.subarray(0,this.pos)),this.buffer=t,this.u8=i,this.view=new DataView(t),this.size=e,this.f32View=null,this.f64View=null,this.i32View=null)}alignPos(e){e=e-1|0,this.pos=(this.pos+e&~e)>>>0}writeU8(e){this.ensure(1),this.u8[this.pos++]=255&e}writeU16(e){this.alignPos(2),this.ensure(2),this.view.setUint16(this.pos,65535&e,!0),this.pos=this.pos+2|0}writeI16(e){this.alignPos(2),this.ensure(2),this.view.setInt16(this.pos,e,!0),this.pos=this.pos+2|0}writeU32(e){this.alignPos(4),this.ensure(4),this.view.setUint32(this.pos,e>>>0,!0),this.pos=this.pos+4|0}writeI32(e){this.alignPos(4),this.ensure(4),this.view.setInt32(this.pos,0|e,!0),this.pos=this.pos+4|0}writeF32(e){this.alignPos(4),this.ensure(4),this.view.setFloat32(this.pos,+e,!0),this.pos=this.pos+4|0}writeF64(e){this.alignPos(8),this.ensure(8),this.view.setFloat64(this.pos,+e,!0),this.pos=this.pos+8|0}writeBigInt64(e){this.alignPos(8),this.ensure(8),this.view.setBigInt64(this.pos,BigInt(e),!0),this.pos=this.pos+8|0}writeVarint(e){if(e>>>=0,this.ensure(5),e<128)this.u8[this.pos++]=e;else if(e<16384)this.u8[this.pos]=127&e|128,this.u8[this.pos+1]=e>>>7,this.pos=this.pos+2|0;else{let t=this.pos;for(;this.u8[t++]=127&e|128,128<=(e>>>=7););this.u8[t++]=e,this.pos=t}}writePackedArray(e,t){var i=0|e.length,r=(this.writeVarint(i),0|Ne[t]);if(!r)throw new Error("Unknown element type: 0x"+t.toString(16));switch(this.alignPos(Math.min(r,8)),this.ensure(i*r),t){case Q:new Int8Array(this.buffer,this.pos,i).set(e),this.pos=this.pos+i|0;break;case J:var s=new Int16Array(this.buffer,this.pos,i);for(let t=0;t<i;t++)s[t]=0|e[t];this.pos=this.pos+(i<<1)|0;break;case Y:var a=new Int32Array(this.buffer,this.pos,i);for(let t=0;t<i;t++)a[t]=0|e[t];this.pos=this.pos+(i<<2)|0;break;case X:var n=new Float32Array(this.buffer,this.pos,i);for(let t=0;t<i;t++)n[t]=+e[t];this.pos=this.pos+(i<<2)|0;break;case Z:var o=new Float64Array(this.buffer,this.pos,i);for(let t=0;t<i;t++)o[t]=+e[t];this.pos=this.pos+(i<<3)|0;break;default:throw new Error("Unsupported packed array type: 0x"+t.toString(16))}}writeBulkAligned(e,t){var i;t=Math.min(t,8),this.alignPos(t),t=e.byteLength||e.length;this.ensure(t),e.buffer&&void 0!==e.byteOffset?(i=new Uint8Array(e.buffer,e.byteOffset,t),this.u8.set(i,this.pos)):this.u8.set(e,this.pos),this.pos=this.pos+t|0}reset(){this.pos=0}getResult(){return this.u8.subarray(0,this.pos)}}class Ze{constructor(){this.blockSize=16}canOptimize(e){var t=e.length;if(!(8<=t&(0==(t&t-1)||16<=t)))return!1;var i=typeof e[0];if("number"!=i)return!1;var r=Math.max(1,t>>>5|0);for(let s=r;s<t;s+=r)if(typeof e[s]!=i)return!1;return!0}analyzeNumericArray(e){let t=1,i=1/0,r=-1/0,s=1;var a,n=e.length;for(let a=0;a<n;a++){var o=e[a];t&=+(o==(0|o)),i=Math.min(i,o),r=Math.max(r,o),s&&(s&=+(Math.fround(o)==o))}return t?(a=+((a=Math.max(Math.abs(i),Math.abs(r)))<=127)<<0|+(a<=32767)<<1|+(a<=2147483647)<<2,[{type:Y,elementSize:4},{type:Q,elementSize:1},{type:J,elementSize:2},{type:Y,elementSize:4}][3&a]):s?{type:X,elementSize:4}:{type:Z,elementSize:8}}}class et{constructor(e={}){this.simdProcessor=new Ze,this.allowFunction=e.allowFunction||!1,this.constructorMap=new Map,this.typeNameMap=new Map,this.errorTypeMap=new Map,this.initMaps()}initMaps(){var e,t,i,r,s=[[Date,xe],[RegExp,Be],[Map,be],[Set,Ae],[ArrayBuffer,me],[DataView,we]],a=[["Uint8Array",ne],["Int8Array",oe],["Uint8ClampedArray",he],["Uint16Array",ce],["Int16Array",le],["Uint32Array",de],["Int32Array",ue],["Float32Array",_e],["Float64Array",fe],["BigInt64Array",pe],["BigUint64Array",ye],["SharedArrayBuffer",ve]];for([e,t]of s)this.constructorMap.set(e,t);for([i,r]of a){var n=globalThis[i];n&&(this.constructorMap.set(n,r),this.typeNameMap.set(i,r))}this.errorTypeMap.set("Error",ke),this.errorTypeMap.set("EvalError",ze),this.errorTypeMap.set("RangeError",Ie),this.errorTypeMap.set("ReferenceError",Ee),this.errorTypeMap.set("SyntaxError",Ue),this.errorTypeMap.set("TypeError",Ce),this.errorTypeMap.set("URIError",De),this.errorTypeMap.set("AggregateError",Me)}detect(e){if(null==e)return null===e?g:v;switch(typeof e){case"boolean":return e?A:b;case"number":return this.detectNumber(e);case"bigint":return this.detectBigInt(e);case"string":return this.detectString(e);case"symbol":return this.detectSymbol(e);case"object":return this.detectObject(e);default:return v}}detectNumber(e){var t,i,r;return e!=e?U:(r=new Float64Array([e]),((t=(r=new Uint32Array(r.buffer))[1])&(i=2146435072))==i&0==r[0]&0==(1048575&t)?t>>>31?D:C:0==e&&t>>>31?M:e==(0|e)?(r=+((i=Math.abs(e))<=127)<<0|+(i<=32767)<<1|+(i<=2147483647)<<2,[T,x,S,k][Math.min(r,3)]):Math.fround(e)==e?I:E)}detectBigInt(e){var t=e<0n;return(t?-e:e)<=0x7fffffffffffffffn?t?V:B:t?P:L}detectString(e){var t,i=e.length;if(0==i)return F;let r=1;for(let t=0;t<i&&r;t++)r&=+(e.charCodeAt(t)<=127);return r?i<16?O:i<256?K:q:(t=(new TextEncoder).encode(e).length)<16?R:t<256?$:j}detectSymbol(e){return void 0!==Symbol.keyFor(e)?Ke:He.has(e)?qe:void 0===e.description?Re:Oe}detectObject(e){var t,i;return null==e?g:(t=e.constructor,void 0!==(t=this.constructorMap.get(t))?t==xe?(i=e.getTime())==i?xe:Se:t:Array.isArray(e)?this.detectArray(e):ArrayBuffer.isView(e)?this.detectTypedArrayType(e):e instanceof Error?this.detectErrorType(e):"undefined"!=typeof Blob&&e instanceof Blob?e instanceof File?Le:Ve:this.classifyObject(e))}classifyObject(e){var t=Object.getPrototypeOf(e);if(e.constructor!=Object&&t!=Object.prototype&&null!=t)return re;t=Object.getOwnPropertyNames(e);var i,r=Object.getOwnPropertySymbols(e);if(0===(t=[...t,...r]).length)return ee;let s=!1,a=!1;for(i of t){var n=Object.getOwnPropertyDescriptor(e,i);if(n.get||n.set){s=!0;break}"function"==typeof n.value&&this.allowFunction&&(a=!0),n.enumerable&&n.writable&&n.configurable||(s=!0)}return s?se:a?ae:ie}detectArray(e){var t=e.length;if(0==t)return H;let i=0,r=!1;for(let s=0;s<t;s++)s in e?i++:r=!0;return r||i<3*t>>>2?W:this.simdProcessor.canOptimize(e)?this.simdProcessor.analyzeNumericArray(e).type:G}detectTypedArrayType(e){return e=e.constructor.name,this.typeNameMap.get(e)||ne}detectErrorType(e){return e=e.constructor.name,this.errorTypeMap.get(e)||Te}}var tt=i(0),it=i.n(tt);i.d(t,"LacertaDB",(function(){return Lt})),i.d(t,"Database",(function(){return Vt})),i.d(t,"Collection",(function(){return Bt})),i.d(t,"Document",(function(){return zt})),i.d(t,"MigrationManager",(function(){return Mt})),i.d(t,"PerformanceMonitor",(function(){return Tt})),i.d(t,"LacertaDBError",(function(){return ht})),i.d(t,"OPFSUtility",(function(){return St})),i.d(t,"IndexManager",(function(){return xt})),i.d(t,"CacheStrategy",(function(){return ut})),i.d(t,"LRUCache",(function(){return ct})),i.d(t,"LFUCache",(function(){return lt})),i.d(t,"TTLCache",(function(){return dt})),i.d(t,"BTreeIndex",(function(){return vt})),i.d(t,"TextIndex",(function(){return bt})),i.d(t,"GeoIndex",(function(){return At})),i.d(t,"SecureDatabaseEncryption",(function(){return yt})),i.d(t,"QuickStore",(function(){return st})),i.d(t,"AsyncMutex",(function(){return ot})),i.d(t,"IndexedDBConnectionPool",(function(){return at})),i.d(t,"BrowserCompressionUtility",(function(){return _t})),i.d(t,"BrowserEncryptionUtility",(function(){return pt})),
|
|
1
|
+
(e=>{var t={};function i(r){var s;return(t[r]||(s=t[r]={i:r,l:!1,exports:{}},e[r].call(s.exports,s,s.exports,i),s.l=!0,s)).exports}i.m=e,i.c=t,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)i.d(r,s,function(t){return e[t]}.bind(null,s));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=2)})([function(e,t){var i={},r=new Float32Array(4);function s(e,t){if((0|e)!==e)throw new TypeError("Lane index must be an int32");if(e<0||t<=e)throw new RangeError("Lane index must be in bounds")}new Int32Array(r.buffer),new Int16Array(r.buffer),new Int8Array(r.buffer),new Uint32Array(r.buffer),new Uint16Array(r.buffer),new Uint8Array(r.buffer),void 0!==i.Int8x16&&void 0!==i.Int8x16.extractLane||(i.Int8x16=function(e,t,r,s,a,n,o,h,l,c,d,u,_,f,p,y){if(!(this instanceof i.Int8x16))return new i.Int8x16(e,t,r,s,a,n,o,h,l,c,d,u,_,f,p,y);this.s_=new Int8Array([e,t,r,s,a,n,o,h,l,c,d,u,_,f,p,y])},i.Int8x16.check=function(e){if(e instanceof i.Int8x16)return e;throw new TypeError("Argument is not a Int8x16.")},i.Int8x16.splat=function(e){return new i.Int8x16(e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e)},i.Int8x16.extractLane=function(e,t){return e=i.Int8x16.check(e),s(t,16),e.s_[t]},i.Int8x16.replaceLane=function(e,t,r){return e=i.Int8x16.check(e),s(t,16),(e=Array.from(e.s_))[t]=r,new i.Int8x16(...e)},i.Int8x16.shuffle=function(e,t,r,a,n,o,h,l,c,d,u,_,f,p,y,w,m,g){var v=[r,a,n,o,h,l,c,d,u,_,f,p,y,w,m,g],b=[];e=i.Int8x16.check(e),t=i.Int8x16.check(t);for(var S=0;S<16;S++){var A=v[S];s(A,32),b[S]=A<16?e.s_[A]:t.s_[A-16]}return new i.Int8x16(...b)}),void 0!==i.Uint8x16&&void 0!==i.Uint8x16.extractLane||(i.Uint8x16=function(e,t,r,s,a,n,o,h,l,c,d,u,_,f,p,y){if(!(this instanceof i.Uint8x16))return new i.Uint8x16(e,t,r,s,a,n,o,h,l,c,d,u,_,f,p,y);this.s_=new Uint8Array([e,t,r,s,a,n,o,h,l,c,d,u,_,f,p,y])},i.Uint8x16.check=function(e){if(e instanceof i.Uint8x16)return e;throw new TypeError("Argument is not a Uint8x16.")},i.Uint8x16.splat=function(e){return new i.Uint8x16(e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e)},i.Uint8x16.extractLane=function(e,t){return e=i.Uint8x16.check(e),s(t,16),e.s_[t]},i.Uint8x16.load=function(e,t){if(t<0||t*e.BYTES_PER_ELEMENT+16>e.byteLength)throw new RangeError("The value of index is invalid.");return new i.Uint8x16(...e.subarray(t,t+16))},i.Uint8x16.store=function(e,t,i){if(t<0||t*e.BYTES_PER_ELEMENT+16>e.byteLength)throw new RangeError("The value of index is invalid.");return e.set(i.s_,t),i},i.Uint8x16.shuffle=function(e,t,r,a,n,o,h,l,c,d,u,_,f,p,y,w,m,g){var v=[r,a,n,o,h,l,c,d,u,_,f,p,y,w,m,g],b=[];e=i.Uint8x16.check(e),t=i.Uint8x16.check(t);for(var S=0;S<16;S++){var A=v[S];s(A,32),b[S]=A<16?e.s_[A]:t.s_[A-16]}return new i.Uint8x16(...b)},i.Uint8x16.and=function(e,t){for(var r=[],s=0;s<16;++s)r[s]=e.s_[s]&t.s_[s];return new i.Uint8x16(...r)},i.Uint8x16.or=function(e,t){for(var r=[],s=0;s<16;++s)r[s]=e.s_[s]|t.s_[s];return new i.Uint8x16(...r)},i.Uint8x16.shiftLeftByScalar=function(e,t){for(var r=[],s=0;s<16;++s)r[s]=e.s_[s]<<t;return new i.Uint8x16(...r)},i.Uint8x16.shiftRightByScalar=function(e,t){for(var r=[],s=0;s<16;++s)r[s]=e.s_[s]>>>t;return new i.Uint8x16(...r)}),e.exports=class{constructor(){this.ENC_SHUFFLE=i.Int8x16(10,11,9,10,7,8,6,7,4,5,3,4,1,2,0,1),this.ENC_LUT="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",this.ENC_LUT_SIMD=[i.Uint8x16.splat(0),i.Uint8x16.splat(0),i.Uint8x16.splat(0),i.Uint8x16.splat(0)];for(let t=0;t<4;t++){var e=this.ENC_LUT.substring(16*t,16*(t+1));this.ENC_LUT_SIMD[t]=i.Uint8x16(...Array.from(e).map(e=>e.charCodeAt(0)))}this.DEC_DELTA_ASSO=i.Uint8x16(1,1,1,1,1,1,1,1,0,0,0,0,0,15,0,15),this.DEC_DELTA_VALUES=i.Int8x16(0,0,0,19,4,191,191,185,185,0,16,195,191,191,185,185),this.DEC_SHUFFLE=i.Int8x16(-1,-1,-1,-1,12,13,14,8,9,10,4,5,6,0,1,2),this.SCALAR_ENC_LUT="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",this.SCALAR_DEC_LUT={};for(let e=0;e<this.SCALAR_ENC_LUT.length;e++)this.SCALAR_DEC_LUT[this.SCALAR_ENC_LUT.charAt(e)]=e;this.SCALAR_DEC_LUT["="]=0}_scalar_encode(e){let t="";for(let a=0;a<e.length;a+=3){var i=e[a],r=a+1<e.length?e[a+1]:0,s=a+2<e.length?e[a+2]:0;t+=this.SCALAR_ENC_LUT[i>>2]+this.SCALAR_ENC_LUT[(3&i)<<4|r>>4],a+1<e.length?t+=this.SCALAR_ENC_LUT[(15&r)<<2|s>>6]:t+="=",a+2<e.length?t+=this.SCALAR_ENC_LUT[63&s]:t+="="}return t}encode(e){var t=e.length,i=4*Math.ceil(t/3),r=new Uint8Array(i);let s=0,a=0;for(;s+12<=t;){var n=e.subarray(s,s+12),o=new Uint8Array(16);o[0]=n[0]>>2,o[1]=(3&n[0])<<4|n[1]>>4,o[2]=(15&n[1])<<2|n[2]>>6,o[3]=63&n[2],o[4]=n[3]>>2,o[5]=(3&n[3])<<4|n[4]>>4,o[6]=(15&n[4])<<2|n[5]>>6,o[7]=63&n[5],o[8]=n[6]>>2,o[9]=(3&n[6])<<4|n[7]>>4,o[10]=(15&n[7])<<2|n[8]>>6,o[11]=63&n[8],o[12]=n[9]>>2,o[13]=(3&n[9])<<4|n[10]>>4,o[14]=(15&n[10])<<2|n[11]>>6,o[15]=63&n[11];for(let e=0;e<16;e++)r[a+e]=this.SCALAR_ENC_LUT.charCodeAt(o[e]);s+=12,a+=16}let h=(new TextDecoder).decode(r.subarray(0,a));return s<t&&(h+=this._scalar_encode(e.subarray(s))),h}_scalar_decode(e){e=e.replace(/=+$/,"");var t=Math.floor(3*e.length/4),i=new Uint8Array(t);let r=0;for(let h=0;h<e.length;h+=4){var s=this.SCALAR_DEC_LUT[e[h]],a=this.SCALAR_DEC_LUT[e[h+1]],n=h+2<e.length?this.SCALAR_DEC_LUT[e[h+2]]:0,o=h+3<e.length?this.SCALAR_DEC_LUT[e[h+3]]:0;i[r++]=s<<2|a>>4,r<t&&(i[r++]=(15&a)<<4|n>>2),r<t&&(i[r++]=(3&n)<<6|o)}return i}decode(e){var t=e.length;if(t%4!=0)throw new Error("Invalid Base64 string length.");var i=(e.match(/=/g)||[]).length,r=new Uint8Array(3*t/4-i);let s=0,a=0;for(var n;s+16<=t-i;){var o=Array.from(e.substring(s,s+16)).map(e=>this.SCALAR_DEC_LUT[e]),h=new Uint8Array(12);h[0]=o[0]<<2|o[1]>>4,h[1]=(15&o[1])<<4|o[2]>>2,h[2]=(3&o[2])<<6|o[3],h[3]=o[4]<<2|o[5]>>4,h[4]=(15&o[5])<<4|o[6]>>2,h[5]=(3&o[6])<<6|o[7],h[6]=o[8]<<2|o[9]>>4,h[7]=(15&o[9])<<4|o[10]>>2,h[8]=(3&o[10])<<6|o[11],h[9]=o[12]<<2|o[13]>>4,h[10]=(15&o[13])<<4|o[14]>>2,h[11]=(3&o[14])<<6|o[15],r.set(h,a),s+=16,a+=12}return s<t&&(n=this._scalar_decode(e.substring(s)),r.set(n,a)),r}}},function(e,t,i){i.r(t);let r=128,s=240,a=0,n=16,o=32,h=48,l=64,c=80,d=96,u=112,_=128,f=144,p=160,y=176,w=192,m=224,g=240,v=0,b=1,S=2,A=3,x=16,k=17,z=18,I=19,D=20,E=21,C=22,U=23,M=24,T=25,B=26,V=32,P=33,L=34,F=35,O=48,K=49,N=50,R=51,$=52,j=53,q=54,H=55,W=64,G=65,X=66,Q=67,J=68,Y=69,Z=70,ee=71,te=80,ie=81,re=82,se=83,ae=84,ne=85,oe=96,he=97,le=98,ce=99,de=100,ue=101,_e=102,fe=103,pe=104,ye=105,we=106,me=107,ge=112,ve=113,be=114,Se=128,Ae=129,xe=144,ke=145,ze=160,Ie=161,De=162,Ee=163,Ce=164,Ue=165,Me=166,Te=167,Be=168,Ve=176,Pe=192,Le=193,Fe=208,Oe=209,Ke=224,Ne=225,Re=226,$e=227,je=240,qe=new Uint8Array(256),He=new Uint8Array(256);new Map;let We=new Map,Ge=new Map;var Xe=[[k,2],[z,4],[I,4],[D,4],[E,8],[V,8],[P,8]];for(let e=0;e<Xe.length;e++)qe[Xe[e][0]]=Xe[e][1];var Qe,Je=[[oe,1],[he,1],[le,1],[ce,2],[de,2],[ue,4],[_e,4],[fe,4],[pe,8],[ye,8],[we,8],[Q,1],[J,2],[Y,4],[Z,4],[ee,8]];for(let e=0;e<Je.length;e++)He[Je[e][0]]=Je[e][1];for(Qe of["asyncIterator","hasInstance","isConcatSpreadable","iterator","match","matchAll","replace","search","species","split","toPrimitive","toStringTag","unscopables"]){var Ye=Symbol[Qe];Ye&&(We.set(Ye,Qe),Ge.set(Qe,Ye))}class Ze{constructor(e=65536){this._heap=new Int32Array(4),e=(e+r-1&-128)>>>0,this._heap[1]=e,this._heap[2]=0,this._heap[3]=0,this.buffer=new ArrayBuffer(e),this.u8=new Uint8Array(this.buffer),this.view=new DataView(this.buffer),this._viewCache={gen:-1,f32:null,f64:null,i32:null,u32:null}}get pos(){return 0|this._heap[0]}set pos(e){this._heap[0]=0|e}get size(){return 0|this._heap[1]}set size(e){this._heap[1]=0|e}get f32View(){var e=0|this._heap[2];if(this._viewCache.gen!==e&&this._invalidateViewCache(e),!this._viewCache.f32)try{this._viewCache.f32=new Float32Array(this.buffer)}catch(e){return null}return this._viewCache.f32}get f64View(){var e=0|this._heap[2];if(this._viewCache.gen!==e&&this._invalidateViewCache(e),!this._viewCache.f64)try{this._viewCache.f64=new Float64Array(this.buffer)}catch(e){return null}return this._viewCache.f64}get i32View(){var e=0|this._heap[2];if(this._viewCache.gen!==e&&this._invalidateViewCache(e),!this._viewCache.i32)try{this._viewCache.i32=new Int32Array(this.buffer)}catch(e){return null}return this._viewCache.i32}get u32View(){var e=0|this._heap[2];if(this._viewCache.gen!==e&&this._invalidateViewCache(e),!this._viewCache.u32)try{this._viewCache.u32=new Uint32Array(this.buffer)}catch(e){return null}return this._viewCache.u32}_invalidateViewCache(e){this._viewCache.gen=0|e,this._viewCache.f32=null,this._viewCache.f64=null,this._viewCache.i32=null,this._viewCache.u32=null}ensure(e){var t,i=0|this._heap[0],s=0|this._heap[1];(0|s)<(0|(e=i+(e|=0)|0))&&(s=(((e=e+r|0)<(s<<=1)?s:e)+r-1&-128)>>>0,e=new ArrayBuffer(s),(t=new Uint8Array(e)).set(this.u8.subarray(0,i)),this.buffer=e,this.u8=t,this.view=new DataView(e),this._heap[1]=s,this._heap[2]=this._heap[2]+1|0)}alignPos(e){e=e-1|0,this._heap[0]=(this._heap[0]+e&~e)>>>0}writeU8(e){this.ensure(1),this.u8[this._heap[0]++]=255&e}writeU16(e){this.alignPos(2),this.ensure(2);var t=0|this._heap[0];this.view.setUint16(t,65535&e,!0),this._heap[0]=2+t|0}writeI16(e){this.alignPos(2),this.ensure(2);var t=0|this._heap[0];this.view.setInt16(t,0|e,!0),this._heap[0]=2+t|0}writeU32(e){this.alignPos(4),this.ensure(4);var t=0|this._heap[0];this.view.setUint32(t,e>>>0,!0),this._heap[0]=4+t|0}writeI32(e){this.alignPos(4),this.ensure(4);var t=0|this._heap[0];this.view.setInt32(t,0|e,!0),this._heap[0]=4+t|0}writeF32(e){this.alignPos(4),this.ensure(4);var t=0|this._heap[0];this.view.setFloat32(t,+e,!0),this._heap[0]=4+t|0}writeF64(e){this.alignPos(8),this.ensure(8);var t=0|this._heap[0];this.view.setFloat64(t,+e,!0),this._heap[0]=8+t|0}writeBigInt64(e){this.alignPos(8),this.ensure(8);var t=0|this._heap[0];this.view.setBigInt64(t,BigInt(e),!0),this._heap[0]=8+t|0}writeVarint(e){if(e>>>=0,this.ensure(5),e<128)this.u8[this._heap[0]++]=e;else if(e<16384){let t=0|this._heap[0];this.u8[t]=127&e|128,this.u8[1+t]=e>>>7,this._heap[0]=2+t|0}else{let t=0|this._heap[0];for(;this.u8[t++]=127&e|128,128<=(e>>>=7););this.u8[t++]=e,this._heap[0]=t}}writePackedArray(e,t){var i=0|e.length,r=(this.writeVarint(i),0|He[t]);if(!r)throw new Error("Unknown element type: 0x"+t.toString(16));switch(this.alignPos(Math.min(r,8)),this.ensure(i*r),t){case Q:var s=0|this._heap[0];new Int8Array(this.buffer,s,i).set(e),this._heap[0]=s+i|0;break;case J:s=0|this._heap[0];var a=new Int16Array(this.buffer,s,i);for(let t=0;t<i;t++)a[t]=0|e[t];this._heap[0]=s+(i<<1)|0;break;case Y:s=0|this._heap[0];var n=new Int32Array(this.buffer,s,i);for(let t=0;t<i;t++)n[t]=0|e[t];this._heap[0]=s+(i<<2)|0;break;case Z:s=0|this._heap[0];var o=new Float32Array(this.buffer,s,i);for(let t=0;t<i;t++)o[t]=+e[t];this._heap[0]=s+(i<<2)|0;break;case ee:s=0|this._heap[0];var h=new Float64Array(this.buffer,s,i);for(let t=0;t<i;t++)h[t]=+e[t];this._heap[0]=s+(i<<3)|0;break;default:throw new Error("Unsupported packed array type: 0x"+t.toString(16))}}writeBulkAligned(e,t){t=Math.min(t,8),this.alignPos(t),t=0|(e.byteLength||e.length);var i,r=(this.ensure(t),0|this._heap[0]);e.buffer&&void 0!==e.byteOffset?(i=new Uint8Array(e.buffer,e.byteOffset,t),this.u8.set(i,r)):this.u8.set(e,r),this._heap[0]=r+t|0}reset(){var e=0|this._heap[0],t=0|this._heap[3];this._heap[3]=t<e?e:t,this._heap[0]=0}resetMemory(e={}){var t=e.shrink||!1,i=!1!==e.zero,s=0|this._heap[0],a=(s=(a=0|this._heap[3])<s?s:a,0|this._heap[1]);e=((e.initialSize||65536)+r-1&-128)>>>0;t&&e<<2<a&&s<a>>>1?(t=Math.max(e,(s<<1)+r-1&-128)>>>0,this.buffer=new ArrayBuffer(t),this.u8=new Uint8Array(this.buffer),this.view=new DataView(this.buffer),this._heap[1]=t,this._heap[2]=this._heap[2]+1|0):i&&0<s&&this.u8.fill(0,0,s),this._heap[0]=0,this._heap[3]=0,this._invalidateViewCache(0|this._heap[2])}getResult(){var e=0|this._heap[0],t=0|this._heap[3];return this._heap[3]=t<e?e:t,this.u8.subarray(0,e)}}class et{constructor(){this.blockSize=16,this._f32Scratch=new Float32Array(1)}canOptimize(e){var t=0|e.length;if(!(8<=t&(0==(t&t-1)|16<=t)|0))return!1;if("number"!=typeof e[0])return!1;var i=0|Math.max(1,t>>>5|0);for(let r=0|i;(0|r)<(0|t);r=r+i|0)if("number"!=typeof e[r])return!1;return!0}analyzeNumericArray(e){let t=1,i=1/0,r=-1/0,s=1;var a,n=0|e.length,o=this._f32Scratch,h=-4&n|0;for(let a=0;(0|a)<(0|h);a=a+4|0){var l=+e[a],c=+e[a+1],d=+e[a+2],u=+e[a+3],_=(t&=+((0|l)==l)&+((0|c)==c)&+((0|d)==d)&+((0|u)==u),l<c?l:c),f=c<l?l:c,p=d<u?d:u,y=u<d?d:u;i=(_<p?_:p)<i?_<p?_:p:i,r=(y<f?f:y)>r?y<f?f:y:r,s&&(o[0]=l,s&=+(o[0]==l),o[0]=c,s&=+(o[0]==c),o[0]=d,s&=+(o[0]==d),o[0]=u,s&=+(o[0]==u))}for(let a=0|h;(0|a)<(0|n);a=a+1|0){var w=+e[a];t&=+(w==(0|w)),i=w<i?w:i,r=w>r?w:r,s&&(o[0]=w,s&=+(o[0]==w))}return t?(a=+((a=Math.max(Math.abs(i),Math.abs(r)))<=127)<<0|+(a<=32767)<<1|+(a<=2147483647)<<2,[{type:Y,elementSize:4},{type:Q,elementSize:1},{type:J,elementSize:2},{type:Y,elementSize:4}][3&a]):s?{type:Z,elementSize:4}:{type:ee,elementSize:8}}}class tt{constructor(e={}){this.simdProcessor=new et,this.allowFunction=e.allowFunction||!1,this.constructorMap=new Map,this.typeNameMap=new Map,this.errorTypeMap=new Map,this.initMaps()}initMaps(){var e,t,i,r,s=[[Date,xe],[RegExp,Ve],[Map,Se],[Set,Ae],[ArrayBuffer,ge],[DataView,me]],a=[["Uint8Array",oe],["Int8Array",he],["Uint8ClampedArray",le],["Uint16Array",ce],["Int16Array",de],["Uint32Array",ue],["Int32Array",_e],["Float32Array",fe],["Float64Array",pe],["BigInt64Array",ye],["BigUint64Array",we],["SharedArrayBuffer",be]];for([e,t]of s)this.constructorMap.set(e,t);for([i,r]of a){var n=globalThis[i];n&&(this.constructorMap.set(n,r),this.typeNameMap.set(i,r))}this.errorTypeMap.set("Error",ze),this.errorTypeMap.set("EvalError",Ie),this.errorTypeMap.set("RangeError",De),this.errorTypeMap.set("ReferenceError",Ee),this.errorTypeMap.set("SyntaxError",Ce),this.errorTypeMap.set("TypeError",Ue),this.errorTypeMap.set("URIError",Me),this.errorTypeMap.set("AggregateError",Te)}detect(e){if(null==e)return null===e?v:b;switch(typeof e){case"boolean":return e?A:S;case"number":return this.detectNumber(e);case"bigint":return this.detectBigInt(e);case"string":return this.detectString(e);case"symbol":return this.detectSymbol(e);case"object":return this.detectObject(e);default:return b}}detectNumber(e){var t,i,r;return e!=e?C:(r=new Float64Array([e]),((t=(r=new Uint32Array(r.buffer))[1])&(i=2146435072))==i&0==r[0]&0==(1048575&t)?t>>>31?M:U:0==e&&t>>>31?T:e==(0|e)?(r=+((i=Math.abs(e))<=127)<<0|+(i<=32767)<<1|+(i<=2147483647)<<2,[B,x,k,z][Math.min(r,3)]):Math.fround(e)==e?D:E)}detectBigInt(e){var t=e<0n;return(t?-e:e)<=0x7fffffffffffffffn?t?P:V:t?F:L}detectString(e){var t,i=e.length;if(0==i)return O;let r=1;for(let t=0;t<i&&r;t++)r&=+(e.charCodeAt(t)<=127);return r?i<16?K:i<256?N:R:(t=(new TextEncoder).encode(e).length)<16?$:t<256?j:q}detectSymbol(e){return void 0!==Symbol.keyFor(e)?Ne:We.has(e)?Re:void 0===e.description?$e:Ke}detectObject(e){var t,i;return null==e?v:(t=e.constructor,void 0!==(t=this.constructorMap.get(t))?t==xe?(i=e.getTime())==i?xe:ke:t:Array.isArray(e)?this.detectArray(e):ArrayBuffer.isView(e)?this.detectTypedArrayType(e):e instanceof Error?this.detectErrorType(e):"undefined"!=typeof Blob&&e instanceof Blob?e instanceof File?Le:Pe:this.classifyObject(e))}classifyObject(e){var t=Object.getPrototypeOf(e);if(e.constructor!=Object&&t!=Object.prototype&&null!=t)return se;t=Object.getOwnPropertyNames(e);var i,r=Object.getOwnPropertySymbols(e);if(0===(t=[...t,...r]).length)return te;let s=!1,a=!1;for(i of t){var n=Object.getOwnPropertyDescriptor(e,i);if(n.get||n.set){s=!0;break}"function"==typeof n.value&&this.allowFunction&&(a=!0),n.enumerable&&n.writable&&n.configurable||(s=!0)}return s?ae:a?ne:re}detectArray(e){var t=e.length;if(0==t)return W;let i=0,r=!1;for(let s=0;s<t;s++)s in e?i++:r=!0;return r||i<3*t>>>2?X:this.simdProcessor.canOptimize(e)?this.simdProcessor.analyzeNumericArray(e).type:G}detectTypedArrayType(e){return e=e.constructor.name,this.typeNameMap.get(e)||oe}detectErrorType(e){return e=e.constructor.name,this.errorTypeMap.get(e)||Be}}var it=i(0),rt=i.n(it);i.d(t,"LacertaDB",(function(){return Pt})),i.d(t,"Database",(function(){return Vt})),i.d(t,"Collection",(function(){return Bt})),i.d(t,"Document",(function(){return zt})),i.d(t,"MigrationManager",(function(){return Mt})),i.d(t,"PerformanceMonitor",(function(){return Tt})),i.d(t,"LacertaDBError",(function(){return ht})),i.d(t,"OPFSUtility",(function(){return xt})),i.d(t,"IndexManager",(function(){return At})),i.d(t,"CacheStrategy",(function(){return ut})),i.d(t,"LRUCache",(function(){return lt})),i.d(t,"LFUCache",(function(){return ct})),i.d(t,"TTLCache",(function(){return dt})),i.d(t,"BTreeIndex",(function(){return vt})),i.d(t,"TextIndex",(function(){return bt})),i.d(t,"GeoIndex",(function(){return St})),i.d(t,"SecureDatabaseEncryption",(function(){return yt})),i.d(t,"QuickStore",(function(){return at})),i.d(t,"AsyncMutex",(function(){return ot})),i.d(t,"IndexedDBConnectionPool",(function(){return nt})),i.d(t,"BrowserCompressionUtility",(function(){return _t})),i.d(t,"BrowserEncryptionUtility",(function(){return pt})),
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Production Library
|
|
4
4
|
* @module LacertaDB
|
|
5
|
-
* @version 0.
|
|
5
|
+
* @version 0.12.0
|
|
6
6
|
* @license MIT
|
|
7
7
|
* @author Pixagram SA
|
|
8
8
|
*/
|
|
9
|
-
"undefined"==typeof window||window.requestIdleCallback||(window.requestIdleCallback=function(e){return setTimeout(e,0)},window.cancelIdleCallback=clearTimeout);let rt={compression:!0,preservePropertyDescriptors:!0,deduplication:!1,simdOptimization:!0,detectCircular:!0,shareArrayBuffers:!0,allowFunction:!1,serializeFunctions:!1,memoryPoolSize:1048576};class st{constructor(e,t,i){this._dbName=e,this._serializer=t,this._base64=i,this._keyPrefix=`lacertadb_${e}_quickstore_`,this._indexKey=this._keyPrefix+"index",this._indexCache=new Set,this._indexLoaded=!1,this._saveIndexTimer=null,this._dirty=!1,this._flushHandler=()=>this._flushSync(),"undefined"!=typeof window&&window.addEventListener("beforeunload",this._flushHandler)}destroy(){this._flushSync(),"undefined"!=typeof window&&this._flushHandler&&(window.removeEventListener("beforeunload",this._flushHandler),this._flushHandler=null),this._saveIndexTimer&&("undefined"!=typeof window&&window.cancelIdleCallback?window.cancelIdleCallback(this._saveIndexTimer):clearTimeout(this._saveIndexTimer),this._saveIndexTimer=null)}_ensureIndexLoaded(){if(!this._indexLoaded){var e=localStorage.getItem(this._indexKey);if(e)try{var t=this._base64.decode(e),i=this._serializer.deserialize(t);this._indexCache=new Set(i)}catch(e){console.warn("QuickStore index corrupted, resetting.",e),this._indexCache=new Set}this._indexLoaded=!0}}_scheduleIndexSave(){var e;this._dirty=!0,this._saveIndexTimer||(e=()=>{if(this._dirty){try{var e=Array.from(this._indexCache),t=this._serializer.serialize(e),i=this._base64.encode(t);localStorage.setItem(this._indexKey,i),this._dirty=!1}catch(e){"QuotaExceededError"===e.name?(console.error("CRITICAL: QuickStore index save failed — localStorage quota exceeded"),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("lacertadb:quotaexceeded",{detail:{source:"quickstore",db:this._dbName}}))):console.error("QuickStore index save failed:",e)}this._saveIndexTimer=null}},"undefined"!=typeof window&&window.requestIdleCallback?this._saveIndexTimer=window.requestIdleCallback(e):this._saveIndexTimer=setTimeout(e,200))}_flushSync(){if(this._dirty)try{var e=Array.from(this._indexCache),t=this._serializer.serialize(e),i=this._base64.encode(t);localStorage.setItem(this._indexKey,i),this._dirty=!1}catch(e){"QuotaExceededError"===e.name?(console.error("CRITICAL: QuickStore flush failed — localStorage quota exceeded"),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("lacertadb:quotaexceeded",{detail:{source:"quickstore_flush",db:this._dbName}}))):console.error("QuickStore flush failed:",e)}}add(e,t){this._ensureIndexLoaded();var i=this._keyPrefix+"data_"+e;try{var r=this._serializer.serialize(t),s=this._base64.encode(r);return localStorage.setItem(i,s),this._indexCache.has(e)||(this._indexCache.add(e),this._scheduleIndexSave()),!0}catch(e){if("QuotaExceededError"===e.name)throw new ht("QuickStore quota exceeded","QUOTA_EXCEEDED",e);return!1}}get(e){if(e=this._keyPrefix+"data_"+e,e=localStorage.getItem(e))try{var t=this._base64.decode(e);return this._serializer.deserialize(t)}catch(e){console.error("Failed to parse QuickStore data:",e)}return null}update(e,t){return this.add(e,t)}delete(e){this._ensureIndexLoaded();var t=this._keyPrefix+"data_"+e;localStorage.removeItem(t),this._indexCache.has(e)&&(this._indexCache.delete(e),this._scheduleIndexSave())}getAll(){this._ensureIndexLoaded();var e,t=[];for(e of this._indexCache){var i=this.get(e);i&&t.push({_id:e,...i})}return t}query(e={}){return 0===Object.keys(e).length?this.getAll():this.getAll().filter(t=>Ct.evaluate(t,e))}clear(){for(var e of(this._ensureIndexLoaded(),this._indexCache))localStorage.removeItem(this._keyPrefix+"data_"+e);localStorage.removeItem(this._indexKey),this._indexCache.clear(),this._dirty=!1,this._saveIndexTimer&&(window.cancelIdleCallback?window.cancelIdleCallback(this._saveIndexTimer):clearTimeout(this._saveIndexTimer),this._saveIndexTimer=null)}get size(){return this._ensureIndexLoaded(),this._indexCache.size}}class at{constructor(){this._connections=new Map,this._refCounts=new Map}async getConnection(e,t=1,i){let r=e+"_v"+t;var s;return this._connections.has(r)?(this._refCounts.set(r,(this._refCounts.get(r)||0)+1),this._connections.get(r)):((s=await new Promise((r,s)=>{let a=indexedDB.open(e,t);a.onerror=()=>s(new ht("Failed to open database","DATABASE_OPEN_FAILED",a.error)),a.onsuccess=()=>r(a.result),a.onupgradeneeded=e=>{i&&i(e.target.result,e.oldVersion,e.newVersion)}})).onclose=()=>{this._connections.delete(r),this._refCounts.delete(r)},this._connections.set(r,s),this._refCounts.set(r,1),s)}releaseConnection(e,t=1){var i;e=e+"_v"+t;(t=this._refCounts.get(e)||0)<=1?(i=this._connections.get(e))&&(i.close(),this._connections.delete(e),this._refCounts.delete(e)):this._refCounts.set(e,t-1)}closeAll(){for(var e of this._connections.values())e.close();this._connections.clear(),this._refCounts.clear()}}let nt=new at;class ot{constructor(){this._queue=[],this._locked=!1}acquire(){return new Promise(e=>{this._queue.push(e),this._dispatch()})}release(){this._locked=!1,this._dispatch()}async runExclusive(e){var t=await this.acquire();try{return await e()}finally{t()}}_dispatch(){this._locked||0===this._queue.length||(this._locked=!0,this._queue.shift()(()=>this.release()))}}class ht extends Error{constructor(e,t,i){super(e),this.name="LacertaDBError",this.code=t,this.originalError=i||null,this.timestamp=(new Date).toISOString()}}class ct{constructor(e=100,t=null){this._maxSize=e,this._ttl=t,this._cache=new Map}get(e){var t=this._cache.get(e);return t?this._ttl&&Date.now()-t.ts>this._ttl?(this._cache.delete(e),null):(this._cache.delete(e),this._cache.set(e,t),t.value):null}set(e,t){this._cache.has(e)?this._cache.delete(e):this._cache.size>=this._maxSize&&this._cache.delete(this._cache.keys().next().value),this._cache.set(e,{value:t,ts:Date.now()})}delete(e){return this._cache.delete(e)}clear(){this._cache.clear()}has(e){return null!==this.get(e)}get size(){return this._cache.size}}class lt{constructor(e=100,t=null){this._maxSize=e,this._ttl=t,this._cache=new Map,this._frequencies=new Map,this._timestamps=new Map,this._buckets=new Map,this._minFreq=0}get(e){if(!this._cache.has(e))return null;if(this._ttl){var t=this._timestamps.get(e);if(Date.now()-t>this._ttl)return this.delete(e),null}var i=(t=this._frequencies.get(e)||1)+1,r=(this._frequencies.set(e,i),this._buckets.get(t));return r&&(r.delete(e),0===r.size)&&(this._buckets.delete(t),this._minFreq===t)&&(this._minFreq=i),this._buckets.has(i)||this._buckets.set(i,new Set),this._buckets.get(i).add(e),this._cache.get(e)}set(e,t){var i;this._maxSize<=0||(this._cache.has(e)?(this._cache.set(e,t),this.get(e)):(this._cache.size>=this._maxSize&&(i=this._buckets.get(this._minFreq))&&0<i.size&&(i=i.values().next().value,this.delete(i)),this._cache.set(e,t),this._frequencies.set(e,1),this._timestamps.set(e,Date.now()),this._buckets.has(1)||this._buckets.set(1,new Set),this._buckets.get(1).add(e),this._minFreq=1))}delete(e){var t,i;return!!this._cache.has(e)&&(t=this._frequencies.get(e)||1,(i=this._buckets.get(t))&&(i.delete(e),0===i.size)&&this._buckets.delete(t),this._frequencies.delete(e),this._timestamps.delete(e),this._cache.delete(e))}clear(){this._cache.clear(),this._frequencies.clear(),this._timestamps.clear(),this._buckets.clear(),this._minFreq=0}has(e){return null!==this.get(e)}get size(){return this._cache.size}}class dt{constructor(e=6e4){this._ttl=e,this._cache=new Map,this._sweepTimer=null,this._sweepInterval=Math.min(e,3e4),"undefined"!=typeof globalThis&&(this._sweepTimer=setInterval(()=>this._sweep(),this._sweepInterval))}get(e){var t=this._cache.get(e);return t?Date.now()-t.ts>this._ttl?(this._cache.delete(e),null):t.value:null}set(e,t){this._cache.set(e,{value:t,ts:Date.now()})}delete(e){return this._cache.delete(e)}clear(){this._cache.clear()}has(e){return null!==this.get(e)}get size(){return this._cache.size}_sweep(){var e,t,i=Date.now();for([e,t]of this._cache)i-t.ts>this._ttl&&this._cache.delete(e)}destroy(){this._sweepTimer&&(clearInterval(this._sweepTimer),this._sweepTimer=null),this._cache.clear()}}class ut{constructor(e={}){this._config=e,this._cache=this._createCache()}get cache(){return this._cache||(this._cache=this._createCache()),this._cache}_createCache(){var e=this._config.type||"lru",t=this._config.maxSize||100,i=this._config.ttl;return"none"===e||!1===this._config.enabled?null:"ttl"===e?new dt(i):new("lfu"===e?lt:ct)(t,i)}get(e){return this.cache?this.cache.get(e):null}set(e,t){this.cache&&this.cache.set(e,t)}delete(e){this.cache&&this.cache.delete(e)}clear(){this.cache&&this.cache.clear()}updateStrategy(e){this._config={...this._config,...e},this._cache=null}destroy(){this._cache&&this._cache.destroy?this._cache.destroy():this._cache&&this._cache.clear&&this._cache.clear(),this._cache=null}}class _t{async compress(e){if(!(e instanceof Uint8Array))throw new TypeError("Input must be Uint8Array");try{var t=new Response(e).body.pipeThrough(new CompressionStream("deflate")),i=await new Response(t).arrayBuffer(),r=new Uint8Array(i.byteLength+1);return r[0]=1,r.set(new Uint8Array(i),1),r}catch(i){return(t=new Uint8Array(e.byteLength+1))[0]=0,t.set(e,1),t}}async decompress(e){if(!(e instanceof Uint8Array))throw new TypeError("Input must be Uint8Array");if(0===e.length)return e;var t=e[0],i=e.slice(1);if(0===t)return i;if(1!==t)return e;try{var r=new Response(i).body.pipeThrough(new DecompressionStream("deflate")),s=await new Response(r).arrayBuffer();return new Uint8Array(s)}catch(t){return console.error("Decompression failed",t),e}}compressSync(e){if(e instanceof Uint8Array)return e;throw new TypeError("Input must be Uint8Array")}decompressSync(e){if(e instanceof Uint8Array)return e;throw new TypeError("Input must be Uint8Array")}}let ft=new _t;class pt{async encrypt(e,t){var i=new TextEncoder,r=crypto.getRandomValues(new Uint8Array(16)),s=crypto.getRandomValues(new Uint8Array(12));i=i.encode(t),t=await crypto.subtle.importKey("raw",i,"PBKDF2",!1,["deriveBits","deriveKey"]),i=await crypto.subtle.deriveKey({name:"PBKDF2",salt:r,iterations:6e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"]),t=await crypto.subtle.encrypt({name:"AES-GCM",iv:s},i,e);return(i=new Uint8Array(r.length+s.length+t.byteLength)).set(r,0),i.set(s,r.length),i.set(new Uint8Array(t),r.length+s.length),i}async decrypt(e,t){var i=new TextEncoder,r=e.slice(0,16),s=e.slice(16,28);e=e.slice(28),i=i.encode(t),t=await crypto.subtle.importKey("raw",i,"PBKDF2",!1,["deriveBits","deriveKey"]),i=await crypto.subtle.deriveKey({name:"PBKDF2",salt:r,iterations:6e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"]),r=await crypto.subtle.decrypt({name:"AES-GCM",iv:s},i,e);return new Uint8Array(r)}}class yt{constructor(e={},t,i){this._iterations=e.iterations||6e5,this._hashAlgorithm=e.hashAlgorithm||"SHA-256",this._keyLength=e.keyLength||256,this._saltLength=e.saltLength||32,this._initialized=!1,this._serializer=t,this._base64=i,this._masterKey=null,this._hmacKey=null,this._salt=null,this._wrappedKeyBlob=null}get initialized(){return this._initialized}async initialize(e,t=null){if(this._initialized)throw new Error("Database encryption already initialized");if(e=(new TextEncoder).encode(e),t){this._salt=this._base64.decode(t.salt);var i=await this._deriveKEK(e,this._salt),r=(t=this._base64.decode(t.wrappedKey)).slice(0,12);t=t.slice(12);try{var s=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},i,t);await this._importMasterKeys(s)}catch(e){throw new Error("Invalid PIN or corrupted key data")}}else this._salt=crypto.getRandomValues(new Uint8Array(this._saltLength)),r=await this._deriveKEK(e,this._salt),i=crypto.getRandomValues(new Uint8Array(64)),await this._importMasterKeys(i.buffer),t=crypto.getRandomValues(new Uint8Array(12)),s=await crypto.subtle.encrypt({name:"AES-GCM",iv:t},r,i),(e=new Uint8Array(12+s.byteLength)).set(t,0),e.set(new Uint8Array(s),12),this._wrappedKeyBlob=this._base64.encode(e);return this._initialized=!0,this.exportMetadata()}async _deriveKEK(e,t){return e=await crypto.subtle.importKey("raw",e,"PBKDF2",!1,["deriveBits","deriveKey"]),crypto.subtle.deriveKey({name:"PBKDF2",salt:t,iterations:this._iterations,hash:this._hashAlgorithm},e,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}async _importMasterKeys(e){var t=(e=new Uint8Array(e)).slice(0,32);e=e.slice(32,64);this._masterKey=await crypto.subtle.importKey("raw",t,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),this._hmacKey=await crypto.subtle.importKey("raw",e,{name:"HMAC",hash:"SHA-256"},!0,["sign","verify"])}async _exportMasterKeys(){var e=await crypto.subtle.exportKey("raw",this._masterKey),t=await crypto.subtle.exportKey("raw",this._hmacKey),i=new Uint8Array(64);return i.set(new Uint8Array(e),0),i.set(new Uint8Array(t),32),i}async changePin(e,t){if(!this._initialized)throw new Error("Database encryption not initialized");e=await this._deriveKEK((new TextEncoder).encode(e),this._salt);var i=(r=this._base64.decode(this._wrappedKeyBlob)).slice(0,12),r=r.slice(12);try{await crypto.subtle.decrypt({name:"AES-GCM",iv:i},e,r)}catch(e){throw new Error("Invalid old PIN")}return i=crypto.getRandomValues(new Uint8Array(this._saltLength)),e=await this._deriveKEK((new TextEncoder).encode(t),i),r=await this._exportMasterKeys(),t=crypto.getRandomValues(new Uint8Array(12)),e=await crypto.subtle.encrypt({name:"AES-GCM",iv:t},e,r),(r=new Uint8Array(12+e.byteLength)).set(t,0),r.set(new Uint8Array(e),12),this._salt=i,this._wrappedKeyBlob=this._base64.encode(r),this.exportMetadata()}async encrypt(e){if(!this._initialized)throw new Error("Database encryption not initialized");let t;t="string"==typeof e?(new TextEncoder).encode(e):e instanceof Uint8Array?e:this._serializer.serialize(e);e=crypto.getRandomValues(new Uint8Array(12));var i=await crypto.subtle.encrypt({name:"AES-GCM",iv:e},this._masterKey,t),r=((r=new Uint8Array(e.length+i.byteLength)).set(e,0),r.set(new Uint8Array(i),e.length),await crypto.subtle.sign("HMAC",this._hmacKey,r)),s=new Uint8Array(e.length+i.byteLength+32);return s.set(e,0),s.set(new Uint8Array(i),e.length),s.set(new Uint8Array(r),e.length+i.byteLength),s}async decrypt(e){if(!this._initialized)throw new Error("Database encryption not initialized");if(!(e instanceof Uint8Array))throw new TypeError("Encrypted data must be Uint8Array");var t=e.slice(0,12),i=e.slice(-32),r=(e=e.slice(12,-32),new Uint8Array(t.length+e.length));if(i=(r.set(t,0),r.set(e,t.length),await crypto.subtle.verify("HMAC",this._hmacKey,i,r)))return r=await crypto.subtle.decrypt({name:"AES-GCM",iv:t},this._masterKey,e),new Uint8Array(r);throw new Error("HMAC verification failed - data may be tampered")}async encryptPrivateKey(e,t=""){if(!this._initialized)throw new Error("Database encryption not initialized");t=(r=new TextEncoder).encode(t);let i;i="string"==typeof e?r.encode(e):e instanceof Uint8Array?e:this._serializer.serialize(e);var r=crypto.getRandomValues(new Uint8Array(12)),s=(e=await crypto.subtle.encrypt({name:"AES-GCM",iv:r,additionalData:t,tagLength:128},this._masterKey,i),new Uint32Array([t.length])),a=new Uint8Array(16+t.length+e.byteLength);return a.set(r,0),a.set(new Uint8Array(s.buffer),12),a.set(t,16),a.set(new Uint8Array(e),16+t.length),this._base64.encode(a)}async decryptPrivateKey(e,t=""){if(!this._initialized)throw new Error("Database encryption not initialized");var i=(e=this._base64.decode(e)).slice(0,12),r=e.slice(12,16),s=(r=new Uint32Array(r.buffer)[0],e.slice(16,16+r));e=e.slice(16+r),r=(new TextEncoder).encode(t);if(this._arrayEquals(s,r))return t=await crypto.subtle.decrypt({name:"AES-GCM",iv:i,additionalData:s,tagLength:128},this._masterKey,e),(new TextDecoder).decode(t);throw new Error("Additional authentication data mismatch")}static generateSecurePIN(e=6){for(var t=[],i=new Uint8Array(1);t.length<e;)crypto.getRandomValues(i),i[0]<250&&t.push((i[0]%10).toString());return t.join("")}destroy(){this._masterKey=null,this._hmacKey=null,this._initialized=!1}_arrayEquals(e,t){if(e.length!==t.length)return!1;let i=0;for(let r=0;r<e.length;r++)i|=e[r]^t[r];return 0===i}exportMetadata(){return{salt:this._base64.encode(this._salt),wrappedKey:this._wrappedKeyBlob,iterations:this._iterations,algorithm:"AES-GCM-256",kdf:"PBKDF2",hashAlgorithm:this._hashAlgorithm,keyLength:this._keyLength,saltLength:this._saltLength}}importMetadata(e){}}class wt{constructor(e,t=4){this.boundary=e,this.capacity=t,this.points=[],this.divided=!1}insert(e){return!!this._contains(this.boundary,e)&&(this.points.length<this.capacity?(this.points.push(e),!0):(this.divided||this._subdivide(),this.northeast.insert(e)||this.northwest.insert(e)||this.southeast.insert(e)||this.southwest.insert(e)))}query(e,t=[]){if(this._intersects(this.boundary,e)){for(var i of this.points)this._contains(e,i)&&t.push(i);this.divided&&(this.northwest.query(e,t),this.northeast.query(e,t),this.southwest.query(e,t),this.southeast.query(e,t))}return t}remove(e){this.points=this.points.filter(t=>t.data!==e),this.divided&&(this.northwest.remove(e),this.northeast.remove(e),this.southwest.remove(e),this.southeast.remove(e))}_subdivide(){var{x:e,y:t,w:i,h:r}=this.boundary,i=i/2,r=r/2;this.northeast=new wt({x:e+i,y:t-r,w:i,h:r},this.capacity),this.northwest=new wt({x:e-i,y:t-r,w:i,h:r},this.capacity),this.southeast=new wt({x:e+i,y:t+r,w:i,h:r},this.capacity),this.southwest=new wt({x:e-i,y:t+r,w:i,h:r},this.capacity),this.divided=!0}_contains(e,t){return t.x>=e.x-e.w&&t.x<=e.x+e.w&&t.y>=e.y-e.h&&t.y<=e.y+e.h}_intersects(e,t){return!(t.x-t.w>e.x+e.w||t.x+t.w<e.x-e.w||t.y-t.h>e.y+e.h||t.y+t.h<e.y-e.h)}}function mt(e,t){var i,r;return e===t?0:(i=typeof e)==(r=typeof t)?"number"==i?e<t?-1:1:"string"==i?e<t?-1:t<e?1:0:(e=String(e))<(t=String(t))?-1:t<e?1:0:i<r?-1:1}class gt{constructor(e,t){this.keys=new Array(2*e-1),this.values=new Array(2*e-1),this.children=new Array(2*e),this.n=0,this.leaf=t,this.order=e}search(e){let t=0;for(;t<this.n&&0<mt(e,this.keys[t]);)t++;return t<this.n&&0===mt(e,this.keys[t])?this.values[t]:!this.leaf&&this.children[t]?this.children[t].search(e):null}rangeSearch(e,t,i,r=!1,s=!1){let a=0;if(null!==e)for(;a<this.n&&mt(this.keys[a],e)<0;)a++;for(;a<this.n;a++){if(null!==t){var n=mt(this.keys[a],t);if(s?0<=n:0<n)return void(!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,r,s))}!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,r,s);n=null===e?1:mt(this.keys[a],e);var o=null===t?-1:mt(this.keys[a],t);(null===e||(r?0<n:0<=n))&&(null===t||(s?o<0:o<=0))&&this.values[a]&&this.values[a].forEach(e=>i.push(e))}!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,r,s)}insertNonFull(e,t){let i=this.n-1;if(this.leaf){for(;0<=i&&0<mt(this.keys[i],e);)this.keys[i+1]=this.keys[i],this.values[i+1]=this.values[i],i--;0<=i&&0===mt(this.keys[i],e)?(this.values[i]||(this.values[i]=new Set),this.values[i].add(t)):(this.keys[i+1]=e,this.values[i+1]=new Set([t]),this.n++)}else{for(;0<=i&&0<mt(this.keys[i],e);)i--;if(0<=i&&0===mt(this.keys[i],e))this.values[i]||(this.values[i]=new Set),this.values[i].add(t);else{if(i++,this.children[i]&&this.children[i].n===2*this.order-1){this.splitChild(i,this.children[i]);var r=mt(this.keys[i],e);if(0===r)return this.values[i]||(this.values[i]=new Set),void this.values[i].add(t);r<0&&i++}this.children[i]&&this.children[i].insertNonFull(e,t)}}}splitChild(e,t){var i=new gt(this.order,t.leaf);i.n=this.order-1;for(let e=0;e<this.order-1;e++)i.keys[e]=t.keys[e+this.order],i.values[e]=t.values[e+this.order];if(!t.leaf)for(let e=0;e<this.order;e++)i.children[e]=t.children[e+this.order];var r=t.keys[this.order-1],s=t.values[this.order-1];t.n=this.order-1;for(let e=this.order-1;e<2*this.order-1;e++)t.keys[e]=void 0,t.values[e]=void 0;if(!t.leaf)for(let e=this.order;e<2*this.order;e++)t.children[e]=void 0;for(let t=this.n;t>=e+1;t--)this.children[t+1]=this.children[t];this.children[e+1]=i;for(let t=this.n-1;t>=e;t--)this.keys[t+1]=this.keys[t],this.values[t+1]=this.values[t];this.keys[e]=r,this.values[e]=s,this.n++}_getPredecessor(e){let t=this.children[e];for(;!t.leaf;)t=t.children[t.n];return{key:t.keys[t.n-1],value:t.values[t.n-1]}}_getSuccessor(e){let t=this.children[e+1];for(;!t.leaf;)t=t.children[0];return{key:t.keys[0],value:t.values[0]}}_merge(e){var t=this.children[e],i=this.children[e+1],r=this.order;t.keys[r-1]=this.keys[e],t.values[r-1]=this.values[e];for(let e=0;e<i.n;e++)t.keys[r+e]=i.keys[e],t.values[r+e]=i.values[e];if(!t.leaf)for(let e=0;e<=i.n;e++)t.children[r+e]=i.children[e];t.n+=i.n+1;for(let t=e;t<this.n-1;t++)this.keys[t]=this.keys[t+1],this.values[t]=this.values[t+1];for(let t=e+1;t<this.n;t++)this.children[t]=this.children[t+1];this.keys[this.n-1]=void 0,this.values[this.n-1]=void 0,this.children[this.n]=void 0,this.n--}_borrowFromPrev(e){var t=this.children[e],i=this.children[e-1];for(let e=t.n-1;0<=e;e--)t.keys[e+1]=t.keys[e],t.values[e+1]=t.values[e];if(!t.leaf)for(let e=t.n;0<=e;e--)t.children[e+1]=t.children[e];t.keys[0]=this.keys[e-1],t.values[0]=this.values[e-1],t.leaf||(t.children[0]=i.children[i.n],i.children[i.n]=void 0),this.keys[e-1]=i.keys[i.n-1],this.values[e-1]=i.values[i.n-1],i.keys[i.n-1]=void 0,i.values[i.n-1]=void 0,t.n++,i.n--}_borrowFromNext(e){var t=this.children[e],i=this.children[e+1];t.keys[t.n]=this.keys[e],t.values[t.n]=this.values[e],t.leaf||(t.children[t.n+1]=i.children[0]),this.keys[e]=i.keys[0],this.values[e]=i.values[0];for(let e=0;e<i.n-1;e++)i.keys[e]=i.keys[e+1],i.values[e]=i.values[e+1];if(!i.leaf){for(let e=0;e<i.n;e++)i.children[e]=i.children[e+1];i.children[i.n]=void 0}i.keys[i.n-1]=void 0,i.values[i.n-1]=void 0,t.n++,i.n--}_fill(e){var t=this.order;0<e&&this.children[e-1]&&this.children[e-1].n>=t?this._borrowFromPrev(e):e<this.n&&this.children[e+1]&&this.children[e+1].n>=t?this._borrowFromNext(e):e<this.n?this._merge(e):this._merge(e-1)}_removeFromLeaf(e){for(let t=e;t<this.n-1;t++)this.keys[t]=this.keys[t+1],this.values[t]=this.values[t+1];this.keys[this.n-1]=void 0,this.values[this.n-1]=void 0,this.n--}_removeFromInternal(e){var t,i=this.order,r=this.keys[e];this.children[e]&&this.children[e].n>=i?(t=this._getPredecessor(e),this.keys[e]=t.key,this.values[e]=t.value,this.children[e]._remove(t.key,null,!0)):this.children[e+1]&&this.children[e+1].n>=i?(t=this._getSuccessor(e),this.keys[e]=t.key,this.values[e]=t.value,this.children[e+1]._remove(t.key,null,!0)):(this._merge(e),this.children[e]._remove(r,null,!0))}_remove(e,t,i){let r=0;for(;r<this.n&&0<mt(e,this.keys[r]);)r++;var s;if(r<this.n&&0===mt(e,this.keys[r])){let e=i;return!e&&this.values[r]&&(this.values[r].delete(t),e=0===this.values[r].size),!!e&&(this.leaf?this._removeFromLeaf(r):this._removeFromInternal(r),!0)}return!this.leaf&&(s=r===this.n,this.children[r]&&this.children[r].n<this.order&&this._fill(r),s&&r>this.n?!!this.children[r-1]&&this.children[r-1]._remove(e,t,i):!!this.children[r]&&this.children[r]._remove(e,t,i))}remove(e,t){return this._remove(e,t,!1)}removeKey(e){return this._remove(e,null,!0)}verify(){var e,t=[];for(let e=0;e<this.n;e++)null==this.keys[e]&&t.push(`Invalid key (${this.keys[e]}) at index `+e);for(let e=1;e<this.n;e++)mt(this.keys[e],this.keys[e-1])<=0&&t.push("Key order violation at index "+e);if(!this.leaf)for(let i=0;i<=this.n;i++)this.children[i]&&(e=this.children[i].verify(),t.push(...e));return t}}class vt{constructor(e=4){this._root=null,this._order=e,this._size=0}insert(e,t){if(!(null==e||"number"==typeof e&&isNaN(e))){if(this._root){var i=this._root.search(e);if(i&&i.has(t))return}if(this._root)if(this._root.n===2*this._order-1){(i=new gt(this._order,!1)).children[0]=this._root,i.splitChild(0,this._root);let s=0;var r=mt(i.keys[0],e);0===r?(i.values[0]||(i.values[0]=new Set),i.values[0].add(t)):(r<0&&s++,i.children[s].insertNonFull(e,t)),this._root=i}else this._root.insertNonFull(e,t);else this._root=new gt(this._order,!0),this._root.keys[0]=e,this._root.values[0]=new Set([t]),this._root.n=1;this._size++}}find(e){return this._root&&(e=this._root.search(e))?Array.from(e):[]}contains(e){return!!this._root&&null!==this._root.search(e)}range(e,t,i=!1,r=!1){return this._root?(this._root.rangeSearch(e,t,e=[],i,r),e):[]}rangeFrom(e,t=!1){return this._root?(this._root.rangeSearch(e,null,e=[],t,!1),e):[]}rangeTo(e,t=!1){return this._root?(this._root.rangeSearch(null,e,e=[],!1,t),e):[]}remove(e,t){var i;this._root&&(i=this._root.search(e))&&i.has(t)&&(this._root.remove(e,t),0===this._root.n&&!this._root.leaf&&this._root.children[0]&&(this._root=this._root.children[0]),this._size--)}verify(){var e;return this._root?(0<(e=this._root.verify()).length&&console.warn("BTree index issues detected (rebuild required):",e),{healthy:0===e.length,issues:e,requiresRebuild:0<e.length}):{healthy:!0,issues:[]}}clear(){this._root=null,this._size=0}get size(){return this._size}}class bt{constructor(){this._invertedIndex=new Map,this._docTokens=new Map,this._segmenter="undefined"!=typeof Intl&&Intl.Segmenter?new Intl.Segmenter(void 0,{granularity:"word"}):null}addDocument(e,t){if("string"==typeof e){var i;e=this._tokenize(e);for(i of(this._docTokens.set(t,new Set(e)),e))this._invertedIndex.has(i)||this._invertedIndex.set(i,new Set),this._invertedIndex.get(i).add(t)}}removeDocument(e){var t=this._docTokens.get(e);if(t){for(var i of t){var r=this._invertedIndex.get(i);r&&(r.delete(e),0===r.size)&&this._invertedIndex.delete(i)}this._docTokens.delete(e)}}updateDocument(e,t){this.removeDocument(e),this.addDocument(t,e)}search(e){var t;if(0===(e=this._tokenize(e)).length)return[];let i=null;for(t of e){let e=this._invertedIndex.get(t);if(!e||0===e.size)return[];i=null===i?new Set(e):new Set([...i].filter(t=>e.has(t)))}return i?Array.from(i):[]}_tokenize(e){if(this._segmenter){var t,i=[];for(t of this._segmenter.segment(e.toLowerCase()))t.isWordLike&&i.push(t.segment);return i.filter(e=>1<e.length)}return e.toLowerCase().replace(/[^\w\s]/g," ").split(/\s+/).filter(e=>1<e.length)}get size(){return this._docTokens.size}}class At{constructor(){this._tree=new wt({x:0,y:0,w:180,h:90}),this._size=0}addPoint(e,t){e&&"number"==typeof e.lat&&"number"==typeof e.lng&&(this._tree.insert({x:e.lng,y:e.lat,data:t}),this._size++)}removePoint(e){this._tree.remove(e),0<this._size&&this._size--}updatePoint(e,t){this.removePoint(e),this.addPoint(t,e)}findNear(e,t){var i,r=t/111,s=(r={x:e.lng,y:e.lat,w:r,h:r},[]);for(i of this._tree.query(r)){var a=this._haversine(e,{lat:i.y,lng:i.x});a<=t&&s.push({docId:i.data,distance:a})}return s.sort((e,t)=>e.distance-t.distance).map(e=>e.docId)}findWithin(e){var t=(e.maxLng-e.minLng)/2,i=(e.maxLat-e.minLat)/2;return this._tree.query({x:e.minLng+t,y:e.minLat+i,w:t,h:i}).map(e=>e.data)}_haversine(e,t){var i=this._toRad(t.lat-e.lat),r=this._toRad(t.lng-e.lng);i=Math.sin(i/2)*Math.sin(i/2)+Math.cos(this._toRad(e.lat))*Math.cos(this._toRad(t.lat))*Math.sin(r/2)*Math.sin(r/2);return 2*Math.atan2(Math.sqrt(i),Math.sqrt(1-i))*6371}_toRad(e){return e*(Math.PI/180)}get size(){return this._size}}class xt{constructor(e){this._collection=e,this._serializer=e.database._serializer,this._base64=e.database._base64,this._indexes=new Map,this._indexData=new Map,this._indexQueue=[],this._processing=!1}get indexes(){return this._indexes}async createIndex(e,t={}){var i=t.name||e;if(this._indexes.has(i))throw new Error(`Index '${i}' already exists`);return e={fieldPath:e,unique:t.unique||!1,sparse:t.sparse||!1,type:t.type||"btree",hashed:t.hashed||!1,collation:t.collation||null,createdAt:Date.now()},this._indexes.set(i,e),await this.rebuildIndex(i),this._saveIndexMetadata(),i}async rebuildIndex(e){var t=this._indexes.get(e);if(!t)throw new Error(`Index '${e}' not found`);var i=this._createIndexStructure(t.type);this._indexData.set(e,i);let r=null;for(;;){var s,a,n=await this._collection._indexedDB.getBatch(this._collection._db,"documents",r,100);if(0===n.length)break;for(s of n){r=s._id;let n=s;s.packedData&&(await(a=new zt(s,{compressed:s._compressed,encrypted:s._encrypted},this._serializer)).unpack(this._collection.database.encryption),n=a.objectOutput());let o=this._getFieldValue(n,t.fieldPath);t.sparse&&null==o||(t.unique&&i.has&&i.has(o)?console.error(`Unique constraint violation on index '${e}'`):(t.hashed&&"btree"===t.type&&(o=await this._hashVal(o)),this._addToIndex(i,o,n._id,t.type)))}window.requestIdleCallback&&await new Promise(e=>window.requestIdleCallback(e))}}_createIndexStructure(e){switch(e){case"btree":return new vt;case"hash":return new Map;case"text":return new bt;case"geo":return new At;default:return new Map}}_addToIndex(e,t,i,r){switch(r){case"btree":e.insert(t,i);break;case"hash":e.has(t)||e.set(t,new Set),e.get(t).add(i);break;case"text":e.addDocument(t,i);break;case"geo":e.addPoint(t,i)}}async _hashVal(e){return e=(new TextEncoder).encode(String(e)),e=await crypto.subtle.digest("SHA-256",e),this._base64.encode(new Uint8Array(e))}async updateIndexForDocument(e,t,i){for(var[r,s]of this._indexes){var a,n=this._indexData.get(r);if(n){let r=t?this._getFieldValue(t,s.fieldPath):void 0,o=i?this._getFieldValue(i,s.fieldPath):void 0;if(s.hashed&&(r=r&&await this._hashVal(r),o=o&&await this._hashVal(o)),r!==o)switch(s.type){case"btree":void 0!==r&&n.remove(r,e),void 0!==o&&n.insert(o,e);break;case"hash":void 0!==r&&(a=n.get(r))&&(a.delete(e),0===a.size)&&n.delete(r),void 0!==o&&(n.has(o)||n.set(o,new Set),n.get(o).add(e));break;case"text":(r||o)&&n.updateDocument(e,o||"");break;case"geo":r&&n.removePoint(e),o&&n.addPoint(o,e)}}}}async query(e,t){var i=this._indexes.get(e),r=this._indexData.get(e);if(i&&r)return i.hashed&&"object"!=typeof t&&(t=await this._hashVal(t)),this._queryIndex(r,t,i.type);throw new Error(`Index '${e}' not found`)}_queryIndex(e,t,i){switch(i){case"btree":return this._queryBTree(e,t);case"hash":return this._queryHash(e,t);case"text":return this._queryText(e,t);case"geo":return this._queryGeo(e,t);default:return[]}}_queryBTree(e,t){if("object"!=typeof t||null===t)return e.find(t);let i=new Set;void 0!==t.$eq&&e.find(t.$eq).forEach(e=>i.add(e));var r,s=void 0!==t.$gte,a=void 0!==t.$gt,n=void 0!==t.$lte,o=void 0!==t.$lt;return(s||a||n||o)&&(r=s?t.$gte:a?t.$gt:null,t=n?t.$lte:o?t.$lt:null,e.range(r,t,!s&&a,!n&&o).forEach(e=>i.add(e))),Array.from(i)}_queryHash(e,t){var i;if(void 0!==t.$eq)return(i=e.get(t.$eq))?Array.from(i):[];if(void 0===t.$in)return[];{let i=new Set;for(var r of t.$in)(r=e.get(r))&&r.forEach(e=>i.add(e));return Array.from(i)}}_queryText(e,t){return t.$search?e.search(t.$search):[]}_queryGeo(e,t){return t.$near?e.findNear(t.$near.coordinates,t.$near.maxDistance||1e3):t.$within?e.findWithin(t.$within):[]}dropIndex(e){this._indexes.delete(e),this._indexData.delete(e),this._saveIndexMetadata()}_getFieldValue(e,t){var i;let r=e;for(i of t.split(".")){if(null==r)return;r=r[i]}return r}async _saveIndexMetadata(){let e=`lacertadb_${this._collection.database.name}_${this._collection.name}_indexes`;return new Promise(t=>{var i=()=>{var i={indexes:Array.from(this._indexes.entries()).map(([e,t])=>({name:e,...t}))};i=this._serializer.serialize(i),i=this._base64.encode(i);localStorage.setItem(e,i),t()};"undefined"!=typeof window&&window.requestIdleCallback?window.requestIdleCallback(i):setTimeout(i,0)})}async loadIndexMetadata(){var e=`lacertadb_${this._collection.database.name}_${this._collection.name}_indexes`;if(e=localStorage.getItem(e))try{var t,i,r=this._base64.decode(e);for(t of this._serializer.deserialize(r).indexes){let{name:e,...i}=t;this._indexes.set(e,i)}for(i of this._indexes.keys())await this.rebuildIndex(i)}catch(e){console.error("Failed to load index metadata:",e)}}getIndexStats(){var e,t,i={};for([e,t]of this._indexes){var r=this._indexData.get(e);i[e]={...t,size:r&&(r.size||r.length)||0,memoryUsage:this._estimateMemoryUsage(r)}}return i}_estimateMemoryUsage(e){return e?e instanceof Map?100*e.size:e instanceof vt?120*e.size:0:0}async verifyIndexes(){var e,t,i={};for([e,t]of this._indexes){var r=this._indexData.get(e);r?r.verify?((r=r.verify()).requiresRebuild&&(await this.rebuildIndex(e),r.rebuilt=!0),i[e]=r):i[e]={status:"ok"}:(i[e]={status:"missing",rebuilt:!0},await this.rebuildIndex(e))}return i}destroy(){for(var[e,t]of this._indexData)t&&t.clear&&t.clear();this._indexData.clear(),this._indexes.clear(),this._indexQueue=[],this._processing=!1}}class St{async saveAttachments(e,t,i,r){try{var s,a,n=[],o=await(await(await(await navigator.storage.getDirectory()).getDirectoryHandle(e,{create:!0})).getDirectoryHandle(t,{create:!0})).getDirectoryHandle(i,{create:!0});for([s,a]of r.entries()){var h=s+"_"+(a.name||"file"),c=await(await o.getFileHandle(h,{create:!0})).createWritable();let r;if(a.data instanceof Uint8Array)r=a.data;else if(a.data instanceof ArrayBuffer)r=new Uint8Array(a.data);else{if(!(a.data instanceof Blob))throw new TypeError("Unsupported attachment data type");r=new Uint8Array(await a.data.arrayBuffer())}var l=new Blob([r],{type:a.type||"application/octet-stream"}),d=(await c.write(l),await c.close(),`/${e}/${t}/${i}/`+h);n.push({path:d,name:a.name,type:a.type,size:r.byteLength,originalName:a.originalName||a.name})}return n}catch(r){throw new ht("Failed to save attachments","ATTACHMENT_SAVE_FAILED",r)}}async getAttachments(e){var t,i=[],r=await navigator.storage.getDirectory();for(t of e)try{var s=t.path.split("/").filter(e=>e);let e=r;for(let t=0;t<s.length-1;t++)e=await e.getDirectoryHandle(s[t]);var a=await(await(await e.getFileHandle(s[s.length-1])).getFile()).arrayBuffer();i.push({name:t.originalName||t.name,type:t.type,data:new Uint8Array(a),size:t.size})}catch(e){console.error("Failed to get attachment: "+t.path,e)}return i}async deleteAttachments(e,t,i){try{await(await(await(await navigator.storage.getDirectory()).getDirectoryHandle(e)).getDirectoryHandle(t)).removeEntry(i,{recursive:!0})}catch(e){"NotFoundError"!==e.name&&console.error(`Failed to delete attachments for ${i}:`,e)}}static async prepareAttachment(e,t){let i;if(e instanceof File||e instanceof Blob){var r=await e.arrayBuffer();i=new Uint8Array(r)}else if(e instanceof ArrayBuffer)i=new Uint8Array(e);else{if(!(e instanceof Uint8Array))throw new TypeError("Unsupported file type for attachment");i=e}return{name:t||e.name||"unnamed",type:e.type||"application/octet-stream",data:i,originalName:e.name||t}}}class kt{constructor(){this._mutex=new ot}async performTransaction(e,t,i,r,s=3){return"readonly"===i?this._runTx(e,t,i,r,s):this._mutex.runExclusive(()=>this._runTx(e,t,i,r,s))}async _runTx(e,t,i,r,s){let a;for(let n=0;n<s;n++)try{return await new Promise((s,a)=>{let n,o=e.transaction(t,i);o.oncomplete=()=>s(n),o.onerror=()=>a(o.error),o.onabort=()=>a(new Error("Transaction aborted"));try{var h=r(o);h instanceof Promise?h.then(e=>{n=e}).catch(a):n=h}catch(s){a(s)}})}catch(e){a=e,n<s-1&&await new Promise(e=>setTimeout(e,2**n*100))}throw new ht("Transaction failed after retries","TRANSACTION_FAILED",a)}_promisifyRequest(e){return new Promise((t,i)=>{let r=e();r.onsuccess=()=>t(r.result),r.onerror=()=>i(r.error),r.onabort=()=>i(new DOMException("Request aborted","AbortError"))})}async getBatch(e,t,i,r){return this.performTransaction(e,[t],"readonly",e=>{let s,a=e.objectStore(t);return null!=i&&(s=IDBKeyRange.lowerBound(i,!0)),this._promisifyRequest(()=>a.getAll(s,r))})}add(e,t,i,r){return this.performTransaction(e,[t],"readwrite",e=>{let s=e.objectStore(t);return this._promisifyRequest(()=>void 0!==r?s.add(i,r):s.add(i))})}put(e,t,i,r){return this.performTransaction(e,[t],"readwrite",e=>{let s=e.objectStore(t);return this._promisifyRequest(()=>void 0!==r?s.put(i,r):s.put(i))})}get(e,t,i){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).get(i)))}getAll(e,t,i,r){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).getAll(i,r)))}delete(e,t,i){return this.performTransaction(e,[t],"readwrite",e=>this._promisifyRequest(()=>e.objectStore(t).delete(i)))}clear(e,t){return this.performTransaction(e,[t],"readwrite",e=>this._promisifyRequest(()=>e.objectStore(t).clear()))}count(e,t,i){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).count(i)))}async batchOperation(e,t){return this.performTransaction(e,["documents"],"readwrite",e=>{let i=e.objectStore("documents");return e=t.map(e=>{try{switch(e.type){case"add":return this._promisifyRequest(()=>i.add(e.data)).then(e=>({success:!0,result:e}));case"put":return this._promisifyRequest(()=>i.put(e.data)).then(e=>({success:!0,result:e}));case"delete":return this._promisifyRequest(()=>i.delete(e.key)).then(e=>({success:!0,result:e}));default:return Promise.resolve({success:!1,error:"Unknown operation type: "+e.type})}}catch(e){return Promise.resolve({success:!1,error:e.message})}}),Promise.all(e)})}}class zt{constructor(e={},t={},i){this._id=e._id||this._generateId(),this._created=e._created||Date.now(),this._modified=e._modified||Date.now(),this._permanent=e._permanent||t.permanent||!1,this._encrypted=!1,this._compressed=e._compressed||t.compressed||!1,this._attachments=e._attachments||[],this._data=null,this._packedData=e.packedData||null,this._compression=ft,this._serializer=i,e.data&&(this.data=e.data)}get data(){return this._data||{}}set data(e){this._data=e}_generateId(){return`doc_${Date.now()}_`+Math.random().toString(36).substring(2,11)}async pack(e=null){try{let t=this._serializer.serialize(this.data);return this._compressed&&(t=await this._compression.compress(t)),e&&(t=await e.encrypt(t),this._encrypted=!0),this._packedData=t}catch(e){throw new ht("Failed to pack document","PACK_FAILED",e)}}async unpack(e=null){try{let t=this._packedData;if(this._encrypted&&e&&(t=await e.decrypt(t)),!(t=this._compressed?await this._compression.decompress(t):t)||0===t.length)throw new Error("Empty unpacked data");if(this.data=this._serializer.deserialize(t),"object"!=typeof this.data||null===this.data)throw new Error("Invalid deserialized data");return this.data}catch(e){return console.error("Document unpack failed:",e),this.data={},this.data}}packSync(){let e=this._serializer.serialize(this.data);return this._compressed&&(e=this._compression.compressSync(e)),this._packedData=e}unpackSync(){if(this._encrypted)throw new ht("Synchronous decryption not supported","SYNC_DECRYPT_NOT_SUPPORTED");let e=this._packedData;return this._compressed&&(e=this._compression.decompressSync(e)),this.data=this._serializer.deserialize(e),this.data}objectOutput(e=!1){var t={_id:this._id,_created:this._created,_modified:this._modified,_permanent:this._permanent,...this.data};return e&&0<this._attachments.length&&(t._attachments=this._attachments),t}databaseOutput(){return{_id:this._id,_created:this._created,_modified:this._modified,_permanent:this._permanent,_encrypted:this._encrypted,_compressed:this._compressed,_attachments:this._attachments,packedData:this._packedData}}}class It{constructor(e,t={},i,r,s){this.name=e,this._serializer=i,this._base64=r,this._dbName=s,this._storageKey=s?`lacertadb_${s}_${e}_collmeta`:null,this.sizeKB=t.sizeKB||0,this.length=t.length||0,this.createdAt=t.createdAt||Date.now(),this.modifiedAt=t.modifiedAt||Date.now(),this._docSizes=new Map(t._docSizes||[]),this._docModified=new Map(t._docModified||[]),this._docPermanent=new Map(t._docPermanent||[]),this._docAttachments=new Map(t._docAttachments||[]),this._dirty=!1,this._saveTimer=null,this._flushHandler=()=>this._flushSync(),"undefined"!=typeof window&&window.addEventListener("beforeunload",this._flushHandler)}addDocument(e,t,i=!1,r=0){this._docSizes.set(e,t),this._docModified.set(e,Date.now()),this._docPermanent.set(e,i),this._docAttachments.set(e,r),this.sizeKB+=t,this.length++,this.modifiedAt=Date.now(),this._scheduleSave()}updateDocument(e,t,i=!1,r=0){var s=this._docSizes.get(e)||0;this.sizeKB=this.sizeKB-s+t,this._docSizes.set(e,t),this._docModified.set(e,Date.now()),this._docPermanent.set(e,i),this._docAttachments.set(e,r),this.modifiedAt=Date.now(),this._scheduleSave()}removeDocument(e){var t=this._docSizes.get(e)||0;this.sizeKB-=t,this.length--,this._docSizes.delete(e),this._docModified.delete(e),this._docPermanent.delete(e),this._docAttachments.delete(e),this.modifiedAt=Date.now(),this._scheduleSave()}getOldestNonPermanentDocuments(e){var t,i,r=[];for([t,i]of this._docModified)this._docPermanent.get(t)||r.push({id:t,modified:i});return r.sort((e,t)=>e.modified-t.modified),r.slice(0,e).map(e=>e.id)}getDocumentSize(e){return this._docSizes.get(e)||0}isDocumentPermanent(e){return this._docPermanent.get(e)||!1}hasDocument(e){return this._docSizes.has(e)}getAggregateSnapshot(){return{sizeKB:this.sizeKB,length:this.length,createdAt:this.createdAt,modifiedAt:this.modifiedAt}}_scheduleSave(){var e;this._dirty=!0,this._saveTimer||(e=()=>{this._saveTimer=null,this._dirty&&this._persistToStorage()},"undefined"!=typeof window&&window.requestIdleCallback?this._saveTimer=window.requestIdleCallback(e):this._saveTimer=setTimeout(e,300))}_flushSync(){this._dirty&&this._persistToStorage()}_persistToStorage(){if(this._storageKey&&this._serializer&&this._base64)try{var e={sizeKB:this.sizeKB,length:this.length,createdAt:this.createdAt,modifiedAt:this.modifiedAt,_docSizes:Array.from(this._docSizes.entries()),_docModified:Array.from(this._docModified.entries()),_docPermanent:Array.from(this._docPermanent.entries()),_docAttachments:Array.from(this._docAttachments.entries())},t=this._serializer.serialize(e),i=this._base64.encode(t);localStorage.setItem(this._storageKey,i),this._dirty=!1}catch(e){if("QuotaExceededError"===e.name){console.warn("CollectionMetadata: quota exceeded, saving aggregates only");try{var r={sizeKB:this.sizeKB,length:this.length,createdAt:this.createdAt,modifiedAt:this.modifiedAt},s=this._serializer.serialize(r),a=this._base64.encode(s);localStorage.setItem(this._storageKey,a),this._dirty=!1}catch(e){console.error("CollectionMetadata: fallback save also failed:",e)}}else console.error("CollectionMetadata save failed:",e)}}static load(e,t,i,r){var s=localStorage.getItem(`lacertadb_${e}_${t}_collmeta`);if(s)try{var a=r.decode(s),n=i.deserialize(a);return new It(t,n,i,r,e)}catch(e){console.warn("CollectionMetadata corrupted, resetting:",e)}return new It(t,{},i,r,e)}destroy(){this._flushSync(),"undefined"!=typeof window&&this._flushHandler&&(window.removeEventListener("beforeunload",this._flushHandler),this._flushHandler=null),this._saveTimer&&("undefined"!=typeof window&&window.cancelIdleCallback?window.cancelIdleCallback(this._saveTimer):clearTimeout(this._saveTimer),this._saveTimer=null)}clear(){this.sizeKB=0,this.length=0,this.modifiedAt=Date.now(),this._docSizes.clear(),this._docModified.clear(),this._docPermanent.clear(),this._docAttachments.clear(),this._dirty=!0,this._flushSync()}}class Et{constructor(e,t={},i,r){this.name=e,this._serializer=i,this._base64=r,this.collections=t.collections||{},this.totalSizeKB=t.totalSizeKB||0,this.totalLength=t.totalLength||0,this.modifiedAt=t.modifiedAt||Date.now(),this._dirty=!1,this._saveTimer=null,this._flushHandler=()=>this._flushSync(),"undefined"!=typeof window&&window.addEventListener("beforeunload",this._flushHandler)}static load(e,t,i){var r=localStorage.getItem(`lacertadb_${e}_metadata`);if(r)try{var s=i.decode(r),a=t.deserialize(s);return new Et(e,a,t,i)}catch(e){console.error("Failed to load metadata:",e)}return new Et(e,{},t,i)}setCollection(e){this.collections[e.name]=e.getAggregateSnapshot(),this._recalculate(),this._scheduleSave()}removeCollection(e){delete this.collections[e],this._recalculate(),this._scheduleSave()}_recalculate(){for(var e in this.totalSizeKB=0,this.totalLength=0,this.collections)e=this.collections[e],this.totalSizeKB+=e.sizeKB,this.totalLength+=e.length;this.modifiedAt=Date.now()}_scheduleSave(){var e;this._dirty=!0,this._saveTimer||(e=()=>{this._saveTimer=null,this._dirty&&this._persistToStorage()},"undefined"!=typeof window&&window.requestIdleCallback?this._saveTimer=window.requestIdleCallback(e):this._saveTimer=setTimeout(e,300))}_flushSync(){this._dirty&&this._persistToStorage()}_persistToStorage(){var e=`lacertadb_${this.name}_metadata`;try{var t={collections:this.collections,totalSizeKB:this.totalSizeKB,totalLength:this.totalLength,modifiedAt:this.modifiedAt},i=this._serializer.serialize(t),r=this._base64.encode(i);localStorage.setItem(e,r),this._dirty=!1}catch(e){"QuotaExceededError"===e.name?(console.error("CRITICAL: LocalStorage quota exceeded. Metadata not saved for db:",this.name),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("lacertadb:quotaexceeded",{detail:{db:this.name}}))):console.error("Failed to save metadata:",e)}}save(){this._dirty=!0,this._flushSync()}destroy(){this._flushSync(),"undefined"!=typeof window&&this._flushHandler&&(window.removeEventListener("beforeunload",this._flushHandler),this._flushHandler=null),this._saveTimer&&("undefined"!=typeof window&&window.cancelIdleCallback?window.cancelIdleCallback(this._saveTimer):clearTimeout(this._saveTimer),this._saveTimer=null)}}class Ut{constructor(e,t={},i,r){this.dbName=e,this._serializer=i,this._base64=r,this.sizeLimitKB=null!=t.sizeLimitKB?t.sizeLimitKB:1/0,e=this.sizeLimitKB===1/0?1/0:.8*this.sizeLimitKB,this.bufferLimitKB=null!=t.bufferLimitKB?t.bufferLimitKB:e,this.freeSpaceEvery=this.sizeLimitKB===1/0?0:t.freeSpaceEvery||1e4}static load(e,t,i){var r=localStorage.getItem(`lacertadb_${e}_settings`);if(r)try{var s=i.decode(r),a=t.deserialize(s);return new Ut(e,a,t,i)}catch(e){console.error("Failed to load settings:",e)}return new Ut(e,{},t,i)}save(){var e=`lacertadb_${this.dbName}_settings`;try{var t={sizeLimitKB:this.sizeLimitKB,bufferLimitKB:this.bufferLimitKB,freeSpaceEvery:this.freeSpaceEvery},i=this._serializer.serialize(t),r=this._base64.encode(i);localStorage.setItem(e,r)}catch(e){"QuotaExceededError"===e.name?(console.error("CRITICAL: Settings save failed — localStorage quota exceeded"),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("lacertadb:quotaexceeded",{detail:{source:"settings",db:this.dbName}}))):console.error("Settings save failed:",e)}}updateSettings(e){Object.assign(this,e),void 0!==e.sizeLimitKB&&void 0===e.bufferLimitKB&&(this.bufferLimitKB=this.sizeLimitKB===1/0?1/0:.8*this.sizeLimitKB),this.sizeLimitKB===1/0&&(this.freeSpaceEvery=0),this.save()}}let Ct=new class{constructor(){this.operators={$eq:(e,t)=>e===t,$ne:(e,t)=>e!==t,$gt:(e,t)=>t<e,$gte:(e,t)=>t<=e,$lt:(e,t)=>e<t,$lte:(e,t)=>e<=t,$in:(e,t)=>Array.isArray(t)&&t.includes(e),$nin:(e,t)=>Array.isArray(t)&&!t.includes(e),$and:(e,t)=>t.every(t=>this.evaluate(e,t)),$or:(e,t)=>t.some(t=>this.evaluate(e,t)),$not:(e,t)=>!this.evaluate(e,t),$nor:(e,t)=>!t.some(t=>this.evaluate(e,t)),$exists:(e,t)=>void 0!==e===t,$type:(e,t)=>typeof e===t,$all:(e,t)=>Array.isArray(e)&&t.every(t=>e.includes(t)),$elemMatch:(e,t)=>Array.isArray(e)&&e.some(e=>this.evaluate({value:e},{value:t})),$size:(e,t)=>Array.isArray(e)&&e.length===t,$regex:(e,t)=>{if("string"!=typeof e)return!1;try{return new RegExp(t).test(e)}catch{return!1}},$text:(e,t)=>"string"==typeof e&&e.toLowerCase().includes(t.toLowerCase())}}evaluate(e,t){for(var i in t){var r=t[i];if(i.startsWith("$")){var s=this.operators[i];if(!s||!s(e,r))return!1}else{var a=this.getFieldValue(e,i);if("object"!=typeof r||null===r||Array.isArray(r)){if(a!==r)return!1}else for(var n in r)if(n.startsWith("$")){var o=this.operators[n];if(!o||!o(a,r[n]))return!1}}}return!0}getFieldValue(e,t){let i=e;for(var r of t.split(".")){if(null==i)return;i=i[r]}return i}};let Dt=new class{constructor(){this.stages={$match:(e,t)=>e.filter(e=>Ct.evaluate(e,t)),$project:(e,t)=>e.map(e=>{var i,r={};for(i in t){var s=t[i];1===s||!0===s?r[i]=Ct.getFieldValue(e,i):"string"==typeof s&&s.startsWith("$")&&(r[i]=Ct.getFieldValue(e,s.substring(1)))}if(Object.values(t).some(e=>0===e||!1===e)){var a=Object.keys(t).filter(e=>0===t[e]||!1===t[e]);let i={...e};return a.forEach(e=>delete i[e]),i}return r}),$sort:(e,t)=>[...e].sort((e,i)=>{for(var r in t){var s=t[r],a=Ct.getFieldValue(e,r);if(a<(r=Ct.getFieldValue(i,r)))return-s;if(r<a)return s}return 0}),$limit:(e,t)=>e.slice(0,t),$skip:(e,t)=>e.slice(t),$group:(e,t)=>{var i,r=new Map,s=t._id;let a=e=>null===e||"object"!=typeof e?JSON.stringify(e):Array.isArray(e)?"["+e.map(a).join(",")+"]":"{"+Object.keys(e).sort().map(t=>JSON.stringify(t)+":"+a(e[t])).join(",")+"}",n=(e,t)=>{if("string"==typeof t&&t.startsWith("$"))return Ct.getFieldValue(e,t.substring(1));if(null===t||"object"!=typeof t||Array.isArray(t))return t;var i,r={};for(i in t)r[i]=n(e,t[i]);return r};for(i of e){let e;e="string"==typeof s?s.startsWith("$")?Ct.getFieldValue(i,s.substring(1)):s:null!==s&&"object"==typeof s?a(n(i,s)):s,r.has(e)||r.set(e,{_id:e,docs:[]}),r.get(e).docs.push(i)}var o,h=[];for(o of r.values()){var c,l={_id:o._id};for(c in t)if("_id"!==c){var d=t[c],u=Object.keys(d)[0];let e=d[u].toString().replace("$","");switch(u){case"$sum":l[c]=o.docs.reduce((t,i)=>t+(Ct.getFieldValue(i,e)||0),0);break;case"$avg":var _=o.docs.reduce((t,i)=>t+(Ct.getFieldValue(i,e)||0),0);l[c]=_/o.docs.length;break;case"$count":l[c]=o.docs.length;break;case"$max":l[c]=Math.max(...o.docs.map(t=>Ct.getFieldValue(t,e)));break;case"$min":l[c]=Math.min(...o.docs.map(t=>Ct.getFieldValue(t,e)))}}h.push(l)}return h},$lookup:async(e,t,i)=>{i=await(await i.getCollection(t.from)).getAll();let r=new Map;return i.forEach(e=>{var i=Ct.getFieldValue(e,t.foreignField);r.has(i)||r.set(i,[]),r.get(i).push(e)}),e.map(e=>{var i=Ct.getFieldValue(e,t.localField);return{...e,[t.as]:r.get(i)||[]}})}}}async execute(e,t,i){let r=e;for(var s of t){var a=Object.keys(s)[0],n=(s=s[a],this.stages[a]);if(!n)throw new Error("Unknown aggregation stage: "+a);r="$lookup"===a?await n(r,s,i):n(r,s)}return r}};class Mt{constructor(e){this.database=e,this.migrations=[],this.currentVersion=this._loadVersion()}_loadVersion(){return localStorage.getItem(`lacertadb_${this.database.name}_version`)||"1.0.0"}_saveVersion(e){localStorage.setItem(`lacertadb_${this.database.name}_version`,e),this.currentVersion=e}addMigration(e){this.migrations.push(e)}_compareVersions(e,t){var i=e.split(".").map(Number),r=t.split(".").map(Number),s=Math.max(i.length,r.length);for(let e=0;e<s;e++){var a=i[e]||0,n=r[e]||0;if(n<a)return 1;if(a<n)return-1}return 0}async runMigrations(e){var t;for(t of this.migrations.filter(t=>0<this._compareVersions(t.version,this.currentVersion)&&this._compareVersions(t.version,e)<=0).sort((e,t)=>this._compareVersions(e.version,t.version)))await this._applyMigration(t,"up"),this._saveVersion(t.version)}async rollback(e){var t;for(t of this.migrations.filter(t=>t.down&&0<this._compareVersions(t.version,e)&&this._compareVersions(t.version,this.currentVersion)<=0).sort((e,t)=>this._compareVersions(t.version,e.version)))await this._applyMigration(t,"down");this._saveVersion(e)}async _applyMigration(e,t){var i;for(i of(console.log(`${"up"===t?"Running":"Rolling back"} migration: ${e.name} (v${e.version})`),await this.database.listCollections())){var r,s=await this.database.getCollection(i);for(r of await s.getAll()){var a=await e[t](r);a&&await s.update(r._id,a)}}}}class Tt{constructor(){this._metrics={operations:[],latencies:[],cacheHits:0,cacheMisses:0,memoryUsage:[]},this._monitoring=!1,this._monitoringInterval=null}startMonitoring(){this._monitoring||(this._monitoring=!0,this._monitoringInterval=setInterval(()=>this._collectMetrics(),1e3))}stopMonitoring(){this._monitoring&&(this._monitoring=!1,clearInterval(this._monitoringInterval),this._monitoringInterval=null)}recordOperation(e,t){this._monitoring&&(this._metrics.operations.push({type:e,duration:t,timestamp:Date.now()}),this._metrics.latencies.push(t),100<this._metrics.operations.length&&this._metrics.operations.shift(),100<this._metrics.latencies.length)&&this._metrics.latencies.shift()}recordCacheHit(){this._metrics.cacheHits++}recordCacheMiss(){this._metrics.cacheMisses++}_collectMetrics(){performance&&performance.memory&&(this._metrics.memoryUsage.push({used:performance.memory.usedJSHeapSize,total:performance.memory.totalJSHeapSize,limit:performance.memory.jsHeapSizeLimit,timestamp:Date.now()}),60<this._metrics.memoryUsage.length)&&this._metrics.memoryUsage.shift()}getStats(){var e=this._metrics.operations.filter(e=>Date.now()-e.timestamp<1e3).length,t=this._metrics.latencies.reduce((e,t)=>e+t,0),i=(t=0<this._metrics.latencies.length?t/this._metrics.latencies.length:0,0<(i=this._metrics.cacheHits+this._metrics.cacheMisses)?this._metrics.cacheHits/i*100:0),r=(r=0<this._metrics.memoryUsage.length?this._metrics.memoryUsage[this._metrics.memoryUsage.length-1]:null)?r.used/1048576:0;return{opsPerSec:e,avgLatency:t.toFixed(2),cacheHitRate:i.toFixed(1),memoryUsageMB:r.toFixed(2)}}getOptimizationTips(){var e=[],t=this.getStats();return 100<t.avgLatency&&e.push("High average latency detected. Consider enabling compression and indexing frequently queried fields."),t.cacheHitRate<50&&20<this._metrics.cacheHits+this._metrics.cacheMisses&&e.push("Low cache hit rate. Consider increasing cache size or optimizing query patterns."),10<this._metrics.memoryUsage.length&&10485760<(t=this._metrics.memoryUsage.slice(-10))[t.length-1].used-t[0].used&&e.push("Memory usage is increasing rapidly. Check for memory leaks or consider batch processing."),0<e.length?e:["Performance is optimal. No issues detected."]}}class Bt{constructor(e,t){this.name=e,this.database=t,this._serializer=t._serializer,this._base64=t._base64,this._db=null,this._metadata=null,this._settings=t.settings,this._indexedDB=new kt,this._opfs=new St,this._cleanupInterval=null,this._events=new Map,this._indexManager=new xt(this),this._cacheStrategy=new ut({type:"lru",maxSize:100,ttl:6e4,enabled:!0}),this._performanceMonitor=t.performanceMonitor,this._initialized=!1}get settings(){return this._settings}get metadata(){return this._metadata}get initialized(){return this._initialized}async init(){var e;return this._initialized||(e=this.database.name+"_"+this.name,this._db=await nt.getConnection(e,1,(e,t)=>{t<1&&!e.objectStoreNames.contains("documents")&&e.createObjectStore("documents",{keyPath:"_id"}).createIndex("modified","_modified",{unique:!1})}),this._metadata=It.load(this.database.name,this.name,this._serializer,this._base64),await this._indexManager.loadIndexMetadata(),0<this._settings.freeSpaceEvery&&this._settings.sizeLimitKB!==1/0&&(this._cleanupInterval=setInterval(()=>this._freeSpace(),this._settings.freeSpaceEvery)),this._initialized=!0),this}async createIndex(e,t={}){return this._indexManager.createIndex(e,t)}async dropIndex(e){return this._indexManager.dropIndex(e)}async getIndexes(){return this._indexManager.getIndexStats()}async verifyIndexes(){return this._indexManager.verifyIndexes()}configureCacheStrategy(e){this._cacheStrategy.updateStrategy(e)}async add(e,t={}){if(this._initialized||await this.init(),t.encrypted&&!this.database.isEncrypted)throw new ht("Document-level encryption requires database-level encryption. Use getSecureDatabase() to create an encrypted database.","ENCRYPTION_NOT_INITIALIZED");await this._trigger("beforeAdd",e);e=new zt({data:e,_id:t.id},{compressed:!1!==t.compressed,permanent:t.permanent||!1},this._serializer),(t=t.attachments)&&0<t.length&&(t=await Promise.all(t.map(e=>e instanceof File||e instanceof Blob?St.prepareAttachment(e,e.name):Promise.resolve(e))),e._attachments=await this._opfs.saveAttachments(this.database.name,this.name,e._id,t)),await e.pack(this.database.encryption),t=e.databaseOutput();var i=(await this._indexedDB.add(this._db,"documents",t),e.objectOutput());await this._indexManager.updateIndexForDocument(e._id,null,i),i=t.packedData.byteLength/1024;return this._metadata.addDocument(e._id,i,e._permanent,e._attachments.length),this.database.metadata.setCollection(this._metadata),await this._checkSpaceLimit(),await this._trigger("afterAdd",e),this._cacheStrategy.clear(),e._id}async get(e,t={}){this._initialized||await this.init(),await this._trigger("beforeGet",e);var i,r=await this._indexedDB.get(this._db,"documents",e);if(r)return i=new zt(r,{encrypted:r._encrypted,compressed:r._compressed},this._serializer),r.packedData&&await i.unpack(this.database.encryption),t.includeAttachments&&0<i._attachments.length&&(i.data._attachments=await this._opfs.getAttachments(i._attachments)),await this._trigger("afterGet",i),i.objectOutput(t.includeAttachments);throw new ht(`Document with id '${e}' not found.`,"DOCUMENT_NOT_FOUND")}async getAll(e={}){return this._initialized||await this.init(),e=await this._indexedDB.getAll(this._db,"documents",void 0,e.limit),Promise.all(e.map(async e=>{try{var t=new zt(e,{encrypted:e._encrypted,compressed:e._compressed},this._serializer);return e.packedData&&await t.unpack(this.database.encryption),t.objectOutput()}catch(t){return console.error(`Failed to unpack document ${e._id}:`,t),null}})).then(e=>e.filter(Boolean))}async update(e,t,i={}){this._initialized||await this.init(),await this._trigger("beforeUpdate",{docId:e,updates:t});var r,s,a=await this._indexedDB.get(this._db,"documents",e);if(a)return s=new zt(a,{},this._serializer),a.packedData&&await s.unpack(this.database.encryption),r=s.objectOutput(),s={...s.data,...t},(t=new zt({_id:e,_created:a._created,data:s},{compressed:void 0!==i.compressed?i.compressed:a._compressed,permanent:void 0!==i.permanent?i.permanent:a._permanent},this._serializer))._modified=Date.now(),(s=i.attachments)&&0<s.length?(await this._opfs.deleteAttachments(this.database.name,this.name,e),i=await Promise.all(s.map(e=>e instanceof File||e instanceof Blob?St.prepareAttachment(e,e.name):Promise.resolve(e))),t._attachments=await this._opfs.saveAttachments(this.database.name,this.name,t._id,i)):t._attachments=a._attachments,await t.pack(this.database.encryption),s=t.databaseOutput(),await this._indexedDB.put(this._db,"documents",s),i=t.objectOutput(),await this._indexManager.updateIndexForDocument(t._id,r,i),a=s.packedData.byteLength/1024,this._metadata.updateDocument(t._id,a,t._permanent,t._attachments.length),this.database.metadata.setCollection(this._metadata),await this._trigger("afterUpdate",t),this._cacheStrategy.clear(),t._id;throw new ht(`Document with id '${e}' not found for update.`,"DOCUMENT_NOT_FOUND")}async delete(e,t={}){this._initialized||await this.init(),await this._trigger("beforeDelete",e);var i=await this._indexedDB.get(this._db,"documents",e);if(!i)throw new ht("Document not found for deletion","DOCUMENT_NOT_FOUND");if(i._permanent&&!t.force)throw new ht("Cannot delete a permanent document. Use options.force = true to force deletion.","PERMANENT_DOCUMENT_PROTECTION");i._permanent&&t.force&&console.warn("Force deleting permanent document: "+e),t=await this.get(e),await this._indexManager.updateIndexForDocument(e,t,null),await this._indexedDB.delete(this._db,"documents",e),(t=i._attachments)&&0<t.length&&await this._opfs.deleteAttachments(this.database.name,this.name,e),this._metadata.removeDocument(e),this.database.metadata.setCollection(this._metadata),await this._trigger("afterDelete",e),this._cacheStrategy.clear()}async query(e={},t={}){this._initialized||await this.init();var i,r,s=performance.now(),a=JSON.stringify({f:e,o:t},(e,t)=>{if(!t||"object"!=typeof t||Array.isArray(t))return t;var i,r={};for(i of Object.keys(t).sort())r[i]=t[i];return r}),n=this._cacheStrategy.get(a);if(n)return this._performanceMonitor&&this._performanceMonitor.recordCacheHit(),n;this._performanceMonitor&&this._performanceMonitor.recordCacheMiss();let o,h=!1;for([i,r]of this._indexManager.indexes){var c=e[r.fieldPath];if(void 0!==c){c=await this._indexManager.query(i,c),o=(o=await Promise.all(c.map(e=>this.get(e).catch(()=>null)))).filter(Boolean),h=!0;break}}return h||(o=await this.getAll(t),0<Object.keys(e).length&&(o=o.filter(t=>Ct.evaluate(t,e)))),t.sort&&(o=Dt.stages.$sort(o,t.sort)),t.skip&&(o=Dt.stages.$skip(o,t.skip)),t.limit&&(o=Dt.stages.$limit(o,t.limit)),t.projection&&(o=Dt.stages.$project(o,t.projection)),this._performanceMonitor&&this._performanceMonitor.recordOperation(h?"indexed-query":"full-scan-query",performance.now()-s),this._cacheStrategy.set(a,o),o}async aggregate(e){this._initialized||await this.init();var t=performance.now(),i=await this.getAll();i=await Dt.execute(i,e,this.database);return this._performanceMonitor&&this._performanceMonitor.recordOperation("aggregate",performance.now()-t),i}async batchAdd(e,t={}){this._initialized||await this.init();var i,r=performance.now(),s=[];let a=[];for(i of e){var n=new zt({data:i},{compressed:!1!==t.compressed,permanent:t.permanent||!1},this._serializer);await n.pack(this.database.encryption),s.push({type:"add",data:n.databaseOutput()}),a.push(n)}var o,h,c=await this._indexedDB.batchOperation(this._db,s);for(let e=0;e<a.length;e++)c[e].success&&(h=(o=a[e]).objectOutput(),await this._indexManager.updateIndexForDocument(o._id,null,h),h=o._packedData.byteLength/1024,this._metadata.addDocument(o._id,h,o._permanent,0));return this.database.metadata.setCollection(this._metadata),this._performanceMonitor&&this._performanceMonitor.recordOperation("batchAdd",performance.now()-r),c.map((e,t)=>({...e,id:a[t]._id}))}async batchUpdate(e,t={}){this._initialized||await this.init();var i=performance.now(),r=[],s=[];let a=[];var n,o=[];for(n of e){var h,c=await this._indexedDB.get(this._db,"documents",n.id);c?(h=new zt(c,{},this._serializer),c.packedData&&await h.unpack(this.database.encryption),s.push(h.objectOutput()),h={...h.data,...n.data},(h=new zt({_id:n.id,_created:c._created,data:h},{compressed:void 0!==t.compressed?t.compressed:c._compressed,permanent:void 0!==t.permanent?t.permanent:c._permanent},this._serializer))._modified=Date.now(),h._attachments=c._attachments,await h.pack(this.database.encryption),a.push(h),r.push({type:"put",data:h.databaseOutput()})):o.push({success:!1,id:n.id,error:"Document not found"})}if(0===r.length)return o;var l,d,u=await this._indexedDB.batchOperation(this._db,r);for(let e=0;e<a.length;e++)u[e].success&&(l=a[e],await this._indexManager.updateIndexForDocument(l._id,s[e],l.objectOutput()),d=l._packedData.byteLength/1024,this._metadata.updateDocument(l._id,d,l._permanent,l._attachments.length));return this.database.metadata.setCollection(this._metadata),this._cacheStrategy.clear(),this._performanceMonitor&&this._performanceMonitor.recordOperation("batchUpdate",performance.now()-i),[...u.map((e,t)=>({...e,id:a[t]._id})),...o]}async batchDelete(e){this._initialized||await this.init();var t=performance.now(),i=(e=e.map(e=>"string"==typeof e?{id:e,options:{}}:{id:e.id,options:e.options||{}}),[]);let r=[];var s,a,n=[];for({id:s,options:a}of e){var o,h=await this._indexedDB.get(this._db,"documents",s);h?h._permanent&&!a.force?n.push({success:!1,id:s,error:"Cannot delete permanent document without force flag"}):(o=await this.get(s),r.push({id:s,fullDoc:o,stored:h}),i.push({type:"delete",key:s})):n.push({success:!1,id:s,error:"Document not found"})}if(0===i.length)return n;var c,l,d,u=await this._indexedDB.batchOperation(this._db,i);for(let e=0;e<r.length;e++)u[e].success&&(({id:c,fullDoc:l,stored:d}=r[e]),await this._indexManager.updateIndexForDocument(c,l,null),d._attachments&&0<d._attachments.length&&await this._opfs.deleteAttachments(this.database.name,this.name,c),this._metadata.removeDocument(c));return this.database.metadata.setCollection(this._metadata),this._cacheStrategy.clear(),this._performanceMonitor&&this._performanceMonitor.recordOperation("batchDelete",performance.now()-t),[...u.map((e,t)=>({...e,id:r[t].id})),...n]}async _checkSpaceLimit(){this._settings.sizeLimitKB!==1/0&&this._metadata.sizeKB>this._settings.bufferLimitKB&&await this._freeSpace()}async _freeSpace(){for(var e=.8*this._settings.bufferLimitKB;this._metadata.sizeKB>e;){var t=this._metadata.getOldestNonPermanentDocuments(10);if(0===t.length)break;await this.batchDelete(t)}}on(e,t){this._events.has(e)||this._events.set(e,[]),this._events.get(e).push(t)}off(e,t){var i;this._events.has(e)&&(i=this._events.get(e).filter(e=>e!==t),this._events.set(e,i))}async _trigger(e,t){if(this._events.has(e))for(var i of this._events.get(e))await i(t)}clearCache(){this._cacheStrategy.clear()}async clear(e={}){if(this._initialized||await this.init(),e.force)for(var t of(await this._indexedDB.clear(this._db,"documents"),this._metadata&&this._metadata.destroy(),this._metadata=new It(this.name,{},this._serializer,this._base64,this.database.name),this._metadata._flushSync(),this.database.metadata.setCollection(this._metadata),this._cacheStrategy.clear(),this._indexManager.indexes.keys()))await this._indexManager.rebuildIndex(t);else e=(await this.getAll()).filter(e=>!e._permanent),await this.batchDelete(e.map(e=>e._id));this._cleanupInterval&&(clearInterval(this._cleanupInterval),this._cleanupInterval=null,0<this._settings.freeSpaceEvery)&&this._settings.sizeLimitKB!==1/0&&(this._cleanupInterval=setInterval(()=>this._freeSpace(),this._settings.freeSpaceEvery))}destroy(){var e;this._metadata&&this._metadata.destroy(),this._cleanupInterval&&(clearInterval(this._cleanupInterval),this._cleanupInterval=null),this._cacheStrategy&&this._cacheStrategy.destroy(),this._db&&(e=this.database.name+"_"+this.name,nt.releaseConnection(e),this._db=null),this._events.clear()}}class Vt{constructor(e,t,i,r){this.name=e,this._collections=new Map,this._metadata=null,this._settings=null,this._quickStore=null,this._performanceMonitor=t,this._serializer=i,this._base64=r,this._encryption=null}get collections(){return this._collections}get metadata(){return this._metadata}get settings(){return this._settings}get quickStore(){return this._quickStore}get performanceMonitor(){return this._performanceMonitor}get encryption(){return this._encryption}get isEncrypted(){return!!this._encryption}async init(e={}){return this._metadata=Et.load(this.name,this._serializer,this._base64),this._settings=Ut.load(this.name,this._serializer,this._base64),this._quickStore=new st(this.name,this._serializer,this._base64),e.pin&&await this._initializeEncryption(e.pin,e.salt,e.encryptionConfig),this}async _initializeEncryption(e,t=0,i={}){var r=`lacertadb_${this.name}_encryption`;let s=null;var a=((a=localStorage.getItem(r))&&(a=this._base64.decode(a),s=this._serializer.deserialize(a)),this._encryption=new yt(i,this._serializer,this._base64),await this._encryption.initialize(e,s));s||(i=this._serializer.serialize(a),e=this._base64.encode(i),localStorage.setItem(r,e))}async changePin(e,t){if(this._encryption)return e=await this._encryption.changePin(e,t),t=`lacertadb_${this.name}_encryption`,e=this._serializer.serialize(e),e=this._base64.encode(e),localStorage.setItem(t,e),!0;throw new Error("Database is not encrypted")}async storePrivateKey(e,t,i=""){if(!this._encryption)throw new Error("Database must be encrypted to store private keys");t=await this._encryption.encryptPrivateKey(t,i);let r=await this.getCollection("__private_keys__").catch(()=>null);return await(r=r||await this.createCollection("__private_keys__")).add({name:e,key:t,createdAt:Date.now()},{id:e,permanent:!0}),!0}async getPrivateKey(e,t=""){if(!this._encryption)throw new Error("Database must be encrypted to retrieve private keys");var i=await(await this.getCollection("__private_keys__")).get(e);if(i)return this._encryption.decryptPrivateKey(i.key,t);throw new Error(`Private key '${e}' not found`)}async createCollection(e,t){if(this._collections.has(e))throw new ht(`Collection '${e}' already exists.`,"COLLECTION_EXISTS");var i=new Bt(e,this);return this._collections.set(e,i),this._metadata.collections[e]||this._metadata.setCollection(new It(e,{},this._serializer,this._base64,this.name)),i}async getCollection(e){var t;if(this._collections.has(e))return(t=this._collections.get(e)).initialized||await t.init(),t;if(this._metadata.collections[e])return t=new Bt(e,this),this._collections.set(e,t),await t.init(),t;throw new ht(`Collection '${e}' not found.`,"COLLECTION_NOT_FOUND")}async dropCollection(e){var t;this._collections.has(e)&&((t=this._collections.get(e)).initialized&&(await t.clear({force:!0}),t.destroy()),this._collections.delete(e)),this._metadata.removeCollection(e),localStorage.removeItem(`lacertadb_${this.name}_${e}_collmeta`),localStorage.removeItem(`lacertadb_${this.name}_${e}_indexes`);let i=this.name+"_"+e;await new Promise((e,t)=>{var r=indexedDB.deleteDatabase(i);r.onsuccess=e,r.onerror=t,r.onblocked=()=>console.warn(`Deletion of '${i}' is blocked.`)})}listCollections(){return Object.keys(this._metadata.collections)}getStats(){return{name:this.name,totalSizeKB:this._metadata.totalSizeKB,totalDocuments:this._metadata.totalLength,collections:Object.entries(this._metadata.collections).map(([e,t])=>({name:e,sizeKB:t.sizeKB,documents:t.length,createdAt:new Date(t.createdAt).toISOString(),modifiedAt:new Date(t.modifiedAt).toISOString()}))}}updateSettings(e){this._settings.updateSettings(e)}async export(e="json",t=null){var i,r,s,a={version:"0.11.1",database:this.name,timestamp:Date.now(),collections:{}};for(i of this.listCollections()){var n=await this.getCollection(i);a.collections[i]=await n.getAll()}if("json"===e)return s=this._serializer.serialize(a),this._base64.encode(s);if("encrypted"===e&&t)return s=new pt,r=this._serializer.serialize(a),s=await s.encrypt(r,t),this._base64.encode(s);throw new ht("Unsupported export format: "+e,"INVALID_FORMAT")}async import(e,t="json",i=null){let r;try{var s,a=this._base64.decode(e);r="encrypted"===t&&i?(s=await(new pt).decrypt(a,i),this._serializer.deserialize(s)):this._serializer.deserialize(a)}catch(e){throw new ht("Failed to parse import data","IMPORT_PARSE_FAILED",e)}for(var n in r.collections){var o=r.collections[n];let t;try{t=await this.createCollection(n)}catch(e){if("COLLECTION_EXISTS"!==e.code)throw e;t=await this.getCollection(n)}await t.batchAdd(o)}return e=Object.values(r.collections).reduce((e,t)=>e+t.length,0),{collections:Object.keys(r.collections).length,documents:e}}async clearAll(){await Promise.all([...this._collections.keys()].map(e=>this.dropCollection(e))),this._collections.clear(),this._metadata&&this._metadata.destroy(),this._metadata=new Et(this.name,{},this._serializer,this._base64),this._metadata.save(),this._quickStore.clear()}async destroy(){for(var e of this._collections.values())e.initialized&&(await e.clear({force:!0}),e.destroy());this._collections.clear(),this._quickStore&&this._quickStore.destroy(),this._metadata&&this._metadata.destroy(),this._encryption&&this._encryption.destroy(),this._metadata=null,this._settings=null,this._quickStore=null,this._performanceMonitor=null}}class Lt{constructor(e={}){this._databases=new Map,this._performanceMonitor=new Tt,e={...rt,...e.turboSerial||{}},this._serializer=new class{constructor(e={}){this.options={compression:e.compression||!1,deduplication:!1!==e.deduplication,shareArrayBuffers:!1!==e.shareArrayBuffers,simdOptimization:!1!==e.simdOptimization,detectCircular:!1!==e.detectCircular,allowFunction:e.allowFunction||!1,serializeFunctions:e.serializeFunctions||!1,preservePropertyDescriptors:!1!==e.preservePropertyDescriptors,memoryPoolSize:e.memoryPoolSize||65536,...e},this.options.allowFunction||(this.options.serializeFunctions=!1),this.pool=new Xe(this.options.memoryPoolSize),this.detector=new et({allowFunction:this.options.allowFunction}),this.simdProcessor=new Ze,this.refs=new Map,this.circularRefs=new Set,this.strings=new Map,this.buffers=new Map,this.encoder=new TextEncoder,this.decoder=new TextDecoder}serialize(e){return this.resetState(),this.pool.writeU32(1413632565),this.pool.writeU8(5),this.options.detectCircular&&this.detectCircularReferences(e,new WeakSet),this.writeValue(e),this.pool.getResult()}resetState(){this.pool.reset(),this.refs.clear(),this.circularRefs.clear(),this.strings.clear(),this.buffers.clear()}detectCircularReferences(e,t){if("object"==typeof e&&null!=e)if(t.has(e))this.circularRefs.add(e);else{t.add(e);try{if(Array.isArray(e))for(let i=0;i<e.length;i++)i in e&&this.detectCircularReferences(e[i],t);else if(e instanceof Map)for(var[i,r]of e)this.detectCircularReferences(i,t),this.detectCircularReferences(r,t);else if(e instanceof Set)for(var s of e)this.detectCircularReferences(s,t);else for(var a in e)if(e.hasOwnProperty(a))try{this.detectCircularReferences(e[a],t)}catch(i){}}finally{t.delete(e)}}}writeValue(e){if(this.options.detectCircular&&"object"==typeof e&&null!=e&&this.circularRefs.has(e)){if(void 0!==(t=this.refs.get(e)))return this.pool.writeU8(Fe),void this.pool.writeVarint(t);this.refs.set(e,this.refs.size)}if(this.options.deduplication&&"object"==typeof e&&null!=e&&!this.circularRefs.has(e)){if(void 0!==(t=this.refs.get(e)))return this.pool.writeU8(Pe),void this.pool.writeVarint(t);this.refs.set(e,this.refs.size)}if(this.options.deduplication&&"string"==typeof e&&3<e.length){if(void 0!==(t=this.strings.get(e)))return this.pool.writeU8(N),void this.pool.writeVarint(t);this.strings.set(e,this.strings.size)}if(this.options.shareArrayBuffers&&e instanceof ArrayBuffer){if(void 0!==(t=this.buffers.get(e)))return this.pool.writeU8(ge),void this.pool.writeVarint(t);this.buffers.set(e,this.buffers.size)}var t,i=this.detector.detect(e);switch(t=(this.pool.writeU8(i),i&r)){case s:break;case a:this.writeNumber(e,i);break;case n:this.writeBigInt(e,i);break;case o:this.writeString(e,i);break;case h:this.writeArray(e,i);break;case c:this.writeObject(e,i);break;case l:this.writeTypedArray(e,i);break;case d:this.writeArrayBuffer(e,i);break;case u:this.writeCollection(e,i);break;case _:this.writeDate(e,i);break;case f:this.writeError(e,i);break;case p:this.writeRegExp(e);break;case y:this.writeBinary(e,i);break;case w:this.writeSpecial(e,i);break;case m:this.writeExtension(e,i)}}writeNumber(e,t){switch(t){case x:this.pool.writeU8(e);break;case S:this.pool.writeI16(e);break;case k:this.pool.writeI32(e);break;case z:this.pool.writeU32(e);break;case I:this.pool.writeF32(e);break;case E:this.pool.writeF64(e);break;case T:var i=e<0;this.pool.writeVarint(Math.abs(e)),this.pool.writeU8(i?1:0)}}writeBigInt(e,t){switch(t){case B:case V:this.pool.writeBigInt64(e);break;case L:case P:this.writeLargeBigInt(e)}}writeLargeBigInt(e){var t,i=BigInt(e).toString(16).replace("-",""),r=[];for(let e=i.length-2;0<=e;e-=2)r.push(parseInt(i.substr(e,2),16));for(t of(i.length%2&&r.push(parseInt(i[0],16)),this.pool.writeVarint(r.length),r))this.pool.writeU8(t)}writeString(e,t){var i=e.length;switch(t){case F:break;case O:case K:this.pool.writeU8(i);for(let t=0;t<i;t++)this.pool.writeU8(e.charCodeAt(t));break;case q:this.pool.writeVarint(i);for(let t=0;t<i;t++)this.pool.writeU8(e.charCodeAt(t));break;case R:case $:case j:var r=this.encoder.encode(e);t==R||t==$?this.pool.writeU8(r.length):this.pool.writeVarint(r.length),this.pool.writeBulkAligned(r,1)}}writeArray(e,t){var i=e.length;switch(t){case H:break;case G:this.pool.writeVarint(i);for(let t=0;t<i;t++)this.writeValue(e[t]);break;case W:this.writeSparseArray(e);break;case Q:case J:case Y:case X:case Z:this.pool.writePackedArray(e,t)}}writeSparseArray(e){var t=e.length,i=new Uint32Array(t),r=[];let s=0;for(let a=0;a<t;a++)a in e&&(i[s]=a,r[s]=e[a],s++);this.pool.writeVarint(t),this.pool.writeVarint(s);for(let e=0;e<s;e++)this.pool.writeVarint(i[e]),this.writeValue(r[e])}writeObject(e,t){if(t!=ee)switch(t){case ie:case te:this.writeSimpleObject(e);break;case se:this.writeObjectWithDescriptors(e);break;case ae:this.writeObjectWithMethods(e);break;case re:this.writeConstructorObject(e)}}writeSimpleObject(e){var t,i=Object.keys(e).filter(t=>{try{return"function"!=typeof e[t]||this.options.serializeFunctions}catch(t){return!1}});for(t of(i.sort(),this.pool.writeVarint(i.length),i))this.writeValue(t),this.writeValue(e[t])}writeObjectWithDescriptors(e){var t,i=Object.getOwnPropertyNames(e),r=Object.getOwnPropertySymbols(e);i=[...i,...r].filter(t=>{try{var i=Object.getOwnPropertyDescriptor(e,t);return i&&(this.options.serializeFunctions||!i.get&&!i.set&&"function"!=typeof i.value)}catch(t){return!1}});for(t of(this.pool.writeVarint(i.length),i)){this.writeValue(t);var s=Object.getOwnPropertyDescriptor(e,t);let i=0;s.enumerable&&(i|=1),s.writable&&(i|=2),s.configurable&&(i|=4),s.get&&(i|=8),s.set&&(i|=16),this.pool.writeU8(i),s.get||s.set?(s.get&&this.writeValue(s.get),s.set&&this.writeValue(s.set)):this.writeValue(s.value)}}writeObjectWithMethods(e){var t,i,r,s,a=[];for(t of Object.keys(e))try{var n=e[t];"function"==typeof n?this.options.serializeFunctions?a.push([t,n,!0]):a.push([t,null,!1]):a.push([t,n,!1])}catch(e){}for([i,r,s]of(this.pool.writeVarint(a.length),a))this.writeValue(i),this.pool.writeU8(s?1:0),s&&this.options.serializeFunctions?(this.writeValue(r.toString()),this.writeValue(r.name||"")):s?this.pool.writeU8($e):this.writeValue(r)}writeConstructorObject(e){this.writeValue(e.constructor.name||"");var t,i=Object.keys(e).filter(t=>{try{return"function"!=typeof e[t]||this.options.serializeFunctions}catch(t){return!1}});for(t of(this.pool.writeVarint(i.length),i))this.writeValue(t),this.writeValue(e[t])}writeTypedArray(e,t){var i=e.buffer,r=e.byteOffset,s=e.length;if(this.options.shareArrayBuffers){if(void 0!==(a=this.buffers.get(i)))return this.pool.writeU8(1),this.pool.writeVarint(a),this.pool.writeVarint(r),void this.pool.writeVarint(s);this.buffers.set(i,this.buffers.size)}this.pool.writeU8(0),this.pool.writeVarint(r),this.pool.writeVarint(s);var a,n=s*(a=Ne[t]||1);if(t==pe||t==ye)for(let t=0;t<s;t++)this.pool.writeBigInt64(e[t]);else t=new Uint8Array(i,r,n),this.pool.writeBulkAligned(t,a)}writeArrayBuffer(e,t){e=new Uint8Array(e),this.pool.writeVarint(e.length),this.pool.writeBulkAligned(e,1)}writeCollection(e,t){switch(t){case be:for(var[i,r]of(this.pool.writeVarint(e.size),e))this.writeValue(i),this.writeValue(r);break;case Ae:for(var s of(this.pool.writeVarint(e.size),e))this.writeValue(s)}}writeDate(e,t){t==xe&&this.pool.writeF64(e.getTime())}writeError(e,t){if(this.writeValue(e.message||""),this.writeValue(e.stack||""),t==Me&&e.errors)for(var i of(this.pool.writeVarint(e.errors.length),e.errors))this.writeValue(i)}writeRegExp(e){this.writeValue(e.source),this.writeValue(e.flags)}writeBinary(e,t){this.pool.writeVarint(0),this.pool.writeVarint(0)}writeSpecial(e,t){switch(t){case Oe:var i=e.description;this.writeValue(i);break;case Re:break;case Ke:i=Symbol.keyFor(e),this.writeValue(i||"");break;case qe:i=He.get(e),this.writeValue(i||"")}}writeExtension(e,t){}deserialize(e){if(this.buffer=new Uint8Array(e),this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset),this.pos=0,this.deserializeRefs=[],this.deserializeStrings=[],this.deserializeBuffers=[],1413632565!==this.readU32())throw new Error("Invalid TurboSerial data");if(5!==(e=this.readU8()))throw new Error("Unsupported version: "+e);return this.readValue()}readValue(){if(this.pos>=this.buffer.length)throw new Error("Unexpected end of buffer");var e=this.readU8();if(e==Pe||e==Fe){var t=this.readVarint();if(t>=this.deserializeRefs.length)throw new Error("Invalid reference: "+t);return this.deserializeRefs[t]}if(e==N){if((t=this.readVarint())>=this.deserializeStrings.length)throw new Error("Invalid string reference: "+t);return this.deserializeStrings[t]}if(e==ge){if((t=this.readVarint())>=this.deserializeBuffers.length)throw new Error("Invalid buffer reference: "+t);return this.deserializeBuffers[t]}let i,g=!1;switch(t=e&r){case c:case h:case u:g=!0}if(g){switch(t){case h:i=[];break;case u:e==be?i=new Map:e==Ae&&(i=new Set);break;case c:i={}}switch(i&&this.deserializeRefs.push(i),t){case h:this.fillArray(i,e);break;case c:this.fillObject(i,e);break;case u:this.fillCollection(i,e)}}else{switch(t){case s:i=this.readPrimitive(e);break;case a:i=this.readNumber(e);break;case n:i=this.readBigInt(e);break;case o:i=this.readString(e);break;case l:i=this.readTypedArray(e);break;case d:i=this.readArrayBuffer(e);break;case _:i=this.readDate(e);break;case f:i=this.readError(e);break;case p:i=this.readRegExp();break;case y:i=this.readBinary(e);break;case w:i=this.readSpecial(e);break;case m:i=this.readExtension(e);break;default:throw new Error("Unknown type: 0x"+e.toString(16))}"object"!=typeof i||null==i||g||this.deserializeRefs.push(i)}return i}fillArray(e,t){switch(t){case H:break;case G:var i=this.readVarint();for(let t=0;t<i;t++)e[t]=this.readValue();break;case W:var r=this.readVarint(),s=this.readVarint();e.length=r;for(let t=0;t<s;t++)e[this.readVarint()]=this.readValue();break;case Q:case J:case Y:case X:case Z:r=this.readPackedArrayData(t),e.push(...r)}}fillObject(e,t){if(t!=ee)switch(t){case ie:case te:this.fillSimpleObject(e);break;case se:this.fillObjectWithDescriptors(e);break;case ae:this.fillObjectWithMethods(e);break;case re:this.fillConstructorObject(e)}}fillSimpleObject(e){var t=this.readVarint();for(let i=0;i<t;i++)e[this.readValue()]=this.readValue()}fillObjectWithDescriptors(e){var t=this.readVarint();for(let n=0;n<t;n++){var i=this.readValue(),r={enumerable:!!(1&(a=this.readU8())),writable:!!(2&a),configurable:!!(4&a)},s=!!(8&a),a=!!(16&a);s||a?(s&&(r.get=this.readValue()),a&&(r.set=this.readValue())):r.value=this.readValue(),Object.defineProperty(e,i,r)}}fillObjectWithMethods(e){var t=this.readVarint();for(let s=0;s<t;s++){var i=this.readValue();if(this.readU8())if(this.options.allowFunction&&this.options.serializeFunctions){var r=this.readValue();this.readValue();try{e[i]=new Function("return "+r)()}catch(t){e[i]=function(){throw new Error("Function deserialization failed")}}}else this.options.serializeFunctions?(this.readValue(),this.readValue(),e[i]=void 0):this.readU8()===$e&&(e[i]=this.options.allowFunction?function(){throw new Error("Function not serialized")}:void 0);else e[i]=this.readValue()}}fillConstructorObject(e){var t=this.readValue(),i=this.readVarint();for(let t=0;t<i;t++)e[this.readValue()]=this.readValue();Object.defineProperty(e,"__constructorName",{value:t,enumerable:!1,writable:!1,configurable:!0})}fillCollection(e,t){var i=this.readVarint();switch(t){case be:for(let t=0;t<i;t++){var r=this.readValue(),s=this.readValue();e.set(r,s)}break;case Ae:for(let t=0;t<i;t++)e.add(this.readValue())}}readPrimitive(e){switch(e){case g:return null;case v:return;case b:return!1;case A:return!0;default:throw new Error("Unknown primitive: 0x"+e.toString(16))}}readNumber(e){switch(e){case x:return this.view.getInt8(this.pos++);case S:return this.readI16();case k:return this.readI32();case z:return this.readU32();case I:return this.readF32();case E:return this.readF64();case U:return NaN;case C:return 1/0;case D:return-1/0;case M:return-0;case T:var t=this.readVarint();return this.readU8()?-t:t;default:throw new Error("Unknown number type: 0x"+e.toString(16))}}readBigInt(e){switch(e){case B:case V:return this.readBigInt64();case L:case P:return this.readLargeBigInt(e==P);default:throw new Error("Unknown BigInt type: 0x"+e.toString(16))}}readLargeBigInt(e){var t=this.readVarint(),i=(this.ensureBytes(t),this.buffer.subarray(this.pos,this.pos+t));this.pos+=t;let r="";for(let e=i.length-1;0<=e;e--)r+=i[e].toString(16).padStart(2,"0");return t=BigInt("0x"+r),e?-t:t}readString(e){if(e==F)return"";let t,i;switch(e){case O:case K:case R:case $:t=this.readU8();break;default:t=this.readVarint()}if(this.ensureBytes(t),e==O||e==K||e==q){i="";for(let e=0;e<t;e++)i+=String.fromCharCode(this.readU8())}else e=this.buffer.subarray(this.pos,this.pos+t),this.pos+=t,i=this.decoder.decode(e);return this.deserializeStrings.push(i),i}readPackedArrayData(e){var t=this.readVarint(),i=new Array(t),r=Ne[e];if(!r)throw new Error("Unknown packed array type: 0x"+e.toString(16));switch(this.alignPos(Math.min(r,8)),this.ensureBytes(t*r),e){case Q:for(let e=0;e<t;e++)i[e]=this.view.getInt8(this.pos++);break;case J:for(let e=0;e<t;e++)i[e]=this.view.getInt16(this.pos,!0),this.pos+=2;break;case Y:for(let e=0;e<t;e++)i[e]=this.view.getInt32(this.pos,!0),this.pos+=4;break;case X:for(let e=0;e<t;e++)i[e]=this.view.getFloat32(this.pos,!0),this.pos+=4;break;case Z:for(let e=0;e<t;e++)i[e]=this.view.getFloat64(this.pos,!0),this.pos+=8}return i}readTypedArray(e){if(this.readU8()){var t=this.readVarint(),i=this.readVarint(),r=this.readVarint();if(t>=this.deserializeBuffers.length)throw new Error("Invalid buffer reference: "+t);return t=this.deserializeBuffers[t],this.createTypedArray(e,t,i,r)}this.readVarint();var s=this.readVarint();t=Ne[e]||1;if(e!=pe&&e!=ye)return i=s*t,this.alignPos(t),this.ensureBytes(i),r=this.buffer.subarray(this.pos,this.pos+i),this.pos+=i,t=new ArrayBuffer(i),new Uint8Array(t).set(r),this.deserializeBuffers.push(t),this.createTypedArray(e,t,0,s);this.alignPos(8);var a=[];for(let e=0;e<s;e++)a.push(this.readBigInt64());return new(e==pe?BigInt64Array:BigUint64Array)(a)}createTypedArray(e,t,i,r){var s={[ne]:Uint8Array,[oe]:Int8Array,[he]:Uint8ClampedArray,[ce]:Uint16Array,[le]:Int16Array,[de]:Uint32Array,[ue]:Int32Array,[_e]:Float32Array,[fe]:Float64Array,[pe]:BigInt64Array,[ye]:BigUint64Array,[we]:DataView}[e];if(s)return new s(t,i,r);throw new Error("Unknown typed array type: 0x"+e.toString(16))}readArrayBuffer(e){var t=this.readVarint(),i=(this.ensureBytes(t),this.buffer.subarray(this.pos,this.pos+t));this.pos+=t,t=i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength);return this.deserializeBuffers.push(t),t}readDate(e){switch(e){case xe:return new Date(this.readF64());case Se:return new Date(NaN);default:throw new Error("Unknown date type: 0x"+e.toString(16))}}readError(e){var t=this.readValue(),i=this.readValue();let r;var s={[ke]:Error,[ze]:EvalError,[Ie]:RangeError,[Ee]:ReferenceError,[Ue]:SyntaxError,[Ce]:TypeError,[De]:URIError}[e]||Error;if(e==Me){var a=this.readVarint(),n=[];for(let e=0;e<a;e++)n.push(this.readValue());r=new AggregateError(n,t)}else r=new s(t);return i&&(r.stack=i),r}readRegExp(){var e=this.readValue(),t=this.readValue();return new RegExp(e,t)}readBinary(e){return{_type:"Binary",size:this.readVarint(),typeStr:this.readVarint()}}readSpecial(e){switch(e){case Oe:var t=this.readValue();return Symbol(t);case Re:return Symbol();case Ke:return t=this.readValue(),Symbol.for(t);case qe:return t=this.readValue(),Ge.get(t)||Symbol(t);default:throw new Error("Unknown special type: 0x"+e.toString(16))}}readExtension(e){if(e!==$e)throw new Error("Unknown extension type: 0x"+e.toString(16));return this.options.allowFunction?function(){throw new Error("Function not serialized")}:void 0}readU8(){return this.ensureBytes(1),this.buffer[this.pos++]}readI16(){this.alignPos(2),this.ensureBytes(2);var e=this.view.getInt16(this.pos,!0);return this.pos+=2,e}readU16(){this.alignPos(2),this.ensureBytes(2);var e=this.view.getUint16(this.pos,!0);return this.pos+=2,e}readI32(){this.alignPos(4),this.ensureBytes(4);var e=this.view.getInt32(this.pos,!0);return this.pos+=4,e}readU32(){this.alignPos(4),this.ensureBytes(4);var e=this.view.getUint32(this.pos,!0);return this.pos+=4,e}readF32(){this.alignPos(4),this.ensureBytes(4);var e=this.view.getFloat32(this.pos,!0);return this.pos+=4,e}readF64(){this.alignPos(8),this.ensureBytes(8);var e=this.view.getFloat64(this.pos,!0);return this.pos+=8,e}readBigInt64(){this.alignPos(8),this.ensureBytes(8);var e=this.view.getBigInt64(this.pos,!0);return this.pos+=8,e}readVarint(){let e=0,t=0;for(var i;this.ensureBytes(1),e|=(127&(i=this.buffer[this.pos++]))<<t,t+=7,128&i;);return e>>>0}alignPos(e){e=e-1|0,this.pos=(this.pos+e&~e)>>>0}ensureBytes(e){if(this.pos+e>this.buffer.length)throw new Error(`Buffer underflow: need ${e}, available `+(this.buffer.length-this.pos))}}(e),this._base64=new it.a}get performanceMonitor(){return this._performanceMonitor}get serializer(){return this._serializer}get base64(){return this._base64}async getDatabase(e,t={}){var i;return this._databases.has(e)||(await(i=new Vt(e,this._performanceMonitor,this._serializer,this._base64)).init(t),this._databases.set(e,i)),this._databases.get(e)}async getSecureDatabase(e,t,i=null,r={}){return this.getDatabase(e,{pin:t,salt:i,encryptionConfig:r})}async dropDatabase(e){var t;this._databases.has(e)&&(await(t=this._databases.get(e)).clearAll(),t.destroy(),this._databases.delete(e)),["metadata","settings","version","encryption"].forEach(t=>{localStorage.removeItem(`lacertadb_${e}_`+t)}),new st(e,this._serializer,this._base64).clear();var i=[];for(let t=0;t<localStorage.length;t++){var r=localStorage.key(t);r&&r.startsWith(`lacertadb_${e}_`)&&i.push(r)}i.forEach(e=>localStorage.removeItem(e))}listDatabases(){var e=new Set;for(let i=0;i<localStorage.length;i++){var t=localStorage.key(i);t&&t.startsWith("lacertadb_")&&(t=t.match(/^lacertadb_([^_]+)_(metadata|settings|version|encryption|quickstore)$/))&&e.add(t[1])}return[...e]}async createBackup(e=null){var t,i={version:"0.11.1",timestamp:Date.now(),databases:{}};for(t of this.listDatabases()){var r=await(await this.getDatabase(t)).export("json");r=this._base64.decode(r);i.databases[t]=this._serializer.deserialize(r)}var s=this._serializer.serialize(i);return e?(e=await(new pt).encrypt(s,e),this._base64.encode(e)):this._base64.encode(s)}async restoreBackup(e,t=null){let i;try{var r,s=this._base64.decode(e);i=t?(r=await(new pt).decrypt(s,t),this._serializer.deserialize(r)):this._serializer.deserialize(s)}catch(e){throw new ht("Failed to parse backup data","BACKUP_PARSE_FAILED",e)}var a,n,o={databases:0,collections:0,documents:0};for([a,n]of Object.entries(i.databases)){var h=await this.getDatabase(a),c=this._base64.encode(this._serializer.serialize(n));h=await h.import(c);o.databases++,o.collections+=h.collections,o.documents+=h.documents}return o}close(){nt.closeAll()}destroy(){for(var e of this._databases.values())e.destroy();this._databases.clear(),nt.closeAll()}}},function(e,t,i){i.r(t),t=i(1),"undefined"!=typeof window?window.LACERTA=t:self.LACERTA=t}]);
|
|
9
|
+
"undefined"==typeof window||window.requestIdleCallback||(window.requestIdleCallback=function(e){return setTimeout(e,0)},window.cancelIdleCallback=clearTimeout);let st={compression:!1,preservePropertyDescriptors:!1,deduplication:!1,simdOptimization:!0,detectCircular:!1,shareArrayBuffers:!1,allowFunction:!1,serializeFunctions:!1,memoryPoolSize:65536};class at{constructor(e,t,i){this._dbName=e,this._serializer=t,this._base64=i,this._keyPrefix=`lacertadb_${e}_quickstore_`,this._indexKey=this._keyPrefix+"index",this._docs=new Map,this._hydrated=!1,this._dirtyDocs=new Set,this._dirtyIndex=!1,this._saveTimer=null,this._flushHandler=()=>this._flushSync(),"undefined"!=typeof window&&window.addEventListener("beforeunload",this._flushHandler)}destroy(){this._flushSync(),"undefined"!=typeof window&&this._flushHandler&&(window.removeEventListener("beforeunload",this._flushHandler),this._flushHandler=null),this._saveTimer&&("undefined"!=typeof window&&window.cancelIdleCallback?window.cancelIdleCallback(this._saveTimer):clearTimeout(this._saveTimer),this._saveTimer=null)}_ensureHydrated(){if(!this._hydrated){var e=localStorage.getItem(this._indexKey);if(e)try{var t,i=this._base64.decode(e);for(t of this._serializer.deserialize(i)){var r=this._keyPrefix+"data_"+t,s=localStorage.getItem(r);if(s)try{var a=this._base64.decode(s);this._docs.set(t,this._serializer.deserialize(a))}catch(e){}}}catch(e){console.warn("QuickStore index corrupted, resetting.",e)}this._hydrated=!0}}_scheduleSave(){var e;this._saveTimer||(e=()=>{this._saveTimer=null,this._persistDirty()},"undefined"!=typeof window&&window.requestIdleCallback?this._saveTimer=window.requestIdleCallback(e):this._saveTimer=setTimeout(e,200))}_persistDirty(){try{for(var e of this._dirtyDocs){var t,i,r=this._keyPrefix+"data_"+e,s=this._docs.get(e);void 0!==s?(t=this._serializer.serialize(s),i=this._base64.encode(t),localStorage.setItem(r,i)):localStorage.removeItem(r)}var a,n,o;this._dirtyDocs.clear(),this._dirtyIndex&&(a=Array.from(this._docs.keys()),n=this._serializer.serialize(a),o=this._base64.encode(n),localStorage.setItem(this._indexKey,o),this._dirtyIndex=!1)}catch(e){"QuotaExceededError"===e.name?(console.error("CRITICAL: QuickStore save failed — localStorage quota exceeded"),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("lacertadb:quotaexceeded",{detail:{source:"quickstore",db:this._dbName}}))):console.error("QuickStore save failed:",e)}}_flushSync(){0===this._dirtyDocs.size&&!this._dirtyIndex||this._persistDirty()}add(e,t){this._ensureHydrated();var i=!this._docs.has(e);return this._docs.set(e,t),this._dirtyDocs.add(e),i&&(this._dirtyIndex=!0),this._scheduleSave(),!0}get(e){return this._ensureHydrated(),void 0!==(e=this._docs.get(e))?e:null}update(e,t){return this.add(e,t)}delete(e){this._ensureHydrated(),this._docs.has(e)&&(this._docs.delete(e),this._dirtyDocs.add(e),this._dirtyIndex=!0,this._scheduleSave())}getAll(){this._ensureHydrated();var e,t,i=[];for([e,t]of this._docs)i.push({_id:e,...t});return i}query(e={}){return 0===Object.keys(e).length?this.getAll():this.getAll().filter(t=>Ct.evaluate(t,e))}clear(){for(var e of(this._ensureHydrated(),this._docs.keys()))localStorage.removeItem(this._keyPrefix+"data_"+e);localStorage.removeItem(this._indexKey),this._docs.clear(),this._dirtyDocs.clear(),this._dirtyIndex=!1,this._saveTimer&&("undefined"!=typeof window&&window.cancelIdleCallback?window.cancelIdleCallback(this._saveTimer):clearTimeout(this._saveTimer),this._saveTimer=null)}get size(){return this._ensureHydrated(),this._docs.size}}class nt{constructor(){this._connections=new Map,this._refCounts=new Map}async getConnection(e,t=1,i){let r=e+"_v"+t;var s;return this._connections.has(r)?(this._refCounts.set(r,(this._refCounts.get(r)||0)+1),this._connections.get(r)):((s=await new Promise((r,s)=>{let a=indexedDB.open(e,t);a.onerror=()=>s(new ht("Failed to open database","DATABASE_OPEN_FAILED",a.error)),a.onsuccess=()=>r(a.result),a.onupgradeneeded=e=>{i&&i(e.target.result,e.oldVersion,e.newVersion)}})).onclose=()=>{this._connections.delete(r),this._refCounts.delete(r)},this._connections.set(r,s),this._refCounts.set(r,1),s)}releaseConnection(e,t=1){var i;e=e+"_v"+t;(t=this._refCounts.get(e)||0)<=1?(i=this._connections.get(e))&&(i.close(),this._connections.delete(e),this._refCounts.delete(e)):this._refCounts.set(e,t-1)}closeAll(){for(var e of this._connections.values())e.close();this._connections.clear(),this._refCounts.clear()}}new nt;class ot{constructor(){this._queue=[],this._locked=!1}acquire(){return new Promise(e=>{this._queue.push(e),this._dispatch()})}release(){this._locked=!1,this._dispatch()}async runExclusive(e){var t=await this.acquire();try{return await e()}finally{t()}}_dispatch(){this._locked||0===this._queue.length||(this._locked=!0,this._queue.shift()(()=>this.release()))}}class ht extends Error{constructor(e,t,i){super(e),this.name="LacertaDBError",this.code=t,this.originalError=i||null,this._ts=Date.now()}get timestamp(){return new Date(this._ts).toISOString()}}class lt{constructor(e=100,t=null){this._maxSize=e,this._ttl=t,this._cache=new Map}get(e){var t=this._cache.get(e);return t?this._ttl&&Date.now()-t.ts>this._ttl?(this._cache.delete(e),null):(this._cache.delete(e),this._cache.set(e,t),t.value):null}set(e,t){this._cache.has(e)?this._cache.delete(e):this._cache.size>=this._maxSize&&this._cache.delete(this._cache.keys().next().value),this._cache.set(e,{value:t,ts:Date.now()})}delete(e){return this._cache.delete(e)}clear(){this._cache.clear()}has(e){return null!==this.get(e)}get size(){return this._cache.size}}class ct{constructor(e=100,t=null){this._maxSize=e,this._ttl=t,this._cache=new Map,this._frequencies=new Map,this._timestamps=new Map,this._buckets=new Map,this._minFreq=0}get(e){if(!this._cache.has(e))return null;if(this._ttl){var t=this._timestamps.get(e);if(Date.now()-t>this._ttl)return this.delete(e),null}var i=(t=this._frequencies.get(e)||1)+1,r=(this._frequencies.set(e,i),this._buckets.get(t));return r&&(r.delete(e),0===r.size)&&(this._buckets.delete(t),this._minFreq===t)&&(this._minFreq=i),this._buckets.has(i)||this._buckets.set(i,new Set),this._buckets.get(i).add(e),this._cache.get(e)}set(e,t){var i;this._maxSize<=0||(this._cache.has(e)?(this._cache.set(e,t),this.get(e)):(this._cache.size>=this._maxSize&&(i=this._buckets.get(this._minFreq))&&0<i.size&&(i=i.values().next().value,this.delete(i)),this._cache.set(e,t),this._frequencies.set(e,1),this._timestamps.set(e,Date.now()),this._buckets.has(1)||this._buckets.set(1,new Set),this._buckets.get(1).add(e),this._minFreq=1))}delete(e){var t,i;return!!this._cache.has(e)&&(t=this._frequencies.get(e)||1,(i=this._buckets.get(t))&&(i.delete(e),0===i.size)&&this._buckets.delete(t),this._frequencies.delete(e),this._timestamps.delete(e),this._cache.delete(e))}clear(){this._cache.clear(),this._frequencies.clear(),this._timestamps.clear(),this._buckets.clear(),this._minFreq=0}has(e){return null!==this.get(e)}get size(){return this._cache.size}}class dt{constructor(e=6e4){this._ttl=e,this._cache=new Map,this._sweepTimer=null,this._sweepInterval=Math.min(e,3e4),"undefined"!=typeof globalThis&&(this._sweepTimer=setInterval(()=>this._sweep(),this._sweepInterval))}get(e){var t=this._cache.get(e);return t?Date.now()-t.ts>this._ttl?(this._cache.delete(e),null):t.value:null}set(e,t){this._cache.set(e,{value:t,ts:Date.now()})}delete(e){return this._cache.delete(e)}clear(){this._cache.clear()}has(e){return null!==this.get(e)}get size(){return this._cache.size}_sweep(){var e,t,i=Date.now();for([e,t]of this._cache)i-t.ts>this._ttl&&this._cache.delete(e)}destroy(){this._sweepTimer&&(clearInterval(this._sweepTimer),this._sweepTimer=null),this._cache.clear()}}class ut{constructor(e={}){this._config=e,this._cache=this._createCache()}get cache(){return this._cache||(this._cache=this._createCache()),this._cache}_createCache(){var e=this._config.type||"lru",t=this._config.maxSize||100,i=this._config.ttl;return"none"===e||!1===this._config.enabled?null:"ttl"===e?new dt(i):new("lfu"===e?ct:lt)(t,i)}get(e){return this.cache?this.cache.get(e):null}set(e,t){this.cache&&this.cache.set(e,t)}delete(e){this.cache&&this.cache.delete(e)}clear(){this.cache&&this.cache.clear()}updateStrategy(e){this._config={...this._config,...e},this._cache=null}destroy(){this._cache&&this._cache.destroy?this._cache.destroy():this._cache&&this._cache.clear&&this._cache.clear(),this._cache=null}}class _t{async compress(e){if(!(e instanceof Uint8Array))throw new TypeError("Input must be Uint8Array");try{var t=new Response(e).body.pipeThrough(new CompressionStream("deflate")),i=await new Response(t).arrayBuffer(),r=new Uint8Array(i.byteLength+1);return r[0]=1,r.set(new Uint8Array(i),1),r}catch(i){return(t=new Uint8Array(e.byteLength+1))[0]=0,t.set(e,1),t}}async decompress(e){if(!(e instanceof Uint8Array))throw new TypeError("Input must be Uint8Array");if(0===e.length)return e;var t=e[0],i=e.slice(1);if(0===t)return i;if(1!==t)return e;try{var r=new Response(i).body.pipeThrough(new DecompressionStream("deflate")),s=await new Response(r).arrayBuffer();return new Uint8Array(s)}catch(t){return console.error("Decompression failed",t),e}}compressSync(e){if(e instanceof Uint8Array)return e;throw new TypeError("Input must be Uint8Array")}decompressSync(e){if(e instanceof Uint8Array)return e;throw new TypeError("Input must be Uint8Array")}}let ft=new _t;class pt{async encrypt(e,t){var i=new TextEncoder,r=crypto.getRandomValues(new Uint8Array(16)),s=crypto.getRandomValues(new Uint8Array(12));i=i.encode(t),t=await crypto.subtle.importKey("raw",i,"PBKDF2",!1,["deriveBits","deriveKey"]),i=await crypto.subtle.deriveKey({name:"PBKDF2",salt:r,iterations:6e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"]),t=await crypto.subtle.encrypt({name:"AES-GCM",iv:s},i,e);return(i=new Uint8Array(r.length+s.length+t.byteLength)).set(r,0),i.set(s,r.length),i.set(new Uint8Array(t),r.length+s.length),i}async decrypt(e,t){var i=new TextEncoder,r=e.slice(0,16),s=e.slice(16,28);e=e.slice(28),i=i.encode(t),t=await crypto.subtle.importKey("raw",i,"PBKDF2",!1,["deriveBits","deriveKey"]),i=await crypto.subtle.deriveKey({name:"PBKDF2",salt:r,iterations:6e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"]),r=await crypto.subtle.decrypt({name:"AES-GCM",iv:s},i,e);return new Uint8Array(r)}}class yt{constructor(e={},t,i){this._iterations=e.iterations||6e5,this._hashAlgorithm=e.hashAlgorithm||"SHA-256",this._keyLength=e.keyLength||256,this._saltLength=e.saltLength||32,this._initialized=!1,this._serializer=t,this._base64=i,this._masterKey=null,this._hmacKey=null,this._salt=null,this._wrappedKeyBlob=null}get initialized(){return this._initialized}async initialize(e,t=null){if(this._initialized)throw new Error("Database encryption already initialized");if(e=(new TextEncoder).encode(e),t){this._salt=this._base64.decode(t.salt);var i=await this._deriveKEK(e,this._salt),r=(t=this._base64.decode(t.wrappedKey)).slice(0,12);t=t.slice(12);try{var s=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},i,t);await this._importMasterKeys(s)}catch(e){throw new Error("Invalid PIN or corrupted key data")}}else this._salt=crypto.getRandomValues(new Uint8Array(this._saltLength)),r=await this._deriveKEK(e,this._salt),i=crypto.getRandomValues(new Uint8Array(64)),await this._importMasterKeys(i.buffer),t=crypto.getRandomValues(new Uint8Array(12)),s=await crypto.subtle.encrypt({name:"AES-GCM",iv:t},r,i),(e=new Uint8Array(12+s.byteLength)).set(t,0),e.set(new Uint8Array(s),12),this._wrappedKeyBlob=this._base64.encode(e);return this._initialized=!0,this.exportMetadata()}async _deriveKEK(e,t){return e=await crypto.subtle.importKey("raw",e,"PBKDF2",!1,["deriveBits","deriveKey"]),crypto.subtle.deriveKey({name:"PBKDF2",salt:t,iterations:this._iterations,hash:this._hashAlgorithm},e,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}async _importMasterKeys(e){var t=(e=new Uint8Array(e)).slice(0,32);e=e.slice(32,64);this._masterKey=await crypto.subtle.importKey("raw",t,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),this._hmacKey=await crypto.subtle.importKey("raw",e,{name:"HMAC",hash:"SHA-256"},!0,["sign","verify"])}async _exportMasterKeys(){var e=await crypto.subtle.exportKey("raw",this._masterKey),t=await crypto.subtle.exportKey("raw",this._hmacKey),i=new Uint8Array(64);return i.set(new Uint8Array(e),0),i.set(new Uint8Array(t),32),i}async changePin(e,t){if(!this._initialized)throw new Error("Database encryption not initialized");e=await this._deriveKEK((new TextEncoder).encode(e),this._salt);var i=(r=this._base64.decode(this._wrappedKeyBlob)).slice(0,12),r=r.slice(12);try{await crypto.subtle.decrypt({name:"AES-GCM",iv:i},e,r)}catch(e){throw new Error("Invalid old PIN")}return i=crypto.getRandomValues(new Uint8Array(this._saltLength)),e=await this._deriveKEK((new TextEncoder).encode(t),i),r=await this._exportMasterKeys(),t=crypto.getRandomValues(new Uint8Array(12)),e=await crypto.subtle.encrypt({name:"AES-GCM",iv:t},e,r),(r=new Uint8Array(12+e.byteLength)).set(t,0),r.set(new Uint8Array(e),12),this._salt=i,this._wrappedKeyBlob=this._base64.encode(r),this.exportMetadata()}async encrypt(e){if(!this._initialized)throw new Error("Database encryption not initialized");let t;t="string"==typeof e?(new TextEncoder).encode(e):e instanceof Uint8Array?e:this._serializer.serialize(e);e=crypto.getRandomValues(new Uint8Array(12));var i=await crypto.subtle.encrypt({name:"AES-GCM",iv:e},this._masterKey,t),r=((r=new Uint8Array(e.length+i.byteLength)).set(e,0),r.set(new Uint8Array(i),e.length),await crypto.subtle.sign("HMAC",this._hmacKey,r)),s=new Uint8Array(e.length+i.byteLength+32);return s.set(e,0),s.set(new Uint8Array(i),e.length),s.set(new Uint8Array(r),e.length+i.byteLength),s}async decrypt(e){if(!this._initialized)throw new Error("Database encryption not initialized");if(!(e instanceof Uint8Array))throw new TypeError("Encrypted data must be Uint8Array");var t=e.slice(0,12),i=e.slice(-32),r=(e=e.slice(12,-32),new Uint8Array(t.length+e.length));if(i=(r.set(t,0),r.set(e,t.length),await crypto.subtle.verify("HMAC",this._hmacKey,i,r)))return r=await crypto.subtle.decrypt({name:"AES-GCM",iv:t},this._masterKey,e),new Uint8Array(r);throw new Error("HMAC verification failed - data may be tampered")}async encryptPrivateKey(e,t=""){if(!this._initialized)throw new Error("Database encryption not initialized");t=(r=new TextEncoder).encode(t);let i;i="string"==typeof e?r.encode(e):e instanceof Uint8Array?e:this._serializer.serialize(e);var r=crypto.getRandomValues(new Uint8Array(12)),s=(e=await crypto.subtle.encrypt({name:"AES-GCM",iv:r,additionalData:t,tagLength:128},this._masterKey,i),new Uint32Array([t.length])),a=new Uint8Array(16+t.length+e.byteLength);return a.set(r,0),a.set(new Uint8Array(s.buffer),12),a.set(t,16),a.set(new Uint8Array(e),16+t.length),this._base64.encode(a)}async decryptPrivateKey(e,t=""){if(!this._initialized)throw new Error("Database encryption not initialized");var i=(e=this._base64.decode(e)).slice(0,12),r=e.slice(12,16),s=(r=new Uint32Array(r.buffer)[0],e.slice(16,16+r));e=e.slice(16+r),r=(new TextEncoder).encode(t);if(this._arrayEquals(s,r))return t=await crypto.subtle.decrypt({name:"AES-GCM",iv:i,additionalData:s,tagLength:128},this._masterKey,e),(new TextDecoder).decode(t);throw new Error("Additional authentication data mismatch")}static generateSecurePIN(e=6){for(var t=[],i=new Uint8Array(1);t.length<e;)crypto.getRandomValues(i),i[0]<250&&t.push((i[0]%10).toString());return t.join("")}destroy(){this._masterKey=null,this._hmacKey=null,this._initialized=!1}_arrayEquals(e,t){if(e.length!==t.length)return!1;let i=0;for(let r=0;r<e.length;r++)i|=e[r]^t[r];return 0===i}exportMetadata(){return{salt:this._base64.encode(this._salt),wrappedKey:this._wrappedKeyBlob,iterations:this._iterations,algorithm:"AES-GCM-256",kdf:"PBKDF2",hashAlgorithm:this._hashAlgorithm,keyLength:this._keyLength,saltLength:this._saltLength}}importMetadata(e){}}class wt{constructor(e,t=4){this.boundary=e,this.capacity=t,this.points=[],this.divided=!1}insert(e){return!!this._contains(this.boundary,e)&&(this.points.length<this.capacity?(this.points.push(e),!0):(this.divided||this._subdivide(),this.northeast.insert(e)||this.northwest.insert(e)||this.southeast.insert(e)||this.southwest.insert(e)))}query(e,t=[]){if(this._intersects(this.boundary,e)){for(var i of this.points)this._contains(e,i)&&t.push(i);this.divided&&(this.northwest.query(e,t),this.northeast.query(e,t),this.southwest.query(e,t),this.southeast.query(e,t))}return t}remove(e){this.points=this.points.filter(t=>t.data!==e),this.divided&&(this.northwest.remove(e),this.northeast.remove(e),this.southwest.remove(e),this.southeast.remove(e))}_subdivide(){var{x:e,y:t,w:i,h:r}=this.boundary,i=i/2,r=r/2;this.northeast=new wt({x:e+i,y:t-r,w:i,h:r},this.capacity),this.northwest=new wt({x:e-i,y:t-r,w:i,h:r},this.capacity),this.southeast=new wt({x:e+i,y:t+r,w:i,h:r},this.capacity),this.southwest=new wt({x:e-i,y:t+r,w:i,h:r},this.capacity),this.divided=!0}_contains(e,t){return t.x>=e.x-e.w&&t.x<=e.x+e.w&&t.y>=e.y-e.h&&t.y<=e.y+e.h}_intersects(e,t){return!(t.x-t.w>e.x+e.w||t.x+t.w<e.x-e.w||t.y-t.h>e.y+e.h||t.y+t.h<e.y-e.h)}}function mt(e,t){var i,r;return e===t?0:(i=typeof e)==(r=typeof t)?"number"==i?e<t?-1:1:"string"==i?e<t?-1:t<e?1:0:(e=String(e))<(t=String(t))?-1:t<e?1:0:i<r?-1:1}class gt{constructor(e,t){this.keys=new Array(2*e-1),this.values=new Array(2*e-1),this.children=new Array(2*e),this.n=0,this.leaf=t,this.order=e}search(e){let t=0;for(;t<this.n&&0<mt(e,this.keys[t]);)t++;return t<this.n&&0===mt(e,this.keys[t])?this.values[t]:!this.leaf&&this.children[t]?this.children[t].search(e):null}rangeSearch(e,t,i,r=!1,s=!1){let a=0;if(null!==e)for(;a<this.n&&mt(this.keys[a],e)<0;)a++;for(;a<this.n;a++){if(null!==t){var n=mt(this.keys[a],t);if(s?0<=n:0<n)return void(!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,r,s))}!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,r,s);n=null===e?1:mt(this.keys[a],e);var o=null===t?-1:mt(this.keys[a],t);(null===e||(r?0<n:0<=n))&&(null===t||(s?o<0:o<=0))&&this.values[a]&&this.values[a].forEach(e=>i.push(e))}!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,r,s)}insertNonFull(e,t){let i=this.n-1;if(this.leaf){for(;0<=i&&0<mt(this.keys[i],e);)this.keys[i+1]=this.keys[i],this.values[i+1]=this.values[i],i--;0<=i&&0===mt(this.keys[i],e)?(this.values[i]||(this.values[i]=new Set),this.values[i].add(t)):(this.keys[i+1]=e,this.values[i+1]=new Set([t]),this.n++)}else{for(;0<=i&&0<mt(this.keys[i],e);)i--;if(0<=i&&0===mt(this.keys[i],e))this.values[i]||(this.values[i]=new Set),this.values[i].add(t);else{if(i++,this.children[i]&&this.children[i].n===2*this.order-1){this.splitChild(i,this.children[i]);var r=mt(this.keys[i],e);if(0===r)return this.values[i]||(this.values[i]=new Set),void this.values[i].add(t);r<0&&i++}this.children[i]&&this.children[i].insertNonFull(e,t)}}}splitChild(e,t){var i=new gt(this.order,t.leaf);i.n=this.order-1;for(let e=0;e<this.order-1;e++)i.keys[e]=t.keys[e+this.order],i.values[e]=t.values[e+this.order];if(!t.leaf)for(let e=0;e<this.order;e++)i.children[e]=t.children[e+this.order];var r=t.keys[this.order-1],s=t.values[this.order-1];t.n=this.order-1;for(let e=this.order-1;e<2*this.order-1;e++)t.keys[e]=void 0,t.values[e]=void 0;if(!t.leaf)for(let e=this.order;e<2*this.order;e++)t.children[e]=void 0;for(let t=this.n;t>=e+1;t--)this.children[t+1]=this.children[t];this.children[e+1]=i;for(let t=this.n-1;t>=e;t--)this.keys[t+1]=this.keys[t],this.values[t+1]=this.values[t];this.keys[e]=r,this.values[e]=s,this.n++}_getPredecessor(e){let t=this.children[e];for(;!t.leaf;)t=t.children[t.n];return{key:t.keys[t.n-1],value:t.values[t.n-1]}}_getSuccessor(e){let t=this.children[e+1];for(;!t.leaf;)t=t.children[0];return{key:t.keys[0],value:t.values[0]}}_merge(e){var t=this.children[e],i=this.children[e+1],r=this.order;t.keys[r-1]=this.keys[e],t.values[r-1]=this.values[e];for(let e=0;e<i.n;e++)t.keys[r+e]=i.keys[e],t.values[r+e]=i.values[e];if(!t.leaf)for(let e=0;e<=i.n;e++)t.children[r+e]=i.children[e];t.n+=i.n+1;for(let t=e;t<this.n-1;t++)this.keys[t]=this.keys[t+1],this.values[t]=this.values[t+1];for(let t=e+1;t<this.n;t++)this.children[t]=this.children[t+1];this.keys[this.n-1]=void 0,this.values[this.n-1]=void 0,this.children[this.n]=void 0,this.n--}_borrowFromPrev(e){var t=this.children[e],i=this.children[e-1];for(let e=t.n-1;0<=e;e--)t.keys[e+1]=t.keys[e],t.values[e+1]=t.values[e];if(!t.leaf)for(let e=t.n;0<=e;e--)t.children[e+1]=t.children[e];t.keys[0]=this.keys[e-1],t.values[0]=this.values[e-1],t.leaf||(t.children[0]=i.children[i.n],i.children[i.n]=void 0),this.keys[e-1]=i.keys[i.n-1],this.values[e-1]=i.values[i.n-1],i.keys[i.n-1]=void 0,i.values[i.n-1]=void 0,t.n++,i.n--}_borrowFromNext(e){var t=this.children[e],i=this.children[e+1];t.keys[t.n]=this.keys[e],t.values[t.n]=this.values[e],t.leaf||(t.children[t.n+1]=i.children[0]),this.keys[e]=i.keys[0],this.values[e]=i.values[0];for(let e=0;e<i.n-1;e++)i.keys[e]=i.keys[e+1],i.values[e]=i.values[e+1];if(!i.leaf){for(let e=0;e<i.n;e++)i.children[e]=i.children[e+1];i.children[i.n]=void 0}i.keys[i.n-1]=void 0,i.values[i.n-1]=void 0,t.n++,i.n--}_fill(e){var t=this.order;0<e&&this.children[e-1]&&this.children[e-1].n>=t?this._borrowFromPrev(e):e<this.n&&this.children[e+1]&&this.children[e+1].n>=t?this._borrowFromNext(e):e<this.n?this._merge(e):this._merge(e-1)}_removeFromLeaf(e){for(let t=e;t<this.n-1;t++)this.keys[t]=this.keys[t+1],this.values[t]=this.values[t+1];this.keys[this.n-1]=void 0,this.values[this.n-1]=void 0,this.n--}_removeFromInternal(e){var t,i=this.order,r=this.keys[e];this.children[e]&&this.children[e].n>=i?(t=this._getPredecessor(e),this.keys[e]=t.key,this.values[e]=t.value,this.children[e]._remove(t.key,null,!0)):this.children[e+1]&&this.children[e+1].n>=i?(t=this._getSuccessor(e),this.keys[e]=t.key,this.values[e]=t.value,this.children[e+1]._remove(t.key,null,!0)):(this._merge(e),this.children[e]._remove(r,null,!0))}_remove(e,t,i){let r=0;for(;r<this.n&&0<mt(e,this.keys[r]);)r++;var s;if(r<this.n&&0===mt(e,this.keys[r])){let e=i;return!e&&this.values[r]&&(this.values[r].delete(t),e=0===this.values[r].size),!!e&&(this.leaf?this._removeFromLeaf(r):this._removeFromInternal(r),!0)}return!this.leaf&&(s=r===this.n,this.children[r]&&this.children[r].n<this.order&&this._fill(r),s&&r>this.n?!!this.children[r-1]&&this.children[r-1]._remove(e,t,i):!!this.children[r]&&this.children[r]._remove(e,t,i))}remove(e,t){return this._remove(e,t,!1)}removeKey(e){return this._remove(e,null,!0)}verify(){var e,t=[];for(let e=0;e<this.n;e++)null==this.keys[e]&&t.push(`Invalid key (${this.keys[e]}) at index `+e);for(let e=1;e<this.n;e++)mt(this.keys[e],this.keys[e-1])<=0&&t.push("Key order violation at index "+e);if(!this.leaf)for(let i=0;i<=this.n;i++)this.children[i]&&(e=this.children[i].verify(),t.push(...e));return t}}class vt{constructor(e=4){this._root=null,this._order=e,this._size=0}insert(e,t){if(!(null==e||"number"==typeof e&&isNaN(e))){if(this._root){var i=this._root.search(e);if(i&&i.has(t))return}if(this._root)if(this._root.n===2*this._order-1){(i=new gt(this._order,!1)).children[0]=this._root,i.splitChild(0,this._root);let s=0;var r=mt(i.keys[0],e);0===r?(i.values[0]||(i.values[0]=new Set),i.values[0].add(t)):(r<0&&s++,i.children[s].insertNonFull(e,t)),this._root=i}else this._root.insertNonFull(e,t);else this._root=new gt(this._order,!0),this._root.keys[0]=e,this._root.values[0]=new Set([t]),this._root.n=1;this._size++}}find(e){return this._root&&(e=this._root.search(e))?Array.from(e):[]}contains(e){return!!this._root&&null!==this._root.search(e)}range(e,t,i=!1,r=!1){return this._root?(this._root.rangeSearch(e,t,e=[],i,r),e):[]}rangeFrom(e,t=!1){return this._root?(this._root.rangeSearch(e,null,e=[],t,!1),e):[]}rangeTo(e,t=!1){return this._root?(this._root.rangeSearch(null,e,e=[],!1,t),e):[]}remove(e,t){var i;this._root&&(i=this._root.search(e))&&i.has(t)&&(this._root.remove(e,t),0===this._root.n&&!this._root.leaf&&this._root.children[0]&&(this._root=this._root.children[0]),this._size--)}verify(){var e;return this._root?(0<(e=this._root.verify()).length&&console.warn("BTree index issues detected (rebuild required):",e),{healthy:0===e.length,issues:e,requiresRebuild:0<e.length}):{healthy:!0,issues:[]}}clear(){this._root=null,this._size=0}get size(){return this._size}toSortedEntries(){var e;return this._root?(this._collectInOrder(this._root,e=[]),e):[]}_collectInOrder(e,t){for(let i=0;i<e.n;i++)!e.leaf&&e.children[i]&&this._collectInOrder(e.children[i],t),e.values[i]&&0<e.values[i].size&&t.push([e.keys[i],Array.from(e.values[i])]);!e.leaf&&e.children[e.n]&&this._collectInOrder(e.children[e.n],t)}static fromSortedEntries(e,t=4){var i=new vt(t);for(let t=0;t<e.length;t++){var[r,s]=e[t];if(null!=r)for(let e=0;e<s.length;e++)i.insert(r,s[e])}return i}}class bt{constructor(){this._invertedIndex=new Map,this._docTokens=new Map,this._segmenter="undefined"!=typeof Intl&&Intl.Segmenter?new Intl.Segmenter(void 0,{granularity:"word"}):null}addDocument(e,t){if("string"==typeof e){var i;e=this._tokenize(e);for(i of(this._docTokens.set(t,new Set(e)),e))this._invertedIndex.has(i)||this._invertedIndex.set(i,new Set),this._invertedIndex.get(i).add(t)}}removeDocument(e){var t=this._docTokens.get(e);if(t){for(var i of t){var r=this._invertedIndex.get(i);r&&(r.delete(e),0===r.size)&&this._invertedIndex.delete(i)}this._docTokens.delete(e)}}updateDocument(e,t){this.removeDocument(e),this.addDocument(t,e)}search(e){var t;if(0===(e=this._tokenize(e)).length)return[];let i=null;for(t of e){let e=this._invertedIndex.get(t);if(!e||0===e.size)return[];i=null===i?new Set(e):new Set([...i].filter(t=>e.has(t)))}return i?Array.from(i):[]}_tokenize(e){if(this._segmenter){var t,i=[];for(t of this._segmenter.segment(e.toLowerCase()))t.isWordLike&&i.push(t.segment);return i.filter(e=>1<e.length)}return e.toLowerCase().replace(/[^\w\s]/g," ").split(/\s+/).filter(e=>1<e.length)}get size(){return this._docTokens.size}}class St{constructor(){this._tree=new wt({x:0,y:0,w:180,h:90}),this._size=0}addPoint(e,t){e&&"number"==typeof e.lat&&"number"==typeof e.lng&&(this._tree.insert({x:e.lng,y:e.lat,data:t}),this._size++)}removePoint(e){this._tree.remove(e),0<this._size&&this._size--}updatePoint(e,t){this.removePoint(e),this.addPoint(t,e)}findNear(e,t){var i,r=t/111,s=(r={x:e.lng,y:e.lat,w:r,h:r},[]);for(i of this._tree.query(r)){var a=this._haversine(e,{lat:i.y,lng:i.x});a<=t&&s.push({docId:i.data,distance:a})}return s.sort((e,t)=>e.distance-t.distance).map(e=>e.docId)}findWithin(e){var t=(e.maxLng-e.minLng)/2,i=(e.maxLat-e.minLat)/2;return this._tree.query({x:e.minLng+t,y:e.minLat+i,w:t,h:i}).map(e=>e.data)}_haversine(e,t){var i=this._toRad(t.lat-e.lat),r=this._toRad(t.lng-e.lng);i=Math.sin(i/2)*Math.sin(i/2)+Math.cos(this._toRad(e.lat))*Math.cos(this._toRad(t.lat))*Math.sin(r/2)*Math.sin(r/2);return 2*Math.atan2(Math.sqrt(i),Math.sqrt(1-i))*6371}_toRad(e){return e*(Math.PI/180)}get size(){return this._size}}class At{constructor(e){this._collection=e,this._serializer=e.database._serializer,this._base64=e.database._base64,this._indexes=new Map,this._indexData=new Map,this._indexQueue=[],this._processing=!1,this._dirtyIndexes=new Set,this._persistTimer=null,this._persistDelay=2e3}get indexes(){return this._indexes}static get IDX_PREFIX(){return"__lacerta_idx_"}async createIndex(e,t={}){var i=t.name||e;if(this._indexes.has(i))throw new Error(`Index '${i}' already exists`);return e={fieldPath:e,unique:t.unique||!1,sparse:t.sparse||!1,type:t.type||"btree",hashed:t.hashed||!1,collation:t.collation||null,createdAt:Date.now()},this._indexes.set(i,e),await this.rebuildIndex(i),this._saveIndexMetadata(),i}async rebuildIndex(e){var t=this._indexes.get(e);if(!t)throw new Error(`Index '${e}' not found`);var i=this._createIndexStructure(t.type);this._indexData.set(e,i);let r=null;for(;;){var s,a,n=await this._collection._indexedDB.getBatch(this._collection._db,this._collection._storeName,r,200);if(0===n.length)break;for(s of n)if("string"==typeof s._id&&s._id.startsWith(At.IDX_PREFIX))r=s._id;else{r=s._id;let e=s;s.packedData&&(await(a=new zt(s,{compressed:s._compressed,encrypted:s._encrypted},this._serializer)).unpack(this._collection.database.encryption),e=a.objectOutput());let n=this._getFieldValue(e,t.fieldPath);t.sparse&&null==n||t.unique&&i.has&&i.has(n)||(t.hashed&&"btree"===t.type&&(n=await this._hashVal(n)),this._addToIndex(i,n,e._id,t.type))}}await this._persistIndex(e)}async _restoreIndex(e){var t=this._indexes.get(e);if(!t||"btree"!==t.type)return!1;try{var i,r=""+At.IDX_PREFIX+e,s=await this._collection._indexedDB.get(this._collection._db,this._collection._storeName,r);return!!(s&&s._entries&&Array.isArray(s._entries))&&((i=vt.fromSortedEntries(s._entries,4)).verify().healthy?(this._indexData.set(e,i),!0):(console.warn(`[IndexManager] Persisted index '${e}' is corrupt, will rebuild`),!1))}catch(e){return!1}}async _persistIndex(e){var t=this._indexData.get(e);if(t&&t instanceof vt)try{var i={_id:""+At.IDX_PREFIX+e,_entries:t.toSortedEntries(),_persisted_at:Date.now(),_size:t.size};await this._collection._indexedDB.put(this._collection._db,this._collection._storeName,i)}catch(t){console.warn(`[IndexManager] Failed to persist index '${e}':`,t.message)}}_schedulePersist(e){this._dirtyIndexes.add(e),this._persistTimer||(this._persistTimer=setTimeout(async()=>{this._persistTimer=null;var e,t=Array.from(this._dirtyIndexes);for(e of(this._dirtyIndexes.clear(),t))await this._persistIndex(e)},this._persistDelay))}async flushPersistence(){this._persistTimer&&(clearTimeout(this._persistTimer),this._persistTimer=null);var e,t=Array.from(this._dirtyIndexes);for(e of(this._dirtyIndexes.clear(),t))await this._persistIndex(e)}_createIndexStructure(e){switch(e){case"btree":return new vt;case"hash":return new Map;case"text":return new bt;case"geo":return new St;default:return new Map}}_addToIndex(e,t,i,r){switch(r){case"btree":e.insert(t,i);break;case"hash":e.has(t)||e.set(t,new Set),e.get(t).add(i);break;case"text":e.addDocument(t,i);break;case"geo":e.addPoint(t,i)}}async _hashVal(e){return e=(new TextEncoder).encode(String(e)),e=await crypto.subtle.digest("SHA-256",e),this._base64.encode(new Uint8Array(e))}async updateIndexForDocument(e,t,i){for(var[r,s]of this._indexes){var a,n=this._indexData.get(r);if(n){let o=t?this._getFieldValue(t,s.fieldPath):void 0,h=i?this._getFieldValue(i,s.fieldPath):void 0;if(s.hashed&&(o=o&&await this._hashVal(o),h=h&&await this._hashVal(h)),o!==h){switch(s.type){case"btree":void 0!==o&&n.remove(o,e),void 0!==h&&n.insert(h,e);break;case"hash":void 0!==o&&(a=n.get(o))&&(a.delete(e),0===a.size)&&n.delete(o),void 0!==h&&(n.has(h)||n.set(h,new Set),n.get(h).add(e));break;case"text":(o||h)&&n.updateDocument(e,h||"");break;case"geo":o&&n.removePoint(e),h&&n.addPoint(h,e)}"btree"===s.type&&this._schedulePersist(r)}}}}async query(e,t){var i=this._indexes.get(e),r=this._indexData.get(e);if(i&&r)return i.hashed&&"object"!=typeof t&&(t=await this._hashVal(t)),this._queryIndex(r,t,i.type);throw new Error(`Index '${e}' not found`)}_queryIndex(e,t,i){switch(i){case"btree":return this._queryBTree(e,t);case"hash":return this._queryHash(e,t);case"text":return this._queryText(e,t);case"geo":return this._queryGeo(e,t);default:return[]}}_queryBTree(e,t){if("object"!=typeof t||null===t)return e.find(t);let i=new Set;void 0!==t.$eq&&e.find(t.$eq).forEach(e=>i.add(e));var r,s=void 0!==t.$gte,a=void 0!==t.$gt,n=void 0!==t.$lte,o=void 0!==t.$lt;return(s||a||n||o)&&(r=s?t.$gte:a?t.$gt:null,t=n?t.$lte:o?t.$lt:null,e.range(r,t,!s&&a,!n&&o).forEach(e=>i.add(e))),Array.from(i)}_queryHash(e,t){var i;if(void 0!==t.$eq)return(i=e.get(t.$eq))?Array.from(i):[];if(void 0===t.$in)return[];{let i=new Set;for(var r of t.$in)(r=e.get(r))&&r.forEach(e=>i.add(e));return Array.from(i)}}_queryText(e,t){return t.$search?e.search(t.$search):[]}_queryGeo(e,t){return t.$near?e.findNear(t.$near.coordinates,t.$near.maxDistance||1e3):t.$within?e.findWithin(t.$within):[]}dropIndex(e){this._indexes.delete(e),this._indexData.delete(e),this._dirtyIndexes.delete(e),this._saveIndexMetadata(),e=""+At.IDX_PREFIX+e,this._collection._indexedDB.delete(this._collection._db,this._collection._storeName,e).catch(()=>{})}_getFieldValue(e,t){var i;let r=e;for(i of t.split(".")){if(null==r)return;r=r[i]}return r}async _saveIndexMetadata(){let e=`lacertadb_${this._collection.database.name}_${this._collection.name}_indexes`;return new Promise(t=>{var i=()=>{var i={indexes:Array.from(this._indexes.entries()).map(([e,t])=>({name:e,...t}))};i=this._serializer.serialize(i),i=this._base64.encode(i);localStorage.setItem(e,i),t()};"undefined"!=typeof window&&window.requestIdleCallback?window.requestIdleCallback(i):setTimeout(i,0)})}async loadIndexMetadata(){var e=`lacertadb_${this._collection.database.name}_${this._collection.name}_indexes`;if(e=localStorage.getItem(e))try{var t,i=this._base64.decode(e);for(t of this._serializer.deserialize(i).indexes){let{name:e,...i}=t;this._indexes.set(e,i)}var r,s,a=[];for([r,s]of this._indexes)"btree"===s.type&&await this._restoreIndex(r)||a.push(r);if(0<a.length)for(var n of a)await this.rebuildIndex(n)}catch(e){console.error("Failed to load index metadata:",e)}}getIndexStats(){var e,t,i={};for([e,t]of this._indexes){var r=this._indexData.get(e);i[e]={...t,size:r&&(r.size||r.length)||0,memoryUsage:this._estimateMemoryUsage(r)}}return i}_estimateMemoryUsage(e){return e?e instanceof Map?100*e.size:e instanceof vt?120*e.size:0:0}async verifyIndexes(){var e,t,i={};for([e,t]of this._indexes){var r=this._indexData.get(e);r?r.verify?((r=r.verify()).requiresRebuild&&(await this.rebuildIndex(e),r.rebuilt=!0),i[e]=r):i[e]={status:"ok"}:(i[e]={status:"missing",rebuilt:!0},await this.rebuildIndex(e))}return i}destroy(){for(var[e,t]of(this._persistTimer&&(clearTimeout(this._persistTimer),this._persistTimer=null),this._indexData))t&&t.clear&&t.clear();this._indexData.clear(),this._indexes.clear(),this._dirtyIndexes.clear(),this._indexQueue=[],this._processing=!1}}class xt{async saveAttachments(e,t,i,r){try{var s,a,n=[],o=await(await(await(await navigator.storage.getDirectory()).getDirectoryHandle(e,{create:!0})).getDirectoryHandle(t,{create:!0})).getDirectoryHandle(i,{create:!0});for([s,a]of r.entries()){var h=s+"_"+(a.name||"file"),l=await(await o.getFileHandle(h,{create:!0})).createWritable();let r;if(a.data instanceof Uint8Array)r=a.data;else if(a.data instanceof ArrayBuffer)r=new Uint8Array(a.data);else{if(!(a.data instanceof Blob))throw new TypeError("Unsupported attachment data type");r=new Uint8Array(await a.data.arrayBuffer())}var c=new Blob([r],{type:a.type||"application/octet-stream"}),d=(await l.write(c),await l.close(),`/${e}/${t}/${i}/`+h);n.push({path:d,name:a.name,type:a.type,size:r.byteLength,originalName:a.originalName||a.name})}return n}catch(r){throw new ht("Failed to save attachments","ATTACHMENT_SAVE_FAILED",r)}}async getAttachments(e){var t,i=[],r=await navigator.storage.getDirectory();for(t of e)try{var s=t.path.split("/").filter(e=>e);let e=r;for(let t=0;t<s.length-1;t++)e=await e.getDirectoryHandle(s[t]);var a=await(await(await e.getFileHandle(s[s.length-1])).getFile()).arrayBuffer();i.push({name:t.originalName||t.name,type:t.type,data:new Uint8Array(a),size:t.size})}catch(e){console.error("Failed to get attachment: "+t.path,e)}return i}async deleteAttachments(e,t,i){try{await(await(await(await navigator.storage.getDirectory()).getDirectoryHandle(e)).getDirectoryHandle(t)).removeEntry(i,{recursive:!0})}catch(e){"NotFoundError"!==e.name&&console.error(`Failed to delete attachments for ${i}:`,e)}}static async prepareAttachment(e,t){let i;if(e instanceof File||e instanceof Blob){var r=await e.arrayBuffer();i=new Uint8Array(r)}else if(e instanceof ArrayBuffer)i=new Uint8Array(e);else{if(!(e instanceof Uint8Array))throw new TypeError("Unsupported file type for attachment");i=e}return{name:t||e.name||"unnamed",type:e.type||"application/octet-stream",data:i,originalName:e.name||t}}}class kt{constructor(){this._mutex=new ot}async performTransaction(e,t,i,r,s=3){return"readonly"===i?this._runTx(e,t,i,r,s):this._mutex.runExclusive(()=>this._runTx(e,t,i,r,s))}async _runTx(e,t,i,r,s){let a;for(let n=0;n<s;n++)try{return await new Promise((s,a)=>{let n,o=e.transaction(t,i);o.oncomplete=()=>s(n),o.onerror=()=>a(o.error),o.onabort=()=>a(new Error("Transaction aborted"));try{var h=r(o);h instanceof Promise?h.then(e=>{n=e}).catch(a):n=h}catch(s){a(s)}})}catch(e){a=e,n<s-1&&await new Promise(e=>setTimeout(e,2**n*100))}throw new ht("Transaction failed after retries","TRANSACTION_FAILED",a)}_promisifyRequest(e){return new Promise((t,i)=>{let r=e();r.onsuccess=()=>t(r.result),r.onerror=()=>i(r.error),r.onabort=()=>i(new DOMException("Request aborted","AbortError"))})}async getBatch(e,t,i,r){return this.performTransaction(e,[t],"readonly",e=>{let s,a=e.objectStore(t);return null!=i&&(s=IDBKeyRange.lowerBound(i,!0)),this._promisifyRequest(()=>a.getAll(s,r))})}add(e,t,i,r){return this.performTransaction(e,[t],"readwrite",e=>{let s=e.objectStore(t);return this._promisifyRequest(()=>void 0!==r?s.add(i,r):s.add(i))})}put(e,t,i,r){return this.performTransaction(e,[t],"readwrite",e=>{let s=e.objectStore(t);return this._promisifyRequest(()=>void 0!==r?s.put(i,r):s.put(i))})}get(e,t,i){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).get(i)))}getAll(e,t,i,r){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).getAll(i,r)))}delete(e,t,i){return this.performTransaction(e,[t],"readwrite",e=>this._promisifyRequest(()=>e.objectStore(t).delete(i)))}clear(e,t){return this.performTransaction(e,[t],"readwrite",e=>this._promisifyRequest(()=>e.objectStore(t).clear()))}count(e,t,i){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).count(i)))}async batchOperation(e,t,i="documents"){return this.performTransaction(e,[i],"readwrite",e=>{let r=e.objectStore(i);return e=t.map(e=>{try{switch(e.type){case"add":return this._promisifyRequest(()=>r.add(e.data)).then(e=>({success:!0,result:e}));case"put":return this._promisifyRequest(()=>r.put(e.data)).then(e=>({success:!0,result:e}));case"delete":return this._promisifyRequest(()=>r.delete(e.key)).then(e=>({success:!0,result:e}));default:return Promise.resolve({success:!1,error:"Unknown operation type: "+e.type})}}catch(e){return Promise.resolve({success:!1,error:e.message})}}),Promise.all(e)})}}class zt{constructor(e={},t={},i){this._id=e._id||this._generateId(),this._created=e._created||Date.now(),this._modified=e._modified||Date.now(),this._permanent=e._permanent||t.permanent||!1,this._encrypted=!1,this._compressed=e._compressed||t.compressed||!1,this._attachments=e._attachments||[],this._data=null,this._packedData=e.packedData||null,this._compression=ft,this._serializer=i,e.data&&(this.data=e.data)}get data(){return this._data||{}}set data(e){this._data=e}_generateId(){return`doc_${Date.now()}_`+Math.random().toString(36).substring(2,11)}async pack(e=null){try{let t=this._serializer.serialize(this.data);return this._compressed&&(t=await this._compression.compress(t)),e&&(t=await e.encrypt(t),this._encrypted=!0),this._packedData=t}catch(e){throw new ht("Failed to pack document","PACK_FAILED",e)}}async unpack(e=null){try{let t=this._packedData;if(this._encrypted&&e&&(t=await e.decrypt(t)),!(t=this._compressed?await this._compression.decompress(t):t)||0===t.length)throw new Error("Empty unpacked data");if(this.data=this._serializer.deserialize(t),"object"!=typeof this.data||null===this.data)throw new Error("Invalid deserialized data");return this.data}catch(e){return console.error("Document unpack failed:",e),this.data={},this.data}}packSync(){let e=this._serializer.serialize(this.data);return this._compressed&&(e=this._compression.compressSync(e)),this._packedData=e}unpackSync(){if(this._encrypted)throw new ht("Synchronous decryption not supported","SYNC_DECRYPT_NOT_SUPPORTED");let e=this._packedData;return this._compressed&&(e=this._compression.decompressSync(e)),this.data=this._serializer.deserialize(e),this.data}objectOutput(e=!1){var t={_id:this._id,_created:this._created,_modified:this._modified,_permanent:this._permanent,...this.data};return e&&0<this._attachments.length&&(t._attachments=this._attachments),t}databaseOutput(){return{_id:this._id,_created:this._created,_modified:this._modified,_permanent:this._permanent,_encrypted:this._encrypted,_compressed:this._compressed,_attachments:this._attachments,packedData:this._packedData}}}class It{constructor(e,t={},i,r,s){this.name=e,this._serializer=i,this._base64=r,this._dbName=s,this._storageKey=s?`lacertadb_${s}_${e}_collmeta`:null,this.sizeKB=t.sizeKB||0,this.length=t.length||0,this.createdAt=t.createdAt||Date.now(),this.modifiedAt=t.modifiedAt||Date.now(),this._docSizes=new Map(t._docSizes||[]),this._docModified=new Map(t._docModified||[]),this._docPermanent=new Map(t._docPermanent||[]),this._docAttachments=new Map(t._docAttachments||[]),this._dirty=!1,this._saveTimer=null,this._flushHandler=()=>this._flushSync(),"undefined"!=typeof window&&window.addEventListener("beforeunload",this._flushHandler)}addDocument(e,t,i=!1,r=0){this._docSizes.set(e,t),this._docModified.set(e,Date.now()),this._docPermanent.set(e,i),this._docAttachments.set(e,r),this.sizeKB+=t,this.length++,this.modifiedAt=Date.now(),this._scheduleSave()}updateDocument(e,t,i=!1,r=0){var s=this._docSizes.get(e)||0;this.sizeKB=this.sizeKB-s+t,this._docSizes.set(e,t),this._docModified.set(e,Date.now()),this._docPermanent.set(e,i),this._docAttachments.set(e,r),this.modifiedAt=Date.now(),this._scheduleSave()}removeDocument(e){var t=this._docSizes.get(e)||0;this.sizeKB-=t,this.length--,this._docSizes.delete(e),this._docModified.delete(e),this._docPermanent.delete(e),this._docAttachments.delete(e),this.modifiedAt=Date.now(),this._scheduleSave()}getOldestNonPermanentDocuments(e){var t,i,r=[];for([t,i]of this._docModified)this._docPermanent.get(t)||r.push({id:t,modified:i});return r.sort((e,t)=>e.modified-t.modified),r.slice(0,e).map(e=>e.id)}getDocumentSize(e){return this._docSizes.get(e)||0}isDocumentPermanent(e){return this._docPermanent.get(e)||!1}hasDocument(e){return this._docSizes.has(e)}getAggregateSnapshot(){return{sizeKB:this.sizeKB,length:this.length,createdAt:this.createdAt,modifiedAt:this.modifiedAt}}_scheduleSave(){var e;this._dirty=!0,this._saveTimer||(e=()=>{this._saveTimer=null,this._dirty&&this._persistToStorage()},"undefined"!=typeof window&&window.requestIdleCallback?this._saveTimer=window.requestIdleCallback(e):this._saveTimer=setTimeout(e,300))}_flushSync(){this._dirty&&this._persistToStorage()}_persistToStorage(){if(this._storageKey&&this._serializer&&this._base64)try{var e={sizeKB:this.sizeKB,length:this.length,createdAt:this.createdAt,modifiedAt:this.modifiedAt,_docSizes:Array.from(this._docSizes.entries()),_docModified:Array.from(this._docModified.entries()),_docPermanent:Array.from(this._docPermanent.entries()),_docAttachments:Array.from(this._docAttachments.entries())},t=this._serializer.serialize(e),i=this._base64.encode(t);localStorage.setItem(this._storageKey,i),this._dirty=!1}catch(e){if("QuotaExceededError"===e.name){console.warn("CollectionMetadata: quota exceeded, saving aggregates only");try{var r={sizeKB:this.sizeKB,length:this.length,createdAt:this.createdAt,modifiedAt:this.modifiedAt},s=this._serializer.serialize(r),a=this._base64.encode(s);localStorage.setItem(this._storageKey,a),this._dirty=!1}catch(e){console.error("CollectionMetadata: fallback save also failed:",e)}}else console.error("CollectionMetadata save failed:",e)}}static load(e,t,i,r){var s=localStorage.getItem(`lacertadb_${e}_${t}_collmeta`);if(s)try{var a=r.decode(s),n=i.deserialize(a);return new It(t,n,i,r,e)}catch(e){console.warn("CollectionMetadata corrupted, resetting:",e)}return new It(t,{},i,r,e)}destroy(){this._flushSync(),"undefined"!=typeof window&&this._flushHandler&&(window.removeEventListener("beforeunload",this._flushHandler),this._flushHandler=null),this._saveTimer&&("undefined"!=typeof window&&window.cancelIdleCallback?window.cancelIdleCallback(this._saveTimer):clearTimeout(this._saveTimer),this._saveTimer=null)}clear(){this.sizeKB=0,this.length=0,this.modifiedAt=Date.now(),this._docSizes.clear(),this._docModified.clear(),this._docPermanent.clear(),this._docAttachments.clear(),this._dirty=!0,this._flushSync()}}class Dt{constructor(e,t={},i,r){this.name=e,this._serializer=i,this._base64=r,this.collections=t.collections||{},this.totalSizeKB=t.totalSizeKB||0,this.totalLength=t.totalLength||0,this.modifiedAt=t.modifiedAt||Date.now(),this._dirty=!1,this._saveTimer=null,this._flushHandler=()=>this._flushSync(),"undefined"!=typeof window&&window.addEventListener("beforeunload",this._flushHandler)}static load(e,t,i){var r=localStorage.getItem(`lacertadb_${e}_metadata`);if(r)try{var s=i.decode(r),a=t.deserialize(s);return new Dt(e,a,t,i)}catch(e){console.error("Failed to load metadata:",e)}return new Dt(e,{},t,i)}setCollection(e){this.collections[e.name]=e.getAggregateSnapshot(),this._recalculate(),this._scheduleSave()}removeCollection(e){delete this.collections[e],this._recalculate(),this._scheduleSave()}_recalculate(){for(var e in this.totalSizeKB=0,this.totalLength=0,this.collections)e=this.collections[e],this.totalSizeKB+=e.sizeKB,this.totalLength+=e.length;this.modifiedAt=Date.now()}_scheduleSave(){var e;this._dirty=!0,this._saveTimer||(e=()=>{this._saveTimer=null,this._dirty&&this._persistToStorage()},"undefined"!=typeof window&&window.requestIdleCallback?this._saveTimer=window.requestIdleCallback(e):this._saveTimer=setTimeout(e,300))}_flushSync(){this._dirty&&this._persistToStorage()}_persistToStorage(){var e=`lacertadb_${this.name}_metadata`;try{var t={collections:this.collections,totalSizeKB:this.totalSizeKB,totalLength:this.totalLength,modifiedAt:this.modifiedAt},i=this._serializer.serialize(t),r=this._base64.encode(i);localStorage.setItem(e,r),this._dirty=!1}catch(e){"QuotaExceededError"===e.name?(console.error("CRITICAL: LocalStorage quota exceeded. Metadata not saved for db:",this.name),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("lacertadb:quotaexceeded",{detail:{db:this.name}}))):console.error("Failed to save metadata:",e)}}save(){this._dirty=!0,this._flushSync()}destroy(){this._flushSync(),"undefined"!=typeof window&&this._flushHandler&&(window.removeEventListener("beforeunload",this._flushHandler),this._flushHandler=null),this._saveTimer&&("undefined"!=typeof window&&window.cancelIdleCallback?window.cancelIdleCallback(this._saveTimer):clearTimeout(this._saveTimer),this._saveTimer=null)}}class Et{constructor(e,t={},i,r){this.dbName=e,this._serializer=i,this._base64=r,this.sizeLimitKB=null!=t.sizeLimitKB?t.sizeLimitKB:1/0,e=this.sizeLimitKB===1/0?1/0:.8*this.sizeLimitKB,this.bufferLimitKB=null!=t.bufferLimitKB?t.bufferLimitKB:e,this.freeSpaceEvery=this.sizeLimitKB===1/0?0:t.freeSpaceEvery||1e4}static load(e,t,i){var r=localStorage.getItem(`lacertadb_${e}_settings`);if(r)try{var s=i.decode(r),a=t.deserialize(s);return new Et(e,a,t,i)}catch(e){console.error("Failed to load settings:",e)}return new Et(e,{},t,i)}save(){var e=`lacertadb_${this.dbName}_settings`;try{var t={sizeLimitKB:this.sizeLimitKB,bufferLimitKB:this.bufferLimitKB,freeSpaceEvery:this.freeSpaceEvery},i=this._serializer.serialize(t),r=this._base64.encode(i);localStorage.setItem(e,r)}catch(e){"QuotaExceededError"===e.name?(console.error("CRITICAL: Settings save failed — localStorage quota exceeded"),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("lacertadb:quotaexceeded",{detail:{source:"settings",db:this.dbName}}))):console.error("Settings save failed:",e)}}updateSettings(e){Object.assign(this,e),void 0!==e.sizeLimitKB&&void 0===e.bufferLimitKB&&(this.bufferLimitKB=this.sizeLimitKB===1/0?1/0:.8*this.sizeLimitKB),this.sizeLimitKB===1/0&&(this.freeSpaceEvery=0),this.save()}}let Ct=new class{constructor(){this.operators={$eq:(e,t)=>e===t,$ne:(e,t)=>e!==t,$gt:(e,t)=>t<e,$gte:(e,t)=>t<=e,$lt:(e,t)=>e<t,$lte:(e,t)=>e<=t,$in:(e,t)=>Array.isArray(t)&&t.includes(e),$nin:(e,t)=>Array.isArray(t)&&!t.includes(e),$and:(e,t)=>t.every(t=>this.evaluate(e,t)),$or:(e,t)=>t.some(t=>this.evaluate(e,t)),$not:(e,t)=>!this.evaluate(e,t),$nor:(e,t)=>!t.some(t=>this.evaluate(e,t)),$exists:(e,t)=>void 0!==e===t,$type:(e,t)=>typeof e===t,$all:(e,t)=>Array.isArray(e)&&t.every(t=>e.includes(t)),$elemMatch:(e,t)=>Array.isArray(e)&&e.some(e=>this.evaluate({value:e},{value:t})),$size:(e,t)=>Array.isArray(e)&&e.length===t,$regex:(e,t)=>{if("string"!=typeof e)return!1;try{return new RegExp(t).test(e)}catch{return!1}},$text:(e,t)=>"string"==typeof e&&e.toLowerCase().includes(t.toLowerCase())}}evaluate(e,t){for(var i in t){var r=t[i];if(i.startsWith("$")){var s=this.operators[i];if(!s||!s(e,r))return!1}else{var a=this.getFieldValue(e,i);if("object"!=typeof r||null===r||Array.isArray(r)){if(a!==r)return!1}else for(var n in r)if(n.startsWith("$")){var o=this.operators[n];if(!o||!o(a,r[n]))return!1}}}return!0}getFieldValue(e,t){let i=e;for(var r of t.split(".")){if(null==i)return;i=i[r]}return i}};let Ut=new class{constructor(){this.stages={$match:(e,t)=>e.filter(e=>Ct.evaluate(e,t)),$project:(e,t)=>e.map(e=>{var i,r={};for(i in t){var s=t[i];1===s||!0===s?r[i]=Ct.getFieldValue(e,i):"string"==typeof s&&s.startsWith("$")&&(r[i]=Ct.getFieldValue(e,s.substring(1)))}if(Object.values(t).some(e=>0===e||!1===e)){var a=Object.keys(t).filter(e=>0===t[e]||!1===t[e]);let i={...e};return a.forEach(e=>delete i[e]),i}return r}),$sort:(e,t)=>[...e].sort((e,i)=>{for(var r in t){var s=t[r],a=Ct.getFieldValue(e,r);if(a<(r=Ct.getFieldValue(i,r)))return-s;if(r<a)return s}return 0}),$limit:(e,t)=>e.slice(0,t),$skip:(e,t)=>e.slice(t),$group:(e,t)=>{var i,r=new Map,s=t._id;let a=e=>null===e||"object"!=typeof e?JSON.stringify(e):Array.isArray(e)?"["+e.map(a).join(",")+"]":"{"+Object.keys(e).sort().map(t=>JSON.stringify(t)+":"+a(e[t])).join(",")+"}",n=(e,t)=>{if("string"==typeof t&&t.startsWith("$"))return Ct.getFieldValue(e,t.substring(1));if(null===t||"object"!=typeof t||Array.isArray(t))return t;var i,r={};for(i in t)r[i]=n(e,t[i]);return r};for(i of e){let e;e="string"==typeof s?s.startsWith("$")?Ct.getFieldValue(i,s.substring(1)):s:null!==s&&"object"==typeof s?a(n(i,s)):s,r.has(e)||r.set(e,{_id:e,docs:[]}),r.get(e).docs.push(i)}var o,h=[];for(o of r.values()){var l,c={_id:o._id};for(l in t)if("_id"!==l){var d=t[l],u=Object.keys(d)[0];let e=d[u].toString().replace("$","");switch(u){case"$sum":c[l]=o.docs.reduce((t,i)=>t+(Ct.getFieldValue(i,e)||0),0);break;case"$avg":var _=o.docs.reduce((t,i)=>t+(Ct.getFieldValue(i,e)||0),0);c[l]=_/o.docs.length;break;case"$count":c[l]=o.docs.length;break;case"$max":c[l]=Math.max(...o.docs.map(t=>Ct.getFieldValue(t,e)));break;case"$min":c[l]=Math.min(...o.docs.map(t=>Ct.getFieldValue(t,e)))}}h.push(c)}return h},$lookup:async(e,t,i)=>{i=await(await i.getCollection(t.from)).getAll();let r=new Map;return i.forEach(e=>{var i=Ct.getFieldValue(e,t.foreignField);r.has(i)||r.set(i,[]),r.get(i).push(e)}),e.map(e=>{var i=Ct.getFieldValue(e,t.localField);return{...e,[t.as]:r.get(i)||[]}})}}}async execute(e,t,i){let r=e;for(var s of t){var a=Object.keys(s)[0],n=(s=s[a],this.stages[a]);if(!n)throw new Error("Unknown aggregation stage: "+a);r="$lookup"===a?await n(r,s,i):n(r,s)}return r}};class Mt{constructor(e){this.database=e,this.migrations=[],this.currentVersion=this._loadVersion()}_loadVersion(){return localStorage.getItem(`lacertadb_${this.database.name}_version`)||"1.0.0"}_saveVersion(e){localStorage.setItem(`lacertadb_${this.database.name}_version`,e),this.currentVersion=e}addMigration(e){this.migrations.push(e)}_compareVersions(e,t){var i=e.split(".").map(Number),r=t.split(".").map(Number),s=Math.max(i.length,r.length);for(let e=0;e<s;e++){var a=i[e]||0,n=r[e]||0;if(n<a)return 1;if(a<n)return-1}return 0}async runMigrations(e){var t;for(t of this.migrations.filter(t=>0<this._compareVersions(t.version,this.currentVersion)&&this._compareVersions(t.version,e)<=0).sort((e,t)=>this._compareVersions(e.version,t.version)))await this._applyMigration(t,"up"),this._saveVersion(t.version)}async rollback(e){var t;for(t of this.migrations.filter(t=>t.down&&0<this._compareVersions(t.version,e)&&this._compareVersions(t.version,this.currentVersion)<=0).sort((e,t)=>this._compareVersions(t.version,e.version)))await this._applyMigration(t,"down");this._saveVersion(e)}async _applyMigration(e,t){var i;for(i of(console.log(`${"up"===t?"Running":"Rolling back"} migration: ${e.name} (v${e.version})`),await this.database.listCollections())){var r,s=await this.database.getCollection(i);for(r of await s.getAll()){var a=await e[t](r);a&&await s.update(r._id,a)}}}}class Tt{constructor(){this._metrics={operations:[],latencies:[],cacheHits:0,cacheMisses:0,memoryUsage:[]},this._monitoring=!1,this._monitoringInterval=null}startMonitoring(){this._monitoring||(this._monitoring=!0,this._monitoringInterval=setInterval(()=>this._collectMetrics(),1e3))}stopMonitoring(){this._monitoring&&(this._monitoring=!1,clearInterval(this._monitoringInterval),this._monitoringInterval=null)}recordOperation(e,t){this._monitoring&&(this._metrics.operations.push({type:e,duration:t,timestamp:Date.now()}),this._metrics.latencies.push(t),100<this._metrics.operations.length&&this._metrics.operations.shift(),100<this._metrics.latencies.length)&&this._metrics.latencies.shift()}recordCacheHit(){this._metrics.cacheHits++}recordCacheMiss(){this._metrics.cacheMisses++}_collectMetrics(){performance&&performance.memory&&(this._metrics.memoryUsage.push({used:performance.memory.usedJSHeapSize,total:performance.memory.totalJSHeapSize,limit:performance.memory.jsHeapSizeLimit,timestamp:Date.now()}),60<this._metrics.memoryUsage.length)&&this._metrics.memoryUsage.shift()}getStats(){var e=this._metrics.operations.filter(e=>Date.now()-e.timestamp<1e3).length,t=this._metrics.latencies.reduce((e,t)=>e+t,0),i=(t=0<this._metrics.latencies.length?t/this._metrics.latencies.length:0,0<(i=this._metrics.cacheHits+this._metrics.cacheMisses)?this._metrics.cacheHits/i*100:0),r=(r=0<this._metrics.memoryUsage.length?this._metrics.memoryUsage[this._metrics.memoryUsage.length-1]:null)?r.used/1048576:0;return{opsPerSec:e,avgLatency:t.toFixed(2),cacheHitRate:i.toFixed(1),memoryUsageMB:r.toFixed(2)}}getOptimizationTips(){var e=[],t=this.getStats();return 100<t.avgLatency&&e.push("High average latency detected. Consider enabling compression and indexing frequently queried fields."),t.cacheHitRate<50&&20<this._metrics.cacheHits+this._metrics.cacheMisses&&e.push("Low cache hit rate. Consider increasing cache size or optimizing query patterns."),10<this._metrics.memoryUsage.length&&10485760<(t=this._metrics.memoryUsage.slice(-10))[t.length-1].used-t[0].used&&e.push("Memory usage is increasing rapidly. Check for memory leaks or consider batch processing."),0<e.length?e:["Performance is optimal. No issues detected."]}}class Bt{constructor(e,t){this.name=e,this.database=t,this._serializer=t._serializer,this._base64=t._base64,this._db=null,this._storeName=e,this._metadata=null,this._settings=t.settings,this._indexedDB=new kt,this._opfs=new xt,this._cleanupInterval=null,this._events=new Map,this._indexManager=new At(this),this._cacheStrategy=new ut({type:"lru",maxSize:100,ttl:6e4,enabled:!0}),this._docCache=new lt(200),this._pendingIndexes=[],this._performanceMonitor=t.performanceMonitor,this._initialized=!1}get settings(){return this._settings}get metadata(){return this._metadata}get initialized(){return this._initialized}async init(){if(!this._initialized){if(await this.database._ensureStore(this._storeName),this._db=this.database._db,this._metadata=It.load(this.database.name,this.name,this._serializer,this._base64),await this._indexManager.loadIndexMetadata(),0<this._pendingIndexes.length){for(var{fieldPath:e,options:t}of this._pendingIndexes)this._indexManager.indexes.has(t.name||e)||await this._indexManager.createIndex(e,t).catch(()=>{});this._pendingIndexes=[]}0<this._settings.freeSpaceEvery&&this._settings.sizeLimitKB!==1/0&&(this._cleanupInterval=setInterval(()=>this._freeSpace(),this._settings.freeSpaceEvery)),this._initialized=!0}return this}async createIndex(e,t={}){return this._initialized?this._indexManager.createIndex(e,t):(this._pendingIndexes.push({fieldPath:e,options:t}),t.name||e)}async dropIndex(e){return this._indexManager.dropIndex(e)}async getIndexes(){return this._indexManager.getIndexStats()}async verifyIndexes(){return this._indexManager.verifyIndexes()}configureCacheStrategy(e){this._cacheStrategy.updateStrategy(e)}async add(e,t={}){if(this._initialized||await this.init(),t.encrypted&&!this.database.isEncrypted)throw new ht("Document-level encryption requires database-level encryption. Use getSecureDatabase() to create an encrypted database.","ENCRYPTION_NOT_INITIALIZED");await this._trigger("beforeAdd",e);e=new zt({data:e,_id:t.id},{compressed:t.compressed||!1,permanent:t.permanent||!1},this._serializer),(t=t.attachments)&&0<t.length&&(t=await Promise.all(t.map(e=>e instanceof File||e instanceof Blob?xt.prepareAttachment(e,e.name):Promise.resolve(e))),e._attachments=await this._opfs.saveAttachments(this.database.name,this.name,e._id,t)),await e.pack(this.database.encryption),t=e.databaseOutput();var i=(await this._indexedDB.add(this._db,this._storeName,t),e.objectOutput());await this._indexManager.updateIndexForDocument(e._id,null,i),t=t.packedData.byteLength/1024;return this._metadata.addDocument(e._id,t,e._permanent,e._attachments.length),this.database.metadata.setCollection(this._metadata),await this._checkSpaceLimit(),await this._trigger("afterAdd",e),this._cacheStrategy.clear(),this._docCache.set(e._id,i),e._id}async get(e,t={}){var i,r;if((this._initialized||await this.init(),!t.includeAttachments)&&(r=this._docCache.get(e)))return r;if(r=await this._indexedDB.get(this._db,this._storeName,e))return i=new zt(r,{encrypted:r._encrypted,compressed:r._compressed},this._serializer),r.packedData&&await i.unpack(this.database.encryption),t.includeAttachments&&0<i._attachments.length&&(i.data._attachments=await this._opfs.getAttachments(i._attachments)),await this._trigger("afterGet",i),r=i.objectOutput(t.includeAttachments),t.includeAttachments||this._docCache.set(e,r),r;throw new ht(`Document with id '${e}' not found.`,"DOCUMENT_NOT_FOUND")}async getAll(e={}){return this._initialized||await this.init(),e=(await this._indexedDB.getAll(this._db,this._storeName,void 0,e.limit)).filter(e=>!("string"==typeof e._id&&e._id.startsWith(At.IDX_PREFIX))),Promise.all(e.map(async e=>{try{var t=new zt(e,{encrypted:e._encrypted,compressed:e._compressed},this._serializer);return e.packedData&&await t.unpack(this.database.encryption),t.objectOutput()}catch(t){return console.error(`Failed to unpack document ${e._id}:`,t),null}})).then(e=>e.filter(Boolean))}async update(e,t,i={}){this._initialized||await this.init(),await this._trigger("beforeUpdate",{docId:e,updates:t});var r,s,a=await this._indexedDB.get(this._db,this._storeName,e);if(a)return s=new zt(a,{},this._serializer),a.packedData&&await s.unpack(this.database.encryption),r=s.objectOutput(),s={...s.data,...t},(t=new zt({_id:e,_created:a._created,data:s},{compressed:void 0!==i.compressed?i.compressed:a._compressed,permanent:void 0!==i.permanent?i.permanent:a._permanent},this._serializer))._modified=Date.now(),(s=i.attachments)&&0<s.length?(await this._opfs.deleteAttachments(this.database.name,this.name,e),i=await Promise.all(s.map(e=>e instanceof File||e instanceof Blob?xt.prepareAttachment(e,e.name):Promise.resolve(e))),t._attachments=await this._opfs.saveAttachments(this.database.name,this.name,t._id,i)):t._attachments=a._attachments,await t.pack(this.database.encryption),s=t.databaseOutput(),await this._indexedDB.put(this._db,this._storeName,s),i=t.objectOutput(),await this._indexManager.updateIndexForDocument(t._id,r,i),a=s.packedData.byteLength/1024,this._metadata.updateDocument(t._id,a,t._permanent,t._attachments.length),this.database.metadata.setCollection(this._metadata),await this._trigger("afterUpdate",t),this._cacheStrategy.clear(),this._docCache.set(t._id,i),t._id;throw new ht(`Document with id '${e}' not found for update.`,"DOCUMENT_NOT_FOUND")}async delete(e,t={}){this._initialized||await this.init(),await this._trigger("beforeDelete",e);var i=await this._indexedDB.get(this._db,this._storeName,e);if(!i)throw new ht("Document not found for deletion","DOCUMENT_NOT_FOUND");if(i._permanent&&!t.force)throw new ht("Cannot delete a permanent document. Use options.force = true to force deletion.","PERMANENT_DOCUMENT_PROTECTION");i._permanent&&t.force&&console.warn("Force deleting permanent document: "+e),t=await this.get(e),await this._indexManager.updateIndexForDocument(e,t,null),await this._indexedDB.delete(this._db,this._storeName,e),(t=i._attachments)&&0<t.length&&await this._opfs.deleteAttachments(this.database.name,this.name,e),this._metadata.removeDocument(e),this.database.metadata.setCollection(this._metadata),await this._trigger("afterDelete",e),this._cacheStrategy.clear(),this._docCache.delete(e)}async query(e={},t={}){this._initialized||await this.init();var i,r,s=performance.now(),a=JSON.stringify({f:e,o:t},(e,t)=>{if(!t||"object"!=typeof t||Array.isArray(t))return t;var i,r={};for(i of Object.keys(t).sort())r[i]=t[i];return r}),n=this._cacheStrategy.get(a);if(n)return this._performanceMonitor&&this._performanceMonitor.recordCacheHit(),n;this._performanceMonitor&&this._performanceMonitor.recordCacheMiss();let o,h=!1;for([i,r]of this._indexManager.indexes){var l=e[r.fieldPath];if(void 0!==l){l=await this._indexManager.query(i,l),o=(o=await Promise.all(l.map(e=>this.get(e).catch(()=>null)))).filter(Boolean),h=!0;break}}return h||(o=await this.getAll(t),0<Object.keys(e).length&&(o=o.filter(t=>Ct.evaluate(t,e)))),t.sort&&(o=Ut.stages.$sort(o,t.sort)),t.skip&&(o=Ut.stages.$skip(o,t.skip)),t.limit&&(o=Ut.stages.$limit(o,t.limit)),t.projection&&(o=Ut.stages.$project(o,t.projection)),this._performanceMonitor&&this._performanceMonitor.recordOperation(h?"indexed-query":"full-scan-query",performance.now()-s),this._cacheStrategy.set(a,o),o}async aggregate(e){this._initialized||await this.init();var t=performance.now();let i,r=e;return 0<e.length&&e[0].$match?(i=await this.query(e[0].$match),r=e.slice(1)):i=await this.getAll(),e=await Ut.execute(i,r,this.database),this._performanceMonitor&&this._performanceMonitor.recordOperation("aggregate",performance.now()-t),e}async batchAdd(e,t={}){this._initialized||await this.init();var i=performance.now(),r=[];let s=[];var a,n=!this.database.encryption&&!t.compressed;for(a of e){var o=new zt({data:a},{compressed:t.compressed||!1,permanent:t.permanent||!1},this._serializer);n?o.packSync():await o.pack(this.database.encryption),r.push({type:"add",data:o.databaseOutput()}),s.push(o)}var h,l,c,d=await this._indexedDB.batchOperation(this._db,r,this._storeName);for(let e=0;e<s.length;e++)d[e].success&&(l=(h=s[e]).objectOutput(),await this._indexManager.updateIndexForDocument(h._id,null,l),c=h._packedData.byteLength/1024,this._metadata.addDocument(h._id,c,h._permanent,0),this._docCache.set(h._id,l));return this.database.metadata.setCollection(this._metadata),this._performanceMonitor&&this._performanceMonitor.recordOperation("batchAdd",performance.now()-i),d.map((e,t)=>({...e,id:s[t]._id}))}async batchUpdate(e,t={}){this._initialized||await this.init();var i=performance.now(),r=[],s=[];let a=[];var n,o,h=[],l=!this.database.encryption&&!t.compressed,c=e.map(e=>e.id),d=new Map;for(n of await this._indexedDB.getAll(this._db,this._storeName))n._id&&c.includes(n._id)&&d.set(n._id,n);for(o of e){var u,_=d.get(o.id);_?(u=new zt(_,{},this._serializer),_.packedData&&await u.unpack(this.database.encryption),s.push(u.objectOutput()),u={...u.data,...o.data},(u=new zt({_id:o.id,_created:_._created,data:u},{compressed:void 0!==t.compressed?t.compressed:_._compressed,permanent:void 0!==t.permanent?t.permanent:_._permanent},this._serializer))._modified=Date.now(),u._attachments=_._attachments,l?u.packSync():await u.pack(this.database.encryption),a.push(u),r.push({type:"put",data:u.databaseOutput()})):h.push({success:!1,id:o.id,error:"Document not found"})}if(0===r.length)return h;var f,p,y,w=await this._indexedDB.batchOperation(this._db,r,this._storeName);for(let e=0;e<a.length;e++)w[e].success&&(p=(f=a[e]).objectOutput(),await this._indexManager.updateIndexForDocument(f._id,s[e],p),y=f._packedData.byteLength/1024,this._metadata.updateDocument(f._id,y,f._permanent,f._attachments.length),this._docCache.set(f._id,p));return this.database.metadata.setCollection(this._metadata),this._cacheStrategy.clear(),this._performanceMonitor&&this._performanceMonitor.recordOperation("batchUpdate",performance.now()-i),[...w.map((e,t)=>({...e,id:a[t]._id})),...h]}async batchDelete(e){this._initialized||await this.init();var t=performance.now(),i=(e=e.map(e=>"string"==typeof e?{id:e,options:{}}:{id:e.id,options:e.options||{}}),[]);let r=[];var s,a,n=[];for({id:s,options:a}of e){var o,h=await this._indexedDB.get(this._db,this._storeName,s);h?h._permanent&&!a.force?n.push({success:!1,id:s,error:"Cannot delete permanent document without force flag"}):(o=await this.get(s),r.push({id:s,fullDoc:o,stored:h}),i.push({type:"delete",key:s})):n.push({success:!1,id:s,error:"Document not found"})}if(0===i.length)return n;var l,c,d,u=await this._indexedDB.batchOperation(this._db,i,this._storeName);for(let e=0;e<r.length;e++)u[e].success&&(({id:l,fullDoc:c,stored:d}=r[e]),await this._indexManager.updateIndexForDocument(l,c,null),d._attachments&&0<d._attachments.length&&await this._opfs.deleteAttachments(this.database.name,this.name,l),this._metadata.removeDocument(l),this._docCache.delete(l));return this.database.metadata.setCollection(this._metadata),this._cacheStrategy.clear(),this._performanceMonitor&&this._performanceMonitor.recordOperation("batchDelete",performance.now()-t),[...u.map((e,t)=>({...e,id:r[t].id})),...n]}async _checkSpaceLimit(){this._settings.sizeLimitKB!==1/0&&this._metadata.sizeKB>this._settings.bufferLimitKB&&await this._freeSpace()}async _freeSpace(){for(var e=.8*this._settings.bufferLimitKB;this._metadata.sizeKB>e;){var t=this._metadata.getOldestNonPermanentDocuments(10);if(0===t.length)break;await this.batchDelete(t)}}on(e,t){this._events.has(e)||this._events.set(e,[]),this._events.get(e).push(t)}off(e,t){var i;this._events.has(e)&&(i=this._events.get(e).filter(e=>e!==t),this._events.set(e,i))}async _trigger(e,t){if((e=this._events.get(e))&&0!==e.length)for(var i of e)await i(t)}clearCache(){this._cacheStrategy.clear(),this._docCache.clear()}async clear(e={}){if(this._initialized||await this.init(),e.force)for(var t of(await this._indexedDB.clear(this._db,this._storeName),this._metadata&&this._metadata.destroy(),this._metadata=new It(this.name,{},this._serializer,this._base64,this.database.name),this._metadata._flushSync(),this.database.metadata.setCollection(this._metadata),this._cacheStrategy.clear(),this._docCache.clear(),this._indexManager.indexes.keys()))await this._indexManager.rebuildIndex(t);else e=(await this.getAll()).filter(e=>!e._permanent),await this.batchDelete(e.map(e=>e._id));this._cleanupInterval&&(clearInterval(this._cleanupInterval),this._cleanupInterval=null,0<this._settings.freeSpaceEvery)&&this._settings.sizeLimitKB!==1/0&&(this._cleanupInterval=setInterval(()=>this._freeSpace(),this._settings.freeSpaceEvery))}destroy(){this._metadata&&this._metadata.destroy(),this._indexManager&&(this._indexManager.flushPersistence().catch(()=>{}),this._indexManager.destroy()),this._cleanupInterval&&(clearInterval(this._cleanupInterval),this._cleanupInterval=null),this._cacheStrategy&&this._cacheStrategy.destroy(),this._docCache&&this._docCache.clear(),this._db=null,this._events.clear()}}class Vt{constructor(e,t,i,r){this.name=e,this._collections=new Map,this._metadata=null,this._settings=null,this._quickStore=null,this._performanceMonitor=t,this._serializer=i,this._base64=r,this._db=null,this._idbVersion=0,this._knownStores=new Set,this._ensureStorePromise=null,this._idbVersionKey=`lacertadb_${e}_idb_version`,this._idbStoresKey=`lacertadb_${e}_idb_stores`,this._encryption=null}get collections(){return this._collections}get metadata(){return this._metadata}get settings(){return this._settings}get quickStore(){return this._quickStore}get performanceMonitor(){return this._performanceMonitor}get encryption(){return this._encryption}get isEncrypted(){return!!this._encryption}async _getConnection(){if(!this._db){try{this._idbVersion=parseInt(localStorage.getItem(this._idbVersionKey),10)||1;var e,t,i=localStorage.getItem(this._idbStoresKey);i&&(e=this._base64.decode(i),t=this._serializer.deserialize(e),this._knownStores=new Set(t))}catch(e){this._idbVersion=1}this._db=await this._openIDB(this._idbVersion)}return this._db}async _openIDB(e){let t=this._knownStores;return new Promise((i,r)=>{let s=indexedDB.open("lacertadb_"+this.name,e);s.onerror=()=>r(new ht("Failed to open database","DATABASE_OPEN_FAILED",s.error)),s.onsuccess=()=>i(s.result),s.onupgradeneeded=e=>{var i,r=e.target.result;for(i of t)r.objectStoreNames.contains(i)||r.createObjectStore(i,{keyPath:"_id"}).createIndex("modified","_modified",{unique:!1})}})}async _ensureStore(e){if(this._db&&this._db.objectStoreNames.contains(e))this._knownStores.add(e);else if(this._knownStores.add(e),!(this._ensureStorePromise&&(await this._ensureStorePromise,this._db)&&this._db.objectStoreNames.contains(e))){var t,i=[];for(t of this._knownStores)this._db&&this._db.objectStoreNames.contains(t)||i.push(t);if(0!==i.length){this._ensureStorePromise=(async()=>{this._idbVersion++,localStorage.setItem(this._idbVersionKey,String(this._idbVersion));var e=this._serializer.serialize(Array.from(this._knownStores));e=this._base64.encode(e);localStorage.setItem(this._idbStoresKey,e),this._db&&(this._db.close(),this._db=null),this._db=await this._openIDB(this._idbVersion)})();try{await this._ensureStorePromise}finally{this._ensureStorePromise=null}}}}async init(e={}){return this._metadata=Dt.load(this.name,this._serializer,this._base64),this._settings=Et.load(this.name,this._serializer,this._base64),this._quickStore=new at(this.name,this._serializer,this._base64),await this._getConnection(),await this._migrateOldDatabases(),e.pin&&await this._initializeEncryption(e.pin,e.salt,e.encryptionConfig),this}async _initializeEncryption(e,t=0,i={}){var r=`lacertadb_${this.name}_encryption`;let s=null;var a=((a=localStorage.getItem(r))&&(a=this._base64.decode(a),s=this._serializer.deserialize(a)),this._encryption=new yt(i,this._serializer,this._base64),await this._encryption.initialize(e,s));s||(i=this._serializer.serialize(a),e=this._base64.encode(i),localStorage.setItem(r,e))}async changePin(e,t){if(this._encryption)return e=await this._encryption.changePin(e,t),t=`lacertadb_${this.name}_encryption`,e=this._serializer.serialize(e),e=this._base64.encode(e),localStorage.setItem(t,e),!0;throw new Error("Database is not encrypted")}async storePrivateKey(e,t,i=""){if(!this._encryption)throw new Error("Database must be encrypted to store private keys");t=await this._encryption.encryptPrivateKey(t,i);let r=await this.getCollection("__private_keys__").catch(()=>null);return await(r=r||await this.createCollection("__private_keys__")).add({name:e,key:t,createdAt:Date.now()},{id:e,permanent:!0}),!0}async getPrivateKey(e,t=""){if(!this._encryption)throw new Error("Database must be encrypted to retrieve private keys");var i=await(await this.getCollection("__private_keys__")).get(e);if(i)return this._encryption.decryptPrivateKey(i.key,t);throw new Error(`Private key '${e}' not found`)}async createCollection(e,t){if(this._collections.has(e))throw new ht(`Collection '${e}' already exists.`,"COLLECTION_EXISTS");await this._ensureStore(e);var i=new Bt(e,this);return this._collections.set(e,i),this._metadata.collections[e]||this._metadata.setCollection(new It(e,{},this._serializer,this._base64,this.name)),i}async getCollection(e){var t;if(this._collections.has(e))return(t=this._collections.get(e)).initialized||await t.init(),t;if(this._metadata.collections[e])return await this._ensureStore(e),t=new Bt(e,this),this._collections.set(e,t),await t.init(),t;throw new ht(`Collection '${e}' not found.`,"COLLECTION_NOT_FOUND")}ensureCollection(e){if(this._collections.has(e))return this._collections.get(e);if(!this._knownStores.has(e)){this._knownStores.add(e);try{var t=this._serializer.serialize(Array.from(this._knownStores)),i=this._base64.encode(t);localStorage.setItem(this._idbStoresKey,i)}catch(e){}}return t=new Bt(e,this),this._collections.set(e,t),this._metadata.collections[e]||this._metadata.setCollection(new It(e,{},this._serializer,this._base64,this.name)),t}async dropCollection(e){var t;if(this._collections.has(e)&&((t=this._collections.get(e)).initialized&&(await t.clear({force:!0}),t.destroy()),this._collections.delete(e)),this._metadata.removeCollection(e),localStorage.removeItem(`lacertadb_${this.name}_${e}_collmeta`),localStorage.removeItem(`lacertadb_${this.name}_${e}_indexes`),this._db&&this._knownStores.has(e))try{await(new kt).clear(this._db,e)}catch(e){}let i=this.name+"_"+e;try{await new Promise((e,t)=>{var r=indexedDB.deleteDatabase(i);r.onsuccess=e,r.onerror=e,r.onblocked=e})}catch(e){}}async _migrateOldDatabases(){var e=`lacertadb_${this.name}_consolidated`;if(!localStorage.getItem(e)){var t=Object.keys(this._metadata.collections||{});if(0!==t.length){let s=0;for(let a of t){let t=this.name+"_"+a;try{let e=await new Promise((e,i)=>{let r=indexedDB.open(t,1);r.onerror=()=>e(null),r.onsuccess=()=>e(r.result),r.onupgradeneeded=t=>{0===t.oldVersion&&(t.target.transaction.abort(),e(null))}});if(e)if(e.objectStoreNames.contains("documents")){var i=await new Promise((t,i)=>{let r=e.transaction("documents","readonly").objectStore("documents").getAll();r.onsuccess=()=>t(r.result||[]),r.onerror=()=>t([])});if(e.close(),0!==i.length){await this._ensureStore(a);var r=new kt;let e=i.map(e=>({type:"put",data:e}));await r.performTransaction(this._db,[a],"readwrite",t=>{let i=t.objectStore(a);return t=e.map(e=>new Promise((t,r)=>{var s=i.put(e.data);s.onsuccess=()=>t(),s.onerror=()=>t()})),Promise.all(t)}),await new Promise(e=>{var i=indexedDB.deleteDatabase(t);i.onsuccess=e,i.onerror=e,i.onblocked=e}),s++}}else e.close();else indexedDB.deleteDatabase(t)}catch(e){console.warn(`[LacertaDB] Migration of '${a}' failed:`,e.message)}}0<s&&console.log(`[LacertaDB] Migrated ${s} collections to consolidated database`)}localStorage.setItem(e,"1")}}listCollections(){return Object.keys(this._metadata.collections)}getStats(){return{name:this.name,totalSizeKB:this._metadata.totalSizeKB,totalDocuments:this._metadata.totalLength,collections:Object.entries(this._metadata.collections).map(([e,t])=>({name:e,sizeKB:t.sizeKB,documents:t.length,createdAt:new Date(t.createdAt).toISOString(),modifiedAt:new Date(t.modifiedAt).toISOString()}))}}updateSettings(e){this._settings.updateSettings(e)}async export(e="json",t=null){var i,r,s,a={version:"0.11.1",database:this.name,timestamp:Date.now(),collections:{}};for(i of this.listCollections()){var n=await this.getCollection(i);a.collections[i]=await n.getAll()}if("json"===e)return s=this._serializer.serialize(a),this._base64.encode(s);if("encrypted"===e&&t)return s=new pt,r=this._serializer.serialize(a),s=await s.encrypt(r,t),this._base64.encode(s);throw new ht("Unsupported export format: "+e,"INVALID_FORMAT")}async import(e,t="json",i=null){let r;try{var s,a=this._base64.decode(e);r="encrypted"===t&&i?(s=await(new pt).decrypt(a,i),this._serializer.deserialize(s)):this._serializer.deserialize(a)}catch(e){throw new ht("Failed to parse import data","IMPORT_PARSE_FAILED",e)}for(var n in r.collections){var o=r.collections[n];let t;try{t=await this.createCollection(n)}catch(e){if("COLLECTION_EXISTS"!==e.code)throw e;t=await this.getCollection(n)}await t.batchAdd(o)}return e=Object.values(r.collections).reduce((e,t)=>e+t.length,0),{collections:Object.keys(r.collections).length,documents:e}}async clearAll(){await Promise.all([...this._collections.keys()].map(e=>this.dropCollection(e))),this._collections.clear(),this._metadata&&this._metadata.destroy(),this._metadata=new Dt(this.name,{},this._serializer,this._base64),this._metadata.save(),this._quickStore.clear()}async destroy(){for(var e of this._collections.values())e.initialized&&(await e.clear({force:!0}),e.destroy());this._collections.clear(),this._db&&(this._db.close(),this._db=null),this._quickStore&&this._quickStore.destroy(),this._metadata&&this._metadata.destroy(),this._encryption&&this._encryption.destroy(),this._metadata=null,this._settings=null,this._quickStore=null,this._performanceMonitor=null}}class Pt{constructor(e={}){this._databases=new Map,this._performanceMonitor=new Tt,e={...st,...e.turboSerial||{}},this._serializer=new class{constructor(e={}){this.options={compression:e.compression||!1,deduplication:!1!==e.deduplication,shareArrayBuffers:!1!==e.shareArrayBuffers,simdOptimization:!1!==e.simdOptimization,detectCircular:!1!==e.detectCircular,allowFunction:e.allowFunction||!1,serializeFunctions:e.serializeFunctions||!1,preservePropertyDescriptors:!1!==e.preservePropertyDescriptors,memoryPoolSize:e.memoryPoolSize||65536,...e},this.options.allowFunction||(this.options.serializeFunctions=!1),this.pool=new Ze(this.options.memoryPoolSize),this.detector=new tt({allowFunction:this.options.allowFunction}),this.simdProcessor=new et,this.refs=new Map,this.circularRefs=new Set,this.strings=new Map,this.buffers=new Map,this.encoder=new TextEncoder,this.decoder=new TextDecoder}serialize(e){return this.resetState(),this.pool.writeU32(1413632565),this.pool.writeU8(5),this.options.detectCircular&&this.detectCircularReferences(e,new WeakSet),this.writeValue(e),this.pool.getResult()}resetState(){this.pool.reset(),this.refs.clear(),this.circularRefs.clear(),this.strings.clear(),this.buffers.clear()}resetMemory(e={}){return this.pool.resetMemory({shrink:e.shrink||!1,initialSize:this.options.memoryPoolSize,zero:!1!==e.zero}),this.refs.clear(),this.circularRefs.clear(),this.strings.clear(),this.buffers.clear(),this.deserializeRefs&&(this.deserializeRefs.length=0,this.deserializeRefs=null),this.deserializeStrings&&(this.deserializeStrings.length=0,this.deserializeStrings=null),this.deserializeBuffers&&(this.deserializeBuffers.length=0,this.deserializeBuffers=null),this.buffer=null,this.view=null,e.recreateDetector&&(this.detector=new tt({allowFunction:this.options.allowFunction}),this.simdProcessor=new et),this}detectCircularReferences(e,t){if("object"==typeof e&&null!=e)if(t.has(e))this.circularRefs.add(e);else{t.add(e);try{if(Array.isArray(e))for(let i=0;i<e.length;i++)i in e&&this.detectCircularReferences(e[i],t);else if(e instanceof Map)for(var[i,r]of e)this.detectCircularReferences(i,t),this.detectCircularReferences(r,t);else if(e instanceof Set)for(var s of e)this.detectCircularReferences(s,t);else for(var a in e)if(e.hasOwnProperty(a))try{this.detectCircularReferences(e[a],t)}catch(i){}}finally{t.delete(e)}}}writeValue(e){if(this.options.detectCircular&&"object"==typeof e&&null!=e&&this.circularRefs.has(e)){if(void 0!==(t=this.refs.get(e)))return this.pool.writeU8(Oe),void this.pool.writeVarint(t);this.refs.set(e,this.refs.size)}if(this.options.deduplication&&"object"==typeof e&&null!=e&&!this.circularRefs.has(e)){if(void 0!==(t=this.refs.get(e)))return this.pool.writeU8(Fe),void this.pool.writeVarint(t);this.refs.set(e,this.refs.size)}if(this.options.deduplication&&"string"==typeof e&&3<e.length){if(void 0!==(t=this.strings.get(e)))return this.pool.writeU8(H),void this.pool.writeVarint(t);this.strings.set(e,this.strings.size)}if(this.options.shareArrayBuffers&&e instanceof ArrayBuffer){if(void 0!==(t=this.buffers.get(e)))return this.pool.writeU8(ve),void this.pool.writeVarint(t);this.buffers.set(e,this.buffers.size)}var t,i=this.detector.detect(e);switch(t=(this.pool.writeU8(i),i&s)){case a:break;case n:this.writeNumber(e,i);break;case o:this.writeBigInt(e,i);break;case h:this.writeString(e,i);break;case l:this.writeArray(e,i);break;case c:this.writeObject(e,i);break;case d:this.writeTypedArray(e,i);break;case u:this.writeArrayBuffer(e,i);break;case _:this.writeCollection(e,i);break;case f:this.writeDate(e,i);break;case p:this.writeError(e,i);break;case y:this.writeRegExp(e);break;case w:this.writeBinary(e,i);break;case m:this.writeSpecial(e,i);break;case g:this.writeExtension(e,i)}}writeNumber(e,t){switch(t){case x:this.pool.writeU8(e);break;case k:this.pool.writeI16(e);break;case z:this.pool.writeI32(e);break;case I:this.pool.writeU32(e);break;case D:this.pool.writeF32(e);break;case E:this.pool.writeF64(e);break;case B:var i=e<0;this.pool.writeVarint(Math.abs(e)),this.pool.writeU8(i?1:0)}}writeBigInt(e,t){switch(t){case V:case P:this.pool.writeBigInt64(e);break;case L:case F:this.writeLargeBigInt(e)}}writeLargeBigInt(e){var t,i=BigInt(e).toString(16).replace("-",""),r=[];for(let e=i.length-2;0<=e;e-=2)r.push(parseInt(i.substr(e,2),16));for(t of(i.length%2&&r.push(parseInt(i[0],16)),this.pool.writeVarint(r.length),r))this.pool.writeU8(t)}writeString(e,t){var i=e.length;switch(t){case O:break;case K:case N:this.pool.writeU8(i);for(let t=0;t<i;t++)this.pool.writeU8(e.charCodeAt(t));break;case R:this.pool.writeVarint(i);for(let t=0;t<i;t++)this.pool.writeU8(e.charCodeAt(t));break;case $:case j:case q:var r=this.encoder.encode(e);t==$||t==j?this.pool.writeU8(r.length):this.pool.writeVarint(r.length),this.pool.writeBulkAligned(r,1)}}writeArray(e,t){var i=e.length;switch(t){case W:break;case G:this.pool.writeVarint(i);for(let t=0;t<i;t++)this.writeValue(e[t]);break;case X:this.writeSparseArray(e);break;case Q:case J:case Y:case Z:case ee:this.pool.writePackedArray(e,t)}}writeSparseArray(e){var t=e.length,i=new Uint32Array(t),r=[];let s=0;for(let a=0;a<t;a++)a in e&&(i[s]=a,r[s]=e[a],s++);this.pool.writeVarint(t),this.pool.writeVarint(s);for(let e=0;e<s;e++)this.pool.writeVarint(i[e]),this.writeValue(r[e])}writeObject(e,t){if(t!=te)switch(t){case re:case ie:this.writeSimpleObject(e);break;case ae:this.writeObjectWithDescriptors(e);break;case ne:this.writeObjectWithMethods(e);break;case se:this.writeConstructorObject(e)}}writeSimpleObject(e){var t,i=Object.keys(e).filter(t=>{try{return"function"!=typeof e[t]||this.options.serializeFunctions}catch(t){return!1}});for(t of(i.sort(),this.pool.writeVarint(i.length),i))this.writeValue(t),this.writeValue(e[t])}writeObjectWithDescriptors(e){var t,i=Object.getOwnPropertyNames(e),r=Object.getOwnPropertySymbols(e);i=[...i,...r].filter(t=>{try{var i=Object.getOwnPropertyDescriptor(e,t);return i&&(this.options.serializeFunctions||!i.get&&!i.set&&"function"!=typeof i.value)}catch(t){return!1}});for(t of(this.pool.writeVarint(i.length),i)){this.writeValue(t);var s=Object.getOwnPropertyDescriptor(e,t);let i=0;s.enumerable&&(i|=1),s.writable&&(i|=2),s.configurable&&(i|=4),s.get&&(i|=8),s.set&&(i|=16),this.pool.writeU8(i),s.get||s.set?(s.get&&this.writeValue(s.get),s.set&&this.writeValue(s.set)):this.writeValue(s.value)}}writeObjectWithMethods(e){var t,i,r,s,a=[];for(t of Object.keys(e))try{var n=e[t];"function"==typeof n?this.options.serializeFunctions?a.push([t,n,!0]):a.push([t,null,!1]):a.push([t,n,!1])}catch(e){}for([i,r,s]of(this.pool.writeVarint(a.length),a))this.writeValue(i),this.pool.writeU8(s?1:0),s&&this.options.serializeFunctions?(this.writeValue(r.toString()),this.writeValue(r.name||"")):s?this.pool.writeU8(je):this.writeValue(r)}writeConstructorObject(e){this.writeValue(e.constructor.name||"");var t,i=Object.keys(e).filter(t=>{try{return"function"!=typeof e[t]||this.options.serializeFunctions}catch(t){return!1}});for(t of(this.pool.writeVarint(i.length),i))this.writeValue(t),this.writeValue(e[t])}writeTypedArray(e,t){var i=e.buffer,r=e.byteOffset,s=e.length;if(this.options.shareArrayBuffers){if(void 0!==(a=this.buffers.get(i)))return this.pool.writeU8(1),this.pool.writeVarint(a),this.pool.writeVarint(r),void this.pool.writeVarint(s);this.buffers.set(i,this.buffers.size)}this.pool.writeU8(0),this.pool.writeVarint(r),this.pool.writeVarint(s);var a,n=s*(a=He[t]||1);if(t==ye||t==we)for(let t=0;t<s;t++)this.pool.writeBigInt64(e[t]);else t=new Uint8Array(i,r,n),this.pool.writeBulkAligned(t,a)}writeArrayBuffer(e,t){e=new Uint8Array(e),this.pool.writeVarint(e.length),this.pool.writeBulkAligned(e,1)}writeCollection(e,t){switch(t){case Se:for(var[i,r]of(this.pool.writeVarint(e.size),e))this.writeValue(i),this.writeValue(r);break;case Ae:for(var s of(this.pool.writeVarint(e.size),e))this.writeValue(s)}}writeDate(e,t){t==xe&&this.pool.writeF64(e.getTime())}writeError(e,t){if(this.writeValue(e.message||""),this.writeValue(e.stack||""),t==Te&&e.errors)for(var i of(this.pool.writeVarint(e.errors.length),e.errors))this.writeValue(i)}writeRegExp(e){this.writeValue(e.source),this.writeValue(e.flags)}writeBinary(e,t){this.pool.writeVarint(0),this.pool.writeVarint(0)}writeSpecial(e,t){switch(t){case Ke:var i=e.description;this.writeValue(i);break;case $e:break;case Ne:i=Symbol.keyFor(e),this.writeValue(i||"");break;case Re:i=We.get(e),this.writeValue(i||"")}}writeExtension(e,t){}deserialize(e){if(this.buffer=new Uint8Array(e),this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset),this.pos=0,this.deserializeRefs=[],this.deserializeStrings=[],this.deserializeBuffers=[],1413632565!==this.readU32())throw new Error("Invalid TurboSerial data");if(5!==(e=this.readU8()))throw new Error("Unsupported version: "+e);return this.readValue()}readValue(){if(this.pos>=this.buffer.length)throw new Error("Unexpected end of buffer");var e=this.readU8();if(e==Fe||e==Oe){var t=this.readVarint();if(t>=this.deserializeRefs.length)throw new Error("Invalid reference: "+t);return this.deserializeRefs[t]}if(e==H){if((t=this.readVarint())>=this.deserializeStrings.length)throw new Error("Invalid string reference: "+t);return this.deserializeStrings[t]}if(e==ve){if((t=this.readVarint())>=this.deserializeBuffers.length)throw new Error("Invalid buffer reference: "+t);return this.deserializeBuffers[t]}let i,r=!1;switch(t=e&s){case c:case l:case _:r=!0}if(r){switch(t){case l:i=[];break;case _:e==Se?i=new Map:e==Ae&&(i=new Set);break;case c:i={}}switch(i&&this.deserializeRefs.push(i),t){case l:this.fillArray(i,e);break;case c:this.fillObject(i,e);break;case _:this.fillCollection(i,e)}}else{switch(t){case a:i=this.readPrimitive(e);break;case n:i=this.readNumber(e);break;case o:i=this.readBigInt(e);break;case h:i=this.readString(e);break;case d:i=this.readTypedArray(e);break;case u:i=this.readArrayBuffer(e);break;case f:i=this.readDate(e);break;case p:i=this.readError(e);break;case y:i=this.readRegExp();break;case w:i=this.readBinary(e);break;case m:i=this.readSpecial(e);break;case g:i=this.readExtension(e);break;default:throw new Error("Unknown type: 0x"+e.toString(16))}"object"!=typeof i||null==i||r||this.deserializeRefs.push(i)}return i}fillArray(e,t){switch(t){case W:break;case G:var i=this.readVarint();for(let t=0;t<i;t++)e[t]=this.readValue();break;case X:var r=this.readVarint(),s=this.readVarint();e.length=r;for(let t=0;t<s;t++)e[this.readVarint()]=this.readValue();break;case Q:case J:case Y:case Z:case ee:r=this.readPackedArrayData(t),e.push(...r)}}fillObject(e,t){if(t!=te)switch(t){case re:case ie:this.fillSimpleObject(e);break;case ae:this.fillObjectWithDescriptors(e);break;case ne:this.fillObjectWithMethods(e);break;case se:this.fillConstructorObject(e)}}fillSimpleObject(e){var t=this.readVarint();for(let i=0;i<t;i++)e[this.readValue()]=this.readValue()}fillObjectWithDescriptors(e){var t=this.readVarint();for(let n=0;n<t;n++){var i=this.readValue(),r={enumerable:!!(1&(a=this.readU8())),writable:!!(2&a),configurable:!!(4&a)},s=!!(8&a),a=!!(16&a);s||a?(s&&(r.get=this.readValue()),a&&(r.set=this.readValue())):r.value=this.readValue(),Object.defineProperty(e,i,r)}}fillObjectWithMethods(e){var t=this.readVarint();for(let s=0;s<t;s++){var i=this.readValue();if(this.readU8())if(this.options.allowFunction&&this.options.serializeFunctions){var r=this.readValue();this.readValue();try{e[i]=new Function("return "+r)()}catch(t){e[i]=function(){throw new Error("Function deserialization failed")}}}else this.options.serializeFunctions?(this.readValue(),this.readValue(),e[i]=void 0):this.readU8()===je&&(e[i]=this.options.allowFunction?function(){throw new Error("Function not serialized")}:void 0);else e[i]=this.readValue()}}fillConstructorObject(e){var t=this.readValue(),i=this.readVarint();for(let t=0;t<i;t++)e[this.readValue()]=this.readValue();Object.defineProperty(e,"__constructorName",{value:t,enumerable:!1,writable:!1,configurable:!0})}fillCollection(e,t){var i=this.readVarint();switch(t){case Se:for(let t=0;t<i;t++){var r=this.readValue(),s=this.readValue();e.set(r,s)}break;case Ae:for(let t=0;t<i;t++)e.add(this.readValue())}}readPrimitive(e){switch(e){case v:return null;case b:return;case S:return!1;case A:return!0;default:throw new Error("Unknown primitive: 0x"+e.toString(16))}}readNumber(e){switch(e){case x:return this.view.getInt8(this.pos++);case k:return this.readI16();case z:return this.readI32();case I:return this.readU32();case D:return this.readF32();case E:return this.readF64();case C:return NaN;case U:return 1/0;case M:return-1/0;case T:return-0;case B:var t=this.readVarint();return this.readU8()?-t:t;default:throw new Error("Unknown number type: 0x"+e.toString(16))}}readBigInt(e){switch(e){case V:case P:return this.readBigInt64();case L:case F:return this.readLargeBigInt(e==F);default:throw new Error("Unknown BigInt type: 0x"+e.toString(16))}}readLargeBigInt(e){var t=this.readVarint(),i=(this.ensureBytes(t),this.buffer.subarray(this.pos,this.pos+t));this.pos+=t;let r="";for(let e=i.length-1;0<=e;e--)r+=i[e].toString(16).padStart(2,"0");return t=BigInt("0x"+r),e?-t:t}readString(e){if(e==O)return"";let t,i;switch(e){case K:case N:case $:case j:t=this.readU8();break;default:t=this.readVarint()}if(this.ensureBytes(t),e==K||e==N||e==R){i="";for(let e=0;e<t;e++)i+=String.fromCharCode(this.readU8())}else e=this.buffer.subarray(this.pos,this.pos+t),this.pos+=t,i=this.decoder.decode(e);return this.deserializeStrings.push(i),i}readPackedArrayData(e){var t=this.readVarint(),i=new Array(t),r=He[e];if(!r)throw new Error("Unknown packed array type: 0x"+e.toString(16));switch(this.alignPos(Math.min(r,8)),this.ensureBytes(t*r),e){case Q:for(let e=0;e<t;e++)i[e]=this.view.getInt8(this.pos++);break;case J:for(let e=0;e<t;e++)i[e]=this.view.getInt16(this.pos,!0),this.pos+=2;break;case Y:for(let e=0;e<t;e++)i[e]=this.view.getInt32(this.pos,!0),this.pos+=4;break;case Z:for(let e=0;e<t;e++)i[e]=this.view.getFloat32(this.pos,!0),this.pos+=4;break;case ee:for(let e=0;e<t;e++)i[e]=this.view.getFloat64(this.pos,!0),this.pos+=8}return i}readTypedArray(e){if(this.readU8()){var t=this.readVarint(),i=this.readVarint(),r=this.readVarint();if(t>=this.deserializeBuffers.length)throw new Error("Invalid buffer reference: "+t);return t=this.deserializeBuffers[t],this.createTypedArray(e,t,i,r)}this.readVarint();var s=this.readVarint();t=He[e]||1;if(e!=ye&&e!=we)return i=s*t,this.alignPos(t),this.ensureBytes(i),r=this.buffer.subarray(this.pos,this.pos+i),this.pos+=i,t=new ArrayBuffer(i),new Uint8Array(t).set(r),this.deserializeBuffers.push(t),this.createTypedArray(e,t,0,s);this.alignPos(8);var a=[];for(let e=0;e<s;e++)a.push(this.readBigInt64());return new(e==ye?BigInt64Array:BigUint64Array)(a)}createTypedArray(e,t,i,r){var s={[oe]:Uint8Array,[he]:Int8Array,[le]:Uint8ClampedArray,[ce]:Uint16Array,[de]:Int16Array,[ue]:Uint32Array,[_e]:Int32Array,[fe]:Float32Array,[pe]:Float64Array,[ye]:BigInt64Array,[we]:BigUint64Array,[me]:DataView}[e];if(s)return new s(t,i,r);throw new Error("Unknown typed array type: 0x"+e.toString(16))}readArrayBuffer(e){var t=this.readVarint(),i=(this.ensureBytes(t),this.buffer.subarray(this.pos,this.pos+t));this.pos+=t,t=i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength);return this.deserializeBuffers.push(t),t}readDate(e){switch(e){case xe:return new Date(this.readF64());case ke:return new Date(NaN);default:throw new Error("Unknown date type: 0x"+e.toString(16))}}readError(e){var t=this.readValue(),i=this.readValue();let r;var s={[ze]:Error,[Ie]:EvalError,[De]:RangeError,[Ee]:ReferenceError,[Ce]:SyntaxError,[Ue]:TypeError,[Me]:URIError}[e]||Error;if(e==Te){var a=this.readVarint(),n=[];for(let e=0;e<a;e++)n.push(this.readValue());r=new AggregateError(n,t)}else r=new s(t);return i&&(r.stack=i),r}readRegExp(){var e=this.readValue(),t=this.readValue();return new RegExp(e,t)}readBinary(e){return{_type:"Binary",size:this.readVarint(),typeStr:this.readVarint()}}readSpecial(e){switch(e){case Ke:var t=this.readValue();return Symbol(t);case $e:return Symbol();case Ne:return t=this.readValue(),Symbol.for(t);case Re:return t=this.readValue(),Ge.get(t)||Symbol(t);default:throw new Error("Unknown special type: 0x"+e.toString(16))}}readExtension(e){if(e!==je)throw new Error("Unknown extension type: 0x"+e.toString(16));return this.options.allowFunction?function(){throw new Error("Function not serialized")}:void 0}readU8(){return this.ensureBytes(1),this.buffer[this.pos++]}readI16(){this.alignPos(2),this.ensureBytes(2);var e=this.view.getInt16(this.pos,!0);return this.pos+=2,e}readU16(){this.alignPos(2),this.ensureBytes(2);var e=this.view.getUint16(this.pos,!0);return this.pos+=2,e}readI32(){this.alignPos(4),this.ensureBytes(4);var e=this.view.getInt32(this.pos,!0);return this.pos+=4,e}readU32(){this.alignPos(4),this.ensureBytes(4);var e=this.view.getUint32(this.pos,!0);return this.pos+=4,e}readF32(){this.alignPos(4),this.ensureBytes(4);var e=this.view.getFloat32(this.pos,!0);return this.pos+=4,e}readF64(){this.alignPos(8),this.ensureBytes(8);var e=this.view.getFloat64(this.pos,!0);return this.pos+=8,e}readBigInt64(){this.alignPos(8),this.ensureBytes(8);var e=this.view.getBigInt64(this.pos,!0);return this.pos+=8,e}readVarint(){let e=0,t=0;for(var i;this.ensureBytes(1),e|=(127&(i=this.buffer[this.pos++]))<<t,t+=7,128&i;);return e>>>0}alignPos(e){e=e-1|0,this.pos=(this.pos+e&~e)>>>0}ensureBytes(e){if(this.pos+e>this.buffer.length)throw new Error(`Buffer underflow: need ${e}, available `+(this.buffer.length-this.pos))}}(e),this._base64=new rt.a}get performanceMonitor(){return this._performanceMonitor}get serializer(){return this._serializer}get base64(){return this._base64}async getDatabase(e,t={}){var i;return this._databases.has(e)||(await(i=new Vt(e,this._performanceMonitor,this._serializer,this._base64)).init(t),this._databases.set(e,i)),this._databases.get(e)}async getSecureDatabase(e,t,i=null,r={}){return this.getDatabase(e,{pin:t,salt:i,encryptionConfig:r})}async dropDatabase(e){var t;this._databases.has(e)&&(await(t=this._databases.get(e)).clearAll(),t.destroy(),this._databases.delete(e)),["metadata","settings","version","encryption","idb_version","idb_stores","consolidated"].forEach(t=>{localStorage.removeItem(`lacertadb_${e}_`+t)}),new at(e,this._serializer,this._base64).clear();var i=[];for(let t=0;t<localStorage.length;t++){var r=localStorage.key(t);r&&r.startsWith(`lacertadb_${e}_`)&&i.push(r)}i.forEach(e=>localStorage.removeItem(e)),await new Promise(t=>{var i=indexedDB.deleteDatabase("lacertadb_"+e);i.onsuccess=t,i.onerror=t,i.onblocked=t})}listDatabases(){var e=new Set;for(let i=0;i<localStorage.length;i++){var t=localStorage.key(i);t&&t.startsWith("lacertadb_")&&(t=t.match(/^lacertadb_([^_]+)_(metadata|settings|version|encryption|quickstore)$/))&&e.add(t[1])}return[...e]}async createBackup(e=null){var t,i={version:"0.11.1",timestamp:Date.now(),databases:{}};for(t of this.listDatabases()){var r=await(await this.getDatabase(t)).export("json");r=this._base64.decode(r);i.databases[t]=this._serializer.deserialize(r)}var s=this._serializer.serialize(i);return e?(e=await(new pt).encrypt(s,e),this._base64.encode(e)):this._base64.encode(s)}async restoreBackup(e,t=null){let i;try{var r,s=this._base64.decode(e);i=t?(r=await(new pt).decrypt(s,t),this._serializer.deserialize(r)):this._serializer.deserialize(s)}catch(e){throw new ht("Failed to parse backup data","BACKUP_PARSE_FAILED",e)}var a,n,o={databases:0,collections:0,documents:0};for([a,n]of Object.entries(i.databases)){var h=await this.getDatabase(a),l=this._base64.encode(this._serializer.serialize(n));h=await h.import(l);o.databases++,o.collections+=h.collections,o.documents+=h.documents}return o}close(){for(var e of this._databases.values())e._db&&(e._db.close(),e._db=null)}destroy(){for(var e of this._databases.values())e.destroy();this._databases.clear()}}},function(e,t,i){i.r(t),t=i(1),"undefined"!=typeof window?window.LACERTA=t:self.LACERTA=t}]);
|