@pixagram/lacerta-db 0.12.4 → 0.12.5
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 +1 -1
- package/dist/index.min.js +1 -1
- package/index.js +7 -1
- package/package.json +1 -1
package/dist/browser.min.js
CHANGED
|
@@ -6,4 +6,4 @@
|
|
|
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 Pe={compression:!1,preservePropertyDescriptors:!1,deduplication:!1,simdOptimization:!0,detectCircular:!1,shareArrayBuffers:!1,allowFunction:!1,serializeFunctions:!1,memoryPoolSize:262144};class Fe{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 s=this._keyPrefix+"data_"+t,r=localStorage.getItem(s);if(r)try{var a=this._base64.decode(r);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,s=this._keyPrefix+"data_"+e,r=this._docs.get(e);void 0!==r?(t=this._serializer.serialize(r),i=this._base64.encode(t),localStorage.setItem(s,i)):localStorage.removeItem(s)}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=>lt.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 Ke{constructor(){this._connections=new Map,this._refCounts=new Map}async getConnection(e,t=1,i){let s=e+"_v"+t;var r;return this._connections.has(s)?(this._refCounts.set(s,(this._refCounts.get(s)||0)+1),this._connections.get(s)):((r=await new Promise((s,r)=>{let a=indexedDB.open(e,t);a.onerror=()=>r(new $e("Failed to open database","DATABASE_OPEN_FAILED",a.error)),a.onsuccess=()=>s(a.result),a.onupgradeneeded=e=>{i&&i(e.target.result,e.oldVersion,e.newVersion)}})).onclose=()=>{this._connections.delete(s),this._refCounts.delete(s)},this._connections.set(s,r),this._refCounts.set(s,1),r)}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 Ke;class Oe{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 $e 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 Re{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 Ne{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,s=(this._frequencies.set(e,i),this._buckets.get(t));return s&&(s.delete(e),0===s.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 qe{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 je{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 qe(i):new("lfu"===e?Ne:Re)(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 He{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(),s=new Uint8Array(i.byteLength+1);return s[0]=1,s.set(new Uint8Array(i),1),s}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 s=new Response(i).body.pipeThrough(new DecompressionStream("deflate")),r=await new Response(s).arrayBuffer();return new Uint8Array(r)}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 Ge=new He;class We{async encrypt(e,t){var i=new TextEncoder,s=crypto.getRandomValues(new Uint8Array(16)),r=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:s,iterations:6e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"]),t=await crypto.subtle.encrypt({name:"AES-GCM",iv:r},i,e);return(i=new Uint8Array(s.length+r.length+t.byteLength)).set(s,0),i.set(r,s.length),i.set(new Uint8Array(t),s.length+r.length),i}async decrypt(e,t){var i=new TextEncoder,s=e.slice(0,16),r=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:s,iterations:6e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"]),s=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},i,e);return new Uint8Array(s)}}class Xe{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),s=(t=this._base64.decode(t.wrappedKey)).slice(0,12);t=t.slice(12);try{var r=await crypto.subtle.decrypt({name:"AES-GCM",iv:s},i,t);await this._importMasterKeys(r)}catch(e){throw new Error("Invalid PIN or corrupted key data")}}else this._salt=crypto.getRandomValues(new Uint8Array(this._saltLength)),s=await this._deriveKEK(e,this._salt),i=crypto.getRandomValues(new Uint8Array(64)),await this._importMasterKeys(i.buffer),t=crypto.getRandomValues(new Uint8Array(12)),r=await crypto.subtle.encrypt({name:"AES-GCM",iv:t},s,i),(e=new Uint8Array(12+r.byteLength)).set(t,0),e.set(new Uint8Array(r),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=(s=this._base64.decode(this._wrappedKeyBlob)).slice(0,12),s=s.slice(12);try{await crypto.subtle.decrypt({name:"AES-GCM",iv:i},e,s)}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),s=await this._exportMasterKeys(),t=crypto.getRandomValues(new Uint8Array(12)),e=await crypto.subtle.encrypt({name:"AES-GCM",iv:t},e,s),(s=new Uint8Array(12+e.byteLength)).set(t,0),s.set(new Uint8Array(e),12),this._salt=i,this._wrappedKeyBlob=this._base64.encode(s),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),s=((s=new Uint8Array(e.length+i.byteLength)).set(e,0),s.set(new Uint8Array(i),e.length),await crypto.subtle.sign("HMAC",this._hmacKey,s)),r=new Uint8Array(e.length+i.byteLength+32);return r.set(e,0),r.set(new Uint8Array(i),e.length),r.set(new Uint8Array(s),e.length+i.byteLength),r}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),s=(e=e.slice(12,-32),new Uint8Array(t.length+e.length));if(i=(s.set(t,0),s.set(e,t.length),await crypto.subtle.verify("HMAC",this._hmacKey,i,s)))return s=await crypto.subtle.decrypt({name:"AES-GCM",iv:t},this._masterKey,e),new Uint8Array(s);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=(s=new TextEncoder).encode(t);let i;i="string"==typeof e?s.encode(e):e instanceof Uint8Array?e:this._serializer.serialize(e);var s=crypto.getRandomValues(new Uint8Array(12)),r=(e=await crypto.subtle.encrypt({name:"AES-GCM",iv:s,additionalData:t,tagLength:128},this._masterKey,i),new Uint32Array([t.length])),a=new Uint8Array(16+t.length+e.byteLength);return a.set(s,0),a.set(new Uint8Array(r.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),s=e.slice(12,16),r=(s=new Uint32Array(s.buffer)[0],e.slice(16,16+s));e=e.slice(16+s),s=(new TextEncoder).encode(t);if(this._arrayEquals(r,s))return t=await crypto.subtle.decrypt({name:"AES-GCM",iv:i,additionalData:r,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 s=0;s<e.length;s++)i|=e[s]^t[s];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 Qe{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:s}=this.boundary,i=i/2,s=s/2;this.northeast=new Qe({x:e+i,y:t-s,w:i,h:s},this.capacity),this.northwest=new Qe({x:e-i,y:t-s,w:i,h:s},this.capacity),this.southeast=new Qe({x:e+i,y:t+s,w:i,h:s},this.capacity),this.southwest=new Qe({x:e-i,y:t+s,w:i,h:s},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 Je(e,t){var i,s;return e===t?0:(i=typeof e)==(s=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<s?-1:1}class Ye{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<Je(e,this.keys[t]);)t++;return t<this.n&&0===Je(e,this.keys[t])?this.values[t]:!this.leaf&&this.children[t]?this.children[t].search(e):null}rangeSearch(e,t,i,s=!1,r=!1){let a=0;if(null!==e)for(;a<this.n&&Je(this.keys[a],e)<0;)a++;for(;a<this.n;a++){if(null!==t){var n=Je(this.keys[a],t);if(r?0<=n:0<n)return void(!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,s,r))}!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,s,r);n=null===e?1:Je(this.keys[a],e);var o=null===t?-1:Je(this.keys[a],t);(null===e||(s?0<n:0<=n))&&(null===t||(r?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,s,r)}insertNonFull(e,t){let i=this.n-1;if(this.leaf){for(;0<=i&&0<Je(this.keys[i],e);)this.keys[i+1]=this.keys[i],this.values[i+1]=this.values[i],i--;0<=i&&0===Je(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<Je(this.keys[i],e);)i--;if(0<=i&&0===Je(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 s=Je(this.keys[i],e);if(0===s)return this.values[i]||(this.values[i]=new Set),void this.values[i].add(t);s<0&&i++}this.children[i]&&this.children[i].insertNonFull(e,t)}}}splitChild(e,t){var i=new Ye(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 s=t.keys[this.order-1],r=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]=s,this.values[e]=r,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],s=this.order;t.keys[s-1]=this.keys[e],t.values[s-1]=this.values[e];for(let e=0;e<i.n;e++)t.keys[s+e]=i.keys[e],t.values[s+e]=i.values[e];if(!t.leaf)for(let e=0;e<=i.n;e++)t.children[s+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,s=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(s,null,!0))}_remove(e,t,i){let s=0;for(;s<this.n&&0<Je(e,this.keys[s]);)s++;var r;if(s<this.n&&0===Je(e,this.keys[s])){let e=i;return!e&&this.values[s]&&(this.values[s].delete(t),e=0===this.values[s].size),!!e&&(this.leaf?this._removeFromLeaf(s):this._removeFromInternal(s),!0)}return!this.leaf&&(r=s===this.n,this.children[s]&&this.children[s].n<this.order&&this._fill(s),r&&s>this.n?!!this.children[s-1]&&this.children[s-1]._remove(e,t,i):!!this.children[s]&&this.children[s]._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++)Je(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 Ze{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 Ye(this._order,!1)).children[0]=this._root,i.splitChild(0,this._root);let r=0;var s=Je(i.keys[0],e);0===s?(i.values[0]||(i.values[0]=new Set),i.values[0].add(t)):(s<0&&r++,i.children[r].insertNonFull(e,t)),this._root=i}else this._root.insertNonFull(e,t);else this._root=new Ye(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,s=!1){return this._root?(this._root.rangeSearch(e,t,e=[],i,s),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 Ze(t);for(let t=0;t<e.length;t++){var[s,r]=e[t];if(null!=s)for(let e=0;e<r.length;e++)i.insert(s,r[e])}return i}}class et{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 s=this._invertedIndex.get(i);s&&(s.delete(e),0===s.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 tt{constructor(){this._tree=new Qe({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,s=t/111,r=(s={x:e.lng,y:e.lat,w:s,h:s},[]);for(i of this._tree.query(s)){var a=this._haversine(e,{lat:i.y,lng:i.x});a<=t&&r.push({docId:i.data,distance:a})}return r.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),s=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(s/2)*Math.sin(s/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 it{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 s=null;for(;;){var r,a,n=await this._collection._indexedDB.getBatch(this._collection._db,this._collection._storeName,s,200);if(0===n.length)break;for(r of n)if("string"==typeof r._id&&r._id.startsWith(it.IDX_PREFIX))s=r._id;else{s=r._id;let e=r;r.packedData&&(await(a=new at(r,{compressed:r._compressed,encrypted:r._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,s=""+it.IDX_PREFIX+e,r=await this._collection._indexedDB.get(this._collection._db,this._collection._storeName,s);return!!(r&&r._entries&&Array.isArray(r._entries))&&((i=Ze.fromSortedEntries(r._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 Ze)try{var i={_id:""+it.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 Ze;case"hash":return new Map;case"text":return new et;case"geo":return new tt;default:return new Map}}_addToIndex(e,t,i,s){switch(s){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[s,r]of this._indexes){var a,n=this._indexData.get(s);if(n){let o=t?this._getFieldValue(t,r.fieldPath):void 0,h=i?this._getFieldValue(i,r.fieldPath):void 0;if(r.hashed&&(o=o&&await this._hashVal(o),h=h&&await this._hashVal(h)),o!==h){switch(r.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"===r.type&&this._schedulePersist(s)}}}}async query(e,t){var i=this._indexes.get(e),s=this._indexData.get(e);if(i&&s)return i.hashed&&"object"!=typeof t&&(t=await this._hashVal(t)),this._queryIndex(s,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 s,r=void 0!==t.$gte,a=void 0!==t.$gt,n=void 0!==t.$lte,o=void 0!==t.$lt;return(r||a||n||o)&&(s=r?t.$gte:a?t.$gt:null,t=n?t.$lte:o?t.$lt:null,e.range(s,t,!r&&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 s of t.$in)(s=e.get(s))&&s.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=""+it.IDX_PREFIX+e,this._collection._indexedDB.delete(this._collection._db,this._collection._storeName,e).catch(()=>{})}_getFieldValue(e,t){var i;let s=e;for(i of t.split(".")){if(null==s)return;s=s[i]}return s}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 s,r,a=[];for([s,r]of this._indexes)"btree"===r.type&&await this._restoreIndex(s)||a.push(s);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 s=this._indexData.get(e);i[e]={...t,size:s&&(s.size||s.length)||0,memoryUsage:this._estimateMemoryUsage(s)}}return i}_estimateMemoryUsage(e){return e?e instanceof Map?100*e.size:e instanceof Ze?120*e.size:0:0}async verifyIndexes(){var e,t,i={};for([e,t]of this._indexes){var s=this._indexData.get(e);s?s.verify?((s=s.verify()).requiresRebuild&&(await this.rebuildIndex(e),s.rebuilt=!0),i[e]=s):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 st{async saveAttachments(e,t,i,s){try{var r,a,n=[],o=await(await(await(await navigator.storage.getDirectory()).getDirectoryHandle(e,{create:!0})).getDirectoryHandle(t,{create:!0})).getDirectoryHandle(i,{create:!0});for([r,a]of s.entries()){var h=r+"_"+(a.name||"file"),l=await(await o.getFileHandle(h,{create:!0})).createWritable();let s;if(a.data instanceof Uint8Array)s=a.data;else if(a.data instanceof ArrayBuffer)s=new Uint8Array(a.data);else{if(!(a.data instanceof Blob))throw new TypeError("Unsupported attachment data type");s=new Uint8Array(await a.data.arrayBuffer())}var c=new Blob([s],{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:s.byteLength,originalName:a.originalName||a.name})}return n}catch(s){throw new $e("Failed to save attachments","ATTACHMENT_SAVE_FAILED",s)}}async getAttachments(e){var t,i=[],s=await navigator.storage.getDirectory();for(t of e)try{var r=t.path.split("/").filter(e=>e);let e=s;for(let t=0;t<r.length-1;t++)e=await e.getDirectoryHandle(r[t]);var a=await(await(await e.getFileHandle(r[r.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 s=await e.arrayBuffer();i=new Uint8Array(s)}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 rt{constructor(){this._mutex=new Oe}async performTransaction(e,t,i,s,r=3){return"readonly"===i?this._runTx(e,t,i,s,r):this._mutex.runExclusive(()=>this._runTx(e,t,i,s,r))}async _runTx(e,t,i,s,r){let a;for(let n=0;n<r;n++)try{return await new Promise((r,a)=>{let n,o=e.transaction(t,i);o.oncomplete=()=>r(n),o.onerror=()=>a(o.error),o.onabort=()=>a(new Error("Transaction aborted"));try{var h=s(o);h instanceof Promise?h.then(e=>{n=e}).catch(a):n=h}catch(r){a(r)}})}catch(e){a=e,n<r-1&&await new Promise(e=>setTimeout(e,2**n*100))}throw new $e("Transaction failed after retries","TRANSACTION_FAILED",a)}_promisifyRequest(e){return new Promise((t,i)=>{let s=e();s.onsuccess=()=>t(s.result),s.onerror=()=>i(s.error),s.onabort=()=>i(new DOMException("Request aborted","AbortError"))})}async getBatch(e,t,i,s){return this.performTransaction(e,[t],"readonly",e=>{let r,a=e.objectStore(t);return null!=i&&(r=IDBKeyRange.lowerBound(i,!0)),this._promisifyRequest(()=>a.getAll(r,s))})}add(e,t,i,s){return this.performTransaction(e,[t],"readwrite",e=>{let r=e.objectStore(t);return this._promisifyRequest(()=>void 0!==s?r.add(i,s):r.add(i))})}put(e,t,i,s){return this.performTransaction(e,[t],"readwrite",e=>{let r=e.objectStore(t);return this._promisifyRequest(()=>void 0!==s?r.put(i,s):r.put(i))})}get(e,t,i){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).get(i)))}getAll(e,t,i,s){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).getAll(i,s)))}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 s=e.objectStore(i);return e=t.map(e=>{try{switch(e.type){case"add":return this._promisifyRequest(()=>s.add(e.data)).then(e=>({success:!0,result:e}));case"put":return this._promisifyRequest(()=>s.put(e.data)).then(e=>({success:!0,result:e}));case"delete":return this._promisifyRequest(()=>s.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 at{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=Ge,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 $e("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 $e("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 nt{constructor(e,t={},i,s,r){this.name=e,this._serializer=i,this._base64=s,this._dbName=r,this._storageKey=r?`lacertadb_${r}_${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,s=0){this._docSizes.set(e,t),this._docModified.set(e,Date.now()),this._docPermanent.set(e,i),this._docAttachments.set(e,s),this.sizeKB+=t,this.length++,this.modifiedAt=Date.now(),this._scheduleSave()}updateDocument(e,t,i=!1,s=0){var r=this._docSizes.get(e)||0;this.sizeKB=this.sizeKB-r+t,this._docSizes.set(e,t),this._docModified.set(e,Date.now()),this._docPermanent.set(e,i),this._docAttachments.set(e,s),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,s=[];for([t,i]of this._docModified)this._docPermanent.get(t)||s.push({id:t,modified:i});return s.sort((e,t)=>e.modified-t.modified),s.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 s={sizeKB:this.sizeKB,length:this.length,createdAt:this.createdAt,modifiedAt:this.modifiedAt},r=this._serializer.serialize(s),a=this._base64.encode(r);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,s){var r=localStorage.getItem(`lacertadb_${e}_${t}_collmeta`);if(r)try{var a=s.decode(r),n=i.deserialize(a);return new nt(t,n,i,s,e)}catch(e){console.warn("CollectionMetadata corrupted, resetting:",e)}return new nt(t,{},i,s,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 ot{constructor(e,t={},i,s){this.name=e,this._serializer=i,this._base64=s,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 s=localStorage.getItem(`lacertadb_${e}_metadata`);if(s)try{var r=i.decode(s),a=t.deserialize(r);return new ot(e,a,t,i)}catch(e){console.error("Failed to load metadata:",e)}return new ot(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),s=this._base64.encode(i);localStorage.setItem(e,s),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 ht{constructor(e,t={},i,s){this.dbName=e,this._serializer=i,this._base64=s,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 s=localStorage.getItem(`lacertadb_${e}_settings`);if(s)try{var r=i.decode(s),a=t.deserialize(r);return new ht(e,a,t,i)}catch(e){console.error("Failed to load settings:",e)}return new ht(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),s=this._base64.encode(i);localStorage.setItem(e,s)}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 lt=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 s=t[i];if(i.startsWith("$")){var r=this.operators[i];if(!r||!r(e,s))return!1}else{var a=this.getFieldValue(e,i);if("object"!=typeof s||null===s||Array.isArray(s)){if(a!==s)return!1}else for(var n in s)if(n.startsWith("$")){var o=this.operators[n];if(!o||!o(a,s[n]))return!1}}}return!0}getFieldValue(e,t){let i=e;for(var s of t.split(".")){if(null==i)return;i=i[s]}return i}};let ct=new class{constructor(){this.stages={$match:(e,t)=>e.filter(e=>lt.evaluate(e,t)),$project:(e,t)=>e.map(e=>{var i,s={};for(i in t){var r=t[i];1===r||!0===r?s[i]=lt.getFieldValue(e,i):"string"==typeof r&&r.startsWith("$")&&(s[i]=lt.getFieldValue(e,r.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 s}),$sort:(e,t)=>[...e].sort((e,i)=>{for(var s in t){var r=t[s],a=lt.getFieldValue(e,s);if(a<(s=lt.getFieldValue(i,s)))return-r;if(s<a)return r}return 0}),$limit:(e,t)=>e.slice(0,t),$skip:(e,t)=>e.slice(t),$group:(e,t)=>{var i,s=new Map,r=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 lt.getFieldValue(e,t.substring(1));if(null===t||"object"!=typeof t||Array.isArray(t))return t;var i,s={};for(i in t)s[i]=n(e,t[i]);return s};for(i of e){let e;e="string"==typeof r?r.startsWith("$")?lt.getFieldValue(i,r.substring(1)):r:null!==r&&"object"==typeof r?a(n(i,r)):r,s.has(e)||s.set(e,{_id:e,docs:[]}),s.get(e).docs.push(i)}var o,h=[];for(o of s.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+(lt.getFieldValue(i,e)||0),0);break;case"$avg":var _=o.docs.reduce((t,i)=>t+(lt.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=>lt.getFieldValue(t,e)));break;case"$min":c[l]=Math.min(...o.docs.map(t=>lt.getFieldValue(t,e)))}}h.push(c)}return h},$lookup:async(e,t,i)=>{i=await(await i.getCollection(t.from)).getAll();let s=new Map;return i.forEach(e=>{var i=lt.getFieldValue(e,t.foreignField);s.has(i)||s.set(i,[]),s.get(i).push(e)}),e.map(e=>{var i=lt.getFieldValue(e,t.localField);return{...e,[t.as]:s.get(i)||[]}})}}}async execute(e,t,i){let s=e;for(var r of t){var a=Object.keys(r)[0],n=(r=r[a],this.stages[a]);if(!n)throw new Error("Unknown aggregation stage: "+a);s="$lookup"===a?await n(s,r,i):n(s,r)}return s}};class dt{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),s=t.split(".").map(Number),r=Math.max(i.length,s.length);for(let e=0;e<r;e++){var a=i[e]||0,n=s[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 s,r=await this.database.getCollection(i);for(s of await r.getAll()){var a=await e[t](s);a&&await r.update(s._id,a)}}}}class ut{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),s=(s=0<this._metrics.memoryUsage.length?this._metrics.memoryUsage[this._metrics.memoryUsage.length-1]:null)?s.used/1048576:0;return{opsPerSec:e,avgLatency:t.toFixed(2),cacheHitRate:i.toFixed(1),memoryUsageMB:s.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 _t{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 rt,this._opfs=new st,this._cleanupInterval=null,this._events=new Map,this._indexManager=new it(this),this._cacheStrategy=new je({type:"lru",maxSize:100,ttl:6e4,enabled:!0}),this._docCache=new Re(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=nt.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 $e("Document-level encryption requires database-level encryption. Use getSecureDatabase() to create an encrypted database.","ENCRYPTION_NOT_INITIALIZED");await this._trigger("beforeAdd",e);e=new at({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?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,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,s;if((this._initialized||await this.init(),!t.includeAttachments)&&(s=this._docCache.get(e)))return s;if(s=await this._indexedDB.get(this._db,this._storeName,e))return i=new at(s,{encrypted:s._encrypted,compressed:s._compressed},this._serializer),s.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),s=i.objectOutput(t.includeAttachments),t.includeAttachments||this._docCache.set(e,s),s;throw new $e(`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(it.IDX_PREFIX))),Promise.all(e.map(async e=>{try{var t=new at(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 s,r,a=await this._indexedDB.get(this._db,this._storeName,e);if(a)return r=new at(a,{},this._serializer),a.packedData&&await r.unpack(this.database.encryption),s=r.objectOutput(),r={...r.data,...t},(t=new at({_id:e,_created:a._created,data:r},{compressed:void 0!==i.compressed?i.compressed:a._compressed,permanent:void 0!==i.permanent?i.permanent:a._permanent},this._serializer))._modified=Date.now(),(r=i.attachments)&&0<r.length?(await this._opfs.deleteAttachments(this.database.name,this.name,e),i=await Promise.all(r.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),r=t.databaseOutput(),await this._indexedDB.put(this._db,this._storeName,r),i=t.objectOutput(),await this._indexManager.updateIndexForDocument(t._id,s,i),a=r.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 $e(`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 $e("Document not found for deletion","DOCUMENT_NOT_FOUND");if(i._permanent&&!t.force)throw new $e("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,s,r=performance.now(),a=JSON.stringify({f:e,o:t},(e,t)=>{if(!t||"object"!=typeof t||Array.isArray(t))return t;var i,s={};for(i of Object.keys(t).sort())s[i]=t[i];return s}),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,s]of this._indexManager.indexes){var l=e[s.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=>lt.evaluate(t,e)))),t.sort&&(o=ct.stages.$sort(o,t.sort)),t.skip&&(o=ct.stages.$skip(o,t.skip)),t.limit&&(o=ct.stages.$limit(o,t.limit)),t.projection&&(o=ct.stages.$project(o,t.projection)),this._performanceMonitor&&this._performanceMonitor.recordOperation(h?"indexed-query":"full-scan-query",performance.now()-r),this._cacheStrategy.set(a,o),o}async aggregate(e){this._initialized||await this.init();var t=performance.now();let i,s=e;return 0<e.length&&e[0].$match?(i=await this.query(e[0].$match),s=e.slice(1)):i=await this.getAll(),e=await ct.execute(i,s,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(),s=[];let r=[];var a,n=!this.database.encryption&&!t.compressed;for(a of e){var o=new at({data:a},{compressed:t.compressed||!1,permanent:t.permanent||!1},this._serializer);n?o.packSync():await o.pack(this.database.encryption),s.push({type:"add",data:o.databaseOutput()}),r.push(o)}var h,l,c,d=await this._indexedDB.batchOperation(this._db,s,this._storeName);for(let e=0;e<r.length;e++)d[e].success&&(l=(h=r[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:r[t]._id}))}async batchUpdate(e,t={}){this._initialized||await this.init();var i=performance.now(),s=[],r=[];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 at(_,{},this._serializer),_.packedData&&await u.unpack(this.database.encryption),r.push(u.objectOutput()),u={...u.data,...o.data},(u=new at({_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),s.push({type:"put",data:u.databaseOutput()})):h.push({success:!1,id:o.id,error:"Document not found"})}if(0===s.length)return h;var f,p,y,m=await this._indexedDB.batchOperation(this._db,s,this._storeName);for(let e=0;e<a.length;e++)m[e].success&&(p=(f=a[e]).objectOutput(),await this._indexManager.updateIndexForDocument(f._id,r[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),[...m.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 s=[];var r,a,n=[];for({id:r,options:a}of e){var o,h=await this._indexedDB.get(this._db,this._storeName,r);h?h._permanent&&!a.force?n.push({success:!1,id:r,error:"Cannot delete permanent document without force flag"}):(o=await this.get(r),s.push({id:r,fullDoc:o,stored:h}),i.push({type:"delete",key:r})):n.push({success:!1,id:r,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<s.length;e++)u[e].success&&(({id:l,fullDoc:c,stored:d}=s[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:s[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 nt(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 ft{constructor(e,t,i,s){this.name=e,this._collections=new Map,this._metadata=null,this._settings=null,this._quickStore=null,this._performanceMonitor=t,this._serializer=i,this._base64=s,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,s)=>{let r=indexedDB.open("lacertadb_"+this.name,e);r.onerror=()=>s(new $e("Failed to open database","DATABASE_OPEN_FAILED",r.error)),r.onsuccess=()=>i(r.result),r.onupgradeneeded=e=>{var i,s=e.target.result;for(i of t)s.objectStoreNames.contains(i)||s.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=ot.load(this.name,this._serializer,this._base64),this._settings=ht.load(this.name,this._serializer,this._base64),this._quickStore=new Fe(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 s=`lacertadb_${this.name}_encryption`;let r=null;var a=((a=localStorage.getItem(s))&&(a=this._base64.decode(a),r=this._serializer.deserialize(a)),this._encryption=new Xe(i,this._serializer,this._base64),await this._encryption.initialize(e,r));r||(i=this._serializer.serialize(a),e=this._base64.encode(i),localStorage.setItem(s,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 s=await this.getCollection("__private_keys__").catch(()=>null);return await(s=s||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 $e(`Collection '${e}' already exists.`,"COLLECTION_EXISTS");await this._ensureStore(e);var i=new _t(e,this);return this._collections.set(e,i),this._metadata.collections[e]||this._metadata.setCollection(new nt(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 _t(e,this),this._collections.set(e,t),await t.init(),t;throw new $e(`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 _t(e,this),this._collections.set(e,t),this._metadata.collections[e]||this._metadata.setCollection(new nt(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 rt).clear(this._db,e)}catch(e){}let i=this.name+"_"+e;try{await new Promise((e,t)=>{var s=indexedDB.deleteDatabase(i);s.onsuccess=e,s.onerror=e,s.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 r=0;for(let a of t){let t=this.name+"_"+a;try{let e=await new Promise((e,i)=>{let s=indexedDB.open(t,1);s.onerror=()=>e(null),s.onsuccess=()=>e(s.result),s.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 s=e.transaction("documents","readonly").objectStore("documents").getAll();s.onsuccess=()=>t(s.result||[]),s.onerror=()=>t([])});if(e.close(),0!==i.length){await this._ensureStore(a);var s=new rt;let e=i.map(e=>({type:"put",data:e}));await s.performTransaction(this._db,[a],"readwrite",t=>{let i=t.objectStore(a);return t=e.map(e=>new Promise((t,s)=>{var r=i.put(e.data);r.onsuccess=()=>t(),r.onerror=()=>t()})),Promise.all(t)}),await new Promise(e=>{var i=indexedDB.deleteDatabase(t);i.onsuccess=e,i.onerror=e,i.onblocked=e}),r++}}else e.close();else indexedDB.deleteDatabase(t)}catch(e){console.warn(`[LacertaDB] Migration of '${a}' failed:`,e.message)}}0<r&&console.log(`[LacertaDB] Migrated ${r} 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,s,r,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 r=this._serializer.serialize(a),this._base64.encode(r);if("encrypted"===e&&t)return r=new We,s=this._serializer.serialize(a),r=await r.encrypt(s,t),this._base64.encode(r);throw new $e("Unsupported export format: "+e,"INVALID_FORMAT")}async import(e,t="json",i=null){let s;try{var r,a=this._base64.decode(e);s="encrypted"===t&&i?(r=await(new We).decrypt(a,i),this._serializer.deserialize(r)):this._serializer.deserialize(a)}catch(e){throw new $e("Failed to parse import data","IMPORT_PARSE_FAILED",e)}for(var n in s.collections){var o=s.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(s.collections).reduce((e,t)=>e+t.length,0),{collections:Object.keys(s.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 ot(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 ut,e={...Pe,...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,sortKeys:e.sortKeys||!1,memoryPoolSize:e.memoryPoolSize||65536,...e},this.options.allowFunction||(this.options.serializeFunctions=!1),e=Math.max(this.options.memoryPoolSize,65536),this.buf=new Uint8Array(e),this.dv=new DataView(this.buf.buffer),this.pos=0,this.enc=new TextEncoder,this.dec=new TextDecoder,this.refs=new Map,this.circularRefs=new Set,this.strings=new Map,this.buffers=new Map,this.deserializeRefs=null,this.deserializeStrings=null,this.deserializeBuffers=null,this.buffer=null,this.view=null}_grow(e){var t=this.pos+e;if(!(t<=this.buf.length)){let i=this.buf.length;for(;i<t;)i<<=1;(e=new Uint8Array(i)).set(this.buf.subarray(0,this.pos)),this.buf=e,this.dv=new DataView(e.buffer)}}serialize(e){return this.resetState(),this._grow(5),this.dv.setUint32(0,Ve,!0),this.buf[4]=6,this.pos=5,this.options.detectCircular&&this.detectCircularReferences(e,new WeakSet),this.writeValue(e),this.buf.slice(0,this.pos)}deserialize(e){if(this.buffer=e instanceof Uint8Array?e:new Uint8Array(e),this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength),this.pos=0,this.deserializeRefs=[],this.deserializeStrings=[],this.deserializeBuffers=[],this.view.getUint32(0,!0)!==Ve)throw new Error("Invalid TurboSerial data");if(6!==this.buffer[4])throw new Error("Unsupported version: "+this.buffer[4]);return this.pos=5,this.readValue()}resetState(){this.pos=0,this.refs.clear(),this.circularRefs.clear(),this.strings.clear(),this.buffers.clear()}resetMemory(e={}){return e=e.shrink?Math.max(this.options.memoryPoolSize||65536,256):this.buf.length,this.buf=new Uint8Array(e),this.dv=new DataView(this.buf.buffer),this.pos=0,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}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,s=e.length;i<s;i++)i in e&&this.detectCircularReferences(e[i],t);else if(e instanceof Map)for(var[i,s]of e)this.detectCircularReferences(i,t),this.detectCircularReferences(s,t);else if(e instanceof Set)for(var r of e)this.detectCircularReferences(r,t);else{var a=Object.keys(e);for(let s=0;s<a.length;s++)try{this.detectCircularReferences(e[a[s]],t)}catch(i){}}}finally{t.delete(e)}}}_wV(e){var t=this.buf;let i=this.pos;if((e>>>=0)<128)t[i]=e,this.pos=i+1;else if(e<16384)t[i]=127&e|128,t[i+1]=e>>>7,this.pos=i+2;else{for(;128<=e;)t[i++]=127&e|128,e>>>=7;t[i++]=e,this.pos=i}}writeValue(e){if(null===e)this._grow(1),this.buf[this.pos++]=0;else if(void 0===e)this._grow(1),this.buf[this.pos++]=1;else{var t=typeof e;if("boolean"==t)this._grow(1),this.buf[this.pos++]=e?3:2;else if("number"==t)this._wNum(e);else if("string"==t)this._wStrDedup(e);else if("bigint"==t)this._wBigInt(e);else if("symbol"==t)this._grow(2),void 0!==(i=Symbol.keyFor(e))?(this.buf[this.pos++]=we,this.writeValue(i)):n.has(e)?(this.buf[this.pos++]=ge,this.writeValue(n.get(e))):void 0===e.description?this.buf[this.pos++]=ve:(this.buf[this.pos++]=me,this.writeValue(e.description));else if("function"==t)this._grow(1),this.buf[this.pos++]=this.options.allowFunction?be:c;else{if(this.options.detectCircular&&this.circularRefs.has(e)){var i=this.refs.get(e);if(void 0!==i)return this._grow(6),this.buf[this.pos++]=ye,void this._wV(i);this.refs.set(e,this.refs.size)}if(this.options.deduplication&&!this.circularRefs.has(e)){if(void 0!==(t=this.refs.get(e)))return this._grow(6),this.buf[this.pos++]=pe,void this._wV(t);this.refs.set(e,this.refs.size)}if(this.options.shareArrayBuffers&&e instanceof ArrayBuffer){if(void 0!==(i=this.buffers.get(e)))return this._grow(6),this.buf[this.pos++]=J,void this._wV(i);this.buffers.set(e,this.buffers.size)}this._wObj(e)}}}_wStrDedup(e){if(this.options.deduplication&&3<e.length){var t=this.strings.get(e);if(void 0!==t)return this._grow(6),this.buf[this.pos++]=U,void this._wV(t);this.strings.set(e,this.strings.size)}this._wStr(e)}_wNum(e){this._grow(10);var t,i=this.pos;e!=e?(this.buf[i]=m,this.pos=i+1):e===1/0?(this.buf[i]=w,this.pos=i+1):e===-1/0?(this.buf[i]=g,this.pos=i+1):0===e&&1/e<0?(this.buf[i]=v,this.pos=i+1):e===(t=0|e)?-128<=t&&t<=127?(this.buf[i]=d,this.buf[i+1]=255&t,this.pos=i+2):-32768<=t&&t<=32767?(this.buf[i]=u,this.dv.setInt16(i+1,t,!0),this.pos=i+3):(this.buf[i]=_,this.dv.setInt32(i+1,t,!0),this.pos=i+5):e===(t=e>>>0)?(this.buf[i]=f,this.dv.setUint32(i+1,t,!0),this.pos=i+5):(a[0]=e,a[0]===e?(this.buf[i]=p,this.dv.setFloat32(i+1,e,!0),this.pos=i+5):(this.buf[i]=y,this.dv.setFloat64(i+1,e,!0),this.pos=i+9))}_wBigInt(e){this._grow(10);var t=e<0n,i=t?-e:e;if(i<=0x7fffffffffffffffn)this.buf[this.pos++]=t?A:S,this.dv.setBigInt64(this.pos,e,!0),this.pos+=8;else{this.buf[this.pos++]=t?z:x;let s=i.toString(16);e=(s=1&s.length?"0"+s:s).length>>>1,this._grow(5+e),this._wV(e);for(let e=s.length-2;0<=e;e-=2)this.buf[this.pos++]=parseInt(s.substr(e,2),16);s.length%2&&(this.buf[this.pos++]=parseInt(s[0],16))}}_wStr(e){var t=e.length;if(0===t)this._grow(1),this.buf[this.pos++]=I;else if(t<128){let s=1;for(let i=0;i<t;i++)if(127<e.charCodeAt(i)){s=0;break}if(s){this._grow(t+2);var i=this.pos;this.buf[i++]=t<16?k:D,this.buf[i++]=t;for(let s=0;s<t;s++)this.buf[i+s]=e.charCodeAt(s);return void(this.pos=i+t)}let r=this.enc.encode(e),a=r.length,n=(this._grow(a+7),this.pos);this.buf[n++]=a<16?C:a<256?T:M,a<256?this.buf[n++]=a:(this.pos=n,this._wV(a),n=this.pos),this.buf.set(r,n),this.pos=n+a}else{let i=this.enc.encode(e),s=i.length,r=(this._grow(s+7),this.pos);s===t?(this.buf[r++]=t<256?D:E,t<256?this.buf[r++]=t:(this.pos=r,this._wV(t),r=this.pos)):(this.buf[r++]=s<256?T:M,s<256?this.buf[r++]=s:(this.pos=r,this._wV(s),r=this.pos)),this.buf.set(i,r),this.pos=r+s}}_wObj(e){if(Array.isArray(e))this._wArr(e);else{var t=e.constructor;if(void 0!==(t=ke.get(t))){if(t===te)return this._grow(9),void((a=e.getTime())!=a?this.buf[this.pos++]=ie:(this.buf[this.pos++]=te,this.dv.setFloat64(this.pos,a,!0),this.pos+=8));if(t===ue)return this._grow(1),this.buf[this.pos++]=ue,this.writeValue(e.source),void this.writeValue(e.flags);if(t===Z){for(var[i,s]of(this._grow(6),this.buf[this.pos++]=Z,this._wV(e.size),e))this.writeValue(i),this.writeValue(s);return}if(t===ee){for(var r of(this._grow(6),this.buf[this.pos++]=ee,this._wV(e.size),e))this.writeValue(r);return}if(t===Q||t===Y)return this._grow(6),this.buf[this.pos++]=t,a=new Uint8Array(e),this._wV(a.length),this._grow(a.length),this.buf.set(a,this.pos),void(this.pos+=a.length);if(96==(240&t))return void this._wTypedArr(e,t)}if(e instanceof Error){this._grow(2);var a=Ue.get(e.constructor.name)||de;if(this.buf[this.pos++]=a,this.writeValue(e.message||""),this.writeValue(e.stack||""),a===ce&&e.errors)for(var n of(this._wV(e.errors.length),e.errors))this.writeValue(n)}else"undefined"!=typeof Blob&&e instanceof Blob?(this._grow(12),this.buf[this.pos++]=e instanceof File?fe:_e,this._wV(0),this._wV(0)):this._wPlainObj(e)}}_wArr(e){var t=e.length;if(0===t)this._grow(1),this.buf[this.pos++]=V;else{let a=!1;for(let i=0;i<t;i++)if(!(i in e)){a=!0;break}if(a){this._grow(12),this.buf[this.pos++]=L,this._wV(t);var i,s=[];for(let i=0;i<t;i++)i in e&&s.push(i);for(i of(this._wV(s.length),s))this._wV(i),this.writeValue(e[i])}else{if(this.options.simdOptimization&&8<=t&&"number"==typeof e[0]){var r=this._detectPacked(e,t);if(r)return this._grow(6),this.buf[this.pos++]=r,void this._wPacked(e,t,r)}this._grow(6),this.buf[this.pos++]=B,this._wV(t);for(let i=0;i<t;i++)this.writeValue(e[i])}}}_detectPacked(e,t){let i=1,s=e[0],r=e[0],n=1;for(let h=0;h<t;h++){var o=e[h];if("number"!=typeof o)return 0;o!==(0|o)&&(i=0),o<s&&(s=o),o>r&&(r=o),n&&(a[0]=o,a[0]!==o)&&(n=0)}var h;return i?(h=Math.max(Math.abs(s),Math.abs(r)))<=127?P:h<=32767?F:K:n?O:$}_wPacked(e,t,i){this.dv,this._wV(t);var s=Se[i]||1;this._grow(t*s);let r=this.pos;switch(i){case P:for(let i=0;i<t;i++)this.buf[r++]=255&e[i];break;case F:for(let i=0;i<t;i++)this.dv.setInt16(r,e[i],!0),r+=2;break;case K:for(let i=0;i<t;i++)this.dv.setInt32(r,e[i],!0),r+=4;break;case O:for(let i=0;i<t;i++)this.dv.setFloat32(r,e[i],!0),r+=4;break;case $:for(let i=0;i<t;i++)this.dv.setFloat64(r,e[i],!0),r+=8}this.pos=r}_wTypedArr(e,t){this._grow(12),this.buf[this.pos++]=t;var i=e.buffer;if(this.options.shareArrayBuffers){var s=this.buffers.get(i);if(void 0!==s)return this.buf[this.pos++]=1,this._wV(s),this._wV(e.byteOffset),void this._wV(e.length);this.buffers.set(i,this.buffers.size)}if(this.buf[this.pos++]=0,this._wV(e.byteOffset),this._wV(e.length),s=Se[t]||1,t===W||t===X){this._grow(8*e.length);for(let t=0;t<e.length;t++)this.dv.setBigInt64(this.pos,e[t],!0),this.pos+=8}else t=e.length*s,this._grow(t),s=new Uint8Array(i,e.byteOffset,t),this.buf.set(s,this.pos),this.pos+=t}_wPlainObj(e){var t=Object.getPrototypeOf(e),i=(t=e.constructor===Object||t===Object.prototype||null===t,Object.keys(e));if(0===i.length&&t)this._grow(1),this.buf[this.pos++]=R;else if(t){if(this.options.preservePropertyDescriptors){var s;t=[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)];let i=!1;for(s of t){var r=Object.getOwnPropertyDescriptor(e,s);if(r.get||r.set||!r.enumerable||!r.writable||!r.configurable){i=!0;break}}if(i)return void this._wDescriptorObj(e,t)}let n=!1;if(this.options.allowFunction)for(let t=0;t<i.length;t++)if("function"==typeof e[i[t]]){n=!0;break}if(n)this._wMethodObj(e,i);else{this._grow(6),this.buf[this.pos++]=q,this.options.sortKeys&&i.sort();let t=i.length;if(!this.options.serializeFunctions)for(let s=t=0;s<i.length;s++)"function"!=typeof e[i[s]]&&t++;this._wV(t);for(let t=0;t<i.length;t++){var a=e[i[t]];!this.options.serializeFunctions&&"function"==typeof a||(this.writeValue(i[t]),this.writeValue(a))}}}else this._wConstructorObj(e,i)}_wDescriptorObj(e,t){this._grow(6),this.buf[this.pos++]=H;var i;t=t.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(i of(this._wV(t.length),t)){this.writeValue(i);var s=Object.getOwnPropertyDescriptor(e,i);let t=0;s.enumerable&&(t|=1),s.writable&&(t|=2),s.configurable&&(t|=4),s.get&&(t|=8),s.set&&(t|=16),this._grow(1),this.buf[this.pos++]=t,s.get||s.set?(s.get&&this.writeValue(s.get),s.set&&this.writeValue(s.set)):this.writeValue(s.value)}}_wMethodObj(e,t){this._grow(6),this.buf[this.pos++]=G;var i,s,r,a,n=[];for(i of t)try{var o=e[i];n.push([i,o,"function"==typeof o])}catch(e){}for([s,r,a]of(this._wV(n.length),n))this.writeValue(s),this._grow(1),this.buf[this.pos++]=a?1:0,a&&this.options.serializeFunctions?(this.writeValue(r.toString()),this.writeValue(r.name||"")):a?(this._grow(1),this.buf[this.pos++]=be):this.writeValue(r)}_wConstructorObj(e,t){this._grow(6),this.buf[this.pos++]=j,this.writeValue((null==(s=e.constructor)?void 0:s.name)||"");var i,s=this.options.serializeFunctions?t:t.filter(t=>{try{return"function"!=typeof e[t]}catch(t){return!1}});for(i of(this._wV(s.length),s))this.writeValue(i),this.writeValue(e[i])}readValue(){this.buffer;var e=this.buf[this.pos++];if(e===pe||e===ye)return this.deserializeRefs[this._rV()];if(e===U)return this.deserializeStrings[this._rV()];if(e===J)return this.deserializeBuffers[this._rV()];var t,i=240&e;if(0==i)return 0===e?null:1===e?void 0:3===e;if(16==i)return this._rNum(e);if(32==i)return this._rBigInt(e);if(48==i)return this._rStr(e);if(64==i||80==i||128==i){let t;return t=64==i?[]:128==i?new(e===Z?Map:Set):{},this.deserializeRefs.push(t),this._rFill(t,e,i),t}if(96==i)return t=this._rTypedArr(e),this.deserializeRefs.push(t),t;if(112==i)return t=this._rArrayBuf(e),this.deserializeBuffers.push(t),t;if(144==i)return e===ie?new Date(NaN):(t=this.view.getFloat64(this.pos,!0),this.pos+=8,new Date(t));if(160==i)return this._rError(e);if(176==i)return new RegExp(this.readValue(),this.readValue());if(192==i)return this._rV(),this._rV(),{_type:"Binary"};if(224==i)return this._rSpecial(e);if(240==i)return this.options.allowFunction?function(){throw new Error("Function not serialized")}:void 0;throw new Error("Unknown type: 0x"+e.toString(16))}_rV(){this.buffer;let e=this.pos,t=this.buf[e++];if(!(128&t))return this.pos=e,t;let i=127&t,s=7;for(;t=this.buf[e++],i|=(127&t)<<s,s+=7,128&t;);return this.pos=e,i>>>0}_rFill(e,t,i){if(64===i){if(t!==V)if(t===B){var s=this._rV();for(let t=0;t<s;t++)e[t]=this.readValue()}else if(t===L){e.length=this._rV();var r=this._rV();for(let t=0;t<r;t++)e[this._rV()]=this.readValue()}else{var a=this._rPacked(t);for(let t=0;t<a.length;t++)e.push(a[t])}}else if(80===i)this.fillObject(e,t);else if(128===i){var n=this._rV();if(t===Z)for(let t=0;t<n;t++)e.set(this.readValue(),this.readValue());else for(let t=0;t<n;t++)e.add(this.readValue())}}fillObject(e,t){if(t!==R)if(t===q||t===N){var i=this._rV();for(let t=0;t<i;t++)e[this.readValue()]=this.readValue()}else if(t===H){var s=this._rV();for(let t=0;t<s;t++){var r=this.readValue(),a=this.buffer[this.pos++],n={enumerable:!!(1&a),writable:!!(2&a),configurable:!!(4&a)};8&a||16&a?(8&a&&(n.get=this.readValue()),16&a&&(n.set=this.readValue())):n.value=this.readValue(),Object.defineProperty(e,r,n)}}else if(t===G){var o=this._rV();for(let i=0;i<o;i++){var h=this.readValue();if(this.buffer[this.pos++])if(this.options.allowFunction&&this.options.serializeFunctions){var l=this.readValue();this.readValue();try{e[h]=new Function("return "+l)()}catch(t){e[h]=void 0}}else this.options.serializeFunctions?(this.readValue(),this.readValue(),e[h]=void 0):(this.pos++,e[h]=this.options.allowFunction?function(){throw new Error("Not serialized")}:void 0);else e[h]=this.readValue()}}else if(t===j){t=this.readValue();var c=this._rV();for(let t=0;t<c;t++)e[this.readValue()]=this.readValue();Object.defineProperty(e,"__constructorName",{value:t,enumerable:!1,writable:!1,configurable:!0})}}_rNum(e){this.view;let t,i=this.pos;switch(e){case d:return t=this.buffer[i]<<24>>24,this.pos=i+1,t;case u:return t=this.dv.getInt16(i,!0),this.pos=i+2,t;case _:return t=this.dv.getInt32(i,!0),this.pos=i+4,t;case f:return t=this.dv.getUint32(i,!0),this.pos=i+4,t;case p:return t=this.dv.getFloat32(i,!0),this.pos=i+4,t;case y:return t=this.dv.getFloat64(i,!0),this.pos=i+8,t;case m:return NaN;case w:return 1/0;case g:return-1/0;case v:return-0;case b:return t=this._rV(),this.buffer[this.pos++]?-t:t}}_rBigInt(e){if(e===S||e===A){let e=this.view.getBigInt64(this.pos,!0);return this.pos+=8,e}e=e===z;var t=this._rV();let i="";for(let e=t-1;0<=e;e--)i+=this.buffer[this.pos+e].toString(16).padStart(2,"0");this.pos+=t;let s=BigInt("0x"+(i||"0"));return e?-s:s}_rStr(e){if(e===I)return"";var t=this.buffer;let i,r;return i=e===k||e===D||e===C||e===T?this.buf[this.pos++]:this._rV(),r=(e=e===k||e===D||e===E)&&i<128?s[i](t,this.pos):this.dec.decode(t.subarray(this.pos,this.pos+i)),this.pos+=i,3<r.length&&this.deserializeStrings.push(r),r}_rPacked(e){var t=this._rV(),i=new Array(t);this.view;let s=this.pos;switch(e){case P:for(let e=0;e<t;e++)i[e]=this.buffer[s++]<<24>>24;break;case F:for(let e=0;e<t;e++)i[e]=this.dv.getInt16(s,!0),s+=2;break;case K:for(let e=0;e<t;e++)i[e]=this.dv.getInt32(s,!0),s+=4;break;case O:for(let e=0;e<t;e++)i[e]=this.dv.getFloat32(s,!0),s+=4;break;case $:for(let e=0;e<t;e++)i[e]=this.dv.getFloat64(s,!0),s+=8}return this.pos=s,i}_rTypedArr(e){if(this.buffer[this.pos++]){let t=this._rV(),i=this._rV(),s=this._rV();return new Ae[e](this.deserializeBuffers[t],i,s)}this._rV();let t=this._rV(),i=Se[e]||1;if(e===W||e===X){var s=[];for(let e=0;e<t;e++)s.push(this.view.getBigInt64(this.pos,!0)),this.pos+=8;return new Ae[e](s)}var r=t*i,a=new ArrayBuffer(r);return new Uint8Array(a).set(this.buffer.subarray(this.pos,this.pos+r)),this.pos+=r,this.deserializeBuffers.push(a),new Ae[e](a,0,t)}_rArrayBuf(e){var t=this._rV(),i=this.buffer.buffer.slice(this.buffer.byteOffset+this.pos,this.buffer.byteOffset+this.pos+t);return this.pos+=t,i}_rError(e){var t=this.readValue(),i=this.readValue();let s;if(e===ce){var r=this._rV(),a=[];for(let e=0;e<r;e++)a.push(this.readValue());s=new AggregateError(a,t)}else s=new(Me[e]||Error)(t);return i&&(s.stack=i),s}_rSpecial(e){if(e===me)return Symbol(this.readValue());if(e===ve)return Symbol();if(e===we)return Symbol.for(this.readValue());if(e===ge)return o.get(this.readValue())||Symbol();throw new Error("Unknown special type: 0x"+e.toString(16))}}(e),this._base64=new Le.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 ft(e,this._performanceMonitor,this._serializer,this._base64)).init(t),this._databases.set(e,i)),this._databases.get(e)}async getSecureDatabase(e,t,i=null,s={}){return this.getDatabase(e,{pin:t,salt:i,encryptionConfig:s})}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 Fe(e,this._serializer,this._base64).clear();var i=[];for(let t=0;t<localStorage.length;t++){var s=localStorage.key(t);s&&s.startsWith(`lacertadb_${e}_`)&&i.push(s)}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 s=await(await this.getDatabase(t)).export("json");s=this._base64.decode(s);i.databases[t]=this._serializer.deserialize(s)}var r=this._serializer.serialize(i);return e?(e=await(new We).encrypt(r,e),this._base64.encode(e)):this._base64.encode(r)}async restoreBackup(e,t=null){let i;try{var s,r=this._base64.decode(e);i=t?(s=await(new We).decrypt(r,t),this._serializer.deserialize(s)):this._serializer.deserialize(r)}catch(e){throw new $e("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}]);
|
|
9
|
+
"undefined"==typeof window||window.requestIdleCallback||(window.requestIdleCallback=function(e){return setTimeout(e,0)},window.cancelIdleCallback=clearTimeout);let Pe={compression:!1,preservePropertyDescriptors:!1,deduplication:!1,simdOptimization:!0,detectCircular:!1,shareArrayBuffers:!1,allowFunction:!1,serializeFunctions:!1,memoryPoolSize:262144};class Fe{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 s=this._keyPrefix+"data_"+t,r=localStorage.getItem(s);if(r)try{var a=this._base64.decode(r);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,s=this._keyPrefix+"data_"+e,r=this._docs.get(e);void 0!==r?(t=this._serializer.serialize(r),i=this._base64.encode(t),localStorage.setItem(s,i)):localStorage.removeItem(s)}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=>lt.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 Ke{constructor(){this._connections=new Map,this._refCounts=new Map}async getConnection(e,t=1,i){let s=e+"_v"+t;var r;return this._connections.has(s)?(this._refCounts.set(s,(this._refCounts.get(s)||0)+1),this._connections.get(s)):((r=await new Promise((s,r)=>{let a=indexedDB.open(e,t);a.onerror=()=>r(new $e("Failed to open database","DATABASE_OPEN_FAILED",a.error)),a.onsuccess=()=>s(a.result),a.onupgradeneeded=e=>{i&&i(e.target.result,e.oldVersion,e.newVersion)}})).onclose=()=>{this._connections.delete(s),this._refCounts.delete(s)},this._connections.set(s,r),this._refCounts.set(s,1),r)}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 Ke;class Oe{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 $e 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 Re{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 Ne{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,s=(this._frequencies.set(e,i),this._buckets.get(t));return s&&(s.delete(e),0===s.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 qe{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 je{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 qe(i):new("lfu"===e?Ne:Re)(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 He{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(),s=new Uint8Array(i.byteLength+1);return s[0]=1,s.set(new Uint8Array(i),1),s}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 s=new Response(i).body.pipeThrough(new DecompressionStream("deflate")),r=await new Response(s).arrayBuffer();return new Uint8Array(r)}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 Ge=new He;class We{async encrypt(e,t){var i=new TextEncoder,s=crypto.getRandomValues(new Uint8Array(16)),r=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:s,iterations:6e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"]),t=await crypto.subtle.encrypt({name:"AES-GCM",iv:r},i,e);return(i=new Uint8Array(s.length+r.length+t.byteLength)).set(s,0),i.set(r,s.length),i.set(new Uint8Array(t),s.length+r.length),i}async decrypt(e,t){var i=new TextEncoder,s=e.slice(0,16),r=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:s,iterations:6e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"]),s=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},i,e);return new Uint8Array(s)}}class Xe{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),s=(t=this._base64.decode(t.wrappedKey)).slice(0,12);t=t.slice(12);try{var r=await crypto.subtle.decrypt({name:"AES-GCM",iv:s},i,t);await this._importMasterKeys(r)}catch(e){throw new Error("Invalid PIN or corrupted key data")}}else this._salt=crypto.getRandomValues(new Uint8Array(this._saltLength)),s=await this._deriveKEK(e,this._salt),i=crypto.getRandomValues(new Uint8Array(64)),await this._importMasterKeys(i.buffer),t=crypto.getRandomValues(new Uint8Array(12)),r=await crypto.subtle.encrypt({name:"AES-GCM",iv:t},s,i),(e=new Uint8Array(12+r.byteLength)).set(t,0),e.set(new Uint8Array(r),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=(s=this._base64.decode(this._wrappedKeyBlob)).slice(0,12),s=s.slice(12);try{await crypto.subtle.decrypt({name:"AES-GCM",iv:i},e,s)}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),s=await this._exportMasterKeys(),t=crypto.getRandomValues(new Uint8Array(12)),e=await crypto.subtle.encrypt({name:"AES-GCM",iv:t},e,s),(s=new Uint8Array(12+e.byteLength)).set(t,0),s.set(new Uint8Array(e),12),this._salt=i,this._wrappedKeyBlob=this._base64.encode(s),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),s=((s=new Uint8Array(e.length+i.byteLength)).set(e,0),s.set(new Uint8Array(i),e.length),await crypto.subtle.sign("HMAC",this._hmacKey,s)),r=new Uint8Array(e.length+i.byteLength+32);return r.set(e,0),r.set(new Uint8Array(i),e.length),r.set(new Uint8Array(s),e.length+i.byteLength),r}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),s=(e=e.slice(12,-32),new Uint8Array(t.length+e.length));if(i=(s.set(t,0),s.set(e,t.length),await crypto.subtle.verify("HMAC",this._hmacKey,i,s)))return s=await crypto.subtle.decrypt({name:"AES-GCM",iv:t},this._masterKey,e),new Uint8Array(s);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=(s=new TextEncoder).encode(t);let i;i="string"==typeof e?s.encode(e):e instanceof Uint8Array?e:this._serializer.serialize(e);var s=crypto.getRandomValues(new Uint8Array(12)),r=(e=await crypto.subtle.encrypt({name:"AES-GCM",iv:s,additionalData:t,tagLength:128},this._masterKey,i),new Uint32Array([t.length])),a=new Uint8Array(16+t.length+e.byteLength);return a.set(s,0),a.set(new Uint8Array(r.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),s=e.slice(12,16),r=(s=new Uint32Array(s.buffer)[0],e.slice(16,16+s));e=e.slice(16+s),s=(new TextEncoder).encode(t);if(this._arrayEquals(r,s))return t=await crypto.subtle.decrypt({name:"AES-GCM",iv:i,additionalData:r,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 s=0;s<e.length;s++)i|=e[s]^t[s];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 Qe{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:s}=this.boundary,i=i/2,s=s/2;this.northeast=new Qe({x:e+i,y:t-s,w:i,h:s},this.capacity),this.northwest=new Qe({x:e-i,y:t-s,w:i,h:s},this.capacity),this.southeast=new Qe({x:e+i,y:t+s,w:i,h:s},this.capacity),this.southwest=new Qe({x:e-i,y:t+s,w:i,h:s},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 Je(e,t){var i,s;return e===t?0:(i=typeof e)==(s=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<s?-1:1}class Ye{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<Je(e,this.keys[t]);)t++;return t<this.n&&0===Je(e,this.keys[t])?this.values[t]:!this.leaf&&this.children[t]?this.children[t].search(e):null}rangeSearch(e,t,i,s=!1,r=!1){let a=0;if(null!==e)for(;a<this.n&&Je(this.keys[a],e)<0;)a++;for(;a<this.n;a++){if(null!==t){var n=Je(this.keys[a],t);if(r?0<=n:0<n)return void(!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,s,r))}!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,s,r);n=null===e?1:Je(this.keys[a],e);var o=null===t?-1:Je(this.keys[a],t);(null===e||(s?0<n:0<=n))&&(null===t||(r?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,s,r)}insertNonFull(e,t){let i=this.n-1;if(this.leaf){for(;0<=i&&0<Je(this.keys[i],e);)this.keys[i+1]=this.keys[i],this.values[i+1]=this.values[i],i--;0<=i&&0===Je(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<Je(this.keys[i],e);)i--;if(0<=i&&0===Je(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 s=Je(this.keys[i],e);if(0===s)return this.values[i]||(this.values[i]=new Set),void this.values[i].add(t);s<0&&i++}this.children[i]&&this.children[i].insertNonFull(e,t)}}}splitChild(e,t){var i=new Ye(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 s=t.keys[this.order-1],r=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]=s,this.values[e]=r,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],s=this.order;t.keys[s-1]=this.keys[e],t.values[s-1]=this.values[e];for(let e=0;e<i.n;e++)t.keys[s+e]=i.keys[e],t.values[s+e]=i.values[e];if(!t.leaf)for(let e=0;e<=i.n;e++)t.children[s+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,s=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(s,null,!0))}_remove(e,t,i){let s=0;for(;s<this.n&&0<Je(e,this.keys[s]);)s++;var r;if(s<this.n&&0===Je(e,this.keys[s])){let e=i;return!e&&this.values[s]&&(this.values[s].delete(t),e=0===this.values[s].size),!!e&&(this.leaf?this._removeFromLeaf(s):this._removeFromInternal(s),!0)}return!this.leaf&&(r=s===this.n,this.children[s]&&this.children[s].n<this.order&&this._fill(s),r&&s>this.n?!!this.children[s-1]&&this.children[s-1]._remove(e,t,i):!!this.children[s]&&this.children[s]._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++)Je(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 Ze{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 Ye(this._order,!1)).children[0]=this._root,i.splitChild(0,this._root);let r=0;var s=Je(i.keys[0],e);0===s?(i.values[0]||(i.values[0]=new Set),i.values[0].add(t)):(s<0&&r++,i.children[r].insertNonFull(e,t)),this._root=i}else this._root.insertNonFull(e,t);else this._root=new Ye(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,s=!1){return this._root?(this._root.rangeSearch(e,t,e=[],i,s),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 Ze(t);for(let t=0;t<e.length;t++){var[s,r]=e[t];if(null!=s)for(let e=0;e<r.length;e++)i.insert(s,r[e])}return i}}class et{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 s=this._invertedIndex.get(i);s&&(s.delete(e),0===s.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 tt{constructor(){this._tree=new Qe({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,s=t/111,r=(s={x:e.lng,y:e.lat,w:s,h:s},[]);for(i of this._tree.query(s)){var a=this._haversine(e,{lat:i.y,lng:i.x});a<=t&&r.push({docId:i.data,distance:a})}return r.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),s=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(s/2)*Math.sin(s/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 it{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 s=null;for(;;){var r,a,n=await this._collection._indexedDB.getBatch(this._collection._db,this._collection._storeName,s,200);if(0===n.length)break;for(r of n)if("string"==typeof r._id&&r._id.startsWith(it.IDX_PREFIX))s=r._id;else{s=r._id;let e=r;r.packedData&&(await(a=new at(r,{compressed:r._compressed,encrypted:r._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,s=""+it.IDX_PREFIX+e,r=await this._collection._indexedDB.get(this._collection._db,this._collection._storeName,s);return!!(r&&r._entries&&Array.isArray(r._entries))&&((i=Ze.fromSortedEntries(r._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 Ze)try{var i={_id:""+it.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 Ze;case"hash":return new Map;case"text":return new et;case"geo":return new tt;default:return new Map}}_addToIndex(e,t,i,s){switch(s){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[s,r]of this._indexes){var a,n=this._indexData.get(s);if(n){let o=t?this._getFieldValue(t,r.fieldPath):void 0,h=i?this._getFieldValue(i,r.fieldPath):void 0;if(r.hashed&&(o=o&&await this._hashVal(o),h=h&&await this._hashVal(h)),o!==h){switch(r.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"===r.type&&this._schedulePersist(s)}}}}async query(e,t){var i=this._indexes.get(e),s=this._indexData.get(e);if(i&&s)return i.hashed&&"object"!=typeof t&&(t=await this._hashVal(t)),this._queryIndex(s,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 s,r=void 0!==t.$gte,a=void 0!==t.$gt,n=void 0!==t.$lte,o=void 0!==t.$lt;return(r||a||n||o)&&(s=r?t.$gte:a?t.$gt:null,t=n?t.$lte:o?t.$lt:null,e.range(s,t,!r&&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 s of t.$in)(s=e.get(s))&&s.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=""+it.IDX_PREFIX+e,this._collection._indexedDB.delete(this._collection._db,this._collection._storeName,e).catch(()=>{})}_getFieldValue(e,t){var i;let s=e;for(i of t.split(".")){if(null==s)return;s=s[i]}return s}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=this._base64.decode(e),i=this._serializer.deserialize(t);if(i&&Array.isArray(i.indexes)){for(var s of i.indexes){let{name:e,...t}=s;this._indexes.set(e,t)}var r,a,n=[];for([r,a]of this._indexes)"btree"===a.type&&await this._restoreIndex(r)||n.push(r);if(0<n.length)for(var o of n)await this.rebuildIndex(o)}}catch(e){console.error("Failed to load index metadata:",e)}}getIndexStats(){var e,t,i={};for([e,t]of this._indexes){var s=this._indexData.get(e);i[e]={...t,size:s&&(s.size||s.length)||0,memoryUsage:this._estimateMemoryUsage(s)}}return i}_estimateMemoryUsage(e){return e?e instanceof Map?100*e.size:e instanceof Ze?120*e.size:0:0}async verifyIndexes(){var e,t,i={};for([e,t]of this._indexes){var s=this._indexData.get(e);s?s.verify?((s=s.verify()).requiresRebuild&&(await this.rebuildIndex(e),s.rebuilt=!0),i[e]=s):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 st{async saveAttachments(e,t,i,s){try{var r,a,n=[],o=await(await(await(await navigator.storage.getDirectory()).getDirectoryHandle(e,{create:!0})).getDirectoryHandle(t,{create:!0})).getDirectoryHandle(i,{create:!0});for([r,a]of s.entries()){var h=r+"_"+(a.name||"file"),l=await(await o.getFileHandle(h,{create:!0})).createWritable();let s;if(a.data instanceof Uint8Array)s=a.data;else if(a.data instanceof ArrayBuffer)s=new Uint8Array(a.data);else{if(!(a.data instanceof Blob))throw new TypeError("Unsupported attachment data type");s=new Uint8Array(await a.data.arrayBuffer())}var c=new Blob([s],{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:s.byteLength,originalName:a.originalName||a.name})}return n}catch(s){throw new $e("Failed to save attachments","ATTACHMENT_SAVE_FAILED",s)}}async getAttachments(e){var t,i=[],s=await navigator.storage.getDirectory();for(t of e)try{var r=t.path.split("/").filter(e=>e);let e=s;for(let t=0;t<r.length-1;t++)e=await e.getDirectoryHandle(r[t]);var a=await(await(await e.getFileHandle(r[r.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 s=await e.arrayBuffer();i=new Uint8Array(s)}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 rt{constructor(){this._mutex=new Oe}async performTransaction(e,t,i,s,r=3){return"readonly"===i?this._runTx(e,t,i,s,r):this._mutex.runExclusive(()=>this._runTx(e,t,i,s,r))}async _runTx(e,t,i,s,r){let a;for(let n=0;n<r;n++)try{return await new Promise((r,a)=>{let n,o=e.transaction(t,i);o.oncomplete=()=>r(n),o.onerror=()=>a(o.error),o.onabort=()=>a(new Error("Transaction aborted"));try{var h=s(o);h instanceof Promise?h.then(e=>{n=e}).catch(a):n=h}catch(r){a(r)}})}catch(e){a=e,n<r-1&&await new Promise(e=>setTimeout(e,2**n*100))}throw new $e("Transaction failed after retries","TRANSACTION_FAILED",a)}_promisifyRequest(e){return new Promise((t,i)=>{let s=e();s.onsuccess=()=>t(s.result),s.onerror=()=>i(s.error),s.onabort=()=>i(new DOMException("Request aborted","AbortError"))})}async getBatch(e,t,i,s){return this.performTransaction(e,[t],"readonly",e=>{let r,a=e.objectStore(t);return null!=i&&(r=IDBKeyRange.lowerBound(i,!0)),this._promisifyRequest(()=>a.getAll(r,s))})}add(e,t,i,s){return this.performTransaction(e,[t],"readwrite",e=>{let r=e.objectStore(t);return this._promisifyRequest(()=>void 0!==s?r.add(i,s):r.add(i))})}put(e,t,i,s){return this.performTransaction(e,[t],"readwrite",e=>{let r=e.objectStore(t);return this._promisifyRequest(()=>void 0!==s?r.put(i,s):r.put(i))})}get(e,t,i){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).get(i)))}getAll(e,t,i,s){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).getAll(i,s)))}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 s=e.objectStore(i);return e=t.map(e=>{try{switch(e.type){case"add":return this._promisifyRequest(()=>s.add(e.data)).then(e=>({success:!0,result:e}));case"put":return this._promisifyRequest(()=>s.put(e.data)).then(e=>({success:!0,result:e}));case"delete":return this._promisifyRequest(()=>s.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 at{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=Ge,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 $e("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 $e("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 nt{constructor(e,t={},i,s,r){this.name=e,this._serializer=i,this._base64=s,this._dbName=r,this._storageKey=r?`lacertadb_${r}_${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,s=0){this._docSizes.set(e,t),this._docModified.set(e,Date.now()),this._docPermanent.set(e,i),this._docAttachments.set(e,s),this.sizeKB+=t,this.length++,this.modifiedAt=Date.now(),this._scheduleSave()}updateDocument(e,t,i=!1,s=0){var r=this._docSizes.get(e)||0;this.sizeKB=this.sizeKB-r+t,this._docSizes.set(e,t),this._docModified.set(e,Date.now()),this._docPermanent.set(e,i),this._docAttachments.set(e,s),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,s=[];for([t,i]of this._docModified)this._docPermanent.get(t)||s.push({id:t,modified:i});return s.sort((e,t)=>e.modified-t.modified),s.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 s={sizeKB:this.sizeKB,length:this.length,createdAt:this.createdAt,modifiedAt:this.modifiedAt},r=this._serializer.serialize(s),a=this._base64.encode(r);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,s){var r=localStorage.getItem(`lacertadb_${e}_${t}_collmeta`);if(r)try{var a=s.decode(r),n=i.deserialize(a);return new nt(t,n,i,s,e)}catch(e){console.warn("CollectionMetadata corrupted, resetting:",e)}return new nt(t,{},i,s,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 ot{constructor(e,t={},i,s){this.name=e,this._serializer=i,this._base64=s,this.collections=(t=t&&"object"==typeof t?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 s=localStorage.getItem(`lacertadb_${e}_metadata`);if(s)try{var r=i.decode(s),a=t.deserialize(r);if(a&&"object"==typeof a)return new ot(e,a,t,i)}catch(e){console.error("Failed to load metadata:",e)}return new ot(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),s=this._base64.encode(i);localStorage.setItem(e,s),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 ht{constructor(e,t={},i,s){this.dbName=e,this._serializer=i,this._base64=s,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 s=localStorage.getItem(`lacertadb_${e}_settings`);if(s)try{var r=i.decode(s),a=t.deserialize(r);return new ht(e,a,t,i)}catch(e){console.error("Failed to load settings:",e)}return new ht(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),s=this._base64.encode(i);localStorage.setItem(e,s)}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 lt=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 s=t[i];if(i.startsWith("$")){var r=this.operators[i];if(!r||!r(e,s))return!1}else{var a=this.getFieldValue(e,i);if("object"!=typeof s||null===s||Array.isArray(s)){if(a!==s)return!1}else for(var n in s)if(n.startsWith("$")){var o=this.operators[n];if(!o||!o(a,s[n]))return!1}}}return!0}getFieldValue(e,t){let i=e;for(var s of t.split(".")){if(null==i)return;i=i[s]}return i}};let ct=new class{constructor(){this.stages={$match:(e,t)=>e.filter(e=>lt.evaluate(e,t)),$project:(e,t)=>e.map(e=>{var i,s={};for(i in t){var r=t[i];1===r||!0===r?s[i]=lt.getFieldValue(e,i):"string"==typeof r&&r.startsWith("$")&&(s[i]=lt.getFieldValue(e,r.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 s}),$sort:(e,t)=>[...e].sort((e,i)=>{for(var s in t){var r=t[s],a=lt.getFieldValue(e,s);if(a<(s=lt.getFieldValue(i,s)))return-r;if(s<a)return r}return 0}),$limit:(e,t)=>e.slice(0,t),$skip:(e,t)=>e.slice(t),$group:(e,t)=>{var i,s=new Map,r=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 lt.getFieldValue(e,t.substring(1));if(null===t||"object"!=typeof t||Array.isArray(t))return t;var i,s={};for(i in t)s[i]=n(e,t[i]);return s};for(i of e){let e;e="string"==typeof r?r.startsWith("$")?lt.getFieldValue(i,r.substring(1)):r:null!==r&&"object"==typeof r?a(n(i,r)):r,s.has(e)||s.set(e,{_id:e,docs:[]}),s.get(e).docs.push(i)}var o,h=[];for(o of s.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+(lt.getFieldValue(i,e)||0),0);break;case"$avg":var _=o.docs.reduce((t,i)=>t+(lt.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=>lt.getFieldValue(t,e)));break;case"$min":c[l]=Math.min(...o.docs.map(t=>lt.getFieldValue(t,e)))}}h.push(c)}return h},$lookup:async(e,t,i)=>{i=await(await i.getCollection(t.from)).getAll();let s=new Map;return i.forEach(e=>{var i=lt.getFieldValue(e,t.foreignField);s.has(i)||s.set(i,[]),s.get(i).push(e)}),e.map(e=>{var i=lt.getFieldValue(e,t.localField);return{...e,[t.as]:s.get(i)||[]}})}}}async execute(e,t,i){let s=e;for(var r of t){var a=Object.keys(r)[0],n=(r=r[a],this.stages[a]);if(!n)throw new Error("Unknown aggregation stage: "+a);s="$lookup"===a?await n(s,r,i):n(s,r)}return s}};class dt{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),s=t.split(".").map(Number),r=Math.max(i.length,s.length);for(let e=0;e<r;e++){var a=i[e]||0,n=s[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 s,r=await this.database.getCollection(i);for(s of await r.getAll()){var a=await e[t](s);a&&await r.update(s._id,a)}}}}class ut{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),s=(s=0<this._metrics.memoryUsage.length?this._metrics.memoryUsage[this._metrics.memoryUsage.length-1]:null)?s.used/1048576:0;return{opsPerSec:e,avgLatency:t.toFixed(2),cacheHitRate:i.toFixed(1),memoryUsageMB:s.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 _t{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 rt,this._opfs=new st,this._cleanupInterval=null,this._events=new Map,this._indexManager=new it(this),this._cacheStrategy=new je({type:"lru",maxSize:100,ttl:6e4,enabled:!0}),this._docCache=new Re(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=nt.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 $e("Document-level encryption requires database-level encryption. Use getSecureDatabase() to create an encrypted database.","ENCRYPTION_NOT_INITIALIZED");await this._trigger("beforeAdd",e);e=new at({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?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,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,s;if((this._initialized||await this.init(),!t.includeAttachments)&&(s=this._docCache.get(e)))return s;if(s=await this._indexedDB.get(this._db,this._storeName,e))return i=new at(s,{encrypted:s._encrypted,compressed:s._compressed},this._serializer),s.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),s=i.objectOutput(t.includeAttachments),t.includeAttachments||this._docCache.set(e,s),s;throw new $e(`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(it.IDX_PREFIX))),Promise.all(e.map(async e=>{try{var t=new at(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 s,r,a=await this._indexedDB.get(this._db,this._storeName,e);if(a)return r=new at(a,{},this._serializer),a.packedData&&await r.unpack(this.database.encryption),s=r.objectOutput(),r={...r.data,...t},(t=new at({_id:e,_created:a._created,data:r},{compressed:void 0!==i.compressed?i.compressed:a._compressed,permanent:void 0!==i.permanent?i.permanent:a._permanent},this._serializer))._modified=Date.now(),(r=i.attachments)&&0<r.length?(await this._opfs.deleteAttachments(this.database.name,this.name,e),i=await Promise.all(r.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),r=t.databaseOutput(),await this._indexedDB.put(this._db,this._storeName,r),i=t.objectOutput(),await this._indexManager.updateIndexForDocument(t._id,s,i),a=r.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 $e(`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 $e("Document not found for deletion","DOCUMENT_NOT_FOUND");if(i._permanent&&!t.force)throw new $e("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,s,r=performance.now(),a=JSON.stringify({f:e,o:t},(e,t)=>{if(!t||"object"!=typeof t||Array.isArray(t))return t;var i,s={};for(i of Object.keys(t).sort())s[i]=t[i];return s}),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,s]of this._indexManager.indexes){var l=e[s.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=>lt.evaluate(t,e)))),t.sort&&(o=ct.stages.$sort(o,t.sort)),t.skip&&(o=ct.stages.$skip(o,t.skip)),t.limit&&(o=ct.stages.$limit(o,t.limit)),t.projection&&(o=ct.stages.$project(o,t.projection)),this._performanceMonitor&&this._performanceMonitor.recordOperation(h?"indexed-query":"full-scan-query",performance.now()-r),this._cacheStrategy.set(a,o),o}async aggregate(e){this._initialized||await this.init();var t=performance.now();let i,s=e;return 0<e.length&&e[0].$match?(i=await this.query(e[0].$match),s=e.slice(1)):i=await this.getAll(),e=await ct.execute(i,s,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(),s=[];let r=[];var a,n=!this.database.encryption&&!t.compressed;for(a of e){var o=new at({data:a},{compressed:t.compressed||!1,permanent:t.permanent||!1},this._serializer);n?o.packSync():await o.pack(this.database.encryption),s.push({type:"add",data:o.databaseOutput()}),r.push(o)}var h,l,c,d=await this._indexedDB.batchOperation(this._db,s,this._storeName);for(let e=0;e<r.length;e++)d[e].success&&(l=(h=r[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:r[t]._id}))}async batchUpdate(e,t={}){this._initialized||await this.init();var i=performance.now(),s=[],r=[];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 at(_,{},this._serializer),_.packedData&&await u.unpack(this.database.encryption),r.push(u.objectOutput()),u={...u.data,...o.data},(u=new at({_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),s.push({type:"put",data:u.databaseOutput()})):h.push({success:!1,id:o.id,error:"Document not found"})}if(0===s.length)return h;var f,p,y,m=await this._indexedDB.batchOperation(this._db,s,this._storeName);for(let e=0;e<a.length;e++)m[e].success&&(p=(f=a[e]).objectOutput(),await this._indexManager.updateIndexForDocument(f._id,r[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),[...m.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 s=[];var r,a,n=[];for({id:r,options:a}of e){var o,h=await this._indexedDB.get(this._db,this._storeName,r);h?h._permanent&&!a.force?n.push({success:!1,id:r,error:"Cannot delete permanent document without force flag"}):(o=await this.get(r),s.push({id:r,fullDoc:o,stored:h}),i.push({type:"delete",key:r})):n.push({success:!1,id:r,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<s.length;e++)u[e].success&&(({id:l,fullDoc:c,stored:d}=s[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:s[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 nt(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 ft{constructor(e,t,i,s){this.name=e,this._collections=new Map,this._metadata=null,this._settings=null,this._quickStore=null,this._performanceMonitor=t,this._serializer=i,this._base64=s,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,s)=>{let r=indexedDB.open("lacertadb_"+this.name,e);r.onerror=()=>s(new $e("Failed to open database","DATABASE_OPEN_FAILED",r.error)),r.onsuccess=()=>i(r.result),r.onupgradeneeded=e=>{var i,s=e.target.result;for(i of t)s.objectStoreNames.contains(i)||s.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=ot.load(this.name,this._serializer,this._base64),this._settings=ht.load(this.name,this._serializer,this._base64),this._quickStore=new Fe(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 s=`lacertadb_${this.name}_encryption`;let r=null;var a=((a=localStorage.getItem(s))&&(a=this._base64.decode(a),r=this._serializer.deserialize(a)),this._encryption=new Xe(i,this._serializer,this._base64),await this._encryption.initialize(e,r));r||(i=this._serializer.serialize(a),e=this._base64.encode(i),localStorage.setItem(s,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 s=await this.getCollection("__private_keys__").catch(()=>null);return await(s=s||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 $e(`Collection '${e}' already exists.`,"COLLECTION_EXISTS");await this._ensureStore(e);var i=new _t(e,this);return this._collections.set(e,i),this._metadata.collections[e]||this._metadata.setCollection(new nt(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 _t(e,this),this._collections.set(e,t),await t.init(),t;throw new $e(`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 _t(e,this),this._collections.set(e,t),this._metadata.collections[e]||this._metadata.setCollection(new nt(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 rt).clear(this._db,e)}catch(e){}let i=this.name+"_"+e;try{await new Promise((e,t)=>{var s=indexedDB.deleteDatabase(i);s.onsuccess=e,s.onerror=e,s.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 r=0;for(let a of t){let t=this.name+"_"+a;try{let e=await new Promise((e,i)=>{let s=indexedDB.open(t,1);s.onerror=()=>e(null),s.onsuccess=()=>e(s.result),s.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 s=e.transaction("documents","readonly").objectStore("documents").getAll();s.onsuccess=()=>t(s.result||[]),s.onerror=()=>t([])});if(e.close(),0!==i.length){await this._ensureStore(a);var s=new rt;let e=i.map(e=>({type:"put",data:e}));await s.performTransaction(this._db,[a],"readwrite",t=>{let i=t.objectStore(a);return t=e.map(e=>new Promise((t,s)=>{var r=i.put(e.data);r.onsuccess=()=>t(),r.onerror=()=>t()})),Promise.all(t)}),await new Promise(e=>{var i=indexedDB.deleteDatabase(t);i.onsuccess=e,i.onerror=e,i.onblocked=e}),r++}}else e.close();else indexedDB.deleteDatabase(t)}catch(e){console.warn(`[LacertaDB] Migration of '${a}' failed:`,e.message)}}0<r&&console.log(`[LacertaDB] Migrated ${r} 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,s,r,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 r=this._serializer.serialize(a),this._base64.encode(r);if("encrypted"===e&&t)return r=new We,s=this._serializer.serialize(a),r=await r.encrypt(s,t),this._base64.encode(r);throw new $e("Unsupported export format: "+e,"INVALID_FORMAT")}async import(e,t="json",i=null){let s;try{var r,a=this._base64.decode(e);s="encrypted"===t&&i?(r=await(new We).decrypt(a,i),this._serializer.deserialize(r)):this._serializer.deserialize(a)}catch(e){throw new $e("Failed to parse import data","IMPORT_PARSE_FAILED",e)}for(var n in s.collections){var o=s.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(s.collections).reduce((e,t)=>e+t.length,0),{collections:Object.keys(s.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 ot(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 ut,e={...Pe,...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,sortKeys:e.sortKeys||!1,memoryPoolSize:e.memoryPoolSize||65536,...e},this.options.allowFunction||(this.options.serializeFunctions=!1),e=Math.max(this.options.memoryPoolSize,65536),this.buf=new Uint8Array(e),this.dv=new DataView(this.buf.buffer),this.pos=0,this.enc=new TextEncoder,this.dec=new TextDecoder,this.refs=new Map,this.circularRefs=new Set,this.strings=new Map,this.buffers=new Map,this.deserializeRefs=null,this.deserializeStrings=null,this.deserializeBuffers=null,this.buffer=null,this.view=null}_grow(e){var t=this.pos+e;if(!(t<=this.buf.length)){let i=this.buf.length;for(;i<t;)i<<=1;(e=new Uint8Array(i)).set(this.buf.subarray(0,this.pos)),this.buf=e,this.dv=new DataView(e.buffer)}}serialize(e){return this.resetState(),this._grow(5),this.dv.setUint32(0,Ve,!0),this.buf[4]=6,this.pos=5,this.options.detectCircular&&this.detectCircularReferences(e,new WeakSet),this.writeValue(e),this.buf.slice(0,this.pos)}deserialize(e){if(this.buffer=e instanceof Uint8Array?e:new Uint8Array(e),this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength),this.pos=0,this.deserializeRefs=[],this.deserializeStrings=[],this.deserializeBuffers=[],this.view.getUint32(0,!0)!==Ve)throw new Error("Invalid TurboSerial data");if(6!==this.buffer[4])throw new Error("Unsupported version: "+this.buffer[4]);return this.pos=5,this.readValue()}resetState(){this.pos=0,this.refs.clear(),this.circularRefs.clear(),this.strings.clear(),this.buffers.clear()}resetMemory(e={}){return e=e.shrink?Math.max(this.options.memoryPoolSize||65536,256):this.buf.length,this.buf=new Uint8Array(e),this.dv=new DataView(this.buf.buffer),this.pos=0,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}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,s=e.length;i<s;i++)i in e&&this.detectCircularReferences(e[i],t);else if(e instanceof Map)for(var[i,s]of e)this.detectCircularReferences(i,t),this.detectCircularReferences(s,t);else if(e instanceof Set)for(var r of e)this.detectCircularReferences(r,t);else{var a=Object.keys(e);for(let s=0;s<a.length;s++)try{this.detectCircularReferences(e[a[s]],t)}catch(i){}}}finally{t.delete(e)}}}_wV(e){var t=this.buf;let i=this.pos;if((e>>>=0)<128)t[i]=e,this.pos=i+1;else if(e<16384)t[i]=127&e|128,t[i+1]=e>>>7,this.pos=i+2;else{for(;128<=e;)t[i++]=127&e|128,e>>>=7;t[i++]=e,this.pos=i}}writeValue(e){if(null===e)this._grow(1),this.buf[this.pos++]=0;else if(void 0===e)this._grow(1),this.buf[this.pos++]=1;else{var t=typeof e;if("boolean"==t)this._grow(1),this.buf[this.pos++]=e?3:2;else if("number"==t)this._wNum(e);else if("string"==t)this._wStrDedup(e);else if("bigint"==t)this._wBigInt(e);else if("symbol"==t)this._grow(2),void 0!==(i=Symbol.keyFor(e))?(this.buf[this.pos++]=we,this.writeValue(i)):n.has(e)?(this.buf[this.pos++]=ge,this.writeValue(n.get(e))):void 0===e.description?this.buf[this.pos++]=ve:(this.buf[this.pos++]=me,this.writeValue(e.description));else if("function"==t)this._grow(1),this.buf[this.pos++]=this.options.allowFunction?be:c;else{if(this.options.detectCircular&&this.circularRefs.has(e)){var i=this.refs.get(e);if(void 0!==i)return this._grow(6),this.buf[this.pos++]=ye,void this._wV(i);this.refs.set(e,this.refs.size)}if(this.options.deduplication&&!this.circularRefs.has(e)){if(void 0!==(t=this.refs.get(e)))return this._grow(6),this.buf[this.pos++]=pe,void this._wV(t);this.refs.set(e,this.refs.size)}if(this.options.shareArrayBuffers&&e instanceof ArrayBuffer){if(void 0!==(i=this.buffers.get(e)))return this._grow(6),this.buf[this.pos++]=J,void this._wV(i);this.buffers.set(e,this.buffers.size)}this._wObj(e)}}}_wStrDedup(e){if(this.options.deduplication&&3<e.length){var t=this.strings.get(e);if(void 0!==t)return this._grow(6),this.buf[this.pos++]=U,void this._wV(t);this.strings.set(e,this.strings.size)}this._wStr(e)}_wNum(e){this._grow(10);var t,i=this.pos;e!=e?(this.buf[i]=m,this.pos=i+1):e===1/0?(this.buf[i]=w,this.pos=i+1):e===-1/0?(this.buf[i]=g,this.pos=i+1):0===e&&1/e<0?(this.buf[i]=v,this.pos=i+1):e===(t=0|e)?-128<=t&&t<=127?(this.buf[i]=d,this.buf[i+1]=255&t,this.pos=i+2):-32768<=t&&t<=32767?(this.buf[i]=u,this.dv.setInt16(i+1,t,!0),this.pos=i+3):(this.buf[i]=_,this.dv.setInt32(i+1,t,!0),this.pos=i+5):e===(t=e>>>0)?(this.buf[i]=f,this.dv.setUint32(i+1,t,!0),this.pos=i+5):(a[0]=e,a[0]===e?(this.buf[i]=p,this.dv.setFloat32(i+1,e,!0),this.pos=i+5):(this.buf[i]=y,this.dv.setFloat64(i+1,e,!0),this.pos=i+9))}_wBigInt(e){this._grow(10);var t=e<0n,i=t?-e:e;if(i<=0x7fffffffffffffffn)this.buf[this.pos++]=t?A:S,this.dv.setBigInt64(this.pos,e,!0),this.pos+=8;else{this.buf[this.pos++]=t?z:x;let s=i.toString(16);e=(s=1&s.length?"0"+s:s).length>>>1,this._grow(5+e),this._wV(e);for(let e=s.length-2;0<=e;e-=2)this.buf[this.pos++]=parseInt(s.substr(e,2),16);s.length%2&&(this.buf[this.pos++]=parseInt(s[0],16))}}_wStr(e){var t=e.length;if(0===t)this._grow(1),this.buf[this.pos++]=I;else if(t<128){let s=1;for(let i=0;i<t;i++)if(127<e.charCodeAt(i)){s=0;break}if(s){this._grow(t+2);var i=this.pos;this.buf[i++]=t<16?k:D,this.buf[i++]=t;for(let s=0;s<t;s++)this.buf[i+s]=e.charCodeAt(s);return void(this.pos=i+t)}let r=this.enc.encode(e),a=r.length,n=(this._grow(a+7),this.pos);this.buf[n++]=a<16?C:a<256?T:M,a<256?this.buf[n++]=a:(this.pos=n,this._wV(a),n=this.pos),this.buf.set(r,n),this.pos=n+a}else{let i=this.enc.encode(e),s=i.length,r=(this._grow(s+7),this.pos);s===t?(this.buf[r++]=t<256?D:E,t<256?this.buf[r++]=t:(this.pos=r,this._wV(t),r=this.pos)):(this.buf[r++]=s<256?T:M,s<256?this.buf[r++]=s:(this.pos=r,this._wV(s),r=this.pos)),this.buf.set(i,r),this.pos=r+s}}_wObj(e){if(Array.isArray(e))this._wArr(e);else{var t=e.constructor;if(void 0!==(t=ke.get(t))){if(t===te)return this._grow(9),void((a=e.getTime())!=a?this.buf[this.pos++]=ie:(this.buf[this.pos++]=te,this.dv.setFloat64(this.pos,a,!0),this.pos+=8));if(t===ue)return this._grow(1),this.buf[this.pos++]=ue,this.writeValue(e.source),void this.writeValue(e.flags);if(t===Z){for(var[i,s]of(this._grow(6),this.buf[this.pos++]=Z,this._wV(e.size),e))this.writeValue(i),this.writeValue(s);return}if(t===ee){for(var r of(this._grow(6),this.buf[this.pos++]=ee,this._wV(e.size),e))this.writeValue(r);return}if(t===Q||t===Y)return this._grow(6),this.buf[this.pos++]=t,a=new Uint8Array(e),this._wV(a.length),this._grow(a.length),this.buf.set(a,this.pos),void(this.pos+=a.length);if(96==(240&t))return void this._wTypedArr(e,t)}if(e instanceof Error){this._grow(2);var a=Ue.get(e.constructor.name)||de;if(this.buf[this.pos++]=a,this.writeValue(e.message||""),this.writeValue(e.stack||""),a===ce&&e.errors)for(var n of(this._wV(e.errors.length),e.errors))this.writeValue(n)}else"undefined"!=typeof Blob&&e instanceof Blob?(this._grow(12),this.buf[this.pos++]=e instanceof File?fe:_e,this._wV(0),this._wV(0)):this._wPlainObj(e)}}_wArr(e){var t=e.length;if(0===t)this._grow(1),this.buf[this.pos++]=V;else{let a=!1;for(let i=0;i<t;i++)if(!(i in e)){a=!0;break}if(a){this._grow(12),this.buf[this.pos++]=L,this._wV(t);var i,s=[];for(let i=0;i<t;i++)i in e&&s.push(i);for(i of(this._wV(s.length),s))this._wV(i),this.writeValue(e[i])}else{if(this.options.simdOptimization&&8<=t&&"number"==typeof e[0]){var r=this._detectPacked(e,t);if(r)return this._grow(6),this.buf[this.pos++]=r,void this._wPacked(e,t,r)}this._grow(6),this.buf[this.pos++]=B,this._wV(t);for(let i=0;i<t;i++)this.writeValue(e[i])}}}_detectPacked(e,t){let i=1,s=e[0],r=e[0],n=1;for(let h=0;h<t;h++){var o=e[h];if("number"!=typeof o)return 0;o!==(0|o)&&(i=0),o<s&&(s=o),o>r&&(r=o),n&&(a[0]=o,a[0]!==o)&&(n=0)}var h;return i?(h=Math.max(Math.abs(s),Math.abs(r)))<=127?P:h<=32767?F:K:n?O:$}_wPacked(e,t,i){this.dv,this._wV(t);var s=Se[i]||1;this._grow(t*s);let r=this.pos;switch(i){case P:for(let i=0;i<t;i++)this.buf[r++]=255&e[i];break;case F:for(let i=0;i<t;i++)this.dv.setInt16(r,e[i],!0),r+=2;break;case K:for(let i=0;i<t;i++)this.dv.setInt32(r,e[i],!0),r+=4;break;case O:for(let i=0;i<t;i++)this.dv.setFloat32(r,e[i],!0),r+=4;break;case $:for(let i=0;i<t;i++)this.dv.setFloat64(r,e[i],!0),r+=8}this.pos=r}_wTypedArr(e,t){this._grow(12),this.buf[this.pos++]=t;var i=e.buffer;if(this.options.shareArrayBuffers){var s=this.buffers.get(i);if(void 0!==s)return this.buf[this.pos++]=1,this._wV(s),this._wV(e.byteOffset),void this._wV(e.length);this.buffers.set(i,this.buffers.size)}if(this.buf[this.pos++]=0,this._wV(e.byteOffset),this._wV(e.length),s=Se[t]||1,t===W||t===X){this._grow(8*e.length);for(let t=0;t<e.length;t++)this.dv.setBigInt64(this.pos,e[t],!0),this.pos+=8}else t=e.length*s,this._grow(t),s=new Uint8Array(i,e.byteOffset,t),this.buf.set(s,this.pos),this.pos+=t}_wPlainObj(e){var t=Object.getPrototypeOf(e),i=(t=e.constructor===Object||t===Object.prototype||null===t,Object.keys(e));if(0===i.length&&t)this._grow(1),this.buf[this.pos++]=R;else if(t){if(this.options.preservePropertyDescriptors){var s;t=[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)];let i=!1;for(s of t){var r=Object.getOwnPropertyDescriptor(e,s);if(r.get||r.set||!r.enumerable||!r.writable||!r.configurable){i=!0;break}}if(i)return void this._wDescriptorObj(e,t)}let n=!1;if(this.options.allowFunction)for(let t=0;t<i.length;t++)if("function"==typeof e[i[t]]){n=!0;break}if(n)this._wMethodObj(e,i);else{this._grow(6),this.buf[this.pos++]=q,this.options.sortKeys&&i.sort();let t=i.length;if(!this.options.serializeFunctions)for(let s=t=0;s<i.length;s++)"function"!=typeof e[i[s]]&&t++;this._wV(t);for(let t=0;t<i.length;t++){var a=e[i[t]];!this.options.serializeFunctions&&"function"==typeof a||(this.writeValue(i[t]),this.writeValue(a))}}}else this._wConstructorObj(e,i)}_wDescriptorObj(e,t){this._grow(6),this.buf[this.pos++]=H;var i;t=t.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(i of(this._wV(t.length),t)){this.writeValue(i);var s=Object.getOwnPropertyDescriptor(e,i);let t=0;s.enumerable&&(t|=1),s.writable&&(t|=2),s.configurable&&(t|=4),s.get&&(t|=8),s.set&&(t|=16),this._grow(1),this.buf[this.pos++]=t,s.get||s.set?(s.get&&this.writeValue(s.get),s.set&&this.writeValue(s.set)):this.writeValue(s.value)}}_wMethodObj(e,t){this._grow(6),this.buf[this.pos++]=G;var i,s,r,a,n=[];for(i of t)try{var o=e[i];n.push([i,o,"function"==typeof o])}catch(e){}for([s,r,a]of(this._wV(n.length),n))this.writeValue(s),this._grow(1),this.buf[this.pos++]=a?1:0,a&&this.options.serializeFunctions?(this.writeValue(r.toString()),this.writeValue(r.name||"")):a?(this._grow(1),this.buf[this.pos++]=be):this.writeValue(r)}_wConstructorObj(e,t){this._grow(6),this.buf[this.pos++]=j,this.writeValue((null==(s=e.constructor)?void 0:s.name)||"");var i,s=this.options.serializeFunctions?t:t.filter(t=>{try{return"function"!=typeof e[t]}catch(t){return!1}});for(i of(this._wV(s.length),s))this.writeValue(i),this.writeValue(e[i])}readValue(){this.buffer;var e=this.buf[this.pos++];if(e===pe||e===ye)return this.deserializeRefs[this._rV()];if(e===U)return this.deserializeStrings[this._rV()];if(e===J)return this.deserializeBuffers[this._rV()];var t,i=240&e;if(0==i)return 0===e?null:1===e?void 0:3===e;if(16==i)return this._rNum(e);if(32==i)return this._rBigInt(e);if(48==i)return this._rStr(e);if(64==i||80==i||128==i){let t;return t=64==i?[]:128==i?new(e===Z?Map:Set):{},this.deserializeRefs.push(t),this._rFill(t,e,i),t}if(96==i)return t=this._rTypedArr(e),this.deserializeRefs.push(t),t;if(112==i)return t=this._rArrayBuf(e),this.deserializeBuffers.push(t),t;if(144==i)return e===ie?new Date(NaN):(t=this.view.getFloat64(this.pos,!0),this.pos+=8,new Date(t));if(160==i)return this._rError(e);if(176==i)return new RegExp(this.readValue(),this.readValue());if(192==i)return this._rV(),this._rV(),{_type:"Binary"};if(224==i)return this._rSpecial(e);if(240==i)return this.options.allowFunction?function(){throw new Error("Function not serialized")}:void 0;throw new Error("Unknown type: 0x"+e.toString(16))}_rV(){this.buffer;let e=this.pos,t=this.buf[e++];if(!(128&t))return this.pos=e,t;let i=127&t,s=7;for(;t=this.buf[e++],i|=(127&t)<<s,s+=7,128&t;);return this.pos=e,i>>>0}_rFill(e,t,i){if(64===i){if(t!==V)if(t===B){var s=this._rV();for(let t=0;t<s;t++)e[t]=this.readValue()}else if(t===L){e.length=this._rV();var r=this._rV();for(let t=0;t<r;t++)e[this._rV()]=this.readValue()}else{var a=this._rPacked(t);for(let t=0;t<a.length;t++)e.push(a[t])}}else if(80===i)this.fillObject(e,t);else if(128===i){var n=this._rV();if(t===Z)for(let t=0;t<n;t++)e.set(this.readValue(),this.readValue());else for(let t=0;t<n;t++)e.add(this.readValue())}}fillObject(e,t){if(t!==R)if(t===q||t===N){var i=this._rV();for(let t=0;t<i;t++)e[this.readValue()]=this.readValue()}else if(t===H){var s=this._rV();for(let t=0;t<s;t++){var r=this.readValue(),a=this.buffer[this.pos++],n={enumerable:!!(1&a),writable:!!(2&a),configurable:!!(4&a)};8&a||16&a?(8&a&&(n.get=this.readValue()),16&a&&(n.set=this.readValue())):n.value=this.readValue(),Object.defineProperty(e,r,n)}}else if(t===G){var o=this._rV();for(let i=0;i<o;i++){var h=this.readValue();if(this.buffer[this.pos++])if(this.options.allowFunction&&this.options.serializeFunctions){var l=this.readValue();this.readValue();try{e[h]=new Function("return "+l)()}catch(t){e[h]=void 0}}else this.options.serializeFunctions?(this.readValue(),this.readValue(),e[h]=void 0):(this.pos++,e[h]=this.options.allowFunction?function(){throw new Error("Not serialized")}:void 0);else e[h]=this.readValue()}}else if(t===j){t=this.readValue();var c=this._rV();for(let t=0;t<c;t++)e[this.readValue()]=this.readValue();Object.defineProperty(e,"__constructorName",{value:t,enumerable:!1,writable:!1,configurable:!0})}}_rNum(e){this.view;let t,i=this.pos;switch(e){case d:return t=this.buffer[i]<<24>>24,this.pos=i+1,t;case u:return t=this.dv.getInt16(i,!0),this.pos=i+2,t;case _:return t=this.dv.getInt32(i,!0),this.pos=i+4,t;case f:return t=this.dv.getUint32(i,!0),this.pos=i+4,t;case p:return t=this.dv.getFloat32(i,!0),this.pos=i+4,t;case y:return t=this.dv.getFloat64(i,!0),this.pos=i+8,t;case m:return NaN;case w:return 1/0;case g:return-1/0;case v:return-0;case b:return t=this._rV(),this.buffer[this.pos++]?-t:t}}_rBigInt(e){if(e===S||e===A){let e=this.view.getBigInt64(this.pos,!0);return this.pos+=8,e}e=e===z;var t=this._rV();let i="";for(let e=t-1;0<=e;e--)i+=this.buffer[this.pos+e].toString(16).padStart(2,"0");this.pos+=t;let s=BigInt("0x"+(i||"0"));return e?-s:s}_rStr(e){if(e===I)return"";var t=this.buffer;let i,r;return i=e===k||e===D||e===C||e===T?this.buf[this.pos++]:this._rV(),r=(e=e===k||e===D||e===E)&&i<128?s[i](t,this.pos):this.dec.decode(t.subarray(this.pos,this.pos+i)),this.pos+=i,3<r.length&&this.deserializeStrings.push(r),r}_rPacked(e){var t=this._rV(),i=new Array(t);this.view;let s=this.pos;switch(e){case P:for(let e=0;e<t;e++)i[e]=this.buffer[s++]<<24>>24;break;case F:for(let e=0;e<t;e++)i[e]=this.dv.getInt16(s,!0),s+=2;break;case K:for(let e=0;e<t;e++)i[e]=this.dv.getInt32(s,!0),s+=4;break;case O:for(let e=0;e<t;e++)i[e]=this.dv.getFloat32(s,!0),s+=4;break;case $:for(let e=0;e<t;e++)i[e]=this.dv.getFloat64(s,!0),s+=8}return this.pos=s,i}_rTypedArr(e){if(this.buffer[this.pos++]){let t=this._rV(),i=this._rV(),s=this._rV();return new Ae[e](this.deserializeBuffers[t],i,s)}this._rV();let t=this._rV(),i=Se[e]||1;if(e===W||e===X){var s=[];for(let e=0;e<t;e++)s.push(this.view.getBigInt64(this.pos,!0)),this.pos+=8;return new Ae[e](s)}var r=t*i,a=new ArrayBuffer(r);return new Uint8Array(a).set(this.buffer.subarray(this.pos,this.pos+r)),this.pos+=r,this.deserializeBuffers.push(a),new Ae[e](a,0,t)}_rArrayBuf(e){var t=this._rV(),i=this.buffer.buffer.slice(this.buffer.byteOffset+this.pos,this.buffer.byteOffset+this.pos+t);return this.pos+=t,i}_rError(e){var t=this.readValue(),i=this.readValue();let s;if(e===ce){var r=this._rV(),a=[];for(let e=0;e<r;e++)a.push(this.readValue());s=new AggregateError(a,t)}else s=new(Me[e]||Error)(t);return i&&(s.stack=i),s}_rSpecial(e){if(e===me)return Symbol(this.readValue());if(e===ve)return Symbol();if(e===we)return Symbol.for(this.readValue());if(e===ge)return o.get(this.readValue())||Symbol();throw new Error("Unknown special type: 0x"+e.toString(16))}}(e),this._base64=new Le.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 ft(e,this._performanceMonitor,this._serializer,this._base64)).init(t),this._databases.set(e,i)),this._databases.get(e)}async getSecureDatabase(e,t,i=null,s={}){return this.getDatabase(e,{pin:t,salt:i,encryptionConfig:s})}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 Fe(e,this._serializer,this._base64).clear();var i=[];for(let t=0;t<localStorage.length;t++){var s=localStorage.key(t);s&&s.startsWith(`lacertadb_${e}_`)&&i.push(s)}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 s=await(await this.getDatabase(t)).export("json");s=this._base64.decode(s);i.databases[t]=this._serializer.deserialize(s)}var r=this._serializer.serialize(i);return e?(e=await(new We).encrypt(r,e),this._base64.encode(e)):this._base64.encode(r)}async restoreBackup(e,t=null){let i;try{var s,r=this._base64.decode(e);i=t?(s=await(new We).decrypt(r,t),this._serializer.deserialize(s)):this._serializer.deserialize(r)}catch(e){throw new $e("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}]);
|
package/dist/index.min.js
CHANGED
|
@@ -6,4 +6,4 @@
|
|
|
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 Pe={compression:!1,preservePropertyDescriptors:!1,deduplication:!1,simdOptimization:!0,detectCircular:!1,shareArrayBuffers:!1,allowFunction:!1,serializeFunctions:!1,memoryPoolSize:262144};class Fe{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 s=this._keyPrefix+"data_"+t,r=localStorage.getItem(s);if(r)try{var a=this._base64.decode(r);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,s=this._keyPrefix+"data_"+e,r=this._docs.get(e);void 0!==r?(t=this._serializer.serialize(r),i=this._base64.encode(t),localStorage.setItem(s,i)):localStorage.removeItem(s)}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=>lt.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 Ke{constructor(){this._connections=new Map,this._refCounts=new Map}async getConnection(e,t=1,i){let s=e+"_v"+t;var r;return this._connections.has(s)?(this._refCounts.set(s,(this._refCounts.get(s)||0)+1),this._connections.get(s)):((r=await new Promise((s,r)=>{let a=indexedDB.open(e,t);a.onerror=()=>r(new $e("Failed to open database","DATABASE_OPEN_FAILED",a.error)),a.onsuccess=()=>s(a.result),a.onupgradeneeded=e=>{i&&i(e.target.result,e.oldVersion,e.newVersion)}})).onclose=()=>{this._connections.delete(s),this._refCounts.delete(s)},this._connections.set(s,r),this._refCounts.set(s,1),r)}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 Ke;class Oe{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 $e 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 Ne{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 Re{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,s=(this._frequencies.set(e,i),this._buckets.get(t));return s&&(s.delete(e),0===s.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 qe{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 je{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 qe(i):new("lfu"===e?Re:Ne)(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 He{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(),s=new Uint8Array(i.byteLength+1);return s[0]=1,s.set(new Uint8Array(i),1),s}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 s=new Response(i).body.pipeThrough(new DecompressionStream("deflate")),r=await new Response(s).arrayBuffer();return new Uint8Array(r)}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 Ge=new He;class We{async encrypt(e,t){var i=new TextEncoder,s=crypto.getRandomValues(new Uint8Array(16)),r=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:s,iterations:6e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"]),t=await crypto.subtle.encrypt({name:"AES-GCM",iv:r},i,e);return(i=new Uint8Array(s.length+r.length+t.byteLength)).set(s,0),i.set(r,s.length),i.set(new Uint8Array(t),s.length+r.length),i}async decrypt(e,t){var i=new TextEncoder,s=e.slice(0,16),r=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:s,iterations:6e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"]),s=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},i,e);return new Uint8Array(s)}}class Xe{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),s=(t=this._base64.decode(t.wrappedKey)).slice(0,12);t=t.slice(12);try{var r=await crypto.subtle.decrypt({name:"AES-GCM",iv:s},i,t);await this._importMasterKeys(r)}catch(e){throw new Error("Invalid PIN or corrupted key data")}}else this._salt=crypto.getRandomValues(new Uint8Array(this._saltLength)),s=await this._deriveKEK(e,this._salt),i=crypto.getRandomValues(new Uint8Array(64)),await this._importMasterKeys(i.buffer),t=crypto.getRandomValues(new Uint8Array(12)),r=await crypto.subtle.encrypt({name:"AES-GCM",iv:t},s,i),(e=new Uint8Array(12+r.byteLength)).set(t,0),e.set(new Uint8Array(r),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=(s=this._base64.decode(this._wrappedKeyBlob)).slice(0,12),s=s.slice(12);try{await crypto.subtle.decrypt({name:"AES-GCM",iv:i},e,s)}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),s=await this._exportMasterKeys(),t=crypto.getRandomValues(new Uint8Array(12)),e=await crypto.subtle.encrypt({name:"AES-GCM",iv:t},e,s),(s=new Uint8Array(12+e.byteLength)).set(t,0),s.set(new Uint8Array(e),12),this._salt=i,this._wrappedKeyBlob=this._base64.encode(s),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),s=((s=new Uint8Array(e.length+i.byteLength)).set(e,0),s.set(new Uint8Array(i),e.length),await crypto.subtle.sign("HMAC",this._hmacKey,s)),r=new Uint8Array(e.length+i.byteLength+32);return r.set(e,0),r.set(new Uint8Array(i),e.length),r.set(new Uint8Array(s),e.length+i.byteLength),r}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),s=(e=e.slice(12,-32),new Uint8Array(t.length+e.length));if(i=(s.set(t,0),s.set(e,t.length),await crypto.subtle.verify("HMAC",this._hmacKey,i,s)))return s=await crypto.subtle.decrypt({name:"AES-GCM",iv:t},this._masterKey,e),new Uint8Array(s);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=(s=new TextEncoder).encode(t);let i;i="string"==typeof e?s.encode(e):e instanceof Uint8Array?e:this._serializer.serialize(e);var s=crypto.getRandomValues(new Uint8Array(12)),r=(e=await crypto.subtle.encrypt({name:"AES-GCM",iv:s,additionalData:t,tagLength:128},this._masterKey,i),new Uint32Array([t.length])),a=new Uint8Array(16+t.length+e.byteLength);return a.set(s,0),a.set(new Uint8Array(r.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),s=e.slice(12,16),r=(s=new Uint32Array(s.buffer)[0],e.slice(16,16+s));e=e.slice(16+s),s=(new TextEncoder).encode(t);if(this._arrayEquals(r,s))return t=await crypto.subtle.decrypt({name:"AES-GCM",iv:i,additionalData:r,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 s=0;s<e.length;s++)i|=e[s]^t[s];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 Qe{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:s}=this.boundary,i=i/2,s=s/2;this.northeast=new Qe({x:e+i,y:t-s,w:i,h:s},this.capacity),this.northwest=new Qe({x:e-i,y:t-s,w:i,h:s},this.capacity),this.southeast=new Qe({x:e+i,y:t+s,w:i,h:s},this.capacity),this.southwest=new Qe({x:e-i,y:t+s,w:i,h:s},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 Je(e,t){var i,s;return e===t?0:(i=typeof e)==(s=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<s?-1:1}class Ye{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<Je(e,this.keys[t]);)t++;return t<this.n&&0===Je(e,this.keys[t])?this.values[t]:!this.leaf&&this.children[t]?this.children[t].search(e):null}rangeSearch(e,t,i,s=!1,r=!1){let a=0;if(null!==e)for(;a<this.n&&Je(this.keys[a],e)<0;)a++;for(;a<this.n;a++){if(null!==t){var n=Je(this.keys[a],t);if(r?0<=n:0<n)return void(!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,s,r))}!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,s,r);n=null===e?1:Je(this.keys[a],e);var o=null===t?-1:Je(this.keys[a],t);(null===e||(s?0<n:0<=n))&&(null===t||(r?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,s,r)}insertNonFull(e,t){let i=this.n-1;if(this.leaf){for(;0<=i&&0<Je(this.keys[i],e);)this.keys[i+1]=this.keys[i],this.values[i+1]=this.values[i],i--;0<=i&&0===Je(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<Je(this.keys[i],e);)i--;if(0<=i&&0===Je(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 s=Je(this.keys[i],e);if(0===s)return this.values[i]||(this.values[i]=new Set),void this.values[i].add(t);s<0&&i++}this.children[i]&&this.children[i].insertNonFull(e,t)}}}splitChild(e,t){var i=new Ye(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 s=t.keys[this.order-1],r=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]=s,this.values[e]=r,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],s=this.order;t.keys[s-1]=this.keys[e],t.values[s-1]=this.values[e];for(let e=0;e<i.n;e++)t.keys[s+e]=i.keys[e],t.values[s+e]=i.values[e];if(!t.leaf)for(let e=0;e<=i.n;e++)t.children[s+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,s=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(s,null,!0))}_remove(e,t,i){let s=0;for(;s<this.n&&0<Je(e,this.keys[s]);)s++;var r;if(s<this.n&&0===Je(e,this.keys[s])){let e=i;return!e&&this.values[s]&&(this.values[s].delete(t),e=0===this.values[s].size),!!e&&(this.leaf?this._removeFromLeaf(s):this._removeFromInternal(s),!0)}return!this.leaf&&(r=s===this.n,this.children[s]&&this.children[s].n<this.order&&this._fill(s),r&&s>this.n?!!this.children[s-1]&&this.children[s-1]._remove(e,t,i):!!this.children[s]&&this.children[s]._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++)Je(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 Ze{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 Ye(this._order,!1)).children[0]=this._root,i.splitChild(0,this._root);let r=0;var s=Je(i.keys[0],e);0===s?(i.values[0]||(i.values[0]=new Set),i.values[0].add(t)):(s<0&&r++,i.children[r].insertNonFull(e,t)),this._root=i}else this._root.insertNonFull(e,t);else this._root=new Ye(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,s=!1){return this._root?(this._root.rangeSearch(e,t,e=[],i,s),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 Ze(t);for(let t=0;t<e.length;t++){var[s,r]=e[t];if(null!=s)for(let e=0;e<r.length;e++)i.insert(s,r[e])}return i}}class et{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 s=this._invertedIndex.get(i);s&&(s.delete(e),0===s.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 tt{constructor(){this._tree=new Qe({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,s=t/111,r=(s={x:e.lng,y:e.lat,w:s,h:s},[]);for(i of this._tree.query(s)){var a=this._haversine(e,{lat:i.y,lng:i.x});a<=t&&r.push({docId:i.data,distance:a})}return r.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),s=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(s/2)*Math.sin(s/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 it{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 s=null;for(;;){var r,a,n=await this._collection._indexedDB.getBatch(this._collection._db,this._collection._storeName,s,200);if(0===n.length)break;for(r of n)if("string"==typeof r._id&&r._id.startsWith(it.IDX_PREFIX))s=r._id;else{s=r._id;let e=r;r.packedData&&(await(a=new at(r,{compressed:r._compressed,encrypted:r._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,s=""+it.IDX_PREFIX+e,r=await this._collection._indexedDB.get(this._collection._db,this._collection._storeName,s);return!!(r&&r._entries&&Array.isArray(r._entries))&&((i=Ze.fromSortedEntries(r._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 Ze)try{var i={_id:""+it.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 Ze;case"hash":return new Map;case"text":return new et;case"geo":return new tt;default:return new Map}}_addToIndex(e,t,i,s){switch(s){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[s,r]of this._indexes){var a,n=this._indexData.get(s);if(n){let o=t?this._getFieldValue(t,r.fieldPath):void 0,h=i?this._getFieldValue(i,r.fieldPath):void 0;if(r.hashed&&(o=o&&await this._hashVal(o),h=h&&await this._hashVal(h)),o!==h){switch(r.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"===r.type&&this._schedulePersist(s)}}}}async query(e,t){var i=this._indexes.get(e),s=this._indexData.get(e);if(i&&s)return i.hashed&&"object"!=typeof t&&(t=await this._hashVal(t)),this._queryIndex(s,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 s,r=void 0!==t.$gte,a=void 0!==t.$gt,n=void 0!==t.$lte,o=void 0!==t.$lt;return(r||a||n||o)&&(s=r?t.$gte:a?t.$gt:null,t=n?t.$lte:o?t.$lt:null,e.range(s,t,!r&&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 s of t.$in)(s=e.get(s))&&s.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=""+it.IDX_PREFIX+e,this._collection._indexedDB.delete(this._collection._db,this._collection._storeName,e).catch(()=>{})}_getFieldValue(e,t){var i;let s=e;for(i of t.split(".")){if(null==s)return;s=s[i]}return s}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 s,r,a=[];for([s,r]of this._indexes)"btree"===r.type&&await this._restoreIndex(s)||a.push(s);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 s=this._indexData.get(e);i[e]={...t,size:s&&(s.size||s.length)||0,memoryUsage:this._estimateMemoryUsage(s)}}return i}_estimateMemoryUsage(e){return e?e instanceof Map?100*e.size:e instanceof Ze?120*e.size:0:0}async verifyIndexes(){var e,t,i={};for([e,t]of this._indexes){var s=this._indexData.get(e);s?s.verify?((s=s.verify()).requiresRebuild&&(await this.rebuildIndex(e),s.rebuilt=!0),i[e]=s):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 st{async saveAttachments(e,t,i,s){try{var r,a,n=[],o=await(await(await(await navigator.storage.getDirectory()).getDirectoryHandle(e,{create:!0})).getDirectoryHandle(t,{create:!0})).getDirectoryHandle(i,{create:!0});for([r,a]of s.entries()){var h=r+"_"+(a.name||"file"),l=await(await o.getFileHandle(h,{create:!0})).createWritable();let s;if(a.data instanceof Uint8Array)s=a.data;else if(a.data instanceof ArrayBuffer)s=new Uint8Array(a.data);else{if(!(a.data instanceof Blob))throw new TypeError("Unsupported attachment data type");s=new Uint8Array(await a.data.arrayBuffer())}var c=new Blob([s],{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:s.byteLength,originalName:a.originalName||a.name})}return n}catch(s){throw new $e("Failed to save attachments","ATTACHMENT_SAVE_FAILED",s)}}async getAttachments(e){var t,i=[],s=await navigator.storage.getDirectory();for(t of e)try{var r=t.path.split("/").filter(e=>e);let e=s;for(let t=0;t<r.length-1;t++)e=await e.getDirectoryHandle(r[t]);var a=await(await(await e.getFileHandle(r[r.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 s=await e.arrayBuffer();i=new Uint8Array(s)}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 rt{constructor(){this._mutex=new Oe}async performTransaction(e,t,i,s,r=3){return"readonly"===i?this._runTx(e,t,i,s,r):this._mutex.runExclusive(()=>this._runTx(e,t,i,s,r))}async _runTx(e,t,i,s,r){let a;for(let n=0;n<r;n++)try{return await new Promise((r,a)=>{let n,o=e.transaction(t,i);o.oncomplete=()=>r(n),o.onerror=()=>a(o.error),o.onabort=()=>a(new Error("Transaction aborted"));try{var h=s(o);h instanceof Promise?h.then(e=>{n=e}).catch(a):n=h}catch(r){a(r)}})}catch(e){a=e,n<r-1&&await new Promise(e=>setTimeout(e,2**n*100))}throw new $e("Transaction failed after retries","TRANSACTION_FAILED",a)}_promisifyRequest(e){return new Promise((t,i)=>{let s=e();s.onsuccess=()=>t(s.result),s.onerror=()=>i(s.error),s.onabort=()=>i(new DOMException("Request aborted","AbortError"))})}async getBatch(e,t,i,s){return this.performTransaction(e,[t],"readonly",e=>{let r,a=e.objectStore(t);return null!=i&&(r=IDBKeyRange.lowerBound(i,!0)),this._promisifyRequest(()=>a.getAll(r,s))})}add(e,t,i,s){return this.performTransaction(e,[t],"readwrite",e=>{let r=e.objectStore(t);return this._promisifyRequest(()=>void 0!==s?r.add(i,s):r.add(i))})}put(e,t,i,s){return this.performTransaction(e,[t],"readwrite",e=>{let r=e.objectStore(t);return this._promisifyRequest(()=>void 0!==s?r.put(i,s):r.put(i))})}get(e,t,i){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).get(i)))}getAll(e,t,i,s){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).getAll(i,s)))}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 s=e.objectStore(i);return e=t.map(e=>{try{switch(e.type){case"add":return this._promisifyRequest(()=>s.add(e.data)).then(e=>({success:!0,result:e}));case"put":return this._promisifyRequest(()=>s.put(e.data)).then(e=>({success:!0,result:e}));case"delete":return this._promisifyRequest(()=>s.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 at{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=Ge,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 $e("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 $e("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 nt{constructor(e,t={},i,s,r){this.name=e,this._serializer=i,this._base64=s,this._dbName=r,this._storageKey=r?`lacertadb_${r}_${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,s=0){this._docSizes.set(e,t),this._docModified.set(e,Date.now()),this._docPermanent.set(e,i),this._docAttachments.set(e,s),this.sizeKB+=t,this.length++,this.modifiedAt=Date.now(),this._scheduleSave()}updateDocument(e,t,i=!1,s=0){var r=this._docSizes.get(e)||0;this.sizeKB=this.sizeKB-r+t,this._docSizes.set(e,t),this._docModified.set(e,Date.now()),this._docPermanent.set(e,i),this._docAttachments.set(e,s),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,s=[];for([t,i]of this._docModified)this._docPermanent.get(t)||s.push({id:t,modified:i});return s.sort((e,t)=>e.modified-t.modified),s.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 s={sizeKB:this.sizeKB,length:this.length,createdAt:this.createdAt,modifiedAt:this.modifiedAt},r=this._serializer.serialize(s),a=this._base64.encode(r);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,s){var r=localStorage.getItem(`lacertadb_${e}_${t}_collmeta`);if(r)try{var a=s.decode(r),n=i.deserialize(a);return new nt(t,n,i,s,e)}catch(e){console.warn("CollectionMetadata corrupted, resetting:",e)}return new nt(t,{},i,s,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 ot{constructor(e,t={},i,s){this.name=e,this._serializer=i,this._base64=s,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 s=localStorage.getItem(`lacertadb_${e}_metadata`);if(s)try{var r=i.decode(s),a=t.deserialize(r);return new ot(e,a,t,i)}catch(e){console.error("Failed to load metadata:",e)}return new ot(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),s=this._base64.encode(i);localStorage.setItem(e,s),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 ht{constructor(e,t={},i,s){this.dbName=e,this._serializer=i,this._base64=s,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 s=localStorage.getItem(`lacertadb_${e}_settings`);if(s)try{var r=i.decode(s),a=t.deserialize(r);return new ht(e,a,t,i)}catch(e){console.error("Failed to load settings:",e)}return new ht(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),s=this._base64.encode(i);localStorage.setItem(e,s)}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 lt=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 s=t[i];if(i.startsWith("$")){var r=this.operators[i];if(!r||!r(e,s))return!1}else{var a=this.getFieldValue(e,i);if("object"!=typeof s||null===s||Array.isArray(s)){if(a!==s)return!1}else for(var n in s)if(n.startsWith("$")){var o=this.operators[n];if(!o||!o(a,s[n]))return!1}}}return!0}getFieldValue(e,t){let i=e;for(var s of t.split(".")){if(null==i)return;i=i[s]}return i}};let ct=new class{constructor(){this.stages={$match:(e,t)=>e.filter(e=>lt.evaluate(e,t)),$project:(e,t)=>e.map(e=>{var i,s={};for(i in t){var r=t[i];1===r||!0===r?s[i]=lt.getFieldValue(e,i):"string"==typeof r&&r.startsWith("$")&&(s[i]=lt.getFieldValue(e,r.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 s}),$sort:(e,t)=>[...e].sort((e,i)=>{for(var s in t){var r=t[s],a=lt.getFieldValue(e,s);if(a<(s=lt.getFieldValue(i,s)))return-r;if(s<a)return r}return 0}),$limit:(e,t)=>e.slice(0,t),$skip:(e,t)=>e.slice(t),$group:(e,t)=>{var i,s=new Map,r=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 lt.getFieldValue(e,t.substring(1));if(null===t||"object"!=typeof t||Array.isArray(t))return t;var i,s={};for(i in t)s[i]=n(e,t[i]);return s};for(i of e){let e;e="string"==typeof r?r.startsWith("$")?lt.getFieldValue(i,r.substring(1)):r:null!==r&&"object"==typeof r?a(n(i,r)):r,s.has(e)||s.set(e,{_id:e,docs:[]}),s.get(e).docs.push(i)}var o,h=[];for(o of s.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+(lt.getFieldValue(i,e)||0),0);break;case"$avg":var _=o.docs.reduce((t,i)=>t+(lt.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=>lt.getFieldValue(t,e)));break;case"$min":c[l]=Math.min(...o.docs.map(t=>lt.getFieldValue(t,e)))}}h.push(c)}return h},$lookup:async(e,t,i)=>{i=await(await i.getCollection(t.from)).getAll();let s=new Map;return i.forEach(e=>{var i=lt.getFieldValue(e,t.foreignField);s.has(i)||s.set(i,[]),s.get(i).push(e)}),e.map(e=>{var i=lt.getFieldValue(e,t.localField);return{...e,[t.as]:s.get(i)||[]}})}}}async execute(e,t,i){let s=e;for(var r of t){var a=Object.keys(r)[0],n=(r=r[a],this.stages[a]);if(!n)throw new Error("Unknown aggregation stage: "+a);s="$lookup"===a?await n(s,r,i):n(s,r)}return s}};class dt{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),s=t.split(".").map(Number),r=Math.max(i.length,s.length);for(let e=0;e<r;e++){var a=i[e]||0,n=s[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 s,r=await this.database.getCollection(i);for(s of await r.getAll()){var a=await e[t](s);a&&await r.update(s._id,a)}}}}class ut{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),s=(s=0<this._metrics.memoryUsage.length?this._metrics.memoryUsage[this._metrics.memoryUsage.length-1]:null)?s.used/1048576:0;return{opsPerSec:e,avgLatency:t.toFixed(2),cacheHitRate:i.toFixed(1),memoryUsageMB:s.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 _t{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 rt,this._opfs=new st,this._cleanupInterval=null,this._events=new Map,this._indexManager=new it(this),this._cacheStrategy=new je({type:"lru",maxSize:100,ttl:6e4,enabled:!0}),this._docCache=new Ne(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=nt.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 $e("Document-level encryption requires database-level encryption. Use getSecureDatabase() to create an encrypted database.","ENCRYPTION_NOT_INITIALIZED");await this._trigger("beforeAdd",e);e=new at({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?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,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,s;if((this._initialized||await this.init(),!t.includeAttachments)&&(s=this._docCache.get(e)))return s;if(s=await this._indexedDB.get(this._db,this._storeName,e))return i=new at(s,{encrypted:s._encrypted,compressed:s._compressed},this._serializer),s.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),s=i.objectOutput(t.includeAttachments),t.includeAttachments||this._docCache.set(e,s),s;throw new $e(`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(it.IDX_PREFIX))),Promise.all(e.map(async e=>{try{var t=new at(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 s,r,a=await this._indexedDB.get(this._db,this._storeName,e);if(a)return r=new at(a,{},this._serializer),a.packedData&&await r.unpack(this.database.encryption),s=r.objectOutput(),r={...r.data,...t},(t=new at({_id:e,_created:a._created,data:r},{compressed:void 0!==i.compressed?i.compressed:a._compressed,permanent:void 0!==i.permanent?i.permanent:a._permanent},this._serializer))._modified=Date.now(),(r=i.attachments)&&0<r.length?(await this._opfs.deleteAttachments(this.database.name,this.name,e),i=await Promise.all(r.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),r=t.databaseOutput(),await this._indexedDB.put(this._db,this._storeName,r),i=t.objectOutput(),await this._indexManager.updateIndexForDocument(t._id,s,i),a=r.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 $e(`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 $e("Document not found for deletion","DOCUMENT_NOT_FOUND");if(i._permanent&&!t.force)throw new $e("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,s,r=performance.now(),a=JSON.stringify({f:e,o:t},(e,t)=>{if(!t||"object"!=typeof t||Array.isArray(t))return t;var i,s={};for(i of Object.keys(t).sort())s[i]=t[i];return s}),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,s]of this._indexManager.indexes){var l=e[s.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=>lt.evaluate(t,e)))),t.sort&&(o=ct.stages.$sort(o,t.sort)),t.skip&&(o=ct.stages.$skip(o,t.skip)),t.limit&&(o=ct.stages.$limit(o,t.limit)),t.projection&&(o=ct.stages.$project(o,t.projection)),this._performanceMonitor&&this._performanceMonitor.recordOperation(h?"indexed-query":"full-scan-query",performance.now()-r),this._cacheStrategy.set(a,o),o}async aggregate(e){this._initialized||await this.init();var t=performance.now();let i,s=e;return 0<e.length&&e[0].$match?(i=await this.query(e[0].$match),s=e.slice(1)):i=await this.getAll(),e=await ct.execute(i,s,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(),s=[];let r=[];var a,n=!this.database.encryption&&!t.compressed;for(a of e){var o=new at({data:a},{compressed:t.compressed||!1,permanent:t.permanent||!1},this._serializer);n?o.packSync():await o.pack(this.database.encryption),s.push({type:"add",data:o.databaseOutput()}),r.push(o)}var h,l,c,d=await this._indexedDB.batchOperation(this._db,s,this._storeName);for(let e=0;e<r.length;e++)d[e].success&&(l=(h=r[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:r[t]._id}))}async batchUpdate(e,t={}){this._initialized||await this.init();var i=performance.now(),s=[],r=[];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 at(_,{},this._serializer),_.packedData&&await u.unpack(this.database.encryption),r.push(u.objectOutput()),u={...u.data,...o.data},(u=new at({_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),s.push({type:"put",data:u.databaseOutput()})):h.push({success:!1,id:o.id,error:"Document not found"})}if(0===s.length)return h;var f,p,y,m=await this._indexedDB.batchOperation(this._db,s,this._storeName);for(let e=0;e<a.length;e++)m[e].success&&(p=(f=a[e]).objectOutput(),await this._indexManager.updateIndexForDocument(f._id,r[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),[...m.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 s=[];var r,a,n=[];for({id:r,options:a}of e){var o,h=await this._indexedDB.get(this._db,this._storeName,r);h?h._permanent&&!a.force?n.push({success:!1,id:r,error:"Cannot delete permanent document without force flag"}):(o=await this.get(r),s.push({id:r,fullDoc:o,stored:h}),i.push({type:"delete",key:r})):n.push({success:!1,id:r,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<s.length;e++)u[e].success&&(({id:l,fullDoc:c,stored:d}=s[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:s[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 nt(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 ft{constructor(e,t,i,s){this.name=e,this._collections=new Map,this._metadata=null,this._settings=null,this._quickStore=null,this._performanceMonitor=t,this._serializer=i,this._base64=s,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,s)=>{let r=indexedDB.open("lacertadb_"+this.name,e);r.onerror=()=>s(new $e("Failed to open database","DATABASE_OPEN_FAILED",r.error)),r.onsuccess=()=>i(r.result),r.onupgradeneeded=e=>{var i,s=e.target.result;for(i of t)s.objectStoreNames.contains(i)||s.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=ot.load(this.name,this._serializer,this._base64),this._settings=ht.load(this.name,this._serializer,this._base64),this._quickStore=new Fe(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 s=`lacertadb_${this.name}_encryption`;let r=null;var a=((a=localStorage.getItem(s))&&(a=this._base64.decode(a),r=this._serializer.deserialize(a)),this._encryption=new Xe(i,this._serializer,this._base64),await this._encryption.initialize(e,r));r||(i=this._serializer.serialize(a),e=this._base64.encode(i),localStorage.setItem(s,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 s=await this.getCollection("__private_keys__").catch(()=>null);return await(s=s||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 $e(`Collection '${e}' already exists.`,"COLLECTION_EXISTS");await this._ensureStore(e);var i=new _t(e,this);return this._collections.set(e,i),this._metadata.collections[e]||this._metadata.setCollection(new nt(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 _t(e,this),this._collections.set(e,t),await t.init(),t;throw new $e(`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 _t(e,this),this._collections.set(e,t),this._metadata.collections[e]||this._metadata.setCollection(new nt(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 rt).clear(this._db,e)}catch(e){}let i=this.name+"_"+e;try{await new Promise((e,t)=>{var s=indexedDB.deleteDatabase(i);s.onsuccess=e,s.onerror=e,s.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 r=0;for(let a of t){let t=this.name+"_"+a;try{let e=await new Promise((e,i)=>{let s=indexedDB.open(t,1);s.onerror=()=>e(null),s.onsuccess=()=>e(s.result),s.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 s=e.transaction("documents","readonly").objectStore("documents").getAll();s.onsuccess=()=>t(s.result||[]),s.onerror=()=>t([])});if(e.close(),0!==i.length){await this._ensureStore(a);var s=new rt;let e=i.map(e=>({type:"put",data:e}));await s.performTransaction(this._db,[a],"readwrite",t=>{let i=t.objectStore(a);return t=e.map(e=>new Promise((t,s)=>{var r=i.put(e.data);r.onsuccess=()=>t(),r.onerror=()=>t()})),Promise.all(t)}),await new Promise(e=>{var i=indexedDB.deleteDatabase(t);i.onsuccess=e,i.onerror=e,i.onblocked=e}),r++}}else e.close();else indexedDB.deleteDatabase(t)}catch(e){console.warn(`[LacertaDB] Migration of '${a}' failed:`,e.message)}}0<r&&console.log(`[LacertaDB] Migrated ${r} 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,s,r,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 r=this._serializer.serialize(a),this._base64.encode(r);if("encrypted"===e&&t)return r=new We,s=this._serializer.serialize(a),r=await r.encrypt(s,t),this._base64.encode(r);throw new $e("Unsupported export format: "+e,"INVALID_FORMAT")}async import(e,t="json",i=null){let s;try{var r,a=this._base64.decode(e);s="encrypted"===t&&i?(r=await(new We).decrypt(a,i),this._serializer.deserialize(r)):this._serializer.deserialize(a)}catch(e){throw new $e("Failed to parse import data","IMPORT_PARSE_FAILED",e)}for(var n in s.collections){var o=s.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(s.collections).reduce((e,t)=>e+t.length,0),{collections:Object.keys(s.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 ot(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 ut,e={...Pe,...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,sortKeys:e.sortKeys||!1,memoryPoolSize:e.memoryPoolSize||65536,...e},this.options.allowFunction||(this.options.serializeFunctions=!1),e=Math.max(this.options.memoryPoolSize,65536),this.buf=new Uint8Array(e),this.dv=new DataView(this.buf.buffer),this.pos=0,this.enc=new TextEncoder,this.dec=new TextDecoder,this.refs=new Map,this.circularRefs=new Set,this.strings=new Map,this.buffers=new Map,this.deserializeRefs=null,this.deserializeStrings=null,this.deserializeBuffers=null,this.buffer=null,this.view=null}_grow(e){var t=this.pos+e;if(!(t<=this.buf.length)){let i=this.buf.length;for(;i<t;)i<<=1;(e=new Uint8Array(i)).set(this.buf.subarray(0,this.pos)),this.buf=e,this.dv=new DataView(e.buffer)}}serialize(e){return this.resetState(),this._grow(5),this.dv.setUint32(0,Ve,!0),this.buf[4]=6,this.pos=5,this.options.detectCircular&&this.detectCircularReferences(e,new WeakSet),this.writeValue(e),this.buf.slice(0,this.pos)}deserialize(e){if(this.buffer=e instanceof Uint8Array?e:new Uint8Array(e),this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength),this.pos=0,this.deserializeRefs=[],this.deserializeStrings=[],this.deserializeBuffers=[],this.view.getUint32(0,!0)!==Ve)throw new Error("Invalid TurboSerial data");if(6!==this.buffer[4])throw new Error("Unsupported version: "+this.buffer[4]);return this.pos=5,this.readValue()}resetState(){this.pos=0,this.refs.clear(),this.circularRefs.clear(),this.strings.clear(),this.buffers.clear()}resetMemory(e={}){return e=e.shrink?Math.max(this.options.memoryPoolSize||65536,256):this.buf.length,this.buf=new Uint8Array(e),this.dv=new DataView(this.buf.buffer),this.pos=0,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}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,s=e.length;i<s;i++)i in e&&this.detectCircularReferences(e[i],t);else if(e instanceof Map)for(var[i,s]of e)this.detectCircularReferences(i,t),this.detectCircularReferences(s,t);else if(e instanceof Set)for(var r of e)this.detectCircularReferences(r,t);else{var a=Object.keys(e);for(let s=0;s<a.length;s++)try{this.detectCircularReferences(e[a[s]],t)}catch(i){}}}finally{t.delete(e)}}}_wV(e){var t=this.buf;let i=this.pos;if((e>>>=0)<128)t[i]=e,this.pos=i+1;else if(e<16384)t[i]=127&e|128,t[i+1]=e>>>7,this.pos=i+2;else{for(;128<=e;)t[i++]=127&e|128,e>>>=7;t[i++]=e,this.pos=i}}writeValue(e){if(null===e)this._grow(1),this.buf[this.pos++]=0;else if(void 0===e)this._grow(1),this.buf[this.pos++]=1;else{var t=typeof e;if("boolean"==t)this._grow(1),this.buf[this.pos++]=e?3:2;else if("number"==t)this._wNum(e);else if("string"==t)this._wStrDedup(e);else if("bigint"==t)this._wBigInt(e);else if("symbol"==t)this._grow(2),void 0!==(i=Symbol.keyFor(e))?(this.buf[this.pos++]=we,this.writeValue(i)):n.has(e)?(this.buf[this.pos++]=ge,this.writeValue(n.get(e))):void 0===e.description?this.buf[this.pos++]=ve:(this.buf[this.pos++]=me,this.writeValue(e.description));else if("function"==t)this._grow(1),this.buf[this.pos++]=this.options.allowFunction?be:c;else{if(this.options.detectCircular&&this.circularRefs.has(e)){var i=this.refs.get(e);if(void 0!==i)return this._grow(6),this.buf[this.pos++]=ye,void this._wV(i);this.refs.set(e,this.refs.size)}if(this.options.deduplication&&!this.circularRefs.has(e)){if(void 0!==(t=this.refs.get(e)))return this._grow(6),this.buf[this.pos++]=pe,void this._wV(t);this.refs.set(e,this.refs.size)}if(this.options.shareArrayBuffers&&e instanceof ArrayBuffer){if(void 0!==(i=this.buffers.get(e)))return this._grow(6),this.buf[this.pos++]=J,void this._wV(i);this.buffers.set(e,this.buffers.size)}this._wObj(e)}}}_wStrDedup(e){if(this.options.deduplication&&3<e.length){var t=this.strings.get(e);if(void 0!==t)return this._grow(6),this.buf[this.pos++]=U,void this._wV(t);this.strings.set(e,this.strings.size)}this._wStr(e)}_wNum(e){this._grow(10);var t,i=this.pos;e!=e?(this.buf[i]=m,this.pos=i+1):e===1/0?(this.buf[i]=w,this.pos=i+1):e===-1/0?(this.buf[i]=g,this.pos=i+1):0===e&&1/e<0?(this.buf[i]=v,this.pos=i+1):e===(t=0|e)?-128<=t&&t<=127?(this.buf[i]=d,this.buf[i+1]=255&t,this.pos=i+2):-32768<=t&&t<=32767?(this.buf[i]=u,this.dv.setInt16(i+1,t,!0),this.pos=i+3):(this.buf[i]=_,this.dv.setInt32(i+1,t,!0),this.pos=i+5):e===(t=e>>>0)?(this.buf[i]=f,this.dv.setUint32(i+1,t,!0),this.pos=i+5):(a[0]=e,a[0]===e?(this.buf[i]=p,this.dv.setFloat32(i+1,e,!0),this.pos=i+5):(this.buf[i]=y,this.dv.setFloat64(i+1,e,!0),this.pos=i+9))}_wBigInt(e){this._grow(10);var t=e<0n,i=t?-e:e;if(i<=0x7fffffffffffffffn)this.buf[this.pos++]=t?x:S,this.dv.setBigInt64(this.pos,e,!0),this.pos+=8;else{this.buf[this.pos++]=t?z:A;let s=i.toString(16);e=(s=1&s.length?"0"+s:s).length>>>1,this._grow(5+e),this._wV(e);for(let e=s.length-2;0<=e;e-=2)this.buf[this.pos++]=parseInt(s.substr(e,2),16);s.length%2&&(this.buf[this.pos++]=parseInt(s[0],16))}}_wStr(e){var t=e.length;if(0===t)this._grow(1),this.buf[this.pos++]=I;else if(t<128){let s=1;for(let i=0;i<t;i++)if(127<e.charCodeAt(i)){s=0;break}if(s){this._grow(t+2);var i=this.pos;this.buf[i++]=t<16?k:D,this.buf[i++]=t;for(let s=0;s<t;s++)this.buf[i+s]=e.charCodeAt(s);return void(this.pos=i+t)}let r=this.enc.encode(e),a=r.length,n=(this._grow(a+7),this.pos);this.buf[n++]=a<16?C:a<256?T:M,a<256?this.buf[n++]=a:(this.pos=n,this._wV(a),n=this.pos),this.buf.set(r,n),this.pos=n+a}else{let i=this.enc.encode(e),s=i.length,r=(this._grow(s+7),this.pos);s===t?(this.buf[r++]=t<256?D:E,t<256?this.buf[r++]=t:(this.pos=r,this._wV(t),r=this.pos)):(this.buf[r++]=s<256?T:M,s<256?this.buf[r++]=s:(this.pos=r,this._wV(s),r=this.pos)),this.buf.set(i,r),this.pos=r+s}}_wObj(e){if(Array.isArray(e))this._wArr(e);else{var t=e.constructor;if(void 0!==(t=ke.get(t))){if(t===te)return this._grow(9),void((a=e.getTime())!=a?this.buf[this.pos++]=ie:(this.buf[this.pos++]=te,this.dv.setFloat64(this.pos,a,!0),this.pos+=8));if(t===ue)return this._grow(1),this.buf[this.pos++]=ue,this.writeValue(e.source),void this.writeValue(e.flags);if(t===Z){for(var[i,s]of(this._grow(6),this.buf[this.pos++]=Z,this._wV(e.size),e))this.writeValue(i),this.writeValue(s);return}if(t===ee){for(var r of(this._grow(6),this.buf[this.pos++]=ee,this._wV(e.size),e))this.writeValue(r);return}if(t===Q||t===Y)return this._grow(6),this.buf[this.pos++]=t,a=new Uint8Array(e),this._wV(a.length),this._grow(a.length),this.buf.set(a,this.pos),void(this.pos+=a.length);if(96==(240&t))return void this._wTypedArr(e,t)}if(e instanceof Error){this._grow(2);var a=Ue.get(e.constructor.name)||de;if(this.buf[this.pos++]=a,this.writeValue(e.message||""),this.writeValue(e.stack||""),a===ce&&e.errors)for(var n of(this._wV(e.errors.length),e.errors))this.writeValue(n)}else"undefined"!=typeof Blob&&e instanceof Blob?(this._grow(12),this.buf[this.pos++]=e instanceof File?fe:_e,this._wV(0),this._wV(0)):this._wPlainObj(e)}}_wArr(e){var t=e.length;if(0===t)this._grow(1),this.buf[this.pos++]=V;else{let a=!1;for(let i=0;i<t;i++)if(!(i in e)){a=!0;break}if(a){this._grow(12),this.buf[this.pos++]=L,this._wV(t);var i,s=[];for(let i=0;i<t;i++)i in e&&s.push(i);for(i of(this._wV(s.length),s))this._wV(i),this.writeValue(e[i])}else{if(this.options.simdOptimization&&8<=t&&"number"==typeof e[0]){var r=this._detectPacked(e,t);if(r)return this._grow(6),this.buf[this.pos++]=r,void this._wPacked(e,t,r)}this._grow(6),this.buf[this.pos++]=B,this._wV(t);for(let i=0;i<t;i++)this.writeValue(e[i])}}}_detectPacked(e,t){let i=1,s=e[0],r=e[0],n=1;for(let h=0;h<t;h++){var o=e[h];if("number"!=typeof o)return 0;o!==(0|o)&&(i=0),o<s&&(s=o),o>r&&(r=o),n&&(a[0]=o,a[0]!==o)&&(n=0)}var h;return i?(h=Math.max(Math.abs(s),Math.abs(r)))<=127?P:h<=32767?F:K:n?O:$}_wPacked(e,t,i){this.dv,this._wV(t);var s=Se[i]||1;this._grow(t*s);let r=this.pos;switch(i){case P:for(let i=0;i<t;i++)this.buf[r++]=255&e[i];break;case F:for(let i=0;i<t;i++)this.dv.setInt16(r,e[i],!0),r+=2;break;case K:for(let i=0;i<t;i++)this.dv.setInt32(r,e[i],!0),r+=4;break;case O:for(let i=0;i<t;i++)this.dv.setFloat32(r,e[i],!0),r+=4;break;case $:for(let i=0;i<t;i++)this.dv.setFloat64(r,e[i],!0),r+=8}this.pos=r}_wTypedArr(e,t){this._grow(12),this.buf[this.pos++]=t;var i=e.buffer;if(this.options.shareArrayBuffers){var s=this.buffers.get(i);if(void 0!==s)return this.buf[this.pos++]=1,this._wV(s),this._wV(e.byteOffset),void this._wV(e.length);this.buffers.set(i,this.buffers.size)}if(this.buf[this.pos++]=0,this._wV(e.byteOffset),this._wV(e.length),s=Se[t]||1,t===W||t===X){this._grow(8*e.length);for(let t=0;t<e.length;t++)this.dv.setBigInt64(this.pos,e[t],!0),this.pos+=8}else t=e.length*s,this._grow(t),s=new Uint8Array(i,e.byteOffset,t),this.buf.set(s,this.pos),this.pos+=t}_wPlainObj(e){var t=Object.getPrototypeOf(e),i=(t=e.constructor===Object||t===Object.prototype||null===t,Object.keys(e));if(0===i.length&&t)this._grow(1),this.buf[this.pos++]=N;else if(t){if(this.options.preservePropertyDescriptors){var s;t=[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)];let i=!1;for(s of t){var r=Object.getOwnPropertyDescriptor(e,s);if(r.get||r.set||!r.enumerable||!r.writable||!r.configurable){i=!0;break}}if(i)return void this._wDescriptorObj(e,t)}let n=!1;if(this.options.allowFunction)for(let t=0;t<i.length;t++)if("function"==typeof e[i[t]]){n=!0;break}if(n)this._wMethodObj(e,i);else{this._grow(6),this.buf[this.pos++]=q,this.options.sortKeys&&i.sort();let t=i.length;if(!this.options.serializeFunctions)for(let s=t=0;s<i.length;s++)"function"!=typeof e[i[s]]&&t++;this._wV(t);for(let t=0;t<i.length;t++){var a=e[i[t]];!this.options.serializeFunctions&&"function"==typeof a||(this.writeValue(i[t]),this.writeValue(a))}}}else this._wConstructorObj(e,i)}_wDescriptorObj(e,t){this._grow(6),this.buf[this.pos++]=H;var i;t=t.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(i of(this._wV(t.length),t)){this.writeValue(i);var s=Object.getOwnPropertyDescriptor(e,i);let t=0;s.enumerable&&(t|=1),s.writable&&(t|=2),s.configurable&&(t|=4),s.get&&(t|=8),s.set&&(t|=16),this._grow(1),this.buf[this.pos++]=t,s.get||s.set?(s.get&&this.writeValue(s.get),s.set&&this.writeValue(s.set)):this.writeValue(s.value)}}_wMethodObj(e,t){this._grow(6),this.buf[this.pos++]=G;var i,s,r,a,n=[];for(i of t)try{var o=e[i];n.push([i,o,"function"==typeof o])}catch(e){}for([s,r,a]of(this._wV(n.length),n))this.writeValue(s),this._grow(1),this.buf[this.pos++]=a?1:0,a&&this.options.serializeFunctions?(this.writeValue(r.toString()),this.writeValue(r.name||"")):a?(this._grow(1),this.buf[this.pos++]=be):this.writeValue(r)}_wConstructorObj(e,t){this._grow(6),this.buf[this.pos++]=j,this.writeValue((null==(s=e.constructor)?void 0:s.name)||"");var i,s=this.options.serializeFunctions?t:t.filter(t=>{try{return"function"!=typeof e[t]}catch(t){return!1}});for(i of(this._wV(s.length),s))this.writeValue(i),this.writeValue(e[i])}readValue(){this.buffer;var e=this.buf[this.pos++];if(e===pe||e===ye)return this.deserializeRefs[this._rV()];if(e===U)return this.deserializeStrings[this._rV()];if(e===J)return this.deserializeBuffers[this._rV()];var t,i=240&e;if(0==i)return 0===e?null:1===e?void 0:3===e;if(16==i)return this._rNum(e);if(32==i)return this._rBigInt(e);if(48==i)return this._rStr(e);if(64==i||80==i||128==i){let t;return t=64==i?[]:128==i?new(e===Z?Map:Set):{},this.deserializeRefs.push(t),this._rFill(t,e,i),t}if(96==i)return t=this._rTypedArr(e),this.deserializeRefs.push(t),t;if(112==i)return t=this._rArrayBuf(e),this.deserializeBuffers.push(t),t;if(144==i)return e===ie?new Date(NaN):(t=this.view.getFloat64(this.pos,!0),this.pos+=8,new Date(t));if(160==i)return this._rError(e);if(176==i)return new RegExp(this.readValue(),this.readValue());if(192==i)return this._rV(),this._rV(),{_type:"Binary"};if(224==i)return this._rSpecial(e);if(240==i)return this.options.allowFunction?function(){throw new Error("Function not serialized")}:void 0;throw new Error("Unknown type: 0x"+e.toString(16))}_rV(){this.buffer;let e=this.pos,t=this.buf[e++];if(!(128&t))return this.pos=e,t;let i=127&t,s=7;for(;t=this.buf[e++],i|=(127&t)<<s,s+=7,128&t;);return this.pos=e,i>>>0}_rFill(e,t,i){if(64===i){if(t!==V)if(t===B){var s=this._rV();for(let t=0;t<s;t++)e[t]=this.readValue()}else if(t===L){e.length=this._rV();var r=this._rV();for(let t=0;t<r;t++)e[this._rV()]=this.readValue()}else{var a=this._rPacked(t);for(let t=0;t<a.length;t++)e.push(a[t])}}else if(80===i)this.fillObject(e,t);else if(128===i){var n=this._rV();if(t===Z)for(let t=0;t<n;t++)e.set(this.readValue(),this.readValue());else for(let t=0;t<n;t++)e.add(this.readValue())}}fillObject(e,t){if(t!==N)if(t===q||t===R){var i=this._rV();for(let t=0;t<i;t++)e[this.readValue()]=this.readValue()}else if(t===H){var s=this._rV();for(let t=0;t<s;t++){var r=this.readValue(),a=this.buffer[this.pos++],n={enumerable:!!(1&a),writable:!!(2&a),configurable:!!(4&a)};8&a||16&a?(8&a&&(n.get=this.readValue()),16&a&&(n.set=this.readValue())):n.value=this.readValue(),Object.defineProperty(e,r,n)}}else if(t===G){var o=this._rV();for(let i=0;i<o;i++){var h=this.readValue();if(this.buffer[this.pos++])if(this.options.allowFunction&&this.options.serializeFunctions){var l=this.readValue();this.readValue();try{e[h]=new Function("return "+l)()}catch(t){e[h]=void 0}}else this.options.serializeFunctions?(this.readValue(),this.readValue(),e[h]=void 0):(this.pos++,e[h]=this.options.allowFunction?function(){throw new Error("Not serialized")}:void 0);else e[h]=this.readValue()}}else if(t===j){t=this.readValue();var c=this._rV();for(let t=0;t<c;t++)e[this.readValue()]=this.readValue();Object.defineProperty(e,"__constructorName",{value:t,enumerable:!1,writable:!1,configurable:!0})}}_rNum(e){this.view;let t,i=this.pos;switch(e){case d:return t=this.buffer[i]<<24>>24,this.pos=i+1,t;case u:return t=this.dv.getInt16(i,!0),this.pos=i+2,t;case _:return t=this.dv.getInt32(i,!0),this.pos=i+4,t;case f:return t=this.dv.getUint32(i,!0),this.pos=i+4,t;case p:return t=this.dv.getFloat32(i,!0),this.pos=i+4,t;case y:return t=this.dv.getFloat64(i,!0),this.pos=i+8,t;case m:return NaN;case w:return 1/0;case g:return-1/0;case v:return-0;case b:return t=this._rV(),this.buffer[this.pos++]?-t:t}}_rBigInt(e){if(e===S||e===x){let e=this.view.getBigInt64(this.pos,!0);return this.pos+=8,e}e=e===z;var t=this._rV();let i="";for(let e=t-1;0<=e;e--)i+=this.buffer[this.pos+e].toString(16).padStart(2,"0");this.pos+=t;let s=BigInt("0x"+(i||"0"));return e?-s:s}_rStr(e){if(e===I)return"";var t=this.buffer;let i,r;return i=e===k||e===D||e===C||e===T?this.buf[this.pos++]:this._rV(),r=(e=e===k||e===D||e===E)&&i<128?s[i](t,this.pos):this.dec.decode(t.subarray(this.pos,this.pos+i)),this.pos+=i,3<r.length&&this.deserializeStrings.push(r),r}_rPacked(e){var t=this._rV(),i=new Array(t);this.view;let s=this.pos;switch(e){case P:for(let e=0;e<t;e++)i[e]=this.buffer[s++]<<24>>24;break;case F:for(let e=0;e<t;e++)i[e]=this.dv.getInt16(s,!0),s+=2;break;case K:for(let e=0;e<t;e++)i[e]=this.dv.getInt32(s,!0),s+=4;break;case O:for(let e=0;e<t;e++)i[e]=this.dv.getFloat32(s,!0),s+=4;break;case $:for(let e=0;e<t;e++)i[e]=this.dv.getFloat64(s,!0),s+=8}return this.pos=s,i}_rTypedArr(e){if(this.buffer[this.pos++]){let t=this._rV(),i=this._rV(),s=this._rV();return new xe[e](this.deserializeBuffers[t],i,s)}this._rV();let t=this._rV(),i=Se[e]||1;if(e===W||e===X){var s=[];for(let e=0;e<t;e++)s.push(this.view.getBigInt64(this.pos,!0)),this.pos+=8;return new xe[e](s)}var r=t*i,a=new ArrayBuffer(r);return new Uint8Array(a).set(this.buffer.subarray(this.pos,this.pos+r)),this.pos+=r,this.deserializeBuffers.push(a),new xe[e](a,0,t)}_rArrayBuf(e){var t=this._rV(),i=this.buffer.buffer.slice(this.buffer.byteOffset+this.pos,this.buffer.byteOffset+this.pos+t);return this.pos+=t,i}_rError(e){var t=this.readValue(),i=this.readValue();let s;if(e===ce){var r=this._rV(),a=[];for(let e=0;e<r;e++)a.push(this.readValue());s=new AggregateError(a,t)}else s=new(Me[e]||Error)(t);return i&&(s.stack=i),s}_rSpecial(e){if(e===me)return Symbol(this.readValue());if(e===ve)return Symbol();if(e===we)return Symbol.for(this.readValue());if(e===ge)return o.get(this.readValue())||Symbol();throw new Error("Unknown special type: 0x"+e.toString(16))}}(e),this._base64=new Le.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 ft(e,this._performanceMonitor,this._serializer,this._base64)).init(t),this._databases.set(e,i)),this._databases.get(e)}async getSecureDatabase(e,t,i=null,s={}){return this.getDatabase(e,{pin:t,salt:i,encryptionConfig:s})}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 Fe(e,this._serializer,this._base64).clear();var i=[];for(let t=0;t<localStorage.length;t++){var s=localStorage.key(t);s&&s.startsWith(`lacertadb_${e}_`)&&i.push(s)}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 s=await(await this.getDatabase(t)).export("json");s=this._base64.decode(s);i.databases[t]=this._serializer.deserialize(s)}var r=this._serializer.serialize(i);return e?(e=await(new We).encrypt(r,e),this._base64.encode(e)):this._base64.encode(r)}async restoreBackup(e,t=null){let i;try{var s,r=this._base64.decode(e);i=t?(s=await(new We).decrypt(r,t),this._serializer.deserialize(s)):this._serializer.deserialize(r)}catch(e){throw new $e("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()}}}]);
|
|
9
|
+
"undefined"==typeof window||window.requestIdleCallback||(window.requestIdleCallback=function(e){return setTimeout(e,0)},window.cancelIdleCallback=clearTimeout);let Pe={compression:!1,preservePropertyDescriptors:!1,deduplication:!1,simdOptimization:!0,detectCircular:!1,shareArrayBuffers:!1,allowFunction:!1,serializeFunctions:!1,memoryPoolSize:262144};class Fe{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 s=this._keyPrefix+"data_"+t,r=localStorage.getItem(s);if(r)try{var a=this._base64.decode(r);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,s=this._keyPrefix+"data_"+e,r=this._docs.get(e);void 0!==r?(t=this._serializer.serialize(r),i=this._base64.encode(t),localStorage.setItem(s,i)):localStorage.removeItem(s)}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=>lt.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 Ke{constructor(){this._connections=new Map,this._refCounts=new Map}async getConnection(e,t=1,i){let s=e+"_v"+t;var r;return this._connections.has(s)?(this._refCounts.set(s,(this._refCounts.get(s)||0)+1),this._connections.get(s)):((r=await new Promise((s,r)=>{let a=indexedDB.open(e,t);a.onerror=()=>r(new $e("Failed to open database","DATABASE_OPEN_FAILED",a.error)),a.onsuccess=()=>s(a.result),a.onupgradeneeded=e=>{i&&i(e.target.result,e.oldVersion,e.newVersion)}})).onclose=()=>{this._connections.delete(s),this._refCounts.delete(s)},this._connections.set(s,r),this._refCounts.set(s,1),r)}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 Ke;class Oe{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 $e 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 Ne{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 Re{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,s=(this._frequencies.set(e,i),this._buckets.get(t));return s&&(s.delete(e),0===s.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 qe{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 je{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 qe(i):new("lfu"===e?Re:Ne)(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 He{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(),s=new Uint8Array(i.byteLength+1);return s[0]=1,s.set(new Uint8Array(i),1),s}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 s=new Response(i).body.pipeThrough(new DecompressionStream("deflate")),r=await new Response(s).arrayBuffer();return new Uint8Array(r)}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 Ge=new He;class We{async encrypt(e,t){var i=new TextEncoder,s=crypto.getRandomValues(new Uint8Array(16)),r=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:s,iterations:6e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"]),t=await crypto.subtle.encrypt({name:"AES-GCM",iv:r},i,e);return(i=new Uint8Array(s.length+r.length+t.byteLength)).set(s,0),i.set(r,s.length),i.set(new Uint8Array(t),s.length+r.length),i}async decrypt(e,t){var i=new TextEncoder,s=e.slice(0,16),r=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:s,iterations:6e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"]),s=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},i,e);return new Uint8Array(s)}}class Xe{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),s=(t=this._base64.decode(t.wrappedKey)).slice(0,12);t=t.slice(12);try{var r=await crypto.subtle.decrypt({name:"AES-GCM",iv:s},i,t);await this._importMasterKeys(r)}catch(e){throw new Error("Invalid PIN or corrupted key data")}}else this._salt=crypto.getRandomValues(new Uint8Array(this._saltLength)),s=await this._deriveKEK(e,this._salt),i=crypto.getRandomValues(new Uint8Array(64)),await this._importMasterKeys(i.buffer),t=crypto.getRandomValues(new Uint8Array(12)),r=await crypto.subtle.encrypt({name:"AES-GCM",iv:t},s,i),(e=new Uint8Array(12+r.byteLength)).set(t,0),e.set(new Uint8Array(r),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=(s=this._base64.decode(this._wrappedKeyBlob)).slice(0,12),s=s.slice(12);try{await crypto.subtle.decrypt({name:"AES-GCM",iv:i},e,s)}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),s=await this._exportMasterKeys(),t=crypto.getRandomValues(new Uint8Array(12)),e=await crypto.subtle.encrypt({name:"AES-GCM",iv:t},e,s),(s=new Uint8Array(12+e.byteLength)).set(t,0),s.set(new Uint8Array(e),12),this._salt=i,this._wrappedKeyBlob=this._base64.encode(s),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),s=((s=new Uint8Array(e.length+i.byteLength)).set(e,0),s.set(new Uint8Array(i),e.length),await crypto.subtle.sign("HMAC",this._hmacKey,s)),r=new Uint8Array(e.length+i.byteLength+32);return r.set(e,0),r.set(new Uint8Array(i),e.length),r.set(new Uint8Array(s),e.length+i.byteLength),r}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),s=(e=e.slice(12,-32),new Uint8Array(t.length+e.length));if(i=(s.set(t,0),s.set(e,t.length),await crypto.subtle.verify("HMAC",this._hmacKey,i,s)))return s=await crypto.subtle.decrypt({name:"AES-GCM",iv:t},this._masterKey,e),new Uint8Array(s);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=(s=new TextEncoder).encode(t);let i;i="string"==typeof e?s.encode(e):e instanceof Uint8Array?e:this._serializer.serialize(e);var s=crypto.getRandomValues(new Uint8Array(12)),r=(e=await crypto.subtle.encrypt({name:"AES-GCM",iv:s,additionalData:t,tagLength:128},this._masterKey,i),new Uint32Array([t.length])),a=new Uint8Array(16+t.length+e.byteLength);return a.set(s,0),a.set(new Uint8Array(r.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),s=e.slice(12,16),r=(s=new Uint32Array(s.buffer)[0],e.slice(16,16+s));e=e.slice(16+s),s=(new TextEncoder).encode(t);if(this._arrayEquals(r,s))return t=await crypto.subtle.decrypt({name:"AES-GCM",iv:i,additionalData:r,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 s=0;s<e.length;s++)i|=e[s]^t[s];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 Qe{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:s}=this.boundary,i=i/2,s=s/2;this.northeast=new Qe({x:e+i,y:t-s,w:i,h:s},this.capacity),this.northwest=new Qe({x:e-i,y:t-s,w:i,h:s},this.capacity),this.southeast=new Qe({x:e+i,y:t+s,w:i,h:s},this.capacity),this.southwest=new Qe({x:e-i,y:t+s,w:i,h:s},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 Je(e,t){var i,s;return e===t?0:(i=typeof e)==(s=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<s?-1:1}class Ye{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<Je(e,this.keys[t]);)t++;return t<this.n&&0===Je(e,this.keys[t])?this.values[t]:!this.leaf&&this.children[t]?this.children[t].search(e):null}rangeSearch(e,t,i,s=!1,r=!1){let a=0;if(null!==e)for(;a<this.n&&Je(this.keys[a],e)<0;)a++;for(;a<this.n;a++){if(null!==t){var n=Je(this.keys[a],t);if(r?0<=n:0<n)return void(!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,s,r))}!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,s,r);n=null===e?1:Je(this.keys[a],e);var o=null===t?-1:Je(this.keys[a],t);(null===e||(s?0<n:0<=n))&&(null===t||(r?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,s,r)}insertNonFull(e,t){let i=this.n-1;if(this.leaf){for(;0<=i&&0<Je(this.keys[i],e);)this.keys[i+1]=this.keys[i],this.values[i+1]=this.values[i],i--;0<=i&&0===Je(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<Je(this.keys[i],e);)i--;if(0<=i&&0===Je(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 s=Je(this.keys[i],e);if(0===s)return this.values[i]||(this.values[i]=new Set),void this.values[i].add(t);s<0&&i++}this.children[i]&&this.children[i].insertNonFull(e,t)}}}splitChild(e,t){var i=new Ye(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 s=t.keys[this.order-1],r=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]=s,this.values[e]=r,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],s=this.order;t.keys[s-1]=this.keys[e],t.values[s-1]=this.values[e];for(let e=0;e<i.n;e++)t.keys[s+e]=i.keys[e],t.values[s+e]=i.values[e];if(!t.leaf)for(let e=0;e<=i.n;e++)t.children[s+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,s=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(s,null,!0))}_remove(e,t,i){let s=0;for(;s<this.n&&0<Je(e,this.keys[s]);)s++;var r;if(s<this.n&&0===Je(e,this.keys[s])){let e=i;return!e&&this.values[s]&&(this.values[s].delete(t),e=0===this.values[s].size),!!e&&(this.leaf?this._removeFromLeaf(s):this._removeFromInternal(s),!0)}return!this.leaf&&(r=s===this.n,this.children[s]&&this.children[s].n<this.order&&this._fill(s),r&&s>this.n?!!this.children[s-1]&&this.children[s-1]._remove(e,t,i):!!this.children[s]&&this.children[s]._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++)Je(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 Ze{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 Ye(this._order,!1)).children[0]=this._root,i.splitChild(0,this._root);let r=0;var s=Je(i.keys[0],e);0===s?(i.values[0]||(i.values[0]=new Set),i.values[0].add(t)):(s<0&&r++,i.children[r].insertNonFull(e,t)),this._root=i}else this._root.insertNonFull(e,t);else this._root=new Ye(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,s=!1){return this._root?(this._root.rangeSearch(e,t,e=[],i,s),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 Ze(t);for(let t=0;t<e.length;t++){var[s,r]=e[t];if(null!=s)for(let e=0;e<r.length;e++)i.insert(s,r[e])}return i}}class et{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 s=this._invertedIndex.get(i);s&&(s.delete(e),0===s.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 tt{constructor(){this._tree=new Qe({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,s=t/111,r=(s={x:e.lng,y:e.lat,w:s,h:s},[]);for(i of this._tree.query(s)){var a=this._haversine(e,{lat:i.y,lng:i.x});a<=t&&r.push({docId:i.data,distance:a})}return r.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),s=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(s/2)*Math.sin(s/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 it{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 s=null;for(;;){var r,a,n=await this._collection._indexedDB.getBatch(this._collection._db,this._collection._storeName,s,200);if(0===n.length)break;for(r of n)if("string"==typeof r._id&&r._id.startsWith(it.IDX_PREFIX))s=r._id;else{s=r._id;let e=r;r.packedData&&(await(a=new at(r,{compressed:r._compressed,encrypted:r._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,s=""+it.IDX_PREFIX+e,r=await this._collection._indexedDB.get(this._collection._db,this._collection._storeName,s);return!!(r&&r._entries&&Array.isArray(r._entries))&&((i=Ze.fromSortedEntries(r._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 Ze)try{var i={_id:""+it.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 Ze;case"hash":return new Map;case"text":return new et;case"geo":return new tt;default:return new Map}}_addToIndex(e,t,i,s){switch(s){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[s,r]of this._indexes){var a,n=this._indexData.get(s);if(n){let o=t?this._getFieldValue(t,r.fieldPath):void 0,h=i?this._getFieldValue(i,r.fieldPath):void 0;if(r.hashed&&(o=o&&await this._hashVal(o),h=h&&await this._hashVal(h)),o!==h){switch(r.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"===r.type&&this._schedulePersist(s)}}}}async query(e,t){var i=this._indexes.get(e),s=this._indexData.get(e);if(i&&s)return i.hashed&&"object"!=typeof t&&(t=await this._hashVal(t)),this._queryIndex(s,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 s,r=void 0!==t.$gte,a=void 0!==t.$gt,n=void 0!==t.$lte,o=void 0!==t.$lt;return(r||a||n||o)&&(s=r?t.$gte:a?t.$gt:null,t=n?t.$lte:o?t.$lt:null,e.range(s,t,!r&&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 s of t.$in)(s=e.get(s))&&s.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=""+it.IDX_PREFIX+e,this._collection._indexedDB.delete(this._collection._db,this._collection._storeName,e).catch(()=>{})}_getFieldValue(e,t){var i;let s=e;for(i of t.split(".")){if(null==s)return;s=s[i]}return s}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=this._base64.decode(e),i=this._serializer.deserialize(t);if(i&&Array.isArray(i.indexes)){for(var s of i.indexes){let{name:e,...t}=s;this._indexes.set(e,t)}var r,a,n=[];for([r,a]of this._indexes)"btree"===a.type&&await this._restoreIndex(r)||n.push(r);if(0<n.length)for(var o of n)await this.rebuildIndex(o)}}catch(e){console.error("Failed to load index metadata:",e)}}getIndexStats(){var e,t,i={};for([e,t]of this._indexes){var s=this._indexData.get(e);i[e]={...t,size:s&&(s.size||s.length)||0,memoryUsage:this._estimateMemoryUsage(s)}}return i}_estimateMemoryUsage(e){return e?e instanceof Map?100*e.size:e instanceof Ze?120*e.size:0:0}async verifyIndexes(){var e,t,i={};for([e,t]of this._indexes){var s=this._indexData.get(e);s?s.verify?((s=s.verify()).requiresRebuild&&(await this.rebuildIndex(e),s.rebuilt=!0),i[e]=s):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 st{async saveAttachments(e,t,i,s){try{var r,a,n=[],o=await(await(await(await navigator.storage.getDirectory()).getDirectoryHandle(e,{create:!0})).getDirectoryHandle(t,{create:!0})).getDirectoryHandle(i,{create:!0});for([r,a]of s.entries()){var h=r+"_"+(a.name||"file"),l=await(await o.getFileHandle(h,{create:!0})).createWritable();let s;if(a.data instanceof Uint8Array)s=a.data;else if(a.data instanceof ArrayBuffer)s=new Uint8Array(a.data);else{if(!(a.data instanceof Blob))throw new TypeError("Unsupported attachment data type");s=new Uint8Array(await a.data.arrayBuffer())}var c=new Blob([s],{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:s.byteLength,originalName:a.originalName||a.name})}return n}catch(s){throw new $e("Failed to save attachments","ATTACHMENT_SAVE_FAILED",s)}}async getAttachments(e){var t,i=[],s=await navigator.storage.getDirectory();for(t of e)try{var r=t.path.split("/").filter(e=>e);let e=s;for(let t=0;t<r.length-1;t++)e=await e.getDirectoryHandle(r[t]);var a=await(await(await e.getFileHandle(r[r.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 s=await e.arrayBuffer();i=new Uint8Array(s)}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 rt{constructor(){this._mutex=new Oe}async performTransaction(e,t,i,s,r=3){return"readonly"===i?this._runTx(e,t,i,s,r):this._mutex.runExclusive(()=>this._runTx(e,t,i,s,r))}async _runTx(e,t,i,s,r){let a;for(let n=0;n<r;n++)try{return await new Promise((r,a)=>{let n,o=e.transaction(t,i);o.oncomplete=()=>r(n),o.onerror=()=>a(o.error),o.onabort=()=>a(new Error("Transaction aborted"));try{var h=s(o);h instanceof Promise?h.then(e=>{n=e}).catch(a):n=h}catch(r){a(r)}})}catch(e){a=e,n<r-1&&await new Promise(e=>setTimeout(e,2**n*100))}throw new $e("Transaction failed after retries","TRANSACTION_FAILED",a)}_promisifyRequest(e){return new Promise((t,i)=>{let s=e();s.onsuccess=()=>t(s.result),s.onerror=()=>i(s.error),s.onabort=()=>i(new DOMException("Request aborted","AbortError"))})}async getBatch(e,t,i,s){return this.performTransaction(e,[t],"readonly",e=>{let r,a=e.objectStore(t);return null!=i&&(r=IDBKeyRange.lowerBound(i,!0)),this._promisifyRequest(()=>a.getAll(r,s))})}add(e,t,i,s){return this.performTransaction(e,[t],"readwrite",e=>{let r=e.objectStore(t);return this._promisifyRequest(()=>void 0!==s?r.add(i,s):r.add(i))})}put(e,t,i,s){return this.performTransaction(e,[t],"readwrite",e=>{let r=e.objectStore(t);return this._promisifyRequest(()=>void 0!==s?r.put(i,s):r.put(i))})}get(e,t,i){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).get(i)))}getAll(e,t,i,s){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).getAll(i,s)))}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 s=e.objectStore(i);return e=t.map(e=>{try{switch(e.type){case"add":return this._promisifyRequest(()=>s.add(e.data)).then(e=>({success:!0,result:e}));case"put":return this._promisifyRequest(()=>s.put(e.data)).then(e=>({success:!0,result:e}));case"delete":return this._promisifyRequest(()=>s.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 at{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=Ge,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 $e("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 $e("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 nt{constructor(e,t={},i,s,r){this.name=e,this._serializer=i,this._base64=s,this._dbName=r,this._storageKey=r?`lacertadb_${r}_${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,s=0){this._docSizes.set(e,t),this._docModified.set(e,Date.now()),this._docPermanent.set(e,i),this._docAttachments.set(e,s),this.sizeKB+=t,this.length++,this.modifiedAt=Date.now(),this._scheduleSave()}updateDocument(e,t,i=!1,s=0){var r=this._docSizes.get(e)||0;this.sizeKB=this.sizeKB-r+t,this._docSizes.set(e,t),this._docModified.set(e,Date.now()),this._docPermanent.set(e,i),this._docAttachments.set(e,s),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,s=[];for([t,i]of this._docModified)this._docPermanent.get(t)||s.push({id:t,modified:i});return s.sort((e,t)=>e.modified-t.modified),s.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 s={sizeKB:this.sizeKB,length:this.length,createdAt:this.createdAt,modifiedAt:this.modifiedAt},r=this._serializer.serialize(s),a=this._base64.encode(r);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,s){var r=localStorage.getItem(`lacertadb_${e}_${t}_collmeta`);if(r)try{var a=s.decode(r),n=i.deserialize(a);return new nt(t,n,i,s,e)}catch(e){console.warn("CollectionMetadata corrupted, resetting:",e)}return new nt(t,{},i,s,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 ot{constructor(e,t={},i,s){this.name=e,this._serializer=i,this._base64=s,this.collections=(t=t&&"object"==typeof t?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 s=localStorage.getItem(`lacertadb_${e}_metadata`);if(s)try{var r=i.decode(s),a=t.deserialize(r);if(a&&"object"==typeof a)return new ot(e,a,t,i)}catch(e){console.error("Failed to load metadata:",e)}return new ot(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),s=this._base64.encode(i);localStorage.setItem(e,s),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 ht{constructor(e,t={},i,s){this.dbName=e,this._serializer=i,this._base64=s,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 s=localStorage.getItem(`lacertadb_${e}_settings`);if(s)try{var r=i.decode(s),a=t.deserialize(r);return new ht(e,a,t,i)}catch(e){console.error("Failed to load settings:",e)}return new ht(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),s=this._base64.encode(i);localStorage.setItem(e,s)}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 lt=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 s=t[i];if(i.startsWith("$")){var r=this.operators[i];if(!r||!r(e,s))return!1}else{var a=this.getFieldValue(e,i);if("object"!=typeof s||null===s||Array.isArray(s)){if(a!==s)return!1}else for(var n in s)if(n.startsWith("$")){var o=this.operators[n];if(!o||!o(a,s[n]))return!1}}}return!0}getFieldValue(e,t){let i=e;for(var s of t.split(".")){if(null==i)return;i=i[s]}return i}};let ct=new class{constructor(){this.stages={$match:(e,t)=>e.filter(e=>lt.evaluate(e,t)),$project:(e,t)=>e.map(e=>{var i,s={};for(i in t){var r=t[i];1===r||!0===r?s[i]=lt.getFieldValue(e,i):"string"==typeof r&&r.startsWith("$")&&(s[i]=lt.getFieldValue(e,r.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 s}),$sort:(e,t)=>[...e].sort((e,i)=>{for(var s in t){var r=t[s],a=lt.getFieldValue(e,s);if(a<(s=lt.getFieldValue(i,s)))return-r;if(s<a)return r}return 0}),$limit:(e,t)=>e.slice(0,t),$skip:(e,t)=>e.slice(t),$group:(e,t)=>{var i,s=new Map,r=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 lt.getFieldValue(e,t.substring(1));if(null===t||"object"!=typeof t||Array.isArray(t))return t;var i,s={};for(i in t)s[i]=n(e,t[i]);return s};for(i of e){let e;e="string"==typeof r?r.startsWith("$")?lt.getFieldValue(i,r.substring(1)):r:null!==r&&"object"==typeof r?a(n(i,r)):r,s.has(e)||s.set(e,{_id:e,docs:[]}),s.get(e).docs.push(i)}var o,h=[];for(o of s.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+(lt.getFieldValue(i,e)||0),0);break;case"$avg":var _=o.docs.reduce((t,i)=>t+(lt.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=>lt.getFieldValue(t,e)));break;case"$min":c[l]=Math.min(...o.docs.map(t=>lt.getFieldValue(t,e)))}}h.push(c)}return h},$lookup:async(e,t,i)=>{i=await(await i.getCollection(t.from)).getAll();let s=new Map;return i.forEach(e=>{var i=lt.getFieldValue(e,t.foreignField);s.has(i)||s.set(i,[]),s.get(i).push(e)}),e.map(e=>{var i=lt.getFieldValue(e,t.localField);return{...e,[t.as]:s.get(i)||[]}})}}}async execute(e,t,i){let s=e;for(var r of t){var a=Object.keys(r)[0],n=(r=r[a],this.stages[a]);if(!n)throw new Error("Unknown aggregation stage: "+a);s="$lookup"===a?await n(s,r,i):n(s,r)}return s}};class dt{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),s=t.split(".").map(Number),r=Math.max(i.length,s.length);for(let e=0;e<r;e++){var a=i[e]||0,n=s[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 s,r=await this.database.getCollection(i);for(s of await r.getAll()){var a=await e[t](s);a&&await r.update(s._id,a)}}}}class ut{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),s=(s=0<this._metrics.memoryUsage.length?this._metrics.memoryUsage[this._metrics.memoryUsage.length-1]:null)?s.used/1048576:0;return{opsPerSec:e,avgLatency:t.toFixed(2),cacheHitRate:i.toFixed(1),memoryUsageMB:s.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 _t{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 rt,this._opfs=new st,this._cleanupInterval=null,this._events=new Map,this._indexManager=new it(this),this._cacheStrategy=new je({type:"lru",maxSize:100,ttl:6e4,enabled:!0}),this._docCache=new Ne(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=nt.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 $e("Document-level encryption requires database-level encryption. Use getSecureDatabase() to create an encrypted database.","ENCRYPTION_NOT_INITIALIZED");await this._trigger("beforeAdd",e);e=new at({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?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,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,s;if((this._initialized||await this.init(),!t.includeAttachments)&&(s=this._docCache.get(e)))return s;if(s=await this._indexedDB.get(this._db,this._storeName,e))return i=new at(s,{encrypted:s._encrypted,compressed:s._compressed},this._serializer),s.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),s=i.objectOutput(t.includeAttachments),t.includeAttachments||this._docCache.set(e,s),s;throw new $e(`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(it.IDX_PREFIX))),Promise.all(e.map(async e=>{try{var t=new at(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 s,r,a=await this._indexedDB.get(this._db,this._storeName,e);if(a)return r=new at(a,{},this._serializer),a.packedData&&await r.unpack(this.database.encryption),s=r.objectOutput(),r={...r.data,...t},(t=new at({_id:e,_created:a._created,data:r},{compressed:void 0!==i.compressed?i.compressed:a._compressed,permanent:void 0!==i.permanent?i.permanent:a._permanent},this._serializer))._modified=Date.now(),(r=i.attachments)&&0<r.length?(await this._opfs.deleteAttachments(this.database.name,this.name,e),i=await Promise.all(r.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),r=t.databaseOutput(),await this._indexedDB.put(this._db,this._storeName,r),i=t.objectOutput(),await this._indexManager.updateIndexForDocument(t._id,s,i),a=r.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 $e(`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 $e("Document not found for deletion","DOCUMENT_NOT_FOUND");if(i._permanent&&!t.force)throw new $e("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,s,r=performance.now(),a=JSON.stringify({f:e,o:t},(e,t)=>{if(!t||"object"!=typeof t||Array.isArray(t))return t;var i,s={};for(i of Object.keys(t).sort())s[i]=t[i];return s}),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,s]of this._indexManager.indexes){var l=e[s.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=>lt.evaluate(t,e)))),t.sort&&(o=ct.stages.$sort(o,t.sort)),t.skip&&(o=ct.stages.$skip(o,t.skip)),t.limit&&(o=ct.stages.$limit(o,t.limit)),t.projection&&(o=ct.stages.$project(o,t.projection)),this._performanceMonitor&&this._performanceMonitor.recordOperation(h?"indexed-query":"full-scan-query",performance.now()-r),this._cacheStrategy.set(a,o),o}async aggregate(e){this._initialized||await this.init();var t=performance.now();let i,s=e;return 0<e.length&&e[0].$match?(i=await this.query(e[0].$match),s=e.slice(1)):i=await this.getAll(),e=await ct.execute(i,s,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(),s=[];let r=[];var a,n=!this.database.encryption&&!t.compressed;for(a of e){var o=new at({data:a},{compressed:t.compressed||!1,permanent:t.permanent||!1},this._serializer);n?o.packSync():await o.pack(this.database.encryption),s.push({type:"add",data:o.databaseOutput()}),r.push(o)}var h,l,c,d=await this._indexedDB.batchOperation(this._db,s,this._storeName);for(let e=0;e<r.length;e++)d[e].success&&(l=(h=r[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:r[t]._id}))}async batchUpdate(e,t={}){this._initialized||await this.init();var i=performance.now(),s=[],r=[];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 at(_,{},this._serializer),_.packedData&&await u.unpack(this.database.encryption),r.push(u.objectOutput()),u={...u.data,...o.data},(u=new at({_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),s.push({type:"put",data:u.databaseOutput()})):h.push({success:!1,id:o.id,error:"Document not found"})}if(0===s.length)return h;var f,p,y,m=await this._indexedDB.batchOperation(this._db,s,this._storeName);for(let e=0;e<a.length;e++)m[e].success&&(p=(f=a[e]).objectOutput(),await this._indexManager.updateIndexForDocument(f._id,r[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),[...m.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 s=[];var r,a,n=[];for({id:r,options:a}of e){var o,h=await this._indexedDB.get(this._db,this._storeName,r);h?h._permanent&&!a.force?n.push({success:!1,id:r,error:"Cannot delete permanent document without force flag"}):(o=await this.get(r),s.push({id:r,fullDoc:o,stored:h}),i.push({type:"delete",key:r})):n.push({success:!1,id:r,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<s.length;e++)u[e].success&&(({id:l,fullDoc:c,stored:d}=s[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:s[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 nt(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 ft{constructor(e,t,i,s){this.name=e,this._collections=new Map,this._metadata=null,this._settings=null,this._quickStore=null,this._performanceMonitor=t,this._serializer=i,this._base64=s,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,s)=>{let r=indexedDB.open("lacertadb_"+this.name,e);r.onerror=()=>s(new $e("Failed to open database","DATABASE_OPEN_FAILED",r.error)),r.onsuccess=()=>i(r.result),r.onupgradeneeded=e=>{var i,s=e.target.result;for(i of t)s.objectStoreNames.contains(i)||s.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=ot.load(this.name,this._serializer,this._base64),this._settings=ht.load(this.name,this._serializer,this._base64),this._quickStore=new Fe(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 s=`lacertadb_${this.name}_encryption`;let r=null;var a=((a=localStorage.getItem(s))&&(a=this._base64.decode(a),r=this._serializer.deserialize(a)),this._encryption=new Xe(i,this._serializer,this._base64),await this._encryption.initialize(e,r));r||(i=this._serializer.serialize(a),e=this._base64.encode(i),localStorage.setItem(s,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 s=await this.getCollection("__private_keys__").catch(()=>null);return await(s=s||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 $e(`Collection '${e}' already exists.`,"COLLECTION_EXISTS");await this._ensureStore(e);var i=new _t(e,this);return this._collections.set(e,i),this._metadata.collections[e]||this._metadata.setCollection(new nt(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 _t(e,this),this._collections.set(e,t),await t.init(),t;throw new $e(`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 _t(e,this),this._collections.set(e,t),this._metadata.collections[e]||this._metadata.setCollection(new nt(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 rt).clear(this._db,e)}catch(e){}let i=this.name+"_"+e;try{await new Promise((e,t)=>{var s=indexedDB.deleteDatabase(i);s.onsuccess=e,s.onerror=e,s.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 r=0;for(let a of t){let t=this.name+"_"+a;try{let e=await new Promise((e,i)=>{let s=indexedDB.open(t,1);s.onerror=()=>e(null),s.onsuccess=()=>e(s.result),s.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 s=e.transaction("documents","readonly").objectStore("documents").getAll();s.onsuccess=()=>t(s.result||[]),s.onerror=()=>t([])});if(e.close(),0!==i.length){await this._ensureStore(a);var s=new rt;let e=i.map(e=>({type:"put",data:e}));await s.performTransaction(this._db,[a],"readwrite",t=>{let i=t.objectStore(a);return t=e.map(e=>new Promise((t,s)=>{var r=i.put(e.data);r.onsuccess=()=>t(),r.onerror=()=>t()})),Promise.all(t)}),await new Promise(e=>{var i=indexedDB.deleteDatabase(t);i.onsuccess=e,i.onerror=e,i.onblocked=e}),r++}}else e.close();else indexedDB.deleteDatabase(t)}catch(e){console.warn(`[LacertaDB] Migration of '${a}' failed:`,e.message)}}0<r&&console.log(`[LacertaDB] Migrated ${r} 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,s,r,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 r=this._serializer.serialize(a),this._base64.encode(r);if("encrypted"===e&&t)return r=new We,s=this._serializer.serialize(a),r=await r.encrypt(s,t),this._base64.encode(r);throw new $e("Unsupported export format: "+e,"INVALID_FORMAT")}async import(e,t="json",i=null){let s;try{var r,a=this._base64.decode(e);s="encrypted"===t&&i?(r=await(new We).decrypt(a,i),this._serializer.deserialize(r)):this._serializer.deserialize(a)}catch(e){throw new $e("Failed to parse import data","IMPORT_PARSE_FAILED",e)}for(var n in s.collections){var o=s.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(s.collections).reduce((e,t)=>e+t.length,0),{collections:Object.keys(s.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 ot(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 ut,e={...Pe,...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,sortKeys:e.sortKeys||!1,memoryPoolSize:e.memoryPoolSize||65536,...e},this.options.allowFunction||(this.options.serializeFunctions=!1),e=Math.max(this.options.memoryPoolSize,65536),this.buf=new Uint8Array(e),this.dv=new DataView(this.buf.buffer),this.pos=0,this.enc=new TextEncoder,this.dec=new TextDecoder,this.refs=new Map,this.circularRefs=new Set,this.strings=new Map,this.buffers=new Map,this.deserializeRefs=null,this.deserializeStrings=null,this.deserializeBuffers=null,this.buffer=null,this.view=null}_grow(e){var t=this.pos+e;if(!(t<=this.buf.length)){let i=this.buf.length;for(;i<t;)i<<=1;(e=new Uint8Array(i)).set(this.buf.subarray(0,this.pos)),this.buf=e,this.dv=new DataView(e.buffer)}}serialize(e){return this.resetState(),this._grow(5),this.dv.setUint32(0,Ve,!0),this.buf[4]=6,this.pos=5,this.options.detectCircular&&this.detectCircularReferences(e,new WeakSet),this.writeValue(e),this.buf.slice(0,this.pos)}deserialize(e){if(this.buffer=e instanceof Uint8Array?e:new Uint8Array(e),this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength),this.pos=0,this.deserializeRefs=[],this.deserializeStrings=[],this.deserializeBuffers=[],this.view.getUint32(0,!0)!==Ve)throw new Error("Invalid TurboSerial data");if(6!==this.buffer[4])throw new Error("Unsupported version: "+this.buffer[4]);return this.pos=5,this.readValue()}resetState(){this.pos=0,this.refs.clear(),this.circularRefs.clear(),this.strings.clear(),this.buffers.clear()}resetMemory(e={}){return e=e.shrink?Math.max(this.options.memoryPoolSize||65536,256):this.buf.length,this.buf=new Uint8Array(e),this.dv=new DataView(this.buf.buffer),this.pos=0,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}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,s=e.length;i<s;i++)i in e&&this.detectCircularReferences(e[i],t);else if(e instanceof Map)for(var[i,s]of e)this.detectCircularReferences(i,t),this.detectCircularReferences(s,t);else if(e instanceof Set)for(var r of e)this.detectCircularReferences(r,t);else{var a=Object.keys(e);for(let s=0;s<a.length;s++)try{this.detectCircularReferences(e[a[s]],t)}catch(i){}}}finally{t.delete(e)}}}_wV(e){var t=this.buf;let i=this.pos;if((e>>>=0)<128)t[i]=e,this.pos=i+1;else if(e<16384)t[i]=127&e|128,t[i+1]=e>>>7,this.pos=i+2;else{for(;128<=e;)t[i++]=127&e|128,e>>>=7;t[i++]=e,this.pos=i}}writeValue(e){if(null===e)this._grow(1),this.buf[this.pos++]=0;else if(void 0===e)this._grow(1),this.buf[this.pos++]=1;else{var t=typeof e;if("boolean"==t)this._grow(1),this.buf[this.pos++]=e?3:2;else if("number"==t)this._wNum(e);else if("string"==t)this._wStrDedup(e);else if("bigint"==t)this._wBigInt(e);else if("symbol"==t)this._grow(2),void 0!==(i=Symbol.keyFor(e))?(this.buf[this.pos++]=we,this.writeValue(i)):n.has(e)?(this.buf[this.pos++]=ge,this.writeValue(n.get(e))):void 0===e.description?this.buf[this.pos++]=ve:(this.buf[this.pos++]=me,this.writeValue(e.description));else if("function"==t)this._grow(1),this.buf[this.pos++]=this.options.allowFunction?be:c;else{if(this.options.detectCircular&&this.circularRefs.has(e)){var i=this.refs.get(e);if(void 0!==i)return this._grow(6),this.buf[this.pos++]=ye,void this._wV(i);this.refs.set(e,this.refs.size)}if(this.options.deduplication&&!this.circularRefs.has(e)){if(void 0!==(t=this.refs.get(e)))return this._grow(6),this.buf[this.pos++]=pe,void this._wV(t);this.refs.set(e,this.refs.size)}if(this.options.shareArrayBuffers&&e instanceof ArrayBuffer){if(void 0!==(i=this.buffers.get(e)))return this._grow(6),this.buf[this.pos++]=J,void this._wV(i);this.buffers.set(e,this.buffers.size)}this._wObj(e)}}}_wStrDedup(e){if(this.options.deduplication&&3<e.length){var t=this.strings.get(e);if(void 0!==t)return this._grow(6),this.buf[this.pos++]=U,void this._wV(t);this.strings.set(e,this.strings.size)}this._wStr(e)}_wNum(e){this._grow(10);var t,i=this.pos;e!=e?(this.buf[i]=m,this.pos=i+1):e===1/0?(this.buf[i]=w,this.pos=i+1):e===-1/0?(this.buf[i]=g,this.pos=i+1):0===e&&1/e<0?(this.buf[i]=v,this.pos=i+1):e===(t=0|e)?-128<=t&&t<=127?(this.buf[i]=d,this.buf[i+1]=255&t,this.pos=i+2):-32768<=t&&t<=32767?(this.buf[i]=u,this.dv.setInt16(i+1,t,!0),this.pos=i+3):(this.buf[i]=_,this.dv.setInt32(i+1,t,!0),this.pos=i+5):e===(t=e>>>0)?(this.buf[i]=f,this.dv.setUint32(i+1,t,!0),this.pos=i+5):(a[0]=e,a[0]===e?(this.buf[i]=p,this.dv.setFloat32(i+1,e,!0),this.pos=i+5):(this.buf[i]=y,this.dv.setFloat64(i+1,e,!0),this.pos=i+9))}_wBigInt(e){this._grow(10);var t=e<0n,i=t?-e:e;if(i<=0x7fffffffffffffffn)this.buf[this.pos++]=t?x:S,this.dv.setBigInt64(this.pos,e,!0),this.pos+=8;else{this.buf[this.pos++]=t?z:A;let s=i.toString(16);e=(s=1&s.length?"0"+s:s).length>>>1,this._grow(5+e),this._wV(e);for(let e=s.length-2;0<=e;e-=2)this.buf[this.pos++]=parseInt(s.substr(e,2),16);s.length%2&&(this.buf[this.pos++]=parseInt(s[0],16))}}_wStr(e){var t=e.length;if(0===t)this._grow(1),this.buf[this.pos++]=I;else if(t<128){let s=1;for(let i=0;i<t;i++)if(127<e.charCodeAt(i)){s=0;break}if(s){this._grow(t+2);var i=this.pos;this.buf[i++]=t<16?k:D,this.buf[i++]=t;for(let s=0;s<t;s++)this.buf[i+s]=e.charCodeAt(s);return void(this.pos=i+t)}let r=this.enc.encode(e),a=r.length,n=(this._grow(a+7),this.pos);this.buf[n++]=a<16?C:a<256?T:M,a<256?this.buf[n++]=a:(this.pos=n,this._wV(a),n=this.pos),this.buf.set(r,n),this.pos=n+a}else{let i=this.enc.encode(e),s=i.length,r=(this._grow(s+7),this.pos);s===t?(this.buf[r++]=t<256?D:E,t<256?this.buf[r++]=t:(this.pos=r,this._wV(t),r=this.pos)):(this.buf[r++]=s<256?T:M,s<256?this.buf[r++]=s:(this.pos=r,this._wV(s),r=this.pos)),this.buf.set(i,r),this.pos=r+s}}_wObj(e){if(Array.isArray(e))this._wArr(e);else{var t=e.constructor;if(void 0!==(t=ke.get(t))){if(t===te)return this._grow(9),void((a=e.getTime())!=a?this.buf[this.pos++]=ie:(this.buf[this.pos++]=te,this.dv.setFloat64(this.pos,a,!0),this.pos+=8));if(t===ue)return this._grow(1),this.buf[this.pos++]=ue,this.writeValue(e.source),void this.writeValue(e.flags);if(t===Z){for(var[i,s]of(this._grow(6),this.buf[this.pos++]=Z,this._wV(e.size),e))this.writeValue(i),this.writeValue(s);return}if(t===ee){for(var r of(this._grow(6),this.buf[this.pos++]=ee,this._wV(e.size),e))this.writeValue(r);return}if(t===Q||t===Y)return this._grow(6),this.buf[this.pos++]=t,a=new Uint8Array(e),this._wV(a.length),this._grow(a.length),this.buf.set(a,this.pos),void(this.pos+=a.length);if(96==(240&t))return void this._wTypedArr(e,t)}if(e instanceof Error){this._grow(2);var a=Ue.get(e.constructor.name)||de;if(this.buf[this.pos++]=a,this.writeValue(e.message||""),this.writeValue(e.stack||""),a===ce&&e.errors)for(var n of(this._wV(e.errors.length),e.errors))this.writeValue(n)}else"undefined"!=typeof Blob&&e instanceof Blob?(this._grow(12),this.buf[this.pos++]=e instanceof File?fe:_e,this._wV(0),this._wV(0)):this._wPlainObj(e)}}_wArr(e){var t=e.length;if(0===t)this._grow(1),this.buf[this.pos++]=V;else{let a=!1;for(let i=0;i<t;i++)if(!(i in e)){a=!0;break}if(a){this._grow(12),this.buf[this.pos++]=L,this._wV(t);var i,s=[];for(let i=0;i<t;i++)i in e&&s.push(i);for(i of(this._wV(s.length),s))this._wV(i),this.writeValue(e[i])}else{if(this.options.simdOptimization&&8<=t&&"number"==typeof e[0]){var r=this._detectPacked(e,t);if(r)return this._grow(6),this.buf[this.pos++]=r,void this._wPacked(e,t,r)}this._grow(6),this.buf[this.pos++]=B,this._wV(t);for(let i=0;i<t;i++)this.writeValue(e[i])}}}_detectPacked(e,t){let i=1,s=e[0],r=e[0],n=1;for(let h=0;h<t;h++){var o=e[h];if("number"!=typeof o)return 0;o!==(0|o)&&(i=0),o<s&&(s=o),o>r&&(r=o),n&&(a[0]=o,a[0]!==o)&&(n=0)}var h;return i?(h=Math.max(Math.abs(s),Math.abs(r)))<=127?P:h<=32767?F:K:n?O:$}_wPacked(e,t,i){this.dv,this._wV(t);var s=Se[i]||1;this._grow(t*s);let r=this.pos;switch(i){case P:for(let i=0;i<t;i++)this.buf[r++]=255&e[i];break;case F:for(let i=0;i<t;i++)this.dv.setInt16(r,e[i],!0),r+=2;break;case K:for(let i=0;i<t;i++)this.dv.setInt32(r,e[i],!0),r+=4;break;case O:for(let i=0;i<t;i++)this.dv.setFloat32(r,e[i],!0),r+=4;break;case $:for(let i=0;i<t;i++)this.dv.setFloat64(r,e[i],!0),r+=8}this.pos=r}_wTypedArr(e,t){this._grow(12),this.buf[this.pos++]=t;var i=e.buffer;if(this.options.shareArrayBuffers){var s=this.buffers.get(i);if(void 0!==s)return this.buf[this.pos++]=1,this._wV(s),this._wV(e.byteOffset),void this._wV(e.length);this.buffers.set(i,this.buffers.size)}if(this.buf[this.pos++]=0,this._wV(e.byteOffset),this._wV(e.length),s=Se[t]||1,t===W||t===X){this._grow(8*e.length);for(let t=0;t<e.length;t++)this.dv.setBigInt64(this.pos,e[t],!0),this.pos+=8}else t=e.length*s,this._grow(t),s=new Uint8Array(i,e.byteOffset,t),this.buf.set(s,this.pos),this.pos+=t}_wPlainObj(e){var t=Object.getPrototypeOf(e),i=(t=e.constructor===Object||t===Object.prototype||null===t,Object.keys(e));if(0===i.length&&t)this._grow(1),this.buf[this.pos++]=N;else if(t){if(this.options.preservePropertyDescriptors){var s;t=[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)];let i=!1;for(s of t){var r=Object.getOwnPropertyDescriptor(e,s);if(r.get||r.set||!r.enumerable||!r.writable||!r.configurable){i=!0;break}}if(i)return void this._wDescriptorObj(e,t)}let n=!1;if(this.options.allowFunction)for(let t=0;t<i.length;t++)if("function"==typeof e[i[t]]){n=!0;break}if(n)this._wMethodObj(e,i);else{this._grow(6),this.buf[this.pos++]=q,this.options.sortKeys&&i.sort();let t=i.length;if(!this.options.serializeFunctions)for(let s=t=0;s<i.length;s++)"function"!=typeof e[i[s]]&&t++;this._wV(t);for(let t=0;t<i.length;t++){var a=e[i[t]];!this.options.serializeFunctions&&"function"==typeof a||(this.writeValue(i[t]),this.writeValue(a))}}}else this._wConstructorObj(e,i)}_wDescriptorObj(e,t){this._grow(6),this.buf[this.pos++]=H;var i;t=t.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(i of(this._wV(t.length),t)){this.writeValue(i);var s=Object.getOwnPropertyDescriptor(e,i);let t=0;s.enumerable&&(t|=1),s.writable&&(t|=2),s.configurable&&(t|=4),s.get&&(t|=8),s.set&&(t|=16),this._grow(1),this.buf[this.pos++]=t,s.get||s.set?(s.get&&this.writeValue(s.get),s.set&&this.writeValue(s.set)):this.writeValue(s.value)}}_wMethodObj(e,t){this._grow(6),this.buf[this.pos++]=G;var i,s,r,a,n=[];for(i of t)try{var o=e[i];n.push([i,o,"function"==typeof o])}catch(e){}for([s,r,a]of(this._wV(n.length),n))this.writeValue(s),this._grow(1),this.buf[this.pos++]=a?1:0,a&&this.options.serializeFunctions?(this.writeValue(r.toString()),this.writeValue(r.name||"")):a?(this._grow(1),this.buf[this.pos++]=be):this.writeValue(r)}_wConstructorObj(e,t){this._grow(6),this.buf[this.pos++]=j,this.writeValue((null==(s=e.constructor)?void 0:s.name)||"");var i,s=this.options.serializeFunctions?t:t.filter(t=>{try{return"function"!=typeof e[t]}catch(t){return!1}});for(i of(this._wV(s.length),s))this.writeValue(i),this.writeValue(e[i])}readValue(){this.buffer;var e=this.buf[this.pos++];if(e===pe||e===ye)return this.deserializeRefs[this._rV()];if(e===U)return this.deserializeStrings[this._rV()];if(e===J)return this.deserializeBuffers[this._rV()];var t,i=240&e;if(0==i)return 0===e?null:1===e?void 0:3===e;if(16==i)return this._rNum(e);if(32==i)return this._rBigInt(e);if(48==i)return this._rStr(e);if(64==i||80==i||128==i){let t;return t=64==i?[]:128==i?new(e===Z?Map:Set):{},this.deserializeRefs.push(t),this._rFill(t,e,i),t}if(96==i)return t=this._rTypedArr(e),this.deserializeRefs.push(t),t;if(112==i)return t=this._rArrayBuf(e),this.deserializeBuffers.push(t),t;if(144==i)return e===ie?new Date(NaN):(t=this.view.getFloat64(this.pos,!0),this.pos+=8,new Date(t));if(160==i)return this._rError(e);if(176==i)return new RegExp(this.readValue(),this.readValue());if(192==i)return this._rV(),this._rV(),{_type:"Binary"};if(224==i)return this._rSpecial(e);if(240==i)return this.options.allowFunction?function(){throw new Error("Function not serialized")}:void 0;throw new Error("Unknown type: 0x"+e.toString(16))}_rV(){this.buffer;let e=this.pos,t=this.buf[e++];if(!(128&t))return this.pos=e,t;let i=127&t,s=7;for(;t=this.buf[e++],i|=(127&t)<<s,s+=7,128&t;);return this.pos=e,i>>>0}_rFill(e,t,i){if(64===i){if(t!==V)if(t===B){var s=this._rV();for(let t=0;t<s;t++)e[t]=this.readValue()}else if(t===L){e.length=this._rV();var r=this._rV();for(let t=0;t<r;t++)e[this._rV()]=this.readValue()}else{var a=this._rPacked(t);for(let t=0;t<a.length;t++)e.push(a[t])}}else if(80===i)this.fillObject(e,t);else if(128===i){var n=this._rV();if(t===Z)for(let t=0;t<n;t++)e.set(this.readValue(),this.readValue());else for(let t=0;t<n;t++)e.add(this.readValue())}}fillObject(e,t){if(t!==N)if(t===q||t===R){var i=this._rV();for(let t=0;t<i;t++)e[this.readValue()]=this.readValue()}else if(t===H){var s=this._rV();for(let t=0;t<s;t++){var r=this.readValue(),a=this.buffer[this.pos++],n={enumerable:!!(1&a),writable:!!(2&a),configurable:!!(4&a)};8&a||16&a?(8&a&&(n.get=this.readValue()),16&a&&(n.set=this.readValue())):n.value=this.readValue(),Object.defineProperty(e,r,n)}}else if(t===G){var o=this._rV();for(let i=0;i<o;i++){var h=this.readValue();if(this.buffer[this.pos++])if(this.options.allowFunction&&this.options.serializeFunctions){var l=this.readValue();this.readValue();try{e[h]=new Function("return "+l)()}catch(t){e[h]=void 0}}else this.options.serializeFunctions?(this.readValue(),this.readValue(),e[h]=void 0):(this.pos++,e[h]=this.options.allowFunction?function(){throw new Error("Not serialized")}:void 0);else e[h]=this.readValue()}}else if(t===j){t=this.readValue();var c=this._rV();for(let t=0;t<c;t++)e[this.readValue()]=this.readValue();Object.defineProperty(e,"__constructorName",{value:t,enumerable:!1,writable:!1,configurable:!0})}}_rNum(e){this.view;let t,i=this.pos;switch(e){case d:return t=this.buffer[i]<<24>>24,this.pos=i+1,t;case u:return t=this.dv.getInt16(i,!0),this.pos=i+2,t;case _:return t=this.dv.getInt32(i,!0),this.pos=i+4,t;case f:return t=this.dv.getUint32(i,!0),this.pos=i+4,t;case p:return t=this.dv.getFloat32(i,!0),this.pos=i+4,t;case y:return t=this.dv.getFloat64(i,!0),this.pos=i+8,t;case m:return NaN;case w:return 1/0;case g:return-1/0;case v:return-0;case b:return t=this._rV(),this.buffer[this.pos++]?-t:t}}_rBigInt(e){if(e===S||e===x){let e=this.view.getBigInt64(this.pos,!0);return this.pos+=8,e}e=e===z;var t=this._rV();let i="";for(let e=t-1;0<=e;e--)i+=this.buffer[this.pos+e].toString(16).padStart(2,"0");this.pos+=t;let s=BigInt("0x"+(i||"0"));return e?-s:s}_rStr(e){if(e===I)return"";var t=this.buffer;let i,r;return i=e===k||e===D||e===C||e===T?this.buf[this.pos++]:this._rV(),r=(e=e===k||e===D||e===E)&&i<128?s[i](t,this.pos):this.dec.decode(t.subarray(this.pos,this.pos+i)),this.pos+=i,3<r.length&&this.deserializeStrings.push(r),r}_rPacked(e){var t=this._rV(),i=new Array(t);this.view;let s=this.pos;switch(e){case P:for(let e=0;e<t;e++)i[e]=this.buffer[s++]<<24>>24;break;case F:for(let e=0;e<t;e++)i[e]=this.dv.getInt16(s,!0),s+=2;break;case K:for(let e=0;e<t;e++)i[e]=this.dv.getInt32(s,!0),s+=4;break;case O:for(let e=0;e<t;e++)i[e]=this.dv.getFloat32(s,!0),s+=4;break;case $:for(let e=0;e<t;e++)i[e]=this.dv.getFloat64(s,!0),s+=8}return this.pos=s,i}_rTypedArr(e){if(this.buffer[this.pos++]){let t=this._rV(),i=this._rV(),s=this._rV();return new xe[e](this.deserializeBuffers[t],i,s)}this._rV();let t=this._rV(),i=Se[e]||1;if(e===W||e===X){var s=[];for(let e=0;e<t;e++)s.push(this.view.getBigInt64(this.pos,!0)),this.pos+=8;return new xe[e](s)}var r=t*i,a=new ArrayBuffer(r);return new Uint8Array(a).set(this.buffer.subarray(this.pos,this.pos+r)),this.pos+=r,this.deserializeBuffers.push(a),new xe[e](a,0,t)}_rArrayBuf(e){var t=this._rV(),i=this.buffer.buffer.slice(this.buffer.byteOffset+this.pos,this.buffer.byteOffset+this.pos+t);return this.pos+=t,i}_rError(e){var t=this.readValue(),i=this.readValue();let s;if(e===ce){var r=this._rV(),a=[];for(let e=0;e<r;e++)a.push(this.readValue());s=new AggregateError(a,t)}else s=new(Me[e]||Error)(t);return i&&(s.stack=i),s}_rSpecial(e){if(e===me)return Symbol(this.readValue());if(e===ve)return Symbol();if(e===we)return Symbol.for(this.readValue());if(e===ge)return o.get(this.readValue())||Symbol();throw new Error("Unknown special type: 0x"+e.toString(16))}}(e),this._base64=new Le.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 ft(e,this._performanceMonitor,this._serializer,this._base64)).init(t),this._databases.set(e,i)),this._databases.get(e)}async getSecureDatabase(e,t,i=null,s={}){return this.getDatabase(e,{pin:t,salt:i,encryptionConfig:s})}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 Fe(e,this._serializer,this._base64).clear();var i=[];for(let t=0;t<localStorage.length;t++){var s=localStorage.key(t);s&&s.startsWith(`lacertadb_${e}_`)&&i.push(s)}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 s=await(await this.getDatabase(t)).export("json");s=this._base64.decode(s);i.databases[t]=this._serializer.deserialize(s)}var r=this._serializer.serialize(i);return e?(e=await(new We).encrypt(r,e),this._base64.encode(e)):this._base64.encode(r)}async restoreBackup(e,t=null){let i;try{var s,r=this._base64.decode(e);i=t?(s=await(new We).decrypt(r,t),this._serializer.deserialize(s)):this._serializer.deserialize(r)}catch(e){throw new $e("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()}}}]);
|
package/index.js
CHANGED
|
@@ -2491,6 +2491,8 @@ class IndexManager {
|
|
|
2491
2491
|
const decoded = this._base64.decode(stored);
|
|
2492
2492
|
const metadata = this._serializer.deserialize(decoded);
|
|
2493
2493
|
|
|
2494
|
+
if (!metadata || !Array.isArray(metadata.indexes)) return;
|
|
2495
|
+
|
|
2494
2496
|
for (const indexDef of metadata.indexes) {
|
|
2495
2497
|
const { name, ...index } = indexDef;
|
|
2496
2498
|
this._indexes.set(name, index);
|
|
@@ -3197,6 +3199,7 @@ class DatabaseMetadata {
|
|
|
3197
3199
|
this.name = name;
|
|
3198
3200
|
this._serializer = serializer;
|
|
3199
3201
|
this._base64 = base64;
|
|
3202
|
+
if (!data || typeof data !== 'object') data = {};
|
|
3200
3203
|
this.collections = data.collections || {};
|
|
3201
3204
|
this.totalSizeKB = data.totalSizeKB || 0;
|
|
3202
3205
|
this.totalLength = data.totalLength || 0;
|
|
@@ -3219,7 +3222,10 @@ class DatabaseMetadata {
|
|
|
3219
3222
|
try {
|
|
3220
3223
|
const decoded = base64.decode(stored);
|
|
3221
3224
|
const data = serializer.deserialize(decoded);
|
|
3222
|
-
|
|
3225
|
+
if (data && typeof data === 'object') {
|
|
3226
|
+
return new DatabaseMetadata(dbName, data, serializer, base64);
|
|
3227
|
+
}
|
|
3228
|
+
// Corrupted/stale — fall through to fresh metadata
|
|
3223
3229
|
} catch (e) {
|
|
3224
3230
|
console.error('Failed to load metadata:', e);
|
|
3225
3231
|
}
|