pwaLUPMIS2/dist/assets/worker-CuIBOSaM.js
2026-03-04 12:59:40 +01:00

4 lines
18 KiB
JavaScript

async function z(o,t){let a;if(o instanceof Blob?a=o.stream():a=o,a instanceof ReadableStream&&t){const e=a.getReader();switch(t){case"callback":return async()=>(await e.read()).value;case"buffer":const i=[];let r=!1;for(;!r;){const f=await e.read();f.value&&i.push(f.value),r=f.done}const s=i.reduce((f,w)=>f+w.length,0),c=new Uint8Array(s);let u=0;return i.forEach(f=>{c.set(f,u),u+=f.length}),c.buffer}}else return a}function K(o){const t=o.split(/[\\/]/).filter(i=>i!==""),a=t.pop();if(!a)throw new Error("Database path is invalid.");const n=["journal","wal","shm"].map(i=>`${a}-${i}`);return{directories:t,fileName:a,tempFileNames:n,getDirectoryHandle:async()=>{let i=await navigator.storage.getDirectory();for(let r of t)i=await i.getDirectoryHandle(r);return i}}}class W{constructor(t){Object.defineProperty(this,"sqlite3InitModule",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"sqlite3",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"db",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"config",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pointers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"writeCallbacks",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"storageType",{enumerable:!0,configurable:!0,writable:!0,value:"memory"})}async init(t){const{databasePath:a}=t,n=this.getFlags(t);if(!this.sqlite3InitModule){const{default:e}=await import("./index-DTMgZTfd.js");this.sqlite3InitModule=e}this.sqlite3||(this.sqlite3=await this.sqlite3InitModule()),this.db&&await this.destroy(),this.db=new this.sqlite3.oo1.DB(a,n),this.config=t,this.initWriteHook()}onWrite(t){return this.writeCallbacks.add(t),()=>{this.writeCallbacks.delete(t)}}async exec(t){if(!this.db)throw new Error("Driver not initialized");return this.execOnDb(this.db,t)}async execBatch(t){if(!this.db)throw new Error("Driver not initialized");const a=[];return this.db.transaction(n=>{const e=new Map;try{for(let i of t){let r=e.get(i.sql);if(!r){const u=n.prepare(i.sql);e.set(i.sql,u),r=u}i.params?.length&&r.bind(i.params);let s=[],c=[];for(;r.step();)s=r.getColumnNames([]),c.push(r.get([]));a.push({columns:s,rows:c}),r.reset()}}finally{e.forEach(i=>{i.finalize()})}}),a}async isDatabasePersisted(){return!1}async getDatabaseSizeBytes(){const a=(await this.exec({sql:`SELECT page_count * page_size AS size
FROM pragma_page_count(), pragma_page_size()`,method:"get"}))?.rows?.[0];if(typeof a!="number")throw new Error("Failed to query database size");return a}async createFunction(t){if(!this.db)throw new Error("Driver not initialized");switch(t.type){case"callback":case"scalar":this.db.createFunction({name:t.name,xFunc:(a,...n)=>t.func(...n),arity:-1});break;case"aggregate":this.db.createFunction({name:t.name,xStep:(a,...n)=>t.func.step(...n),xFinal:(a,...n)=>t.func.final(...n),arity:-1});break}}async import(t){if(!this.sqlite3||!this.db||!this.config)throw new Error("Driver not initialized");const a=await z(t,"buffer"),n=this.sqlite3.wasm.allocFromTypedArray(a);this.pointers.push(n);const e=this.sqlite3.capi.sqlite3_deserialize(this.db,"main",n,a.byteLength,a.byteLength,this.config.readOnly?this.sqlite3.capi.SQLITE_DESERIALIZE_READONLY:this.sqlite3.capi.SQLITE_DESERIALIZE_RESIZEABLE);this.db.checkRc(e)}async export(){if(!this.sqlite3||!this.db)throw new Error("Driver not initialized");return{name:"database.sqlite3",data:this.sqlite3.capi.sqlite3_js_db_export(this.db)}}async clear(){}async destroy(){this.closeDb(),this.pointers.forEach(t=>this.sqlite3?.wasm.dealloc(t)),this.pointers=[],this.writeCallbacks.clear()}getFlags(t){const{readOnly:a,verbose:n}=t;return[a===!0?"r":"cw",n===!0?"t":""].join("")}execOnDb(t,a){const n={rows:[],columns:[]},e=t.exec({sql:a.sql,bind:a.params,returnValue:"resultRows",rowMode:"array",columnNames:n.columns});switch(a.method){case"run":break;case"get":n.rows=e[0]??[];break;case"all":default:n.rows=e;break}return n}initWriteHook(){if(!this.config?.reactive)return;if(!this.sqlite3||!this.db)throw new Error("Driver not initialized");const t={[this.sqlite3.capi.SQLITE_INSERT]:"insert",[this.sqlite3.capi.SQLITE_UPDATE]:"update",[this.sqlite3.capi.SQLITE_DELETE]:"delete"};this.sqlite3.capi.sqlite3_update_hook(this.db,(a,n,e,i,r)=>{this.writeCallbacks.forEach(s=>{s({table:i,rowid:r,operation:t[n]})})},0)}closeDb(){this.db&&(this.db.close(),this.db=void 0)}}class Q extends W{constructor(t){super(t),Object.defineProperty(this,"storageType",{enumerable:!0,configurable:!0,writable:!0,value:"opfs"})}async init(t){const{databasePath:a}=t,n=this.getFlags(t);if(!a)throw new Error("No databasePath specified");if(!this.sqlite3InitModule){const{default:e}=await import("./index-DTMgZTfd.js");this.sqlite3InitModule=e}if(this.sqlite3||(this.sqlite3=await this.sqlite3InitModule()),!("opfs"in this.sqlite3))throw new Error("OPFS not available");this.db&&await this.destroy(),this.db=new this.sqlite3.oo1.OpfsDb(a,n),this.config=t,this.initWriteHook()}async isDatabasePersisted(){return navigator.storage?.persisted()}async import(t){if(!this.sqlite3||!this.config?.databasePath)throw new Error("Driver not initialized");await this.destroy();const a=await z(t,"callback");await this.sqlite3.oo1.OpfsDb.importDb(this.config.databasePath,a)}async export(){if(!this.db||!this.config?.databasePath)throw new Error("Driver not initialized");let t,a;const n=K(this.config.databasePath),{directories:e,getDirectoryHandle:i}=n;t=n.fileName;const r=`backup-${Date.now()}--${t}`,s=`${e.join("/")}/${r}`;this.db.exec({sql:"VACUUM INTO ?",bind:[s]});const c=await i();return a=await(await(await c.getFileHandle(r)).getFile()).arrayBuffer(),await c.removeEntry(r),{name:t,data:a}}async clear(){if(!this.config?.databasePath)throw new Error("Driver not initialized");await this.destroy();const{getDirectoryHandle:t,fileName:a,tempFileNames:n}=K(this.config.databasePath),e=await t(),i=[a,...n];await Promise.all(i.map(async r=>e.removeEntry(r).catch(s=>{if(!(s instanceof DOMException&&s.name==="NotFoundError"))throw s})))}async destroy(){this.closeDb(),this.writeCallbacks.clear()}}const F="function",x="64e10b34-2bf7-4616-9668-f99de5aa046e",G="get",Y="has",J="set",{isArray:D}=Array;let{SharedArrayBuffer:_,window:Z}=globalThis,{notify:$,wait:B,waitAsync:O}=Atomics,H=null;O||(O=o=>({value:new Promise(t=>{let a=new Worker("data:application/javascript,onmessage%3D(%7Bdata%3Ab%7D)%3D%3E(Atomics.wait(b%2C0)%2CpostMessage(0))");a.onmessage=t,a.postMessage(o)})}));try{new _(4)}catch{_=ArrayBuffer;const t=new WeakMap;if(Z){const a=new Map,{prototype:{postMessage:n}}=Worker,e=i=>{const r=i.data?.[x];if(!D(r)){i.stopImmediatePropagation();const{id:s,sb:c}=r;a.get(s)(c)}};H=function(i,...r){const s=i?.[x];if(D(s)){const[c,u]=s;t.set(u,c),this.addEventListener("message",e)}return n.call(this,i,...r)},O=i=>({value:new Promise(r=>{a.set(t.get(i),r)}).then(r=>{a.delete(t.get(i)),t.delete(i);for(let s=0;s<r.length;s++)i[s]=r[s];return"ok"})})}else{const a=(n,e)=>({[x]:{id:n,sb:e}});$=n=>{postMessage(a(t.get(n),n))},addEventListener("message",n=>{const e=n.data?.[x];if(D(e)){const[i,r]=e;t.set(r,i)}})}}/*! (c) Andrea Giammarchi - ISC */const{Int32Array:S,Map:A,Uint16Array:I}=globalThis,{BYTES_PER_ELEMENT:L}=S,{BYTES_PER_ELEMENT:V}=I,X=(o,t,a)=>{for(;B(o,0,0,t)==="timed-out";)a()},j=new WeakSet,T=new WeakMap,ee={value:{then:o=>o()}};let te=0;const R=(o,{parse:t=JSON.parse,stringify:a=JSON.stringify,transform:n,interrupt:e}=JSON)=>{if(!T.has(o)){const i=H||o.postMessage,r=(b,...h)=>i.call(o,{[x]:h},{transfer:b}),s=typeof e===F?e:e?.handler,c=e?.delay||42,u=new TextDecoder("utf-16"),f=(b,h)=>b?O(h,0):(s?X(h,c,s):B(h,0),ee);let w=!1;T.set(o,new Proxy(new A,{[Y]:(b,h)=>typeof h=="string"&&!h.startsWith("_"),[G]:(b,h)=>h==="then"?null:((...v)=>{const P=te++;let y=new S(new _(L*2)),g=[];j.has(v.at(-1)||g)&&j.delete(g=v.pop()),r(g,P,y,h,n?v.map(n):v);const k=o!==globalThis;let q=0;return w&&k&&(q=setTimeout(console.warn,1e3,`💀🔒 - Possible deadlock if proxy.${h}(...args) is awaited`)),f(k,y).value.then(()=>{clearTimeout(q);const m=y[1];if(!m)return;const E=V*m;return y=new S(new _(E+E%L)),r([],P,y),f(k,y).value.then(()=>t(u.decode(new I(y.buffer).slice(0,m))))})}),[J](b,h,v){const P=typeof v;if(P!==F)throw new Error(`Unable to assign ${h} as ${P}`);if(!b.size){const y=new A;o.addEventListener("message",async g=>{const k=g.data?.[x];if(D(k)){g.stopImmediatePropagation();const[q,m,...E]=k;let l;if(E.length){const[d,M]=E;if(b.has(d)){w=!0;try{const p=await b.get(d)(...M);if(p!==void 0){const C=a(n?n(p):p);y.set(q,C),m[1]=C.length}}catch(p){l=p}finally{w=!1}}else l=new Error(`Unsupported action: ${d}`);m[0]=1}else{const d=y.get(q);y.delete(q);for(let M=new I(m.buffer),p=0;p<d.length;p++)M[p]=d.charCodeAt(p)}if($(m,0),l)throw l}})}return!!b.set(h,v)}}))}return T.get(o)};R.transfer=(...o)=>(j.add(o),o);function N(){let o,t;return{lock:async()=>{for(;o;)await o;o=new Promise(e=>{t=e})},unlock:async()=>{const e=t;o=void 0,t=void 0,e?.()}}}function ie(o,t,a){let n,e,i,r,s,c,u=0,f=!1,w=!1,b=!0;if(typeof o!="function")throw new TypeError("Expected a function");t=Number(t)||0,typeof a=="object"&&a!==null&&(f=!!a.leading,w="maxWait"in a,i=w?Math.max(Number(a.maxWait)||0,t):0,b="trailing"in a?!!a.trailing:b);function h(l){const d=n,M=e;return n=e=void 0,u=l,r=o.apply(M,d),r}function v(l){return u=l,s=setTimeout(g,t),f?h(l):r}function P(l){const d=l-(c??0),M=l-u,p=t-d;return w?Math.min(p,i-M):p}function y(l){const d=l-(c??0),M=l-u;return c===void 0||d>=t||d<0||w&&M>=i}function g(){const l=Date.now();if(y(l))return k(l);s=setTimeout(g,P(l))}function k(l){return s=void 0,b&&n?h(l):(n=e=void 0,r)}function q(){s!==void 0&&clearTimeout(s),u=0,n=c=e=s=void 0}function m(){return s===void 0?r:k(Date.now())}function E(){const l=Date.now(),d=y(l);if(n=arguments,e=this,c=l,d){if(s===void 0)return v(c);if(w)return s=setTimeout(g,t),h(c)}return s===void 0&&(s=setTimeout(g,t)),r}return E.cancel=q,E.flush=m,E}function re(){return crypto.randomUUID()}function ae(o,t){switch(o){case"session":case":sessionStorage:":let a=sessionStorage._sqlocal_session_key;return a||(a=re(),sessionStorage._sqlocal_session_key=a),`session:${a}`;case"local":case":localStorage:":return"local";case":memory:":return`memory:${t}`;default:return`path:${o}`}}class se{constructor(t){Object.defineProperty(this,"driver",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"config",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"userFunctions",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"initMutex",{enumerable:!0,configurable:!0,writable:!0,value:N()}),Object.defineProperty(this,"transactionMutex",{enumerable:!0,configurable:!0,writable:!0,value:N()}),Object.defineProperty(this,"transactionKey",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"proxy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"dirtyTables",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"effectsChannel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"reinitChannel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onmessage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"init",{enumerable:!0,configurable:!0,writable:!0,value:async e=>{if(!(!this.config.databasePath||!this.config.clientKey)){await this.initMutex.lock();try{try{await this.driver.init(this.config)}catch{console.warn(`Persistence failed, so ${this.config.databasePath} will not be saved. For origin private file system persistence, make sure your web server is configured to use the correct HTTP response headers (See https://sqlocal.dev/guide/setup#cross-origin-isolation).`),this.config.databasePath=":memory:",this.driver=new W,await this.driver.init(this.config)}const i=ae(this.config.databasePath,this.config.clientKey);this.reinitChannel=new BroadcastChannel(`_sqlocal_reinit_(${i})`),this.reinitChannel.onmessage=r=>{const s=r.data;if(this.config.clientKey!==s.clientKey)switch(s.type){case"reinit":this.init(s.reason);break;case"close":this.driver.destroy();break}},this.config.reactive&&(this.effectsChannel=new BroadcastChannel(`_sqlocal_effects_(${i})`),this.driver.onWrite(async r=>{this.dirtyTables.add(r.table),await this.transactionMutex.lock(),this.emitEffectsDebounced(),await this.transactionMutex.unlock()})),await Promise.all(Array.from(this.userFunctions.values()).map(r=>this.initUserFunction(r))),await this.execInitStatements(),this.emitMessage({type:"event",event:"connect",reason:e})}catch(i){this.emitMessage({type:"error",error:i,queryKey:null}),await this.destroy()}finally{await this.initMutex.unlock()}}}}),Object.defineProperty(this,"postMessage",{enumerable:!0,configurable:!0,writable:!0,value:async(e,i)=>{const r=e instanceof MessageEvent?e.data:e;switch(await this.initMutex.lock(),r.type){case"config":this.editConfig(r);break;case"query":case"batch":case"transaction":this.exec(r);break;case"function":this.createUserFunction(r);break;case"getinfo":this.getDatabaseInfo(r);break;case"import":this.importDb(r);break;case"export":this.exportDb(r);break;case"delete":this.deleteDb(r);break;case"destroy":this.destroy(r);break}await this.initMutex.unlock()}}),Object.defineProperty(this,"emitMessage",{enumerable:!0,configurable:!0,writable:!0,value:(e,i=[])=>{this.onmessage&&this.onmessage(e,i)}}),Object.defineProperty(this,"emitEffects",{enumerable:!0,configurable:!0,writable:!0,value:()=>{!this.effectsChannel||this.dirtyTables.size===0||(this.effectsChannel.postMessage({type:"effects",tables:[...this.dirtyTables]}),this.dirtyTables.clear())}}),Object.defineProperty(this,"emitEffectsDebounced",{enumerable:!0,configurable:!0,writable:!0,value:ie(()=>this.emitEffects(),32,{maxWait:180})}),Object.defineProperty(this,"editConfig",{enumerable:!0,configurable:!0,writable:!0,value:e=>{this.config=e.config,this.init("initial")}}),Object.defineProperty(this,"exec",{enumerable:!0,configurable:!0,writable:!0,value:async e=>{try{const i={type:"data",queryKey:e.queryKey,data:[]};switch(e.type){case"query":const r=this.transactionKey!==null&&this.transactionKey===e.transactionKey;try{r||await this.transactionMutex.lock();const s=await this.driver.exec(e);i.data.push(s)}finally{r||await this.transactionMutex.unlock()}break;case"batch":try{await this.transactionMutex.lock();const s=await this.driver.execBatch(e.statements);i.data.push(...s)}finally{await this.transactionMutex.unlock()}break;case"transaction":if(e.action==="begin"&&(await this.transactionMutex.lock(),this.transactionKey=e.transactionKey,await this.driver.exec({sql:"BEGIN"})),(e.action==="commit"||e.action==="rollback")&&this.transactionKey!==null&&this.transactionKey===e.transactionKey){const s=e.action==="commit"?"COMMIT":"ROLLBACK";await this.driver.exec({sql:s}),this.transactionKey=null,await this.transactionMutex.unlock()}break}this.emitMessage(i)}catch(i){this.emitMessage({type:"error",error:i,queryKey:e.queryKey})}}}),Object.defineProperty(this,"execInitStatements",{enumerable:!0,configurable:!0,writable:!0,value:async()=>{if(this.config.onInitStatements)for(let e of this.config.onInitStatements)await this.driver.exec(e)}}),Object.defineProperty(this,"getDatabaseInfo",{enumerable:!0,configurable:!0,writable:!0,value:async e=>{try{this.emitMessage({type:"info",queryKey:e.queryKey,info:{databasePath:this.config.databasePath,storageType:this.driver.storageType,databaseSizeBytes:await this.driver.getDatabaseSizeBytes(),persisted:await this.driver.isDatabasePersisted()}})}catch(i){this.emitMessage({type:"error",queryKey:e.queryKey,error:i})}}}),Object.defineProperty(this,"createUserFunction",{enumerable:!0,configurable:!0,writable:!0,value:async e=>{const{functionName:i,functionType:r,queryKey:s}=e;let c;if(this.userFunctions.has(i)){this.emitMessage({type:"error",error:new Error(`A user-defined function with the name "${i}" has already been created for this SQLocal instance.`),queryKey:s});return}switch(r){case"callback":c={type:r,name:i,func:(...u)=>{this.emitMessage({type:"callback",name:i,args:u})}};break;case"scalar":c={type:r,name:i,func:this.proxy[`_sqlocal_func_${i}`]};break;case"aggregate":c={type:r,name:i,func:{step:this.proxy[`_sqlocal_func_${i}_step`],final:this.proxy[`_sqlocal_func_${i}_final`]}};break}try{await this.initUserFunction(c),this.emitMessage({type:"success",queryKey:s})}catch(u){this.emitMessage({type:"error",error:u,queryKey:s})}}}),Object.defineProperty(this,"initUserFunction",{enumerable:!0,configurable:!0,writable:!0,value:async e=>{await this.driver.createFunction(e),this.userFunctions.set(e.name,e)}}),Object.defineProperty(this,"importDb",{enumerable:!0,configurable:!0,writable:!0,value:async e=>{const{queryKey:i,database:r}=e;let s=!1;try{await this.driver.import(r),this.driver.storageType==="memory"&&await this.execInitStatements()}catch(c){this.emitMessage({type:"error",error:c,queryKey:i}),s=!0}finally{this.driver.storageType!=="memory"&&await this.init("overwrite")}s||this.emitMessage({type:"success",queryKey:i})}}),Object.defineProperty(this,"exportDb",{enumerable:!0,configurable:!0,writable:!0,value:async e=>{const{queryKey:i}=e;try{const{name:r,data:s}=await this.driver.export();this.emitMessage({type:"buffer",queryKey:i,bufferName:r,buffer:s},[s])}catch(r){this.emitMessage({type:"error",error:r,queryKey:i})}}}),Object.defineProperty(this,"deleteDb",{enumerable:!0,configurable:!0,writable:!0,value:async e=>{const{queryKey:i}=e;let r=!1;try{await this.driver.clear()}catch(s){this.emitMessage({type:"error",error:s,queryKey:i}),r=!0}finally{await this.init("delete")}r||this.emitMessage({type:"success",queryKey:i})}}),Object.defineProperty(this,"destroy",{enumerable:!0,configurable:!0,writable:!0,value:async e=>{await this.driver.exec({sql:"PRAGMA optimize"}),await this.driver.destroy(),this.effectsChannel&&(this.emitEffectsDebounced.flush(),this.effectsChannel.close(),this.effectsChannel=void 0),this.reinitChannel&&(this.reinitChannel.close(),this.reinitChannel=void 0),e&&this.emitMessage({type:"success",queryKey:e.queryKey})}});const n=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope?R(globalThis):globalThis;this.proxy=n,this.driver=t}}const ne=new Q,U=new se(ne);self.onmessage=o=>{U.postMessage(o)};U.onmessage=(o,t)=>{self.postMessage(o,t)};
//# sourceMappingURL=worker-CuIBOSaM.js.map