@moyodb/sdk 0.0.0-alpha.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +10 -2
  3. package/dist/assets/worker-R2dy1Ju5.js +4 -0
  4. package/dist/assets/worker-R2dy1Ju5.js.map +1 -0
  5. package/dist/change-events.d.ts.map +1 -1
  6. package/dist/codec.d.ts.map +1 -1
  7. package/dist/compression.d.ts.map +1 -1
  8. package/dist/engine/README.md +20 -4
  9. package/dist/engine/moyodb_engine.d.ts +115 -54
  10. package/dist/engine/moyodb_engine.js +885 -391
  11. package/dist/engine/moyodb_engine_bg.wasm +0 -0
  12. package/dist/engine/moyodb_engine_bg.wasm.d.ts +55 -47
  13. package/dist/engine/package.json +3 -3
  14. package/dist/engine/snippets/moyodb-engine-8ebe6af0cc2e81b7/js/opfs_shim.js +513 -0
  15. package/dist/engine/snippets/moyodb-engine-cff0a0e2441a7a8f/js/opfs_shim.js +192 -81
  16. package/dist/errors.d.ts +8 -0
  17. package/dist/errors.d.ts.map +1 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/indexing.d.ts.map +1 -1
  20. package/dist/moyodb-sdk.js +1853 -1985
  21. package/dist/moyodb-sdk.js.map +1 -1
  22. package/dist/registry.d.ts +2 -1
  23. package/dist/registry.d.ts.map +1 -1
  24. package/dist/subscriptions.d.ts.map +1 -1
  25. package/dist/types.d.ts +29 -1
  26. package/dist/types.d.ts.map +1 -1
  27. package/dist/worker-api.d.ts +51 -37
  28. package/dist/worker-api.d.ts.map +1 -1
  29. package/dist/worker-client.d.ts +5 -2
  30. package/dist/worker-client.d.ts.map +1 -1
  31. package/dist/worker-protocol.d.ts +14 -3
  32. package/dist/worker-protocol.d.ts.map +1 -1
  33. package/dist/worker-server.d.ts.map +1 -1
  34. package/package.json +74 -72
  35. package/dist/assets/worker-CaOzbBz1.js +0 -2351
  36. package/dist/assets/worker-CaOzbBz1.js.map +0 -1
  37. package/dist/moyodb-sdk.umd.cjs +0 -2
  38. package/dist/moyodb-sdk.umd.cjs.map +0 -1
@@ -1,2 +0,0 @@
1
- (function(i,R){typeof exports=="object"&&typeof module<"u"?R(exports):typeof define=="function"&&define.amd?define(["exports"],R):(i=typeof globalThis<"u"?globalThis:i||self,R(i.MoyoDB={}))})(this,(function(i){"use strict";var R=typeof document<"u"?document.currentScript:null;function M(t){return t!==null&&typeof t=="object"}function D(t,e){return t<e?-1:t>e?1:0}function j(t,e,r){return new Promise(n=>{const o=setTimeout(()=>n(r),e);t.then(s=>{clearTimeout(o),n(s)},()=>{clearTimeout(o),n(r)})})}const H=1,et="moyodb:worker-protocol:ready",tt="moyodb:worker-protocol:request",rt="moyodb:worker-protocol:response",nt=["open","close","destroy","deleteDB","begin","commit","rollback","createStore","dropStore","clearStore","get","getMany","has","put","putMany","delete","deleteMany","applyBatch","scan","getByIndex","scanByIndex","getIndexes","reconcileIndexes","listStores","getVersion","changesSince","setSchemaVersion","exportSnapshot","importSnapshot","reset","compact","rebuild","stats","storageInfo","requestPersistence","setFailpoint"],de="moyodb:packed-binary-list:v1",ot="moyodb:packed-nullable-binary-list:v1",st="moyodb:packed-scan-rows:v1",it="moyodb:packed-batch-ops:v1",at=0,ct=1,P=4294967295,ut=[];new Set(nt);function dt(t){return M(t)&&t.type===et&&t.version===H}function lt(t){return M(t)&&t.type===rt&&t.version===H&&typeof t.id=="number"&&Number.isSafeInteger(t.id)&&typeof t.ok=="boolean"}function ft(t){const e=new Error(t.message);return e.name=t.name||t.code||"Error",t.stack&&(e.stack=t.stack),t.code&&Object.defineProperty(e,"code",{value:t.code,enumerable:!0,configurable:!0}),e}function p(t,e,r=t){const n=new Error(e);return n.name=t,Object.defineProperty(n,"code",{value:r,enumerable:!0,configurable:!0}),n}function ht(t,e){if(t==="importSnapshot"){const r=e[0];if(r instanceof Uint8Array){const n=St(r);return{args:[n],transfer:[n.buffer]}}}if(t==="getMany"||t==="deleteMany"){const[r,n,o]=e;if(Array.isArray(o)&&o.length>0){const s=bt(o);return{args:[r,n,s],transfer:[s.bytes.buffer]}}}if(t==="putMany"){const[r,n,o,s]=e;if(Array.isArray(o)&&o.length>0){const a=pt(o);return{args:[r,n,a,s],transfer:[a.bytes.buffer]}}}if(t==="applyBatch"){const[r,n,o]=e;if(Array.isArray(o)&&o.length>0){const s=wt(o);return{args:[r,n,s],transfer:[s.bytes.buffer]}}}return{args:e,transfer:ut}}function yt(t,e){return t==="getMany"&&Et(e)?mt(e):(t==="scan"||t==="scanByIndex")&&kt(e)?gt(e):e}function pt(t){const e=t.length,r=A(e*2,"packed putMany item count"),n=C(r,4,"packed putMany metadata");let o=0;for(let u=0;u<e;u+=1){const h=t[u],w=h[0],v=h[1];if(!(w instanceof Uint8Array)||!(v instanceof Uint8Array))throw p("WorkerProtocolError","putMany entry key/value is not a Uint8Array");const K=A(w.byteLength,"putMany key length"),V=A(v.byteLength,"putMany value length");if(o+=K+V,o>P)throw p("WorkerProtocolError","packed putMany payload exceeds 32-bit payload limit")}const s=T(4,n,"packed putMany header"),a=T(s,o,"packed putMany total"),f=new Uint8Array(a),d=new DataView(f.buffer);d.setUint32(0,r,!0);let l=4,c=s;for(let u=0;u<e;u+=1){const h=t[u],w=h[0],v=h[1],K=w.byteLength,V=v.byteLength;d.setUint32(l,K,!0),l+=4,d.setUint32(l,V,!0),l+=4,f.set(w,c),c+=K,f.set(v,c),c+=V}return{__moyodbPacked:de,bytes:f}}function bt(t){const e=t.length,r=C(e,4,"packed binary-list metadata");let n=0;for(let c=0;c<e;c+=1){const u=t[c];if(!(u instanceof Uint8Array))throw p("WorkerProtocolError","binary-list payload item is not a Uint8Array");const h=A(u.byteLength,"binary-list item length");if(n+=h,n>P)throw p("WorkerProtocolError","packed binary-list payload exceeds 32-bit payload limit")}const o=T(4,r,"packed binary-list header"),s=T(o,n,"packed binary-list total"),a=new Uint8Array(s),f=new DataView(a.buffer);f.setUint32(0,e,!0);let d=4,l=o;for(let c=0;c<e;c+=1){const u=t[c],h=u.byteLength;f.setUint32(d,h,!0),d+=4,a.set(u,l),l+=h}return{__moyodbPacked:de,bytes:a}}function mt(t){const e=t.bytes;if(!(e instanceof Uint8Array)||e.byteLength<4)throw p("WorkerProtocolError","invalid packed nullable binary-list payload");const r=new DataView(e.buffer,e.byteOffset,e.byteLength),n=r.getUint32(0,!0),o=C(n,5,"packed nullable binary-list metadata"),s=T(4,o,"packed nullable binary-list header");if(s>e.byteLength)throw p("WorkerProtocolError","packed nullable binary-list metadata exceeds payload length");const a=new Array(n);let f=4,d=s;for(let l=0;l<n;l+=1){const c=r.getUint8(f),u=r.getUint32(f+1,!0);if(f+=5,c===0){if(u!==0)throw p("WorkerProtocolError","packed nullable binary-list null item has a payload length");a[l]=null;continue}if(c!==1)throw p("WorkerProtocolError",`packed nullable binary-list item has invalid presence byte: ${c}`);const h=d+u;if(h>P||h>e.byteLength)throw p("WorkerProtocolError","packed nullable binary-list item exceeds payload length");a[l]=e.subarray(d,h),d=h}if(d!==e.byteLength)throw p("WorkerProtocolError","packed nullable binary-list payload has trailing bytes");return a}function gt(t){const e=t.bytes;if(!(e instanceof Uint8Array)||e.byteLength<4)throw p("WorkerProtocolError","invalid packed scan row payload");const r=new DataView(e.buffer,e.byteOffset,e.byteLength),n=r.getUint32(0,!0),o=C(n,8,"packed scan row metadata"),s=T(4,o,"packed scan row header");if(s>e.byteLength)throw p("WorkerProtocolError","packed scan row metadata exceeds payload length");const a=new Array(n);let f=4,d=s;for(let l=0;l<n;l+=1){const c=r.getUint32(f,!0),u=r.getUint32(f+4,!0);f+=8;const h=d+c;if(h>P||h>e.byteLength)throw p("WorkerProtocolError","packed scan row key exceeds payload length");const w=h+u;if(w>P||w>e.byteLength)throw p("WorkerProtocolError","packed scan row value exceeds payload length");a[l]={key:e.subarray(d,h),value:e.subarray(h,w)},d=w}if(d!==e.byteLength)throw p("WorkerProtocolError","packed scan row payload has trailing bytes");return a}function wt(t){const e=t.length,r=C(e,9,"packed batch metadata");let n=0;for(let c=0;c<e;c+=1){const u=t[c];if(u.kind!=="put"&&u.kind!=="delete")throw p("WorkerProtocolError",`unknown batch operation kind: ${String(u.kind)}`);if(!(u.key instanceof Uint8Array))throw p("WorkerProtocolError","batch operation key is not a Uint8Array");const h=A(u.key.byteLength,"batch operation key length");if(n+=h,n>P)throw p("WorkerProtocolError","packed batch payload exceeds 32-bit payload limit");if(u.kind==="put"){if(!(u.value instanceof Uint8Array))throw p("WorkerProtocolError","batch put value is not a Uint8Array");const w=A(u.value.byteLength,"batch put value length");if(n+=w,n>P)throw p("WorkerProtocolError","packed batch payload exceeds 32-bit payload limit")}}const o=T(4,r,"packed batch header"),s=T(o,n,"packed batch total"),a=new Uint8Array(s),f=new DataView(a.buffer);f.setUint32(0,e,!0);let d=4,l=o;for(let c=0;c<e;c+=1){const u=t[c],h=u.key,w=h.byteLength,v=u.kind==="put"?u.value.byteLength:0;f.setUint8(d,u.kind==="put"?ct:at),f.setUint32(d+1,w,!0),f.setUint32(d+5,v,!0),d+=9,a.set(h,l),l+=w,u.kind==="put"&&(a.set(u.value,l),l+=v)}return{__moyodbPacked:it,bytes:a}}function Et(t){return M(t)&&t.__moyodbPacked===ot&&t.bytes instanceof Uint8Array}function kt(t){return M(t)&&t.__moyodbPacked===st&&t.bytes instanceof Uint8Array}function C(t,e,r){if(!Number.isSafeInteger(t)||t<0)throw p("WorkerProtocolError",`${r} count is invalid: ${t}`);return A(t*e,r)}function T(t,e,r){const n=t+e;return A(n,r)}function A(t,e){if(!Number.isSafeInteger(t)||t<0||t>P)throw p("WorkerProtocolError",`${e} exceeds 32-bit payload limit`);return t}function St(t){const e=new Uint8Array(t.byteLength);return e.set(t),e}function Y(t){t.timeout&&clearTimeout(t.timeout)}class xt{constructor(e,r={}){this.worker=e,this.requestTimeoutMs=r.requestTimeoutMs??0,this.ready=new Promise((n,o)=>{this.readyResolve=n,this.readyReject=o}),this.worker.addEventListener("message",this.handleMessage),this.worker.addEventListener("messageerror",this.handleMessageError),this.worker.addEventListener("error",this.handleError)}worker;nextRequestId=1;pending=new Map;closed=!1;readyResolved=!1;readyResolve=null;readyReject=null;ready;requestTimeoutMs;fatalHandler=null;closeReason=null;setFatalHandler(e){this.fatalHandler=e}whenReady(){return this.ready}dispose(e=p("WorkerTerminatedError","worker transport was closed")){this.disposeInternal(e,!1)}open(e){return this.request("open",[e])}close(){return this.request("close",[])}destroy(){return this.request("destroy",[])}deleteDB(e){return this.request("deleteDB",[e])}begin(e){return this.request("begin",[e])}commit(e){return this.request("commit",[e])}rollback(e){return this.request("rollback",[e])}createStore(e,r,n){return this.request("createStore",[e,r,n])}dropStore(e,r){return this.request("dropStore",[e,r])}clearStore(e,r){return this.request("clearStore",[e,r])}get(e,r,n){return this.request("get",[e,r,n])}getMany(e,r,n){return this.request("getMany",[e,r,n])}has(e,r,n){return this.request("has",[e,r,n])}put(e,r,n,o,s){return this.request("put",[e,r,n,o,s])}putMany(e,r,n,o){return this.request("putMany",[e,r,n,o])}delete(e,r,n){return this.request("delete",[e,r,n])}deleteMany(e,r,n){return this.request("deleteMany",[e,r,n])}applyBatch(e,r,n){return this.request("applyBatch",[e,r,n])}scan(e,r,n){return this.request("scan",[e,r,n])}getByIndex(e,r,n,o){return this.request("getByIndex",[e,r,n,o])}scanByIndex(e,r,n,o){return this.request("scanByIndex",[e,r,n,o])}getIndexes(){return this.request("getIndexes",[])}reconcileIndexes(e,r){return this.request("reconcileIndexes",[e,r])}listStores(){return this.request("listStores",[])}getVersion(){return this.request("getVersion",[])}changesSince(e,r){return this.request("changesSince",[e,r])}setSchemaVersion(e,r){return this.request("setSchemaVersion",[e,r])}exportSnapshot(e){return this.request("exportSnapshot",[e])}importSnapshot(e){return this.request("importSnapshot",[e])}reset(){return this.request("reset",[])}compact(){return this.request("compact",[])}rebuild(){return this.request("rebuild",[])}stats(){return this.request("stats",[])}storageInfo(){return this.request("storageInfo",[])}requestPersistence(){return this.request("requestPersistence",[])}setFailpoint(e){return this.request("setFailpoint",[e])}async request(e,r){this.ensureOpen(),await this.ready,this.ensureOpen();const n=this.nextRequestId;this.nextRequestId+=1;const o=ht(e,r),s={type:tt,version:H,id:n,command:e,args:o.args};return await new Promise((a,f)=>{const d=this.requestTimeoutMs>0?setTimeout(()=>{this.pending.delete(n),f(p("WorkerRequestTimeoutError",`worker command ${e} timed out after ${this.requestTimeoutMs}ms`))},this.requestTimeoutMs):null;this.pending.set(n,{command:e,resolve:l=>a(l),reject:f,timeout:d});try{o.transfer.length>0?this.worker.postMessage(s,o.transfer):this.worker.postMessage(s)}catch(l){this.rejectPending(n,l instanceof Error?l:new Error(String(l)))}})}ensureOpen(){if(this.closed)throw this.closeReason??p("WorkerTerminatedError","worker transport is closed")}handleMessage=e=>{const r=e.data;if(dt(r)){this.readyResolved=!0,this.readyResolve?.(),this.readyResolve=null,this.readyReject=null;return}if(!lt(r))return;const n=this.pending.get(r.id);if(n){if(this.pending.delete(r.id),Y(n),r.ok){n.resolve(yt(n.command,r.result));return}n.reject(ft(r.error))}};handleMessageError=()=>{this.disposeInternal(p("WorkerMessageError","worker message could not be deserialized"),!0)};handleError=e=>{const r=e.error instanceof Error?e.error:p("WorkerError",e.message||"worker runtime failed");this.disposeInternal(r,!0)};rejectPending(e,r){const n=this.pending.get(e);n&&(this.pending.delete(e),Y(n),n.reject(r))}disposeInternal(e,r){if(!this.closed){this.closed=!0,this.closeReason=e,this.worker.removeEventListener("message",this.handleMessage),this.worker.removeEventListener("messageerror",this.handleMessageError),this.worker.removeEventListener("error",this.handleError),this.readyResolved||this.readyReject?.(e),this.readyResolve=null,this.readyReject=null;for(const n of this.pending.values())Y(n),n.reject(e);this.pending.clear(),r&&this.fatalHandler?.(e)}}}class b extends Error{constructor(e,r){super(r),this.name=e,Object.setPrototypeOf(this,new.target.prototype)}}class O extends b{constructor(e){super("UnsupportedPlatformError",e)}}class J extends b{constructor(e){super("DatabaseBusyError",e)}}class le extends b{constructor(e){super("CorruptionError",e)}}class fe extends b{constructor(e){super("StoreExistsError",e)}}class he extends b{constructor(e){super("StoreNotFoundError",e)}}class ye extends b{constructor(e){super("IndexNotFoundError",e)}}class G extends b{constructor(e){super("ConstraintError",e)}}class pe extends G{constructor(e){super(e),this.name="UniqueIndexConstraintError"}}class be extends b{constructor(e="write transaction already open"){super("WriteTransactionAlreadyOpenError",e)}}class me extends b{constructor(e="readonly transaction cannot perform this operation"){super("ReadonlyTransactionError",e)}}class L extends b{constructor(e="transaction is already closed"){super("TransactionClosedError",e)}}class q extends b{constructor(e="database handle is closed"){super("DatabaseClosedError",e)}}class ge extends b{constructor(e){super("ValueTooLargeError",e)}}class we extends b{constructor(e){super("KeyTooLargeError",e)}}class Ee extends b{constructor(e){super("StoreNameTooLongError",e)}}class X extends b{constructor(e){super("ReservedStoreNameError",e)}}class ke extends b{constructor(e){super("InvalidRangeError",e)}}class Se extends b{constructor(e){super("StorageError",e)}}class _ extends b{constructor(e){super("SerializationError",e)}}class xe extends b{constructor(e){super("InjectedFailureError",e)}}class Ie extends b{constructor(e){super("ChangeFeedCompactedError",e)}}class Pe extends b{constructor(e){super("InternalError",e)}}class m extends b{constructor(e){super("InvalidOpenOptionsError",e)}}class B extends b{constructor(e){super("VersionError",e)}}const It={UnsupportedPlatformError:O,DatabaseBusyError:J,CorruptionError:le,StoreExistsError:fe,StoreNotFoundError:he,IndexNotFoundError:ye,ConstraintError:G,UniqueIndexConstraintError:pe,WriteTransactionAlreadyOpenError:be,ReadonlyTransactionError:me,TransactionClosedError:L,DatabaseClosedError:q,ValueTooLargeError:ge,KeyTooLargeError:we,StoreNameTooLongError:Ee,ReservedStoreNameError:X,InvalidRangeError:ke,StorageError:Se,SerializationError:_,InjectedFailureError:xe,ChangeFeedCompactedError:Ie,InternalError:Pe,InvalidOpenOptionsError:m,VersionError:B};function Te(t,e){const r=It[t];if(r)return new r(e);const n=new Error(e);return n.name=t,n}function S(t){if(t instanceof b)return t;if(t instanceof Error)return t.name==="Error"?t:Te(t.name,t.message);const e=t,r=e?.code??e?.name??"Error",n=e?.message??String(t);return Te(r,n)}const Ae=new Set(["after_wal_flush","after_main_flush","before_superblock_flush"]),Pt="moyodb:persistence-bridge:init",Tt="moyodb:persistence-bridge:request",At="moyodb:persistence-bridge:response",k=new Map;function Ot(t){if(t===null||typeof t!="object"||Array.isArray(t))throw new m("open options must be an object")}function Oe(t,e,r){if(t===void 0)return r;if(typeof t!="boolean")throw new m(`${e} must be a boolean`);return t}function ve(t,e,r){if(t===void 0)return r;if(typeof t!="number"||!Number.isSafeInteger(t)||t<0)throw new m(`${e} must be a non-negative safe integer`);return t}function vt(t){return Math.max(1,ve(t,"cachePages",256))}function Rt(t){if(t==null)return null;if(typeof t!="string"||!Ae.has(t))throw new m(`debugFailpoint must be one of: ${Array.from(Ae).join(", ")}`);return t}function Mt(t={}){return Ot(t),{createIfMissing:Oe(t.createIfMissing,"createIfMissing",!0),ownerWaitMs:ve(t.ownerWaitMs,"ownerWaitMs",0),requestPersistence:Oe(t.requestPersistence,"requestPersistence",!0),cachePages:vt(t.cachePages),debugFailpoint:Rt(t.debugFailpoint)}}function _t(t,e,r){if(e.cachePages!==r.cachePages)throw new m(`database ${t} is already open in this tab with cachePages=${e.cachePages}; requested cachePages=${r.cachePages}`)}async function Ct(){const t=globalThis.navigator?.storage;return typeof t?.persisted!="function"?!1:await j(t.persisted(),1e3,!1)}async function Bt(){const t=globalThis.navigator?.storage;return typeof t?.persist!="function"?!1:await j(t.persist(),1e3,!1)}async function Nt(t,e){const r=e.op==="persist"?await Bt():await Ct(),n={type:At,id:e.id,granted:r};t.postMessage(n)}function Dt(t){const e=new MessageChannel,r=e.port1;return r.addEventListener("message",n=>{const o=n.data;!o||o.type!==Tt||Nt(r,o)}),r.start(),t.postMessage({type:Pt},[e.port2]),{close(){r.close()}}}function Re(){const t=new Worker(new URL("/assets/worker-CaOzbBz1.js",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:R&&R.tagName.toUpperCase()==="SCRIPT"&&R.src||new URL("moyodb-sdk.umd.cjs",document.baseURI).href),{type:"module"}),e=new xt(t),r=Dt(t);return{worker:t,proxy:e,persistenceBridge:r}}function Lt(t,e,r,n,o){const s={dbName:t,refs:1,worker:e,proxy:r,persistenceBridge:n,options:o,invalidated:!1,txInvalidationListeners:new Set,handleInvalidationListeners:new Set};return r.setFatalHandler(()=>{k.get(t)!==s||s.invalidated||(k.delete(t),s.refs=0,Q(s),s.persistenceBridge.close(),s.worker.terminate())}),s}function Me(t){for(const e of Array.from(t))e()}function qt(t,e){return t.txInvalidationListeners.add(e),()=>{t.txInvalidationListeners.delete(e)}}function Ut(t,e){return t.handleInvalidationListeners.add(e),()=>{t.handleInvalidationListeners.delete(e)}}function U(t){Me(t.txInvalidationListeners)}function Q(t){t.invalidated||(t.invalidated=!0,U(t),Me(t.handleInvalidationListeners))}function Wt(t){const e=k.get(t);return e?(k.delete(t),Q(e),e.refs=0,e.persistenceBridge.close(),e.proxy.dispose(new Error("worker was terminated by unsafeDebugCrashWorker")),e.worker.terminate(),!0):!1}async function zt(t,e={}){const r=Mt(e),n=k.get(t);if(n)if(n.invalidated)k.delete(t);else{if(_t(t,n.options,r),r.debugFailpoint!==null)try{await n.proxy.setFailpoint(r.debugFailpoint)}catch(d){throw S(d)}return n.refs+=1,n}const{worker:o,proxy:s,persistenceBridge:a}=Re(),f=Lt(t,o,s,a,r);try{return await s.open({dbName:t,options:r}),k.set(t,f),f}catch(d){throw a.close(),s.dispose(new Error("worker open failed")),o.terminate(),S(d)}}async function $t(t){if(t.invalidated)return;const e=k.get(t.dbName);if(e&&(e.refs-=1,!(e.refs>0))){k.delete(t.dbName);try{await e.proxy.close()}finally{e.persistenceBridge.close(),e.proxy.dispose(new Error("worker was released")),e.worker.terminate()}}}async function _e(t){const e=k.get(t.dbName)??t;k.delete(t.dbName),Q(e),e.refs=0;try{await e.proxy.destroy()}catch(r){throw S(r)}finally{e.persistenceBridge.close(),e.proxy.dispose(new Error("worker was released")),e.worker.terminate()}}async function Ft(t){const e=k.get(t);if(e){await _e(e);return}const{worker:r,proxy:n,persistenceBridge:o}=Re();try{await n.deleteDB(t)}catch(s){throw S(s)}finally{o.close(),n.dispose(new Error("temporary worker was terminated")),r.terminate()}}const Kt=new TextEncoder,Vt=new TextDecoder,jt=16,Ht=32,Yt=33,Jt=48,Gt=64,Xt=80,N=0,Ce=255,Z=0,Qt=0xffffffffffffffffn;function x(t){return Kt.encode(t)}function Be(t){return Vt.decode(t)}function Zt(t){return x(JSON.stringify(t))}function er(t){return JSON.parse(Be(t))}function tr(t){const e=typeof t=="bigint"?t:BigInt(t);if(e<0n)throw new RangeError("u64Key only accepts non-negative values");const r=new ArrayBuffer(8);return new DataView(r).setBigUint64(0,e,!1),new Uint8Array(r)}function rr(t){return Array.isArray(t)?ee(...t):ne(t)}function ee(...t){return De(t.map(e=>ne(e)))}function te(t){return ne(t)}function I(t){return De(t)}function Ne(t){const e=[],r=[];for(let n=0;n<t.length;n+=1){const o=t[n];if(o!==N){r.push(o);continue}const s=t[n+1];if(s===Ce){r.push(N),n+=1;continue}if(s===Z){e.push(Uint8Array.from(r)),r.length=0,n+=1;continue}throw new TypeError("invalid compound key encoding")}if(r.length!==0)throw new TypeError("compound key terminated unexpectedly");return e}function W(t){const e=t.slice();for(let r=e.length-1;r>=0;r-=1)if(e[r]!==255)return e[r]+=1,e.subarray(0,r+1);return null}function re(t){const e=W(t);return e?{gte:t,lt:e}:{gte:t}}function nr(...t){return re(ee(...t))}function ne(t){if(t===null)return Uint8Array.of(jt);if(typeof t=="boolean")return Uint8Array.of(t?Yt:Ht);if(typeof t=="number")return or(t);if(typeof t=="string"){const e=x(t),r=new Uint8Array(1+e.length);return r[0]=Gt,r.set(e,1),r}if(t instanceof Uint8Array){const e=new Uint8Array(1+t.length);return e[0]=Xt,e.set(t,1),e}throw new TypeError("compound key parts must be string, number, boolean, null, or Uint8Array")}function De(t){let e=0;for(const o of t){for(const s of o)e+=s===N?2:1;e+=2}const r=new Uint8Array(e);let n=0;for(const o of t){for(const s of o)s===N?(r[n]=N,r[n+1]=Ce,n+=2):(r[n]=s,n+=1);r[n]=Z,r[n+1]=Z,n+=2}return r}function or(t){if(!Number.isFinite(t))throw new TypeError("compound key number parts must be finite");const e=Object.is(t,-0)?0:t,r=new ArrayBuffer(9),n=new DataView(r);n.setUint8(0,Jt),n.setFloat64(1,e,!1);let o=n.getBigUint64(1,!1);return o=(o&1n<<63n)!==0n?~o&Qt:o^1n<<63n,n.setBigUint64(1,o,!1),new Uint8Array(r)}const sr=new TextEncoder,Le=new TextDecoder("utf-8",{fatal:!0}),z=Symbol("moyodb.indexing.missing"),ir=0xcbf29ce484222325n,ar=0x100000001b3n,cr=0xffffffffffffffffn,ur="__browserdb:",qe="__browserdb:index:",dr="__browserdb:indexes";function Ue(t){return t.startsWith(ur)}function g(t){if(Ue(t))throw new X(`reserved store name: ${t}`)}function $(t){if(t===void 0)return[];if(!Array.isArray(t))throw new m("indexes must be an array");const e=[],r=new Set,n=new Map;for(const o of t){if(o===null||typeof o!="object"||Array.isArray(o))throw new m("each index definition must be an object");const{store:s,name:a,keyPath:f,unique:d}=o;if(typeof s!="string"||s.length===0)throw new m("index store must be a non-empty string");if(typeof a!="string"||a.length===0)throw new m("index name must be a non-empty string");g(s);const l=Sr(f);if(d!==void 0&&typeof d!="boolean")throw new m("index unique must be a boolean");const c={store:s,name:a,keyPath:l.paths,compound:l.compound,unique:d??!1,internalStore:xr(s,a)},u=oe(c.store,c.name);if(r.has(u))throw new m(`duplicate index definition ${c.store}.${c.name}`);r.add(u);const h=n.get(c.internalStore);if(h&&h!==u)throw new m(`index definitions ${h} and ${u} map to the same internal store ${c.internalStore}`);n.set(c.internalStore,u),e.push(c)}return e.sort(We),e}function We(t,e){const r=D(t.store,e.store);if(r!==0)return r;const n=D(t.name,e.name);if(n!==0)return n;const o=Number(t.unique)-Number(e.unique);return o!==0?o:D(Fe(t),Fe(e))}function oe(t,e){return`${t}\0${e}`}function lr(t,e,r){return t.find(n=>n.store===e&&n.name===r)??null}function fr(t,e){return t.filter(r=>r.store===e)}function hr(t,e){return I([x(t),x(e)])}function yr(t){return x(JSON.stringify(ze(t)))}function pr(t){let e;try{e=JSON.parse(Le.decode(t))}catch(n){throw new _(`invalid persisted index metadata: ${String(n)}`)}const[r]=$([e]);return r}function br(t,e){return I([t,e])}function mr(t){const e=Ne(t);if(e.length!==2)throw new _("invalid index entry key encoding");return{logicalKey:e[0],primaryKey:e[1]}}function gr(t){return re(I([t]))}function wr(t={}){Ar(t);const e={};if(t.reverse!==void 0&&(e.reverse=t.reverse),t.limit!==void 0&&(e.limit=t.limit),t.gte&&(e.gte=I([t.gte])),t.gt){const r=W(I([t.gt]));r&&(e.gte=r)}if(t.lt&&(e.lt=I([t.lt])),t.lte){const r=W(I([t.lte]));r&&(e.lt=r)}return e}function Er(t,e){const r=Pr(e);if(t.compound){const o=[];for(const s of t.keyPath){const a=Ve(r,s);if(a===z)return null;o.push(je(a))}return I(o)}const n=Ve(r,t.keyPath[0]);return n===z?null:je(n)}function se(t){return JSON.stringify(ie(t))}function kr(t){return t.map(e=>({store:e.store,name:e.name,keyPath:[...e.keyPath],compound:e.compound,unique:e.unique,internalStore:e.internalStore}))}function ie(t){return t.map(ze)}function ze(t){return{store:t.store,name:t.name,keyPath:t.compound?[...t.keyPath]:t.keyPath[0],unique:t.unique}}function Sr(t){if(typeof t=="string")return $e(t),{paths:[t],compound:!1};if(!Array.isArray(t)||t.length===0||t.some(e=>typeof e!="string"))throw new m("index keyPath must be a non-empty string or non-empty string[]");for(const e of t)$e(e);return{paths:[...t],compound:!0}}function $e(t){if(t.length===0)throw new m("index keyPath strings must be non-empty");if(t.startsWith(".")||t.endsWith(".")||t.includes(".."))throw new m(`invalid index keyPath: ${t}`)}function Fe(t){return t.compound?`[${t.keyPath.join(",")}]`:t.keyPath[0]}function xr(t,e){const r=Ke(x(t)),n=Ke(x(e)),o=`${qe}${r}:${n}`;if(sr.encode(o).length<=255)return o;const s=x(oe(t,e));return`${qe}h:${Ir(s)}`}function Ke(t){let e="";for(const r of t)e+=String.fromCharCode(r);return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/u,"")}function Ir(t){let e=ir;for(const r of t)e^=BigInt(r),e=e*ar&cr;return e.toString(16).padStart(16,"0")}function Pr(t){try{return JSON.parse(Le.decode(t))}catch(e){throw new _(`indexed values must be valid UTF-8 JSON: ${String(e)}`)}}function Ve(t,e){let r=t;for(const n of e.split(".")){if(r==null)return z;const o=Object(r);if(!(n in o))return z;r=Reflect.get(o,n)}return r}function je(t){if(t instanceof Uint8Array||t===null||typeof t=="string"||typeof t=="number"||typeof t=="boolean")return te(t);throw new _(`indexed keyPath values must resolve to string, number, boolean, null, or Uint8Array; got ${Tr(t)}`)}function Tr(t){return Array.isArray(t)?"array":t===null?"null":typeof t}function Ar(t){if(t.gt!==void 0&&t.gte!==void 0)throw new TypeError("index range cannot specify both gt and gte");if(t.lt!==void 0&&t.lte!==void 0)throw new TypeError("index range cannot specify both lt and lte")}function Or(t){return M(t)&&t.key instanceof Uint8Array&&(t.kind==="put"||t.kind==="delete")}function vr(t){return M(t)&&typeof t.store=="string"&&Array.isArray(t.changes)&&t.changes.every(Or)}function Rr(t){return M(t)&&t.type==="commit_applied"&&typeof t.dbName=="string"&&typeof t.txid=="number"&&Array.isArray(t.stores)&&t.stores.every(vr)}function He(t){return t.map(e=>({key:e.key.slice(),kind:e.kind}))}function Mr(t,e){if(e.byteLength>t.byteLength)return!1;for(let r=0;r<e.byteLength;r+=1)if(t[r]!==e[r])return!1;return!0}function _r(t,e,r){if(typeof t=="function"){if(e!==void 0||r!==void 0)throw new TypeError("subscribe(callback) accepts exactly one callback argument");return{store:null,keyPrefix:null,callback:t}}if(typeof t!="string")throw new TypeError("subscribe() storeName must be a string");if(g(t),typeof e=="function"){if(r!==void 0)throw new TypeError("subscribe(storeName, callback) accepts exactly two arguments");return{store:t,keyPrefix:null,callback:e}}if(e instanceof Uint8Array&&typeof r=="function")return{store:t,keyPrefix:e.slice(),callback:r};throw new TypeError("subscribe() expects one of: (callback), (storeName, callback), (storeName, keyPrefix, callback)")}class Cr{#e;#t=null;#n=new Set;#s=!1;constructor(e){this.#e=e}subscribe(e,r,n){if(this.#s)throw new q;const o=_r(e,r,n),s={active:!0,store:o.store,keyPrefix:o.keyPrefix,callback:o.callback};return this.#r(),this.#n.add(s),()=>{s.active&&(s.active=!1,this.#n.delete(s),this.#n.size===0&&this.#i())}}close(){this.#s||(this.#s=!0,this.#n.clear(),this.#i())}#r(){if(this.#t!==null||this.#s)return;const e=new BroadcastChannel(`db:${this.#e}:events`);e.onmessage=r=>{this.#c(r.data)},this.#t=e}#i(){this.#t?.close(),this.#t=null}#c(e){if(!Rr(e)||e.dbName!==this.#e||this.#n.size===0)return;const r=Array.from(this.#n);for(const n of e.stores)for(const o of r){if(!o.active||o.store!==null&&o.store!==n.store)continue;let s;if(o.keyPrefix===null)s=He(n.changes);else if(s=He(n.changes.filter(a=>Mr(a.key,o.keyPrefix))),s.length===0)continue;try{o.callback(n.store,s,e.txid)}catch(a){queueMicrotask(()=>{throw a})}}}}async function y(t){try{return await t()}catch(e){throw S(e)}}class Br{mode;#e;#t;#n=!1;#s;constructor(e,r,n,o){this.#e=e,this.#t=r,this.mode=n,this.#s=o}async get(e,r){return this.#r(),g(e),y(()=>this.#e.proxy.get(this.#t,e,r))}async getMany(e,r){return this.#r(),g(e),y(()=>this.#e.proxy.getMany(this.#t,e,r))}async has(e,r){return this.#r(),g(e),y(()=>this.#e.proxy.has(this.#t,e,r))}async put(e,r,n,o={}){return this.#r(),g(e),y(()=>this.#e.proxy.put(this.#t,e,r,n,ue(o)))}async putMany(e,r,n={}){return this.#r(),g(e),y(()=>this.#e.proxy.putMany(this.#t,e,r,ue(n)))}async delete(e,r){return this.#r(),g(e),y(()=>this.#e.proxy.delete(this.#t,e,r))}async deleteMany(e,r){return this.#r(),g(e),y(()=>this.#e.proxy.deleteMany(this.#t,e,r))}async applyBatch(e,r){return this.#r(),g(e),y(()=>this.#e.proxy.applyBatch(this.#t,e,r))}async scan(e,r={}){return this.#r(),g(e),y(()=>this.#e.proxy.scan(this.#t,e,r))}async getByIndex(e,r,n){return this.#r(),g(e),y(()=>this.#e.proxy.getByIndex(this.#t,e,r,n))}async*scanByIndex(e,r,n={}){this.#r(),g(e);const o=await y(()=>this.#e.proxy.scanByIndex(this.#t,e,r,n));for(const s of o)yield[s.key,s.value]}async createStore(e,r={}){return this.#r(),g(e),y(()=>this.#e.proxy.createStore(this.#t,e,Qe(r)))}async dropStore(e){return this.#r(),g(e),y(()=>this.#e.proxy.dropStore(this.#t,e))}async clearStore(e){return this.#r(),g(e),y(()=>this.#e.proxy.clearStore(this.#t,e))}async commit(){this.#r();try{await y(()=>this.#e.proxy.commit(this.#t))}finally{this.#i()}}async rollback(){this.#r();try{await y(()=>this.#e.proxy.rollback(this.#t))}finally{this.#i()}}async rollbackIfOpen(){if(!this.#n){if(this.#e.invalidated){this.#i();return}try{await this.#e.proxy.rollback(this.#t)}catch(e){const r=S(e);if(!(r instanceof L))throw r}finally{this.#i()}}}forceClose(){this.#i()}internalId(){return this.#t}#r(){if(this.#n||this.#e.invalidated)throw new L}#i(){this.#n||(this.#n=!0,this.#s())}}class Nr{#e;#t=!1;#n=new Set;#s;#r=null;#i=null;constructor(e){this.#e=e,this.#s=new Cr(e.dbName),this.#r=qt(e,()=>{this.#d()}),this.#i=Ut(e,()=>{this.#l()})}async begin(e="readonly"){return this.#c(e)}async runSchemaMigration(e,r,n,o){this.#o();const s=await this.#c("readwrite"),a=new Dr,f=new Lr(s,a),d=new qr(this,f,a);try{await this.#e.proxy.reconcileIndexes(s.internalId(),o),await n({db:d,oldVersion:e,newVersion:r,transaction:f}),await this.#e.proxy.setSchemaVersion(s.internalId(),r),await s.commit()}catch(l){try{await s.rollbackIfOpen()}catch{}throw l}}async listStores(){return this.#o(),y(()=>this.#e.proxy.listStores())}async getVersion(){return this.#o(),y(()=>this.#e.proxy.getVersion())}async changesSince(e,r={}){return this.#o(),y(()=>this.#e.proxy.changesSince($r(e),Fr(r)))}async#c(e){return this.#o(),y(async()=>{const r=await this.#e.proxy.begin(e);let n;return n=new Br(this.#e,r,e,()=>{this.#n.delete(n)}),this.#n.add(n),n})}async createStore(e,r={}){await this.#a("readwrite",async n=>{await n.createStore(e,Qe(r))})}async dropStore(e){await this.#a("readwrite",async r=>{await r.dropStore(e)})}async clearStore(e){await this.#a("readwrite",async r=>{await r.clearStore(e)})}async get(e,r){return this.#a("readonly",n=>n.get(e,r))}async getMany(e,r){return this.#a("readonly",n=>n.getMany(e,r))}async has(e,r){return this.#a("readonly",n=>n.has(e,r))}async put(e,r,n,o={}){await this.#a("readwrite",async s=>{await s.put(e,r,n,ue(o))})}async delete(e,r){return this.#a("readwrite",n=>n.delete(e,r))}async scan(e,r={}){return this.#a("readonly",n=>n.scan(e,r))}async exportSnapshot(e={}){return this.#o(),y(async()=>{const r=await this.#e.proxy.exportSnapshot(zr(e));return r instanceof Uint8Array?r:new Uint8Array(r)})}async importSnapshot(e){return this.#o(),y(()=>{const r=e instanceof Uint8Array?e:new Uint8Array(e);return this.#e.proxy.importSnapshot(r)})}async reset(){return this.#o(),U(this.#e),y(()=>this.#e.proxy.reset())}async compact(){return this.#o(),U(this.#e),y(()=>this.#e.proxy.compact())}async rebuild(){return this.#o(),U(this.#e),y(()=>this.#e.proxy.rebuild())}async stats(){return this.#o(),y(()=>this.#e.proxy.stats())}async storageInfo(){return this.#o(),y(()=>this.#e.proxy.storageInfo())}async requestPersistence(){return this.#o(),y(()=>this.#e.proxy.requestPersistence())}async destroy(){return this.#o(),y(()=>_e(this.#e))}async setFailpoint(e){return this.#o(),y(()=>this.#e.proxy.setFailpoint(e))}subscribe(e,r,n){if(this.#o(),typeof e=="function")return this.#s.subscribe(e);if(typeof r=="function")return this.#s.subscribe(e,r);if(r instanceof Uint8Array&&typeof n=="function")return this.#s.subscribe(e,r,n);throw new TypeError("subscribe() expects one of: (callback), (storeName, callback), (storeName, keyPrefix, callback)")}watch(e,r,n){if(typeof e=="function")return this.subscribe(e);if(typeof r=="function")return this.subscribe(e,r);if(r instanceof Uint8Array&&typeof n=="function")return this.subscribe(e,r,n);throw new TypeError("watch() expects one of: (callback), (storeName, callback), (storeName, keyPrefix, callback)")}async close(){if(this.#t)return;this.#t=!0,this.#u(),this.#s.close();let e=null;const r=Array.from(this.#n);if(r.length>0){const n=await Promise.allSettled(r.map(o=>o.rollbackIfOpen()));for(const o of n)o.status==="rejected"&&e===null&&(e=S(o.reason))}try{await $t(this.#e)}catch(n){throw S(n)}if(e)throw e}async#a(e,r){const n=await this.begin(e);try{const o=await r(n);return e==="readwrite"?await n.commit():await n.rollback(),o}catch(o){try{await n.rollback()}catch{}throw o}}#u(){this.#r?.(),this.#r=null,this.#i?.(),this.#i=null}#d(){for(const e of Array.from(this.#n))e.forceClose()}#l(){this.#t||(this.#t=!0,this.#u(),this.#d(),this.#s.close())}#o(){if(this.#t||this.#e.invalidated)throw new q}}class Dr{#e=new Set;#t=new Set;recordCreate(e){this.#t.delete(e),this.#e.add(e)}recordDrop(e){this.#e.delete(e)||this.#t.add(e)}apply(e){const r=new Set(e);for(const n of this.#e)r.add(n);for(const n of this.#t)r.delete(n);return Array.from(r).sort(D)}}class Lr{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get mode(){return this.#e.mode}async get(e,r){return this.#e.get(e,r)}async getMany(e,r){return this.#e.getMany(e,r)}async has(e,r){return this.#e.has(e,r)}async put(e,r,n,o={}){await this.#e.put(e,r,n,o)}async putMany(e,r,n={}){await this.#e.putMany(e,r,n)}async delete(e,r){return this.#e.delete(e,r)}async deleteMany(e,r){await this.#e.deleteMany(e,r)}async applyBatch(e,r){await this.#e.applyBatch(e,r)}async scan(e,r={}){return this.#e.scan(e,r)}async getByIndex(e,r,n){return this.#e.getByIndex(e,r,n)}scanByIndex(e,r,n={}){return this.#e.scanByIndex(e,r,n)}async createStore(e,r={}){await this.#e.createStore(e,r),this.#t.recordCreate(e)}async dropStore(e){await this.#e.dropStore(e),this.#t.recordDrop(e)}async clearStore(e){await this.#e.clearStore(e)}async commit(){throw E("transaction.commit")}async rollback(){throw E("transaction.rollback")}}class qr{#e;#t;#n;constructor(e,r,n){this.#e=e,this.#t=r,this.#n=n}async begin(e="readonly"){throw E("db.begin")}async createStore(e,r={}){await this.#t.createStore(e,r)}async dropStore(e){await this.#t.dropStore(e)}async clearStore(e){await this.#t.clearStore(e)}async listStores(){return this.#n.apply(await this.#e.listStores())}async getVersion(){return this.#e.getVersion()}async changesSince(e,r={}){throw E("db.changesSince")}async get(e,r){return this.#t.get(e,r)}async getMany(e,r){return this.#t.getMany(e,r)}async has(e,r){return this.#t.has(e,r)}async put(e,r,n,o={}){await this.#t.put(e,r,n,o)}async delete(e,r){return this.#t.delete(e,r)}async scan(e,r={}){return this.#t.scan(e,r)}async exportSnapshot(e={}){throw E("db.exportSnapshot")}async importSnapshot(e){throw E("db.importSnapshot")}async reset(){throw E("db.reset")}async compact(){throw E("db.compact")}async rebuild(){throw E("db.rebuild")}async stats(){return this.#e.stats()}async storageInfo(){return this.#e.storageInfo()}async requestPersistence(){return this.#e.requestPersistence()}async close(){throw E("db.close")}async destroy(){throw E("db.destroy")}async setFailpoint(e){throw E("db.setFailpoint")}subscribe(e,r,n){throw E("db.subscribe")}watch(e,r,n){throw E("db.watch")}}function E(t){const e=new Error(`${t}() is not available inside openDB() migrations; use the provided migration transaction and wait for openDB() to resolve`);return e.name="InvalidStateError",e}function ae(t,e){if(typeof t!="string"||t.length===0)throw new TypeError(`${e}() database name must be a non-empty string`);return t}const Ye=t=>new TypeError(t),Je=t=>new m(t);function F(t,e,r=Ye){if(t===void 0)return{};if(t===null||typeof t!="object"||Array.isArray(t))throw r(e);return t}function Ge(t,e,r=Ye){if(typeof t!="number"||!Number.isSafeInteger(t)||t<0)throw r(e);return t}function ce(t,e,r){return t===void 0?void 0:Ge(t,e,r)}function Ur(t){return F(t,"open options must be an object",Je)}function Wr(t){return ce(t,"version must be a non-negative safe integer",Je)}function ue(t){const{ttl:e}=F(t,"put options must be an object"),r=ce(e,"ttl must be a non-negative safe integer");return r===void 0?{}:{ttl:r}}function Xe(t,e){const{compression:r}=F(t,e);if(r===void 0)return{};if(r!==!1&&r!=="gzip"&&r!=="deflate")throw new TypeError('compression must be "gzip", "deflate", or false');return{compression:r}}function Qe(t){return Xe(t,"createStore options must be an object")}function zr(t){return Xe(t,"exportSnapshot options must be an object")}function $r(t){return Ge(t,"txid must be a non-negative safe integer")}function Fr(t){const{stores:e,limit:r}=F(t,"change feed options must be an object"),n={};if(e!==void 0){if(!Array.isArray(e)||e.some(s=>typeof s!="string"))throw new TypeError("stores must be an array of strings");for(const s of e)g(s);n.stores=[...e]}const o=ce(r,"limit must be a non-negative safe integer");return o!==void 0&&(n.limit=o),n}function Kr(t){if(t!==void 0){if(typeof t!="function")throw new m("migrate must be a function");return t}}function Vr(t){if(t!==void 0)return $(t)}function jr(t,e){return se(t)===se(e)}async function Hr(t){return $(await t.proxy.getIndexes())}function Ze(){if(!globalThis.isSecureContext)throw new O("moyodb requires a secure context (HTTPS)");const t=globalThis.navigator;if(!t?.storage)throw new O("navigator.storage is unavailable");if(typeof t.storage.getDirectory!="function")throw new O("navigator.storage.getDirectory is unavailable");if(typeof globalThis.Worker!="function")throw new O("Worker is unavailable");if(typeof globalThis.BroadcastChannel>"u")throw new O("BroadcastChannel is unavailable");if(!t.locks)throw new O("navigator.locks is unavailable")}async function Yr(t){const e=globalThis.navigator;(t.requestPersistence??!0)&&typeof e?.storage?.persist=="function"&&await j(e.storage.persist(),1e3,!1)}async function Jr(t,e={}){const r=ae(t,"openDB"),n=Ur(e),o=Wr(n.version),s=Kr(n.migrate),a=Vr(n.indexes);if(o===void 0&&s!==void 0)throw new m("migrate requires version");if(o===void 0&&a!==void 0)throw new m("indexes requires version");Ze(),await Yr(n);const f=await zt(r,n),d=new Nr(f);let l=!1;try{if(o===void 0)return l=!0,d;const[c,u]=await Promise.all([d.getVersion(),Hr(f)]);if(o<c)throw new B(`cannot open database ${r} at schema version ${o}; current schema version is ${c}`);if(o===c){if(a!==void 0&&!jr(a,u))throw new B(`database ${r} is already at schema version ${c}, but the requested index catalog does not match the committed schema`);return l=!0,d}if(f.refs>1)throw new J(`database ${r} is already open in this tab; close existing handles before migrating from version ${c} to ${o}`);if(!s)throw new B(`database ${r} requires migration from version ${c} to ${o}, but no migrate hook was provided`);const h=a??u;return await d.runSchemaMigration(c,o,s,ie(h)),l=!0,d}catch(c){if(!l)try{await d.close()}catch{}throw S(c)}}async function Gr(t){const e=ae(t,"deleteDB");Ze(),await Ft(e)}function Xr(t){const e=ae(t,"unsafeDebugCrashWorker");return Wt(e)}i.ChangeFeedCompactedError=Ie,i.ConstraintError=G,i.CorruptionError=le,i.DatabaseBusyError=J,i.DatabaseClosedError=q,i.INDEX_METADATA_STORE=dr,i.IndexNotFoundError=ye,i.InjectedFailureError=xe,i.InternalError=Pe,i.InvalidOpenOptionsError=m,i.InvalidRangeError=ke,i.KeyTooLargeError=we,i.MoyoDbError=b,i.ReadonlyTransactionError=me,i.ReservedStoreNameError=X,i.SerializationError=_,i.StorageError=Se,i.StoreExistsError=fe,i.StoreNameTooLongError=Ee,i.StoreNotFoundError=he,i.TransactionClosedError=L,i.UniqueIndexConstraintError=pe,i.UnsupportedPlatformError=O,i.ValueTooLargeError=ge,i.VersionError=B,i.WriteTransactionAlreadyOpenError=be,i.assertPublicStoreName=g,i.cloneNormalizedIndexDefinitions=kr,i.compareNormalizedIndexDefinitions=We,i.compoundKey=ee,i.compoundKeyRange=nr,i.decodeIndexEntryKey=mr,i.decodeIndexMetadataValue=pr,i.deleteDB=Gr,i.encodeCompoundKeyParts=I,i.encodeIndexEntryKey=br,i.encodeIndexMetadataKey=hr,i.encodeIndexMetadataValue=yr,i.encodeIndexScalar=te,i.extractLogicalIndexKey=Er,i.findIndexDefinition=lr,i.indexDefinitionIdentity=oe,i.indexKey=rr,i.indexKeyExactRange=gr,i.indexRangeToPhysicalRange=wr,i.indexesForStore=fr,i.isInternalStoreName=Ue,i.jsonDecode=er,i.jsonEncode=Zt,i.normalizeError=S,i.normalizeIndexDefinitions=$,i.openDB=Jr,i.prefixRange=re,i.prefixSuccessor=W,i.serializeNormalizedIndexDefinitions=se,i.splitCompoundKey=Ne,i.toPublicIndexDefinitions=ie,i.u64Key=tr,i.unsafeDebugCrashWorker=Xr,i.utf8Decode=Be,i.utf8Encode=x,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})}));
2
- //# sourceMappingURL=moyodb-sdk.umd.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"moyodb-sdk.umd.cjs","sources":["../src/internal.ts","../src/worker-protocol.ts","../src/worker-client.ts","../src/errors.ts","../src/registry.ts","../src/codec.ts","../src/indexing.ts","../src/change-events.ts","../src/subscriptions.ts","../src/index.ts"],"sourcesContent":["export function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object';\n}\n\nexport function compareStringsByCodeUnit(left: string, right: string): number {\n if (left < right) {\n return -1;\n }\n return left > right ? 1 : 0;\n}\n\nexport function withTimeout<T>(promise: Promise<T>, timeoutMs: number, fallback: T): Promise<T> {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => resolve(fallback), timeoutMs);\n promise.then(\n (value) => {\n clearTimeout(timeout);\n resolve(value);\n },\n () => {\n clearTimeout(timeout);\n resolve(fallback);\n }\n );\n });\n}\n","import type { WorkerApi } from './worker-api';\nimport type { BatchOp } from './types';\nimport { isRecord } from './internal';\n\nexport const WORKER_PROTOCOL_VERSION = 1;\nexport const WORKER_PROTOCOL_READY = 'moyodb:worker-protocol:ready';\nexport const WORKER_PROTOCOL_REQUEST = 'moyodb:worker-protocol:request';\nexport const WORKER_PROTOCOL_RESPONSE = 'moyodb:worker-protocol:response';\n\nexport const WORKER_COMMANDS = [\n 'open',\n 'close',\n 'destroy',\n 'deleteDB',\n 'begin',\n 'commit',\n 'rollback',\n 'createStore',\n 'dropStore',\n 'clearStore',\n 'get',\n 'getMany',\n 'has',\n 'put',\n 'putMany',\n 'delete',\n 'deleteMany',\n 'applyBatch',\n 'scan',\n 'getByIndex',\n 'scanByIndex',\n 'getIndexes',\n 'reconcileIndexes',\n 'listStores',\n 'getVersion',\n 'changesSince',\n 'setSchemaVersion',\n 'exportSnapshot',\n 'importSnapshot',\n 'reset',\n 'compact',\n 'rebuild',\n 'stats',\n 'storageInfo',\n 'requestPersistence',\n 'setFailpoint'\n] as const;\n\nexport type WorkerCommand = (typeof WORKER_COMMANDS)[number];\n\ntype WorkerMethod<M extends WorkerCommand> = WorkerApi[M] extends (...args: infer Args) => Promise<infer Result>\n ? { args: Args; result: Result }\n : never;\n\nexport type WorkerCommandArgs<M extends WorkerCommand> = WorkerMethod<M>['args'];\nexport type WorkerCommandResult<M extends WorkerCommand> = WorkerMethod<M>['result'];\nexport type PackedBatchOpKey = {\n kind: 'put' | 'delete';\n key: Uint8Array;\n};\n\ntype PreparedWorkerCommandArgs<M extends WorkerCommand> = WorkerCommandArgs<M> | unknown[];\n\nconst PACKED_BINARY_LIST_V1 = 'moyodb:packed-binary-list:v1';\nconst PACKED_NULLABLE_BINARY_LIST_V1 = 'moyodb:packed-nullable-binary-list:v1';\nconst PACKED_SCAN_ROWS_V1 = 'moyodb:packed-scan-rows:v1';\nconst PACKED_BATCH_OPS_V1 = 'moyodb:packed-batch-ops:v1';\nconst BATCH_OP_DELETE = 0;\nconst BATCH_OP_PUT = 1;\nconst U32_MAX = 0xffff_ffff;\nconst MAX_PACKED_RESPONSE_BYTES = 16 * 1024 * 1024;\nconst EMPTY_TRANSFERABLES: Transferable[] = [];\n\ninterface PackedBinaryListV1 {\n __moyodbPacked: typeof PACKED_BINARY_LIST_V1;\n bytes: Uint8Array;\n}\n\ninterface PackedNullableBinaryListV1 {\n __moyodbPacked: typeof PACKED_NULLABLE_BINARY_LIST_V1;\n bytes: Uint8Array;\n}\n\ninterface PackedScanRowsV1 {\n __moyodbPacked: typeof PACKED_SCAN_ROWS_V1;\n bytes: Uint8Array;\n}\n\ninterface PackedBatchOpsV1 {\n __moyodbPacked: typeof PACKED_BATCH_OPS_V1;\n bytes: Uint8Array;\n}\n\nexport type WorkerProtocolReadyMessage = {\n type: typeof WORKER_PROTOCOL_READY;\n version: typeof WORKER_PROTOCOL_VERSION;\n};\n\nexport type WorkerProtocolRequestMessage = {\n [M in WorkerCommand]: {\n type: typeof WORKER_PROTOCOL_REQUEST;\n version: typeof WORKER_PROTOCOL_VERSION;\n id: number;\n command: M;\n args: PreparedWorkerCommandArgs<M>;\n };\n}[WorkerCommand];\n\nexport interface SerializedWorkerError {\n name: string;\n code?: string;\n message: string;\n stack?: string;\n}\n\nexport type WorkerProtocolSuccessMessage = {\n [M in WorkerCommand]: {\n type: typeof WORKER_PROTOCOL_RESPONSE;\n version: typeof WORKER_PROTOCOL_VERSION;\n id: number;\n ok: true;\n result: WorkerCommandResult<M>;\n };\n}[WorkerCommand];\n\nexport interface WorkerProtocolErrorMessage {\n type: typeof WORKER_PROTOCOL_RESPONSE;\n version: typeof WORKER_PROTOCOL_VERSION;\n id: number;\n ok: false;\n error: SerializedWorkerError;\n}\n\nexport type WorkerProtocolResponseMessage = WorkerProtocolSuccessMessage | WorkerProtocolErrorMessage;\n\nconst WORKER_COMMAND_SET = new Set<string>(WORKER_COMMANDS);\n\nexport function isWorkerCommand(value: unknown): value is WorkerCommand {\n return typeof value === 'string' && WORKER_COMMAND_SET.has(value);\n}\n\nexport function isWorkerProtocolReadyMessage(value: unknown): value is WorkerProtocolReadyMessage {\n return isRecord(value) && value.type === WORKER_PROTOCOL_READY && value.version === WORKER_PROTOCOL_VERSION;\n}\n\nexport function isWorkerProtocolResponseMessage(value: unknown): value is WorkerProtocolResponseMessage {\n return (\n isRecord(value) &&\n value.type === WORKER_PROTOCOL_RESPONSE &&\n value.version === WORKER_PROTOCOL_VERSION &&\n typeof value.id === 'number' &&\n Number.isSafeInteger(value.id) &&\n typeof value.ok === 'boolean'\n );\n}\n\nexport function isWorkerProtocolRequestMessage(value: unknown): value is WorkerProtocolRequestMessage {\n return (\n isRecord(value) &&\n value.type === WORKER_PROTOCOL_REQUEST &&\n value.version === WORKER_PROTOCOL_VERSION &&\n typeof value.id === 'number' &&\n Number.isSafeInteger(value.id) &&\n typeof value.command === 'string' &&\n Array.isArray(value.args)\n );\n}\n\nexport function isWorkerProtocolEnvelope(value: unknown): value is { type: string; id?: unknown } {\n return (\n isRecord(value) &&\n (value.type === WORKER_PROTOCOL_REQUEST ||\n value.type === WORKER_PROTOCOL_RESPONSE ||\n value.type === WORKER_PROTOCOL_READY)\n );\n}\n\nexport function serializeWorkerError(error: unknown): SerializedWorkerError {\n if (isRecord(error)) {\n const code = stringOrUndefined(error.code);\n const name = stringOrUndefined(error.name) ?? code ?? 'Error';\n return {\n name,\n code,\n message: stringOrUndefined(error.message) ?? String(error),\n stack: stringOrUndefined(error.stack)\n };\n }\n return {\n name: 'Error',\n message: String(error)\n };\n}\n\nexport function deserializeWorkerError(error: SerializedWorkerError): Error {\n const deserialized = new Error(error.message);\n deserialized.name = error.name || error.code || 'Error';\n if (error.stack) {\n deserialized.stack = error.stack;\n }\n if (error.code) {\n Object.defineProperty(deserialized, 'code', {\n value: error.code,\n enumerable: true,\n configurable: true\n });\n }\n return deserialized;\n}\n\nexport function workerProtocolError(name: string, message: string, code = name): Error {\n const error = new Error(message);\n error.name = name;\n Object.defineProperty(error, 'code', {\n value: code,\n enumerable: true,\n configurable: true\n });\n return error;\n}\n\nexport function prepareWorkerCommandPayload<M extends WorkerCommand>(\n command: M,\n args: WorkerCommandArgs<M>\n): { args: PreparedWorkerCommandArgs<M>; transfer: Transferable[] } {\n if (command === 'importSnapshot') {\n const data = args[0];\n if (data instanceof Uint8Array) {\n const owned = copyToOwnedUint8Array(data);\n return {\n args: [owned] as WorkerCommandArgs<M>,\n transfer: [owned.buffer]\n };\n }\n }\n\n if (command === 'getMany' || command === 'deleteMany') {\n const [txId, store, keys] = args as WorkerCommandArgs<'getMany'> | WorkerCommandArgs<'deleteMany'>;\n if (Array.isArray(keys) && keys.length > 0) {\n const packed = packBinaryList(keys);\n return {\n args: [txId, store, packed],\n transfer: [packed.bytes.buffer]\n };\n }\n }\n\n if (command === 'putMany') {\n const [txId, store, entries, options] = args as WorkerCommandArgs<'putMany'>;\n if (Array.isArray(entries) && entries.length > 0) {\n const packed = packBinaryPairs(entries);\n return {\n args: [txId, store, packed, options],\n transfer: [packed.bytes.buffer]\n };\n }\n }\n\n if (command === 'applyBatch') {\n const [txId, store, ops] = args as WorkerCommandArgs<'applyBatch'>;\n if (Array.isArray(ops) && ops.length > 0) {\n const packed = packBatchOps(ops);\n return {\n args: [txId, store, packed],\n transfer: [packed.bytes.buffer]\n };\n }\n }\n\n return { args, transfer: EMPTY_TRANSFERABLES };\n}\n\nexport function decodeWorkerCommandPayload<M extends WorkerCommand>(\n command: M,\n args: PreparedWorkerCommandArgs<M>\n): WorkerCommandArgs<M> {\n if (command === 'getMany' || command === 'deleteMany') {\n const [txId, store, keys] = args as WorkerCommandArgs<'getMany'> | WorkerCommandArgs<'deleteMany'>;\n if (isPackedBinaryList(keys)) {\n return [txId, store, unpackBinaryList(keys)] as WorkerCommandArgs<M>;\n }\n }\n\n if (command === 'putMany') {\n const [txId, store, entries, options] = args as WorkerCommandArgs<'putMany'>;\n if (isPackedBinaryList(entries)) {\n return [txId, store, unpackBinaryPairs(entries), options] as WorkerCommandArgs<M>;\n }\n }\n\n if (command === 'applyBatch') {\n const [txId, store, ops] = args as WorkerCommandArgs<'applyBatch'>;\n if (isPackedBatchOps(ops)) {\n return [txId, store, unpackBatchOps(ops)] as WorkerCommandArgs<M>;\n }\n }\n\n return args as WorkerCommandArgs<M>;\n}\n\nexport function packedBinaryListBytes(value: unknown): Uint8Array | null {\n return isPackedBinaryList(value) ? value.bytes : null;\n}\n\nexport function packedBatchOpsBytes(value: unknown): Uint8Array | null {\n return isPackedBatchOps(value) ? value.bytes : null;\n}\n\nexport function unpackPackedBinaryList(bytes: Uint8Array): Uint8Array[] {\n return unpackBinaryList({ __moyodbPacked: PACKED_BINARY_LIST_V1, bytes });\n}\n\nexport function unpackPackedBinaryPairs(bytes: Uint8Array): Array<[Uint8Array, Uint8Array]> {\n return unpackBinaryPairs({ __moyodbPacked: PACKED_BINARY_LIST_V1, bytes });\n}\n\nexport function unpackPackedBinaryPairKeys(bytes: Uint8Array): Uint8Array[] {\n return unpackBinaryPairKeys({ __moyodbPacked: PACKED_BINARY_LIST_V1, bytes });\n}\n\nexport function unpackPackedBatchOps(bytes: Uint8Array): Array<BatchOp> {\n return unpackBatchOps({ __moyodbPacked: PACKED_BATCH_OPS_V1, bytes });\n}\n\nexport function unpackPackedBatchOpKeys(bytes: Uint8Array): PackedBatchOpKey[] {\n return unpackBatchOpKeys({ __moyodbPacked: PACKED_BATCH_OPS_V1, bytes });\n}\n\nexport function prepareWorkerResponsePayload<M extends WorkerCommand>(\n command: M,\n result: WorkerCommandResult<M>\n): { result: WorkerCommandResult<M> | unknown; transfer: Transferable[] } {\n if (command === 'getMany') {\n const values = result as WorkerCommandResult<'getMany'>;\n if (Array.isArray(values) && values.length > 0) {\n const packed = packNullableBinaryList(values);\n if (packed) {\n return {\n result: packed,\n transfer: [packed.bytes.buffer]\n };\n }\n }\n return {\n result,\n transfer: collectTransferablesForValue(result)\n };\n }\n\n if (command === 'scan' || command === 'scanByIndex') {\n const rows = result as WorkerCommandResult<'scan'> | WorkerCommandResult<'scanByIndex'>;\n if (Array.isArray(rows) && rows.length > 0) {\n const packed = packScanRows(rows);\n if (packed) {\n return {\n result: packed,\n transfer: [packed.bytes.buffer]\n };\n }\n }\n return {\n result,\n transfer: collectTransferablesForValue(result)\n };\n }\n\n if (command === 'get' || command === 'getByIndex' || command === 'exportSnapshot') {\n return {\n result,\n transfer: collectDirectBinaryTransferable(result)\n };\n }\n\n if (command === 'changesSince') {\n return {\n result,\n transfer: collectChangeFeedTransferables(result)\n };\n }\n\n // The remaining command results are protocol scalars, voids, or JSON-like\n // metadata. Avoid a generic deep walk when the result type cannot contain\n // transfer-worthy binary payloads.\n return {\n result,\n transfer: []\n };\n}\n\nexport function decodeWorkerResponsePayload<M extends WorkerCommand>(\n command: M,\n result: unknown\n): WorkerCommandResult<M> {\n if (command === 'getMany' && isPackedNullableBinaryList(result)) {\n return unpackNullableBinaryList(result) as WorkerCommandResult<M>;\n }\n\n if ((command === 'scan' || command === 'scanByIndex') && isPackedScanRows(result)) {\n return unpackScanRows(result) as WorkerCommandResult<M>;\n }\n\n return result as WorkerCommandResult<M>;\n}\n\nexport function collectTransferablesForValue(value: unknown): Transferable[] {\n const direct = directBinaryTransferable(value);\n if (direct !== null) {\n return [direct];\n }\n if (value === null || value === undefined || typeof value !== 'object') {\n return EMPTY_TRANSFERABLES;\n }\n\n const buffers = new Set<ArrayBuffer>();\n const seen = new WeakSet<object>();\n collectTransferableBuffers(value, buffers, seen);\n return buffers.size === 0 ? EMPTY_TRANSFERABLES : Array.from(buffers);\n}\n\nfunction collectDirectBinaryTransferable(value: unknown): Transferable[] {\n const direct = directBinaryTransferable(value);\n return direct === null ? EMPTY_TRANSFERABLES : [direct];\n}\n\nfunction directBinaryTransferable(value: unknown): ArrayBuffer | null {\n if (value instanceof ArrayBuffer) {\n return value;\n }\n if (ArrayBuffer.isView(value)) {\n const buffer = value.buffer;\n if (buffer instanceof ArrayBuffer && value.byteOffset === 0 && value.byteLength === buffer.byteLength) {\n return buffer;\n }\n }\n return null;\n}\n\nfunction collectChangeFeedTransferables(value: unknown): Transferable[] {\n if (!isRecord(value) || !Array.isArray(value.changes) || value.changes.length === 0) {\n return EMPTY_TRANSFERABLES;\n }\n\n let buffers: Set<ArrayBuffer> | null = null;\n for (const change of value.changes) {\n if (!isRecord(change)) {\n continue;\n }\n const key = directBinaryTransferable(change.key);\n if (key !== null) {\n buffers ??= new Set<ArrayBuffer>();\n buffers.add(key);\n }\n const changedValue = directBinaryTransferable(change.value);\n if (changedValue !== null) {\n buffers ??= new Set<ArrayBuffer>();\n buffers.add(changedValue);\n }\n }\n return buffers === null || buffers.size === 0 ? EMPTY_TRANSFERABLES : Array.from(buffers);\n}\n\nfunction collectTransferableBuffers(value: unknown, buffers: Set<ArrayBuffer>, seen: WeakSet<object>): void {\n if (value === null || value === undefined) {\n return;\n }\n if (value instanceof ArrayBuffer) {\n buffers.add(value);\n return;\n }\n if (ArrayBuffer.isView(value)) {\n const buffer = value.buffer;\n if (buffer instanceof ArrayBuffer && value.byteOffset === 0 && value.byteLength === buffer.byteLength) {\n buffers.add(buffer);\n }\n return;\n }\n if (typeof value !== 'object') {\n return;\n }\n const object = value as object;\n if (seen.has(object)) {\n return;\n }\n seen.add(object);\n if (Array.isArray(value)) {\n for (const item of value) {\n collectTransferableBuffers(item, buffers, seen);\n }\n return;\n }\n const record = value as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key)) {\n collectTransferableBuffers(record[key], buffers, seen);\n }\n }\n}\n\nfunction packBinaryPairs(entries: Array<[Uint8Array, Uint8Array]>): PackedBinaryListV1 {\n const entryCount = entries.length;\n const count = checkedU32(entryCount * 2, 'packed putMany item count');\n const metadataBytes = checkedByteCount(count, 4, 'packed putMany metadata');\n let payloadBytes = 0;\n for (let index = 0; index < entryCount; index += 1) {\n const entry = entries[index]!;\n const key = entry[0];\n const value = entry[1];\n if (!(key instanceof Uint8Array) || !(value instanceof Uint8Array)) {\n throw workerProtocolError('WorkerProtocolError', 'putMany entry key/value is not a Uint8Array');\n }\n const keyLength = checkedU32(key.byteLength, 'putMany key length');\n const valueLength = checkedU32(value.byteLength, 'putMany value length');\n payloadBytes += keyLength + valueLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany payload exceeds 32-bit payload limit');\n }\n }\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed putMany header');\n const totalBytes = checkedAdd(payloadOffset, payloadBytes, 'packed putMany total');\n const bytes = new Uint8Array(totalBytes);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, count, true);\n let metadataOffset = 4;\n let writeOffset = payloadOffset;\n for (let index = 0; index < entryCount; index += 1) {\n const entry = entries[index]!;\n const key = entry[0];\n const value = entry[1];\n const keyLength = key.byteLength;\n const valueLength = value.byteLength;\n view.setUint32(metadataOffset, keyLength, true);\n metadataOffset += 4;\n view.setUint32(metadataOffset, valueLength, true);\n metadataOffset += 4;\n bytes.set(key, writeOffset);\n writeOffset += keyLength;\n bytes.set(value, writeOffset);\n writeOffset += valueLength;\n }\n return {\n __moyodbPacked: PACKED_BINARY_LIST_V1,\n bytes\n };\n}\n\nfunction packBinaryList(items: Uint8Array[]): PackedBinaryListV1 {\n const count = items.length;\n const metadataBytes = checkedByteCount(count, 4, 'packed binary-list metadata');\n let payloadBytes = 0;\n for (let index = 0; index < count; index += 1) {\n const item = items[index]!;\n if (!(item instanceof Uint8Array)) {\n throw workerProtocolError('WorkerProtocolError', 'binary-list payload item is not a Uint8Array');\n }\n const itemLength = checkedU32(item.byteLength, 'binary-list item length');\n payloadBytes += itemLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', 'packed binary-list payload exceeds 32-bit payload limit');\n }\n }\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed binary-list header');\n const totalBytes = checkedAdd(payloadOffset, payloadBytes, 'packed binary-list total');\n const bytes = new Uint8Array(totalBytes);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, count, true);\n let metadataOffset = 4;\n let writeOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const item = items[index]!;\n const itemLength = item.byteLength;\n view.setUint32(metadataOffset, itemLength, true);\n metadataOffset += 4;\n bytes.set(item, writeOffset);\n writeOffset += itemLength;\n }\n return {\n __moyodbPacked: PACKED_BINARY_LIST_V1,\n bytes\n };\n}\n\nfunction unpackBinaryList(payload: PackedBinaryListV1): Uint8Array[] {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed binary-list payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n const metadataBytes = checkedByteCount(count, 4, 'packed binary-list metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed binary-list header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed binary-list metadata exceeds payload length');\n }\n\n const items = new Array<Uint8Array>(count);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const byteLength = view.getUint32(metadataOffset, true);\n metadataOffset += 4;\n const end = readOffset + byteLength;\n if (end > U32_MAX || end > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed binary-list item exceeds payload length');\n }\n items[index] = bytes.subarray(readOffset, end);\n readOffset = end;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed binary-list payload has trailing bytes');\n }\n return items;\n}\n\nfunction unpackBinaryPairs(payload: PackedBinaryListV1): Array<[Uint8Array, Uint8Array]> {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed putMany payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const itemCount = view.getUint32(0, true);\n if (itemCount % 2 !== 0) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany payload has an odd item count');\n }\n const metadataBytes = checkedByteCount(itemCount, 4, 'packed putMany metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed putMany header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany metadata exceeds payload length');\n }\n\n const entryCount = itemCount / 2;\n const entries = new Array<[Uint8Array, Uint8Array]>(entryCount);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < entryCount; index += 1) {\n const keyLength = view.getUint32(metadataOffset, true);\n const valueLength = view.getUint32(metadataOffset + 4, true);\n metadataOffset += 8;\n\n const keyEnd = readOffset + keyLength;\n if (keyEnd > U32_MAX || keyEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany key exceeds payload length');\n }\n const valueEnd = keyEnd + valueLength;\n if (valueEnd > U32_MAX || valueEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany value exceeds payload length');\n }\n entries[index] = [bytes.subarray(readOffset, keyEnd), bytes.subarray(keyEnd, valueEnd)];\n readOffset = valueEnd;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany payload has trailing bytes');\n }\n return entries;\n}\n\nfunction unpackBinaryPairKeys(payload: PackedBinaryListV1): Uint8Array[] {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed putMany payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const itemCount = view.getUint32(0, true);\n if (itemCount % 2 !== 0) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany payload has an odd item count');\n }\n const metadataBytes = checkedByteCount(itemCount, 4, 'packed putMany metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed putMany header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany metadata exceeds payload length');\n }\n\n const entryCount = itemCount / 2;\n const keys = new Array<Uint8Array>(entryCount);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < entryCount; index += 1) {\n const keyLength = view.getUint32(metadataOffset, true);\n const valueLength = view.getUint32(metadataOffset + 4, true);\n metadataOffset += 8;\n\n const keyEnd = readOffset + keyLength;\n if (keyEnd > U32_MAX || keyEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany key exceeds payload length');\n }\n const valueEnd = keyEnd + valueLength;\n if (valueEnd > U32_MAX || valueEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany value exceeds payload length');\n }\n keys[index] = bytes.subarray(readOffset, keyEnd);\n readOffset = valueEnd;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany payload has trailing bytes');\n }\n return keys;\n}\n\nfunction packNullableBinaryList(items: Array<Uint8Array | null>): PackedNullableBinaryListV1 | null {\n const count = items.length;\n const metadataBytes = checkedByteCount(count, 5, 'packed nullable binary-list metadata');\n let payloadBytes = 0;\n for (let index = 0; index < count; index += 1) {\n const item = items[index];\n if (item === null) {\n continue;\n }\n if (!(item instanceof Uint8Array)) {\n throw workerProtocolError(\n 'WorkerProtocolError',\n 'nullable binary-list payload item is not a Uint8Array or null'\n );\n }\n const itemLength = checkedU32(item.byteLength, 'nullable binary-list item length');\n payloadBytes += itemLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError(\n 'WorkerProtocolError',\n 'packed nullable binary-list payload exceeds 32-bit payload limit'\n );\n }\n }\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed nullable binary-list header');\n const totalBytes = checkedAdd(payloadOffset, payloadBytes, 'packed nullable binary-list total');\n if (totalBytes > MAX_PACKED_RESPONSE_BYTES) {\n return null;\n }\n const bytes = new Uint8Array(totalBytes);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, count, true);\n let metadataOffset = 4;\n let writeOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const item = items[index];\n if (item === null) {\n view.setUint8(metadataOffset, 0);\n view.setUint32(metadataOffset + 1, 0, true);\n metadataOffset += 5;\n continue;\n }\n const itemLength = item.byteLength;\n view.setUint8(metadataOffset, 1);\n view.setUint32(metadataOffset + 1, itemLength, true);\n metadataOffset += 5;\n bytes.set(item, writeOffset);\n writeOffset += itemLength;\n }\n return {\n __moyodbPacked: PACKED_NULLABLE_BINARY_LIST_V1,\n bytes\n };\n}\n\nfunction unpackNullableBinaryList(payload: PackedNullableBinaryListV1): Array<Uint8Array | null> {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed nullable binary-list payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n const metadataBytes = checkedByteCount(count, 5, 'packed nullable binary-list metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed nullable binary-list header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed nullable binary-list metadata exceeds payload length');\n }\n\n const items = new Array<Uint8Array | null>(count);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const present = view.getUint8(metadataOffset);\n const byteLength = view.getUint32(metadataOffset + 1, true);\n metadataOffset += 5;\n if (present === 0) {\n if (byteLength !== 0) {\n throw workerProtocolError(\n 'WorkerProtocolError',\n 'packed nullable binary-list null item has a payload length'\n );\n }\n items[index] = null;\n continue;\n }\n if (present !== 1) {\n throw workerProtocolError(\n 'WorkerProtocolError',\n `packed nullable binary-list item has invalid presence byte: ${present}`\n );\n }\n const end = readOffset + byteLength;\n if (end > U32_MAX || end > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed nullable binary-list item exceeds payload length');\n }\n items[index] = bytes.subarray(readOffset, end);\n readOffset = end;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed nullable binary-list payload has trailing bytes');\n }\n return items;\n}\n\nfunction packScanRows(rows: Array<{ key: Uint8Array; value: Uint8Array }>): PackedScanRowsV1 | null {\n const count = rows.length;\n const metadataBytes = checkedByteCount(count, 8, 'packed scan row metadata');\n let payloadBytes = 0;\n for (let index = 0; index < count; index += 1) {\n const row = rows[index]!;\n if (!isRecord(row) || !(row.key instanceof Uint8Array) || !(row.value instanceof Uint8Array)) {\n throw workerProtocolError('WorkerProtocolError', 'scan row payload key/value is not a Uint8Array');\n }\n const keyLength = checkedU32(row.key.byteLength, 'scan row key length');\n const valueLength = checkedU32(row.value.byteLength, 'scan row value length');\n payloadBytes += keyLength + valueLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', 'packed scan row payload exceeds 32-bit payload limit');\n }\n }\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed scan row header');\n const totalBytes = checkedAdd(payloadOffset, payloadBytes, 'packed scan row total');\n if (totalBytes > MAX_PACKED_RESPONSE_BYTES) {\n return null;\n }\n const bytes = new Uint8Array(totalBytes);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, count, true);\n let metadataOffset = 4;\n let writeOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const row = rows[index]!;\n const key = row.key;\n const value = row.value;\n const keyLength = key.byteLength;\n const valueLength = value.byteLength;\n view.setUint32(metadataOffset, keyLength, true);\n view.setUint32(metadataOffset + 4, valueLength, true);\n metadataOffset += 8;\n bytes.set(key, writeOffset);\n writeOffset += keyLength;\n bytes.set(value, writeOffset);\n writeOffset += valueLength;\n }\n return {\n __moyodbPacked: PACKED_SCAN_ROWS_V1,\n bytes\n };\n}\n\nfunction unpackScanRows(payload: PackedScanRowsV1): Array<{ key: Uint8Array; value: Uint8Array }> {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed scan row payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n const metadataBytes = checkedByteCount(count, 8, 'packed scan row metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed scan row header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed scan row metadata exceeds payload length');\n }\n\n const rows = new Array<{ key: Uint8Array; value: Uint8Array }>(count);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const keyLength = view.getUint32(metadataOffset, true);\n const valueLength = view.getUint32(metadataOffset + 4, true);\n metadataOffset += 8;\n const keyEnd = readOffset + keyLength;\n if (keyEnd > U32_MAX || keyEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed scan row key exceeds payload length');\n }\n const valueEnd = keyEnd + valueLength;\n if (valueEnd > U32_MAX || valueEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed scan row value exceeds payload length');\n }\n rows[index] = {\n key: bytes.subarray(readOffset, keyEnd),\n value: bytes.subarray(keyEnd, valueEnd)\n };\n readOffset = valueEnd;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed scan row payload has trailing bytes');\n }\n return rows;\n}\n\nfunction packBatchOps(ops: Array<BatchOp>): PackedBatchOpsV1 {\n const count = ops.length;\n const metadataBytes = checkedByteCount(count, 9, 'packed batch metadata');\n let payloadBytes = 0;\n for (let index = 0; index < count; index += 1) {\n const op = ops[index]!;\n if (op.kind !== 'put' && op.kind !== 'delete') {\n throw workerProtocolError(\n 'WorkerProtocolError',\n `unknown batch operation kind: ${String((op as { kind?: unknown }).kind)}`\n );\n }\n if (!(op.key instanceof Uint8Array)) {\n throw workerProtocolError('WorkerProtocolError', 'batch operation key is not a Uint8Array');\n }\n const keyLength = checkedU32(op.key.byteLength, 'batch operation key length');\n payloadBytes += keyLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch payload exceeds 32-bit payload limit');\n }\n if (op.kind === 'put') {\n if (!(op.value instanceof Uint8Array)) {\n throw workerProtocolError('WorkerProtocolError', 'batch put value is not a Uint8Array');\n }\n const valueLength = checkedU32(op.value.byteLength, 'batch put value length');\n payloadBytes += valueLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch payload exceeds 32-bit payload limit');\n }\n }\n }\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed batch header');\n const totalBytes = checkedAdd(payloadOffset, payloadBytes, 'packed batch total');\n const bytes = new Uint8Array(totalBytes);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, count, true);\n let metadataOffset = 4;\n let writeOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const op = ops[index]!;\n const key = op.key;\n const keyLength = key.byteLength;\n const valueLength = op.kind === 'put' ? op.value.byteLength : 0;\n view.setUint8(metadataOffset, op.kind === 'put' ? BATCH_OP_PUT : BATCH_OP_DELETE);\n view.setUint32(metadataOffset + 1, keyLength, true);\n view.setUint32(metadataOffset + 5, valueLength, true);\n metadataOffset += 9;\n bytes.set(key, writeOffset);\n writeOffset += keyLength;\n if (op.kind === 'put') {\n bytes.set(op.value, writeOffset);\n writeOffset += valueLength;\n }\n }\n return {\n __moyodbPacked: PACKED_BATCH_OPS_V1,\n bytes\n };\n}\n\nfunction unpackBatchOps(payload: PackedBatchOpsV1): Array<BatchOp> {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed batch payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n const metadataBytes = checkedByteCount(count, 9, 'packed batch metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed batch header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch metadata exceeds payload length');\n }\n\n const ops = new Array<BatchOp>(count);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const kind = view.getUint8(metadataOffset);\n const keyLength = view.getUint32(metadataOffset + 1, true);\n const valueLength = view.getUint32(metadataOffset + 5, true);\n metadataOffset += 9;\n\n const keyEnd = readOffset + keyLength;\n if (keyEnd > U32_MAX || keyEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch key exceeds payload length');\n }\n const key = bytes.subarray(readOffset, keyEnd);\n readOffset = keyEnd;\n\n if (kind === BATCH_OP_DELETE) {\n if (valueLength !== 0) {\n throw workerProtocolError('WorkerProtocolError', 'packed delete operation has a value payload');\n }\n ops[index] = { kind: 'delete', key };\n continue;\n }\n\n if (kind !== BATCH_OP_PUT) {\n throw workerProtocolError('WorkerProtocolError', `packed batch operation has invalid kind byte: ${kind}`);\n }\n const valueEnd = readOffset + valueLength;\n if (valueEnd > U32_MAX || valueEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch value exceeds payload length');\n }\n ops[index] = { kind: 'put', key, value: bytes.subarray(readOffset, valueEnd) };\n readOffset = valueEnd;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch payload has trailing bytes');\n }\n return ops;\n}\n\nfunction unpackBatchOpKeys(payload: PackedBatchOpsV1): PackedBatchOpKey[] {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed batch payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n const metadataBytes = checkedByteCount(count, 9, 'packed batch metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed batch header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch metadata exceeds payload length');\n }\n\n const ops = new Array<PackedBatchOpKey>(count);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const kind = view.getUint8(metadataOffset);\n const keyLength = view.getUint32(metadataOffset + 1, true);\n const valueLength = view.getUint32(metadataOffset + 5, true);\n metadataOffset += 9;\n\n const keyEnd = readOffset + keyLength;\n if (keyEnd > U32_MAX || keyEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch key exceeds payload length');\n }\n const key = bytes.subarray(readOffset, keyEnd);\n readOffset = keyEnd;\n\n if (kind === BATCH_OP_DELETE) {\n if (valueLength !== 0) {\n throw workerProtocolError('WorkerProtocolError', 'packed delete operation has a value payload');\n }\n ops[index] = { kind: 'delete', key };\n continue;\n }\n\n if (kind !== BATCH_OP_PUT) {\n throw workerProtocolError('WorkerProtocolError', `packed batch operation has invalid kind byte: ${kind}`);\n }\n const valueEnd = readOffset + valueLength;\n if (valueEnd > U32_MAX || valueEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch value exceeds payload length');\n }\n ops[index] = { kind: 'put', key };\n readOffset = valueEnd;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch payload has trailing bytes');\n }\n return ops;\n}\n\nfunction isPackedBinaryList(value: unknown): value is PackedBinaryListV1 {\n return isRecord(value) && value.__moyodbPacked === PACKED_BINARY_LIST_V1 && value.bytes instanceof Uint8Array;\n}\n\nfunction isPackedNullableBinaryList(value: unknown): value is PackedNullableBinaryListV1 {\n return (\n isRecord(value) && value.__moyodbPacked === PACKED_NULLABLE_BINARY_LIST_V1 && value.bytes instanceof Uint8Array\n );\n}\n\nfunction isPackedScanRows(value: unknown): value is PackedScanRowsV1 {\n return isRecord(value) && value.__moyodbPacked === PACKED_SCAN_ROWS_V1 && value.bytes instanceof Uint8Array;\n}\n\nfunction isPackedBatchOps(value: unknown): value is PackedBatchOpsV1 {\n return isRecord(value) && value.__moyodbPacked === PACKED_BATCH_OPS_V1 && value.bytes instanceof Uint8Array;\n}\n\nfunction checkedByteCount(count: number, itemBytes: number, what: string): number {\n if (!Number.isSafeInteger(count) || count < 0) {\n throw workerProtocolError('WorkerProtocolError', `${what} count is invalid: ${count}`);\n }\n return checkedU32(count * itemBytes, what);\n}\n\nfunction checkedAdd(left: number, right: number, what: string): number {\n const total = left + right;\n return checkedU32(total, what);\n}\n\nfunction checkedU32(value: number, what: string): number {\n if (!Number.isSafeInteger(value) || value < 0 || value > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', `${what} exceeds 32-bit payload limit`);\n }\n return value;\n}\n\nfunction copyToOwnedUint8Array(value: Uint8Array): Uint8Array {\n const owned = new Uint8Array(value.byteLength);\n owned.set(value);\n return owned;\n}\n\nfunction stringOrUndefined(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n","import type { WorkerApi, WorkerOpenRequest } from './worker-api';\nimport type {\n BatchOp,\n ChangeFeed,\n ChangeFeedOptions,\n CompactionResult,\n CreateStoreOptions,\n DebugFailpoint,\n DbStats,\n ExportSnapshotOptions,\n IndexDef,\n PutOptions,\n Range,\n ScanItem,\n StorageInfo,\n TxMode\n} from './types';\nimport {\n WORKER_PROTOCOL_REQUEST,\n WORKER_PROTOCOL_VERSION,\n deserializeWorkerError,\n decodeWorkerResponsePayload,\n isWorkerProtocolReadyMessage,\n isWorkerProtocolResponseMessage,\n prepareWorkerCommandPayload,\n workerProtocolError,\n type WorkerCommand,\n type WorkerCommandArgs,\n type WorkerCommandResult,\n type WorkerProtocolRequestMessage\n} from './worker-protocol';\n\ninterface PendingRequest {\n command: WorkerCommand;\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout> | null;\n}\n\nfunction clearPendingTimeout(pending: PendingRequest): void {\n if (pending.timeout) {\n clearTimeout(pending.timeout);\n }\n}\n\nexport interface WorkerProtocolClientOptions {\n requestTimeoutMs?: number;\n}\n\nexport class WorkerProtocolClient implements WorkerApi {\n private nextRequestId = 1;\n private pending = new Map<number, PendingRequest>();\n private closed = false;\n private readyResolved = false;\n private readyResolve: (() => void) | null = null;\n private readyReject: ((error: Error) => void) | null = null;\n private ready: Promise<void>;\n private requestTimeoutMs: number;\n private fatalHandler: ((error: Error) => void) | null = null;\n private closeReason: Error | null = null;\n\n constructor(\n private readonly worker: Worker,\n options: WorkerProtocolClientOptions = {}\n ) {\n this.requestTimeoutMs = options.requestTimeoutMs ?? 0;\n this.ready = new Promise<void>((resolve, reject) => {\n this.readyResolve = resolve;\n this.readyReject = reject;\n });\n this.worker.addEventListener('message', this.handleMessage);\n this.worker.addEventListener('messageerror', this.handleMessageError);\n this.worker.addEventListener('error', this.handleError);\n }\n\n setFatalHandler(handler: ((error: Error) => void) | null): void {\n this.fatalHandler = handler;\n }\n\n whenReady(): Promise<void> {\n return this.ready;\n }\n\n dispose(reason: Error = workerProtocolError('WorkerTerminatedError', 'worker transport was closed')): void {\n this.disposeInternal(reason, false);\n }\n\n open(request: WorkerOpenRequest): Promise<void> {\n return this.request('open', [request]);\n }\n\n close(): Promise<void> {\n return this.request('close', []);\n }\n\n destroy(): Promise<void> {\n return this.request('destroy', []);\n }\n\n deleteDB(dbName: string): Promise<void> {\n return this.request('deleteDB', [dbName]);\n }\n\n begin(mode: TxMode): Promise<number> {\n return this.request('begin', [mode]);\n }\n\n commit(txId: number): Promise<number> {\n return this.request('commit', [txId]);\n }\n\n rollback(txId: number): Promise<void> {\n return this.request('rollback', [txId]);\n }\n\n createStore(txId: number, name: string, options?: CreateStoreOptions): Promise<void> {\n return this.request('createStore', [txId, name, options]);\n }\n\n dropStore(txId: number, name: string): Promise<void> {\n return this.request('dropStore', [txId, name]);\n }\n\n clearStore(txId: number, name: string): Promise<void> {\n return this.request('clearStore', [txId, name]);\n }\n\n get(txId: number, store: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.request('get', [txId, store, key]);\n }\n\n getMany(txId: number, store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n return this.request('getMany', [txId, store, keys]);\n }\n\n has(txId: number, store: string, key: Uint8Array): Promise<boolean> {\n return this.request('has', [txId, store, key]);\n }\n\n put(txId: number, store: string, key: Uint8Array, value: Uint8Array, options?: PutOptions): Promise<void> {\n return this.request('put', [txId, store, key, value, options]);\n }\n\n putMany(\n txId: number,\n store: string,\n entries: Array<[Uint8Array, Uint8Array]>,\n options?: PutOptions\n ): Promise<void> {\n return this.request('putMany', [txId, store, entries, options]);\n }\n\n delete(txId: number, store: string, key: Uint8Array): Promise<boolean> {\n return this.request('delete', [txId, store, key]);\n }\n\n deleteMany(txId: number, store: string, keys: Array<Uint8Array>): Promise<void> {\n return this.request('deleteMany', [txId, store, keys]);\n }\n\n applyBatch(txId: number, store: string, ops: Array<BatchOp>): Promise<void> {\n return this.request('applyBatch', [txId, store, ops]);\n }\n\n scan(txId: number, store: string, range: Range): Promise<ScanItem[]> {\n return this.request('scan', [txId, store, range]);\n }\n\n getByIndex(txId: number, store: string, indexName: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.request('getByIndex', [txId, store, indexName, key]);\n }\n\n scanByIndex(txId: number, store: string, indexName: string, range: Range): Promise<ScanItem[]> {\n return this.request('scanByIndex', [txId, store, indexName, range]);\n }\n\n getIndexes(): Promise<IndexDef[]> {\n return this.request('getIndexes', []);\n }\n\n reconcileIndexes(txId: number, indexes: IndexDef[]): Promise<void> {\n return this.request('reconcileIndexes', [txId, indexes]);\n }\n\n listStores(): Promise<string[]> {\n return this.request('listStores', []);\n }\n\n getVersion(): Promise<number> {\n return this.request('getVersion', []);\n }\n\n changesSince(txId: number, options: ChangeFeedOptions): Promise<ChangeFeed> {\n return this.request('changesSince', [txId, options]);\n }\n\n setSchemaVersion(txId: number, version: number): Promise<void> {\n return this.request('setSchemaVersion', [txId, version]);\n }\n\n exportSnapshot(options?: ExportSnapshotOptions): Promise<Uint8Array> {\n return this.request('exportSnapshot', [options]);\n }\n\n importSnapshot(data: Uint8Array): Promise<void> {\n return this.request('importSnapshot', [data]);\n }\n\n reset(): Promise<void> {\n return this.request('reset', []);\n }\n\n compact(): Promise<CompactionResult> {\n return this.request('compact', []);\n }\n\n rebuild(): Promise<CompactionResult> {\n return this.request('rebuild', []);\n }\n\n stats(): Promise<DbStats> {\n return this.request('stats', []);\n }\n\n storageInfo(): Promise<StorageInfo> {\n return this.request('storageInfo', []);\n }\n\n requestPersistence(): Promise<boolean> {\n return this.request('requestPersistence', []);\n }\n\n setFailpoint(failpoint: DebugFailpoint): Promise<void> {\n return this.request('setFailpoint', [failpoint]);\n }\n\n async request<M extends WorkerCommand>(command: M, args: WorkerCommandArgs<M>): Promise<WorkerCommandResult<M>> {\n this.ensureOpen();\n await this.ready;\n this.ensureOpen();\n const id = this.nextRequestId;\n this.nextRequestId += 1;\n const prepared = prepareWorkerCommandPayload(command, args);\n const message: WorkerProtocolRequestMessage = {\n type: WORKER_PROTOCOL_REQUEST,\n version: WORKER_PROTOCOL_VERSION,\n id,\n command,\n args: prepared.args\n } as WorkerProtocolRequestMessage;\n return await new Promise<WorkerCommandResult<M>>((resolve, reject) => {\n const timeout =\n this.requestTimeoutMs > 0\n ? setTimeout(() => {\n this.pending.delete(id);\n reject(\n workerProtocolError(\n 'WorkerRequestTimeoutError',\n `worker command ${command} timed out after ${this.requestTimeoutMs}ms`\n )\n );\n }, this.requestTimeoutMs)\n : null;\n this.pending.set(id, {\n command,\n resolve: (value) => resolve(value as WorkerCommandResult<M>),\n reject,\n timeout\n });\n try {\n if (prepared.transfer.length > 0) {\n this.worker.postMessage(message, prepared.transfer);\n } else {\n this.worker.postMessage(message);\n }\n } catch (error) {\n this.rejectPending(id, error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n private ensureOpen(): void {\n if (this.closed) {\n throw this.closeReason ?? workerProtocolError('WorkerTerminatedError', 'worker transport is closed');\n }\n }\n\n private handleMessage = (event: MessageEvent<unknown>): void => {\n const data = event.data;\n if (isWorkerProtocolReadyMessage(data)) {\n this.readyResolved = true;\n this.readyResolve?.();\n this.readyResolve = null;\n this.readyReject = null;\n return;\n }\n if (!isWorkerProtocolResponseMessage(data)) {\n return;\n }\n const pending = this.pending.get(data.id);\n if (!pending) {\n return;\n }\n this.pending.delete(data.id);\n clearPendingTimeout(pending);\n if (data.ok) {\n pending.resolve(decodeWorkerResponsePayload(pending.command, data.result));\n return;\n }\n pending.reject(deserializeWorkerError(data.error));\n };\n\n private handleMessageError = (): void => {\n this.disposeInternal(\n workerProtocolError('WorkerMessageError', 'worker message could not be deserialized'),\n true\n );\n };\n\n private handleError = (event: ErrorEvent): void => {\n const error =\n event.error instanceof Error\n ? event.error\n : workerProtocolError('WorkerError', event.message || 'worker runtime failed');\n this.disposeInternal(error, true);\n };\n\n private rejectPending(id: number, error: Error): void {\n const pending = this.pending.get(id);\n if (!pending) {\n return;\n }\n this.pending.delete(id);\n clearPendingTimeout(pending);\n pending.reject(error);\n }\n\n private disposeInternal(reason: Error, notifyFatal: boolean): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.closeReason = reason;\n this.worker.removeEventListener('message', this.handleMessage);\n this.worker.removeEventListener('messageerror', this.handleMessageError);\n this.worker.removeEventListener('error', this.handleError);\n if (!this.readyResolved) {\n this.readyReject?.(reason);\n }\n this.readyResolve = null;\n this.readyReject = null;\n for (const pending of this.pending.values()) {\n clearPendingTimeout(pending);\n pending.reject(reason);\n }\n this.pending.clear();\n if (notifyFatal) {\n this.fatalHandler?.(reason);\n }\n }\n}\n","export class MoyoDbError extends Error {\n constructor(name: string, message: string) {\n super(message);\n this.name = name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class UnsupportedPlatformError extends MoyoDbError {\n constructor(message: string) {\n super('UnsupportedPlatformError', message);\n }\n}\nexport class DatabaseBusyError extends MoyoDbError {\n constructor(message: string) {\n super('DatabaseBusyError', message);\n }\n}\nexport class CorruptionError extends MoyoDbError {\n constructor(message: string) {\n super('CorruptionError', message);\n }\n}\nexport class StoreExistsError extends MoyoDbError {\n constructor(message: string) {\n super('StoreExistsError', message);\n }\n}\nexport class StoreNotFoundError extends MoyoDbError {\n constructor(message: string) {\n super('StoreNotFoundError', message);\n }\n}\nexport class IndexNotFoundError extends MoyoDbError {\n constructor(message: string) {\n super('IndexNotFoundError', message);\n }\n}\nexport class ConstraintError extends MoyoDbError {\n constructor(message: string) {\n super('ConstraintError', message);\n }\n}\nexport class UniqueIndexConstraintError extends ConstraintError {\n constructor(message: string) {\n super(message);\n this.name = 'UniqueIndexConstraintError';\n }\n}\nexport class WriteTransactionAlreadyOpenError extends MoyoDbError {\n constructor(message = 'write transaction already open') {\n super('WriteTransactionAlreadyOpenError', message);\n }\n}\nexport class ReadonlyTransactionError extends MoyoDbError {\n constructor(message = 'readonly transaction cannot perform this operation') {\n super('ReadonlyTransactionError', message);\n }\n}\nexport class TransactionClosedError extends MoyoDbError {\n constructor(message = 'transaction is already closed') {\n super('TransactionClosedError', message);\n }\n}\nexport class DatabaseClosedError extends MoyoDbError {\n constructor(message = 'database handle is closed') {\n super('DatabaseClosedError', message);\n }\n}\nexport class ValueTooLargeError extends MoyoDbError {\n constructor(message: string) {\n super('ValueTooLargeError', message);\n }\n}\nexport class KeyTooLargeError extends MoyoDbError {\n constructor(message: string) {\n super('KeyTooLargeError', message);\n }\n}\nexport class StoreNameTooLongError extends MoyoDbError {\n constructor(message: string) {\n super('StoreNameTooLongError', message);\n }\n}\nexport class ReservedStoreNameError extends MoyoDbError {\n constructor(message: string) {\n super('ReservedStoreNameError', message);\n }\n}\nexport class InvalidRangeError extends MoyoDbError {\n constructor(message: string) {\n super('InvalidRangeError', message);\n }\n}\nexport class StorageError extends MoyoDbError {\n constructor(message: string) {\n super('StorageError', message);\n }\n}\nexport class SerializationError extends MoyoDbError {\n constructor(message: string) {\n super('SerializationError', message);\n }\n}\nexport class InjectedFailureError extends MoyoDbError {\n constructor(message: string) {\n super('InjectedFailureError', message);\n }\n}\nexport class ChangeFeedCompactedError extends MoyoDbError {\n constructor(message: string) {\n super('ChangeFeedCompactedError', message);\n }\n}\nexport class InternalError extends MoyoDbError {\n constructor(message: string) {\n super('InternalError', message);\n }\n}\nexport class InvalidOpenOptionsError extends MoyoDbError {\n constructor(message: string) {\n super('InvalidOpenOptionsError', message);\n }\n}\nexport class VersionError extends MoyoDbError {\n constructor(message: string) {\n super('VersionError', message);\n }\n}\ntype ErrorPayload = {\n code?: string;\n name?: string;\n message?: string;\n};\ntype ErrorConstructor = new (message: string) => Error;\nconst ERROR_CONSTRUCTORS = {\n UnsupportedPlatformError,\n DatabaseBusyError,\n CorruptionError,\n StoreExistsError,\n StoreNotFoundError,\n IndexNotFoundError,\n ConstraintError,\n UniqueIndexConstraintError,\n WriteTransactionAlreadyOpenError,\n ReadonlyTransactionError,\n TransactionClosedError,\n DatabaseClosedError,\n ValueTooLargeError,\n KeyTooLargeError,\n StoreNameTooLongError,\n ReservedStoreNameError,\n InvalidRangeError,\n StorageError,\n SerializationError,\n InjectedFailureError,\n ChangeFeedCompactedError,\n InternalError,\n InvalidOpenOptionsError,\n VersionError\n} satisfies Record<string, ErrorConstructor>;\n\nfunction instantiateError(code: string, message: string): Error {\n const ErrorConstructor = ERROR_CONSTRUCTORS[code as keyof typeof ERROR_CONSTRUCTORS];\n if (ErrorConstructor) {\n return new ErrorConstructor(message);\n }\n const err = new Error(message);\n err.name = code;\n return err;\n}\n\nexport function normalizeError(error: unknown): Error {\n if (error instanceof MoyoDbError) {\n return error;\n }\n if (error instanceof Error) {\n if (error.name === 'Error') {\n return error;\n }\n return instantiateError(error.name, error.message);\n }\n const payload = error as ErrorPayload | undefined;\n const code = payload?.code ?? payload?.name ?? 'Error';\n const message = payload?.message ?? String(error);\n return instantiateError(code, message);\n}\n","import { WorkerProtocolClient } from './worker-client';\nimport type { DebugFailpoint, OpenOptions } from './types';\nimport { InvalidOpenOptionsError, normalizeError } from './errors';\nimport { withTimeout } from './internal';\nconst VALID_FAILPOINTS = new Set<Exclude<DebugFailpoint, null>>([\n 'after_wal_flush',\n 'after_main_flush',\n 'before_superblock_flush'\n]);\nconst PERSISTENCE_BRIDGE_INIT = 'moyodb:persistence-bridge:init';\nconst PERSISTENCE_BRIDGE_REQUEST = 'moyodb:persistence-bridge:request';\nconst PERSISTENCE_BRIDGE_RESPONSE = 'moyodb:persistence-bridge:response';\ntype PersistenceBridgeOperation = 'persist' | 'persisted';\ninterface PersistenceBridgeRequest {\n type: typeof PERSISTENCE_BRIDGE_REQUEST;\n id: number;\n op: PersistenceBridgeOperation;\n}\ninterface PersistenceBridgeResponse {\n type: typeof PERSISTENCE_BRIDGE_RESPONSE;\n id: number;\n granted: boolean;\n}\ninterface MainThreadPersistenceBridge {\n close(): void;\n}\nexport interface NormalizedOpenOptions {\n createIfMissing: boolean;\n ownerWaitMs: number;\n requestPersistence: boolean;\n cachePages: number;\n debugFailpoint: DebugFailpoint;\n}\nexport interface RegistryEntry {\n dbName: string;\n refs: number;\n worker: Worker;\n proxy: WorkerProtocolClient;\n persistenceBridge: MainThreadPersistenceBridge;\n options: NormalizedOpenOptions;\n invalidated: boolean;\n txInvalidationListeners: Set<() => void>;\n handleInvalidationListeners: Set<() => void>;\n}\nconst registry = new Map<string, RegistryEntry>();\nfunction requirePlainOptionsObject(options: OpenOptions): asserts options is OpenOptions {\n if (options === null || typeof options !== 'object' || Array.isArray(options)) {\n throw new InvalidOpenOptionsError('open options must be an object');\n }\n}\nfunction normalizeBoolean(value: unknown, field: string, defaultValue: boolean): boolean {\n if (value === undefined) {\n return defaultValue;\n }\n if (typeof value !== 'boolean') {\n throw new InvalidOpenOptionsError(`${field} must be a boolean`);\n }\n return value;\n}\nfunction normalizeNonNegativeInteger(value: unknown, field: string, defaultValue: number): number {\n if (value === undefined) {\n return defaultValue;\n }\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) {\n throw new InvalidOpenOptionsError(`${field} must be a non-negative safe integer`);\n }\n return value;\n}\nfunction normalizeCachePages(value: unknown): number {\n return Math.max(1, normalizeNonNegativeInteger(value, 'cachePages', 256));\n}\nfunction normalizeFailpoint(value: unknown): DebugFailpoint {\n if (value === undefined || value === null) {\n return null;\n }\n if (typeof value !== 'string' || !VALID_FAILPOINTS.has(value as Exclude<DebugFailpoint, null>)) {\n throw new InvalidOpenOptionsError(`debugFailpoint must be one of: ${Array.from(VALID_FAILPOINTS).join(', ')}`);\n }\n return value as Exclude<DebugFailpoint, null>;\n}\nfunction normalizeOptions(options: OpenOptions = {}): NormalizedOpenOptions {\n requirePlainOptionsObject(options);\n return {\n createIfMissing: normalizeBoolean(options.createIfMissing, 'createIfMissing', true),\n ownerWaitMs: normalizeNonNegativeInteger(options.ownerWaitMs, 'ownerWaitMs', 0),\n requestPersistence: normalizeBoolean(options.requestPersistence, 'requestPersistence', true),\n cachePages: normalizeCachePages(options.cachePages),\n debugFailpoint: normalizeFailpoint(options.debugFailpoint)\n };\n}\nfunction assertCompatibleOptions(dbName: string, current: NormalizedOpenOptions, next: NormalizedOpenOptions) {\n if (current.cachePages !== next.cachePages) {\n throw new InvalidOpenOptionsError(\n `database ${dbName} is already open in this tab with cachePages=${current.cachePages}; requested cachePages=${next.cachePages}`\n );\n }\n}\nasync function queryPersistentStorageState(): Promise<boolean> {\n const storage = globalThis.navigator?.storage;\n if (typeof storage?.persisted !== 'function') {\n return false;\n }\n return await withTimeout(storage.persisted(), 1000, false);\n}\nasync function requestPersistentStorageGrant(): Promise<boolean> {\n const storage = globalThis.navigator?.storage;\n if (typeof storage?.persist !== 'function') {\n return false;\n }\n return await withTimeout(storage.persist(), 1000, false);\n}\nasync function handlePersistenceBridgeRequest(port: MessagePort, request: PersistenceBridgeRequest): Promise<void> {\n const granted =\n request.op === 'persist' ? await requestPersistentStorageGrant() : await queryPersistentStorageState();\n const response: PersistenceBridgeResponse = {\n type: PERSISTENCE_BRIDGE_RESPONSE,\n id: request.id,\n granted\n };\n port.postMessage(response);\n}\nfunction createMainThreadPersistenceBridge(worker: Worker): MainThreadPersistenceBridge {\n const channel = new MessageChannel();\n const port = channel.port1;\n port.addEventListener('message', (event: MessageEvent<PersistenceBridgeRequest>) => {\n const data = event.data;\n if (!data || data.type !== PERSISTENCE_BRIDGE_REQUEST) {\n return;\n }\n void handlePersistenceBridgeRequest(port, data);\n });\n port.start();\n worker.postMessage({ type: PERSISTENCE_BRIDGE_INIT }, [channel.port2]);\n return {\n close() {\n port.close();\n }\n };\n}\nfunction createWorker(): {\n worker: Worker;\n proxy: WorkerProtocolClient;\n persistenceBridge: MainThreadPersistenceBridge;\n} {\n const worker = new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' });\n const proxy = new WorkerProtocolClient(worker);\n const persistenceBridge = createMainThreadPersistenceBridge(worker);\n return { worker, proxy, persistenceBridge };\n}\nfunction createEntry(\n dbName: string,\n worker: Worker,\n proxy: WorkerProtocolClient,\n persistenceBridge: MainThreadPersistenceBridge,\n options: NormalizedOpenOptions\n): RegistryEntry {\n const entry: RegistryEntry = {\n dbName,\n refs: 1,\n worker,\n proxy,\n persistenceBridge,\n options,\n invalidated: false,\n txInvalidationListeners: new Set(),\n handleInvalidationListeners: new Set()\n };\n proxy.setFatalHandler(() => {\n const current = registry.get(dbName);\n if (current !== entry || entry.invalidated) {\n return;\n }\n registry.delete(dbName);\n entry.refs = 0;\n invalidateEntry(entry);\n entry.persistenceBridge.close();\n entry.worker.terminate();\n });\n return entry;\n}\nfunction emitListeners(listeners: Iterable<() => void>) {\n for (const listener of Array.from(listeners)) {\n listener();\n }\n}\nexport function subscribeTransactionsInvalidated(entry: RegistryEntry, listener: () => void): () => void {\n entry.txInvalidationListeners.add(listener);\n return () => {\n entry.txInvalidationListeners.delete(listener);\n };\n}\nexport function subscribeHandleInvalidated(entry: RegistryEntry, listener: () => void): () => void {\n entry.handleInvalidationListeners.add(listener);\n return () => {\n entry.handleInvalidationListeners.delete(listener);\n };\n}\nexport function invalidateTransactions(entry: RegistryEntry): void {\n emitListeners(entry.txInvalidationListeners);\n}\nfunction invalidateEntry(entry: RegistryEntry): void {\n if (entry.invalidated) {\n return;\n }\n entry.invalidated = true;\n invalidateTransactions(entry);\n emitListeners(entry.handleInvalidationListeners);\n}\nexport function unsafeDebugCrashWorker(dbName: string): boolean {\n const current = registry.get(dbName);\n if (!current) {\n return false;\n }\n registry.delete(dbName);\n invalidateEntry(current);\n current.refs = 0;\n current.persistenceBridge.close();\n current.proxy.dispose(new Error('worker was terminated by unsafeDebugCrashWorker'));\n current.worker.terminate();\n return true;\n}\nexport async function acquireDbWorker(dbName: string, options: OpenOptions = {}): Promise<RegistryEntry> {\n const normalized = normalizeOptions(options);\n const existing = registry.get(dbName);\n if (existing) {\n if (existing.invalidated) {\n registry.delete(dbName);\n } else {\n assertCompatibleOptions(dbName, existing.options, normalized);\n if (normalized.debugFailpoint !== null) {\n try {\n await existing.proxy.setFailpoint(normalized.debugFailpoint);\n } catch (error) {\n throw normalizeError(error);\n }\n }\n existing.refs += 1;\n return existing;\n }\n }\n const { worker, proxy, persistenceBridge } = createWorker();\n const entry = createEntry(dbName, worker, proxy, persistenceBridge, normalized);\n try {\n await proxy.open({\n dbName,\n options: normalized\n });\n registry.set(dbName, entry);\n return entry;\n } catch (error) {\n persistenceBridge.close();\n proxy.dispose(new Error('worker open failed'));\n worker.terminate();\n throw normalizeError(error);\n }\n}\nexport async function releaseDbWorker(entry: RegistryEntry): Promise<void> {\n if (entry.invalidated) {\n return;\n }\n const current = registry.get(entry.dbName);\n if (!current) {\n return;\n }\n current.refs -= 1;\n if (current.refs > 0) {\n return;\n }\n registry.delete(entry.dbName);\n try {\n await current.proxy.close();\n } finally {\n current.persistenceBridge.close();\n current.proxy.dispose(new Error('worker was released'));\n current.worker.terminate();\n }\n}\nexport async function destroyDbWorker(entry: RegistryEntry): Promise<void> {\n const current = registry.get(entry.dbName) ?? entry;\n registry.delete(entry.dbName);\n invalidateEntry(current);\n current.refs = 0;\n try {\n await current.proxy.destroy();\n } catch (error) {\n throw normalizeError(error);\n } finally {\n current.persistenceBridge.close();\n current.proxy.dispose(new Error('worker was released'));\n current.worker.terminate();\n }\n}\nexport async function deleteDbByName(dbName: string): Promise<void> {\n const current = registry.get(dbName);\n if (current) {\n await destroyDbWorker(current);\n return;\n }\n const { worker, proxy, persistenceBridge } = createWorker();\n try {\n await proxy.deleteDB(dbName);\n } catch (error) {\n throw normalizeError(error);\n } finally {\n persistenceBridge.close();\n proxy.dispose(new Error('temporary worker was terminated'));\n worker.terminate();\n }\n}\n","import type { Range } from './types';\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst TYPE_NULL = 0x10;\nconst TYPE_FALSE = 0x20;\nconst TYPE_TRUE = 0x21;\nconst TYPE_NUMBER = 0x30;\nconst TYPE_STRING = 0x40;\nconst TYPE_BYTES = 0x50;\nconst COMPOUND_ESCAPE = 0x00;\nconst COMPOUND_ESCAPE_CONT = 0xff;\nconst COMPOUND_TERM = 0x00;\nconst F64_MASK = 0xffffffffffffffffn;\nexport type CompoundKeyPart = string | number | boolean | null | Uint8Array;\nexport type IndexKeyPrimitive = CompoundKeyPart;\nexport function utf8Encode(value: string): Uint8Array {\n return encoder.encode(value);\n}\nexport function utf8Decode(bytes: Uint8Array): string {\n return decoder.decode(bytes);\n}\nexport function jsonEncode(value: unknown): Uint8Array {\n return utf8Encode(JSON.stringify(value));\n}\nexport function jsonDecode<T>(bytes: Uint8Array): T {\n return JSON.parse(utf8Decode(bytes)) as T;\n}\nexport function u64Key(value: bigint | number): Uint8Array {\n const asBigInt = typeof value === 'bigint' ? value : BigInt(value);\n if (asBigInt < 0n) {\n throw new RangeError('u64Key only accepts non-negative values');\n }\n const buf = new ArrayBuffer(8);\n const view = new DataView(buf);\n view.setBigUint64(0, asBigInt, false);\n return new Uint8Array(buf);\n}\nexport function indexKey(value: CompoundKeyPart | ReadonlyArray<CompoundKeyPart>): Uint8Array {\n if (Array.isArray(value)) {\n return compoundKey(...value);\n }\n return encodeCompoundKeyPart(value as CompoundKeyPart);\n}\nexport function compoundKey(...parts: CompoundKeyPart[]): Uint8Array {\n return encodeCompoundBytes(parts.map((part) => encodeCompoundKeyPart(part)));\n}\nexport function encodeIndexScalar(value: IndexKeyPrimitive): Uint8Array {\n return encodeCompoundKeyPart(value);\n}\nexport function encodeCompoundKeyParts(parts: ReadonlyArray<Uint8Array>): Uint8Array {\n return encodeCompoundBytes(parts);\n}\nexport function splitCompoundKey(key: Uint8Array): Uint8Array[] {\n const parts: Uint8Array[] = [];\n const current: number[] = [];\n for (let index = 0; index < key.length; index += 1) {\n const byte = key[index]!;\n if (byte !== COMPOUND_ESCAPE) {\n current.push(byte);\n continue;\n }\n const next = key[index + 1];\n if (next === COMPOUND_ESCAPE_CONT) {\n current.push(COMPOUND_ESCAPE);\n index += 1;\n continue;\n }\n if (next === COMPOUND_TERM) {\n parts.push(Uint8Array.from(current));\n current.length = 0;\n index += 1;\n continue;\n }\n throw new TypeError('invalid compound key encoding');\n }\n if (current.length !== 0) {\n throw new TypeError('compound key terminated unexpectedly');\n }\n return parts;\n}\nexport function prefixSuccessor(prefix: Uint8Array): Uint8Array | null {\n const out = prefix.slice();\n for (let index = out.length - 1; index >= 0; index -= 1) {\n if (out[index] !== 0xff) {\n out[index] += 1;\n return out.subarray(0, index + 1);\n }\n }\n return null;\n}\nexport function prefixRange(prefix: Uint8Array): Range {\n const upper = prefixSuccessor(prefix);\n return upper ? { gte: prefix, lt: upper } : { gte: prefix };\n}\nexport function compoundKeyRange(...parts: CompoundKeyPart[]): Range {\n return prefixRange(compoundKey(...parts));\n}\nfunction encodeCompoundKeyPart(value: CompoundKeyPart): Uint8Array {\n if (value === null) {\n return Uint8Array.of(TYPE_NULL);\n }\n if (typeof value === 'boolean') {\n return Uint8Array.of(value ? TYPE_TRUE : TYPE_FALSE);\n }\n if (typeof value === 'number') {\n return encodeSortableNumber(value);\n }\n if (typeof value === 'string') {\n const body = utf8Encode(value);\n const out = new Uint8Array(1 + body.length);\n out[0] = TYPE_STRING;\n out.set(body, 1);\n return out;\n }\n if (value instanceof Uint8Array) {\n const out = new Uint8Array(1 + value.length);\n out[0] = TYPE_BYTES;\n out.set(value, 1);\n return out;\n }\n throw new TypeError('compound key parts must be string, number, boolean, null, or Uint8Array');\n}\nfunction encodeCompoundBytes(parts: ReadonlyArray<Uint8Array>): Uint8Array {\n let length = 0;\n for (const part of parts) {\n for (const byte of part) {\n length += byte === COMPOUND_ESCAPE ? 2 : 1;\n }\n length += 2;\n }\n const out = new Uint8Array(length);\n let offset = 0;\n for (const part of parts) {\n for (const byte of part) {\n if (byte === COMPOUND_ESCAPE) {\n out[offset] = COMPOUND_ESCAPE;\n out[offset + 1] = COMPOUND_ESCAPE_CONT;\n offset += 2;\n } else {\n out[offset] = byte;\n offset += 1;\n }\n }\n out[offset] = COMPOUND_TERM;\n out[offset + 1] = COMPOUND_TERM;\n offset += 2;\n }\n return out;\n}\nfunction encodeSortableNumber(value: number): Uint8Array {\n if (!Number.isFinite(value)) {\n throw new TypeError('compound key number parts must be finite');\n }\n const normalized = Object.is(value, -0) ? 0 : value;\n const buffer = new ArrayBuffer(9);\n const view = new DataView(buffer);\n view.setUint8(0, TYPE_NUMBER);\n view.setFloat64(1, normalized, false);\n let bits = view.getBigUint64(1, false);\n bits = (bits & (1n << 63n)) !== 0n ? ~bits & F64_MASK : bits ^ (1n << 63n);\n view.setBigUint64(1, bits, false);\n return new Uint8Array(buffer);\n}\n","import { InvalidOpenOptionsError, ReservedStoreNameError, SerializationError } from './errors';\nimport { compareStringsByCodeUnit } from './internal';\nimport {\n encodeCompoundKeyParts,\n encodeIndexScalar,\n prefixRange,\n prefixSuccessor,\n splitCompoundKey,\n utf8Encode,\n type IndexKeyPrimitive\n} from './codec';\nimport type { IndexDef, Range } from './types';\nconst encoder = new TextEncoder();\nconst fatalDecoder = new TextDecoder('utf-8', { fatal: true });\nconst MISSING = Symbol('moyodb.indexing.missing');\nconst FNV64_OFFSET = 0xcbf29ce484222325n;\nconst FNV64_PRIME = 0x100000001b3n;\nconst FNV64_MASK = 0xffffffffffffffffn;\n// Legacy SDK internal namespace preserved for storage-format compatibility; do not rename without a migration.\nconst INTERNAL_STORE_PREFIX = '__browserdb:';\nconst INTERNAL_INDEX_STORE_PREFIX = '__browserdb:index:';\nexport const INDEX_METADATA_STORE = '__browserdb:indexes';\nexport interface NormalizedIndexDef {\n store: string;\n name: string;\n keyPath: string[];\n compound: boolean;\n unique: boolean;\n internalStore: string;\n}\nexport interface DecodedIndexEntryKey {\n logicalKey: Uint8Array;\n primaryKey: Uint8Array;\n}\nexport function isInternalStoreName(name: string): boolean {\n return name.startsWith(INTERNAL_STORE_PREFIX);\n}\nexport function assertPublicStoreName(name: string): void {\n if (isInternalStoreName(name)) {\n throw new ReservedStoreNameError(`reserved store name: ${name}`);\n }\n}\nexport function normalizeIndexDefinitions(value: unknown): NormalizedIndexDef[] {\n if (value === undefined) {\n return [];\n }\n if (!Array.isArray(value)) {\n throw new InvalidOpenOptionsError('indexes must be an array');\n }\n const normalized: NormalizedIndexDef[] = [];\n const identities = new Set<string>();\n const internalStores = new Map<string, string>();\n for (const entry of value) {\n if (entry === null || typeof entry !== 'object' || Array.isArray(entry)) {\n throw new InvalidOpenOptionsError('each index definition must be an object');\n }\n const { store, name, keyPath, unique } = entry as {\n store?: unknown;\n name?: unknown;\n keyPath?: unknown;\n unique?: unknown;\n };\n if (typeof store !== 'string' || store.length === 0) {\n throw new InvalidOpenOptionsError('index store must be a non-empty string');\n }\n if (typeof name !== 'string' || name.length === 0) {\n throw new InvalidOpenOptionsError('index name must be a non-empty string');\n }\n assertPublicStoreName(store);\n const keyPathInfo = normalizeIndexKeyPath(keyPath);\n if (unique !== undefined && typeof unique !== 'boolean') {\n throw new InvalidOpenOptionsError('index unique must be a boolean');\n }\n const def: NormalizedIndexDef = {\n store,\n name,\n keyPath: keyPathInfo.paths,\n compound: keyPathInfo.compound,\n unique: unique ?? false,\n internalStore: makeInternalIndexStoreName(store, name)\n };\n const identity = indexDefinitionIdentity(def.store, def.name);\n if (identities.has(identity)) {\n throw new InvalidOpenOptionsError(`duplicate index definition ${def.store}.${def.name}`);\n }\n identities.add(identity);\n const mappedIdentity = internalStores.get(def.internalStore);\n if (mappedIdentity && mappedIdentity !== identity) {\n throw new InvalidOpenOptionsError(\n `index definitions ${mappedIdentity} and ${identity} map to the same internal store ${def.internalStore}`\n );\n }\n internalStores.set(def.internalStore, identity);\n normalized.push(def);\n }\n normalized.sort(compareNormalizedIndexDefinitions);\n return normalized;\n}\nexport function compareNormalizedIndexDefinitions(left: NormalizedIndexDef, right: NormalizedIndexDef): number {\n const storeCompare = compareStringsByCodeUnit(left.store, right.store);\n if (storeCompare !== 0) {\n return storeCompare;\n }\n const nameCompare = compareStringsByCodeUnit(left.name, right.name);\n if (nameCompare !== 0) {\n return nameCompare;\n }\n const uniqueCompare = Number(left.unique) - Number(right.unique);\n if (uniqueCompare !== 0) {\n return uniqueCompare;\n }\n return compareStringsByCodeUnit(serializeIndexKeyPath(left), serializeIndexKeyPath(right));\n}\nexport function indexDefinitionIdentity(store: string, name: string): string {\n return `${store}\\u0000${name}`;\n}\nexport function findIndexDefinition(\n defs: ReadonlyArray<NormalizedIndexDef>,\n store: string,\n name: string\n): NormalizedIndexDef | null {\n return defs.find((def) => def.store === store && def.name === name) ?? null;\n}\nexport function indexesForStore(defs: ReadonlyArray<NormalizedIndexDef>, store: string): NormalizedIndexDef[] {\n return defs.filter((def) => def.store === store);\n}\nexport function encodeIndexMetadataKey(store: string, name: string): Uint8Array {\n return encodeCompoundKeyParts([utf8Encode(store), utf8Encode(name)]);\n}\nexport function encodeIndexMetadataValue(def: NormalizedIndexDef): Uint8Array {\n return utf8Encode(JSON.stringify(toPublicIndexDefinition(def)));\n}\nexport function decodeIndexMetadataValue(bytes: Uint8Array): NormalizedIndexDef {\n let parsed: unknown;\n try {\n parsed = JSON.parse(fatalDecoder.decode(bytes));\n } catch (error) {\n throw new SerializationError(`invalid persisted index metadata: ${String(error)}`);\n }\n const [def] = normalizeIndexDefinitions([parsed]);\n return def;\n}\nexport function encodeIndexEntryKey(logicalIndexKey: Uint8Array, primaryKey: Uint8Array): Uint8Array {\n return encodeCompoundKeyParts([logicalIndexKey, primaryKey]);\n}\nexport function decodeIndexEntryKey(bytes: Uint8Array): DecodedIndexEntryKey {\n const parts = splitCompoundKey(bytes);\n if (parts.length !== 2) {\n throw new SerializationError('invalid index entry key encoding');\n }\n return {\n logicalKey: parts[0]!,\n primaryKey: parts[1]!\n };\n}\nexport function indexKeyExactRange(logicalIndexKey: Uint8Array): Range {\n return prefixRange(encodeCompoundKeyParts([logicalIndexKey]));\n}\nexport function indexRangeToPhysicalRange(range: Range = {}): Range {\n validateIndexRangeShape(range);\n const physical: Range = {};\n if (range.reverse !== undefined) {\n physical.reverse = range.reverse;\n }\n if (range.limit !== undefined) {\n physical.limit = range.limit;\n }\n if (range.gte) {\n physical.gte = encodeCompoundKeyParts([range.gte]);\n }\n if (range.gt) {\n const lower = prefixSuccessor(encodeCompoundKeyParts([range.gt]));\n if (lower) {\n physical.gte = lower;\n }\n }\n if (range.lt) {\n physical.lt = encodeCompoundKeyParts([range.lt]);\n }\n if (range.lte) {\n const upper = prefixSuccessor(encodeCompoundKeyParts([range.lte]));\n if (upper) {\n physical.lt = upper;\n }\n }\n return physical;\n}\nexport function extractLogicalIndexKey(def: NormalizedIndexDef, valueBytes: Uint8Array): Uint8Array | null {\n const documentValue = decodeIndexedDocument(valueBytes);\n if (def.compound) {\n const parts: Uint8Array[] = [];\n for (const keyPath of def.keyPath) {\n const resolved = resolveKeyPath(documentValue, keyPath);\n if (resolved === MISSING) {\n return null;\n }\n parts.push(encodeDocumentIndexValue(resolved));\n }\n return encodeCompoundKeyParts(parts);\n }\n const resolved = resolveKeyPath(documentValue, def.keyPath[0]!);\n if (resolved === MISSING) {\n return null;\n }\n return encodeDocumentIndexValue(resolved);\n}\nexport function serializeNormalizedIndexDefinitions(defs: ReadonlyArray<NormalizedIndexDef>): string {\n return JSON.stringify(toPublicIndexDefinitions(defs));\n}\nexport function cloneNormalizedIndexDefinitions(defs: ReadonlyArray<NormalizedIndexDef>): NormalizedIndexDef[] {\n return defs.map((def) => ({\n store: def.store,\n name: def.name,\n keyPath: [...def.keyPath],\n compound: def.compound,\n unique: def.unique,\n internalStore: def.internalStore\n }));\n}\nexport function toPublicIndexDefinitions(defs: ReadonlyArray<NormalizedIndexDef>): IndexDef[] {\n return defs.map(toPublicIndexDefinition);\n}\nfunction toPublicIndexDefinition(def: NormalizedIndexDef): IndexDef {\n return {\n store: def.store,\n name: def.name,\n keyPath: def.compound ? [...def.keyPath] : def.keyPath[0]!,\n unique: def.unique\n };\n}\nfunction normalizeIndexKeyPath(value: unknown): {\n paths: string[];\n compound: boolean;\n} {\n if (typeof value === 'string') {\n validateSingleKeyPath(value);\n return { paths: [value], compound: false };\n }\n if (!Array.isArray(value) || value.length === 0 || value.some((item) => typeof item !== 'string')) {\n throw new InvalidOpenOptionsError('index keyPath must be a non-empty string or non-empty string[]');\n }\n for (const path of value) {\n validateSingleKeyPath(path);\n }\n return { paths: [...value], compound: true };\n}\nfunction validateSingleKeyPath(value: string): void {\n if (value.length === 0) {\n throw new InvalidOpenOptionsError('index keyPath strings must be non-empty');\n }\n if (value.startsWith('.') || value.endsWith('.') || value.includes('..')) {\n throw new InvalidOpenOptionsError(`invalid index keyPath: ${value}`);\n }\n}\nfunction serializeIndexKeyPath(def: NormalizedIndexDef): string {\n return def.compound ? `[${def.keyPath.join(',')}]` : def.keyPath[0]!;\n}\nfunction makeInternalIndexStoreName(store: string, name: string): string {\n const storeToken = base64Url(utf8Encode(store));\n const nameToken = base64Url(utf8Encode(name));\n const candidate = `${INTERNAL_INDEX_STORE_PREFIX}${storeToken}:${nameToken}`;\n if (encoder.encode(candidate).length <= 255) {\n return candidate;\n }\n const payload = utf8Encode(indexDefinitionIdentity(store, name));\n return `${INTERNAL_INDEX_STORE_PREFIX}h:${fnv1a64Hex(payload)}`;\n}\nfunction base64Url(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/u, '');\n}\nfunction fnv1a64Hex(bytes: Uint8Array): string {\n let hash = FNV64_OFFSET;\n for (const byte of bytes) {\n hash ^= BigInt(byte);\n hash = (hash * FNV64_PRIME) & FNV64_MASK;\n }\n return hash.toString(16).padStart(16, '0');\n}\nfunction decodeIndexedDocument(bytes: Uint8Array): unknown {\n try {\n return JSON.parse(fatalDecoder.decode(bytes));\n } catch (error) {\n throw new SerializationError(`indexed values must be valid UTF-8 JSON: ${String(error)}`);\n }\n}\nfunction resolveKeyPath(root: unknown, keyPath: string): unknown | typeof MISSING {\n let current: unknown = root;\n for (const segment of keyPath.split('.')) {\n if (current === null || current === undefined) {\n return MISSING;\n }\n const target = Object(current) as Record<string, unknown>;\n if (!(segment in target)) {\n return MISSING;\n }\n current = Reflect.get(target, segment);\n }\n return current;\n}\nfunction encodeDocumentIndexValue(value: unknown): Uint8Array {\n if (value instanceof Uint8Array) {\n return encodeIndexScalar(value);\n }\n if (value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return encodeIndexScalar(value as IndexKeyPrimitive);\n }\n throw new SerializationError(\n `indexed keyPath values must resolve to string, number, boolean, null, or Uint8Array; got ${describeValue(value)}`\n );\n}\nfunction describeValue(value: unknown): string {\n if (Array.isArray(value)) {\n return 'array';\n }\n if (value === null) {\n return 'null';\n }\n return typeof value;\n}\nfunction validateIndexRangeShape(range: Range): void {\n if (range.gt !== undefined && range.gte !== undefined) {\n throw new TypeError('index range cannot specify both gt and gte');\n }\n if (range.lt !== undefined && range.lte !== undefined) {\n throw new TypeError('index range cannot specify both lt and lte');\n }\n}\n","import type { DbChange } from './types';\nimport { isRecord } from './internal';\nexport interface StoreChangeSet {\n store: string;\n changes: DbChange[];\n}\nexport interface CommitAppliedEvent {\n type: 'commit_applied';\n dbName: string;\n txid: number;\n stores: StoreChangeSet[];\n}\nexport interface OwnerChangedEvent {\n type: 'owner_changed';\n dbName: string;\n txid: null;\n}\nexport interface DbClosedEvent {\n type: 'db_closed';\n dbName: string;\n txid: null;\n}\nexport interface DbDeletedEvent {\n type: 'db_deleted';\n dbName: string;\n txid: null;\n}\nexport type WorkerBroadcastEvent = CommitAppliedEvent | OwnerChangedEvent | DbClosedEvent | DbDeletedEvent;\nfunction isDbChange(value: unknown): value is DbChange {\n return isRecord(value) && value.key instanceof Uint8Array && (value.kind === 'put' || value.kind === 'delete');\n}\nfunction isStoreChangeSet(value: unknown): value is StoreChangeSet {\n return (\n isRecord(value) &&\n typeof value.store === 'string' &&\n Array.isArray(value.changes) &&\n value.changes.every(isDbChange)\n );\n}\nexport function isCommitAppliedEvent(value: unknown): value is CommitAppliedEvent {\n return (\n isRecord(value) &&\n value.type === 'commit_applied' &&\n typeof value.dbName === 'string' &&\n typeof value.txid === 'number' &&\n Array.isArray(value.stores) &&\n value.stores.every(isStoreChangeSet)\n );\n}\n","import { DatabaseClosedError } from './errors';\nimport { isCommitAppliedEvent } from './change-events';\nimport { assertPublicStoreName } from './indexing';\nimport type { DbChange, DbSubscriptionCallback, Unsubscribe } from './types';\ninterface SubscriptionEntry {\n active: boolean;\n store: string | null;\n keyPrefix: Uint8Array | null;\n callback: DbSubscriptionCallback;\n}\ninterface SubscriptionSpec {\n store: string | null;\n keyPrefix: Uint8Array | null;\n callback: DbSubscriptionCallback;\n}\nfunction cloneChanges(changes: readonly DbChange[]): DbChange[] {\n return changes.map((change) => ({\n key: change.key.slice(),\n kind: change.kind\n }));\n}\nfunction hasKeyPrefix(key: Uint8Array, prefix: Uint8Array): boolean {\n if (prefix.byteLength > key.byteLength) {\n return false;\n }\n for (let index = 0; index < prefix.byteLength; index += 1) {\n if (key[index] !== prefix[index]) {\n return false;\n }\n }\n return true;\n}\nfunction normalizeSubscriptionSpec(\n arg1: string | DbSubscriptionCallback,\n arg2?: Uint8Array | DbSubscriptionCallback,\n arg3?: DbSubscriptionCallback\n): SubscriptionSpec {\n if (typeof arg1 === 'function') {\n if (arg2 !== undefined || arg3 !== undefined) {\n throw new TypeError('subscribe(callback) accepts exactly one callback argument');\n }\n return {\n store: null,\n keyPrefix: null,\n callback: arg1\n };\n }\n if (typeof arg1 !== 'string') {\n throw new TypeError('subscribe() storeName must be a string');\n }\n assertPublicStoreName(arg1);\n if (typeof arg2 === 'function') {\n if (arg3 !== undefined) {\n throw new TypeError('subscribe(storeName, callback) accepts exactly two arguments');\n }\n return {\n store: arg1,\n keyPrefix: null,\n callback: arg2\n };\n }\n if (arg2 instanceof Uint8Array && typeof arg3 === 'function') {\n return {\n store: arg1,\n keyPrefix: arg2.slice(),\n callback: arg3\n };\n }\n throw new TypeError(\n 'subscribe() expects one of: (callback), (storeName, callback), (storeName, keyPrefix, callback)'\n );\n}\nexport class SubscriptionHub {\n #dbName: string;\n #channel: BroadcastChannel | null = null;\n #entries = new Set<SubscriptionEntry>();\n #closed = false;\n constructor(dbName: string) {\n this.#dbName = dbName;\n }\n subscribe(callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, keyPrefix: Uint8Array, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(\n arg1: string | DbSubscriptionCallback,\n arg2?: Uint8Array | DbSubscriptionCallback,\n arg3?: DbSubscriptionCallback\n ): Unsubscribe {\n if (this.#closed) {\n throw new DatabaseClosedError();\n }\n const spec = normalizeSubscriptionSpec(arg1, arg2, arg3);\n const entry: SubscriptionEntry = {\n active: true,\n store: spec.store,\n keyPrefix: spec.keyPrefix,\n callback: spec.callback\n };\n this.#ensureChannel();\n this.#entries.add(entry);\n return () => {\n if (!entry.active) {\n return;\n }\n entry.active = false;\n this.#entries.delete(entry);\n if (this.#entries.size === 0) {\n this.#disposeChannel();\n }\n };\n }\n close(): void {\n if (this.#closed) {\n return;\n }\n this.#closed = true;\n this.#entries.clear();\n this.#disposeChannel();\n }\n #ensureChannel() {\n if (this.#channel !== null || this.#closed) {\n return;\n }\n const channel = new BroadcastChannel(`db:${this.#dbName}:events`);\n channel.onmessage = (event) => {\n this.#handleMessage(event.data);\n };\n this.#channel = channel;\n }\n #disposeChannel() {\n this.#channel?.close();\n this.#channel = null;\n }\n #handleMessage(payload: unknown) {\n if (!isCommitAppliedEvent(payload) || payload.dbName !== this.#dbName || this.#entries.size === 0) {\n return;\n }\n const entries = Array.from(this.#entries);\n for (const storeEvent of payload.stores) {\n for (const entry of entries) {\n if (!entry.active) {\n continue;\n }\n if (entry.store !== null && entry.store !== storeEvent.store) {\n continue;\n }\n let changes: DbChange[];\n if (entry.keyPrefix === null) {\n changes = cloneChanges(storeEvent.changes);\n } else {\n changes = cloneChanges(\n storeEvent.changes.filter((change) => hasKeyPrefix(change.key, entry.keyPrefix!))\n );\n if (changes.length === 0) {\n continue;\n }\n }\n try {\n entry.callback(storeEvent.store, changes, payload.txid);\n } catch (error) {\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n }\n }\n}\n","import type {\n BatchOp,\n ChangeFeed,\n ChangeFeedOptions,\n CompactionResult,\n CreateStoreOptions,\n DB,\n DbSubscriptionCallback,\n DebugFailpoint,\n ExportSnapshotOptions,\n IndexDef,\n MigrateHook,\n OpenOptions,\n PutOptions,\n Range,\n ScanItem,\n StorageInfo,\n Transaction,\n TxId,\n TxMode,\n Unsubscribe\n} from './types';\nimport {\n acquireDbWorker,\n deleteDbByName,\n destroyDbWorker,\n invalidateTransactions,\n releaseDbWorker,\n subscribeHandleInvalidated,\n subscribeTransactionsInvalidated,\n unsafeDebugCrashWorker as crashWorkerByName,\n type RegistryEntry\n} from './registry';\nimport {\n DatabaseBusyError,\n DatabaseClosedError,\n InvalidOpenOptionsError,\n normalizeError,\n TransactionClosedError,\n UnsupportedPlatformError,\n VersionError\n} from './errors';\nimport {\n assertPublicStoreName,\n normalizeIndexDefinitions,\n serializeNormalizedIndexDefinitions,\n toPublicIndexDefinitions,\n type NormalizedIndexDef\n} from './indexing';\nimport { SubscriptionHub } from './subscriptions';\nimport { compareStringsByCodeUnit, withTimeout } from './internal';\n\nasync function callProxy<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n throw normalizeError(error);\n }\n}\n\nclass TransactionImpl implements Transaction {\n readonly mode: TxMode;\n #entry: RegistryEntry;\n #txId: number;\n #closed = false;\n #onClose: () => void;\n constructor(entry: RegistryEntry, txId: number, mode: TxMode, onClose: () => void) {\n this.#entry = entry;\n this.#txId = txId;\n this.mode = mode;\n this.#onClose = onClose;\n }\n async get(store: string, key: Uint8Array): Promise<Uint8Array | null> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.get(this.#txId, store, key));\n }\n async getMany(store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.getMany(this.#txId, store, keys));\n }\n async has(store: string, key: Uint8Array): Promise<boolean> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.has(this.#txId, store, key));\n }\n async put(store: string, key: Uint8Array, value: Uint8Array, options: PutOptions = {}): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.put(this.#txId, store, key, value, normalizePutOptions(options)));\n }\n async putMany(store: string, entries: Array<[Uint8Array, Uint8Array]>, options: PutOptions = {}): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.putMany(this.#txId, store, entries, normalizePutOptions(options)));\n }\n async delete(store: string, key: Uint8Array): Promise<boolean> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.delete(this.#txId, store, key));\n }\n async deleteMany(store: string, keys: Array<Uint8Array>): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.deleteMany(this.#txId, store, keys));\n }\n async applyBatch(store: string, ops: Array<BatchOp>): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.applyBatch(this.#txId, store, ops));\n }\n async scan(store: string, range: Range = {}): Promise<ScanItem[]> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.scan(this.#txId, store, range));\n }\n async getByIndex(store: string, indexName: string, key: Uint8Array): Promise<Uint8Array | null> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.getByIndex(this.#txId, store, indexName, key));\n }\n async *scanByIndex(store: string, indexName: string, range: Range = {}): AsyncIterable<[Uint8Array, Uint8Array]> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n const rows = await callProxy(() => this.#entry.proxy.scanByIndex(this.#txId, store, indexName, range));\n for (const row of rows) {\n yield [row.key, row.value];\n }\n }\n async createStore(name: string, options: CreateStoreOptions = {}): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(name);\n return callProxy(() => this.#entry.proxy.createStore(this.#txId, name, normalizeCreateStoreOptions(options)));\n }\n async dropStore(name: string): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(name);\n return callProxy(() => this.#entry.proxy.dropStore(this.#txId, name));\n }\n async clearStore(name: string): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(name);\n return callProxy(() => this.#entry.proxy.clearStore(this.#txId, name));\n }\n async commit(): Promise<void> {\n this.#ensureOpen();\n try {\n await callProxy(() => this.#entry.proxy.commit(this.#txId));\n } finally {\n this.#markClosed();\n }\n }\n async rollback(): Promise<void> {\n this.#ensureOpen();\n try {\n await callProxy(() => this.#entry.proxy.rollback(this.#txId));\n } finally {\n this.#markClosed();\n }\n }\n async rollbackIfOpen(): Promise<void> {\n if (this.#closed) {\n return;\n }\n if (this.#entry.invalidated) {\n this.#markClosed();\n return;\n }\n try {\n await this.#entry.proxy.rollback(this.#txId);\n } catch (error) {\n const normalized = normalizeError(error);\n if (!(normalized instanceof TransactionClosedError)) {\n throw normalized;\n }\n } finally {\n this.#markClosed();\n }\n }\n forceClose(): void {\n this.#markClosed();\n }\n internalId(): number {\n return this.#txId;\n }\n #ensureOpen() {\n if (this.#closed || this.#entry.invalidated) {\n throw new TransactionClosedError();\n }\n }\n #markClosed() {\n if (this.#closed) {\n return;\n }\n this.#closed = true;\n this.#onClose();\n }\n}\nclass DBImpl implements DB {\n #entry: RegistryEntry;\n #closed = false;\n #transactions = new Set<TransactionImpl>();\n #subscriptions: SubscriptionHub;\n #unsubscribeTxInvalidated: (() => void) | null = null;\n #unsubscribeHandleInvalidated: (() => void) | null = null;\n constructor(entry: RegistryEntry) {\n this.#entry = entry;\n this.#subscriptions = new SubscriptionHub(entry.dbName);\n this.#unsubscribeTxInvalidated = subscribeTransactionsInvalidated(entry, () => {\n this.#forceCloseTransactions();\n });\n this.#unsubscribeHandleInvalidated = subscribeHandleInvalidated(entry, () => {\n this.#markInvalidated();\n });\n }\n async begin(mode: TxMode = 'readonly'): Promise<Transaction> {\n return this.#beginImpl(mode);\n }\n async runSchemaMigration(\n oldVersion: number,\n newVersion: number,\n migrate: MigrateHook,\n targetIndexes: IndexDef[]\n ): Promise<void> {\n this.#ensureOpen();\n const tx = await this.#beginImpl('readwrite');\n const tracker = new MigrationCatalogTracker();\n const migrationTransaction = new MigrationTransactionImpl(tx, tracker);\n const migrationDb = new MigrationDbImpl(this, migrationTransaction, tracker);\n try {\n await this.#entry.proxy.reconcileIndexes(tx.internalId(), targetIndexes);\n await migrate({\n db: migrationDb,\n oldVersion,\n newVersion,\n transaction: migrationTransaction\n });\n await this.#entry.proxy.setSchemaVersion(tx.internalId(), newVersion);\n await tx.commit();\n } catch (error) {\n try {\n await tx.rollbackIfOpen();\n } catch {}\n throw error;\n }\n }\n async listStores(): Promise<string[]> {\n this.#ensureOpen();\n return callProxy(() => this.#entry.proxy.listStores());\n }\n async getVersion(): Promise<number> {\n this.#ensureOpen();\n return callProxy(() => this.#entry.proxy.getVersion());\n }\n async changesSince(txid: TxId, options: ChangeFeedOptions = {}): Promise<ChangeFeed> {\n this.#ensureOpen();\n return callProxy(() =>\n this.#entry.proxy.changesSince(normalizeTxId(txid), normalizeChangeFeedOptions(options))\n );\n }\n async #beginImpl(mode: TxMode): Promise<TransactionImpl> {\n this.#ensureOpen();\n return callProxy(async () => {\n const txId = await this.#entry.proxy.begin(mode);\n let tx!: TransactionImpl;\n tx = new TransactionImpl(this.#entry, txId, mode, () => {\n this.#transactions.delete(tx);\n });\n this.#transactions.add(tx);\n return tx;\n });\n }\n async createStore(name: string, options: CreateStoreOptions = {}): Promise<void> {\n await this.#withScopedTx('readwrite', async (tx) => {\n await tx.createStore(name, normalizeCreateStoreOptions(options));\n });\n }\n async dropStore(name: string): Promise<void> {\n await this.#withScopedTx('readwrite', async (tx) => {\n await tx.dropStore(name);\n });\n }\n async clearStore(name: string): Promise<void> {\n await this.#withScopedTx('readwrite', async (tx) => {\n await tx.clearStore(name);\n });\n }\n async get(store: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.#withScopedTx('readonly', (tx) => tx.get(store, key));\n }\n async getMany(store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n return this.#withScopedTx('readonly', (tx) => tx.getMany(store, keys));\n }\n async has(store: string, key: Uint8Array): Promise<boolean> {\n return this.#withScopedTx('readonly', (tx) => tx.has(store, key));\n }\n async put(store: string, key: Uint8Array, value: Uint8Array, options: PutOptions = {}): Promise<void> {\n await this.#withScopedTx('readwrite', async (tx) => {\n await tx.put(store, key, value, normalizePutOptions(options));\n });\n }\n async delete(store: string, key: Uint8Array): Promise<boolean> {\n return this.#withScopedTx('readwrite', (tx) => tx.delete(store, key));\n }\n async scan(store: string, range: Range = {}): Promise<ScanItem[]> {\n return this.#withScopedTx('readonly', (tx) => tx.scan(store, range));\n }\n async exportSnapshot(options: ExportSnapshotOptions = {}): Promise<Uint8Array> {\n this.#ensureOpen();\n return callProxy(async () => {\n const bytes = await this.#entry.proxy.exportSnapshot(normalizeExportSnapshotOptions(options));\n return bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n });\n }\n async importSnapshot(data: Uint8Array): Promise<void> {\n this.#ensureOpen();\n return callProxy(() => {\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);\n return this.#entry.proxy.importSnapshot(bytes);\n });\n }\n async reset(): Promise<void> {\n this.#ensureOpen();\n invalidateTransactions(this.#entry);\n return callProxy(() => this.#entry.proxy.reset());\n }\n async compact(): Promise<CompactionResult> {\n this.#ensureOpen();\n invalidateTransactions(this.#entry);\n return callProxy(() => this.#entry.proxy.compact());\n }\n async rebuild(): Promise<CompactionResult> {\n this.#ensureOpen();\n invalidateTransactions(this.#entry);\n return callProxy(() => this.#entry.proxy.rebuild());\n }\n async stats() {\n this.#ensureOpen();\n return callProxy(() => this.#entry.proxy.stats());\n }\n async storageInfo(): Promise<StorageInfo> {\n this.#ensureOpen();\n return callProxy(() => this.#entry.proxy.storageInfo());\n }\n async requestPersistence(): Promise<boolean> {\n this.#ensureOpen();\n return callProxy(() => this.#entry.proxy.requestPersistence());\n }\n async destroy(): Promise<void> {\n this.#ensureOpen();\n return callProxy(() => destroyDbWorker(this.#entry));\n }\n async setFailpoint(failpoint: DebugFailpoint): Promise<void> {\n this.#ensureOpen();\n return callProxy(() => this.#entry.proxy.setFailpoint(failpoint));\n }\n subscribe(callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, keyPrefix: Uint8Array, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(\n arg1: string | DbSubscriptionCallback,\n arg2?: Uint8Array | DbSubscriptionCallback,\n arg3?: DbSubscriptionCallback\n ): Unsubscribe {\n this.#ensureOpen();\n if (typeof arg1 === 'function') {\n return this.#subscriptions.subscribe(arg1);\n }\n if (typeof arg2 === 'function') {\n return this.#subscriptions.subscribe(arg1, arg2);\n }\n if (arg2 instanceof Uint8Array && typeof arg3 === 'function') {\n return this.#subscriptions.subscribe(arg1, arg2, arg3);\n }\n throw new TypeError(\n 'subscribe() expects one of: (callback), (storeName, callback), (storeName, keyPrefix, callback)'\n );\n }\n watch(callback: DbSubscriptionCallback): Unsubscribe;\n watch(storeName: string, callback: DbSubscriptionCallback): Unsubscribe;\n watch(storeName: string, keyPrefix: Uint8Array, callback: DbSubscriptionCallback): Unsubscribe;\n watch(\n arg1: string | DbSubscriptionCallback,\n arg2?: Uint8Array | DbSubscriptionCallback,\n arg3?: DbSubscriptionCallback\n ): Unsubscribe {\n if (typeof arg1 === 'function') {\n return this.subscribe(arg1);\n }\n if (typeof arg2 === 'function') {\n return this.subscribe(arg1, arg2);\n }\n if (arg2 instanceof Uint8Array && typeof arg3 === 'function') {\n return this.subscribe(arg1, arg2, arg3);\n }\n throw new TypeError(\n 'watch() expects one of: (callback), (storeName, callback), (storeName, keyPrefix, callback)'\n );\n }\n async close(): Promise<void> {\n if (this.#closed) {\n return;\n }\n this.#closed = true;\n this.#disposeRegistrySubscriptions();\n this.#subscriptions.close();\n let rollbackError: Error | null = null;\n const txs = Array.from(this.#transactions);\n if (txs.length > 0) {\n const results = await Promise.allSettled(txs.map((tx) => tx.rollbackIfOpen()));\n for (const result of results) {\n if (result.status === 'rejected' && rollbackError === null) {\n rollbackError = normalizeError(result.reason);\n }\n }\n }\n try {\n await releaseDbWorker(this.#entry);\n } catch (error) {\n throw normalizeError(error);\n }\n if (rollbackError) {\n throw rollbackError;\n }\n }\n async #withScopedTx<T>(mode: TxMode, fn: (tx: Transaction) => Promise<T>): Promise<T> {\n const tx = await this.begin(mode);\n try {\n const result = await fn(tx);\n if (mode === 'readwrite') {\n await tx.commit();\n } else {\n await tx.rollback();\n }\n return result;\n } catch (error) {\n try {\n await tx.rollback();\n } catch {}\n throw error;\n }\n }\n #disposeRegistrySubscriptions() {\n this.#unsubscribeTxInvalidated?.();\n this.#unsubscribeTxInvalidated = null;\n this.#unsubscribeHandleInvalidated?.();\n this.#unsubscribeHandleInvalidated = null;\n }\n #forceCloseTransactions() {\n for (const tx of Array.from(this.#transactions)) {\n tx.forceClose();\n }\n }\n #markInvalidated() {\n if (this.#closed) {\n return;\n }\n this.#closed = true;\n this.#disposeRegistrySubscriptions();\n this.#forceCloseTransactions();\n this.#subscriptions.close();\n }\n #ensureOpen() {\n if (this.#closed || this.#entry.invalidated) {\n throw new DatabaseClosedError();\n }\n }\n}\nclass MigrationCatalogTracker {\n #created = new Set<string>();\n #dropped = new Set<string>();\n recordCreate(name: string): void {\n this.#dropped.delete(name);\n this.#created.add(name);\n }\n recordDrop(name: string): void {\n if (this.#created.delete(name)) {\n return;\n }\n this.#dropped.add(name);\n }\n apply(stores: string[]): string[] {\n const visible = new Set(stores);\n for (const name of this.#created) {\n visible.add(name);\n }\n for (const name of this.#dropped) {\n visible.delete(name);\n }\n return Array.from(visible).sort(compareStringsByCodeUnit);\n }\n}\nclass MigrationTransactionImpl implements Transaction {\n #inner: TransactionImpl;\n #tracker: MigrationCatalogTracker;\n constructor(inner: TransactionImpl, tracker: MigrationCatalogTracker) {\n this.#inner = inner;\n this.#tracker = tracker;\n }\n get mode(): TxMode {\n return this.#inner.mode;\n }\n async get(store: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.#inner.get(store, key);\n }\n async getMany(store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n return this.#inner.getMany(store, keys);\n }\n async has(store: string, key: Uint8Array): Promise<boolean> {\n return this.#inner.has(store, key);\n }\n async put(store: string, key: Uint8Array, value: Uint8Array, options: PutOptions = {}): Promise<void> {\n await this.#inner.put(store, key, value, options);\n }\n async putMany(store: string, entries: Array<[Uint8Array, Uint8Array]>, options: PutOptions = {}): Promise<void> {\n await this.#inner.putMany(store, entries, options);\n }\n async delete(store: string, key: Uint8Array): Promise<boolean> {\n return this.#inner.delete(store, key);\n }\n async deleteMany(store: string, keys: Array<Uint8Array>): Promise<void> {\n await this.#inner.deleteMany(store, keys);\n }\n async applyBatch(store: string, ops: Array<BatchOp>): Promise<void> {\n await this.#inner.applyBatch(store, ops);\n }\n async scan(store: string, range: Range = {}): Promise<ScanItem[]> {\n return this.#inner.scan(store, range);\n }\n async getByIndex(store: string, indexName: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.#inner.getByIndex(store, indexName, key);\n }\n scanByIndex(store: string, indexName: string, range: Range = {}): AsyncIterable<[Uint8Array, Uint8Array]> {\n return this.#inner.scanByIndex(store, indexName, range);\n }\n async createStore(name: string, options: CreateStoreOptions = {}): Promise<void> {\n await this.#inner.createStore(name, options);\n this.#tracker.recordCreate(name);\n }\n async dropStore(name: string): Promise<void> {\n await this.#inner.dropStore(name);\n this.#tracker.recordDrop(name);\n }\n async clearStore(name: string): Promise<void> {\n await this.#inner.clearStore(name);\n }\n async commit(): Promise<void> {\n throw migrationUnsupportedMethod('transaction.commit');\n }\n async rollback(): Promise<void> {\n throw migrationUnsupportedMethod('transaction.rollback');\n }\n}\nclass MigrationDbImpl implements DB {\n #db: DBImpl;\n #transaction: MigrationTransactionImpl;\n #tracker: MigrationCatalogTracker;\n constructor(db: DBImpl, transaction: MigrationTransactionImpl, tracker: MigrationCatalogTracker) {\n this.#db = db;\n this.#transaction = transaction;\n this.#tracker = tracker;\n }\n async begin(_mode: TxMode = 'readonly'): Promise<Transaction> {\n throw migrationUnsupportedMethod('db.begin');\n }\n async createStore(name: string, options: CreateStoreOptions = {}): Promise<void> {\n await this.#transaction.createStore(name, options);\n }\n async dropStore(name: string): Promise<void> {\n await this.#transaction.dropStore(name);\n }\n async clearStore(name: string): Promise<void> {\n await this.#transaction.clearStore(name);\n }\n async listStores(): Promise<string[]> {\n return this.#tracker.apply(await this.#db.listStores());\n }\n async getVersion(): Promise<number> {\n return this.#db.getVersion();\n }\n async changesSince(_txid: TxId, _options: ChangeFeedOptions = {}): Promise<ChangeFeed> {\n throw migrationUnsupportedMethod('db.changesSince');\n }\n async get(store: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.#transaction.get(store, key);\n }\n async getMany(store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n return this.#transaction.getMany(store, keys);\n }\n async has(store: string, key: Uint8Array): Promise<boolean> {\n return this.#transaction.has(store, key);\n }\n async put(store: string, key: Uint8Array, value: Uint8Array, options: PutOptions = {}): Promise<void> {\n await this.#transaction.put(store, key, value, options);\n }\n async delete(store: string, key: Uint8Array): Promise<boolean> {\n return this.#transaction.delete(store, key);\n }\n async scan(store: string, range: Range = {}): Promise<ScanItem[]> {\n return this.#transaction.scan(store, range);\n }\n async exportSnapshot(_options: ExportSnapshotOptions = {}): Promise<Uint8Array> {\n throw migrationUnsupportedMethod('db.exportSnapshot');\n }\n async importSnapshot(_data: Uint8Array): Promise<void> {\n throw migrationUnsupportedMethod('db.importSnapshot');\n }\n async reset(): Promise<void> {\n throw migrationUnsupportedMethod('db.reset');\n }\n async compact(): Promise<CompactionResult> {\n throw migrationUnsupportedMethod('db.compact');\n }\n async rebuild(): Promise<CompactionResult> {\n throw migrationUnsupportedMethod('db.rebuild');\n }\n async stats() {\n return this.#db.stats();\n }\n async storageInfo(): Promise<StorageInfo> {\n return this.#db.storageInfo();\n }\n async requestPersistence(): Promise<boolean> {\n return this.#db.requestPersistence();\n }\n async close(): Promise<void> {\n throw migrationUnsupportedMethod('db.close');\n }\n async destroy(): Promise<void> {\n throw migrationUnsupportedMethod('db.destroy');\n }\n async setFailpoint(_failpoint: DebugFailpoint): Promise<void> {\n throw migrationUnsupportedMethod('db.setFailpoint');\n }\n subscribe(callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, keyPrefix: Uint8Array, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(\n _arg1: string | DbSubscriptionCallback,\n _arg2?: Uint8Array | DbSubscriptionCallback,\n _arg3?: DbSubscriptionCallback\n ): Unsubscribe {\n throw migrationUnsupportedMethod('db.subscribe');\n }\n watch(callback: DbSubscriptionCallback): Unsubscribe;\n watch(storeName: string, callback: DbSubscriptionCallback): Unsubscribe;\n watch(storeName: string, keyPrefix: Uint8Array, callback: DbSubscriptionCallback): Unsubscribe;\n watch(\n _arg1: string | DbSubscriptionCallback,\n _arg2?: Uint8Array | DbSubscriptionCallback,\n _arg3?: DbSubscriptionCallback\n ): Unsubscribe {\n throw migrationUnsupportedMethod('db.watch');\n }\n}\nfunction migrationUnsupportedMethod(method: string): Error {\n const error = new Error(\n `${method}() is not available inside openDB() migrations; use the provided migration transaction and wait for openDB() to resolve`\n );\n error.name = 'InvalidStateError';\n return error;\n}\nfunction normalizeDatabaseName(value: unknown, method: 'openDB' | 'deleteDB' | 'unsafeDebugCrashWorker'): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new TypeError(`${method}() database name must be a non-empty string`);\n }\n return value;\n}\ntype ErrorFactory = (message: string) => Error;\n\nconst typeError: ErrorFactory = (message) => new TypeError(message);\nconst invalidOpenOptionsError: ErrorFactory = (message) => new InvalidOpenOptionsError(message);\n\nfunction normalizeOptionsObject<T>(options: unknown, message: string, createError: ErrorFactory = typeError): T {\n if (options === undefined) {\n return {} as T;\n }\n if (options === null || typeof options !== 'object' || Array.isArray(options)) {\n throw createError(message);\n }\n return options as T;\n}\n\nfunction normalizeNonNegativeSafeInteger(\n value: unknown,\n message: string,\n createError: ErrorFactory = typeError\n): number {\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) {\n throw createError(message);\n }\n return value;\n}\n\nfunction normalizeOptionalNonNegativeSafeInteger(\n value: unknown,\n message: string,\n createError?: ErrorFactory\n): number | undefined {\n return value === undefined ? undefined : normalizeNonNegativeSafeInteger(value, message, createError);\n}\n\nfunction normalizeOpenOptionsInput(options: unknown): OpenOptions {\n return normalizeOptionsObject(options, 'open options must be an object', invalidOpenOptionsError);\n}\nfunction normalizeSchemaVersion(value: unknown): number | undefined {\n return normalizeOptionalNonNegativeSafeInteger(\n value,\n 'version must be a non-negative safe integer',\n invalidOpenOptionsError\n );\n}\nfunction normalizePutOptions(options: unknown): PutOptions {\n const { ttl } = normalizeOptionsObject<{\n ttl?: unknown;\n }>(options, 'put options must be an object');\n const normalizedTtl = normalizeOptionalNonNegativeSafeInteger(ttl, 'ttl must be a non-negative safe integer');\n return normalizedTtl === undefined ? {} : { ttl: normalizedTtl };\n}\nfunction normalizeCompressionOptions<T extends CreateStoreOptions | ExportSnapshotOptions>(\n options: unknown,\n message: string\n): T {\n const { compression } = normalizeOptionsObject<{\n compression?: unknown;\n }>(options, message);\n if (compression === undefined) {\n return {} as T;\n }\n if (compression !== false && compression !== 'gzip' && compression !== 'deflate') {\n throw new TypeError('compression must be \"gzip\", \"deflate\", or false');\n }\n return { compression } as T;\n}\n\nfunction normalizeCreateStoreOptions(options: unknown): CreateStoreOptions {\n return normalizeCompressionOptions(options, 'createStore options must be an object');\n}\n\nfunction normalizeExportSnapshotOptions(options: unknown): ExportSnapshotOptions {\n return normalizeCompressionOptions(options, 'exportSnapshot options must be an object');\n}\nfunction normalizeTxId(value: unknown): TxId {\n return normalizeNonNegativeSafeInteger(value, 'txid must be a non-negative safe integer');\n}\nfunction normalizeChangeFeedOptions(options: unknown): ChangeFeedOptions {\n const { stores, limit } = normalizeOptionsObject<{\n stores?: unknown;\n limit?: unknown;\n }>(options, 'change feed options must be an object');\n const normalized: ChangeFeedOptions = {};\n if (stores !== undefined) {\n if (!Array.isArray(stores) || stores.some((store) => typeof store !== 'string')) {\n throw new TypeError('stores must be an array of strings');\n }\n for (const store of stores) {\n assertPublicStoreName(store);\n }\n normalized.stores = [...stores];\n }\n const normalizedLimit = normalizeOptionalNonNegativeSafeInteger(limit, 'limit must be a non-negative safe integer');\n if (normalizedLimit !== undefined) {\n normalized.limit = normalizedLimit;\n }\n return normalized;\n}\nfunction normalizeMigrateHook(value: unknown): MigrateHook | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== 'function') {\n throw new InvalidOpenOptionsError('migrate must be a function');\n }\n return value as MigrateHook;\n}\nfunction normalizeRequestedIndexes(value: unknown): NormalizedIndexDef[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n return normalizeIndexDefinitions(value);\n}\nfunction indexDefinitionsMatch(\n left: ReadonlyArray<NormalizedIndexDef>,\n right: ReadonlyArray<NormalizedIndexDef>\n): boolean {\n return serializeNormalizedIndexDefinitions(left) === serializeNormalizedIndexDefinitions(right);\n}\nasync function loadNormalizedIndexes(entry: RegistryEntry): Promise<NormalizedIndexDef[]> {\n return normalizeIndexDefinitions(await entry.proxy.getIndexes());\n}\nfunction assertMainThreadCapabilities() {\n if (!globalThis.isSecureContext) {\n throw new UnsupportedPlatformError('moyodb requires a secure context (HTTPS)');\n }\n const nav = globalThis.navigator;\n if (!nav?.storage) {\n throw new UnsupportedPlatformError('navigator.storage is unavailable');\n }\n if (typeof nav.storage.getDirectory !== 'function') {\n throw new UnsupportedPlatformError('navigator.storage.getDirectory is unavailable');\n }\n if (typeof globalThis.Worker !== 'function') {\n throw new UnsupportedPlatformError('Worker is unavailable');\n }\n if (typeof globalThis.BroadcastChannel === 'undefined') {\n throw new UnsupportedPlatformError('BroadcastChannel is unavailable');\n }\n if (!nav.locks) {\n throw new UnsupportedPlatformError('navigator.locks is unavailable');\n }\n}\nasync function requestPersistentStorageOnOpen(options: OpenOptions): Promise<void> {\n const nav = globalThis.navigator;\n if ((options.requestPersistence ?? true) && typeof nav?.storage?.persist === 'function') {\n await withTimeout(nav.storage.persist(), 1000, false);\n }\n}\nexport async function openDB(name: string, options: OpenOptions = {}): Promise<DB> {\n const dbName = normalizeDatabaseName(name, 'openDB');\n const normalizedOptions = normalizeOpenOptionsInput(options);\n const requestedVersion = normalizeSchemaVersion(normalizedOptions.version);\n const migrate = normalizeMigrateHook(normalizedOptions.migrate);\n const requestedIndexes = normalizeRequestedIndexes(normalizedOptions.indexes);\n if (requestedVersion === undefined && migrate !== undefined) {\n throw new InvalidOpenOptionsError('migrate requires version');\n }\n if (requestedVersion === undefined && requestedIndexes !== undefined) {\n throw new InvalidOpenOptionsError('indexes requires version');\n }\n assertMainThreadCapabilities();\n await requestPersistentStorageOnOpen(normalizedOptions);\n const entry = await acquireDbWorker(dbName, normalizedOptions);\n const db = new DBImpl(entry);\n let keepHandle = false;\n try {\n if (requestedVersion === undefined) {\n keepHandle = true;\n return db;\n }\n const [currentVersion, currentIndexes] = await Promise.all([db.getVersion(), loadNormalizedIndexes(entry)]);\n if (requestedVersion < currentVersion) {\n throw new VersionError(\n `cannot open database ${dbName} at schema version ${requestedVersion}; current schema version is ${currentVersion}`\n );\n }\n if (requestedVersion === currentVersion) {\n if (requestedIndexes !== undefined && !indexDefinitionsMatch(requestedIndexes, currentIndexes)) {\n throw new VersionError(\n `database ${dbName} is already at schema version ${currentVersion}, but the requested index catalog does not match the committed schema`\n );\n }\n keepHandle = true;\n return db;\n }\n if (entry.refs > 1) {\n throw new DatabaseBusyError(\n `database ${dbName} is already open in this tab; close existing handles before migrating from version ${currentVersion} to ${requestedVersion}`\n );\n }\n if (!migrate) {\n throw new VersionError(\n `database ${dbName} requires migration from version ${currentVersion} to ${requestedVersion}, but no migrate hook was provided`\n );\n }\n const targetIndexes = requestedIndexes ?? currentIndexes;\n await db.runSchemaMigration(currentVersion, requestedVersion, migrate, toPublicIndexDefinitions(targetIndexes));\n keepHandle = true;\n return db;\n } catch (error) {\n if (!keepHandle) {\n try {\n await db.close();\n } catch {}\n }\n throw normalizeError(error);\n }\n}\nexport async function deleteDB(name: string): Promise<void> {\n const dbName = normalizeDatabaseName(name, 'deleteDB');\n assertMainThreadCapabilities();\n await deleteDbByName(dbName);\n}\nexport function unsafeDebugCrashWorker(name: string): boolean {\n const dbName = normalizeDatabaseName(name, 'unsafeDebugCrashWorker');\n return crashWorkerByName(dbName);\n}\nexport * from './codec';\nexport * from './errors';\nexport * from './indexing';\nexport type * from './types';\n"],"names":["isRecord","value","compareStringsByCodeUnit","left","right","withTimeout","promise","timeoutMs","fallback","resolve","timeout","WORKER_PROTOCOL_VERSION","WORKER_PROTOCOL_READY","WORKER_PROTOCOL_REQUEST","WORKER_PROTOCOL_RESPONSE","WORKER_COMMANDS","PACKED_BINARY_LIST_V1","PACKED_NULLABLE_BINARY_LIST_V1","PACKED_SCAN_ROWS_V1","PACKED_BATCH_OPS_V1","BATCH_OP_DELETE","BATCH_OP_PUT","U32_MAX","EMPTY_TRANSFERABLES","isWorkerProtocolReadyMessage","isWorkerProtocolResponseMessage","deserializeWorkerError","error","deserialized","workerProtocolError","name","message","code","prepareWorkerCommandPayload","command","args","data","owned","copyToOwnedUint8Array","txId","store","keys","packed","packBinaryList","entries","options","packBinaryPairs","ops","packBatchOps","decodeWorkerResponsePayload","result","isPackedNullableBinaryList","unpackNullableBinaryList","isPackedScanRows","unpackScanRows","entryCount","count","checkedU32","metadataBytes","checkedByteCount","payloadBytes","index","entry","key","keyLength","valueLength","payloadOffset","checkedAdd","totalBytes","bytes","view","metadataOffset","writeOffset","items","item","itemLength","payload","readOffset","present","byteLength","end","rows","keyEnd","valueEnd","op","itemBytes","what","total","clearPendingTimeout","pending","WorkerProtocolClient","worker","reject","handler","reason","request","dbName","mode","range","indexName","indexes","version","failpoint","id","prepared","event","notifyFatal","MoyoDbError","UnsupportedPlatformError","DatabaseBusyError","CorruptionError","StoreExistsError","StoreNotFoundError","IndexNotFoundError","ConstraintError","UniqueIndexConstraintError","WriteTransactionAlreadyOpenError","ReadonlyTransactionError","TransactionClosedError","DatabaseClosedError","ValueTooLargeError","KeyTooLargeError","StoreNameTooLongError","ReservedStoreNameError","InvalidRangeError","StorageError","SerializationError","InjectedFailureError","ChangeFeedCompactedError","InternalError","InvalidOpenOptionsError","VersionError","ERROR_CONSTRUCTORS","instantiateError","ErrorConstructor","err","normalizeError","VALID_FAILPOINTS","PERSISTENCE_BRIDGE_INIT","PERSISTENCE_BRIDGE_REQUEST","PERSISTENCE_BRIDGE_RESPONSE","registry","requirePlainOptionsObject","normalizeBoolean","field","defaultValue","normalizeNonNegativeInteger","normalizeCachePages","normalizeFailpoint","normalizeOptions","assertCompatibleOptions","current","next","queryPersistentStorageState","storage","requestPersistentStorageGrant","handlePersistenceBridgeRequest","port","granted","response","createMainThreadPersistenceBridge","channel","createWorker","_documentCurrentScript","proxy","persistenceBridge","createEntry","invalidateEntry","emitListeners","listeners","listener","subscribeTransactionsInvalidated","subscribeHandleInvalidated","invalidateTransactions","unsafeDebugCrashWorker","acquireDbWorker","normalized","existing","releaseDbWorker","destroyDbWorker","deleteDbByName","encoder","decoder","TYPE_NULL","TYPE_FALSE","TYPE_TRUE","TYPE_NUMBER","TYPE_STRING","TYPE_BYTES","COMPOUND_ESCAPE","COMPOUND_ESCAPE_CONT","COMPOUND_TERM","F64_MASK","utf8Encode","utf8Decode","jsonEncode","jsonDecode","u64Key","asBigInt","buf","indexKey","compoundKey","encodeCompoundKeyPart","parts","encodeCompoundBytes","part","encodeIndexScalar","encodeCompoundKeyParts","splitCompoundKey","byte","prefixSuccessor","prefix","out","prefixRange","upper","compoundKeyRange","encodeSortableNumber","body","length","offset","buffer","bits","fatalDecoder","MISSING","FNV64_OFFSET","FNV64_PRIME","FNV64_MASK","INTERNAL_STORE_PREFIX","INTERNAL_INDEX_STORE_PREFIX","INDEX_METADATA_STORE","isInternalStoreName","assertPublicStoreName","normalizeIndexDefinitions","identities","internalStores","keyPath","unique","keyPathInfo","normalizeIndexKeyPath","def","makeInternalIndexStoreName","identity","indexDefinitionIdentity","mappedIdentity","compareNormalizedIndexDefinitions","storeCompare","nameCompare","uniqueCompare","serializeIndexKeyPath","findIndexDefinition","defs","indexesForStore","encodeIndexMetadataKey","encodeIndexMetadataValue","toPublicIndexDefinition","decodeIndexMetadataValue","parsed","encodeIndexEntryKey","logicalIndexKey","primaryKey","decodeIndexEntryKey","indexKeyExactRange","indexRangeToPhysicalRange","validateIndexRangeShape","physical","lower","extractLogicalIndexKey","valueBytes","documentValue","decodeIndexedDocument","resolved","resolveKeyPath","encodeDocumentIndexValue","serializeNormalizedIndexDefinitions","toPublicIndexDefinitions","cloneNormalizedIndexDefinitions","validateSingleKeyPath","path","storeToken","base64Url","nameToken","candidate","fnv1a64Hex","binary","hash","root","segment","target","describeValue","isDbChange","isStoreChangeSet","isCommitAppliedEvent","cloneChanges","changes","change","hasKeyPrefix","normalizeSubscriptionSpec","arg1","arg2","arg3","SubscriptionHub","#dbName","#channel","#entries","#closed","spec","#ensureChannel","#disposeChannel","#handleMessage","storeEvent","callProxy","fn","TransactionImpl","#entry","#txId","#onClose","onClose","#ensureOpen","normalizePutOptions","row","normalizeCreateStoreOptions","#markClosed","DBImpl","#transactions","#subscriptions","#unsubscribeTxInvalidated","#unsubscribeHandleInvalidated","#forceCloseTransactions","#markInvalidated","#beginImpl","oldVersion","newVersion","migrate","targetIndexes","tx","tracker","MigrationCatalogTracker","migrationTransaction","MigrationTransactionImpl","migrationDb","MigrationDbImpl","txid","normalizeTxId","normalizeChangeFeedOptions","#withScopedTx","normalizeExportSnapshotOptions","#disposeRegistrySubscriptions","rollbackError","txs","results","#created","#dropped","stores","visible","#inner","#tracker","inner","migrationUnsupportedMethod","#db","#transaction","db","transaction","_mode","_txid","_options","_data","_failpoint","_arg1","_arg2","_arg3","method","normalizeDatabaseName","typeError","invalidOpenOptionsError","normalizeOptionsObject","createError","normalizeNonNegativeSafeInteger","normalizeOptionalNonNegativeSafeInteger","normalizeOpenOptionsInput","normalizeSchemaVersion","ttl","normalizedTtl","normalizeCompressionOptions","compression","limit","normalizedLimit","normalizeMigrateHook","normalizeRequestedIndexes","indexDefinitionsMatch","loadNormalizedIndexes","assertMainThreadCapabilities","nav","requestPersistentStorageOnOpen","openDB","normalizedOptions","requestedVersion","requestedIndexes","keepHandle","currentVersion","currentIndexes","deleteDB","crashWorkerByName"],"mappings":"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"}