@vielzeug/vault 1.0.3 → 2.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 (86) hide show
  1. package/README.md +18 -59
  2. package/dist/_dev.cjs +1 -1
  3. package/dist/_dev.cjs.map +1 -1
  4. package/dist/_dev.js +3 -8
  5. package/dist/_dev.js.map +1 -1
  6. package/dist/adapter-core.cjs +1 -1
  7. package/dist/adapter-core.cjs.map +1 -1
  8. package/dist/adapter-core.d.ts +6 -3
  9. package/dist/adapter-core.d.ts.map +1 -1
  10. package/dist/adapter-core.js +138 -148
  11. package/dist/adapter-core.js.map +1 -1
  12. package/dist/adapters/indexeddb.cjs +1 -1
  13. package/dist/adapters/indexeddb.cjs.map +1 -1
  14. package/dist/adapters/indexeddb.d.ts +2 -5
  15. package/dist/adapters/indexeddb.d.ts.map +1 -1
  16. package/dist/adapters/indexeddb.js +113 -127
  17. package/dist/adapters/indexeddb.js.map +1 -1
  18. package/dist/adapters/memory.cjs +1 -1
  19. package/dist/adapters/memory.cjs.map +1 -1
  20. package/dist/adapters/memory.d.ts +3 -9
  21. package/dist/adapters/memory.d.ts.map +1 -1
  22. package/dist/adapters/memory.js +104 -140
  23. package/dist/adapters/memory.js.map +1 -1
  24. package/dist/adapters/webstorage.cjs +1 -1
  25. package/dist/adapters/webstorage.cjs.map +1 -1
  26. package/dist/adapters/webstorage.d.ts +3 -3
  27. package/dist/adapters/webstorage.d.ts.map +1 -1
  28. package/dist/adapters/webstorage.js +72 -67
  29. package/dist/adapters/webstorage.js.map +1 -1
  30. package/dist/errors.cjs.map +1 -1
  31. package/dist/errors.js.map +1 -1
  32. package/dist/index.cjs +1 -1
  33. package/dist/index.d.ts +2 -7
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +8 -10
  36. package/dist/internal.cjs +1 -1
  37. package/dist/internal.cjs.map +1 -1
  38. package/dist/internal.d.ts +8 -37
  39. package/dist/internal.d.ts.map +1 -1
  40. package/dist/internal.js +48 -98
  41. package/dist/internal.js.map +1 -1
  42. package/dist/migration.cjs +1 -1
  43. package/dist/migration.cjs.map +1 -1
  44. package/dist/migration.js +1 -3
  45. package/dist/migration.js.map +1 -1
  46. package/dist/prune.cjs +1 -1
  47. package/dist/prune.cjs.map +1 -1
  48. package/dist/prune.d.ts +2 -2
  49. package/dist/prune.d.ts.map +1 -1
  50. package/dist/prune.js +13 -13
  51. package/dist/prune.js.map +1 -1
  52. package/dist/query.cjs +1 -1
  53. package/dist/query.cjs.map +1 -1
  54. package/dist/query.d.ts +6 -6
  55. package/dist/query.d.ts.map +1 -1
  56. package/dist/query.js +1 -1
  57. package/dist/query.js.map +1 -1
  58. package/dist/streaming.d.ts +1 -21
  59. package/dist/streaming.d.ts.map +1 -1
  60. package/dist/ttl.cjs +1 -1
  61. package/dist/ttl.cjs.map +1 -1
  62. package/dist/ttl.d.ts +2 -47
  63. package/dist/ttl.d.ts.map +1 -1
  64. package/dist/ttl.js +1 -8
  65. package/dist/ttl.js.map +1 -1
  66. package/dist/types.cjs.map +1 -1
  67. package/dist/types.d.ts +29 -316
  68. package/dist/types.d.ts.map +1 -1
  69. package/dist/types.js.map +1 -1
  70. package/dist/vault.cjs +1 -1
  71. package/dist/vault.cjs.map +1 -1
  72. package/dist/vault.iife.js +1 -1
  73. package/dist/vault.iife.js.map +1 -1
  74. package/dist/vault.js +1 -1
  75. package/dist/vault.js.map +1 -1
  76. package/dist/versioned-codec.d.ts +1 -43
  77. package/dist/versioned-codec.d.ts.map +1 -1
  78. package/package.json +7 -7
  79. package/dist/streaming.cjs +0 -2
  80. package/dist/streaming.cjs.map +0 -1
  81. package/dist/streaming.js +0 -21
  82. package/dist/streaming.js.map +0 -1
  83. package/dist/versioned-codec.cjs +0 -2
  84. package/dist/versioned-codec.cjs.map +0 -1
  85. package/dist/versioned-codec.js +0 -32
  86. package/dist/versioned-codec.js.map +0 -1
package/dist/vault.js CHANGED
@@ -1,2 +1,2 @@
1
- var e=!globalThis.__VAULT_PROD__;function t(t){e&&console.warn(`[@vielzeug/vault] ${t}`)}function n(t,...n){e&&console.error(`[@vielzeug/vault] ${t}`,...n)}var r=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},i=class extends r{constructor(e=`adapter is disposed`,t){super(e,t)}},a=class extends r{},o=class extends r{},s=class extends r{},c=`\0`;function l(e){return`${encodeURIComponent(e)}${c}`}function u(e,t,n){return`${encodeURIComponent(e)}${c}${encodeURIComponent(t)}${c}${encodeURIComponent(n)}`}function d(e,t){return`${encodeURIComponent(e)}${c}${encodeURIComponent(t)}${c}`}function f(e,t){if(!t)return;let n=l(e);if(!t.startsWith(n))return;let r=t.slice(n.length),i=r.indexOf(c);if(i!==-1)try{return decodeURIComponent(r.slice(0,i))}catch{return}}function p(e,t){let r=new Map,a=!1,o=e=>{t?t(e):n(`observer notification failed`,e)},s=t=>{if(a)return;let n=r.get(t);!n||n.size===0||e(t).then(e=>{if(a)return;let n=r.get(t);if(!(!n||n.size===0))for(let t of n)try{t(e)}catch(e){o(e)}}).catch(e=>o(e))};return{dispose:()=>{a=!0,r.clear()},notify:s,observe:(e,t,{immediate:n=!0,signal:o}={})=>{if(a)throw new i(`observer hub is disposed`);if(o?.aborted)return()=>{};let c=e,l=t,u=r.get(c);u||(u=new Set,r.set(c,u)),u.add(l),n&&s(e);let d=()=>{let e=r.get(c);e&&(e.delete(l),e.size===0&&r.delete(c))};return o?.addEventListener(`abort`,d,{once:!0}),d}}}function m(e,t=`latest`,n){return{[Symbol.asyncIterator](){let r=[],i=null,a=n?.aborted??!1,o=null,s=()=>{a||(a=!0,o?.(),o=null,i&&=(i({done:!0,value:void 0}),null))};return n?.addEventListener(`abort`,s,{once:!0}),a||(o=e(e=>{if(!a)if(i){let t=i;i=null,t({done:!1,value:e})}else t===`all`?r.push(e):r=[e]})),{async next(){return a?{done:!0,value:void 0}:r.length>0?{done:!1,value:r.shift()}:new Promise(e=>{i=e})},async return(){return s(),{done:!0,value:void 0}},async throw(e){return s(),Promise.reject(e)}}}}}function h(e){return function(n,r,{eager:i=!1,signal:o}={}){let s=[...new Set(n)];if(s.length===0)throw new a(`observeMany requires at least one table`);if(s.length<n.length&&t(`observeMany: duplicate table names were ignored`),o?.aborted)return()=>{};let c=new Map,l=!1,u=!1,d=()=>Object.fromEntries(n.map(e=>[e,c.get(e)??[]])),f=()=>{l||!i&&c.size<s.length||(l=!0,queueMicrotask(()=>{l=!1,u||r(d())}))},p=s.map(t=>e.observe(t,e=>{c.set(t,e),f()})),m=()=>{u=!0;for(let e of p)e()};return o?.addEventListener(`abort`,m,{once:!0}),m}}function g(e,t,n){let i=String(e[t].key),a=n[i];if(a==null)throw new r(`key field "${i}" in table "${String(t)}" must be a non-null value, got ${String(a)}`);return a}async function _(e,t){let n=await e.source();for(let e of t)n=e.apply(n);return n}function v(e,t){if(!Number.isInteger(e)||e<0)throw new r(`${t} must be a non-negative integer`);return e}function y(e,t){return{deleteMany:e.deleteMany,source:t}}function b(e,t=[]){let n=n=>b(e,[...t,n]);return{between(r,i,a){let o=String(r);if(t.length===0){if(e.getRange&&e.keyField===o)return b(y(e,()=>e.getRange({lower:i,type:`between`,upper:a})),t);if(e.getIndexRange&&e.indexedFields?.has(o))return b(y(e,()=>e.getIndexRange(o,{lower:i,type:`between`,upper:a})),t)}return n({apply:e=>e.filter(e=>{let t=e[r];return t>=i&&t<=a})})},count(){return _(e,t).then(e=>e.length)},async delete(){if(!e.deleteMany)throw new r(`query.delete is not available for this adapter context`);let n=await _(e,t);return e.deleteMany(n)},equals(n,r){let i=String(n);if(t.length===0){if(e.getRange&&e.keyField===i)return b(y(e,()=>e.getRange({type:`eq`,value:r})));if(e.getIndexRange&&e.indexedFields?.has(i))return b(y(e,()=>e.getIndexRange(i,{type:`eq`,value:r})))}return b(e,[...t,{apply:e=>e.filter(e=>e[n]===r)}])},async exists(){return t.length===0?e.source().then(e=>e.length>0):_(e,t).then(e=>e.length>0)},filter(e){return n({apply:t=>t.filter(e)})},first(){return t.length===0?e.source().then(e=>e[0]):_(e,t).then(e=>e[0])},limit(e){let t=v(e,`query.limit`);return n({apply:e=>e.slice(0,t),isNonFilter:!0})},offset(e){let t=v(e,`query.offset`);return n({apply:e=>e.slice(t),isNonFilter:!0})},orderBy(e,t=`asc`){return n({apply:n=>{let r=t===`asc`?1:-1;return[...n].sort((t,n)=>{let i=t[e],a=n[e];return i===a?0:i>a?r:-r})},isNonFilter:!0})},startsWith(r,i,{ignoreCase:a=!1}={}){let o=String(r);if(!a&&i.length>0&&t.length===0){if(e.getRange&&e.keyField===o)return b(y(e,()=>e.getRange({prefix:i,type:`starts`})),t);if(e.getIndexRange&&e.indexedFields?.has(o))return b(y(e,()=>e.getIndexRange(o,{prefix:i,type:`starts`})),t)}let s=a?i.toLowerCase():i;return n({apply:e=>e.filter(e=>{let t=e[r];return typeof t==`string`?(a?t.toLowerCase():t).startsWith(s):!1})})},toArray(){return _(e,t)},totalCount(){return _(e,t.filter(e=>!e.isNonFilter)).then(e=>e.length)}}}var x={days:e=>C(C(e,`ttl.days`)*864e5,`ttl.days (result)`),hours:e=>C(C(e,`ttl.hours`)*36e5,`ttl.hours (result)`),minutes:e=>C(C(e,`ttl.minutes`)*6e4,`ttl.minutes (result)`),ms:e=>C(e,`ttl.ms`),seconds:e=>C(C(e,`ttl.seconds`)*1e3,`ttl.seconds (result)`)};function S(e){return e!==void 0&&Date.now()>=e}function C(e,t){if(!Number.isFinite(e)||e<=0)throw new r(`${t} expected a finite positive number, received ${String(e)}`);return e}function w(e){if(typeof e!=`object`||!e||!(`value`in e))return;let t=e;if(!(t.expiresAt!==void 0&&(typeof t.expiresAt!=`number`||!Number.isFinite(t.expiresAt))))return t}var T={decode:w,encode:(e,t)=>t===void 0?{value:e}:{expiresAt:t,value:e}},E=typeof performance<`u`?()=>performance.now():()=>Date.now();function D(e,t,n){return n!==void 0&&C(n,`put/putAll`),n??e[t].defaultTtl}function O(e,t,n,i,a){let o=g(e,t,i);if(o!==n)throw new r(`${a}: key field "${e[t].key}" must be "${String(n)}" but got "${String(o)}" in table "${t}"`)}function k(e,t,n){return e.getMany?e.getMany(t,n):Promise.all(n.map(n=>e.get(t,n)))}function A(e,t,n,r){let i=n[e],a=i.key,o=i.indexes?new Set(i.indexes):void 0;return{deleteMany:async i=>{if(i.length===0)return 0;let a=i.map(t=>g(n,e,t)),o=await t.deleteMany(e,a);return o>0&&r(e),o},getIndexRange:t.getByIndexRange?(n,r)=>t.getByIndexRange(e,n,r):void 0,getRange:t.getByKeyRange?n=>t.getByKeyRange(e,n):void 0,indexedFields:o,keyField:a,source:()=>t.getAll(e)}}function j(e,t,n,r,i){let o=r??((e,t)=>t),s=i?e=>{if(!i.has(e))throw new a(`table "${e}" is not part of this batch scope`)}:e=>{};return{async clear(e){s(e),await t.count(e)!==0&&(await t.clear(e),n(e))},async count(e){return s(e),t.count(e)},async delete(e,r){s(e);let i=await t.delete(e,r);return i&&n(e),i},async deleteMany(e,r){s(e);let i=await t.deleteMany(e,r);return i>0&&n(e),i},async entries(n){s(n);let r=await t.getAll(n),i=e[n].key;return r.map(e=>[e[i],e])},async get(e,n){return s(e),t.get(e,n)},async getAll(e){return s(e),t.getAll(e)},async getMany(e,n){return s(e),k(t,e,n)},async getOrDefault(r,i,a,c){s(r);let l=await t.get(r,i);if(l!==void 0)return l;let u=a();return O(e,r,i,u,`getOrDefault: defaultFn()`),await t.put(r,o(r,u),D(e,r,c)),n(r),u},async has(e,n){return s(e),t.has(e,n)},async isEmpty(e){return s(e),await t.count(e)===0},async keys(n,r){if(s(n),r){let i=await t.getAll(n),a=e[n].key;return i.filter(r).map(e=>e[a])}if(t.getAllKeys)return t.getAllKeys(n);let i=await t.getAll(n),a=e[n].key;return i.map(e=>e[a])},async put(r,i,a){s(r),await t.put(r,o(r,i),D(e,r,a)),n(r)},async putAll(r,i,a){if(s(r),i.length===0)return;let c=i.map(e=>o(r,e));await t.putAll(r,c,D(e,r,a)),n(r)},query(r){return s(r),b(A(r,t,e,n))},async update(r,i,a,c){s(r);let l=await t.get(r,i);if(!l)return;let u={...l,...a};return O(e,r,i,u,`update`),await t.put(r,o(r,u),D(e,r,c)),n(r),u},async upsert(r,i,a,c){s(r);let l=a(await t.get(r,i));return O(e,r,i,l,`upsert: fn()`),await t.put(r,o(r,l),D(e,r,c)),n(r),l}}}function M(e,n,o){let{logger:s,onMetrics:c,signals:l,validators:u}=o??{},d=p(e=>n.getAll(e),s?e=>s.error(e instanceof Error?e:Error(String(e)),`[vault] observer notification failed`):void 0),f=new Map,g=async e=>{if(f.has(e))return f.get(e);let t=await n.count(e);return f.set(e,t),t},_=e=>{f.delete(e),d.notify(e),o?.onMutation?.(e)},v=e=>{f.delete(e),d.notify(e)},y=n.pruneAllExpired?.bind(n),x=n.getRawCount?.bind(n),S=o?.onCrossTabMessage?.(v)??void 0;if(l)for(let[e,t]of Object.entries(l))t&&d.observe(e,e=>{t.update(()=>e)});let C=(e,t)=>{let n=u?.[e];if(!n)return t;try{return n.parse(t)}catch(t){throw new r(`validation failed for table "${e}"`,{cause:t})}},w=(e,t,n)=>{if(!c)return n();let r=E();return n().finally(()=>c({duration:E()-r,operation:t,table:e}))},T=async(t,r)=>{let i=new Set,a=await t(j(e,n,e=>i.add(e),C,r));for(let e of i)_(e);return a},D=o?.buildBatch?.({notifyMutation:_,validate:C}),O=!1,k=j(e,n,_,C),M=h(d),N=new AbortController,P=!1,F=()=>{if(P)throw new i},I={async batch(e,n){if(F(),e.length===0)throw new a(`batch requires at least one table`);return!D&&!O&&(O=!0,t(`batch() on this adapter is not atomic — concurrent mutations may interleave. Use createIndexedDB for atomic batches.`)),w(`*`,`batch`,()=>D?D(e,n):T(n,new Set(e)))},async clear(e){F(),await w(e,`clear`,()=>k.clear(e)),f.set(e,0)},async count(e){return F(),w(e,`count`,()=>g(e))},async debug(){F();let t=Object.keys(e);return{tables:await Promise.all(t.map(async e=>{let t=x?await x(e):void 0,r=await n.count(e);return f.set(e,r),{expiredCount:t===void 0?0:Math.max(0,t-r),name:e,recordCount:r}}))}},async delete(e,t){return F(),w(e,`delete`,()=>k.delete(e,t))},async deleteMany(e,t){return F(),w(e,`deleteMany`,()=>k.deleteMany(e,t))},get disposalSignal(){return N.signal},async dispose(){P||(P=!0,N.abort(),S?.(),d.dispose(),await n.dispose?.())},get disposed(){return P},async entries(e){return F(),w(e,`entries`,()=>k.entries(e))},async get(e,t){return F(),w(e,`get`,()=>k.get(e,t))},async getAll(e){return F(),w(e,`getAll`,()=>k.getAll(e))},async getMany(e,t){return F(),w(e,`getMany`,()=>k.getMany(e,t))},async getOrDefault(e,t,n,r){return F(),w(e,`getOrDefault`,()=>k.getOrDefault(e,t,n,r))},async has(e,t){return F(),w(e,`has`,()=>k.has(e,t))},async isEmpty(e){return F(),w(e,`isEmpty`,async()=>await g(e)===0)},async keys(e,t){return F(),w(e,`keys`,()=>k.keys(e,t))},observe(e,t,n){return F(),d.observe(e,t,n)},observeMany:(e,t,n)=>(F(),M(e,t,n)),async pruneExpired(t){F();let r=t??Object.keys(e);if(!t&&y){let e=await y();for(let[t,n]of Object.entries(e))n>0&&f.delete(t);return e}let i=await Promise.all(r.map(async e=>{let t=await n.pruneExpiredInTable(e);return t>0&&f.delete(e),[e,t]}));return Object.fromEntries(i)},async put(e,t,n){F(),await w(e,`put`,()=>k.put(e,t,n))},async putAll(e,t,n){F(),await w(e,`putAll`,()=>k.putAll(e,t,n))},query(t){F();let r=A(t,n,e,_);return b(c?{...r,deleteMany:r.deleteMany?e=>w(t,`queryDelete`,()=>r.deleteMany(e)):void 0,source:()=>w(t,`query`,()=>n.getAll(t))}:r)},async[Symbol.asyncDispose](){await I.dispose()},async update(e,t,n,r){return F(),w(e,`update`,()=>k.update(e,t,n,r))},async upsert(e,t,n,r){return F(),w(e,`upsert`,()=>k.upsert(e,t,n,r))},watch(e,t){return F(),m(t=>d.observe(e,t),t?.mode??`latest`,t?.signal)}};return I}function N(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error??new r(`IndexedDB request failed`))})}function P(e,t,n){return new r(`${t} on "${e}"${n instanceof Error&&n.message?`: ${n.message}`:``}`,{cause:n})}function F(e,t,n){return new Promise((r,i)=>{let a,o;Promise.resolve().then(n).then(e=>{a=e}).catch(t=>{o=t;try{e.abort()}catch{}});let s=(e,n=`transaction failed`)=>{o instanceof Error?i(o):i(P(t,n,o??e))};e.oncomplete=()=>{if(o){s(void 0);return}r(a)},e.onerror=()=>i(P(t,`transaction error`,e.error)),e.onabort=()=>s(e.error,`transaction aborted`)})}async function I(e,t){let n=await N(e.getAll()),r=[];for(let e of n){let n=t(e);n!==void 0&&r.push(n)}return r}async function L(e,t,n,r){let i=e.index(t),a=n.type===`eq`?IDBKeyRange.only(n.value):n.type===`between`?IDBKeyRange.bound(n.lower,n.upper):IDBKeyRange.bound(n.prefix,n.prefix+`￿`),o=await N(i.getAll(a)),s=[];for(let e of o){let t=r(e);t!==void 0&&s.push(t)}return s}async function R(e,t,n){if(t.type===`eq`){let r=await z(e,t.value,n);return r===void 0?[]:[r]}let r=t.type===`between`?IDBKeyRange.bound(t.lower,t.upper):IDBKeyRange.bound(t.prefix,t.prefix+`￿`),i=await N(e.getAll(r)),a=[];for(let e of i){let t=n(e);t!==void 0&&a.push(t)}return a}async function z(e,t,n){let r=await N(e.get(t));if(r!=null)return n(r)}async function B(e,t,n){return await z(e,t,n)!==void 0}async function V(e,t,n){let r=await B(e,t,n);return await N(e.delete(t)),r}async function H(e,t,n){return t.length===0?0:(await Promise.all(t.map(t=>V(e,t,n)))).filter(Boolean).length}async function U(e,t,n,r,i){await N(e.put(r(n,i),t))}function W(e,t){return new Promise((n,i)=>{let a=0,o=e.openCursor();o.onerror=()=>i(o.error??new r(`IndexedDB cursor failed during prune`)),o.onsuccess=()=>{let e=o.result;if(!e){n(a);return}let r=t.decode(e.value);(!r||S(r.expiresAt))&&(e.delete(),a+=1),e.continue()}})}function G(e,t){return{[Symbol.asyncIterator](){let n=e.openCursor(),i={type:`idle`},a=e=>{if(i.type===`waiting`){let{resolve:t}=i;i=e.done?{type:`done`}:{type:`idle`},t(e)}else i={result:e,type:`buffered`}};return n.onerror=()=>{let e=n.error??new r(`IndexedDB cursor iteration failed`);if(i.type===`waiting`){let{reject:t}=i;i={type:`done`},t(e)}else i={error:e,type:`error`}},n.onsuccess=()=>{let e=n.result;if(!e){a({done:!0,value:void 0});return}let r=t(e.value);e.continue(),r!==void 0&&a({done:!1,value:r})},{next(){if(i.type===`error`){let{error:e}=i;return i={type:`done`},Promise.reject(e)}if(i.type===`buffered`){let{result:e}=i;return i=e.done?{type:`done`}:{type:`idle`},Promise.resolve(e)}return i.type===`done`?Promise.resolve({done:!0,value:void 0}):new Promise((e,t)=>{i={reject:t,resolve:e,type:`waiting`}})},return(e){return i.type===`waiting`&&i.resolve({done:!0,value:void 0}),i={type:`done`},Promise.resolve({done:!0,value:e})},throw(e){return i.type===`waiting`&&i.reject(e),i={type:`done`},Promise.reject(e)}}}}}function K(e,t,n,r){let i=e=>t.objectStore(e);return{clear:async e=>{await N(i(e).clear())},count:async e=>(await N(i(e).getAll())).filter(e=>n(e)!==void 0).length,delete:(e,t)=>V(i(e),t,n),deleteMany:(e,t)=>H(i(e),t,n),get:(e,t)=>z(i(e),t,n),getAll:e=>I(i(e),n),getByIndexRange:(e,t,r)=>L(i(e),t,r,n),getByKeyRange:(e,t)=>R(i(e),t,n),getMany:(e,t)=>Promise.all(t.map(t=>z(i(e),t,n))),has:(e,t)=>B(i(e),t,n),pruneExpiredInTable:e=>W(i(e),{decode:n,encode:r}),put(t,n,a){return U(i(t),g(e,t,n),n,r,a)},putAll(t,n,a){return Promise.all(n.map(n=>U(i(t),g(e,t,n),n,r,a))).then(()=>void 0)}}}function q(e){let{codec:t=T,logger:n,migrate:a,name:o,onMetrics:c,schema:l,signals:u,validators:d,version:f=1}=e;if(!Number.isInteger(f)||f<1)throw new r(`createIndexedDB: version must be a positive integer, got ${String(f)}`);let p=e=>{let n=t.decode(e);if(n&&!S(n.expiresAt))return n.value},m=(e,n)=>{let r=n===void 0?void 0:Date.now()+n;return t.encode(e,r)},h=typeof BroadcastChannel<`u`?new BroadcastChannel(`vault:${o}`):void 0;!h&&n&&n.error(`[vault] BroadcastChannel unavailable — cross-tab sync disabled for "${o}"`);let _=null,v=null,y=!1,b=(e,t)=>{for(let[n,r]of Object.entries(l)){let i;i=e.objectStoreNames.contains(n)?t.objectStore(n):e.createObjectStore(n);let a=r.indexes??[];for(let e of a)i.indexNames.contains(e)||i.createIndex(e,`value.${e}`)}},x=async()=>(v||=new Promise((e,t)=>{let n=indexedDB.open(o,f);n.onupgradeneeded=e=>{let r=n.result,i=n.transaction;if(a)try{a({db:r,newVersion:e.newVersion??null,oldVersion:e.oldVersion,tx:i})}catch(e){try{i.abort()}catch{}t(new s(`migration failed for "${o}"`,{cause:e}));return}b(r,i)},n.onsuccess=()=>{if(y){n.result.close(),e();return}let t=n.result;t.onversionchange=()=>{t.close(),_=null,v=null},_=t,e()},n.onerror=()=>{v=null,t(new r(`failed to open "${o}"`,{cause:n.error}))}}),v),C=async(e,t,n)=>{if(y||(_||await x(),!_))throw new i(`"${o}" is disposed`);let r=String(e),a=_.transaction(r,t);return F(a,`${o}/${r}`,()=>n(a.objectStore(r)))},w=async()=>{if(y||(_||await x(),!_))throw new i(`"${o}" is disposed`);return _},E=e=>{h?.postMessage({table:String(e)})},D={clear:e=>C(e,`readwrite`,e=>N(e.clear()).then(()=>void 0)),count:e=>C(e,`readonly`,async e=>(await N(e.getAll())).filter(e=>p(e)!==void 0).length),delete:(e,t)=>C(e,`readwrite`,e=>V(e,t,p)),deleteMany:(e,t)=>t.length===0?Promise.resolve(0):C(e,`readwrite`,e=>H(e,t,p)),async dispose(){y=!0,h?.close(),v&&await v.catch(()=>{}),_?.close(),_=null,v=null},get:(e,t)=>C(e,`readonly`,e=>z(e,t,p)),getAll:e=>C(e,`readonly`,e=>I(e,p)),getAllKeys:e=>C(e,`readonly`,async t=>{let n=await I(t,p),r=l[e].key;return n.map(e=>e[r])}),getByIndexRange:(e,t,n)=>C(e,`readonly`,e=>L(e,t,n,p)),getByKeyRange:(e,t)=>C(e,`readonly`,e=>R(e,t,p)),getMany:(e,t)=>t.length===0?Promise.resolve([]):C(e,`readonly`,e=>Promise.all(t.map(t=>z(e,t,p)))),getRawCount:e=>C(e,`readonly`,e=>N(e.count())),has:(e,t)=>C(e,`readonly`,e=>B(e,t,p)),async pruneAllExpired(){let e=await w(),n=Object.keys(l),r=e.transaction(n,`readwrite`),i=await F(r,`${o}/pruneAll`,()=>Promise.all(n.map(async e=>[e,await W(r.objectStore(e),t)])));return Object.fromEntries(i)},pruneExpiredInTable:e=>C(e,`readwrite`,e=>W(e,t)),put(e,t,n){let r=g(l,e,t);return C(e,`readwrite`,e=>U(e,r,t,m,n))},putAll(e,t,n){return C(e,`readwrite`,r=>Promise.all(t.map(t=>U(r,g(l,e,t),t,m,n))).then(()=>void 0))}},O=async(e,t,n,r)=>{let i=(await w()).transaction([...e],`readwrite`),a=new Set,s=K(l,i,p,m),c=new Set(e),u=j(l,s,e=>a.add(e),r,c),d=await F(i,o,()=>t(u));for(let e of a)n(e);return d};return{...M(l,D,{buildBatch:({notifyMutation:e,validate:t})=>(n,r)=>O(n,r,e,t),logger:n,onCrossTabMessage(e){if(h)return h.onmessage=t=>{let n=t.data?.table;!n||!Object.hasOwn(l,n)||e(n)},()=>{h.onmessage=null}},onMetrics:c,onMutation:E,schema:l,signals:u,validators:d}),iterate(e){if(y)throw new i(`"${o}" is disposed`);let t=async()=>{if(_||await x(),!_||y)throw new i(`"${o}" is disposed`);return G(_.transaction(String(e),`readonly`).objectStore(String(e)),p)},n,r=()=>t().then(e=>(n=e[Symbol.asyncIterator](),n));return{[Symbol.asyncIterator](){return{next(){return n?n.next():r().then(e=>e.next())},return(e){return n?n.return?.(e)??Promise.resolve({done:!0,value:e}):Promise.resolve({done:!0,value:e})},throw(e){return n?n.throw?.(e)??Promise.reject(e):Promise.reject(e)}}}}}}}function J(e){return function(t){if(typeof t!=`object`||!t)return!1;let n=t;if(typeof n.table!=`string`||typeof n.type!=`string`||n.table===`__proto__`||n.table===`constructor`||n.table===`prototype`)return!1;switch(n.type){case`clear`:return!0;case`delete`:return typeof n.key==`string`;case`deleteMany`:return Array.isArray(n.keys)&&n.keys.every(e=>typeof e==`string`);case`put`:return typeof n.key==`string`&&e.decode(n.stored)!==void 0;case`putAll`:return Array.isArray(n.entries)&&n.entries.every(t=>typeof t==`object`&&!!t&&typeof t.key==`string`&&e.decode(t.stored)!==void 0);default:return!1}}}function Y(e){let{codec:t=T,logger:n,name:r,onMetrics:a,schema:o,signals:s,validators:c}=e,l=new Map(Object.keys(o).map(e=>[e,new Map])),u=e=>l.get(e),d=J(t),f=r!==void 0&&typeof BroadcastChannel<`u`?new BroadcastChannel(`vault-memory:${r}`):void 0,p=M(o,{async clear(e){u(e).clear(),f?.postMessage({table:e,type:`clear`})},async count(e){let n=u(e),r=0,i=[];for(let[e,a]of n){let n=t.decode(a);!n||S(n.expiresAt)?i.push(e):r+=1}for(let e of i)n.delete(e);return r},async delete(e,n){let r=u(e),i=r.get(String(n));if(!i)return!1;let a=t.decode(i),o=a!==void 0&&!S(a.expiresAt);return r.delete(String(n)),o&&f?.postMessage({key:String(n),table:e,type:`delete`}),o},async deleteMany(e,n){let r=u(e),i=[];for(let e of n){let n=String(e),a=r.get(n);if(a){let e=t.decode(a);e!==void 0&&!S(e.expiresAt)&&i.push(n),r.delete(n)}}return i.length>0&&f?.postMessage({keys:i,table:e,type:`deleteMany`}),i.length},dispose:f?async()=>f.close():void 0,async get(e,n){let r=u(e),i=r.get(String(n));if(!i)return;let a=t.decode(i);if(!a||S(a.expiresAt)){r.delete(String(n));return}return a.value},async getAll(e){let n=u(e),r=[],i=[];for(let[e,a]of n){let n=t.decode(a);!n||S(n.expiresAt)?i.push(e):r.push(n.value)}for(let e of i)n.delete(e);return r},async getRawCount(e){return u(e).size},async has(e,n){let r=u(e),i=r.get(String(n));if(!i)return!1;let a=t.decode(i),o=a!==void 0&&!S(a.expiresAt);return o||r.delete(String(n)),o},async pruneExpiredInTable(e){let n=u(e),r=0;for(let[e,i]of n){let a=t.decode(i);(!a||S(a.expiresAt))&&(n.delete(e),r+=1)}return r},async put(e,n,r){let i=String(g(o,e,n)),a=r===void 0?void 0:Date.now()+r,s=t.encode(n,a);u(e).set(i,s),f?.postMessage({key:i,stored:s,table:e,type:`put`})},async putAll(e,n,r){let i=u(e),a=[],s=r===void 0?void 0:Date.now()+r;for(let r of n){let n=String(g(o,e,r)),c=t.encode(r,s);i.set(n,c),a.push({key:n,stored:c})}a.length>0&&f?.postMessage({entries:a,table:e,type:`putAll`})}},{logger:n,onCrossTabMessage:f?e=>(f.onmessage=n=>{let r;try{if(!d(n.data))return;r=n.data}catch{return}let i=l.get(r.table);if(!i)return;let a=c?.[r.table],s=o[r.table]?.key,u=(e,n)=>{try{let r=t.decode(n);if(!r)return!1;let o=a?a.parse(r.value):r.value;if(s&&String(o[s])!==e)return!1;let c=r.expiresAt===void 0?{value:o}:{expiresAt:r.expiresAt,value:o};return i.set(e,c),!0}catch{return!1}};switch(r.type){case`clear`:i.clear(),e(r.table);return;case`delete`:i.delete(r.key),e(r.table);return;case`deleteMany`:for(let e of r.keys)i.delete(e);e(r.table);return;case`put`:u(r.key,r.stored)&&e(r.table);return;case`putAll`:{let t=!1;for(let{key:e,stored:n}of r.entries)u(e,n)&&(t=!0);t&&e(r.table)}return}},()=>{f.onmessage=null}):void 0,onMetrics:a,schema:o,signals:s,validators:c});return{...p,iterate(e){let n=u(String(e));return{async*[Symbol.asyncIterator](){if(p.disposed)throw new i;let e=[];for(let[r,i]of n){let n=t.decode(i);!n||S(n.expiresAt)?e.push(r):yield n.value}for(let t of e)n.delete(t)}}}}}var X=new Set([`QuotaExceededError`,`NS_ERROR_DOM_QUOTA_REACHED`]);function Z(e){let{codec:t=T,getStorage:n,logger:i,name:a,onMetrics:s,onQuotaExceeded:c,schema:p,signals:m,storageLabel:h,validators:_}=e,v;try{v=n()}catch(e){throw new r(`${h} is not available in this environment (private browsing or sandboxed iframe?)`,{cause:e})}let y=()=>v,b=new Map(Object.keys(p).map(e=>[e,d(a,e)])),x=e=>{let t=b.get(e);if(!t)throw new r(`table "${e}" not in schema`);return t},C=(e,t,n)=>{try{y().setItem(t,JSON.stringify(n))}catch(t){if(t instanceof DOMException&&X.has(t.name)){let n=new o(`${h} quota exceeded while writing record`,{cause:t});if(c?.(e,n)===`ignore`)return;throw n}throw t}},w=new Set;(()=>{let e=l(a);for(let t=0;t<v.length;t++){let n=v.key(t);n!==null&&n.startsWith(e)&&w.add(n)}})();let E=e=>{let n=y().getItem(e);if(n)try{let e=t.decode(JSON.parse(n));return!e||S(e.expiresAt)?void 0:e.value}catch{return}},D=e=>{y().removeItem(e),w.delete(e)};return M(p,{async clear(e){let t=y(),n=x(e),r=[];for(let e of w)e.startsWith(n)&&r.push(e);for(let e of r)t.removeItem(e),w.delete(e)},async count(e){let t=x(e),n=[],r=0;for(let e of w)e.startsWith(t)&&(E(e)===void 0?n.push(e):r+=1);for(let e of n)D(e);return r},async delete(e,t){let n=u(a,e,String(t));return E(n)===void 0?(w.has(n)&&D(n),!1):(D(n),!0)},async deleteMany(e,t){let n=0;for(let r of t){let t=u(a,e,String(r));E(t)===void 0?w.has(t)&&D(t):(D(t),n+=1)}return n},async get(e,t){let n=u(a,e,String(t)),r=E(n);return r===void 0&&w.has(n)&&D(n),r},async getAll(e){let t=[],n=[],r=x(e);for(let e of w){if(!e.startsWith(r))continue;let i=E(e);if(i===void 0){n.push(e);continue}t.push(i)}for(let e of n)D(e);return t},async getAllKeys(e){let t=x(e),n=[],r=[];for(let i of w){if(!i.startsWith(t))continue;let a=E(i);if(a===void 0){r.push(i);continue}n.push(a[p[e].key])}for(let e of r)D(e);return n},async getRawCount(e){let t=x(e),n=0;for(let e of w)e.startsWith(t)&&(n+=1);return n},async has(e,t){let n=u(a,e,String(t)),r=E(n);return r===void 0&&w.has(n)&&D(n),r!==void 0},async pruneExpiredInTable(e){let n=x(e),r=[];for(let e of w){if(!e.startsWith(n))continue;let i=y().getItem(e);if(i===null){r.push(e);continue}try{let n=t.decode(JSON.parse(i));(!n||S(n.expiresAt))&&r.push(e)}catch{r.push(e)}}for(let e of r)D(e);return r.length},async put(e,n,r){let i=u(a,e,String(g(p,e,n))),o=r===void 0?void 0:Date.now()+r;C(e,i,t.encode(n,o)),w.add(i)},async putAll(e,n,r){let i=r===void 0?void 0:Date.now()+r;for(let r of n){let n=u(a,e,String(g(p,e,r)));C(e,n,t.encode(r,i)),w.add(n)}}},{logger:i,onCrossTabMessage(e){if(typeof window>`u`||typeof window.addEventListener!=`function`)return;let t=t=>{if(t.storageArea&&t.storageArea!==v)return;if(t.key===null){w.clear();for(let t of Object.keys(p))e(t);return}let n=f(a,t.key);n&&Object.hasOwn(p,n)&&(t.newValue===null?w.delete(t.key):w.add(t.key),e(n))};return window.addEventListener(`storage`,t),()=>window.removeEventListener(`storage`,t)},onMetrics:s,schema:p,signals:m,validators:_})}function Q(e){return Z({...e,getStorage:()=>typeof window<`u`?window.localStorage:localStorage,storageLabel:`localStorage`})}function $(e){return Z({...e,getStorage:()=>typeof window<`u`?window.sessionStorage:sessionStorage,storageLabel:`sessionStorage`})}function ee(e){return({db:t,tx:n})=>{for(let r of e)switch(r.type){case`addIndex`:{let e=n.objectStore(r.table);e.indexNames.contains(r.field)||e.createIndex(r.field,`value.${r.field}`);break}case`addTable`:t.objectStoreNames.contains(r.name)||t.createObjectStore(r.name);break;case`removeIndex`:{let e=n.objectStore(r.table);e.indexNames.contains(r.field)&&e.deleteIndex(r.field);break}case`removeTable`:t.objectStoreNames.contains(r.name)&&t.deleteObjectStore(r.name);break}}}function te(e,n){if(!Number.isFinite(n.interval)||n.interval<=0)throw new r(`scheduleExpiredPrune: interval must be a finite positive number`);let a=!0,o=()=>{a=!1,clearInterval(s)};n.signal?.addEventListener(`abort`,o,{once:!0});let s=setInterval(()=>{a&&e.pruneExpired().catch(e=>{e instanceof i?(a=!1,clearInterval(s)):n.onError?n.onError(e):t(`scheduleExpiredPrune: pruneExpired() threw — pass onError to handle this. ${String(e)}`)})},n.interval);return o}function ne(e){let t=e[Symbol.asyncIterator]();return new ReadableStream({async cancel(){await t.return?.()},async pull(e){try{let{done:n,value:r}=await t.next();n?e.close():e.enqueue(r)}catch(t){e.error(t)}}})}function re(e,t){if(e.length===0)throw new r(`createVersionedCodec: at least one version entry is required`);let n=new Map;for(let t of e){if(!Number.isInteger(t.version)||t.version<0)throw new r(`createVersionedCodec: version must be a non-negative integer, got ${String(t.version)}`);if(n.has(t.version))throw new r(`createVersionedCodec: duplicate version ${String(t.version)}`);n.set(t.version,t.codec)}if(!n.has(t))throw new r(`createVersionedCodec: currentVersion ${String(t)} is not listed in versions`);let i=n.get(t);return{decode(e){if(typeof e!=`object`||!e||!(`__v`in e))return;let t=e,r=t.__v;if(typeof r!=`number`)return;let i=n.get(r);if(i)return i.decode(t.__d)},encode(e,n){return{__d:i.encode(e,n),__v:t}}}}function ie(e){function t(e){return{...e,index:n=>{let i=e.indexes??[];if(i.includes(n))throw new r(`table index "${n}" is already registered`);return t({...e,indexes:[...i,n]})},ttl:n=>(C(n,`table.ttl`),t({...e,defaultTtl:n}))}}return t({key:e})}export{i as VaultDisposedError,r as VaultError,s as VaultMigrationError,o as VaultQuotaError,a as VaultScopeError,q as createIndexedDB,Q as createLocalStorage,Y as createMemory,$ as createSessionStorage,re as createVersionedCodec,T as defaultCodec,ee as defineMigration,S as isExpired,te as scheduleExpiredPrune,ie as table,ne as toReadableStream,x as ttl};
1
+ var e=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},t=class extends e{constructor(e=`adapter is disposed`,t){super(e,t)}},n=class extends e{},r=class extends e{},i=class extends e{},a=`\0`;function o(t){if(typeof t==`number`){if(!Number.isFinite(t))throw new e(`primary key must be a finite number, received ${String(t)}`);return`n:${String(t)}`}return`s:${encodeURIComponent(t)}`}function s(e){return`${encodeURIComponent(e)}${a}`}function c(e,t,n){return`${encodeURIComponent(e)}${a}${encodeURIComponent(t)}${a}${o(n)}`}function l(e,t){return`${encodeURIComponent(e)}${a}${encodeURIComponent(t)}${a}`}function u(e,t){if(!t)return;let n=s(e);if(!t.startsWith(n))return;let r=t.slice(n.length),i=r.indexOf(a);if(i!==-1)try{return decodeURIComponent(r.slice(0,i))}catch{return}}function d(e,n){let r=new Map,i=!1,a=e=>{n&&n(e)},o=t=>{if(i)return;let n=r.get(t);!n||n.size===0||e(t).then(e=>{if(i)return;let n=r.get(t);if(!(!n||n.size===0))for(let t of n)try{t(e)}catch(e){a(e)}}).catch(a)};return{dispose:()=>{i=!0,r.clear()},notify:o,observe:(e,n,{immediate:a=!0,signal:s}={})=>{if(i)throw new t(`observer hub is disposed`);if(s?.aborted)return()=>{};let c=n,l=r.get(e)??new Set;r.set(e,l),l.add(c),a&&o(e);let u=()=>{let t=r.get(e);t&&(t.delete(c),t.size===0&&r.delete(e))};return s?.addEventListener(`abort`,u,{once:!0}),u}}}function f(t,n,r){let i=String(t[n].key),a=r[i];if(typeof a!=`number`&&typeof a!=`string`)throw new e(`record in table "${String(n)}" must have a string or finite-number key at "${i}"`);if(typeof a==`number`&&!Number.isFinite(a))throw new e(`record in table "${String(n)}" must have a finite-number key at "${i}"`);return a}async function p(e,t){let n=await e.source();for(let e of t)n=e.apply(n);return n}function m(t,n){if(!Number.isInteger(t)||t<0)throw new e(`${n} must be a non-negative integer`);return t}function h(e,t){return{deleteMany:e.deleteMany,source:t}}function g(t,n=[]){let r=e=>g(t,[...n,e]);return{between(e,i,a){let o=String(e);if(n.length===0){if(t.getRange&&t.keyField===o)return g(h(t,()=>t.getRange({lower:i,type:`between`,upper:a})),n);if(t.getIndexRange&&t.indexedFields?.has(o))return g(h(t,()=>t.getIndexRange(o,{lower:i,type:`between`,upper:a})),n)}return r({apply:t=>t.filter(t=>{let n=t[e];return n>=i&&n<=a})})},count(){return p(t,n).then(e=>e.length)},async delete(){if(!t.deleteMany)throw new e(`query.delete is not available for this adapter context`);let r=await p(t,n);return t.deleteMany(r)},equals(e,r){let i=String(e);if(n.length===0){if(t.getRange&&t.keyField===i)return g(h(t,()=>t.getRange({type:`eq`,value:r})));if(t.getIndexRange&&t.indexedFields?.has(i))return g(h(t,()=>t.getIndexRange(i,{type:`eq`,value:r})))}return g(t,[...n,{apply:t=>t.filter(t=>t[e]===r)}])},async exists(){return n.length===0?t.source().then(e=>e.length>0):p(t,n).then(e=>e.length>0)},filter(e){return r({apply:t=>t.filter(e)})},first(){return n.length===0?t.source().then(e=>e[0]):p(t,n).then(e=>e[0])},limit(e){let t=m(e,`query.limit`);return r({apply:e=>e.slice(0,t),isNonFilter:!0})},offset(e){let t=m(e,`query.offset`);return r({apply:e=>e.slice(t),isNonFilter:!0})},orderBy(e,t=`asc`){return r({apply:n=>{let r=t===`asc`?1:-1;return[...n].sort((t,n)=>{let i=t[e],a=n[e];return i===a?0:i>a?r:-r})},isNonFilter:!0})},startsWith(e,i,{ignoreCase:a=!1}={}){let o=String(e);if(!a&&i.length>0&&n.length===0){if(t.getRange&&t.keyField===o)return g(h(t,()=>t.getRange({prefix:i,type:`starts`})),n);if(t.getIndexRange&&t.indexedFields?.has(o))return g(h(t,()=>t.getIndexRange(o,{prefix:i,type:`starts`})),n)}let s=a?i.toLowerCase():i;return r({apply:t=>t.filter(t=>{let n=t[e];return typeof n==`string`&&(a?n.toLowerCase():n).startsWith(s)})})},toArray(){return p(t,n)},totalCount(){return p(t,n.filter(e=>!e.isNonFilter)).then(e=>e.length)}}}var _={days:e=>y(y(e,`ttl.days`)*864e5,`ttl.days (result)`),hours:e=>y(y(e,`ttl.hours`)*36e5,`ttl.hours (result)`),minutes:e=>y(y(e,`ttl.minutes`)*6e4,`ttl.minutes (result)`),ms:e=>y(e,`ttl.ms`),seconds:e=>y(y(e,`ttl.seconds`)*1e3,`ttl.seconds (result)`)};function v(e){return e!==void 0&&Date.now()>=e}function y(t,n){if(!Number.isFinite(t)||t<=0)throw new e(`${n} expected a finite positive number, received ${String(t)}`);return t}function b(e){if(typeof e!=`object`||!e||!(`value`in e))return;let t=e;if(!(t.expiresAt!==void 0&&(typeof t.expiresAt!=`number`||!Number.isFinite(t.expiresAt))))return t}var x=typeof performance<`u`?()=>performance.now():()=>Date.now();function S(e,t,n){return n!==void 0&&y(n,`put/putAll`),n??e[t].defaultTtl}function C(t,n,r,i,a){let o=f(t,n,i);if(o!==r)throw new e(`${a}: key field "${t[n].key}" must be "${String(r)}" but got "${String(o)}" in table "${n}"`)}function w(e,t,n){return e.getMany?e.getMany(t,n):Promise.all(n.map(n=>e.get(t,n)))}function T(e,t,n,r){let i=n[e],a=i.key,o=i.indexes?new Set(i.indexes):void 0;return{deleteMany:async i=>{if(i.length===0)return 0;let a=i.map(t=>f(n,e,t)),o=await t.deleteMany(e,a);return o>0&&r(e),o},getIndexRange:t.getByIndexRange?(n,r)=>t.getByIndexRange(e,n,r):void 0,getRange:t.getByKeyRange?n=>t.getByKeyRange(e,n):void 0,indexedFields:o,keyField:a,source:()=>t.getAll(e)}}function E(e,t,r,i,a){let o=i??((e,t)=>t),s=a?e=>{if(!a.has(e))throw new n(`table "${e}" is not part of this batch scope`)}:e=>{};return{async clear(e){s(e);let n=await t.count(e);await t.clear(e),n>0&&r(e)},async count(e){return s(e),t.count(e)},async delete(e,n){s(e);let i=await t.delete(e,n);return i&&r(e),i},async deleteMany(e,n){s(e);let i=await t.deleteMany(e,n);return i>0&&r(e),i},async entries(n){s(n);let r=await t.getAll(n),i=e[n].key;return r.map(e=>[e[i],e])},async get(e,n){return s(e),t.get(e,n)},async getAll(e){return s(e),t.getAll(e)},async getMany(e,n){return s(e),w(t,e,n)},async getOrDefault(n,i,a,c){s(n);let l=await t.get(n,i);if(l!==void 0)return l;let u=a();return C(e,n,i,u,`getOrDefault: defaultFn()`),await t.put(n,o(n,u),S(e,n,c)),r(n),u},async has(e,n){return s(e),t.has(e,n)},async isEmpty(e){return s(e),await t.count(e)===0},async keys(n,r){if(s(n),r){let i=await t.getAll(n),a=e[n].key;return i.filter(r).map(e=>e[a])}if(t.getAllKeys)return t.getAllKeys(n);let i=await t.getAll(n),a=e[n].key;return i.map(e=>e[a])},async put(n,i,a){s(n),await t.put(n,o(n,i),S(e,n,a)),r(n)},async putAll(n,i,a){if(s(n),i.length===0)return;let c=i.map(e=>o(n,e));await t.putAll(n,c,S(e,n,a)),r(n)},query(n){return s(n),g(T(n,t,e,r))},async update(n,i,a,c){s(n);let l=await t.get(n,i);if(!l)return;let u={...l,...a};return C(e,n,i,u,`update`),await t.put(n,o(n,u),S(e,n,c)),r(n),u},async upsert(n,i,a,c){s(n);let l=a(await t.get(n,i));return C(e,n,i,l,`upsert: fn()`),await t.put(n,o(n,l),S(e,n,c)),r(n),l}}}function D(n,r,i){let{logger:a,onMetrics:o,validators:s}=i??{},c=d(e=>r.getAll(e),a?e=>a.error(e instanceof Error?e:Error(String(e)),`[vault] observer notification failed`):void 0),l=new Map,u=async e=>{if(l.has(e))return l.get(e);let t=await r.count(e);return l.set(e,t),t},f=e=>{l.delete(e),c.notify(e),i?.onMutation?.(e)},p=e=>{l.delete(e),c.notify(e)},m=r.pruneAllExpired?.bind(r),h=r.getRawCount?.bind(r),_=i?.onCrossTabMessage?.(p)??void 0,v=(t,n)=>{let r=s?.[t];if(!r)return n;try{return r.parse(n)}catch(n){throw new e(`validation failed for table "${t}"`,{cause:n})}},y=(e,t,n)=>{if(!o)return n();let r=x();return n().finally(()=>o({duration:x()-r,operation:t,table:e}))};i?.onTransactions?.({notifyMutation:f,validate:v});let b=E(n,r,f,v),S=new AbortController,C=!1,w=()=>{if(C)throw new t},D={async clear(e){w(),await y(e,`clear`,()=>b.clear(e)),l.set(e,0)},async count(e){return w(),y(e,`count`,()=>u(e))},async debug(){w();let e=Object.keys(n);return{tables:await Promise.all(e.map(async e=>{let t=h?await h(e):void 0,n=await r.count(e);return l.set(e,n),{expiredCount:t===void 0?0:Math.max(0,t-n),name:e,recordCount:n}}))}},async delete(e,t){return w(),y(e,`delete`,()=>b.delete(e,t))},async deleteMany(e,t){return w(),y(e,`deleteMany`,()=>b.deleteMany(e,t))},get disposalSignal(){return S.signal},async dispose(){C||(C=!0,S.abort(),_?.(),c.dispose(),await r.dispose?.())},get disposed(){return C},async entries(e){return w(),y(e,`entries`,()=>b.entries(e))},async get(e,t){return w(),y(e,`get`,()=>b.get(e,t))},async getAll(e){return w(),y(e,`getAll`,()=>b.getAll(e))},async getMany(e,t){return w(),y(e,`getMany`,()=>b.getMany(e,t))},async getOrDefault(e,t,n,r){return w(),y(e,`getOrDefault`,()=>b.getOrDefault(e,t,n,r))},async has(e,t){return w(),y(e,`has`,()=>b.has(e,t))},async isEmpty(e){return w(),y(e,`isEmpty`,async()=>await u(e)===0)},async keys(e,t){return w(),y(e,`keys`,()=>b.keys(e,t))},observe(e,t,n){return w(),c.observe(e,t,n)},async pruneExpired(e){w();let t=e??Object.keys(n);if(!e&&m){let e=await m();for(let[t,n]of Object.entries(e))n>0&&l.delete(t);return e}let i=await Promise.all(t.map(async e=>{let t=await r.pruneExpiredInTable(e);return t>0&&l.delete(e),[e,t]}));return Object.fromEntries(i)},async put(e,t,n){w(),await y(e,`put`,()=>b.put(e,t,n))},async putAll(e,t,n){w(),await y(e,`putAll`,()=>b.putAll(e,t,n))},query(e){w();let t=T(e,r,n,f);return g(o?{...t,deleteMany:t.deleteMany?n=>y(e,`queryDelete`,()=>t.deleteMany(n)):void 0,source:()=>y(e,`query`,()=>r.getAll(e))}:t)},async[Symbol.asyncDispose](){await D.dispose()},async update(e,t,n,r){return w(),y(e,`update`,()=>b.update(e,t,n,r))},async upsert(e,t,n,r){return w(),y(e,`upsert`,()=>b.upsert(e,t,n,r))}};return D}function O(e,t){return Object.assign(e,{batch:t})}function k(t){return new Promise((n,r)=>{t.onsuccess=()=>n(t.result),t.onerror=()=>r(t.error??new e(`IndexedDB request failed`))})}function A(t,n,r){return new e(`${n} on "${t}"${r instanceof Error&&r.message?`: ${r.message}`:``}`,{cause:r})}function j(e,t,n){return new Promise((r,i)=>{let a,o;Promise.resolve().then(n).then(e=>{a=e}).catch(t=>{o=t;try{e.abort()}catch{}});let s=(e,n=`transaction failed`)=>{o instanceof Error?i(o):i(A(t,n,o??e))};e.oncomplete=()=>{if(o){s(void 0);return}r(a)},e.onerror=()=>i(A(t,`transaction error`,e.error)),e.onabort=()=>s(e.error,`transaction aborted`)})}async function M(e,t){let n=await k(e.getAll()),r=[];for(let e of n){let n=t(e);n!==void 0&&r.push(n)}return r}async function N(e,t,n,r){let i=e.index(t),a=n.type===`eq`?IDBKeyRange.only(n.value):n.type===`between`?IDBKeyRange.bound(n.lower,n.upper):IDBKeyRange.bound(n.prefix,n.prefix+`￿`),o=await k(i.getAll(a)),s=[];for(let e of o){let t=r(e);t!==void 0&&s.push(t)}return s}async function P(e,t,n){let r=await k(e.get(t));if(r!=null)return n(r)}async function F(e,t,n){return await P(e,t,n)!==void 0}async function I(e,t,n){let r=await F(e,t,n);return await k(e.delete(t)),r}async function L(e,t,n){return t.length===0?0:(await Promise.all(t.map(t=>I(e,t,n)))).filter(Boolean).length}async function R(e,t,n,r,i){await k(e.put(r(n,i),t))}function z(t){return new Promise((n,r)=>{let i=0,a=t.openCursor();a.onerror=()=>r(a.error??new e(`IndexedDB cursor failed during prune`)),a.onsuccess=()=>{let e=a.result;if(!e){n(i);return}let t=b(e.value);(!t||v(t.expiresAt))&&(e.delete(),i+=1),e.continue()}})}function B(t,n){return{[Symbol.asyncIterator](){let r=t.openCursor(),i={type:`idle`},a=e=>{if(i.type===`waiting`){let{resolve:t}=i;i=e.done?{type:`done`}:{type:`idle`},t(e)}else i={result:e,type:`buffered`}};return r.onerror=()=>{let t=r.error??new e(`IndexedDB cursor iteration failed`);if(i.type===`waiting`){let{reject:e}=i;i={type:`done`},e(t)}else i={error:t,type:`error`}},r.onsuccess=()=>{let e=r.result;if(!e){a({done:!0,value:void 0});return}let t=n(e.value);e.continue(),t!==void 0&&a({done:!1,value:t})},{next(){if(i.type===`error`){let{error:e}=i;return i={type:`done`},Promise.reject(e)}if(i.type===`buffered`){let{result:e}=i;return i=e.done?{type:`done`}:{type:`idle`},Promise.resolve(e)}return i.type===`done`?Promise.resolve({done:!0,value:void 0}):new Promise((e,t)=>{i={reject:t,resolve:e,type:`waiting`}})},return(e){return i.type===`waiting`&&i.resolve({done:!0,value:void 0}),i={type:`done`},Promise.resolve({done:!0,value:e})},throw(e){return i.type===`waiting`&&i.reject(e),i={type:`done`},Promise.reject(e)}}}}}function V(e,t,n,r){let i=e=>t.objectStore(e);return{clear:async e=>{await k(i(e).clear())},count:async e=>(await k(i(e).getAll())).filter(e=>n(e)!==void 0).length,delete:(e,t)=>I(i(e),o(t),n),deleteMany:(e,t)=>L(i(e),t.map(o),n),get:(e,t)=>P(i(e),o(t),n),getAll:e=>M(i(e),n),getByIndexRange:(e,t,r)=>N(i(e),t,r,n),getMany:(e,t)=>Promise.all(t.map(t=>P(i(e),o(t),n))),has:(e,t)=>F(i(e),o(t),n),pruneExpiredInTable:e=>z(i(e)),put(t,n,a){return R(i(t),o(f(e,t,n)),n,r,a)},putAll(t,n,a){return Promise.all(n.map(n=>R(i(t),o(f(e,t,n)),n,r,a))).then(()=>void 0)}}}function H(n){let{logger:r,migrate:a,name:s,onMetrics:c,schema:l,validators:u,version:d=1}=n;if(!Number.isInteger(d)||d<1)throw new e(`createIndexedDB: version must be a positive integer, got ${String(d)}`);let p=e=>{let t=b(e);return!t||v(t.expiresAt)?void 0:t.value},m=(e,t)=>t===void 0?{value:e}:{expiresAt:Date.now()+t,value:e},h=typeof BroadcastChannel<`u`?new BroadcastChannel(`vault:${s}`):void 0;!h&&r&&r.error(`[vault] BroadcastChannel unavailable — cross-tab sync disabled for "${s}"`);let g=null,_=null,y=!1,x=(e,t)=>{for(let[n,r]of Object.entries(l)){let i;i=e.objectStoreNames.contains(n)?t.objectStore(n):e.createObjectStore(n);let a=r.indexes??[];for(let e of a)i.indexNames.contains(e)||i.createIndex(e,`value.${e}`)}},S=async()=>(_||=new Promise((t,n)=>{let r=indexedDB.open(s,d);r.onupgradeneeded=e=>{let t=r.result,o=r.transaction;if(a)try{a({db:t,newVersion:e.newVersion??null,oldVersion:e.oldVersion,tx:o})}catch(e){try{o.abort()}catch{}n(new i(`migration failed for "${s}"`,{cause:e}));return}x(t,o)},r.onsuccess=()=>{if(y){r.result.close(),t();return}let e=r.result;e.onversionchange=()=>{e.close(),g=null,_=null},g=e,t()},r.onerror=()=>{_=null,n(new e(`failed to open "${s}"`,{cause:r.error}))}}),_),C=async(e,n,r)=>{if(y||(g||await S(),!g))throw new t(`"${s}" is disposed`);let i=String(e),a=g.transaction(i,n);return j(a,`${s}/${i}`,()=>r(a.objectStore(i)))},w=async()=>{if(y||(g||await S(),!g))throw new t(`"${s}" is disposed`);return g},T=e=>{h?.postMessage({table:String(e)})},A={clear:e=>C(e,`readwrite`,e=>k(e.clear()).then(()=>void 0)),count:e=>C(e,`readonly`,async e=>(await k(e.getAll())).filter(e=>p(e)!==void 0).length),delete:(e,t)=>C(e,`readwrite`,e=>I(e,o(t),p)),deleteMany:(e,t)=>t.length===0?Promise.resolve(0):C(e,`readwrite`,e=>L(e,t.map(o),p)),async dispose(){y=!0,h?.close(),_&&await _.catch(()=>{}),g?.close(),g=null,_=null},get:(e,t)=>C(e,`readonly`,e=>P(e,o(t),p)),getAll:e=>C(e,`readonly`,e=>M(e,p)),getAllKeys:e=>C(e,`readonly`,async t=>{let n=await M(t,p),r=l[e].key;return n.map(e=>e[r])}),getByIndexRange:(e,t,n)=>C(e,`readonly`,e=>N(e,t,n,p)),getMany:(e,t)=>t.length===0?Promise.resolve([]):C(e,`readonly`,e=>Promise.all(t.map(t=>P(e,o(t),p)))),getRawCount:e=>C(e,`readonly`,e=>k(e.count())),has:(e,t)=>C(e,`readonly`,e=>F(e,o(t),p)),async pruneAllExpired(){let e=await w(),t=Object.keys(l),n=e.transaction(t,`readwrite`),r=await j(n,`${s}/pruneAll`,()=>Promise.all(t.map(async e=>[e,await z(n.objectStore(e))])));return Object.fromEntries(r)},pruneExpiredInTable:e=>C(e,`readwrite`,e=>z(e)),put(e,t,n){let r=o(f(l,e,t));return C(e,`readwrite`,e=>R(e,r,t,m,n))},putAll(e,t,n){return C(e,`readwrite`,r=>Promise.all(t.map(t=>R(r,o(f(l,e,t)),t,m,n))).then(()=>void 0))}},H=async(e,t,n,r)=>{let i=(await w()).transaction([...e],`readwrite`),a=new Set,o=V(l,i,p,m),c=new Set(e),u=E(l,o,e=>a.add(e),r,c),d=await j(i,s,()=>t(u));for(let e of a)n(e);return d},U,W={...D(l,A,{logger:r,onCrossTabMessage(e){if(h)return h.onmessage=t=>{let n=t.data?.table;!n||!Object.hasOwn(l,n)||e(n)},()=>{h.onmessage=null}},onMetrics:c,onMutation:T,onTransactions:e=>{U=(t,n)=>H(t,n,e.notifyMutation,e.validate)},schema:l,validators:u}),iterate(e){if(y)throw new t(`"${s}" is disposed`);let n=async()=>{if(g||await S(),!g||y)throw new t(`"${s}" is disposed`);return B(g.transaction(String(e),`readonly`).objectStore(String(e)),p)},r,i=()=>n().then(e=>(r=e[Symbol.asyncIterator](),r));return{[Symbol.asyncIterator](){return{next(){return r?r.next():i().then(e=>e.next())},return(e){return r?r.return?.(e)??Promise.resolve({done:!0,value:e}):Promise.resolve({done:!0,value:e})},throw(e){return r?r.throw?.(e)??Promise.reject(e):Promise.reject(e)}}}}}};if(!U)throw new e(`IndexedDB transaction capability was not initialized`);return O(W,U)}function U(e){if(typeof e!=`object`||!e)return!1;let t=e;if(typeof t.table!=`string`||typeof t.type!=`string`||t.table===`__proto__`||t.table===`constructor`||t.table===`prototype`)return!1;switch(t.type){case`clear`:return!0;case`delete`:return typeof t.key==`string`;case`deleteMany`:return Array.isArray(t.keys)&&t.keys.every(e=>typeof e==`string`);case`put`:return typeof t.key==`string`&&b(t.stored)!==void 0;case`putAll`:return Array.isArray(t.entries)&&t.entries.every(e=>typeof e==`object`&&!!e&&typeof e.key==`string`&&b(e.stored)!==void 0);default:return!1}}function W(e){let{logger:t,name:n,onMetrics:r,schema:i,validators:a}=e,s=new Map(Object.keys(i).map(e=>[e,new Map])),c=e=>s.get(e),l=n!==void 0&&typeof BroadcastChannel<`u`?new BroadcastChannel(`vault-memory:${n}`):void 0,u={async clear(e){c(e).clear(),l?.postMessage({table:e,type:`clear`})},async count(e){let t=c(e),n=0;for(let[e,r]of t){let i=b(r);!i||v(i.expiresAt)?t.delete(e):n+=1}return n},async delete(e,t){let n=c(e),r=o(t),i=b(n.get(r));n.delete(r);let a=i!==void 0&&!v(i.expiresAt);return a&&l?.postMessage({key:r,table:e,type:`delete`}),a},async deleteMany(e,t){let n=0,r=[];for(let i of t){let t=o(i),a=b(c(e).get(t));c(e).delete(t),a!==void 0&&!v(a.expiresAt)&&(n+=1,r.push(t))}return r.length>0&&l?.postMessage({keys:r,table:e,type:`deleteMany`}),n},dispose:l?async()=>l.close():void 0,async get(e,t){let n=c(e),r=o(t),i=b(n.get(r));if(!i||v(i.expiresAt)){n.delete(r);return}return i.value},async getAll(e){let t=c(e),n=[];for(let[e,r]of t){let i=b(r);!i||v(i.expiresAt)?t.delete(e):n.push(i.value)}return n},async getRawCount(e){return c(e).size},async has(e,t){return await u.get(e,t)!==void 0},async pruneExpiredInTable(e){let t=c(e),n=0;for(let[e,r]of t){let i=b(r);(!i||v(i.expiresAt))&&(t.delete(e),n+=1)}return n},async put(e,t,n){let r=o(f(i,e,t)),a=n===void 0?{value:t}:{expiresAt:Date.now()+n,value:t};c(e).set(r,a),l?.postMessage({key:r,stored:a,table:e,type:`put`})},async putAll(e,t,n){let r=n===void 0?void 0:Date.now()+n,a=[];for(let n of t){let t=o(f(i,e,n)),s=r===void 0?{value:n}:{expiresAt:r,value:n};c(e).set(t,s),a.push({key:t,stored:s})}a.length>0&&l?.postMessage({entries:a,table:e,type:`putAll`})}};return D(i,u,{logger:t,onCrossTabMessage:l?e=>(l.onmessage=t=>{if(!U(t.data))return;let n=t.data;if(!s.has(n.table))return;let r=c(n.table),l=(e,t)=>{let s=b(t),c=i[n.table]?.key,l=a?.[n.table];if(!s||!c)return!1;try{let t=l?l.parse(s.value):s.value;return o(t[c])===e&&(r.set(e,s.expiresAt===void 0?{value:t}:{expiresAt:s.expiresAt,value:t}),!0)}catch{return!1}};switch(n.type){case`clear`:r.clear(),e(n.table);break;case`delete`:r.delete(n.key),e(n.table);break;case`deleteMany`:for(let e of n.keys)r.delete(e);e(n.table);break;case`put`:l(n.key,n.stored)&&e(n.table);break;case`putAll`:n.entries.some(e=>l(e.key,e.stored))&&e(n.table)}},()=>{l.onmessage=null}):void 0,onMetrics:r,schema:i,validators:a})}var G=new Set([`QuotaExceededError`,`NS_ERROR_DOM_QUOTA_REACHED`]);function K(t){let{getStorage:n,logger:i,name:a,onMetrics:o,onQuotaExceeded:d,schema:p,storageLabel:m,validators:h}=t,g;try{g=n()}catch(t){throw new e(`${m} is not available in this environment (private browsing or sandboxed iframe?)`,{cause:t})}let _=()=>g,y=new Map(Object.keys(p).map(e=>[e,l(a,e)])),x=t=>{let n=y.get(t);if(!n)throw new e(`table "${t}" not in schema`);return n},S=(e,t,n)=>{try{_().setItem(t,JSON.stringify(n))}catch(t){if(t instanceof DOMException&&G.has(t.name)){let n=new r(`${m} quota exceeded while writing record`,{cause:t});if(d?.(e,n)===`ignore`)return;throw n}throw t}},C=new Set;(()=>{let e=s(a);for(let t=0;t<g.length;t++){let n=g.key(t);n!==null&&n.startsWith(e)&&C.add(n)}})();let w=e=>{let t=_().getItem(e);if(t)try{let e=b(JSON.parse(t));return!e||v(e.expiresAt)?void 0:e.value}catch{return}},T=e=>{_().removeItem(e),C.delete(e)};return D(p,{async clear(e){let t=_(),n=x(e),r=[];for(let e of C)e.startsWith(n)&&r.push(e);for(let e of r)t.removeItem(e),C.delete(e)},async count(e){let t=x(e),n=[],r=0;for(let e of C)e.startsWith(t)&&(w(e)===void 0?n.push(e):r+=1);for(let e of n)T(e);return r},async delete(e,t){let n=c(a,e,t);return w(n)===void 0?(C.has(n)&&T(n),!1):(T(n),!0)},async deleteMany(e,t){let n=0;for(let r of t){let t=c(a,e,r);w(t)===void 0?C.has(t)&&T(t):(T(t),n+=1)}return n},async get(e,t){let n=c(a,e,t),r=w(n);return r===void 0&&C.has(n)&&T(n),r},async getAll(e){let t=[],n=[],r=x(e);for(let e of C){if(!e.startsWith(r))continue;let i=w(e);if(i===void 0){n.push(e);continue}t.push(i)}for(let e of n)T(e);return t},async getAllKeys(e){let t=x(e),n=[],r=[];for(let i of C){if(!i.startsWith(t))continue;let a=w(i);if(a===void 0){r.push(i);continue}n.push(a[p[e].key])}for(let e of r)T(e);return n},async getRawCount(e){let t=x(e),n=0;for(let e of C)e.startsWith(t)&&(n+=1);return n},async has(e,t){let n=c(a,e,t),r=w(n);return r===void 0&&C.has(n)&&T(n),r!==void 0},async pruneExpiredInTable(e){let t=x(e),n=[];for(let e of C){if(!e.startsWith(t))continue;let r=_().getItem(e);if(r===null){n.push(e);continue}try{let t=b(JSON.parse(r));(!t||v(t.expiresAt))&&n.push(e)}catch{n.push(e)}}for(let e of n)T(e);return n.length},async put(e,t,n){let r=c(a,e,f(p,e,t)),i=n===void 0?void 0:Date.now()+n;S(e,r,i===void 0?{value:t}:{expiresAt:i,value:t}),C.add(r)},async putAll(e,t,n){let r=n===void 0?void 0:Date.now()+n;for(let n of t){let t=c(a,e,f(p,e,n));S(e,t,r===void 0?{value:n}:{expiresAt:r,value:n}),C.add(t)}}},{logger:i,onCrossTabMessage(e){if(typeof window>`u`||typeof window.addEventListener!=`function`)return;let t=t=>{if(t.storageArea&&t.storageArea!==g)return;if(t.key===null){C.clear();for(let t of Object.keys(p))e(t);return}let n=u(a,t.key);n&&Object.hasOwn(p,n)&&(t.newValue===null?C.delete(t.key):C.add(t.key),e(n))};return window.addEventListener(`storage`,t),()=>window.removeEventListener(`storage`,t)},onMetrics:o,schema:p,validators:h})}function q(e){return K({...e,getStorage:()=>typeof window<`u`?window.localStorage:localStorage,storageLabel:`localStorage`})}function J(e){return K({...e,getStorage:()=>typeof window<`u`?window.sessionStorage:sessionStorage,storageLabel:`sessionStorage`})}function Y(e){return({db:t,tx:n})=>{for(let r of e)switch(r.type){case`addIndex`:{let e=n.objectStore(r.table);e.indexNames.contains(r.field)||e.createIndex(r.field,`value.${r.field}`);break}case`addTable`:t.objectStoreNames.contains(r.name)||t.createObjectStore(r.name);break;case`removeIndex`:{let e=n.objectStore(r.table);e.indexNames.contains(r.field)&&e.deleteIndex(r.field);break}case`removeTable`:t.objectStoreNames.contains(r.name)&&t.deleteObjectStore(r.name)}}}function X(n,r){if(!Number.isFinite(r.interval)||r.interval<=0)throw new e(`scheduleExpiredPrune: interval must be a finite positive number`);let i=!0,a=()=>{i=!1,clearInterval(o)};r.signal?.addEventListener(`abort`,a,{once:!0});let o=setInterval(()=>{i&&n.pruneExpired().catch(e=>{e instanceof t?(i=!1,clearInterval(o)):r.onError?r.onError(e):`${String(e)}`})},r.interval);return a}function Z(t){function n(t){return{...t,index:r=>{let i=t.indexes??[];if(i.includes(r))throw new e(`table index "${r}" is already registered`);return n({...t,indexes:[...i,r]})},ttl:e=>(y(e,`table.ttl`),n({...t,defaultTtl:e}))}}return n({key:t})}export{t as VaultDisposedError,e as VaultError,i as VaultMigrationError,r as VaultQuotaError,n as VaultScopeError,H as createIndexedDB,q as createLocalStorage,W as createMemory,J as createSessionStorage,Y as defineMigration,v as isExpired,X as scheduleExpiredPrune,Z as table,_ as ttl};
2
2
  //# sourceMappingURL=vault.js.map