browser-sqlite 1.0.0-rc.3 → 1.0.0-rc.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.
Files changed (47) hide show
  1. package/NOTICE +56 -0
  2. package/README.md +112 -104
  3. package/dist/LICENSE +21 -0
  4. package/dist/NOTICE +56 -0
  5. package/dist/abandon.d.ts +77 -0
  6. package/dist/api.d.ts +426 -0
  7. package/dist/bulk.d.ts +57 -0
  8. package/dist/capabilities.d.ts +23 -0
  9. package/dist/client.d.ts +221 -0
  10. package/dist/credits.d.ts +31 -0
  11. package/dist/{esm/src/debug.d.ts → debug.d.ts} +21 -10
  12. package/dist/delete.d.ts +48 -0
  13. package/dist/epochs.d.ts +85 -0
  14. package/dist/errors.d.ts +76 -0
  15. package/dist/index.d.ts +8 -0
  16. package/dist/index.js +5 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/inspect.d.ts +96 -0
  19. package/dist/locks.d.ts +172 -0
  20. package/dist/logger.d.ts +24 -0
  21. package/dist/pool.d.ts +191 -0
  22. package/dist/queries.d.ts +65 -0
  23. package/dist/scheduler.d.ts +145 -0
  24. package/dist/sqlite-codes.d.ts +154 -0
  25. package/dist/supervisor.d.ts +17 -0
  26. package/dist/transaction.d.ts +61 -0
  27. package/dist/types.d.ts +642 -0
  28. package/dist/utils.d.ts +156 -0
  29. package/dist/worker/cloneable.d.ts +25 -0
  30. package/dist/worker/probes.d.ts +26 -0
  31. package/dist/worker/sqlite-code.d.ts +9 -0
  32. package/dist/worker/statement-cache.d.ts +36 -0
  33. package/dist/worker/wa-sqlite-async.wasm +0 -0
  34. package/dist/worker/wa-sqlite-jspi.wasm +0 -0
  35. package/dist/worker/wa-sqlite.wasm +0 -0
  36. package/dist/worker/worker.js +11 -0
  37. package/dist/worker/worker.js.map +1 -0
  38. package/package.json +46 -22
  39. package/dist/esm/index.js +0 -424
  40. package/dist/esm/rslib.config.d.ts +0 -2
  41. package/dist/esm/rstest.config.d.ts +0 -2
  42. package/dist/esm/src/client.d.ts +0 -332
  43. package/dist/esm/src/index.d.ts +0 -1
  44. package/dist/esm/src/orchestrator.d.ts +0 -87
  45. package/dist/esm/src/types.d.ts +0 -83
  46. package/dist/esm/src/utils.d.ts +0 -6
  47. /package/dist/{esm/src → worker}/worker.d.ts +0 -0
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ let e;let t={sync:[],async:[],jspi:["jspi"]},r={OPFSWriteAheadVFS:{builds:["sync","async","jspi"],maxPoolSize:null,poolLimitReason:null,multiConnection:!0,persistent:!0,memoryModel:"page-cache",storage:"opfs",layout:"opfs-path",exclusiveFileHandle:!1,requires:["opfs"],degradesWithout:["readwrite-unsafe"],singleConnectionWithout:["readwrite-unsafe"],extraFileSuffixes:["-wa0","-wa1"],yieldsDuringStatements:!1,exclusiveConnection:!1,exclusiveConnectionWithout:["readwrite-unsafe"],defaultPragmas:{}},OPFSAdaptiveVFS:{builds:["async","jspi"],maxPoolSize:null,poolLimitReason:null,multiConnection:!0,persistent:!0,memoryModel:"page-cache",storage:"opfs",layout:"opfs-path",exclusiveFileHandle:!1,requires:["opfs"],degradesWithout:["readwrite-unsafe"],singleConnectionWithout:["readwrite-unsafe"],extraFileSuffixes:[],yieldsDuringStatements:!1,exclusiveConnection:!1,exclusiveConnectionWithout:[],defaultPragmas:{}},OPFSCoopSyncVFS:{builds:["sync","async","jspi"],maxPoolSize:1,poolLimitReason:"it rotates one exclusive access handle between connections, so another worker only waits its turn",multiConnection:!0,persistent:!0,memoryModel:"page-cache",storage:"opfs",layout:"opfs-path",exclusiveFileHandle:!0,requires:["opfs"],degradesWithout:[],singleConnectionWithout:[],extraFileSuffixes:[],yieldsDuringStatements:!1,exclusiveConnection:!1,exclusiveConnectionWithout:[],defaultPragmas:{}},AccessHandlePoolVFS:{builds:["sync","async","jspi"],maxPoolSize:1,poolLimitReason:"it cannot share access handles between connections",multiConnection:!1,persistent:!0,memoryModel:"page-cache",storage:"opfs",layout:"opfs-pool",exclusiveFileHandle:!0,requires:["opfs"],degradesWithout:[],singleConnectionWithout:[],extraFileSuffixes:[],yieldsDuringStatements:!1,exclusiveConnection:!0,exclusiveConnectionWithout:[],defaultPragmas:{locking_mode:"exclusive",journal_mode:"wal"}},IDBBatchAtomicVFS:{builds:["async","jspi"],maxPoolSize:null,poolLimitReason:null,multiConnection:!0,persistent:!0,memoryModel:"page-cache",storage:"indexeddb",layout:"idb-store",exclusiveFileHandle:!1,requires:[],degradesWithout:[],singleConnectionWithout:[],extraFileSuffixes:[],yieldsDuringStatements:!0,exclusiveConnection:!1,exclusiveConnectionWithout:[],defaultPragmas:{}},IDBMirrorVFS:{builds:["async","jspi"],maxPoolSize:1,poolLimitReason:"its pages are mirrored per worker and commits propagate asynchronously, so a larger pool reads stale data or fails outright",multiConnection:!1,persistent:!0,memoryModel:"whole-database",storage:"indexeddb",layout:"idb-store",exclusiveFileHandle:!1,requires:[],degradesWithout:[],singleConnectionWithout:[],extraFileSuffixes:[],yieldsDuringStatements:!1,exclusiveConnection:!1,exclusiveConnectionWithout:[],defaultPragmas:{}},OPFSAnyContextVFS:{builds:["async","jspi"],maxPoolSize:null,poolLimitReason:null,multiConnection:!0,persistent:!0,memoryModel:"page-cache",storage:"opfs",layout:"opfs-path",exclusiveFileHandle:!1,requires:["opfs","writable-stream"],degradesWithout:[],singleConnectionWithout:[],extraFileSuffixes:[],yieldsDuringStatements:!1,exclusiveConnection:!1,exclusiveConnectionWithout:[],defaultPragmas:{}},MemoryVFS:{builds:["sync","async","jspi"],maxPoolSize:1,poolLimitReason:"its pages live in the worker that opened them, so a larger pool would open independent databases that diverge silently",multiConnection:!1,persistent:!1,memoryModel:"whole-database",storage:"memory",layout:"memory",exclusiveFileHandle:!1,requires:[],degradesWithout:[],singleConnectionWithout:[],extraFileSuffixes:[],yieldsDuringStatements:!1,exclusiveConnection:!1,exclusiveConnectionWithout:[],defaultPragmas:{}},MemoryAsyncVFS:{builds:["async","jspi"],maxPoolSize:1,poolLimitReason:"its pages live in the worker that opened them, so a larger pool would open independent databases that diverge silently",multiConnection:!1,persistent:!1,memoryModel:"whole-database",storage:"memory",layout:"memory",exclusiveFileHandle:!1,requires:[],degradesWithout:[],singleConnectionWithout:[],extraFileSuffixes:[],yieldsDuringStatements:!1,exclusiveConnection:!1,exclusiveConnectionWithout:[],defaultPragmas:{}}},i=e=>r[e].builds[0],a={opfs:()=>"u">typeof navigator&&"function"==typeof navigator.storage?.getDirectory&&"u">typeof FileSystemFileHandle,jspi:()=>"function"==typeof WebAssembly.Suspending,"writable-stream":()=>"u">typeof FileSystemFileHandle&&"function"==typeof FileSystemFileHandle.prototype.createWritable,"cross-origin-isolated":()=>!0===globalThis.crossOriginIsolated},o=new Set(["readwrite-unsafe"]),n={opfs:"OPFS",jspi:"JSPI","writable-stream":"FileSystemWritableFileStream","readwrite-unsafe":"readwrite-unsafe access handles","cross-origin-isolated":"cross-origin isolation"};[...Object.keys(a),...o];let s=()=>{let e=new Set;for(let[t,r]of Object.entries(a))r()&&e.add(t);return e},l=(e,i,a)=>{for(let n of[...r[e].requires,...t[i]])if(!o.has(n)&&!a.has(n))return n;return null};class d extends Error{code;sqliteCode;sqliteExtendedCode;timeout;constructor(e,t,r){super(t,r),this.code=e,this.name=e,r?.sqliteCode!==void 0&&(this.sqliteCode=r.sqliteCode),r?.sqliteExtendedCode!==void 0&&(this.sqliteExtendedCode=r.sqliteExtendedCode),r?.timeout!==void 0&&(this.timeout=r.timeout)}}class u extends d{rowsWritten;rowsNotWritten;constructor(e,t,r){super("BULK_WRITE_FAILED",e,r),this.rowsWritten=t.rowsWritten,this.rowsNotWritten=t.rowsNotWritten}}let c=(e,t)=>`bsq:staging:${e}:${t}`,h=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,w=(e,t,i)=>{let a,o=`bsq:client:${f(t)}:${i}:`;if(!e.startsWith(o))return;let n=e.slice(o.length).split(":");if(3!==n.length)return;let[s,l,d]=n;if(h.test(s)&&Object.hasOwn(r,l)){try{a=decodeURIComponent(d)}catch{return}return{id:s,vfs:l,name:a}}},f=e=>"opfs-path"===r[e].layout?"opfs":e,m=e=>"memory"!==r[e].layout,p=(e,t)=>`bsq:write:${f(e)}:${t}`,y=(e,t)=>`bsq:conn:${f(e)}:${t}`,R={available:!1,hold:async()=>()=>{},withLock:async(e,t)=>t(),tryWithLock:async(e,t)=>(await t(),!0),heldNames:async()=>[],entries:async()=>({held:[],pending:[]})},g=(e=globalThis.navigator?.locks)=>e?{available:!0,hold:(t,r)=>new Promise((i,a)=>{let o,n=r?.ifAvailable===!0,s=new Promise(e=>{o=e}),l={mode:r?.mode??"exclusive"};r?.signal&&(l.signal=r.signal),n&&(l.ifAvailable=!0),e.request(t,l,e=>n&&!e?(i(void 0),Promise.resolve()):(i(o),s)).catch(a)}),withLock:(t,r)=>e.request(t,{mode:"exclusive"},()=>r()),tryWithLock:async(t,r)=>{let i=!1;return await e.request(t,{mode:"exclusive",ifAvailable:!0},async e=>{e&&(i=!0,await r())}),i},heldNames:async()=>((await e.query()).held??[]).map(e=>e.name).filter(e=>"string"==typeof e),entries:async()=>{let t=await e.query(),r=e=>(e??[]).filter(e=>"string"==typeof e.name&&"string"==typeof e.clientId).map(e=>({name:e.name,mode:"shared"===e.mode?"shared":"exclusive",clientId:e.clientId}));return{held:r(t.held),pending:r(t.pending)}}}:R,E=/\b(INSERT|REPLACE|UPDATE|DELETE|CREATE|DROP|ALTER|VACUUM|ANALYZE|REINDEX|SAVEPOINT|RELEASE|BEGIN|COMMIT|ROLLBACK|ATTACH|DETACH|PRAGMA)\b/i,v=/^\s*PRAGMA\s+(\w+\.)?\w+\s*;?\s*$/i,b=e=>v.test(e)||/^\s*(SELECT|EXPLAIN|VALUES|WITH)\b/i.test(e)&&!E.test(e),O=(e,t)=>{let r=()=>{};if(!e||e===t)return{signal:t,release:r};if(!t||e.aborted)return{signal:e,release:r};if(t.aborted)return{signal:t,release:r};let i=new AbortController,a=e=>()=>i.abort(e.reason),o=a(e),n=a(t);return e.addEventListener("abort",o,{once:!0}),t.addEventListener("abort",n,{once:!0}),{signal:i.signal,release:()=>{e.removeEventListener("abort",o),t.removeEventListener("abort",n)}}},T=(e,t)=>{let r=e?.timeout;if(void 0===r)return{signal:e?.signal,release:()=>{}};let i=new AbortController,a=setTimeout(()=>{i.abort(new d("OPERATION_TIMEOUT",`${t}() exceeded its timeout of ${r} ms.`,{timeout:r}))},r),{signal:o,release:n}=O(e?.signal,i.signal);return{signal:o,release:()=>{clearTimeout(a),n()}}},I=(e,t)=>{if(b(e))return;let r=e.trim().split(/\s+/)[0]?.toUpperCase()??"";throw new d("NOT_A_READ_QUERY",`${t}() only accepts statements that are provably reads; "${r}" must go through write(). Note that a PRAGMA that assigns a value or takes an argument is a write.`)},S=e=>{if(!e)throw new d("INVALID_IDENTIFIER","Identifier cannot be empty");if(e.includes("\0"))throw new d("INVALID_IDENTIFIER",`Identifier contains a NUL character: ${JSON.stringify(e)}`);return`"${e.replace(/"/g,'""')}"`},A=/^[A-Za-z][A-Za-z0-9 ]*(\([0-9, ]+\))?$/,C=/^[A-Za-z_]\w*$/,N=/^-?\d+$/,_=/^'([^']|'')*'$/,P=e=>new URL(e,"file://").pathname.replace(/^\//,""),$=(e,t,r)=>{let i;if(void 0===e)return;let a="function"==typeof e,o=a?e(t):e,n=a||o.endsWith("/")?o:`${o}/`;try{i=new URL(n,r).href}catch{throw new d("INVALID_OPTION",`wasmUrl could not be parsed as a URL: ${JSON.stringify(o)}. Pass a directory (relative, absolute, or a full URL), or a callback returning the full URL of one .wasm file.`)}return a?{file:i}:{base:i}},L=Promise.resolve(),k=Symbol.for("browser-sqlite.epochs.v1"),D=async(t,r,i)=>{if(void 0!==e)return e;if(void 0!==i){let t=r.held.find(e=>e.name===i);if(t)return e=t.clientId}let a=`bsq:realm:${crypto.randomUUID()}`,o=await t.hold(a,{mode:"shared"});try{let r=(await t.entries()).held.find(e=>e.name===a);if(!r)throw new d("UNSUPPORTED","This browser does not report lock holders, so clients cannot be located.");return e=r.clientId}finally{o()}},q=async(e,t,r,i)=>{if(!m(r))throw new d("INVALID_OPTION",`${r} keeps its pages in the worker that opened them, so two clients are two databases and there is nothing to inspect. Ask this of a persistent VFS.`);let a=await e.entries(),o=await D(e,a,i),n=[];for(let e of a.held){let i=w(e.name,r,t);i&&n.push({id:i.id,name:i.name,tab:e.clientId,sameTab:e.clientId===o,vfs:i.vfs})}let s=p(r,t),l=a.held.find(e=>e.name===s),u=a.pending.filter(e=>e.name===s).length;return{file:t,vfs:r,clients:n,tabs:new Set(n.map(e=>e.tab)).size,write:{tab:l?.clientId??null,sameTab:void 0!==l&&l.clientId===o,waiting:u}}},x=async(e,t,r,i,a=250)=>{let o;if(e.available&&m(r))try{let n=await Promise.race([e.entries(),new Promise(e=>{o=setTimeout(e,a,void 0)})]);if(!n)return;return n.held.some(e=>{let a=w(e.name,r,t);return void 0!==a&&a.id!==i})}catch{return}finally{clearTimeout(o)}},W=async(e,t)=>{if(!t?.vfs)throw new d("INVALID_OPTION","vfs is required. Pass the VFS the database was created with — VFS.md compares them. Four VFS share one underlying file, and the rest are separate stores, so the wrong one reports on a different database.");let{vfs:i}=t;if(!Object.hasOwn(r,i))throw new d("INVALID_OPTION",`Unknown vfs '${String(i)}'. Supported: ${Object.keys(r).join(", ")}.`);if(!m(i))throw new d("INVALID_OPTION",`${i} keeps its pages in the worker that opened them, so two clients are two databases and there is nothing to inspect. Ask this of a persistent VFS.`);let a=g();if(!a.available)throw new d("UNSUPPORTED","The Web Locks API is unavailable, so clients on a database cannot be counted. Reporting zero would be indistinguishable from a database nobody holds.");return q(a,P(e),i)},M=Symbol("stop"),F=new Set([5,6]),U=e=>e.sqliteExtendedCode!==e.sqliteCode?e.sqliteExtendedCode:void 0,j=e=>{if(void 0===e.sqliteCode||!F.has(e.sqliteCode))return;let t=U(e);return new d("BUSY",e.message,{cause:e.cause,sqliteCode:e.sqliteCode,...void 0!==t?{sqliteExtendedCode:t}:{}})},V=e=>{let t=j({message:e.message,...void 0!==e.cause?{cause:e.cause}:{},...void 0!==e.sqliteCode?{sqliteCode:e.sqliteCode}:{}});return t||new d("WORKER_CRASHED",e.message,{cause:e.cause,...void 0!==e.sqliteCode?{sqliteCode:e.sqliteCode}:{}})},B=e=>new Worker(new URL("./worker/worker.js",import.meta.url),{name:e,type:"module"}),H=({worker:e,iterator:t,state:r,detach:i,release:a})=>{r.done||(r.done=!0,i(),e.interrupt(t),t.return(void 0).catch(()=>{}),a?.())},z=((e=H)=>{let t=new FinalizationRegistry(e);return{watch:(e,r,i)=>t.register(e,r,i),forget:e=>t.unregister(e)}})(),K=e=>{let t;if(!e)return{aborted:void 0,teardown:()=>{}};let r=new Promise((r,i)=>{t=()=>i(e.reason),e.addEventListener("abort",t,{once:!0})});return r.catch(()=>{}),{aborted:r,teardown:()=>{t&&e.removeEventListener("abort",t)}}},Y=(e,t,r,i)=>{let{signal:a,chunkSize:o,credits:n,onAbandon:s,onTransport:l,registry:d=z}=i??{},u=e.query(t,r,{chunkSize:o,credits:n,abortable:void 0!==a});l?.(u);let c={},h={worker:e,iterator:u,state:{done:!1},detach:()=>{},release:s};if(a){let e=()=>{d.forget(c),H(h)};a.addEventListener("abort",e,{once:!0}),h.detach=()=>a.removeEventListener("abort",e)}let w=Q(u,e,a,h,d,c);return d.watch(w,h,c),w},Q=async function*(e,t,r,i,a,o){if(r?.aborted)throw i.state.done=!0,i.detach(),a.forget(o),r.reason;let{aborted:n,teardown:s}=K(r);try{for(;;){let t=n?await Promise.race([n,e.next()]):await e.next();if(t.done)break;"number"!=typeof t.value&&(yield t.value)}}finally{i.state.done=!0,i.detach(),a.forget(o),s(),t.interrupt(e),e.return(void 0).catch(()=>{})}},G=async function*(e,t,r,i){for await(let a of Y(e,t,r,i))for(let e of a)yield e},X=async(e,t,r,i)=>{let a=[];for await(let o of Y(e,t,r,i))a.push(...o);return a},J=async(e,t,r,i)=>{for await(let a of Y(e,t,r,{...i,chunkSize:1,credits:1}))return a[0]},Z=async(e,t,r,i)=>{let{signal:a}=i??{};if(a?.aborted)throw a.reason;let{aborted:o,teardown:n}=K(a),s=e.query(t,r,{abortable:void 0!==a}),l=[],d=0;try{for(;;){let e=o?await Promise.race([s.next(),o]):await s.next();if(e.done)break;"number"==typeof e.value?d=e.value:l.push(...e.value)}}finally{n(),e.interrupt(s),s.return(void 0).catch(()=>{})}return{result:l,affected:d}},ee=async(e,t)=>{await X(e,t)},et=0,er=new Map,ei=(e,a)=>{let o,h,w,R,E,v,D,W,F,H,z,Q,ei,ea,eo,en,es,el=P(e);if(!a?.vfs)throw new d("INVALID_OPTION","vfs is required. Compare VFS and measure your own targets at https://lalexdotcom.github.io/browser-sqlite/");let ed=++et,eu=`${a.name??"SQLite"} ${ed}`,ec=crypto.randomUUID(),eh=a.vfs,ew=a.build??i(eh),ef=r[eh],em=a.poolSize??Math.min(2,ef.maxPoolSize??2),ep=[],ey=em,eR=!1,eg=s().has("cross-origin-isolated")?new SharedArrayBuffer(4*em):void 0;if(!ef.builds.includes(ew))throw new d("INVALID_OPTION",`${eh} cannot run on the '${ew}' build. Supported: ${ef.builds.join(", ")}.`);let eE=$(a.wasmUrl,ew,location.href);if(null!==ef.maxPoolSize&&em>ef.maxPoolSize)throw new d("INVALID_OPTION",`${eh} does not support pool sizes greater than ${ef.maxPoolSize}: ${ef.poolLimitReason}. Set poolSize: ${ef.maxPoolSize}.`);let ev=l(eh,ew,s());if(ev)throw new d("INVALID_OPTION",((e,i,a)=>{let o=n[a];if(t[i].includes(a)){let t=r[e].builds.filter(e=>e!==i),a=t.length?` ${e} also runs on: ${t.join(", ")}.`:"";return`This browser does not support ${o}, which the '${i}' build requires.${a}`}let s=Object.keys(r).filter(e=>!r[e].requires.includes(a)),l=s.length?` Without it, these store elsewhere: ${s.join(", ")}.`:"";return`This browser does not support ${o}, which ${e} requires.${l}`})(eh,ew,ev));let eb=(W=a.pragmas,{...r[eh].defaultPragmas,...W});Object.entries(eb).map(([e,t])=>{if(!C.test(e))throw new d("INVALID_PRAGMA",`Invalid pragma name ${JSON.stringify(e)}: a pragma name must match ${C}.`);let r=String(t).trim();if(N.test(r)||C.test(r)||_.test(r))return`PRAGMA ${e}=${r}`;throw new d("INVALID_PRAGMA",`Invalid value ${JSON.stringify(t)} for pragma "${e}": expected an integer, a bare word such as WAL, or a quoted literal.`)});let eO=a.__unsafeTestWriterPolicy,eT="function"==typeof eO?eO:void 0,eI=a.__unsafeTestStatementCacheBytes,eS="number"==typeof eI&&eI>=0?eI:8388608,eA=!0,eC=new Map,eN=((e={})=>{let t,r,i=[],a=new Set,o=new Set,n=new Set,s=new Map,l=e=>s.get(e)??0,d=new Set,u=(e.poolSize??0)===0,c=Promise.withResolvers();u&&c.resolve(),c.promise.catch(()=>{});let h=new Set,w=!1,f=new Set,m=0,p=(r,i)=>{if(!(u||d.has(r))&&(d.add(r),"opened"===i&&h.add(r),"declined"===i&&f.add(r),!(d.size<(e.poolSize??0)))){if(e.onFirstSettle&&!w){w=!0;let r=[...d].filter(e=>!h.has(e)&&!f.has(e));if(e.onFirstSettle({openedCount:h.size,failedIndices:r}),d.size<(e.poolSize??0)||t)return}u=!0,c.resolve(),e.onGateOpen?.()}},y=[],R=[],g=-1,E=-1,v=e.canDesignateWriter??(()=>!0),b=e=>!!R.length&&(g===e.index||-1===g)&&(-1!==g||!!v(e.index))&&(g=e.index,E=e.index,R.shift()?.resolve(e),!0),O=()=>{r&&0===n.size&&r.resolve()},T=t=>{n.add(t.index);let r=l(t.index),i=!1;return{worker:t,release:()=>{if(!i){if(i=!0,l(t.index)!==r)return void O();n.delete(t.index),(t=>{if(!b(t)){if(g===t.index&&(g=-1),y.length)return y.shift()?.resolve(t);a.add(t.index),e.onIdle?.(t)}})(t),O()}}}},I=e=>{o.add(e),a.delete(e),n.delete(e),i[e]=void 0,s.set(e,l(e)+1),g===e&&(g=-1),E===e&&(E=-1),O()};return{add:e=>{if(p(e.index,"opened"),o.delete(e.index),i[e.index]=e,!b(e)){if(y.length)return void y.shift()?.resolve(e);a.add(e.index)}},remove:e=>{p(e,"failed"),I(e)},retire:e=>{p(e,"declined"),I(e)},shutdown:e=>{for(let i of(u||(u=!0,c.reject(e)),t??=e,r??=Promise.withResolvers(),y.splice(0)))i.reject(e);for(let t of R.splice(0))t.reject(e);return O(),r.promise},stats:()=>({read:y.length,write:R.length,available:a.size,leased:n.size,gated:m}),rearmSlot:e=>{u||d.delete(e)},acquire:async(e,r)=>{if(t)throw t;if(r?.throwIfAborted(),!u){m+=1;try{if(r){let{promise:e,reject:t}=Promise.withResolvers(),i=()=>t(r.reason);r.addEventListener("abort",i,{once:!0});try{await Promise.race([c.promise,e])}finally{r.removeEventListener("abort",i)}}else await c.promise}finally{m-=1}}if(t)throw t;let o="write"===e,n=(e=>{if(e&&g>-1){if(!a.has(g))return;return a.delete(g),i[g]}let t=i[E];if(void 0!==t&&a.has(E)&&(!e||v(E)))return a.delete(E),e&&(g=E),t;let r=i.find(t=>void 0!==t&&a.has(t.index)&&(!e||v(t.index)));if(r)return a.delete(r.index),e&&(g=r.index,E=r.index),r})(o);if(n)return T(n);let{promise:s,resolve:l,reject:d}=Promise.withResolvers(),h=o?R:y,w={resolve:l,reject:d};if(h.push(w),!r)return T(await s);let f=()=>{let e=h.indexOf(w);-1!==e&&(h.splice(e,1),d(r.reason))};r.addEventListener("abort",f,{once:!0});try{return T(await s)}finally{r.removeEventListener("abort",f)}}}})((F=e=>{if(0===e.openedCount){for(let[e,t]of(eA=!1,eC))tc(e,t);eC.clear(),td(o??new d("WORKER_CRASHED","All workers failed to open the database."));return}for(let t of e.failedIndices)eN.rearmSlot(t),tu(t)},H=()=>{let e;for(let[t,r]of(eA=!1,eC))"fail-client"===tl.report(t,"lost")?e??=r:0!==t||eU||(e??=r);for(let[e,t]of eC)tc(e,t);eC.clear(),(void 0!==e||0===ep.filter(Boolean).length)&&td(e??o??new d("WORKER_CRASHED","All workers failed to open the database."))},eT?{canDesignateWriter:eT,poolSize:em,onFirstSettle:F,onGateOpen:H}:{poolSize:em,onFirstSettle:F,onGateOpen:H})),e_=a.debug,eP=((e,t,r=console)=>{let i=t=>`[${e}] ${t}`,a={warn:e=>r.warn(i(e))};return t?{info:e=>r.debug(i(e)),warn:e=>r.warn(i(e)),error:e=>r.error(i(e)),always:a}:{info:()=>{},warn:()=>{},error:()=>{},always:a}})("string"==typeof e_?e_:eu,!!e_),e$=e_?((e,t,r,i)=>{let{vfs:a,pragmas:o,name:n}=r,s={file:e,vfs:a,pragmas:o,name:n,queue:{get read(){return i().read},get write(){return i().write},get gated(){return i().gated}},workers:[]};return{state:s,createWorkerDebugState:(e,r)=>{let i=new Proxy({index:e,name:r,requests:[],status:t[e]?.status??"EMPTY",creationTime:Date.now()},{get:(r,i)=>"status"===i?t[e]?.status??"EMPTY":r[i]});return s.workers[e]=i,i},createRequestDebugState:()=>{let e={queries:[],startTime:Date.now(),affectedRows:0};return{state:e,assign:t=>{let r=s.workers[t];r&&(e.acquireTime=Date.now(),r.requests.length>=50&&r.requests.shift(),r.requests.push(e),r.currentRequest=e)}}},createQueryDebugState:(e,t,r)=>{let i={sql:t,params:r,startTime:Date.now(),affectedRows:0,prepared:0},a=s.workers[e];return a?.currentRequest&&(a.currentRequest.queries.length>=50&&a.currentRequest.queries.shift(),a.currentRequest.queries.push(i),a.currentRequest.currentQuery=i),i}}})(el,ep,{vfs:eh,pragmas:eb,name:eu},()=>eN.stats()):void 0,eL=e$?.state,ek=g(),eD=m(eh)?p(eh,el):void 0,eq=new Set,ex=!1,eW=null,eM=()=>new d("DATABASE_IN_USE",`${eh} supports one connection at a time across the whole origin`+(eW?` without ${eW}, which this browser lacks`:"")+`. Another tab or client is already connected to '${el}'. `+"Close that client to open a new one here."),eF=m(eh)&&ef.exclusiveConnectionWithout.length>0?Promise.withResolvers():void 0,eU=void 0===eF;if(eF){eF.promise.then(()=>{eU=!0});let e=ef.exclusiveConnectionWithout.join(",");(w=er.get(e))||(w=Promise.withResolvers(),er.set(e,w)),w.promise.then(eF.resolve)}let ej=!1,eV=()=>{if(!ej||!R||v)return;let e=R;R=void 0,e()},eB=e=>ek.hold(y(eh,el),{mode:e?"exclusive":"shared",...e?{ifAvailable:!0}:{}}).then(e=>{h=e,ex=void 0===e}),eH=m(eh)?eF?eF.promise.then(e=>{if(void 0!==e&&!v)return eW=e,eB(null!==e)}):eB(ef.exclusiveConnection):void 0,ez=m(eh)?`bsq:client:${f(eh)}:${el}:${ec}:${eh}:${encodeURIComponent(eu)}`:void 0,eK=!1;void 0!==ez&&ek.hold(ez,{mode:"shared"}).then(e=>{eK?e():E=e}).catch(()=>{});let eY=Promise.resolve(),eQ=new AbortController,eG=(z=f(eh),Q=`${z}:${el}`,eo=(ea=(ei=(()=>{let e=globalThis,t=e[k];if(t)return t;let r=new Map;return e[k]=r,r})()).get(Q))??{value:0},ea||ei.set(Q,eo),en=`bsq:epoch:${z}:${el}`,{current:()=>eo.value,bump:()=>(eo.value+=1,eo.value),raiseTo:e=>{e>eo.value&&(eo.value=e)},originMax:async()=>ek.available?((e,t)=>{let r=0;for(let i of e){if(!i.startsWith(`${t}:`))continue;let e=i.slice(t.length+1);if(!/^\d+$/.test(e))continue;let a=Number(e);a>r&&(r=a)}return r})(await ek.heldNames(),en):0,publish:async e=>{if(!ek.available)return;let t=eo.releaseMarker;eo.releaseMarker=await ek.hold(`bsq:epoch:${z}:${el}:${e}`,{mode:"shared"}),t?.()}}),eX=async e=>{let t=await eG.originMax();eG.raiseTo(t);let r=eG.current();if(e.epochTarget=r,e.seen>=r)return;let i=e.query("SELECT count(*) FROM sqlite_master",void 0,{noServed:!0});for(;!(await i.next()).done;);e.seen=r},eJ=e=>{let t,r,i=eG.bump();return t=e.seen,r=e.epochTarget,e.seen=t===r&&i===r+1?i:t,eY=eG.publish(i).catch(e=>{eP.warn(`epoch publish failed: ${String(e)}`)})},eZ=async(e,t)=>{let r=e$.createRequestDebugState(),i=await eN.acquire(e,t);return r.assign(i.worker.index),{worker:i.worker,release:()=>{r.state.releaseTime=Date.now(),i.release()}}},e0=async e=>{let t;if(!(e instanceof d)||"OPERATION_TIMEOUT"!==e.code)return e;try{var r;r=(await q(ek,el,eh,ez)).write,t=null===r.tab?" The origin's write lock was already free when this was checked, so the wait was contention between writers rather than one holder that never let go.":r.sameTab?" The origin's write lock is held by this tab — a transaction here has not returned.":` The origin's write lock is held by another tab${r.waiting>0?`, with ${r.waiting} writer(s) queued behind it`:""}.`}catch{return e}return new d("OPERATION_TIMEOUT",`${e.message}${t}`,{cause:e,...void 0!==e.timeout?{timeout:e.timeout}:{}})},e1=async(e,t)=>{let r,i;if(void 0!==eH&&(await eH,ex))throw eM();if("write"===e&&eD){let e,{signal:i,release:a}=O(t,eQ.signal);try{e=await ek.hold(eD,i?{signal:i}:void 0)}catch(e){if(a(),eQ.signal.aborted)throw eQ.signal.reason;throw await e0(e)}a(),eq.add(e),r=()=>{eq.delete(e)&&e()}}try{i=e$?await eZ(e,t):await eN.acquire(e,t)}catch(e){throw r?.(),e}try{let{aborted:e,teardown:r}=K(t);try{let t=eX(i.worker);await (e?Promise.race([t,e]):t)}finally{r()}}catch(e){throw i.worker.quiesce().then(()=>i.release(),()=>i.release()),r?.(),e}if(!r)return i;let a=!1;return{...i,release:()=>{i.release(),a||(a=!0,eY.then(r,r))}}},e2=e=>e instanceof d&&"BUSY"===e.code&&"number"==typeof e.sqliteCode,e5=async(e,t)=>{let r=await e1("read",e);try{return await t(r.worker)}finally{r.worker.quiesce().then(()=>r.release(),()=>r.release())}},e3=async(e,t)=>{try{return await e5(e,t)}catch(r){if(!e2(r)||e?.aborted)throw r;return await e5(e,t)}},e6=async function*(e,t){for(let r=1;;r++){let i=!1,a=await e1("read",e),o=()=>{a.worker.quiesce().then(()=>a.release(),()=>a.release())};try{for await(let e of t(a.worker,o))i=!0,yield e;return}catch(t){if(i||r>1||!e2(t)||e?.aborted)throw t}finally{o()}}},e8=async(e,t,r)=>{I(e,"read");let{signal:i,release:a}=T(r,"read");try{return await e3(i,a=>X(a,e,t,{...r,signal:i}))}finally{a()}},e4=async function*(e,t,r){I(e,"chunk");let{signal:i,release:a}=T(r,"chunk");try{yield*e6(i,(o,n)=>Y(o,e,t,{...r,signal:i,onAbandon:()=>{n(),a()}}))}finally{a()}},e7=async function*(e,t,r){I(e,"stream");let{signal:i,release:a}=T(r,"stream");try{yield*e6(i,(o,n)=>G(o,e,t,{...r,signal:i,onAbandon:()=>{n(),a()}}))}finally{a()}},e9=async(e,t,r)=>{let{signal:i,release:a}=T(r,"write");try{let a=await e1("write",i);try{return await Z(a.worker,e,t,{...r,signal:i})}finally{await eJ(a.worker),a.worker.quiesce().then(()=>a.release(),()=>a.release())}}finally{a()}},te=async(e,t,r)=>{I(e,"first");let{signal:i,release:a}=T(r,"first");try{return await e3(i,a=>J(a,e,t,{...r,signal:i}))}finally{a()}},tt=(e=>{let t,{file:r,locks:i,maxVariables:a=32766,logger:o}=e;return e=>{let{read:n,write:s,transaction:l,reserve:h}=e,w=(e,t,r,i)=>{let o,n,{signal:l,release:d}=T(r,"bulkWrite"),c=Math.floor(a/t.length),w=Math.max(1,r?.queueSize??2*c),f=[],m=Promise.resolve(0),p=!1,y=0,R=0,g=0,E=()=>{n?.resolve(),n=void 0};l?.addEventListener("abort",E,{once:!0});let v=()=>new u(`bulkWrite into "${e}" failed after ${y} row(s); ${R} row(s) were not written.`,{rowsWritten:y,rowsNotWritten:R},{cause:o}),b=()=>{let r=[...f];f.length=0,g+=r.length;let a=h?.(),n=async a=>{if(o||l?.aborted)return R+=r.length,a;try{i&&await i;let{affected:o}=await s(`INSERT INTO ${S(e)} (${t.map(S).join(",")}) VALUES ${r.map(()=>`(${t.map(()=>"?")})`)}`,r.flatMap(e=>t.map(t=>e[t])),{signal:l});return y+=r.length,a+o}catch(e){if(l?.aborted)return R+=r.length,a;return o=e,R+=r.length,a}};m=m.then(async e=>{try{return a&&await a.started,await n(e)}finally{a?.done(),(g-=r.length)<w&&E()}})},O=()=>new u(`Bulk writer for "${e}" is closed.`,{rowsWritten:y,rowsNotWritten:R});return{enqueue:e=>{let t;if(p)throw O();if(l?.throwIfAborted(),o)throw v();return(f.push(e),f.length>=c&&b(),g<w)?L:(n??={promise:new Promise(e=>{t=e}),resolve:t}).promise},close:async()=>{if(p)throw O();try{f.length&&b();let e=await m;if(l?.throwIfAborted(),o)throw v();return p=!0,e}finally{l?.removeEventListener("abort",E),d()}}}};return{bulkWrite:w,output:(e,a,u)=>{let h,{signal:f,release:m}=T(u,"output"),p=(h=crypto.randomUUID(),`__bsq_staging_${h.replace(/-/g,"_")}`),y=Object.entries(a).map(([e,t])=>{let r=((e,t)=>{let r=e.trim();if(!A.test(r))throw new d("INVALID_IDENTIFIER",`Column "${t}" declares an unsupported type ${JSON.stringify(e)}. A type must be a word, optionally followed by numeric arguments, e.g. "INTEGER" or "VARCHAR(255)".`);return r})("string"==typeof t?t:t.type,e),i="object"==typeof t&&!!t.unique,a="object"==typeof t&&!!t.required,o="object"==typeof t&&t.generated?((e,t)=>{let r=e.trim();if(!r.startsWith("(")||!r.endsWith(")")||r.includes(";"))throw new d("INVALID_IDENTIFIER",`Column "${t}" declares an invalid generated expression ${JSON.stringify(e)}. It must be parenthesised and contain no ";", e.g. "(base * 2)".`);return r})(t.generated,e):void 0;return{name:e,type:r,unique:i,notnull:a,generated:o}}),R=i.hold(c(r,p)),g=(()=>i.available?t??=i.tryWithLock(`bsq:sweep:${r}`,async()=>{var e;let t,a=(await n("SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '__bsq_staging_%'")).map(e=>e.name).filter(e=>"string"==typeof e);if(a.length)for(let o of(e=await i.heldNames(),t=new Set(e),a.filter(e=>!t.has(c(r,e)))))await s(`DROP TABLE IF EXISTS ${S(o)}`)}).then(()=>void 0).catch(()=>{}):(void 0===t&&(t=Promise.resolve(),o.warn("navigator.locks is unavailable; skipping the staging sweep")),t))().then(()=>s(`
2
+ CREATE TABLE ${S(p)}(
3
+ ${y.map(({name:e,type:t,unique:r,notnull:i,generated:a})=>`${S(e)} ${t} ${r?"UNIQUE":""} ${i?"NOT NULL":""} ${a?`GENERATED ALWAYS AS ${a}`:""}`).join(",")}
4
+ )`)).then(()=>void 0),{enqueue:E,close:v}=w(p,Object.keys(a).filter(e=>"object"!=typeof a[e]||!a[e].generated),{signal:f,queueSize:u?.queueSize},g),b=async()=>{(await R)()},O=()=>Promise.race([s(`DROP TABLE IF EXISTS ${S(p)}`),new Promise(e=>setTimeout(e,5e3))]).catch(()=>{});return{enqueue:e=>E(e),close:async()=>{try{let t;try{await g,t=await v()}catch(e){throw await O(),await b(),e}try{await l(async t=>{for(let r of(await t.write(`DROP TABLE IF EXISTS ${S(e)}`),await t.write(`ALTER TABLE ${S(p)} RENAME TO ${S(e)}`),((e,t)=>{let r=[];for(let i of t?.indexes??[]){let t=Array.isArray(i)?i:"object"==typeof i?"column"in i?[i.column]:i.columns:[i],a=!Array.isArray(i)&&"object"==typeof i&&!!i.unique;if(!t?.length)continue;let o=t.map(String);r.push(`CREATE${a?" UNIQUE":""} INDEX IF NOT EXISTS ${S(`${e}_${o.join("_")}_${a?"U":"IDX"}`)} ON ${S(e)}(${o.map(S).join(",")})`)}return r})(e,u)))await t.write(r)})}catch(e){throw await O(),e}finally{await b()}return t}finally{m()}}}}}}})({file:el,locks:g(),logger:eP}),tr=(es={scheduler:{...eN,acquire:e1},afterWrite:eJ,onPoisoned:(e,t)=>tw(e,t),closeSignal:eQ.signal,bulkFor:tt,logger:eP},async(e,t)=>{let r,{readOnly:i=!1,autoCommit:a=!0}=t??{},{signal:o,release:n}=T(t,"transaction"),{signal:s,release:l}=O(o,es.closeSignal),u=new AbortController,{signal:c,release:h}=O(s,u.signal),w=c??u.signal,f=()=>{r??={kind:"died",cause:w?.reason}};w?.addEventListener("abort",f,{once:!0});let m=e=>new d("TRANSACTION_CLOSED","died"===e.kind?"This transaction was abandoned; nothing more can run in it.":`This transaction has already ${"committed"===e.kind?"committed":"rolled back"}; nothing more can run in it.`,"died"===e.kind?{cause:e.cause}:void 0),p=e=>{r||u.abort(e)};try{let t,o,n,s=await es.scheduler.acquire(i?"read":"write",w),l=s.worker,u=e=>{if(i&&!b(e))throw new d("READ_ONLY_TRANSACTION","Cannot write in a read-only transaction.");return e},c=!1,y=!1,R=async()=>{await ee(E(!1),"COMMIT"),c=!0,r={kind:"committed"}},g=async()=>{t=void 0,await ee(l,"ROLLBACK"),c=!0,r??={kind:"rolled-back"}},E=(e,r)=>{let i=Object.create(l);return i.query=(i,a,o)=>l.query(i,a,{...o,savepoint:()=>{r&&(r.posted=!0);let i=t;if(t=e?"release":void 0,i||e)return{...i?{conclude:i}:{},...e?{open:!0}:{}}}}),i},v=async(e,t)=>{t?.throwIfAborted();let{aborted:i,teardown:a}=K(t);try{await (i?Promise.race([e,i]):e)}finally{a()}if(r)throw m(r)},I=async e=>{let t=o;t&&await v(t,e)},S=async(e,t)=>{let r=setTimeout(()=>{es.logger.always.warn("A statement has waited several seconds for its turn on this transaction's connection. Statements in a transaction share one connection and run one at a time, in issue order. A wait that never ends is usually a chunk() or stream() generator left open — exhaust it, break out of it, or call its return().")},5e3);try{await v(e,t)}finally{clearTimeout(r)}},A=(e,r)=>{t="undo";let i=e.then(()=>({failed:!1,error:void 0}),e=>({failed:!0,error:e})).then(async({failed:e,error:t})=>{await l.quiesce(),N(e,t,r)}).catch(()=>{}).finally(()=>{o===i&&(o=void 0)});o=i},C=async e=>{for(;;)if((await e.next()).done)return},N=(e,t,i)=>{y&&!r&&!1===l.inTransaction&&p(e?t:new d("TRANSACTION_CLOSED",`The connection left the transaction after ${i}().`))},_=(e,t,r,i=!0)=>{var a;let s=T(e,t),d=s.signal?.aborted===!0,u=O(w,s.signal),c=()=>{u.release(),s.release()},h=(a=s.signal,void 0!==a&&!d&&!b(r)&&!/^\s*(SAVEPOINT|RELEASE|ROLLBACK|BEGIN|COMMIT|END)\b/i.test(r)),f={posted:!1},m={...e,signal:u.signal},p=h?{...e,signal:w}:m,y=async e=>{let r,a=i?n:void 0,d=Promise.withResolvers();i&&(n=d.promise);let u=!1,w=!1;try{if(a&&await S(a,m.signal),o&&await I(m.signal),!h)return await e(E(!1,f),m);s.signal?.throwIfAborted();let r=e(E(!0,f),p),{aborted:i,teardown:n}=K(s.signal);try{return await (i?Promise.race([r,i]):r)}catch(e){throw f.posted&&s.signal?.aborted===!0&&e===s.signal.reason&&(w=!0,A(r,t)),e}finally{n()}}catch(e){throw u=!0,r=e,e}finally{c();try{f.posted&&!w&&(await l.quiesce(),N(u,r,t))}finally{n===d.promise&&(n=void 0),d.resolve(a)}}};return{options:m,driving:p,release:c,settled:y,own:s.signal,abortedAtCall:d,savepointed:h,mark:f}},P=new Set,$=(e,t,i,a)=>{let s=async function*(){let s;if(r)throw P.delete(t),i.release(),m(r);let d=n,u=Promise.withResolvers();n=u.promise;let c=!1,h=!1;try{d&&await S(d,i.options.signal),o&&await I(i.options.signal);let t=()=>{n===u.promise&&(n=void 0),u.resolve(d)},r=!1,s=()=>{r||(r=!0,l.free().then(t,t))};if(!i.savepointed){try{for await(let t of e)s(),yield t}finally{await e.return(void 0)}return}i.own?.throwIfAborted();let{aborted:c,teardown:w}=K(i.own);try{for(;;){let t=c?await Promise.race([e.next(),c]):await e.next();if(t.done)return;s(),yield t.value}}catch(t){throw i.mark.posted&&i.own?.aborted===!0&&t===i.own.reason&&(h=!0,A(C(e),a)),t}finally{w(),h||await e.return(void 0)}}catch(e){throw c=!0,s=e,e}finally{P.delete(t),i.release();try{i.mark.posted&&!h&&(await l.quiesce(),N(c,s,a))}finally{n===u.promise&&(n=void 0),u.resolve(d)}}}();return t.gen=s,P.add(t),s},L=async()=>{for(let{gen:e,transport:t}of[...P])try{t&&l.interrupt(t),await e?.return(void 0)}catch{}await l.quiesce()},k=e=>()=>{throw new d("READ_ONLY_TRANSACTION",`${e}() writes, and this transaction is read-only.`)},D=i?{bulkWrite:k("bulkWrite"),output:k("output")}:es.bulkFor({read:(e,t,i)=>{if(r)return Promise.reject(m(r));let a=u(e),{settled:o}=_(i,"read",a);return o((e,r)=>X(e,a,t,r))},write:(e,t,i)=>{if(r)return Promise.reject(m(r));let a=u(e),{settled:o}=_(i,"write",a,!1);return o((e,r)=>Z(e,a,t,r))},reserve:()=>{let e=n,t=Promise.withResolvers();return n=t.promise,{started:e??Promise.resolve(),done:()=>{n===t.promise&&(n=void 0),t.resolve(e)}}},transaction:e=>e(q)}),q={read:(e,t,i)=>{if(r)return Promise.reject(m(r));let a=u(e),{settled:o}=_(i,"read",a);return o((e,r)=>X(e,a,t,r))},write:(e,t,i)=>{if(r)return Promise.reject(m(r));let a=u(e),{settled:o}=_(i,"write",a);return o((e,r)=>Z(e,a,t,r))},chunk:(e,t,r)=>{let i=u(e),a=_(r,"chunk",i),o={},n=Y(E(a.savepointed,a.mark),i,t,{...a.savepointed?a.driving:a.options,onAbandon:a.release,onTransport:e=>{o.transport=e}});return $(n,o,a,"chunk")},stream:(e,t,r)=>{let i=u(e),a=_(r,"stream",i),o={},n=G(E(a.savepointed,a.mark),i,t,{...a.savepointed?a.driving:a.options,onAbandon:a.release,onTransport:e=>{o.transport=e}});return $(n,o,a,"stream")},first:(e,t,i)=>{if(r)return Promise.reject(m(r));let a=u(e),{settled:o}=_(i,"first",a);return o((e,r)=>J(e,a,t,r))},bulkWrite:(...e)=>{if(r)throw m(r);return D.bulkWrite(...e)},output:(...e)=>{if(r)throw m(r);return D.output(...e)},commit:async()=>{if(r){if("committed"===r.kind)return;throw m(r)}let e=n,t=Promise.withResolvers();n=t.promise;try{e&&await S(e,w),o&&await I(w),await R()}finally{n===t.promise&&(n=void 0),t.resolve(e)}},rollback:async()=>{if(r){"committed"===r.kind&&es.logger.always.warn("rollback() was called on a transaction that has already committed; nothing was rolled back.");return}let e=n,t=Promise.withResolvers();n=t.promise;try{e&&await S(e,w),o&&await I(w),await g()}finally{n===t.promise&&(n=void 0),t.resolve(e)}},signal:w},{aborted:x,teardown:W}=K(w);try{w?.throwIfAborted(),await ee(E(!1),i?"BEGIN":"BEGIN IMMEDIATE"),y=!0,w?.throwIfAborted();let t=e(q);t.catch(()=>{});let r=x?await Promise.race([t,x]):await t;return await L(),c||(w?.throwIfAborted(),o&&await I(w),a?await R():await g()),r}catch(e){if(p(e),await L(),y&&!c&&!1!==l.inTransaction)try{await g()}catch{es.onPoisoned(l.index,new d("WORKER_CRASHED",`Worker ${l.index+1} may hold an open transaction after a failed rollback.`,{cause:e}))}throw e}finally{r??={kind:"rolled-back"},h(),w?.removeEventListener("abort",f),W(),i||await es.afterWrite(l),s.worker.quiesce().then(()=>s.release(),()=>s.release())}}finally{w?.removeEventListener("abort",f),h(),l(),n()}}),{bulkWrite:ti,output:ta}=tt({read:e8,write:e9,transaction:tr}),to=async(e,t)=>{let r;try{await Promise.race([e,new Promise(e=>{r=setTimeout(e,t)})])}finally{clearTimeout(r)}},tn=a.openTimeout??3e4,ts=a.drainTimeout??6e4,tl=(e=>{let{size:t,maxWorkerRestarts:r=1}=e,i=Array.from({length:t},()=>({everReady:!1,alive:!0,lost:!1,restarts:0})),a=()=>i.filter(e=>e.alive).length;return{report:(e,t)=>{let o=i[e];if(o){if("spawned"===t){if(o.lost)return;o.alive=!0;return}if("ready"===t){if(o.lost)return;o.everReady=!0,o.alive=!0;return}if("served"===t){if(!o.alive)return;o.restarts=0;return}if("retired"===t){if(!o.alive)return;o.alive=!1,o.lost=!0;return}if("lost"===t){if(!o.alive)return;return o.alive=!1,o.lost=!0,0===a()?"fail-client":"lost"}if(o.alive)return(o.alive=!1,o.everReady&&o.restarts<r)?(o.restarts+=1,"restart"):(o.lost=!0,0===a()?"fail-client":"lost")}}}})({size:em,maxWorkerRestarts:a.maxWorkerRestarts}),td=e=>{for(let t of(eF?.resolve(void 0),D??=e,eN.shutdown(D),ep))t?.terminate(D)},tu=e=>{tl.report(e,"spawned");let t=!1,r=setTimeout(()=>{x(ek,el,eh,ec).then(r=>{!t&&tw(e,new d("TIMEOUT",`Worker ${e+1} did not become ready within ${tn} ms. `+(void 0===r?"The database may be held under an exclusive lock by another tab or another client.":r?"Other clients of this library still hold the database.":"No client of this library holds it — a page reloaded without close(), or a holder outside this library, is the likely cause.")))})},tn);(e=>{let t,r,i,a,o,n,s,l,{index:u,pool:c,clientName:h,file:w,vfs:f,build:m,wasm:p,pragmas:y,statementCacheSize:R,statementCacheBytes:g}=e,{createWorkerDebugState:E,createQueryDebugState:v,logger:b}=e,{abortSlots:O}=e,{declineWithout:T,probeFirst:I}=e,S=Promise.withResolvers(),A=`${h} / Worker ${u+1}`,C=Object.assign(B(A),{index:u,status:"NEW",seen:-1,epochTarget:0});c[u]=C,O&&(new Int32Array(O)[u]=0),b.info(`worker ${u+1} created`);let N=E?.(u,A),_=0,P=[],$=!1,L=!1,k=!1,D=!1,q=Promise.withResolvers();q.promise.catch(e=>{i??=e});let x=e=>!k&&(k=!0,C.status="DEAD",q.reject(e),S.reject(e),a?.resolve(),!0),W=t=>{x(t)&&e.onDeath?.(u,t)};C.onerror=e=>{let t="object"==typeof e&&null!==e&&"message"in e?String(e.message??""):"",r=e.filename;b.error(`worker ${u+1} crashed: ${t}`),W(new d("WORKER_CRASHED",D?`Worker ${u+1} failed: ${t||"uncaught error"}`:`browser-sqlite could not load its worker${r?` from ${r}`:`; the client itself was loaded from ${import.meta.url}, and the worker must be emitted beside it`}. If the worker URL 404s, your bundler did not emit the worker beside your build output — see the "Bundler Configuration" section of the browser-sqlite README. ${t}`,{cause:e}))},C.addEventListener("messageerror",()=>{b.error(`worker ${u+1} sent an undeserializable message`),l?.reject(new d("PROTOCOL_ERROR",`Worker ${u+1} sent a message that could not be deserialized; the request cannot be completed.`))}),C.onmessage=({data:r})=>{let{type:i}=r;switch(i){case"ready":{let{callId:e}=r;0===e&&(D=!0,C.status="READY",N&&(N.initializationTime=Date.now()),b.info(`worker ${u+1} ready`),S.resolve(C));break}case"open-error":{let{callId:e}=r;0===e&&(b.error(`worker ${u+1} failed to open: ${r.message}`),W(V(r)));break}case"declined":0===r.callId&&(b.info(`worker ${u+1} declined: no ${r.missing}`),S.resolve({declined:r.missing}));break;case"probed":0===r.callId&&(b.info(`worker ${u+1} probed: ${r.missing?`no ${r.missing}`:"nothing missing"}`),e.onProbed?.(r.missing,()=>C.postMessage({type:"proceed",callId:0})));break;case"closed":{let{callId:e}=r;0===e&&(b.info(`worker ${u+1} closed`),C.status="CLOSED",a?.resolve());break}case"chunk":{let{callId:e}=r;t&&e===_&&(N?.currentRequest?.currentQuery&&(N.currentRequest.currentQuery.firstRowTime??=Date.now()),P.push(r.data),t.resolve(r.data),t=Promise.withResolvers());break}case"done":{let{callId:i}=r;if(t&&i===_){C.inTransaction=r.inTransaction;let i=r.affected;N?.currentRequest?.currentQuery&&(N.currentRequest.currentQuery.affectedRows=i,N.currentRequest.currentQuery.prepared=r.prepared,N.currentRequest.affectedRows+=i,N.currentRequest.currentQuery.endTime=Date.now()),P.push(i),t.resolve(i),t=void 0,n?.resolve(),L||e.onServed?.(u),L=!1}break}case"error":{let{callId:e}=r;if(t&&e===_){C.inTransaction=r.inTransaction;let e=(e=>{if(e.errorCode)return new d(e.errorCode,e.message,{cause:e.cause});let t=j(e);if(t)return t;if(void 0===e.sqliteCode)return Error(e.message,{cause:e.cause});let r=U(e);return new d("STATEMENT_FAILED",e.message,{cause:e.cause,sqliteCode:e.sqliteCode,...void 0!==r?{sqliteExtendedCode:r}:{}})})(r);N?.currentRequest?.currentQuery&&(N.currentRequest.currentQuery.error=e,N.currentRequest.currentQuery.endTime=Date.now()),t.reject(e),t.promise.catch(()=>{})}break}case"deleted":case"not-found":break;default:throw Error(`Unhandled worker message: ${JSON.stringify(r)}`)}};let F=async function*(a,c,h,w){try{if(t)throw new d("WORKER_BUSY",`Worker ${u+1} already has a query in flight. One worker serves one query at a time; a client statement holds its lease until the worker is idle and a transaction queues its statements, so reaching this means that serialisation was broken. Please report it.`);if(N?.currentRequest){let e=v?.(u,c,h);N.currentRequest.currentQuery=e}let{chunkSize:e=500,credits:f=2,noServed:m=!1,timeout:p,abortable:y,savepoint:R}=w??{};L=m,P=[],$=!1,r=a.gen,k||(i=void 0),t=Promise.withResolvers(),(l=Promise.withResolvers()).promise.catch(e=>{i??=e}),o=Promise.withResolvers(),n=Promise.withResolvers(),s=Promise.withResolvers();let g=R?.();for(C.postMessage({type:"query",callId:++_,sql:c,params:h,options:{chunkSize:e,credits:f,timeout:p,abortable:y,...g?{savepoint:g}:{}}}),C.status="RUNNING";t||P.length>0;){if(0===P.length){let e=t;if(!e||await Promise.race([e.promise,s.promise,l.promise,q.promise])===M)break;continue}if($)break;if(void 0!==i)throw i;let e=P.shift();yield e,"number"!=typeof e&&C.postMessage({type:"credit",callId:_,n:1})}}finally{if(r===a.gen){if(t&&!k){let r;C.status="ABORTING",C.postMessage({type:"stop",callId:_});let i=new Promise((t,i)=>{r=setTimeout(()=>i(new d("WORKER_CRASHED",`Worker ${u+1} did not answer the stop request within ${e.drainTimeout} ms; presumed dead.`)),e.drainTimeout)});try{for(;t;)await Promise.race([t.promise,i])}catch(e){e instanceof d&&"WORKER_CRASHED"===e.code&&W(e)}finally{clearTimeout(r)}}t=void 0,l=void 0,s=void 0,P=[],L=!1,C.status=k?"DEAD":"READY",o?.resolve(),o=void 0,n?.resolve(),n=void 0,r=void 0}}},H=C.terminate.bind(C);return Object.assign(C,{query:(e,t,r)=>{let i={};return i.gen=F(i,e,t,r),i.gen},terminate:e=>{x(e??new d("WORKER_CRASHED",`Worker ${u+1} was terminated.`)),H()},interrupt:e=>{e===r&&($=!0,s?.resolve(M),O&&Atomics.store(new Int32Array(O),u,_))},quiesce:()=>o?.promise??Promise.resolve(),free:()=>n?.promise??Promise.resolve(),close:async()=>{k||(a||(a=Promise.withResolvers(),C.postMessage({type:"close",callId:0})),await a.promise)}}),C.postMessage({callId:0,type:"open",file:w,vfs:f,build:m,wasm:p,pragmas:y,statementCacheSize:R,statementCacheBytes:g,abortSlots:O,abortIndex:O?u:void 0,declineWithout:T,probeFirst:I}),S.promise})({index:e,pool:ep,clientName:eu,file:el,vfs:eh,build:ew,wasm:eE,pragmas:eb,statementCacheSize:32,statementCacheBytes:eS,onDeath:tw,onServed:e=>{tl.report(e,"served")},drainTimeout:ts,createWorkerDebugState:e$?.createWorkerDebugState,createQueryDebugState:e$?.createQueryDebugState,logger:eP,abortSlots:eg,declineWithout:e>0&&ef.singleConnectionWithout.length>0?ef.singleConnectionWithout:void 0,probeFirst:0!==e||void 0===eF||ej?void 0:ef.exclusiveConnectionWithout,onProbed:(e,t)=>{R=t,w?.resolve(e),eV()}}).then(t=>{if("declined"in t){eC.delete(e),th(e,t.declined);return}tl.report(e,"ready"),eC.delete(e),eN.add(t)}).catch(()=>{}).finally(()=>{t=!0,clearTimeout(r)})},tc=(e,t)=>{let r=ep.filter(Boolean).length;eP.always.warn(`worker ${e+1} lost; pool is now ${r} of ${ey} (${t.message})`);let i=a.onWorkerLost;if(i)try{i({index:e,live:r,size:ey,cause:t})}catch(e){eP.always.warn(`onWorkerLost callback threw: ${e instanceof Error?e.message:String(e)}`)}},th=(e,t)=>{if(ep[e]?.terminate(),v||(ep[e]=void 0,ey-=1),tl.report(e,"retired"),eN.retire(e),v||eR)return;eR=!0;let r=`${eh} gains nothing from more than one worker without ${t}: pool capped at 1 of ${em}`;void 0!==a.poolSize?eP.always.warn(r):eP.info(r)},tw=(e,t)=>{let r=eA;if(r&&(o??=t,eC.set(e,t)),ep[e]?.terminate(t),ep[e]=void 0,eN.remove(e),r)return;let i=tl.report(e,"died");"restart"===i?(eP.warn(`restarting worker ${e+1}`),tu(e)):"lost"===i?(tc(e,t),0!==e||eU||td(t)):"fail-client"===i&&(tc(e,t),td(t))},tf=()=>{for(let e=0;e<em;e+=1)tu(e)};return eF&&void 0!==eH&&eH.then(()=>{ex?td(eM()):void 0!==h&&(ej=!0,eV())}),ef.exclusiveConnection&&void 0!==eH?eH.then(()=>{ex?td(eM()):v||tf()}):tf(),{chunk:e4,read:e8,write:e9,stream:e7,first:te,transaction:tr,bulkWrite:ti,output:ta,close:()=>v||(v=(async()=>{eP.info("client closing"),eF?.resolve(void 0);let e=new d("CLIENT_CLOSED","The SQLite client has been closed.");eQ.abort(e);let t=eN.shutdown(e);for(let r of(await to(t,ts),await Promise.all(ep.map(async t=>{t&&(await to(t.close(),ts),t.terminate(e))})),ep.length=0,[...eq]))r();eq.clear(),void 0!==eH&&await eH,h?.(),eK=!0,E?.(),void 0!==h&&await new Promise(e=>setTimeout(e,0))})()),get id(){return ec},get name(){return eu},get file(){return el},get vfs(){return eh},get build(){return ew},get poolSize(){return ey},inspect:async()=>{if(v)throw new d("CLIENT_CLOSED","The SQLite client has been closed.");let{clients:e,...t}=await q(ek,el,eh,ez);return{...t,self:e.find(e=>e.id===ec)??null,siblings:e.filter(e=>e.id!==ec)}},debug:eL}},ea=async(e,t)=>{if(!t?.vfs)throw new d("INVALID_OPTION","vfs is required. Pass the VFS the database was created with — VFS.md compares them. Four VFS share one underlying file: passing the wrong one deletes a real database without reporting anything.");let a=t.vfs,o=t.build??i(a),n=r[a];if(!n.builds.includes(o))throw new d("INVALID_OPTION",`${a} cannot run on the '${o}' build. Supported: ${n.builds.join(", ")}.`);if("memory"===n.layout)return;let s=P(e),l=$(t.wasmUrl,o,location.href),u=g(),c=await u.hold(y(a,s),{mode:"exclusive",ifAvailable:!0});if(void 0===c)throw new d("DATABASE_IN_USE",`${s} is open. Close every client on it, in this tab and in any other, then delete it.`);try{if(!await u.tryWithLock(`bsq:init:${f(a)}:${s}`,()=>eo({file:s,vfs:a,build:o,wasm:l})))throw new d("BUSY",`${s} is being opened or deleted elsewhere. Try again in a moment.`)}finally{c(),await new Promise(e=>setTimeout(e,0))}},eo=e=>new Promise((t,r)=>{let i=B(`SQLite delete / ${e.file}`),a=setTimeout(()=>{o(new d("TIMEOUT",`deleting ${e.file} timed out after 30000 ms. The database is most likely held open by another client or tab.`))},3e4),o=e=>{clearTimeout(a),i.terminate(),e?r(e):t()};i.onmessage=t=>{let r=t.data;return"deleted"===r.type?o():"not-found"===r.type?o(new d("DATABASE_NOT_FOUND",`There is no database named '${e.file}' for ${e.vfs} to delete.`)):"error"===r.type?o(V(r)):void 0},i.onerror=t=>{o(new d("WORKER_CRASHED",`worker crashed while deleting ${e.file}: ${t.message??""}`))},i.postMessage({type:"delete",callId:0,...e})}),en=Object.freeze({OK:0,ERROR:1,INTERNAL:2,PERM:3,ABORT:4,BUSY:5,LOCKED:6,NOMEM:7,READONLY:8,INTERRUPT:9,IOERR:10,CORRUPT:11,NOTFOUND:12,FULL:13,CANTOPEN:14,PROTOCOL:15,EMPTY:16,SCHEMA:17,TOOBIG:18,CONSTRAINT:19,MISMATCH:20,MISUSE:21,NOLFS:22,AUTH:23,FORMAT:24,RANGE:25,NOTADB:26,NOTICE:27,WARNING:28,ROW:100,DONE:101}),es=Object.freeze({ERROR_MISSING_COLLSEQ:257,ERROR_RETRY:513,ERROR_SNAPSHOT:769,ERROR_RESERVESIZE:1025,ERROR_KEY:1281,ERROR_UNABLE:1537,IOERR_READ:266,IOERR_SHORT_READ:522,IOERR_WRITE:778,IOERR_FSYNC:1034,IOERR_DIR_FSYNC:1290,IOERR_TRUNCATE:1546,IOERR_FSTAT:1802,IOERR_UNLOCK:2058,IOERR_RDLOCK:2314,IOERR_DELETE:2570,IOERR_BLOCKED:2826,IOERR_NOMEM:3082,IOERR_ACCESS:3338,IOERR_CHECKRESERVEDLOCK:3594,IOERR_LOCK:3850,IOERR_CLOSE:4106,IOERR_DIR_CLOSE:4362,IOERR_SHMOPEN:4618,IOERR_SHMSIZE:4874,IOERR_SHMLOCK:5130,IOERR_SHMMAP:5386,IOERR_SEEK:5642,IOERR_DELETE_NOENT:5898,IOERR_MMAP:6154,IOERR_GETTEMPPATH:6410,IOERR_CONVPATH:6666,IOERR_VNODE:6922,IOERR_AUTH:7178,IOERR_BEGIN_ATOMIC:7434,IOERR_COMMIT_ATOMIC:7690,IOERR_ROLLBACK_ATOMIC:7946,IOERR_DATA:8202,IOERR_CORRUPTFS:8458,IOERR_IN_PAGE:8714,IOERR_BADKEY:8970,IOERR_CODEC:9226,LOCKED_SHAREDCACHE:262,LOCKED_VTAB:518,BUSY_RECOVERY:261,BUSY_SNAPSHOT:517,BUSY_TIMEOUT:773,CANTOPEN_NOTEMPDIR:270,CANTOPEN_ISDIR:526,CANTOPEN_FULLPATH:782,CANTOPEN_CONVPATH:1038,CANTOPEN_DIRTYWAL:1294,CANTOPEN_SYMLINK:1550,CORRUPT_VTAB:267,CORRUPT_SEQUENCE:523,CORRUPT_INDEX:779,READONLY_RECOVERY:264,READONLY_CANTLOCK:520,READONLY_ROLLBACK:776,READONLY_DBMOVED:1032,READONLY_CANTINIT:1288,READONLY_DIRECTORY:1544,ABORT_ROLLBACK:516,CONSTRAINT_CHECK:275,CONSTRAINT_COMMITHOOK:531,CONSTRAINT_FOREIGNKEY:787,CONSTRAINT_FUNCTION:1043,CONSTRAINT_NOTNULL:1299,CONSTRAINT_PRIMARYKEY:1555,CONSTRAINT_TRIGGER:1811,CONSTRAINT_UNIQUE:2067,CONSTRAINT_VTAB:2323,CONSTRAINT_ROWID:2579,CONSTRAINT_PINNED:2835,CONSTRAINT_DATATYPE:3091,NOTICE_RECOVER_WAL:283,NOTICE_RECOVER_ROLLBACK:539,NOTICE_RBU:795,WARNING_AUTOINDEX:284,AUTH_USER:279,OK_LOAD_PERMANENTLY:256,OK_SYMLINK:512});export{en as SQLITE_CODES,es as SQLITE_EXTENDED_CODES,u as SQLiteBulkWriteError,d as SQLiteError,r as VFS_CAPABILITIES,ei as createSQLiteClient,i as defaultBuildFor,ea as deleteDatabase,s as detectFeatures,W as inspectDatabase,l as missingFeature};
5
+ //# sourceMappingURL=index.js.map