stroid 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/README.md +375 -468
- package/dist/_tsup-dts-rollup.d.cts +2411 -0
- package/dist/_tsup-dts-rollup.d.ts +2411 -0
- package/dist/async.cjs +29 -24
- package/dist/async.cjs.map +1 -0
- package/dist/async.d.cts +9 -40
- package/dist/async.d.ts +9 -40
- package/dist/async.js +29 -24
- package/dist/async.js.map +1 -0
- package/dist/computed.cjs +12 -10
- package/dist/computed.cjs.map +1 -0
- package/dist/computed.d.cts +7 -29
- package/dist/computed.d.ts +7 -29
- package/dist/computed.js +12 -10
- package/dist/computed.js.map +1 -0
- package/dist/core.cjs +17 -23
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +15 -5
- package/dist/core.d.ts +15 -5
- package/dist/core.js +17 -23
- package/dist/core.js.map +1 -0
- package/dist/devtools.cjs +2 -1
- package/dist/devtools.cjs.map +1 -0
- package/dist/devtools.d.cts +5 -19
- package/dist/devtools.d.ts +5 -19
- package/dist/devtools.js +2 -1
- package/dist/devtools.js.map +1 -0
- package/dist/feature.cjs +2 -0
- package/dist/feature.cjs.map +1 -0
- package/dist/feature.d.cts +14 -0
- package/dist/feature.d.ts +14 -0
- package/dist/feature.js +2 -0
- package/dist/feature.js.map +1 -0
- package/dist/helpers.cjs +17 -13
- package/dist/helpers.cjs.map +1 -0
- package/dist/helpers.d.cts +3 -29
- package/dist/helpers.d.ts +3 -29
- package/dist/helpers.js +17 -13
- package/dist/helpers.js.map +1 -0
- package/dist/index.cjs +26 -21
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +33 -130
- package/dist/index.d.ts +33 -130
- package/dist/index.js +26 -21
- package/dist/index.js.map +1 -0
- package/dist/install.cjs +2 -0
- package/dist/install.cjs.map +1 -0
- package/dist/install.d.cts +4 -0
- package/dist/install.d.ts +4 -0
- package/dist/install.js +2 -0
- package/dist/install.js.map +1 -0
- package/dist/persist.cjs +2 -1
- package/dist/persist.cjs.map +1 -0
- package/dist/persist.d.cts +1 -2
- package/dist/persist.d.ts +1 -2
- package/dist/persist.js +2 -1
- package/dist/persist.js.map +1 -0
- package/dist/react.cjs +27 -22
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +7 -52
- package/dist/react.d.ts +7 -52
- package/dist/react.js +27 -22
- package/dist/react.js.map +1 -0
- package/dist/runtime-admin.cjs +2 -1
- package/dist/runtime-admin.cjs.map +1 -0
- package/dist/runtime-admin.d.cts +2 -4
- package/dist/runtime-admin.d.ts +2 -4
- package/dist/runtime-admin.js +2 -1
- package/dist/runtime-admin.js.map +1 -0
- package/dist/runtime-tools.cjs +3 -2
- package/dist/runtime-tools.cjs.map +1 -0
- package/dist/runtime-tools.d.cts +9 -39
- package/dist/runtime-tools.d.ts +9 -39
- package/dist/runtime-tools.js +3 -2
- package/dist/runtime-tools.js.map +1 -0
- package/dist/selectors.cjs +2 -1
- package/dist/selectors.cjs.map +1 -0
- package/dist/selectors.d.cts +2 -4
- package/dist/selectors.d.ts +2 -4
- package/dist/selectors.js +2 -1
- package/dist/selectors.js.map +1 -0
- package/dist/server.cjs +11 -9
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +2 -14
- package/dist/server.d.ts +2 -14
- package/dist/server.js +11 -9
- package/dist/server.js.map +1 -0
- package/dist/sync.cjs +2 -1
- package/dist/sync.cjs.map +1 -0
- package/dist/sync.d.cts +1 -2
- package/dist/sync.d.ts +1 -2
- package/dist/sync.js +2 -1
- package/dist/sync.js.map +1 -0
- package/dist/testing.cjs +17 -13
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +4 -16
- package/dist/testing.d.ts +4 -16
- package/dist/testing.js +17 -13
- package/dist/testing.js.map +1 -0
- package/package.json +12 -3
- package/dist/async-cache-DFHwcBQL.d.cts +0 -52
- package/dist/async-cache-DFHwcBQL.d.ts +0 -52
- package/dist/computed-BbAZm1Dq.d.cts +0 -17
- package/dist/computed-CccdgY5j.d.ts +0 -17
- package/dist/options-CB35e3Xo.d.cts +0 -245
- package/dist/options-CB35e3Xo.d.ts +0 -245
- package/dist/types/adapters/options.d.ts +0 -247
- package/dist/types/async/clone.d.ts +0 -2
- package/dist/types/async/errors.d.ts +0 -3
- package/dist/types/async/inflight.d.ts +0 -13
- package/dist/types/async/rate.d.ts +0 -5
- package/dist/types/async/request.d.ts +0 -3
- package/dist/types/async-cache.d.ts +0 -57
- package/dist/types/async-fetch.d.ts +0 -37
- package/dist/types/async-registry.d.ts +0 -96
- package/dist/types/async-retry.d.ts +0 -10
- package/dist/types/async.d.ts +0 -2
- package/dist/types/computed-graph.d.ts +0 -31
- package/dist/types/computed.d.ts +0 -15
- package/dist/types/config.d.ts +0 -2
- package/dist/types/core.d.ts +0 -1
- package/dist/types/devfreeze.d.ts +0 -1
- package/dist/types/feature-registry.d.ts +0 -69
- package/dist/types/features/lifecycle.d.ts +0 -28
- package/dist/types/index.d.ts +0 -6
- package/dist/types/integrations/query.d.ts +0 -8
- package/dist/types/internals/config.d.ts +0 -62
- package/dist/types/internals/diagnostics.d.ts +0 -21
- package/dist/types/internals/hooks-warnings.d.ts +0 -6
- package/dist/types/internals/reporting.d.ts +0 -8
- package/dist/types/internals/store-admin.d.ts +0 -7
- package/dist/types/internals/store-ops.d.ts +0 -3
- package/dist/types/runtime-admin.d.ts +0 -2
- package/dist/types/store-lifecycle/bind.d.ts +0 -3
- package/dist/types/store-lifecycle/hooks.d.ts +0 -44
- package/dist/types/store-lifecycle/identity.d.ts +0 -23
- package/dist/types/store-lifecycle/registry.d.ts +0 -39
- package/dist/types/store-lifecycle/types.d.ts +0 -39
- package/dist/types/store-lifecycle/validation.d.ts +0 -45
- package/dist/types/store-lifecycle.d.ts +0 -20
- package/dist/types/store-name.d.ts +0 -19
- package/dist/types/store-notify.d.ts +0 -12
- package/dist/types/store-read.d.ts +0 -12
- package/dist/types/store-registry.d.ts +0 -74
- package/dist/types/store-transaction.d.ts +0 -12
- package/dist/types/store-write.d.ts +0 -45
- package/dist/types/store.d.ts +0 -7
- package/dist/types/utils/clone.d.ts +0 -4
- package/dist/types/utils/hash.d.ts +0 -8
- package/dist/types/utils/path.d.ts +0 -5
- package/dist/types/utils/validation.d.ts +0 -14
- package/dist/types/utils.d.ts +0 -5
- package/dist/types-grvlY4BX.d.cts +0 -37
- package/dist/types-grvlY4BX.d.ts +0 -37
package/dist/install.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var De=new Map,O=(e,t)=>{De.set(e,t);};var Ne=typeof Symbol=="function"?Symbol.for("stroid.persist.defaultCrypto"):"__stroid_persist_defaultCrypto__",U=e=>!!e?.[Ne],z=e=>{try{let t=`__stroid_plaintext_probe_${Math.random().toString(36).slice(2)}__`,n=`__stroid_plaintext_probe_${Math.random().toString(36).slice(2)}__`;return e(t)!==t?!1:e(n)===n}catch{return false}},ie=(e,t,n)=>{let o="__stroid_persist_roundtrip_probe__",a;try{a=t(o);}catch(u){return {ok:false,reason:`persist: encrypt failed for store "${e}" (${u?.message??u})`}}if(typeof a!="string")return {ok:false,reason:`persist: encrypt must return a string for store "${e}".`};let c;try{c=n(a);}catch(u){return {ok:false,reason:`persist: decrypt failed for store "${e}" (${u?.message??u})`}}return typeof c!="string"?{ok:false,reason:`persist: decrypt must return a string for store "${e}".`}:c!==o?{ok:false,reason:`persist: encrypt/decrypt must round-trip for store "${e}".`}:{ok:true}};var ce=(e,t,n)=>{e[t]&&(e[t].lastPresent=n);},ue=({name:e,persistConfig:t,persistWatchState:n})=>{let o=t?.onStorageCleared;if(!t||typeof o!="function"||typeof window>"u"||typeof window.addEventListener!="function")return;n[e]?.dispose();let a=window,c=()=>{try{return t.driver.getItem?.(t.key)!=null}catch{return false}},u=i=>{let g=n[e],p=c();if(g){if(!g.lastPresent||p){g.lastPresent=p;return}g.lastPresent=false,o({name:e,key:t.key,reason:i});}},r=i=>{if(i.key===null){u("clear");return}i.key===t.key&&i.newValue===null&&u("remove");},s=()=>{u("missing");};a.addEventListener("storage",r),a.addEventListener("focus",s),n[e]={lastPresent:c(),dispose:()=>{a.removeEventListener("storage",r),a.removeEventListener("focus",s);}};};var W=({value:e,sanitize:t,validate:n,onSanitizeError:o})=>{let a;if(t)try{a=t(e);}catch(u){return o?.(u),{ok:false}}else a=e;let c=n(a);return c.ok?{ok:true,value:c.value??a}:{ok:false}},P=({value:e,fallbackMs:t=Date.now(),onInvalid:n})=>{if(typeof e=="number")return Number.isFinite(e)?e:(n?.(),t);if(typeof e=="string"){let o=Date.parse(e);return Number.isFinite(o)?o:(n?.(),t)}return n?.(),t};var We=new Map,H=(e,t,n=0)=>{!e||typeof t!="function"||We.set(e,{name:e,order:n,fn:t});};var le=()=>({fetchRegistry:Object.create(null),inflight:Object.create(null),requestVersion:Object.create(null),cacheMeta:Object.create(null),rateWindowStart:Object.create(null),rateCount:Object.create(null),ratePruneState:{lastAt:0},ratePruneTimer:null,noSignalWarned:new Set,shapeWarned:new Set,autoCreateWarned:new Set,mutableResultWarned:new Set,cleanupSubs:Object.create(null),storeCleanupFns:Object.create(null),revalidateKeys:new Set,revalidateHandlers:Object.create(null),asyncMetrics:{cacheHits:0,cacheMisses:0,dedupes:0,requests:0,failures:0,avgMs:0,lastMs:0}});var q=new Map,Ie=typeof __STROID_REGISTRY_ID__<"u"&&__STROID_REGISTRY_ID__||typeof process<"u"&&process.env?.STROID_REGISTRY_ID||void 0,de,fe=e=>(de||Ie||e).replace(/\.ts(\?|$)/,".js$1"),xe=fe(new URL("./store.js",(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('install.cjs', document.baseURI).href))).href);var ze=()=>{de=void 0,q.clear();};H("registry.scope-override",ze,110);var He=()=>({pendingNotifications:new Set,pendingBuffer:[],orderedNames:[],notifyScheduled:false,batchDepth:0});var Le=()=>({stores:Object.create(null),subscribers:Object.create(null),initialStates:Object.create(null),initialFactories:Object.create(null),metaEntries:Object.create(null),snapshotCache:Object.create(null),featureRuntimes:new Map,deletingStores:new Set,computedEntries:Object.create(null),computedDependents:Object.create(null),computedCleanups:new Map,transaction:{depth:0,pending:[],stagedValues:new Map,snapshotCache:new Map,failed:false,error:void 0},async:le(),notify:He()}),Be=e=>{let t=fe(e),n=q.get(t);if(n)return n;let o=Le();return q.set(t,o),o};var pe=e=>e||Be(xe);var qe={log:(e,t)=>{typeof console<"u"&&typeof console.log=="function"&&(t?console.log(`[stroid] ${e}`,t):console.log(`[stroid] ${e}`));},warn:(e,t)=>{typeof console<"u"&&typeof console.warn=="function"&&(t?console.warn(`[stroid] ${e}`,t):console.warn(`[stroid] ${e}`));},critical:(e,t)=>{typeof console<"u"&&typeof console.error=="function"&&(t?console.error(`[stroid] ${e}`,t):console.error(`[stroid] ${e}`));}},ge={logSink:qe,flush:{chunkSize:Number.POSITIVE_INFINITY,chunkDelayMs:0,priorityStores:[]},revalidateOnFocus:{debounceMs:0,maxConcurrent:3,staggerMs:100},namespace:"",strictMissingFeatures:true,assertRuntime:false,strictMutatorReturns:true,asyncAutoCreate:false,asyncCloneResult:"none",defaultSnapshotMode:"deep",strictAsyncUsageErrors:false,middleware:[],allowUntrustedHydration:false,mutatorProduce:void 0},J=e=>({logSink:{...e.logSink},flush:{...e.flush},revalidateOnFocus:{...e.revalidateOnFocus},namespace:e.namespace,strictMissingFeatures:e.strictMissingFeatures,assertRuntime:e.assertRuntime,strictMutatorReturns:e.strictMutatorReturns,asyncAutoCreate:e.asyncAutoCreate,asyncCloneResult:e.asyncCloneResult,defaultSnapshotMode:e.defaultSnapshotMode,strictAsyncUsageErrors:e.strictAsyncUsageErrors,middleware:[...e.middleware],allowUntrustedHydration:e.allowUntrustedHydration,mutatorProduce:e.mutatorProduce}),Y=new WeakMap,ye=J(ge),Ye=e=>{let t=Y.get(e);return t||(t=J(ye),Y.set(e,t)),t};var K=()=>Ye(pe());var Ge=()=>{Y=new WeakMap,ye=J(ge);};H("config.reset",Ge,90);typeof process<"u"&&typeof process.env?.NODE_ENV=="string"?process.env.NODE_ENV:void 0;typeof ({ url: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('install.cjs', document.baseURI).href)) })<"u"&&undefined?.MODE?undefined.MODE:void 0;var Xe=(e,t)=>{typeof console<"u"&&typeof console.warn=="function"&&(t?console.warn(`[stroid] ${e}`,t):console.warn(`[stroid] ${e}`));};var I=(e,t)=>{if((K().logSink.warn??Xe)(e,t),K().assertRuntime)throw new Error(e)};var me=new Set(["__proto__","constructor","prototype"]);var G=null,Qe=()=>{if(G)return G;let e,t=[];for(let n=0;n<256;n++){e=n;for(let o=0;o<8;o++)e=e&1?3988292384^e>>>1:e>>>1;t[n]=e>>>0;}return G=t,t},he=e=>{let t=Qe(),n=-1;for(let o=0;o<e.length;o++)n=n>>>0,n=n>>>8^t[(n^e.charCodeAt(o))&255];return (n^-1)>>>0},Ze=2166136261,et=2654435761,tt=1e5,E=(e,t)=>{let n=t>>>0;e.h1=Math.imul(e.h1^n,2246822507),e.h2=Math.imul(e.h2^n,3266489909);},_=(e,t)=>{E(e,t.length);for(let n=0;n<t.length;n++)E(e,t.charCodeAt(n));},k=(e,t)=>{_(e,t);},Se=(e,t)=>{if(Number.isNaN(t)){k(e,"NaN");return}if(!Number.isFinite(t)){k(e,t>0?"Infinity":"-Infinity");return}if(Object.is(t,-0)){k(e,"-0");return}let n=t|0;if(t===n){k(e,"int"),E(e,n);return}k(e,"num"),_(e,String(t));},D=(e,t)=>{if(e.nodes++>tt){k(e,"[max]");return}if(t===null){k(e,"null");return}let n=typeof t;if(n==="string"){k(e,"string"),_(e,t);return}if(n==="number"){k(e,"number"),Se(e,t);return}if(n==="boolean"){k(e,t?"true":"false");return}if(n==="undefined"){k(e,"undefined");return}if(n==="bigint"){k(e,"bigint"),_(e,t.toString());return}if(n==="symbol"){k(e,"symbol");let s=t;_(e,Symbol.keyFor(s)??s.description??String(s));return}if(n==="function"){k(e,"function"),_(e,t.name||"anonymous");return}let o=t,a=e.seen.get(o);if(a!==void 0){k(e,"ref"),E(e,a);return}let c=e.nextId++;if(e.seen.set(o,c),Array.isArray(o)){k(e,"array"),E(e,o.length);for(let s=0;s<o.length;s++)Object.prototype.hasOwnProperty.call(o,s)?D(e,o[s]):k(e,"hole");return}if(o instanceof Date){k(e,"date"),Se(e,o.getTime());return}if(o instanceof Map){k(e,"map"),E(e,o.size),o.forEach((s,i)=>{D(e,i),D(e,s);});return}if(o instanceof Set){k(e,"set"),E(e,o.size),o.forEach(s=>{D(e,s);});return}k(e,"object");let u=Object.getOwnPropertyDescriptors(o),r=[];Object.entries(u).forEach(([s,i])=>{i?.enumerable&&(me.has(s)||"get"in i||"set"in i||r.push([s,i]));}),E(e,r.length);for(let[s,i]of r)_(e,s),D(e,i.value);},X=e=>{if(typeof e=="string")return he(JSON.stringify(e));let t={h1:Ze,h2:et,seen:new WeakMap,nextId:1,nodes:0};D(t,e);let n=t.h1>>>0,o=t.h2>>>0;return n^=n>>>16,n=Math.imul(n,2246822507),n^=n>>>13,n=Math.imul(n,3266489909),n^=n>>>16,o^=o>>>16,o=Math.imul(o,668265261),o^=o>>>15,o=Math.imul(o,374761393),o^=o>>>16,(n&2097151)*4294967296+(o>>>0)};var rt=e=>{let t=new Uint8Array(e),n="";for(let o=0;o<t.length;o++)n+=t[o].toString(16).padStart(2,"0");return n},nt=async e=>{if(typeof globalThis<"u"&&globalThis.crypto?.subtle){let t=typeof TextEncoder<"u"?new TextEncoder:null,n=t?t.encode(e):new Uint8Array(Buffer.from(e)),o=await globalThis.crypto.subtle.digest("SHA-256",n);return rt(o)}try{let{createHash:t}=await import('crypto');return t("sha256").update(e).digest("hex")}catch{throw new Error("sha256 checksum is not supported in this environment")}},L=async(e,t,n=X)=>e==="none"?null:e==="sha256"?nt(t):n(t);var Q=({name:e,persisted:t,reason:n,persistConfig:o,initialState:a,reportStoreError:c,sanitize:u,deepClone:r})=>{c(e,n);let s=o?.onMigrationFail??"reset";if(s==="keep")return {state:t,requiresValidation:true};if(typeof s=="function")try{let i=s(r(t));if(i!==void 0)return {state:u(i),requiresValidation:!0};c(e,`onMigrationFail for "${e}" returned undefined. Falling back to initial state.`);}catch(i){c(e,`onMigrationFail for "${e}" failed: ${i?.message??i}`);}return {state:r(a),requiresValidation:true}},be=e=>{let n=e.getMeta()?.options?.persist;return n?!!n.decryptAsync||n.checksum==="sha256"?st(e):ot(e):false},ot=({name:e,silent:t=false,getMeta:n,getInitialState:o,applyFeatureState:a,reportStoreError:c,validate:u,log:r,hashState:s,deepClone:i,sanitize:g,shouldApply:p})=>{let y=n(),l=y?.options?.persist;if(!l)return false;let f=d=>W({value:d,validate:u});try{let d=l.driver.getItem?.(l.key)??null;if(!d)return !1;if(typeof d!="string")return c(e,`Persist driver for "${e}" returned an async value during sync hydration. Provide async decrypt hooks or use an async-capable persist driver.`),!0;let m=l.decrypt(d),b=JSON.parse(m),{v:h=1,checksum:v,data:w,updatedAt:A,updatedAtMs:F}=b||{};if(!w)return !0;let M=P({value:typeof F=="number"?F:A,fallbackMs:Date.now(),onInvalid:()=>{r(`persist: corrupt updatedAt in stored data for "${e}". Using current time to prevent sync overwrite.`);}});if(l.checksum!=="none"&&v!==s(w))return c(e,`Checksum mismatch loading store "${e}". Falling back to initial state.`),(!p||p())&&a(i(o()),Date.now()),!0;let V=l.deserialize(w),N=y?.version??1,R=ke({name:e,parsed:V,v:h,targetVersion:N,cfg:l,migrations:y?.options?.migrations??{},getInitialState:o,reportStoreError:c,sanitize:g,deepClone:i,validateState:f,safeUpdatedAt:M,applyFeatureState:a,shouldApply:p});return R.ok&&(V=R.state,(!p||p())&&(a(R.state,M),t||r(`Store "${e}" loaded from persistence`))),!0}catch(d){return c(e,`Could not load store "${e}" (${d?.message||d})`),true}},st=async({name:e,silent:t=false,getMeta:n,getInitialState:o,applyFeatureState:a,reportStoreError:c,validate:u,log:r,hashState:s,deepClone:i,sanitize:g,shouldApply:p})=>{let y=n(),l=y?.options?.persist;if(!l)return false;let f=d=>W({value:d,validate:u});try{let d=await Promise.resolve(l.driver.getItem?.(l.key)??null);if(!d)return !1;let m=l.decryptAsync?await l.decryptAsync(d):l.decrypt(d),b=JSON.parse(m),{v:h=1,checksum:v,data:w,updatedAt:A,updatedAtMs:F}=b||{};if(!w)return !0;let M=P({value:typeof F=="number"?F:A,fallbackMs:Date.now(),onInvalid:()=>{r(`persist: corrupt updatedAt in stored data for "${e}". Using current time to prevent sync overwrite.`);}}),V=await L(l.checksum,w,s);if(l.checksum!=="none"&&v!==V)return c(e,`Checksum mismatch loading store "${e}". Falling back to initial state.`),(!p||p())&&a(i(o()),Date.now()),!0;let N=l.deserialize(w),R=y?.version??1,C=ke({name:e,parsed:N,v:h,targetVersion:R,cfg:l,migrations:y?.options?.migrations??{},getInitialState:o,reportStoreError:c,sanitize:g,deepClone:i,validateState:f,safeUpdatedAt:M,applyFeatureState:a,shouldApply:p});return C.ok&&(!p||p())&&(a(C.state,M),t||r(`Store "${e}" loaded from persistence`)),!0}catch(d){return c(e,`Could not load store "${e}" (${d?.message||d})`),true}},ke=({name:e,parsed:t,v:n,targetVersion:o,cfg:a,migrations:c,getInitialState:u,reportStoreError:r,sanitize:s,deepClone:i,validateState:g,safeUpdatedAt:p,applyFeatureState:y,shouldApply:l})=>{if(n!==o){let d=Object.keys(c).map(h=>Number(h)).filter(h=>h>n&&h<=o).sort((h,v)=>h-v);if(d.length===0){let h=Q({name:e,persisted:t,reason:`No migration path from v${n} to v${o} for "${e}". Applying onMigrationFail strategy.`,persistConfig:a,initialState:u(),reportStoreError:r,sanitize:s,deepClone:i});if(t=h.state,!h.requiresValidation)return (!l||l())&&y(t,p),{ok:false,state:t}}let m=false,b=true;if(d.forEach(h=>{if(!m)try{let v=c[h](t);v!==void 0&&(t=v);}catch(v){let w=Q({name:e,persisted:t,reason:`Migration to v${h} failed for "${e}": ${v?.message||v}`,persistConfig:a,initialState:u(),reportStoreError:r,sanitize:s,deepClone:i});t=w.state,b=w.requiresValidation,m=true;}}),m){if(!b)return (!l||l())&&y(t,p),{ok:false,state:t};let h=g(t);return h.ok?{ok:true,state:h.value??t}:((!l||l())&&y(i(u()),Date.now()),{ok:false,state:t})}}let f=g(t);if(!f.ok){if(n!==o){let d=Q({name:e,persisted:t,reason:`Persisted state for "${e}" failed schema after version change. Applying onMigrationFail strategy.`,persistConfig:a,initialState:u(),reportStoreError:r,sanitize:s,deepClone:i});if(!d.requiresValidation)return (!l||l())&&y(d.state,p),{ok:false,state:d.state};let m=g(d.state);if(m.ok)return {ok:true,state:m.value??d.state}}return r(e,`Persisted state for "${e}" failed schema; resetting to initial.`),(!l||l())&&y(i(u()),Date.now()),{ok:false,state:t}}return {ok:true,state:f.value??t}};var ve=({name:e,persistTimers:t,persistInFlight:n,persistSequence:o,persistWatchState:a,plaintextWarningsIssued:c,exists:u,getMeta:r,getStoreValue:s,reportStoreError:i,hashState:g},p=false)=>{let y=r()?.options?.persist;if(!y)return;let l=async()=>{let m=r();if(!(!m?.options?.persist||m.options.persist!==y||!u())){if(!y.allowPlaintext&&!c.has(e)&&U(y.encrypt)&&U(y.decrypt)){c.add(e);let b=`[stroid/persist] Store '${e}' is persisted in plaintext. Provide encrypt/decrypt hooks to protect sensitive data.`;m.options.onError?.(b),I(b);}try{let b=y.serialize(s()),h=await L(y.checksum,b,g),v=JSON.stringify({v:m.version??1,updatedAt:m.updatedAt,updatedAtMs:m.updatedAtMs??Date.now(),checksum:h,data:b}),w=y.encryptAsync?await y.encryptAsync(v):y.encrypt(v);await Promise.resolve(y.driver.setItem?.(y.key,w)),ce(a,e,!0);}catch(b){i(e,`Could not persist store "${e}" (${b?.message||b})`);}}},f=m=>{let b=n[e],h=(o[e]??0)+1;o[e]=h;let w=(async()=>{b&&await b,!(m&&t[e]!==m)&&o[e]===h&&await l();})().finally(()=>{n[e]===w&&(n[e]=null),m&&t[e]===m&&delete t[e];});n[e]=w;};if(p){t[e]&&(clearTimeout(t[e]),delete t[e]),f();return}t[e]&&clearTimeout(t[e]);let d=setTimeout(()=>{t[e]===d&&f(d);},0);t[e]=d;},x=e=>ve(e),we=(e,t)=>ve({...t,name:e},true);var Re=false,at=typeof process<"u"&&typeof process.env?.NODE_ENV=="string"?process.env.NODE_ENV:void 0,it=typeof ({ url: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('install.cjs', document.baseURI).href)) })<"u"&&undefined?.MODE?undefined.MODE:void 0,ct=at??it,ut=()=>ct==="production",lt=()=>{let e={},t={},n=Object.create(null),o=Object.create(null),a=Object.create(null),c=new Set,u=Object.create(null);return {api:{getPersistQueueDepth(r){return e[r]?1:0}},onStoreCreate(r){let s=r.options.persist;if(!s)return;if(!s.encryptAsync&&z(s.encrypt)&&z(s.decrypt)&&!s.allowPlaintext){let f=`[stroid/persist] Store "${r.name}" is configured for plaintext persistence. Provide encrypt/decrypt hooks or set persist.allowPlaintext: true to acknowledge.`;if(ut()){r.reportStoreError(f),r.options.persist=null;return}r.warn(f);}if(s.sensitiveData&&!s.encryptAsync&&z(s.encrypt)){r.reportStoreError(`persist: store "${r.name}" is marked sensitiveData but has no encrypt function. Plaintext data will be written to storage.`);return}let g=ie(r.name,s.encrypt,s.decrypt);if(!g.ok){r.reportStoreError(g.reason??`persist: encrypt/decrypt validation failed for store "${r.name}".`),r.options.persist=null;return}if(s.key){let f=o[s.key];f&&f!==r.name&&r.isDev()?r.warn(`Persist key collision: "${s.key}" already used by store "${f}". Store "${r.name}" will overwrite the same storage key.`):o[s.key]=r.name;}let p=r.getMeta()?.updateCount??0,y=()=>{let f=r.getMeta();return f?(f.updateCount??0)===p:false},l=be({name:r.name,silent:true,getMeta:r.getMeta,getInitialState:r.getInitialState,applyFeatureState:r.applyFeatureState,reportStoreError:(f,d)=>r.reportStoreError(d),validate:r.validate,log:r.log,hashState:r.hashState,deepClone:r.deepClone,sanitize:r.sanitize,shouldApply:y});if(typeof l?.then=="function"?(u[r.name]={loading:true,pendingSave:false},l.then(f=>{let d=u[r.name];d&&(d.loading=false,(!f||d.pendingSave)&&x({name:r.name,persistTimers:e,persistInFlight:t,persistSequence:n,persistWatchState:a,plaintextWarningsIssued:c,exists:()=>r.hasStore(),getMeta:r.getMeta,getStoreValue:r.getStoreValue,reportStoreError:(m,b)=>r.reportStoreError(b),hashState:r.hashState}),delete u[r.name]);}).catch(()=>{let f=u[r.name];f&&(f.loading=false,f.pendingSave&&x({name:r.name,persistTimers:e,persistInFlight:t,persistSequence:n,persistWatchState:a,plaintextWarningsIssued:c,exists:()=>r.hasStore(),getMeta:r.getMeta,getStoreValue:r.getStoreValue,reportStoreError:(d,m)=>r.reportStoreError(m),hashState:r.hashState}),delete u[r.name]);})):l||x({name:r.name,persistTimers:e,persistInFlight:t,persistSequence:n,persistWatchState:a,plaintextWarningsIssued:c,exists:()=>r.hasStore(),getMeta:r.getMeta,getStoreValue:r.getStoreValue,reportStoreError:(f,d)=>r.reportStoreError(d),hashState:r.hashState}),typeof window<"u"&&typeof window.addEventListener=="function"){let f=()=>{we(r.name,{name:r.name,persistTimers:e,persistInFlight:t,persistSequence:n,persistWatchState:a,plaintextWarningsIssued:c,exists:()=>r.hasStore(),getMeta:r.getMeta,getStoreValue:r.getStoreValue,reportStoreError:(d,m)=>r.reportStoreError(m),hashState:r.hashState});};window.addEventListener("pagehide",f,{once:true}),window.addEventListener("beforeunload",f,{once:true});}ue({name:r.name,persistConfig:s,persistWatchState:a});},onStoreWrite(r){if(!r.options.persist)return;let s=u[r.name];if(s?.loading){s.pendingSave=true;return}x({name:r.name,persistTimers:e,persistInFlight:t,persistSequence:n,persistWatchState:a,plaintextWarningsIssued:c,exists:()=>r.hasStore(),getMeta:r.getMeta,getStoreValue:r.getStoreValue,reportStoreError:(i,g)=>r.reportStoreError(g),hashState:r.hashState});},beforeStoreDelete(r){let s=r.options.persist;if(s){delete u[r.name],e[r.name]&&(clearTimeout(e[r.name]),delete e[r.name]),t[r.name]=null,delete n[r.name];try{s.driver.removeItem?.(s.key);}catch{}s.key&&o[s.key]===r.name&&delete o[s.key],a[r.name]?.dispose(),delete a[r.name];}},resetAll(){Object.values(e).forEach(r=>clearTimeout(r)),Object.values(a).forEach(r=>{try{r.dispose();}catch{}}),Object.keys(e).forEach(r=>delete e[r]),Object.keys(t).forEach(r=>{t[r]=null,delete t[r];}),Object.keys(n).forEach(r=>delete n[r]),Object.keys(o).forEach(r=>delete o[r]),Object.keys(a).forEach(r=>delete a[r]),Object.keys(u).forEach(r=>delete u[r]),c.clear();}}},Me=()=>{Re||(Re=true,O("persist",lt));};var Ce=false,$=1,dt=e=>typeof e?.v=="number"?e.v:typeof e?.protocol=="number"?e.protocol:void 0,Z=new Set,ee=new Set,ft=e=>typeof TextEncoder<"u"?new TextEncoder().encode(e).length:typeof Buffer<"u"?Buffer.byteLength(e):e.length,pt=({incoming:e,accepted:t})=>{let n=t?.clock??0,o=typeof e.clock=="number"?e.clock:0;if(o!==n)return o-n;let a=e.source??"",c=t?.source??"";return a===c?0:a.localeCompare(c,"en",{sensitivity:"variant"})},gt=e=>e?.updatedAtMs??P({value:e?.updatedAt,fallbackMs:0}),yt=e=>{if(typeof e!="object"||e===null)return false;let t=e;return (typeof t.v=="number"||typeof t.protocol=="number")&&typeof t.type=="string"&&typeof t.name=="string"&&typeof t.clock=="number"&&typeof t.source=="string"},Ee=({name:e,syncChannels:t,instanceId:n,authToken:o,reportStoreError:a})=>{let c=t[e];if(c)try{let u={v:$,protocol:$,type:"sync-request",source:n,name:e,clock:0,requestedAt:Date.now()};o&&(u.token=o),c.postMessage(u);}catch(u){a(e,`Failed to request sync snapshot for "${e}": ${u?.message??u}`);}},mt=(e,t)=>(t[e]=(t[e]??0)+1,t[e]),St=(e,t,n)=>(n[e]=Math.max(n[e]??0,t)+1,n[e]),ht=({name:e,syncChannels:t,syncWindowCleanup:n,syncClocks:o,syncVersions:a})=>{t[e]?.close(),delete t[e],n[e]?.(),delete n[e],delete o[e],delete a[e];},bt=({syncChannels:e,syncWindowCleanup:t})=>{Object.values(t).forEach(n=>{try{n();}catch{}}),Object.values(e).forEach(n=>{try{n.close();}catch{}});},kt=({name:e,syncOption:t,syncChannels:n,syncClocks:o,syncVersions:a,syncWindowCleanup:c,instanceId:u,getMeta:r,getAcceptedSyncVersion:s,getStoreValue:i,hasStoreEntry:g,notify:p,validate:y,reportStoreError:l,warn:f,setStoreValue:d,normalizeIncomingState:m,acceptIncomingSyncVersion:b,resolveSyncVersion:h,broadcastSync:v})=>{if(!t)return;if(typeof window>"u"||typeof BroadcastChannel>"u"){l(e,`Sync enabled for "${e}" but BroadcastChannel not available in this environment.`);return}let w=typeof t=="object"&&typeof t.authToken=="string"&&t.authToken.length>0,A=typeof t=="object"&&typeof t.verify=="function",F=typeof t=="object"&&typeof t.sign=="function";!w&&!A&&!Z.has(e)&&(Z.add(e),I(`Sync for "${e}" is unauthenticated. Any same-origin tab can forge sync messages. Provide sync.authToken or sync.verify to enforce authentication.`)),F&&!A&&!ee.has(e)&&(ee.add(e),f(`Sync for "${e}" is configured with "sign" but no "verify". "sign" has no effect unless incoming messages are verified.`));let M=typeof t=="object"?t.authToken:void 0,V=false,N=typeof t=="object"&&t.channel?t.channel:`stroid_sync_${e}`;try{let R=new BroadcastChannel(N);if(n[e]=R,R.onmessage=C=>{let S=C.data;if(!S||S.source===u||S.name!==e||n[e]!==R||!g(e)||!r(e))return;if(!yt(S)){l(e,`Sync message for "${e}" is malformed; ignoring.`);return}if(M&&S.token!==M){V||(l(e,`Sync message for "${e}" failed auth token verification; ignoring.`),V=!0);return}let te=dt(S);if(te!==$){l(e,`Sync protocol mismatch for "${e}". Expected v${$} but received ${String(te??"unknown")}. Ignoring message.`);return}if(S.type==="sync-state"&&(typeof S.data>"u"||typeof S.clock!="number")){l(e,`Sync message for "${e}" is malformed; ignoring.`);return}if(typeof t=="object"&&typeof t.verify=="function"){let j=!1;try{j=!!t.verify(S);}catch(T){l(e,`Sync message verification failed for "${e}": ${T?.message??T}`);return}if(!j){l(e,`Sync message for "${e}" failed verification; ignoring.`);return}}if(S.type==="sync-request"){v(e);return}let re=typeof t=="object"?t.conflictResolver:null;if(pt({incoming:{clock:S.clock,source:S.source},accepted:s(e)})<=0){let j=gt(r(e)),T=typeof S.updatedAt=="number"?S.updatedAt:Date.now();if(re){let oe=re({local:i(e),incoming:S.data,localUpdated:j,incomingUpdated:T});if(oe!==void 0){let se=m(e,oe);if(se===null)return;d(e,se);let ae=typeof t=="object"?t.resolveUpdatedAt:null,Oe=ae?ae({localUpdated:j,incomingUpdated:T,now:Date.now()}):Math.max(Date.now(),j,T);h(e,Oe,typeof S.clock=="number"?S.clock:0),p(e),v(e);}}return}let ne=m(e,S.data);ne!==null&&(d(e,ne),b(e,typeof S.updatedAt=="number"?S.updatedAt:Date.now(),typeof S.clock=="number"?S.clock:0,typeof S.source=="string"?S.source:""),p(e));},typeof window<"u"&&typeof window.addEventListener=="function"){c[e]?.();let C=window,S=()=>{Ee({name:e,syncChannels:n,instanceId:u,authToken:M,reportStoreError:l});};C.addEventListener("focus",S),C.addEventListener("online",S),c[e]=()=>{C.removeEventListener("focus",S),C.removeEventListener("online",S);};}queueMicrotask(()=>{Ee({name:e,syncChannels:n,instanceId:u,authToken:M,reportStoreError:l});});}catch(R){f(`Failed to setup sync for "${e}": ${R?.message||R}`);}},Fe=({name:e,syncOption:t,syncChannels:n,syncClocks:o,instanceId:a,updatedAt:c,data:u,hashState:r,reportStoreError:s})=>{let i=n[e];if(i)try{let g=typeof t=="object"&&t.checksum==="none"?"none":"hash",p={v:$,protocol:$,type:"sync-state",source:a,name:e,clock:o[e]??0,updatedAt:P({value:c,fallbackMs:Date.now()}),data:u,checksum:g==="hash"?r(u):null};if(typeof t=="object"&&t.authToken&&(p.token=t.authToken),typeof t=="object"&&typeof t.sign=="function")try{let f=t.sign(p);if(f&&typeof f.then=="function"){s(e,`Sync signer for "${e}" returned a Promise. "sign" must be synchronous.`);return}f!==void 0&&(p.auth=f);}catch(f){s(e,`Failed to sign sync payload for "${e}": ${f?.message??f}`);return}let y=typeof t=="object"&&typeof t.maxPayloadBytes=="number"?t.maxPayloadBytes:64*1024,l=ft(JSON.stringify(p));if(l>y){s(e,`Sync payload for "${e}" exceeds ${y} bytes (${l} bytes). Skipping BroadcastChannel sync.`);return}i.postMessage(p);}catch(g){s(e,`Failed to broadcast sync for "${e}": ${g?.message??g}`);}},vt=()=>{let e=Object.create(null),t=Object.create(null),n=Object.create(null),o=Object.create(null),a=`stroid_${Math.random().toString(16).slice(2)}`,c=(r,s)=>{n[r]={clock:t[r]??0,updatedAt:P({value:s,fallbackMs:Date.now()}),source:a};},u=(r,s)=>{mt(r,t),c(r,s);};return {onStoreCreate(r){if(r.options.sync&&(kt({name:r.name,syncOption:r.options.sync,syncChannels:e,syncClocks:t,syncVersions:n,syncWindowCleanup:o,instanceId:a,getMeta:r.getMeta,getAcceptedSyncVersion:s=>n[s],getStoreValue:s=>r.getStoreValue(),hasStoreEntry:()=>r.hasStore(),notify:()=>r.notify(),validate:(s,i)=>r.validate(i),reportStoreError:(s,i)=>r.reportStoreError(i),warn:r.warn,setStoreValue:(s,i)=>r.setStoreValue(i),normalizeIncomingState:(s,i)=>{let g=W({value:i,sanitize:r.sanitize,validate:r.validate,onSanitizeError:p=>{r.reportStoreError(`Sanitize failed for incoming sync "${s}": ${p?.message??p}`);}});return g.ok?g.value:null},acceptIncomingSyncVersion:(s,i,g,p)=>{r.applyFeatureState(r.getStoreValue(),i),t[r.name]=Math.max(t[r.name]??0,g),n[r.name]={clock:g,updatedAt:i,source:p};},resolveSyncVersion:(s,i,g)=>{r.applyFeatureState(r.getStoreValue(),i);let p=St(r.name,g,t);return n[r.name]={clock:p,updatedAt:i,source:a},p},broadcastSync:()=>{let s=r.getMeta();s&&Fe({name:r.name,syncOption:r.options.sync,syncChannels:e,syncClocks:t,instanceId:a,updatedAt:s.updatedAtMs??s.updatedAt,data:r.getStoreValue(),hashState:r.hashState,reportStoreError:(i,g)=>r.reportStoreError(g)});}}),e[r.name])){let s=r.getMeta();c(r.name,s?.updatedAtMs??s?.updatedAt??new Date().toISOString());}},onStoreWrite(r){if(!r.options.sync)return;let s=r.getMeta();s&&(u(r.name,s.updatedAtMs??s.updatedAt),Fe({name:r.name,syncOption:r.options.sync,syncChannels:e,syncClocks:t,instanceId:a,updatedAt:s.updatedAtMs??s.updatedAt,data:r.next,hashState:r.hashState,reportStoreError:(i,g)=>r.reportStoreError(g)}));},beforeStoreDelete(r){ht({name:r.name,syncChannels:e,syncWindowCleanup:o,syncClocks:t,syncVersions:n});},resetAll(){bt({syncChannels:e,syncWindowCleanup:o}),Object.keys(e).forEach(r=>delete e[r]),Object.keys(t).forEach(r=>delete t[r]),Object.keys(n).forEach(r=>delete n[r]),Object.keys(o).forEach(r=>delete o[r]),Z.clear(),ee.clear();}}},Ve=()=>{Ce||(Ce=true,O("sync",vt));};var Pe=false,_e=e=>{try{return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}catch{return e}},wt=({name:e,useDevtools:t,existingDevtools:n,stores:o,warn:a})=>{if(!t||typeof window>"u")return n;let c=window.__REDUX_DEVTOOLS_EXTENSION__||window.__REDUX_DEVTOOLS_EXTENSION__;if(!c||typeof c.connect!="function")return a(`DevTools requested for "${e}" but Redux DevTools extension not found.`),n;if(n)return n;let u=c.connect({name:"stroid"});return u.init(o),u},B=({data:e,redactor:t,deepClone:n})=>{if(typeof t=="function")try{return t(n(e))}catch{return e}return e},Rt=(e,t)=>{if(typeof e!="object"||typeof t!="object"||e===null||t===null)return null;let n=e,o=t,a=[],c=[],u=[],r=new Set(Object.keys(n)),s=new Set(Object.keys(o));return s.forEach(i=>{r.has(i)?Object.is(n[i],o[i])||u.push(i):a.push(i);}),r.forEach(i=>{s.has(i)||c.push(i);}),{added:a,removed:c,changed:u}},Ae=({name:e,action:t,prev:n,next:o,history:a,historyLimit:c,applyRedactor:u,deepClone:r})=>{if(c===0)return;a[e]||(a[e]=[]);let s={ts:Date.now(),action:t,prev:r(u(n)),next:r(u(o)),diff:Rt(n,o)};a[e].push(s),a[e].length>c&&a[e].splice(0,a[e].length-c);},je=({name:e,action:t,force:n=false,devtools:o,enabled:a,stores:c,applyRedactor:u})=>{if(!(!o||!n&&!a))try{let r={...c,[e]:u(c[e])};o.send({type:`${e}/${t}`},r);}catch{}},Mt=()=>{let e=Object.create(null),t;return {onStoreCreate(n){t=wt({name:n.name,useDevtools:!!n.options.devtools,existingDevtools:t,stores:n.getAllStores(),warn:n.warn}),Ae({name:n.name,action:"create",prev:null,next:n.getStoreValue(),history:e,historyLimit:n.options.historyLimit??50,applyRedactor:o=>B({data:o,redactor:n.options.redactor,deepClone:n.deepClone}),deepClone:n.deepClone});},onStoreWrite(n){Ae({name:n.name,action:n.action,prev:n.prev,next:n.next,history:e,historyLimit:n.options.historyLimit??50,applyRedactor:o=>B({data:o,redactor:n.options.redactor,deepClone:n.deepClone}),deepClone:n.deepClone}),je({name:n.name,action:n.action,devtools:t,enabled:!!n.options.devtools,stores:n.getAllStores(),applyRedactor:o=>B({data:o,redactor:n.options.redactor,deepClone:n.deepClone})});},afterStoreDelete(n){n.options.devtools&&je({name:n.name,action:"delete",force:true,devtools:t,enabled:true,stores:n.getAllStores(),applyRedactor:o=>B({data:o,redactor:n.options.redactor,deepClone:n.deepClone})}),delete e[n.name];},resetAll(){Object.keys(e).forEach(n=>{delete e[n];}),t=void 0;},api:{getHistory(n,o){if(!e[n])return [];let a=e[n];return o&&o>0?_e(a.slice(-o)):_e(a)},clearHistory(n){if(n){delete e[n];return}Object.keys(e).forEach(o=>{delete e[o];});}}}},Te=()=>{Pe||(Pe=true,O("devtools",Mt));};var Ct=()=>{Me();},Et=()=>{Ve();},Ft=()=>{Te();},Or=()=>{Ct(),Et(),Ft();};exports.installAllFeatures=Or;exports.installDevtools=Ft;exports.installPersist=Ct;exports.installSync=Et;//# sourceMappingURL=install.cjs.map
|
|
2
|
+
//# sourceMappingURL=install.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/feature-registry.ts","../src/features/persist/crypto.ts","../src/features/persist/watch.ts","../src/features/state-helpers.ts","../src/internals/test-reset.ts","../src/async-registry.ts","../src/store-registry.ts","../src/internals/config.ts","../src/internals/diagnostics.ts","../src/utils/validation.ts","../src/utils/hash.ts","../src/features/persist/checksum.ts","../src/features/persist/load.ts","../src/features/persist/save.ts","../src/features/persist.ts","../src/features/sync.ts","../src/features/devtools.ts","../src/install.ts"],"names":["_featureFactories","registerStoreFeature","name","factory","DEFAULT_PERSIST_CRYPTO_MARK","usesDefaultPersistCrypto","fn","isIdentityCrypto","probeA","probeB","validateCryptoPair","encrypt","decrypt","probe","encrypted","err","decrypted","setPersistPresence","persistWatchState","present","setupPersistWatch","persistConfig","callback","hostWindow","readPresent","notifyIfCleared","reason","state","onStorage","event","onFocus","normalizeFeatureState","value","sanitize","validate","onSanitizeError","candidate","validation","resolveUpdatedAtMs","fallbackMs","onInvalid","parsed","_resetHooks","registerTestResetHook","order","createAsyncRegistry","_registries","_registryOverrideEnv","_registryOverrideRuntime","normalizeStoreRegistryScope","scope","defaultRegistryScope","clearRegistryScopeOverrideForTests","createNotifyState","createStoreRegistry","getStoreRegistry","normalizedScope","existing","created","getActiveStoreRegistry","fallback","defaultLogSink","msg","meta","defaultConfig","cloneConfig","base","configByRegistry","baseConfig","getRegistryConfig","registry","config","getConfig","resetConfig","defaultWarn","warnAlways","FORBIDDEN_OBJECT_KEYS","_crcTable","_getCrcTable","c","table","k","crc32","str","crc","i","HASH_SEED_1","HASH_SEED_2","MAX_HASH_NODES","mixHash","v","mixString","mixToken","token","hashNumber","asInt","hashValue","type","sym","obj","seenId","id","entryValue","key","descriptors","entries","descriptor","hashState","h1","h2","toHex","buffer","bytes","out","computeSha256","encoder","data","digest","createHash","computePersistChecksum","mode","payload","hashFn","resolveMigrationFailure","persisted","initialState","reportStoreError","deepClone","strategy","next","persistLoad","args","cfg","persistLoadAsync","persistLoadSync","silent","getMeta","getInitialState","applyFeatureState","log","shouldApply","validateState","raw","envelope","checksum","updatedAt","updatedAtMs","safeUpdatedAt","targetVersion","result","applyMigratedState","e","computedChecksum","migrations","steps","ver","a","b","migrationFailed","migrationFailureRequiresValidation","migrated","recoveredValidation","validationResult","persistSaveInner","persistTimers","persistInFlight","persistSequence","plaintextWarningsIssued","exists","getStoreValue","immediate","writeNow","message","serialized","startWrite","timer","prev","sequence","promise","persistSave","flushPersistImmediately","_registered","_envFromProcess","_envFromImportMeta","_resolvedEnv","isProdEnv","createPersistFeatureRuntime","persistKeys","persistLoadState","ctx","cryptoValidation","loadStartVersion","hadPersistedState","loaded","flush","loadState","entry","registerPersistFeature","SYNC_PROTOCOL_VERSION","resolveProtocolVersion","insecureSyncWarned","signerVerifyWarned","byteLength","compareSyncOrder","incoming","accepted","localClock","incomingClock","incomingSource","localSource","resolveMetaUpdatedAtMs","isValidSyncMessage","m","requestSyncSnapshot","syncChannels","instanceId","authToken","channel","bumpSyncClock","syncClocks","absorbSyncClock","closeSyncResources","syncWindowCleanup","syncVersions","cleanupAllSyncResources","dispose","setupSync","syncOption","getAcceptedSyncVersion","hasStoreEntry","notify","warn","setStoreValue","normalizeIncomingState","acceptIncomingSyncVersion","resolveSyncVersion","broadcastSync","hasAuthToken","hasVerify","hasSign","expectedToken","tokenWarned","channelName","incomingVersion","verified","resolver","localUpdated","incomingUpdated","resolved","normalizedResolved","resolveUpdatedAt","resolvedUpdatedAt","normalizedIncoming","requestLatest","checksumMode","auth","maxPayloadBytes","payloadSize","createSyncFeatureRuntime","recordLocalVersion","ensureLocalClock","normalized","source","resolvedClock","registerSyncFeature","cloneValue","initDevtools","useDevtools","existingDevtools","stores","ext","devtools","applyRedactor","redactor","diffShallow","prevObj","nextObj","added","removed","changed","prevKeys","nextKeys","pushHistory","action","history","historyLimit","sendDevtools","force","enabled","createDevtoolsFeatureRuntime","limit","registerDevtoolsFeature","installPersist","installSync","installDevtools","installAllFeatures"],"mappings":"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","file":"install.cjs","sourcesContent":["/**\r\n * @module feature-registry\r\n *\r\n * LAYER: Module\r\n * OWNS: Module-level behavior and exports for feature-registry.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { NormalizedOptions, StoreValue } from \"./adapters/options.js\";\r\n\r\nexport type BuiltInFeatureName = \"persist\" | \"sync\" | \"devtools\";\r\nexport type FeatureName = BuiltInFeatureName | (string & {});\r\n\r\nexport interface FeatureMetrics {\r\n notifyCount: number;\r\n totalNotifyMs: number;\r\n lastNotifyMs: number;\r\n}\r\n\r\nexport interface StoreFeatureMeta {\r\n createdAt: string;\r\n updatedAt: string;\r\n updatedAtMs: number;\r\n updateCount: number;\r\n version: number;\r\n metrics: FeatureMetrics;\r\n options: NormalizedOptions;\r\n}\r\n\r\nexport interface BaseFeatureContext {\r\n name: string;\r\n options: NormalizedOptions;\r\n getMeta: () => StoreFeatureMeta | undefined;\r\n getStoreValue: () => StoreValue;\r\n getAllStores: () => Record<string, StoreValue>;\r\n getInitialState: () => StoreValue;\r\n hasStore: () => boolean;\r\n setStoreValue: (value: StoreValue) => void;\r\n applyFeatureState: (value: StoreValue, updatedAtMs?: number) => void;\r\n notify: () => void;\r\n reportStoreError: (message: string) => void;\r\n warn: (message: string) => void;\r\n log: (message: string) => void;\r\n hashState: (value: unknown) => number;\r\n deepClone: <T>(value: T) => T;\r\n sanitize: (value: unknown) => unknown;\r\n validate: (next: StoreValue) => { ok: boolean; value?: StoreValue };\r\n isDev: () => boolean;\r\n}\r\n\r\nexport interface FeatureCreateContext extends BaseFeatureContext {}\r\n\r\nexport interface FeatureWriteContext extends BaseFeatureContext {\r\n action: string;\r\n prev: StoreValue;\r\n next: StoreValue;\r\n}\r\n\r\nexport interface FeatureDeleteContext extends BaseFeatureContext {\r\n prev: StoreValue;\r\n}\r\n\r\nexport interface DevtoolsFeatureApi {\r\n getHistory?: (name: string, limit?: number) => unknown[];\r\n clearHistory?: (name?: string) => void;\r\n getPersistQueueDepth?: (name: string) => number;\r\n}\r\n\r\nexport interface StoreFeatureRuntime {\r\n onStoreCreate?: (ctx: FeatureCreateContext) => void;\r\n onStoreWrite?: (ctx: FeatureWriteContext) => void;\r\n beforeStoreDelete?: (ctx: FeatureDeleteContext) => void;\r\n afterStoreDelete?: (ctx: FeatureDeleteContext) => void;\r\n resetAll?: () => void;\r\n api?: DevtoolsFeatureApi;\r\n}\r\n\r\nexport type StoreFeatureFactory = () => StoreFeatureRuntime;\r\n\r\nconst _featureFactories = new Map<FeatureName, StoreFeatureFactory>();\r\nlet _onFeatureRegistered: ((name: FeatureName, factory: StoreFeatureFactory) => void) | null = null;\r\n\r\nexport const registerStoreFeature = (name: FeatureName, factory: StoreFeatureFactory): void => {\r\n _featureFactories.set(name, factory);\r\n _onFeatureRegistered?.(name, factory);\r\n};\r\n\r\nexport const hasRegisteredStoreFeature = (name: FeatureName): boolean =>\r\n _featureFactories.has(name);\r\n\r\nexport const getStoreFeatureFactory = (name: FeatureName): StoreFeatureFactory | undefined =>\r\n _featureFactories.get(name);\r\n\r\nexport const getRegisteredFeatureNames = (): FeatureName[] =>\r\n Array.from(_featureFactories.keys());\r\n\r\nexport const setFeatureRegistrationHook = (hook: ((name: FeatureName, factory: StoreFeatureFactory) => void) | null): void => {\r\n _onFeatureRegistered = hook;\r\n};\r\n\r\nexport const resetRegisteredStoreFeaturesForTests = (): void => {\r\n _featureFactories.clear();\r\n _onFeatureRegistered = null;\r\n};\r\n\r\n\r\n","/**\r\n * @module features/persist/crypto\r\n *\r\n * LAYER: Feature runtime\r\n * OWNS: Module-level behavior and exports for features/persist/crypto.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nconst DEFAULT_PERSIST_CRYPTO_MARK = typeof Symbol === \"function\"\r\n ? Symbol.for(\"stroid.persist.defaultCrypto\")\r\n : \"__stroid_persist_defaultCrypto__\";\r\n\r\nexport const usesDefaultPersistCrypto = (fn: (v: string) => string): boolean =>\r\n !!(fn as any)?.[DEFAULT_PERSIST_CRYPTO_MARK];\r\n\r\nexport const isIdentityCrypto = (fn: (v: string) => string): boolean => {\r\n try {\r\n const probeA = `__stroid_plaintext_probe_${Math.random().toString(36).slice(2)}__`;\r\n const probeB = `__stroid_plaintext_probe_${Math.random().toString(36).slice(2)}__`;\r\n if (fn(probeA) !== probeA) return false;\r\n return fn(probeB) === probeB;\r\n } catch (_) {\r\n return false;\r\n }\r\n};\r\n\r\nexport const validateCryptoPair = (\r\n name: string,\r\n encrypt: (v: string) => string,\r\n decrypt: (v: string) => string\r\n): { ok: boolean; reason?: string } => {\r\n const probe = \"__stroid_persist_roundtrip_probe__\";\r\n let encrypted: string;\r\n try {\r\n encrypted = encrypt(probe);\r\n } catch (err) {\r\n return { ok: false, reason: `persist: encrypt failed for store \"${name}\" (${(err as { message?: string })?.message ?? err})` };\r\n }\r\n if (typeof encrypted !== \"string\") {\r\n return { ok: false, reason: `persist: encrypt must return a string for store \"${name}\".` };\r\n }\r\n let decrypted: string;\r\n try {\r\n decrypted = decrypt(encrypted);\r\n } catch (err) {\r\n return { ok: false, reason: `persist: decrypt failed for store \"${name}\" (${(err as { message?: string })?.message ?? err})` };\r\n }\r\n if (typeof decrypted !== \"string\") {\r\n return { ok: false, reason: `persist: decrypt must return a string for store \"${name}\".` };\r\n }\r\n if (decrypted !== probe) {\r\n return { ok: false, reason: `persist: encrypt/decrypt must round-trip for store \"${name}\".` };\r\n }\r\n return { ok: true };\r\n};\r\n\r\n\r\n","/**\r\n * @module features/persist/watch\r\n *\r\n * LAYER: Feature runtime\r\n * OWNS: Module-level behavior and exports for features/persist/watch.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { PersistConfig } from \"../../adapters/options.js\";\r\nimport type { PersistWatchState } from \"./types.js\";\r\n\r\nexport const setPersistPresence = (\r\n persistWatchState: PersistWatchState,\r\n name: string,\r\n present: boolean\r\n): void => {\r\n if (persistWatchState[name]) {\r\n persistWatchState[name].lastPresent = present;\r\n }\r\n};\r\n\r\nexport const setupPersistWatch = ({\r\n name,\r\n persistConfig,\r\n persistWatchState,\r\n}: {\r\n name: string;\r\n persistConfig: PersistConfig | null | undefined;\r\n persistWatchState: PersistWatchState;\r\n}): void => {\r\n const callback = persistConfig?.onStorageCleared;\r\n if (!persistConfig || typeof callback !== \"function\" || typeof window === \"undefined\" || typeof window.addEventListener !== \"function\") return;\r\n\r\n persistWatchState[name]?.dispose();\r\n const hostWindow = window;\r\n\r\n const readPresent = (): boolean => {\r\n try {\r\n return persistConfig.driver.getItem?.(persistConfig.key) != null;\r\n } catch (_) {\r\n return false;\r\n }\r\n };\r\n\r\n const notifyIfCleared = (reason: \"clear\" | \"remove\" | \"missing\"): void => {\r\n const state = persistWatchState[name];\r\n const present = readPresent();\r\n if (!state) return;\r\n if (!state.lastPresent || present) {\r\n state.lastPresent = present;\r\n return;\r\n }\r\n state.lastPresent = false;\r\n callback({ name, key: persistConfig.key, reason });\r\n };\r\n\r\n const onStorage = (event: StorageEvent): void => {\r\n if (event.key === null) {\r\n notifyIfCleared(\"clear\");\r\n return;\r\n }\r\n if (event.key === persistConfig.key && event.newValue === null) {\r\n notifyIfCleared(\"remove\");\r\n }\r\n };\r\n\r\n const onFocus = (): void => {\r\n notifyIfCleared(\"missing\");\r\n };\r\n\r\n hostWindow.addEventListener(\"storage\", onStorage);\r\n hostWindow.addEventListener(\"focus\", onFocus);\r\n\r\n persistWatchState[name] = {\r\n lastPresent: readPresent(),\r\n dispose: () => {\r\n hostWindow.removeEventListener(\"storage\", onStorage);\r\n hostWindow.removeEventListener(\"focus\", onFocus);\r\n },\r\n };\r\n};\r\n\r\n\r\n","/**\r\n * @module features/state-helpers\r\n *\r\n * LAYER: Feature runtime\r\n * OWNS: Module-level behavior and exports for features/state-helpers.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { StoreValue } from \"../adapters/options.js\";\r\n\r\nexport type FeatureValidation = (next: StoreValue) => { ok: boolean; value?: StoreValue };\r\n\r\nexport type NormalizedFeatureState =\r\n | { ok: true; value: StoreValue }\r\n | { ok: false };\r\n\r\nexport const normalizeFeatureState = ({\r\n value,\r\n sanitize,\r\n validate,\r\n onSanitizeError,\r\n}: {\r\n value: unknown;\r\n sanitize?: (value: unknown) => unknown;\r\n validate: FeatureValidation;\r\n onSanitizeError?: (error: unknown) => void;\r\n}): NormalizedFeatureState => {\r\n let candidate: StoreValue;\r\n if (sanitize) {\r\n try {\r\n candidate = sanitize(value) as StoreValue;\r\n } catch (err) {\r\n onSanitizeError?.(err);\r\n return { ok: false };\r\n }\r\n } else {\r\n candidate = value as StoreValue;\r\n }\r\n\r\n const validation = validate(candidate);\r\n if (!validation.ok) return { ok: false };\r\n return { ok: true, value: validation.value ?? candidate };\r\n};\r\n\r\nexport const resolveUpdatedAtMs = ({\r\n value,\r\n fallbackMs = Date.now(),\r\n onInvalid,\r\n}: {\r\n value: unknown;\r\n fallbackMs?: number;\r\n onInvalid?: () => void;\r\n}): number => {\r\n if (typeof value === \"number\") {\r\n if (Number.isFinite(value)) return value;\r\n onInvalid?.();\r\n return fallbackMs;\r\n }\r\n if (typeof value === \"string\") {\r\n const parsed = Date.parse(value);\r\n if (Number.isFinite(parsed)) return parsed;\r\n onInvalid?.();\r\n return fallbackMs;\r\n }\r\n onInvalid?.();\r\n return fallbackMs;\r\n};\r\n\r\n\r\n","/**\r\n * @module internals/test-reset\r\n *\r\n * LAYER: Internal subsystem\r\n * OWNS: Module-level behavior and exports for internals/test-reset.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\ntype TestResetHook = {\r\n name: string;\r\n order: number;\r\n fn: () => void;\r\n};\r\n\r\nconst _resetHooks = new Map<string, TestResetHook>();\r\n\r\nexport const registerTestResetHook = (name: string, fn: () => void, order = 0): void => {\r\n if (!name || typeof fn !== \"function\") return;\r\n _resetHooks.set(name, { name, order, fn });\r\n};\r\n\r\nexport const runTestResets = (): void => {\r\n const ordered = Array.from(_resetHooks.values()).sort((a, b) => {\r\n if (a.order !== b.order) return a.order - b.order;\r\n return a.name.localeCompare(b.name, \"en\");\r\n });\r\n ordered.forEach((hook) => hook.fn());\r\n};\r\n\r\n\r\n","/**\r\n * @module async-registry\r\n *\r\n * LAYER: Module\r\n * OWNS: Module-level behavior and exports for async-registry.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nexport type AsyncStateSnapshot = {\r\n data?: unknown;\r\n loading: boolean;\r\n error: string | null;\r\n status: \"idle\" | \"loading\" | \"success\" | \"error\" | \"aborted\";\r\n cached?: boolean;\r\n revalidating?: boolean;\r\n};\r\n\r\nexport type AsyncStateAdapter = (ctx: {\r\n name: string;\r\n prev: unknown;\r\n next: AsyncStateSnapshot;\r\n set: (value: unknown | ((draft: any) => void)) => void;\r\n}) => void;\r\n\r\nexport interface FetchOptions {\r\n transform?: (result: unknown) => unknown;\r\n onSuccess?: (data: unknown) => void;\r\n onError?: (message: string) => void;\r\n /**\r\n * Optional adapter to write async state into a custom store shape.\r\n * When provided, default AsyncState writes are skipped.\r\n */\r\n stateAdapter?: AsyncStateAdapter;\r\n method?: string;\r\n headers?: Record<string, string>;\r\n body?: unknown;\r\n ttl?: number;\r\n staleWhileRevalidate?: boolean;\r\n dedupe?: boolean;\r\n retry?: number;\r\n retryDelay?: number;\r\n retryBackoff?: number;\r\n signal?: AbortSignal;\r\n cacheKey?: string;\r\n responseType?: \"auto\" | \"json\" | \"text\" | \"arrayBuffer\" | \"blob\" | \"formData\";\r\n /**\r\n * Auto-create the backing store if missing.\r\n * Defaults to the global config setting (true by default).\r\n */\r\n autoCreate?: boolean;\r\n /**\r\n * Clone strategy for transformed results.\r\n * - \"none\" (default): store by reference.\r\n * - \"shallow\": shallow clone objects/arrays.\r\n * - \"deep\": deep clone objects/arrays.\r\n */\r\n cloneResult?: \"none\" | \"shallow\" | \"deep\";\r\n}\r\n\r\ntype InflightEntry = { promise: Promise<unknown>; raw: Promise<unknown>; transform?: FetchOptions[\"transform\"] };\r\n\r\nexport type AsyncRegistry = {\r\n fetchRegistry: Record<string, { kind: \"url\"; url: string; options: FetchOptions } | { kind: \"factory\"; factory: () => string | Promise<unknown>; options: FetchOptions }>;\r\n inflight: Partial<Record<string, InflightEntry>>;\r\n requestVersion: Record<string, number>;\r\n cacheMeta: Record<string, { timestamp: number; expiresAt: number | null; data: unknown }>;\r\n rateWindowStart: Record<string, number>;\r\n rateCount: Record<string, number>;\r\n ratePruneState: { lastAt: number };\r\n ratePruneTimer: ReturnType<typeof setTimeout> | null;\r\n noSignalWarned: Set<string>;\r\n shapeWarned: Set<string>;\r\n autoCreateWarned: Set<string>;\r\n mutableResultWarned: Set<string>;\r\n cleanupSubs: Record<string, () => void>;\r\n storeCleanupFns: Record<string, Set<() => void>>;\r\n revalidateKeys: Set<string>;\r\n revalidateHandlers: Record<string, () => void>;\r\n asyncMetrics: {\r\n cacheHits: number;\r\n cacheMisses: number;\r\n dedupes: number;\r\n requests: number;\r\n failures: number;\r\n avgMs: number;\r\n lastMs: number;\r\n };\r\n};\r\n\r\nexport const createAsyncRegistry = (): AsyncRegistry => ({\r\n fetchRegistry: Object.create(null),\r\n inflight: Object.create(null),\r\n requestVersion: Object.create(null),\r\n cacheMeta: Object.create(null),\r\n rateWindowStart: Object.create(null),\r\n rateCount: Object.create(null),\r\n ratePruneState: { lastAt: 0 },\r\n ratePruneTimer: null,\r\n noSignalWarned: new Set<string>(),\r\n shapeWarned: new Set<string>(),\r\n autoCreateWarned: new Set<string>(),\r\n mutableResultWarned: new Set<string>(),\r\n cleanupSubs: Object.create(null),\r\n storeCleanupFns: Object.create(null),\r\n revalidateKeys: new Set<string>(),\r\n revalidateHandlers: Object.create(null),\r\n asyncMetrics: {\r\n cacheHits: 0,\r\n cacheMisses: 0,\r\n dedupes: 0,\r\n requests: 0,\r\n failures: 0,\r\n avgMs: 0,\r\n lastMs: 0,\r\n },\r\n});\r\n\r\nexport const resetAsyncRegistry = (registry: AsyncRegistry): void => {\r\n Object.values(registry.revalidateHandlers).forEach((cleanup) => {\r\n try { cleanup(); } catch (_) { /* ignore cleanup errors */ }\r\n });\r\n\r\n Object.values(registry.cleanupSubs).forEach((unsubscribe) => {\r\n try { unsubscribe(); } catch (_) { /* ignore cleanup errors */ }\r\n });\r\n\r\n Object.values(registry.storeCleanupFns).forEach((fns) => {\r\n fns.forEach((fn) => {\r\n try { fn(); } catch (_) { /* ignore cleanup errors */ }\r\n });\r\n });\r\n\r\n Object.keys(registry.fetchRegistry).forEach((key) => delete registry.fetchRegistry[key]);\r\n Object.keys(registry.inflight).forEach((key) => delete registry.inflight[key]);\r\n Object.keys(registry.requestVersion).forEach((key) => delete registry.requestVersion[key]);\r\n Object.keys(registry.cacheMeta).forEach((key) => delete registry.cacheMeta[key]);\r\n Object.keys(registry.rateWindowStart).forEach((key) => delete registry.rateWindowStart[key]);\r\n Object.keys(registry.rateCount).forEach((key) => delete registry.rateCount[key]);\r\n Object.keys(registry.cleanupSubs).forEach((key) => delete registry.cleanupSubs[key]);\r\n Object.keys(registry.storeCleanupFns).forEach((key) => delete registry.storeCleanupFns[key]);\r\n Object.keys(registry.revalidateHandlers).forEach((key) => delete registry.revalidateHandlers[key]);\r\n\r\n registry.revalidateKeys.clear();\r\n registry.noSignalWarned.clear();\r\n registry.shapeWarned.clear();\r\n registry.autoCreateWarned.clear();\r\n registry.mutableResultWarned.clear();\r\n registry.ratePruneState.lastAt = 0;\r\n if (registry.ratePruneTimer) {\r\n clearTimeout(registry.ratePruneTimer);\r\n registry.ratePruneTimer = null;\r\n }\r\n\r\n registry.asyncMetrics.cacheHits = 0;\r\n registry.asyncMetrics.cacheMisses = 0;\r\n registry.asyncMetrics.dedupes = 0;\r\n registry.asyncMetrics.requests = 0;\r\n registry.asyncMetrics.failures = 0;\r\n registry.asyncMetrics.avgMs = 0;\r\n registry.asyncMetrics.lastMs = 0;\r\n};\r\n\r\n\r\n","/**\r\n * @module store-registry\r\n *\r\n * LAYER: Store runtime\r\n * OWNS: Module-level behavior and exports for store-registry.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { FeatureName, StoreFeatureMeta, StoreFeatureRuntime } from \"./feature-registry.js\";\r\nimport type { AsyncRegistry } from \"./async-registry.js\";\r\nimport { createAsyncRegistry, resetAsyncRegistry } from \"./async-registry.js\";\r\nimport { registerTestResetHook } from \"./internals/test-reset.js\";\r\n\r\nexport type RegistryStoreValue = unknown;\r\nexport type RegistrySubscriber = (value: RegistryStoreValue | null) => void;\r\nexport type RegistrySnapshotEntry = {\r\n version: number;\r\n snapshot: RegistryStoreValue | null;\r\n};\r\n\r\nexport type TransactionState = {\r\n depth: number;\r\n pending: Array<() => void>;\r\n stagedValues: Map<string, RegistryStoreValue>;\r\n snapshotCache: Map<string, TransactionSnapshotEntry>;\r\n failed: boolean;\r\n error?: Error;\r\n};\r\n\r\ntype TransactionSnapshotMode = \"deep\" | \"shallow\" | \"ref\";\r\ntype TransactionSnapshotEntry = {\r\n source: RegistryStoreValue | null | undefined;\r\n snapshot: RegistryStoreValue | null;\r\n mode: TransactionSnapshotMode;\r\n};\r\n\r\nexport type ComputedEntry = {\r\n deps: string[];\r\n compute: (...args: unknown[]) => unknown;\r\n stale: boolean;\r\n};\r\n\r\nexport type NotifyState = {\r\n pendingNotifications: Set<string>;\r\n pendingBuffer: string[];\r\n orderedNames: string[];\r\n notifyScheduled: boolean;\r\n batchDepth: number;\r\n};\r\n\r\nexport type StoreRegistry = {\r\n stores: Record<string, RegistryStoreValue>;\r\n subscribers: Record<string, Set<RegistrySubscriber>>;\r\n initialStates: Record<string, RegistryStoreValue>;\r\n initialFactories: Record<string, (() => RegistryStoreValue) | undefined>;\r\n metaEntries: Record<string, StoreFeatureMeta>;\r\n snapshotCache: Record<string, RegistrySnapshotEntry>;\r\n featureRuntimes: Map<FeatureName, StoreFeatureRuntime>;\r\n deletingStores: Set<string>;\r\n computedEntries: Record<string, ComputedEntry>;\r\n computedDependents: Record<string, Set<string>>;\r\n computedCleanups: Map<string, () => void>;\r\n transaction: TransactionState;\r\n async: AsyncRegistry;\r\n notify: NotifyState;\r\n};\r\n\r\nconst _registries = new Map<string, StoreRegistry>();\r\n\r\ndeclare const __STROID_REGISTRY_ID__: string | undefined;\r\nconst _registryOverrideEnv =\r\n (typeof __STROID_REGISTRY_ID__ !== \"undefined\" && __STROID_REGISTRY_ID__)\r\n || (typeof process !== \"undefined\" && process.env?.STROID_REGISTRY_ID)\r\n || undefined;\r\n\r\nlet _registryOverrideRuntime: string | undefined;\r\n\r\nexport const normalizeStoreRegistryScope = (scope: string): string => {\r\n const resolved = _registryOverrideRuntime || _registryOverrideEnv || scope;\r\n return resolved.replace(/\\.ts(\\?|$)/, \".js$1\");\r\n};\r\n\r\nexport const defaultRegistryScope = normalizeStoreRegistryScope(new URL(\"./store.js\", import.meta.url).href);\r\nexport const getDefaultStoreRegistry = (): StoreRegistry => getStoreRegistry(defaultRegistryScope);\r\n\r\nexport const setRegistryScope = (scope: string): void => {\r\n _registryOverrideRuntime = scope;\r\n _registries.clear();\r\n};\r\n\r\nexport const clearRegistryScopeOverrideForTests = (): void => {\r\n _registryOverrideRuntime = undefined;\r\n _registries.clear();\r\n};\r\n\r\nregisterTestResetHook(\"registry.scope-override\", clearRegistryScopeOverrideForTests, 110);\r\n\r\nconst createNotifyState = (): NotifyState => ({\r\n pendingNotifications: new Set<string>(),\r\n pendingBuffer: [],\r\n orderedNames: [],\r\n notifyScheduled: false,\r\n batchDepth: 0,\r\n});\r\n\r\nconst resetNotifyState = (notify: NotifyState): void => {\r\n notify.pendingNotifications.clear();\r\n notify.pendingBuffer.length = 0;\r\n notify.orderedNames.length = 0;\r\n notify.notifyScheduled = false;\r\n notify.batchDepth = 0;\r\n};\r\n\r\nexport const createStoreRegistry = (): StoreRegistry => ({\r\n stores: Object.create(null),\r\n subscribers: Object.create(null),\r\n initialStates: Object.create(null),\r\n initialFactories: Object.create(null),\r\n metaEntries: Object.create(null),\r\n snapshotCache: Object.create(null),\r\n featureRuntimes: new Map(),\r\n deletingStores: new Set(),\r\n computedEntries: Object.create(null),\r\n computedDependents: Object.create(null),\r\n computedCleanups: new Map(),\r\n transaction: {\r\n depth: 0,\r\n pending: [],\r\n stagedValues: new Map(),\r\n snapshotCache: new Map(),\r\n failed: false,\r\n error: undefined,\r\n },\r\n async: createAsyncRegistry(),\r\n notify: createNotifyState(),\r\n});\r\n\r\nexport const getStoreRegistry = (scope: string): StoreRegistry => {\r\n const normalizedScope = normalizeStoreRegistryScope(scope);\r\n const existing = _registries.get(normalizedScope);\r\n if (existing) return existing;\r\n const created = createStoreRegistry();\r\n _registries.set(normalizedScope, created);\r\n return created;\r\n};\r\n\r\nexport const hasStoreEntry = (registry: StoreRegistry, name: string): boolean =>\r\n Object.prototype.hasOwnProperty.call(registry.stores, name);\r\n\r\nexport const isStoreDeleting = (registry: StoreRegistry, name: string): boolean =>\r\n registry.deletingStores.has(name);\r\n\r\nexport const clearStoreRegistries = (registry: StoreRegistry): void => {\r\n registry.computedCleanups.forEach((cleanup) => {\r\n try { cleanup(); } catch (_) { /* ignore cleanup errors */ }\r\n });\r\n registry.computedCleanups.clear();\r\n [\r\n registry.stores,\r\n registry.subscribers,\r\n registry.initialStates,\r\n registry.initialFactories,\r\n registry.metaEntries,\r\n registry.snapshotCache,\r\n registry.computedEntries,\r\n registry.computedDependents,\r\n ].forEach((registryPart) => {\r\n Object.keys(registryPart).forEach((key) => {\r\n delete registryPart[key];\r\n });\r\n });\r\n registry.deletingStores.clear();\r\n registry.transaction.depth = 0;\r\n registry.transaction.pending = [];\r\n registry.transaction.stagedValues.clear();\r\n registry.transaction.snapshotCache.clear();\r\n registry.transaction.failed = false;\r\n registry.transaction.error = undefined;\r\n resetNotifyState(registry.notify);\r\n resetAsyncRegistry(registry.async);\r\n};\r\n\r\nexport const resetAllStoreRegistriesForTests = (): void => {\r\n _registries.forEach((registry) => {\r\n registry.computedCleanups.forEach((cleanup) => {\r\n try { cleanup(); } catch (_) { /* ignore cleanup errors */ }\r\n });\r\n registry.computedCleanups.clear();\r\n [\r\n registry.stores,\r\n registry.subscribers,\r\n registry.initialStates,\r\n registry.initialFactories,\r\n registry.metaEntries,\r\n registry.snapshotCache,\r\n registry.computedEntries,\r\n registry.computedDependents,\r\n ].forEach((registryPart) => {\r\n Object.keys(registryPart).forEach((key) => {\r\n delete registryPart[key];\r\n });\r\n });\r\n registry.deletingStores.clear();\r\n registry.transaction.depth = 0;\r\n registry.transaction.pending = [];\r\n registry.transaction.stagedValues.clear();\r\n registry.transaction.snapshotCache.clear();\r\n registry.transaction.failed = false;\r\n registry.transaction.error = undefined;\r\n resetNotifyState(registry.notify);\r\n resetAsyncRegistry(registry.async);\r\n });\r\n _registries.clear();\r\n};\r\n\r\nexport type CarrierContext = Record<string, unknown>;\r\nexport interface CarrierRunner {\r\n run<T>(carrier: CarrierContext, fn: () => T): T;\r\n get(): CarrierContext | null;\r\n}\r\n\r\nlet currentCarrierRunner: CarrierRunner | null = null;\r\n\r\nexport const injectCarrierRunner = (runner: CarrierRunner): void => {\r\n currentCarrierRunner = runner;\r\n};\r\n\r\nexport const getRequestCarrier = (): CarrierContext | null => {\r\n return currentCarrierRunner?.get() || null;\r\n};\r\n\r\nexport interface RegistryRunner {\r\n run<T>(registry: StoreRegistry, fn: () => T): T;\r\n get(): StoreRegistry | null;\r\n enterWith?: (registry: StoreRegistry) => void;\r\n}\r\n\r\nlet currentRegistryRunner: RegistryRunner | null = null;\r\n\r\nexport const injectRegistryRunner = (runner: RegistryRunner): void => {\r\n currentRegistryRunner = runner;\r\n};\r\n\r\nexport const runWithRegistry = <T>(registry: StoreRegistry, fn: () => T): T => {\r\n if (currentRegistryRunner?.run) return currentRegistryRunner.run(registry, fn);\r\n return fn();\r\n};\r\n\r\nexport const getActiveStoreRegistry = (fallback?: StoreRegistry): StoreRegistry => {\r\n return currentRegistryRunner?.get() || fallback || getStoreRegistry(defaultRegistryScope);\r\n};\r\n\r\nexport const enterRegistry = (registry: StoreRegistry): void => {\r\n if (currentRegistryRunner?.enterWith) {\r\n currentRegistryRunner.enterWith(registry);\r\n }\r\n};\r\n\r\n\r\n","/**\r\n * @module internals/config\r\n *\r\n * LAYER: Internal subsystem\r\n * OWNS: Module-level behavior and exports for internals/config.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { SnapshotMode, MiddlewareCtx, StoreValue } from \"../adapters/options.js\";\r\nimport { registerTestResetHook } from \"./test-reset.js\";\r\nimport { warnAlways } from \"./diagnostics.js\";\r\nimport { getActiveStoreRegistry, getDefaultStoreRegistry, type StoreRegistry } from \"../store-registry.js\";\r\n\r\nexport type LogSink = {\r\n log?: (msg: string, meta?: Record<string, unknown>) => void;\r\n warn?: (msg: string, meta?: Record<string, unknown>) => void;\r\n critical?: (msg: string, meta?: Record<string, unknown>) => void;\r\n};\r\n\r\nexport type AsyncCloneMode = \"none\" | \"shallow\" | \"deep\";\r\n\r\nexport type FlushConfig = {\r\n chunkSize?: number;\r\n chunkDelayMs?: number;\r\n priorityStores?: string[];\r\n};\r\n\r\nexport type RevalidateOnFocusConfig = {\r\n debounceMs?: number;\r\n maxConcurrent?: number;\r\n staggerMs?: number;\r\n};\r\n\r\nexport type StroidConfig = {\r\n logSink?: LogSink;\r\n flush?: FlushConfig;\r\n revalidateOnFocus?: RevalidateOnFocusConfig;\r\n namespace?: string;\r\n strictMissingFeatures?: boolean;\r\n strictFeatures?: boolean;\r\n assertRuntime?: boolean;\r\n strictMutatorReturns?: boolean;\r\n asyncAutoCreate?: boolean;\r\n asyncCloneResult?: AsyncCloneMode;\r\n defaultSnapshotMode?: SnapshotMode;\r\n /**\r\n * Alias for defaultSnapshotMode.\r\n */\r\n snapshotStrategy?: SnapshotMode;\r\n /**\r\n * Throw on async usage errors instead of returning null.\r\n * Default: false (usage errors return null and call onError).\r\n */\r\n strictAsyncUsageErrors?: boolean;\r\n middleware?: Array<(ctx: MiddlewareCtx) => StoreValue | void>;\r\n /**\r\n * Allow hydrateStores to accept untrusted snapshots without explicit opt-in.\r\n * Default: false (hydration requires an explicit trust opt-in).\r\n */\r\n allowUntrustedHydration?: boolean;\r\n /**\r\n * Optional custom mutator engine (e.g. Immer's produce) to enable structural sharing.\r\n * You can pass the produce function directly or use \"immer\" with a global produce shim.\r\n */\r\n mutatorProduce?: (<T>(base: T, recipe: (draft: T) => void) => T) | \"immer\";\r\n};\r\n\r\ntype ResolvedConfig = {\r\n logSink: LogSink;\r\n flush: Required<FlushConfig>;\r\n revalidateOnFocus: Required<RevalidateOnFocusConfig>;\r\n namespace: string;\r\n strictMissingFeatures: boolean;\r\n assertRuntime: boolean;\r\n strictMutatorReturns: boolean;\r\n asyncAutoCreate: boolean;\r\n asyncCloneResult: AsyncCloneMode;\r\n defaultSnapshotMode: SnapshotMode;\r\n strictAsyncUsageErrors: boolean;\r\n middleware: Array<(ctx: MiddlewareCtx) => StoreValue | void>;\r\n allowUntrustedHydration: boolean;\r\n mutatorProduce?: <T>(base: T, recipe: (draft: T) => void) => T;\r\n};\r\n\r\nconst defaultLogSink: LogSink = {\r\n log: (msg: string, meta?: Record<string, unknown>) => {\r\n if (typeof console !== \"undefined\" && typeof console.log === \"function\") {\r\n if (meta) console.log(`[stroid] ${msg}`, meta);\r\n else console.log(`[stroid] ${msg}`);\r\n }\r\n },\r\n warn: (msg: string, meta?: Record<string, unknown>) => {\r\n if (typeof console !== \"undefined\" && typeof console.warn === \"function\") {\r\n if (meta) console.warn(`[stroid] ${msg}`, meta);\r\n else console.warn(`[stroid] ${msg}`);\r\n }\r\n },\r\n critical: (msg: string, meta?: Record<string, unknown>) => {\r\n if (typeof console !== \"undefined\" && typeof console.error === \"function\") {\r\n if (meta) console.error(`[stroid] ${msg}`, meta);\r\n else console.error(`[stroid] ${msg}`);\r\n }\r\n },\r\n};\r\n\r\nconst defaultConfig: ResolvedConfig = {\r\n logSink: defaultLogSink,\r\n flush: {\r\n chunkSize: Number.POSITIVE_INFINITY,\r\n chunkDelayMs: 0,\r\n priorityStores: [],\r\n },\r\n revalidateOnFocus: {\r\n debounceMs: 0,\r\n maxConcurrent: 3,\r\n staggerMs: 100,\r\n },\r\n namespace: \"\",\r\n strictMissingFeatures: true,\r\n assertRuntime: false,\r\n strictMutatorReturns: true,\r\n asyncAutoCreate: false,\r\n asyncCloneResult: \"none\",\r\n defaultSnapshotMode: \"deep\",\r\n strictAsyncUsageErrors: false,\r\n middleware: [],\r\n allowUntrustedHydration: false,\r\n mutatorProduce: undefined,\r\n};\r\n\r\nconst cloneConfig = (base: ResolvedConfig): ResolvedConfig => ({\r\n logSink: { ...base.logSink },\r\n flush: { ...base.flush },\r\n revalidateOnFocus: { ...base.revalidateOnFocus },\r\n namespace: base.namespace,\r\n strictMissingFeatures: base.strictMissingFeatures,\r\n assertRuntime: base.assertRuntime,\r\n strictMutatorReturns: base.strictMutatorReturns,\r\n asyncAutoCreate: base.asyncAutoCreate,\r\n asyncCloneResult: base.asyncCloneResult,\r\n defaultSnapshotMode: base.defaultSnapshotMode,\r\n strictAsyncUsageErrors: base.strictAsyncUsageErrors,\r\n middleware: [...base.middleware],\r\n allowUntrustedHydration: base.allowUntrustedHydration,\r\n mutatorProduce: base.mutatorProduce,\r\n});\r\n\r\nlet configByRegistry = new WeakMap<StoreRegistry, ResolvedConfig>();\r\nlet baseConfig = cloneConfig(defaultConfig);\r\nconst getRegistryConfig = (registry: StoreRegistry): ResolvedConfig => {\r\n let config = configByRegistry.get(registry);\r\n if (!config) {\r\n config = cloneConfig(baseConfig);\r\n configByRegistry.set(registry, config);\r\n }\r\n return config;\r\n};\r\n\r\nconst IMMER_PRODUCE_KEY = \"__STROID_IMMER_PRODUCE__\";\r\nlet cachedImmerProduce: (<T>(base: T, recipe: (draft: T) => void) => T) | undefined;\r\nlet immerMissingWarned = false;\r\nconst resolveImmerProduce = (): (<T>(base: T, recipe: (draft: T) => void) => T) | undefined => {\r\n if (cachedImmerProduce) return cachedImmerProduce;\r\n const globalAny = globalThis as Record<string, unknown> | undefined;\r\n const candidate = globalAny ? globalAny[IMMER_PRODUCE_KEY] : undefined;\r\n if (typeof candidate === \"function\") {\r\n cachedImmerProduce = candidate as (<T>(base: T, recipe: (draft: T) => void) => T);\r\n return cachedImmerProduce;\r\n }\r\n return undefined;\r\n};\r\n\r\nexport const getConfig = (): ResolvedConfig => getRegistryConfig(getActiveStoreRegistry());\r\n\r\nexport const configureStroid = (next?: StroidConfig): void => {\r\n if (!next) return;\r\n const registry = getActiveStoreRegistry();\r\n let config = getRegistryConfig(registry);\r\n\r\n if (next.logSink) {\r\n config = {\r\n ...config,\r\n logSink: {\r\n log: next.logSink.log ?? config.logSink.log,\r\n warn: next.logSink.warn ?? config.logSink.warn,\r\n critical: next.logSink.critical ?? config.logSink.critical,\r\n },\r\n };\r\n }\r\n\r\n if (next.flush) {\r\n config = {\r\n ...config,\r\n flush: {\r\n chunkSize: Number.isFinite(next.flush.chunkSize ?? config.flush.chunkSize)\r\n ? (next.flush.chunkSize as number)\r\n : config.flush.chunkSize,\r\n chunkDelayMs: Number.isFinite(next.flush.chunkDelayMs ?? config.flush.chunkDelayMs)\r\n ? (next.flush.chunkDelayMs as number)\r\n : config.flush.chunkDelayMs,\r\n priorityStores: Array.isArray(next.flush.priorityStores)\r\n ? next.flush.priorityStores\r\n : config.flush.priorityStores,\r\n },\r\n };\r\n }\r\n\r\n if (next.revalidateOnFocus) {\r\n config = {\r\n ...config,\r\n revalidateOnFocus: {\r\n debounceMs: Number.isFinite(next.revalidateOnFocus.debounceMs ?? config.revalidateOnFocus.debounceMs)\r\n ? (next.revalidateOnFocus.debounceMs as number)\r\n : config.revalidateOnFocus.debounceMs,\r\n maxConcurrent: Number.isFinite(next.revalidateOnFocus.maxConcurrent ?? config.revalidateOnFocus.maxConcurrent)\r\n ? Math.max(1, next.revalidateOnFocus.maxConcurrent as number)\r\n : config.revalidateOnFocus.maxConcurrent,\r\n staggerMs: Number.isFinite(next.revalidateOnFocus.staggerMs ?? config.revalidateOnFocus.staggerMs)\r\n ? Math.max(0, next.revalidateOnFocus.staggerMs as number)\r\n : config.revalidateOnFocus.staggerMs,\r\n },\r\n };\r\n }\r\n\r\n if (typeof next.namespace === \"string\") {\r\n config = {\r\n ...config,\r\n namespace: next.namespace.trim(),\r\n };\r\n }\r\n\r\n if (typeof next.strictMissingFeatures === \"boolean\") {\r\n config = {\r\n ...config,\r\n strictMissingFeatures: next.strictMissingFeatures,\r\n };\r\n }\r\n if (typeof next.strictFeatures === \"boolean\") {\r\n config = {\r\n ...config,\r\n strictMissingFeatures: next.strictFeatures,\r\n };\r\n }\r\n\r\n if (typeof next.assertRuntime === \"boolean\") {\r\n config = {\r\n ...config,\r\n assertRuntime: next.assertRuntime,\r\n };\r\n }\r\n\r\n if (typeof next.strictMutatorReturns === \"boolean\") {\r\n config = {\r\n ...config,\r\n strictMutatorReturns: next.strictMutatorReturns,\r\n };\r\n }\r\n\r\n if (typeof next.asyncAutoCreate === \"boolean\") {\r\n config = {\r\n ...config,\r\n asyncAutoCreate: next.asyncAutoCreate,\r\n };\r\n }\r\n if (typeof next.strictAsyncUsageErrors === \"boolean\") {\r\n config = {\r\n ...config,\r\n strictAsyncUsageErrors: next.strictAsyncUsageErrors,\r\n };\r\n }\r\n\r\n if (next.asyncCloneResult === \"none\" || next.asyncCloneResult === \"shallow\" || next.asyncCloneResult === \"deep\") {\r\n config = {\r\n ...config,\r\n asyncCloneResult: next.asyncCloneResult,\r\n };\r\n }\r\n\r\n if (next.snapshotStrategy === \"shallow\" || next.snapshotStrategy === \"ref\" || next.snapshotStrategy === \"deep\") {\r\n config = {\r\n ...config,\r\n defaultSnapshotMode: next.snapshotStrategy,\r\n };\r\n }\r\n\r\n if (next.defaultSnapshotMode === \"shallow\" || next.defaultSnapshotMode === \"ref\" || next.defaultSnapshotMode === \"deep\") {\r\n config = {\r\n ...config,\r\n defaultSnapshotMode: next.defaultSnapshotMode,\r\n };\r\n }\r\n\r\n if (Array.isArray(next.middleware)) {\r\n config = {\r\n ...config,\r\n middleware: next.middleware,\r\n };\r\n }\r\n\r\n if (typeof next.allowUntrustedHydration === \"boolean\") {\r\n config = {\r\n ...config,\r\n allowUntrustedHydration: next.allowUntrustedHydration,\r\n };\r\n }\r\n\r\n if (typeof next.mutatorProduce === \"function\") {\r\n config = {\r\n ...config,\r\n mutatorProduce: next.mutatorProduce,\r\n };\r\n } else if (next.mutatorProduce === \"immer\") {\r\n const produce = resolveImmerProduce();\r\n if (produce) {\r\n config = {\r\n ...config,\r\n mutatorProduce: produce,\r\n };\r\n } else {\r\n if (!immerMissingWarned) {\r\n immerMissingWarned = true;\r\n warnAlways(\r\n `configureStroid({ mutatorProduce: \"immer\" }) requires Immer's produce function.\\n` +\r\n `Set globalThis.${IMMER_PRODUCE_KEY} = produce or pass mutatorProduce: produce directly.`\r\n );\r\n }\r\n }\r\n }\r\n\r\n configByRegistry.set(registry, config);\r\n if (registry === getDefaultStoreRegistry()) {\r\n baseConfig = cloneConfig(config);\r\n }\r\n};\r\n\r\nexport const resetConfig = (): void => {\r\n configByRegistry = new WeakMap<StoreRegistry, ResolvedConfig>();\r\n baseConfig = cloneConfig(defaultConfig);\r\n cachedImmerProduce = undefined;\r\n immerMissingWarned = false;\r\n};\r\n\r\nregisterTestResetHook(\"config.reset\", resetConfig, 90);\r\n\r\n// Back-compat for tests\r\nexport const _resetConfigForTests = (): void => resetConfig();\r\n\r\nexport const getNamespace = (): string => getConfig().namespace;\r\nexport const setNamespace = (ns: string): void => {\r\n const registry = getActiveStoreRegistry();\r\n const config = getRegistryConfig(registry);\r\n const next = { ...config, namespace: ns.trim() };\r\n configByRegistry.set(registry, next);\r\n if (registry === getDefaultStoreRegistry()) {\r\n baseConfig = cloneConfig(next);\r\n }\r\n};\r\n\r\n\r\n","/**\r\n * @module internals/diagnostics\r\n *\r\n * LAYER: Internal subsystem\r\n * OWNS: Module-level behavior and exports for internals/diagnostics.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport { getConfig } from \"./config.js\";\r\nconst _envFromProcess = typeof process !== \"undefined\" && typeof process.env?.NODE_ENV === \"string\"\r\n ? process.env.NODE_ENV\r\n : undefined;\r\nconst _envFromImportMeta = typeof import.meta !== \"undefined\" && (import.meta as any)?.env?.MODE\r\n ? (import.meta as any).env.MODE\r\n : undefined;\r\nconst _devFlag = typeof globalThis !== \"undefined\" && typeof (globalThis as any).__STROID_DEV__ === \"boolean\"\r\n ? (globalThis as any).__STROID_DEV__\r\n : undefined;\r\nconst _fallbackEnv = \"production\";\r\nconst _resolvedEnv = _envFromProcess ?? _envFromImportMeta ?? _fallbackEnv;\r\n\r\nexport const __DEV__ = typeof _devFlag === \"boolean\"\r\n ? _devFlag\r\n : _resolvedEnv !== \"production\";\r\n\r\nexport const isDev = (): boolean => __DEV__;\r\n\r\nconst defaultWarn = (msg: string, meta?: Record<string, unknown>): void => {\r\n if (typeof console !== \"undefined\" && typeof console.warn === \"function\") {\r\n if (meta) console.warn(`[stroid] ${msg}`, meta);\r\n else console.warn(`[stroid] ${msg}`);\r\n }\r\n};\r\n\r\nconst defaultCritical = (msg: string, meta?: Record<string, unknown>): void => {\r\n if (typeof console !== \"undefined\" && typeof console.error === \"function\") {\r\n if (meta) console.error(`[stroid] ${msg}`, meta);\r\n else console.error(`[stroid] ${msg}`);\r\n }\r\n};\r\n\r\nconst defaultLog = (msg: string, meta?: Record<string, unknown>): void => {\r\n if (typeof console !== \"undefined\" && typeof console.log === \"function\") {\r\n if (meta) console.log(`[stroid] ${msg}`, meta);\r\n else console.log(`[stroid] ${msg}`);\r\n }\r\n};\r\n\r\nexport const critical = (msg: string, meta?: Record<string, unknown>): void => {\r\n const sink = getConfig().logSink.critical ?? defaultCritical;\r\n sink(msg, meta);\r\n if (getConfig().assertRuntime) throw new Error(msg);\r\n};\r\n\r\nexport const warn = (msg: string, meta?: Record<string, unknown>): void => {\r\n if (!__DEV__) return;\r\n const sink = getConfig().logSink.warn ?? defaultWarn;\r\n sink(msg, meta);\r\n if (getConfig().assertRuntime) throw new Error(msg);\r\n};\r\n\r\n// Used for configuration hazards that must surface in production too.\r\nexport const warnAlways = (msg: string, meta?: Record<string, unknown>): void => {\r\n const sink = getConfig().logSink.warn ?? defaultWarn;\r\n sink(msg, meta);\r\n if (getConfig().assertRuntime) throw new Error(msg);\r\n};\r\n\r\nexport const error = (msg: string, meta?: Record<string, unknown>): void => {\r\n if (__DEV__) {\r\n const sink = getConfig().logSink.warn ?? defaultWarn;\r\n sink(msg, meta);\r\n }\r\n critical(msg, meta);\r\n if (getConfig().assertRuntime) throw new Error(msg);\r\n};\r\n\r\nexport const log = (msg: string, meta?: Record<string, unknown>): void => {\r\n if (!__DEV__) return;\r\n const sink = getConfig().logSink.log ?? defaultLog;\r\n sink(msg, meta);\r\n};\r\n\r\nexport const getInvalidFunctionStoreValueMessage = (): string =>\r\n `Functions cannot be stored in stroid.\\n` +\r\n `Store data only - handle functions outside the store.`;\r\n\r\nexport const getMapSetStoreWarningMessage = (): string =>\r\n `Map/Set detected. stroid converts these to plain objects.\\n` +\r\n `Use arrays or plain objects for best results.`;\r\n\r\nexport const getDateStoreWarningMessage = (): string =>\r\n `Date object detected. stroid stores it as ISO string.\\n` +\r\n `Use new Date(value) to convert back when reading.`;\r\n\r\nexport const getSanitizeDateWarningMessage = (): string =>\r\n \"Date detected; stored as ISO string. Use new Date(value) when reading.\";\r\n\r\nexport const getSanitizeMapWarningMessage = (): string =>\r\n \"Map detected; converting to plain object.\";\r\n\r\nexport const getSanitizeSetWarningMessage = (): string =>\r\n \"Set detected; converting to array.\";\r\n\r\nexport const getPathDepthExceededMessage = (depth: number, maxDepth: number, parts: string[]): string =>\r\n `Path depth of ${depth} exceeded maximum of ${maxDepth}.\\n` +\r\n `\"${parts.join(\".\")}\"\\n` +\r\n `This is a data design issue. Split into separate stores:\\n` +\r\n `createStore(\"${parts[0]}\", ...) and createStore(\"${parts[1]}\", ...)`;\r\n\r\nexport const getDeepNestingWarningMessage = (depth: number, parts: string[]): string =>\r\n `Deep nesting detected (${depth} levels): \"${parts.join(\".\")}\"\\n` +\r\n `Consider splitting into separate stores for better readability.`;\r\n\r\nexport const getPathReachedNullMessage = (parts: string[], part: string): string =>\r\n `Path \"${parts.join(\".\")}\" not found - reached null at \"${part}\"`;\r\n\r\nexport const getPathNotObjectMessage = (part: string): string =>\r\n `Cannot go deeper at \"${part}\" - value is not an object`;\r\n\r\nexport const getInvalidStoreNameMessage = (name: string): string =>\r\n `Store name must be a non-empty string. Got: ${JSON.stringify(name)}`;\r\n\r\nexport const getStoreNameContainsSpacesMessage = (name: string): string =>\r\n `Store name \"${name}\" contains spaces.\\n` +\r\n `Use camelCase or kebab-case: \"userName\" or \"user-name\"`;\r\n\r\nexport const getForbiddenStoreNameMessage = (name: string): string =>\r\n `Store name \"${name}\" is not allowed.\\n` +\r\n `Reserved names: \"__proto__\", \"constructor\", \"prototype\".`;\r\n\r\nconst MAX_LEVENSHTEIN_INPUT_LENGTH = 128;\r\n\r\nconst shouldCheckLevenshtein = (a: string, b: string): boolean => {\r\n if (Math.abs(a.length - b.length) > 2) return false;\r\n return Math.max(a.length, b.length) <= MAX_LEVENSHTEIN_INPUT_LENGTH;\r\n};\r\n\r\nconst levenshtein = (a: string, b: string): number => {\r\n if (a === b) return 0;\r\n if (a.length === 0) return b.length;\r\n if (b.length === 0) return a.length;\r\n\r\n let prev = Array.from({ length: a.length + 1 }, (_, i) => i);\r\n let next = new Array<number>(a.length + 1);\r\n\r\n for (let i = 1; i <= b.length; i++) {\r\n next[0] = i;\r\n for (let j = 1; j <= a.length; j++) {\r\n next[j] =\r\n b[i - 1] === a[j - 1]\r\n ? prev[j - 1]\r\n : Math.min(prev[j - 1], next[j - 1], prev[j]) + 1;\r\n }\r\n [prev, next] = [next, prev];\r\n }\r\n return prev[a.length];\r\n};\r\n\r\nexport const suggestStoreName = (name: string, existingNames: string[]): void => {\r\n const similar = existingNames.find((entry) => {\r\n const a = entry.toLowerCase();\r\n const b = name.toLowerCase();\r\n return (\r\n a.includes(b)\r\n || b.includes(a)\r\n || (shouldCheckLevenshtein(a, b) && levenshtein(a, b) <= 2)\r\n );\r\n });\r\n\r\n if (similar) {\r\n warn(`Store \"${name}\" not found. Did you mean \"${similar}\"?`);\r\n return;\r\n }\r\n\r\n error(\r\n `Store \"${name}\" not found.\\n` +\r\n `Available stores: [${existingNames.join(\", \")}]\\n` +\r\n `Call createStore(\"${name}\", data) first.`\r\n );\r\n};\r\n\r\n\r\n","/**\r\n * @module utils/validation\r\n *\r\n * LAYER: Utilities\r\n * OWNS: Module-level behavior and exports for utils/validation.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport {\r\n error,\r\n getDateStoreWarningMessage,\r\n getInvalidFunctionStoreValueMessage,\r\n getInvalidStoreNameMessage,\r\n getForbiddenStoreNameMessage,\r\n getMapSetStoreWarningMessage,\r\n getSanitizeDateWarningMessage,\r\n getSanitizeMapWarningMessage,\r\n getSanitizeSetWarningMessage,\r\n getStoreNameContainsSpacesMessage,\r\n isDev,\r\n warn,\r\n} from \"../internals/diagnostics.js\";\r\n\r\nexport const FORBIDDEN_OBJECT_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\r\n\r\nexport const runSchemaValidation = (schema: unknown, value: unknown): { ok: boolean; data?: unknown; error?: unknown } => {\r\n if (!schema) return { ok: true };\r\n try {\r\n if (typeof (schema as { safeParse?: unknown }).safeParse === \"function\") {\r\n const res = (schema as any).safeParse(value);\r\n return res.success ? { ok: true, data: res.data } : { ok: false, error: res.error };\r\n }\r\n if (typeof (schema as { parse?: unknown }).parse === \"function\") {\r\n (schema as any).parse(value);\r\n return { ok: true, data: value };\r\n }\r\n if (typeof (schema as { validateSync?: unknown }).validateSync === \"function\") {\r\n (schema as any).validateSync(value);\r\n return { ok: true, data: value };\r\n }\r\n if (typeof (schema as { isValidSync?: unknown }).isValidSync === \"function\") {\r\n const valid = (schema as any).isValidSync(value);\r\n return valid ? { ok: true, data: value } : { ok: false, error: \"Schema validation failed\" };\r\n }\r\n if (typeof (schema as { validate?: unknown }).validate === \"function\") {\r\n const res = (schema as any).validate(value);\r\n if (res === true) return { ok: true, data: value };\r\n if (res === false) return { ok: false, error: (schema as any).errors || \"Schema validation failed\" };\r\n if (res && typeof res === \"object\") {\r\n const joiError = (res as any).error;\r\n const message =\r\n joiError?.details?.[0]?.message ||\r\n joiError?.message ||\r\n (res as any).message ||\r\n (schema as any).errors;\r\n if (message) return { ok: false, error: message };\r\n if (joiError) return { ok: false, error: joiError };\r\n }\r\n const errMsg = (schema as any).errors || \"Schema validation failed\";\r\n return { ok: false, error: errMsg };\r\n }\r\n if (typeof schema === \"function\") {\r\n const res = (schema as (v: unknown) => unknown | boolean)(value);\r\n if (res === false) return { ok: false, error: \"Schema validation failed\" };\r\n return { ok: true, data: res === true ? value : res };\r\n }\r\n return { ok: true, data: value };\r\n } catch (err) {\r\n return { ok: false, error: (err as { message?: string })?.message ?? err };\r\n }\r\n};\r\n\r\n// --- type helpers ------------------------------------------------------------\r\nconst SUPPORTED_TYPES = [\r\n \"object\",\r\n \"array\",\r\n \"string\",\r\n \"number\",\r\n \"boolean\",\r\n \"null\",\r\n] as const;\r\nexport type SupportedType = typeof SUPPORTED_TYPES[number] | \"function\" | \"map\" | \"set\" | \"date\" | \"undefined\" | \"bigint\" | \"symbol\";\r\n\r\nexport const getType = (value: unknown): SupportedType => {\r\n if (value === null) return \"null\";\r\n if (Array.isArray(value)) return \"array\";\r\n if (value instanceof Map) return \"map\";\r\n if (value instanceof Set) return \"set\";\r\n if (value instanceof Date) return \"date\";\r\n if (typeof value === \"function\") return \"function\";\r\n return typeof value;\r\n};\r\n\r\nconst getNonSerializableType = (value: unknown): string | null => {\r\n if (!value || typeof value !== \"object\") return null;\r\n const WeakRefCtor = (globalThis as any)?.WeakRef as (new (...args: any[]) => any) | undefined;\r\n if (WeakRefCtor && value instanceof WeakRefCtor) return \"WeakRef\";\r\n if (typeof WeakMap !== \"undefined\" && value instanceof WeakMap) return \"WeakMap\";\r\n if (typeof WeakSet !== \"undefined\" && value instanceof WeakSet) return \"WeakSet\";\r\n if (typeof EventTarget !== \"undefined\" && value instanceof EventTarget) return \"EventTarget\";\r\n if (typeof ReadableStream !== \"undefined\" && value instanceof ReadableStream) return \"ReadableStream\";\r\n if (typeof WritableStream !== \"undefined\" && value instanceof WritableStream) return \"WritableStream\";\r\n if (typeof Request !== \"undefined\" && value instanceof Request) return \"Request\";\r\n if (typeof Response !== \"undefined\" && value instanceof Response) return \"Response\";\r\n if (typeof Headers !== \"undefined\" && value instanceof Headers) return \"Headers\";\r\n if (typeof FormData !== \"undefined\" && value instanceof FormData) return \"FormData\";\r\n return null;\r\n};\r\n\r\nexport const isValidData = (value: unknown): boolean => {\r\n const type = getType(value);\r\n if (type === \"function\") {\r\n error(getInvalidFunctionStoreValueMessage());\r\n return false;\r\n }\r\n if (type === \"map\" || type === \"set\") {\r\n warn(getMapSetStoreWarningMessage());\r\n return true;\r\n }\r\n if (type === \"date\") {\r\n warn(getDateStoreWarningMessage());\r\n return true;\r\n }\r\n return true;\r\n};\r\n\r\nconst _canReuseSanitized = (value: unknown, seen: WeakSet<object>): boolean => {\r\n const blocked = getNonSerializableType(value);\r\n if (blocked) {\r\n throw new Error(`${blocked} values are not supported`);\r\n }\r\n const type = getType(value);\r\n if (type === \"number\") {\r\n if (!Number.isFinite(value as number)) {\r\n throw new Error(\"Non-finite numbers are not supported\");\r\n }\r\n return true;\r\n }\r\n if (type === \"bigint\") {\r\n throw new Error(\"BigInt values are not supported\");\r\n }\r\n if (type === \"symbol\") {\r\n throw new Error(\"Symbol values are not supported\");\r\n }\r\n if (type === \"date\" || type === \"map\" || type === \"set\") {\r\n return false;\r\n }\r\n if (type === \"array\") {\r\n if (seen.has(value as object)) {\r\n throw new Error(\"Circular reference detected during sanitize\");\r\n }\r\n seen.add(value as object);\r\n const keys = Object.keys(value as unknown[]);\r\n for (const key of keys) {\r\n const idx = Number(key);\r\n if (!Number.isInteger(idx)) return false;\r\n }\r\n for (let i = 0; i < (value as unknown[]).length; i += 1) {\r\n if (!(i in (value as unknown[]))) continue;\r\n if (!_canReuseSanitized((value as unknown[])[i], seen)) return false;\r\n }\r\n return true;\r\n }\r\n if (type === \"object\") {\r\n if (seen.has(value as object)) {\r\n throw new Error(\"Circular reference detected during sanitize\");\r\n }\r\n seen.add(value as object);\r\n if (Object.getOwnPropertySymbols(value as object).length > 0) return false;\r\n const descriptors = Object.getOwnPropertyDescriptors(value as Record<string, unknown>);\r\n for (const [key, descriptor] of Object.entries(descriptors)) {\r\n if (!descriptor.enumerable) return false;\r\n if (FORBIDDEN_OBJECT_KEYS.has(key)) return false;\r\n if (\"get\" in descriptor || \"set\" in descriptor) {\r\n throw new Error(`Accessor properties are not supported during sanitize (\"${key}\")`);\r\n }\r\n if (!_canReuseSanitized(descriptor.value, seen)) return false;\r\n }\r\n return true;\r\n }\r\n return true;\r\n};\r\n\r\nexport const canReuseSanitized = (value: unknown): boolean => _canReuseSanitized(value, new WeakSet<object>());\r\n\r\nconst _sanitize = (value: unknown, seen: WeakSet<object>): unknown => {\r\n const blocked = getNonSerializableType(value);\r\n if (blocked) {\r\n throw new Error(`${blocked} values are not supported`);\r\n }\r\n const type = getType(value);\r\n if (type === \"number\") {\r\n if (!Number.isFinite(value as number)) {\r\n throw new Error(\"Non-finite numbers are not supported\");\r\n }\r\n return value;\r\n }\r\n if (type === \"bigint\") {\r\n throw new Error(\"BigInt values are not supported\");\r\n }\r\n if (type === \"symbol\") {\r\n throw new Error(\"Symbol values are not supported\");\r\n }\r\n if (type === \"date\") {\r\n if (isDev()) warn(getSanitizeDateWarningMessage());\r\n return (value as Date).toISOString();\r\n }\r\n if (type === \"map\") {\r\n if (seen.has(value as object)) {\r\n throw new Error(\"Circular reference detected during sanitize\");\r\n }\r\n seen.add(value as object);\r\n if (isDev()) warn(getSanitizeMapWarningMessage());\r\n const clean: Record<string, unknown> = {};\r\n for (const [key, entryValue] of value as Map<unknown, unknown>) {\r\n if (typeof key !== \"string\") {\r\n throw new Error(\"Map keys must be strings to remain JSON-safe\");\r\n }\r\n clean[String(key)] = _sanitize(entryValue, seen);\r\n }\r\n return clean;\r\n }\r\n if (type === \"set\") {\r\n if (seen.has(value as object)) {\r\n throw new Error(\"Circular reference detected during sanitize\");\r\n }\r\n seen.add(value as object);\r\n if (isDev()) warn(getSanitizeSetWarningMessage());\r\n return Array.from(value as Set<unknown>, (entry) => _sanitize(entry, seen));\r\n }\r\n if (type === \"object\") {\r\n if (seen.has(value as object)) {\r\n throw new Error(\"Circular reference detected during sanitize\");\r\n }\r\n seen.add(value as object);\r\n const clean: Record<string, unknown> = {};\r\n const descriptors = Object.getOwnPropertyDescriptors(value as Record<string, unknown>);\r\n for (const [key, descriptor] of Object.entries(descriptors)) {\r\n if (!descriptor.enumerable) continue;\r\n if (FORBIDDEN_OBJECT_KEYS.has(key)) continue;\r\n if (\"get\" in descriptor || \"set\" in descriptor) {\r\n throw new Error(`Accessor properties are not supported during sanitize (\"${key}\")`);\r\n }\r\n clean[key] = _sanitize(descriptor.value, seen);\r\n }\r\n return clean;\r\n }\r\n if (type === \"array\") {\r\n if (seen.has(value as object)) {\r\n throw new Error(\"Circular reference detected during sanitize\");\r\n }\r\n seen.add(value as object);\r\n return (value as unknown[]).map((entry) => _sanitize(entry, seen));\r\n }\r\n return value;\r\n};\r\n\r\nexport const sanitize = (value: unknown): unknown => _sanitize(value, new WeakSet<object>());\r\n\r\nexport const isValidStoreName = (name: string): boolean => {\r\n if (typeof name !== \"string\" || name.trim() === \"\") {\r\n error(getInvalidStoreNameMessage(name));\r\n return false;\r\n }\r\n if (FORBIDDEN_OBJECT_KEYS.has(name)) {\r\n error(getForbiddenStoreNameMessage(name));\r\n return false;\r\n }\r\n if (name.includes(\" \")) {\r\n error(getStoreNameContainsSpacesMessage(name));\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\n\r\n","/**\r\n * @module utils/hash\r\n *\r\n * LAYER: Utilities\r\n * OWNS: Module-level behavior and exports for utils/hash.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport { FORBIDDEN_OBJECT_KEYS } from \"./validation.js\";\r\n\r\n// --- hashing / checksum ------------------------------------------------------\r\nlet _crcTable: number[] | null = null;\r\nconst _getCrcTable = (): number[] => {\r\n if (_crcTable) return _crcTable;\r\n let c: number;\r\n const table: number[] = [];\r\n for (let n = 0; n < 256; n++) {\r\n c = n;\r\n for (let k = 0; k < 8; k++) {\r\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\r\n }\r\n table[n] = c >>> 0;\r\n }\r\n _crcTable = table;\r\n return table;\r\n};\r\n\r\nexport const crc32 = (str: string): number => {\r\n const table = _getCrcTable();\r\n let crc = 0 ^ (-1);\r\n for (let i = 0; i < str.length; i++) {\r\n crc = (crc >>> 0);\r\n crc = (crc >>> 8) ^ table[(crc ^ str.charCodeAt(i)) & 0xFF];\r\n }\r\n return (crc ^ (-1)) >>> 0;\r\n};\r\n\r\ntype HashState = {\r\n h1: number;\r\n h2: number;\r\n seen: WeakMap<object, number>;\r\n nextId: number;\r\n nodes: number;\r\n};\r\n\r\nconst HASH_SEED_1 = 0x811C9DC5;\r\nconst HASH_SEED_2 = 0x9E3779B1;\r\nconst MAX_HASH_NODES = 100_000;\r\n\r\nconst mixHash = (state: HashState, value: number): void => {\r\n const v = value >>> 0;\r\n state.h1 = Math.imul(state.h1 ^ v, 0x85EBCA6B);\r\n state.h2 = Math.imul(state.h2 ^ v, 0xC2B2AE35);\r\n};\r\n\r\nconst mixString = (state: HashState, value: string): void => {\r\n mixHash(state, value.length);\r\n for (let i = 0; i < value.length; i++) {\r\n mixHash(state, value.charCodeAt(i));\r\n }\r\n};\r\n\r\nconst mixToken = (state: HashState, token: string): void => {\r\n mixString(state, token);\r\n};\r\n\r\nconst hashNumber = (state: HashState, value: number): void => {\r\n if (Number.isNaN(value)) {\r\n mixToken(state, \"NaN\");\r\n return;\r\n }\r\n if (!Number.isFinite(value)) {\r\n mixToken(state, value > 0 ? \"Infinity\" : \"-Infinity\");\r\n return;\r\n }\r\n if (Object.is(value, -0)) {\r\n mixToken(state, \"-0\");\r\n return;\r\n }\r\n const asInt = value | 0;\r\n if (value === asInt) {\r\n mixToken(state, \"int\");\r\n mixHash(state, asInt);\r\n return;\r\n }\r\n mixToken(state, \"num\");\r\n mixString(state, String(value));\r\n};\r\n\r\nconst hashValue = (state: HashState, value: unknown): void => {\r\n if (state.nodes++ > MAX_HASH_NODES) {\r\n mixToken(state, \"[max]\");\r\n return;\r\n }\r\n if (value === null) {\r\n mixToken(state, \"null\");\r\n return;\r\n }\r\n const type = typeof value;\r\n if (type === \"string\") {\r\n mixToken(state, \"string\");\r\n mixString(state, value as string);\r\n return;\r\n }\r\n if (type === \"number\") {\r\n mixToken(state, \"number\");\r\n hashNumber(state, value as number);\r\n return;\r\n }\r\n if (type === \"boolean\") {\r\n mixToken(state, value ? \"true\" : \"false\");\r\n return;\r\n }\r\n if (type === \"undefined\") {\r\n mixToken(state, \"undefined\");\r\n return;\r\n }\r\n if (type === \"bigint\") {\r\n mixToken(state, \"bigint\");\r\n mixString(state, (value as bigint).toString());\r\n return;\r\n }\r\n if (type === \"symbol\") {\r\n mixToken(state, \"symbol\");\r\n const sym = value as symbol;\r\n mixString(state, Symbol.keyFor(sym) ?? sym.description ?? String(sym));\r\n return;\r\n }\r\n if (type === \"function\") {\r\n mixToken(state, \"function\");\r\n mixString(state, (value as Function).name || \"anonymous\");\r\n return;\r\n }\r\n\r\n const obj = value as object;\r\n const seenId = state.seen.get(obj);\r\n if (seenId !== undefined) {\r\n mixToken(state, \"ref\");\r\n mixHash(state, seenId);\r\n return;\r\n }\r\n const id = state.nextId++;\r\n state.seen.set(obj, id);\r\n\r\n if (Array.isArray(obj)) {\r\n mixToken(state, \"array\");\r\n mixHash(state, obj.length);\r\n for (let i = 0; i < obj.length; i++) {\r\n if (Object.prototype.hasOwnProperty.call(obj, i)) {\r\n hashValue(state, (obj as unknown[])[i]);\r\n } else {\r\n mixToken(state, \"hole\");\r\n }\r\n }\r\n return;\r\n }\r\n if (obj instanceof Date) {\r\n mixToken(state, \"date\");\r\n hashNumber(state, obj.getTime());\r\n return;\r\n }\r\n if (obj instanceof Map) {\r\n mixToken(state, \"map\");\r\n mixHash(state, obj.size);\r\n obj.forEach((entryValue, key) => {\r\n hashValue(state, key);\r\n hashValue(state, entryValue);\r\n });\r\n return;\r\n }\r\n if (obj instanceof Set) {\r\n mixToken(state, \"set\");\r\n mixHash(state, obj.size);\r\n obj.forEach((entryValue) => {\r\n hashValue(state, entryValue);\r\n });\r\n return;\r\n }\r\n\r\n mixToken(state, \"object\");\r\n const descriptors = Object.getOwnPropertyDescriptors(obj as Record<string, unknown>);\r\n const entries: Array<[string, PropertyDescriptor]> = [];\r\n Object.entries(descriptors).forEach(([key, descriptor]) => {\r\n if (!descriptor?.enumerable) return;\r\n if (FORBIDDEN_OBJECT_KEYS.has(key)) return;\r\n if (\"get\" in descriptor || \"set\" in descriptor) return;\r\n entries.push([key, descriptor]);\r\n });\r\n mixHash(state, entries.length);\r\n for (const [key, descriptor] of entries) {\r\n mixString(state, key);\r\n hashValue(state, descriptor.value);\r\n }\r\n};\r\n\r\n/**\r\n * Non-cryptographic checksum for integrity (best-effort). Do not use for security.\r\n * String inputs preserve the legacy CRC32(JSON.stringify(value)) behavior to keep\r\n * persisted checksums stable across versions.\r\n */\r\nexport const hashState = (value: unknown): number => {\r\n if (typeof value === \"string\") {\r\n return crc32(JSON.stringify(value));\r\n }\r\n const state: HashState = {\r\n h1: HASH_SEED_1,\r\n h2: HASH_SEED_2,\r\n seen: new WeakMap(),\r\n nextId: 1,\r\n nodes: 0,\r\n };\r\n hashValue(state, value);\r\n let h1 = state.h1 >>> 0;\r\n let h2 = state.h2 >>> 0;\r\n h1 ^= h1 >>> 16;\r\n h1 = Math.imul(h1, 0x85EBCA6B);\r\n h1 ^= h1 >>> 13;\r\n h1 = Math.imul(h1, 0xC2B2AE35);\r\n h1 ^= h1 >>> 16;\r\n h2 ^= h2 >>> 16;\r\n h2 = Math.imul(h2, 0x27D4EB2D);\r\n h2 ^= h2 >>> 15;\r\n h2 = Math.imul(h2, 0x165667B1);\r\n h2 ^= h2 >>> 16;\r\n return ((h1 & 0x1FFFFF) * 0x100000000) + (h2 >>> 0);\r\n};\r\n\r\nexport const checksumState = hashState; // alias for clarity\r\n\r\n\r\n","/**\r\n * @module features/persist/checksum\r\n *\r\n * LAYER: Feature runtime\r\n * OWNS: Module-level behavior and exports for features/persist/checksum.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport { hashState } from \"../../utils.js\";\r\n\r\nconst toHex = (buffer: ArrayBuffer): string => {\r\n const bytes = new Uint8Array(buffer);\r\n let out = \"\";\r\n for (let i = 0; i < bytes.length; i++) {\r\n out += bytes[i].toString(16).padStart(2, \"0\");\r\n }\r\n return out;\r\n};\r\n\r\nconst computeSha256 = async (value: string): Promise<string> => {\r\n if (typeof globalThis !== \"undefined\" && (globalThis as any).crypto?.subtle) {\r\n const encoder = typeof TextEncoder !== \"undefined\" ? new TextEncoder() : null;\r\n const data = encoder ? encoder.encode(value) : new Uint8Array(Buffer.from(value));\r\n const digest = await (globalThis as any).crypto.subtle.digest(\"SHA-256\", data);\r\n return toHex(digest);\r\n }\r\n try {\r\n const { createHash } = await import(\"node:crypto\");\r\n return createHash(\"sha256\").update(value).digest(\"hex\");\r\n } catch (_) {\r\n throw new Error(\"sha256 checksum is not supported in this environment\");\r\n }\r\n};\r\n\r\nexport const computePersistChecksum = async (\r\n mode: \"hash\" | \"none\" | \"sha256\",\r\n payload: string,\r\n hashFn: (value: unknown) => number = hashState\r\n): Promise<number | string | null> => {\r\n if (mode === \"none\") return null;\r\n if (mode === \"sha256\") return computeSha256(payload);\r\n return hashFn(payload);\r\n};\r\n\r\n\r\n","/**\r\n * @module features/persist/load\r\n *\r\n * LAYER: Feature runtime\r\n * OWNS: Module-level behavior and exports for features/persist/load.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { PersistConfig, StoreValue } from \"../../adapters/options.js\";\r\nimport type { PersistMeta, PersistLoadArgs } from \"./types.js\";\r\nimport { normalizeFeatureState, resolveUpdatedAtMs } from \"../state-helpers.js\";\r\nimport { computePersistChecksum } from \"./checksum.js\";\r\n\r\nconst resolveMigrationFailure = ({\r\n name,\r\n persisted,\r\n reason,\r\n persistConfig,\r\n initialState,\r\n reportStoreError,\r\n sanitize,\r\n deepClone,\r\n}: {\r\n name: string;\r\n persisted: StoreValue;\r\n reason: string;\r\n persistConfig: PersistConfig | null | undefined;\r\n initialState: StoreValue;\r\n reportStoreError: (name: string, message: string) => void;\r\n sanitize: (value: unknown) => unknown;\r\n deepClone: <T>(value: T) => T;\r\n}): { state: StoreValue; requiresValidation: boolean } => {\r\n reportStoreError(name, reason);\r\n\r\n const strategy = persistConfig?.onMigrationFail ?? \"reset\";\r\n if (strategy === \"keep\") {\r\n return { state: persisted, requiresValidation: true };\r\n }\r\n\r\n if (typeof strategy === \"function\") {\r\n try {\r\n const next = strategy(deepClone(persisted));\r\n if (next !== undefined) {\r\n return { state: sanitize(next) as StoreValue, requiresValidation: true };\r\n }\r\n reportStoreError(name, `onMigrationFail for \"${name}\" returned undefined. Falling back to initial state.`);\r\n } catch (err) {\r\n reportStoreError(name, `onMigrationFail for \"${name}\" failed: ${(err as { message?: string })?.message ?? err}`);\r\n }\r\n }\r\n\r\n return { state: deepClone(initialState), requiresValidation: true };\r\n};\r\n\r\nexport const persistLoad = (args: PersistLoadArgs): boolean | Promise<boolean> => {\r\n const meta: PersistMeta | undefined = args.getMeta();\r\n const cfg = meta?.options?.persist;\r\n if (!cfg) return false;\r\n const needsAsync = !!cfg.decryptAsync || cfg.checksum === \"sha256\";\r\n if (!needsAsync) {\r\n return persistLoadSync(args);\r\n }\r\n return persistLoadAsync(args);\r\n};\r\n\r\nconst persistLoadSync = ({\r\n name,\r\n silent = false,\r\n getMeta,\r\n getInitialState,\r\n applyFeatureState,\r\n reportStoreError,\r\n validate,\r\n log,\r\n hashState,\r\n deepClone,\r\n sanitize,\r\n shouldApply,\r\n}: PersistLoadArgs): boolean => {\r\n const meta: PersistMeta | undefined = getMeta();\r\n const cfg = meta?.options?.persist;\r\n if (!cfg) return false;\r\n const validateState = (candidate: StoreValue): { ok: boolean; value?: StoreValue } =>\r\n normalizeFeatureState({ value: candidate, validate });\r\n try {\r\n const raw = cfg.driver.getItem?.(cfg.key) ?? null;\r\n if (!raw) return false;\r\n if (typeof raw !== \"string\") {\r\n reportStoreError(\r\n name,\r\n `Persist driver for \"${name}\" returned an async value during sync hydration. ` +\r\n `Provide async decrypt hooks or use an async-capable persist driver.`\r\n );\r\n return true;\r\n }\r\n const decrypted = cfg.decrypt(raw);\r\n const envelope = JSON.parse(decrypted);\r\n const { v = 1, checksum, data, updatedAt, updatedAtMs } = envelope || {};\r\n if (!data) return true;\r\n const safeUpdatedAt = resolveUpdatedAtMs({\r\n value: typeof updatedAtMs === \"number\" ? updatedAtMs : updatedAt,\r\n fallbackMs: Date.now(),\r\n onInvalid: () => {\r\n log(`persist: corrupt updatedAt in stored data for \"${name}\". Using current time to prevent sync overwrite.`);\r\n },\r\n });\r\n if (cfg.checksum !== \"none\" && checksum !== hashState(data)) {\r\n reportStoreError(name, `Checksum mismatch loading store \"${name}\". Falling back to initial state.`);\r\n if (!shouldApply || shouldApply()) applyFeatureState(deepClone(getInitialState()), Date.now());\r\n return true;\r\n }\r\n let parsed = cfg.deserialize(data);\r\n const targetVersion = meta?.version ?? 1;\r\n const result = applyMigratedState({\r\n name,\r\n parsed,\r\n v,\r\n targetVersion,\r\n cfg,\r\n migrations: meta?.options?.migrations ?? {},\r\n getInitialState,\r\n reportStoreError,\r\n sanitize,\r\n deepClone,\r\n validateState,\r\n safeUpdatedAt,\r\n applyFeatureState,\r\n shouldApply,\r\n });\r\n if (!result.ok) return true;\r\n parsed = result.state;\r\n if (!shouldApply || shouldApply()) {\r\n applyFeatureState(result.state, safeUpdatedAt);\r\n if (!silent) log(`Store \"${name}\" loaded from persistence`);\r\n }\r\n return true;\r\n } catch (e) {\r\n reportStoreError(name, `Could not load store \"${name}\" (${(e as { message?: string })?.message || e})`);\r\n return true;\r\n }\r\n};\r\n\r\nconst persistLoadAsync = async ({\r\n name,\r\n silent = false,\r\n getMeta,\r\n getInitialState,\r\n applyFeatureState,\r\n reportStoreError,\r\n validate,\r\n log,\r\n hashState,\r\n deepClone,\r\n sanitize,\r\n shouldApply,\r\n}: PersistLoadArgs): Promise<boolean> => {\r\n const meta: PersistMeta | undefined = getMeta();\r\n const cfg = meta?.options?.persist;\r\n if (!cfg) return false;\r\n const validateState = (candidate: StoreValue): { ok: boolean; value?: StoreValue } =>\r\n normalizeFeatureState({ value: candidate, validate });\r\n try {\r\n const raw = await Promise.resolve(cfg.driver.getItem?.(cfg.key) ?? null);\r\n if (!raw) return false;\r\n const decrypted = cfg.decryptAsync\r\n ? await cfg.decryptAsync(raw)\r\n : cfg.decrypt(raw);\r\n const envelope = JSON.parse(decrypted);\r\n const { v = 1, checksum, data, updatedAt, updatedAtMs } = envelope || {};\r\n if (!data) return true;\r\n const safeUpdatedAt = resolveUpdatedAtMs({\r\n value: typeof updatedAtMs === \"number\" ? updatedAtMs : updatedAt,\r\n fallbackMs: Date.now(),\r\n onInvalid: () => {\r\n log(`persist: corrupt updatedAt in stored data for \"${name}\". Using current time to prevent sync overwrite.`);\r\n },\r\n });\r\n const computedChecksum = await computePersistChecksum(cfg.checksum, data, hashState);\r\n if (cfg.checksum !== \"none\" && checksum !== computedChecksum) {\r\n reportStoreError(name, `Checksum mismatch loading store \"${name}\". Falling back to initial state.`);\r\n if (!shouldApply || shouldApply()) applyFeatureState(deepClone(getInitialState()), Date.now());\r\n return true;\r\n }\r\n let parsed = cfg.deserialize(data);\r\n const targetVersion = meta?.version ?? 1;\r\n const result = applyMigratedState({\r\n name,\r\n parsed,\r\n v,\r\n targetVersion,\r\n cfg,\r\n migrations: meta?.options?.migrations ?? {},\r\n getInitialState,\r\n reportStoreError,\r\n sanitize,\r\n deepClone,\r\n validateState,\r\n safeUpdatedAt,\r\n applyFeatureState,\r\n shouldApply,\r\n });\r\n if (!result.ok) return true;\r\n if (!shouldApply || shouldApply()) {\r\n applyFeatureState(result.state, safeUpdatedAt);\r\n if (!silent) log(`Store \"${name}\" loaded from persistence`);\r\n }\r\n return true;\r\n } catch (e) {\r\n reportStoreError(name, `Could not load store \"${name}\" (${(e as { message?: string })?.message || e})`);\r\n return true;\r\n }\r\n};\r\n\r\nconst applyMigratedState = ({\r\n name,\r\n parsed,\r\n v,\r\n targetVersion,\r\n cfg,\r\n migrations,\r\n getInitialState,\r\n reportStoreError,\r\n sanitize,\r\n deepClone,\r\n validateState,\r\n safeUpdatedAt,\r\n applyFeatureState,\r\n shouldApply,\r\n}: {\r\n name: string;\r\n parsed: StoreValue;\r\n v: number;\r\n targetVersion: number;\r\n cfg: PersistConfig;\r\n migrations: Record<number, (state: any) => any>;\r\n getInitialState: () => StoreValue;\r\n reportStoreError: (name: string, message: string) => void;\r\n sanitize: (value: unknown) => unknown;\r\n deepClone: <T>(value: T) => T;\r\n validateState: (candidate: StoreValue) => { ok: boolean; value?: StoreValue };\r\n safeUpdatedAt: number;\r\n applyFeatureState: (value: StoreValue, updatedAtMs?: number) => void;\r\n shouldApply?: () => boolean;\r\n}): { ok: boolean; state: StoreValue } => {\r\n if (v !== targetVersion) {\r\n const steps = Object.keys(migrations)\r\n .map((k) => Number(k))\r\n .filter((ver) => ver > v && ver <= targetVersion)\r\n .sort((a, b) => a - b);\r\n\r\n if (steps.length === 0) {\r\n const fallback = resolveMigrationFailure({\r\n name,\r\n persisted: parsed,\r\n reason: `No migration path from v${v} to v${targetVersion} for \"${name}\". Applying onMigrationFail strategy.`,\r\n persistConfig: cfg,\r\n initialState: getInitialState(),\r\n reportStoreError,\r\n sanitize,\r\n deepClone,\r\n });\r\n parsed = fallback.state;\r\n if (!fallback.requiresValidation) {\r\n if (!shouldApply || shouldApply()) applyFeatureState(parsed, safeUpdatedAt);\r\n return { ok: false, state: parsed };\r\n }\r\n }\r\n\r\n let migrationFailed = false;\r\n let migrationFailureRequiresValidation = true;\r\n steps.forEach((ver) => {\r\n if (migrationFailed) return;\r\n try {\r\n const migrated = migrations[ver](parsed);\r\n if (migrated !== undefined) parsed = migrated;\r\n } catch (e) {\r\n const fallback = resolveMigrationFailure({\r\n name,\r\n persisted: parsed,\r\n reason: `Migration to v${ver} failed for \"${name}\": ${(e as { message?: string })?.message || e}`,\r\n persistConfig: cfg,\r\n initialState: getInitialState(),\r\n reportStoreError,\r\n sanitize,\r\n deepClone,\r\n });\r\n parsed = fallback.state;\r\n migrationFailureRequiresValidation = fallback.requiresValidation;\r\n migrationFailed = true;\r\n }\r\n });\r\n\r\n if (migrationFailed) {\r\n if (!migrationFailureRequiresValidation) {\r\n if (!shouldApply || shouldApply()) applyFeatureState(parsed, safeUpdatedAt);\r\n return { ok: false, state: parsed };\r\n }\r\n const recoveredValidation = validateState(parsed);\r\n if (!recoveredValidation.ok) {\r\n if (!shouldApply || shouldApply()) applyFeatureState(deepClone(getInitialState()), Date.now());\r\n return { ok: false, state: parsed };\r\n }\r\n return { ok: true, state: recoveredValidation.value ?? parsed };\r\n }\r\n }\r\n\r\n const validationResult = validateState(parsed);\r\n if (!validationResult.ok) {\r\n if (v !== targetVersion) {\r\n const fallback = resolveMigrationFailure({\r\n name,\r\n persisted: parsed,\r\n reason: `Persisted state for \"${name}\" failed schema after version change. Applying onMigrationFail strategy.`,\r\n persistConfig: cfg,\r\n initialState: getInitialState(),\r\n reportStoreError,\r\n sanitize,\r\n deepClone,\r\n });\r\n if (!fallback.requiresValidation) {\r\n if (!shouldApply || shouldApply()) applyFeatureState(fallback.state, safeUpdatedAt);\r\n return { ok: false, state: fallback.state };\r\n }\r\n\r\n const recoveredValidation = validateState(fallback.state);\r\n if (recoveredValidation.ok) {\r\n return { ok: true, state: recoveredValidation.value ?? fallback.state };\r\n }\r\n }\r\n reportStoreError(name, `Persisted state for \"${name}\" failed schema; resetting to initial.`);\r\n if (!shouldApply || shouldApply()) applyFeatureState(deepClone(getInitialState()), Date.now());\r\n return { ok: false, state: parsed };\r\n }\r\n\r\n return { ok: true, state: validationResult.value ?? parsed };\r\n};\r\n\r\n\r\n","/**\r\n * @module features/persist/save\r\n *\r\n * LAYER: Feature runtime\r\n * OWNS: Module-level behavior and exports for features/persist/save.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { StoreValue } from \"../../adapters/options.js\";\r\nimport { warnAlways } from \"../../utils.js\";\r\nimport { usesDefaultPersistCrypto } from \"./crypto.js\";\r\nimport { computePersistChecksum } from \"./checksum.js\";\r\nimport { setPersistPresence } from \"./watch.js\";\r\nimport type {\r\n PersistMeta,\r\n PersistTimers,\r\n PersistInFlight,\r\n PersistWatchState,\r\n PersistSaveArgs,\r\n PersistSequence,\r\n} from \"./types.js\";\r\n\r\nconst persistSaveInner = ({\r\n name,\r\n persistTimers,\r\n persistInFlight,\r\n persistSequence,\r\n persistWatchState,\r\n plaintextWarningsIssued,\r\n exists,\r\n getMeta,\r\n getStoreValue,\r\n reportStoreError,\r\n hashState,\r\n}: {\r\n name: string;\r\n persistTimers: PersistTimers;\r\n persistInFlight: PersistInFlight;\r\n persistSequence: PersistSequence;\r\n persistWatchState: PersistWatchState;\r\n plaintextWarningsIssued: Set<string>;\r\n exists: () => boolean;\r\n getMeta: () => PersistMeta | undefined;\r\n getStoreValue: () => StoreValue;\r\n reportStoreError: (name: string, message: string) => void;\r\n hashState: (value: unknown) => number;\r\n}, immediate = false): void => {\r\n const cfg = getMeta()?.options?.persist;\r\n if (!cfg) return;\r\n\r\n const writeNow = async (): Promise<void> => {\r\n const meta = getMeta();\r\n if (!meta?.options?.persist || meta.options.persist !== cfg || !exists()) return;\r\n\r\n if (\r\n !cfg.allowPlaintext\r\n && !plaintextWarningsIssued.has(name)\r\n && usesDefaultPersistCrypto(cfg.encrypt)\r\n && usesDefaultPersistCrypto(cfg.decrypt)\r\n ) {\r\n plaintextWarningsIssued.add(name);\r\n const message =\r\n `[stroid/persist] Store '${name}' is persisted in plaintext. ` +\r\n `Provide encrypt/decrypt hooks to protect sensitive data.`;\r\n meta.options.onError?.(message);\r\n warnAlways(message);\r\n }\r\n\r\n try {\r\n const serialized = cfg.serialize(getStoreValue());\r\n const checksum = await computePersistChecksum(cfg.checksum, serialized, hashState);\r\n const envelope = JSON.stringify({\r\n v: meta.version ?? 1,\r\n updatedAt: meta.updatedAt,\r\n updatedAtMs: meta.updatedAtMs ?? Date.now(),\r\n checksum,\r\n data: serialized,\r\n });\r\n const payload = cfg.encryptAsync\r\n ? await cfg.encryptAsync(envelope)\r\n : cfg.encrypt(envelope);\r\n await Promise.resolve(cfg.driver.setItem?.(cfg.key, payload));\r\n setPersistPresence(persistWatchState, name, true);\r\n } catch (e) {\r\n reportStoreError(name, `Could not persist store \"${name}\" (${(e as { message?: string })?.message || e})`);\r\n }\r\n };\r\n\r\n const startWrite = (timer?: ReturnType<typeof setTimeout>): void => {\r\n const prev = persistInFlight[name];\r\n const sequence = (persistSequence[name] ?? 0) + 1;\r\n persistSequence[name] = sequence;\r\n const run = async (): Promise<void> => {\r\n if (prev) await prev;\r\n if (timer && persistTimers[name] !== timer) return;\r\n if (persistSequence[name] !== sequence) return;\r\n await writeNow();\r\n };\r\n\r\n const promise = run().finally(() => {\r\n if (persistInFlight[name] === promise) persistInFlight[name] = null;\r\n if (timer && persistTimers[name] === timer) delete persistTimers[name];\r\n });\r\n persistInFlight[name] = promise;\r\n };\r\n\r\n if (immediate) {\r\n if (persistTimers[name]) {\r\n clearTimeout(persistTimers[name]);\r\n delete persistTimers[name];\r\n }\r\n startWrite();\r\n return;\r\n }\r\n\r\n if (persistTimers[name]) clearTimeout(persistTimers[name]);\r\n const timer = setTimeout(() => {\r\n if (persistTimers[name] !== timer) return;\r\n startWrite(timer);\r\n }, 0);\r\n persistTimers[name] = timer;\r\n};\r\n\r\nexport const persistSave = (args: PersistSaveArgs): void => persistSaveInner(args);\r\n\r\nexport const flushPersistImmediately = (name: string, args: PersistSaveArgs): void =>\r\n persistSaveInner({ ...args, name }, true);\r\n\r\n\r\n","/**\r\n * @module features/persist\r\n *\r\n * LAYER: Feature runtime\r\n * OWNS: Module-level behavior and exports for features/persist.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { PersistOptions } from \"../adapters/options.js\";\r\nimport { registerStoreFeature, type StoreFeatureRuntime } from \"../feature-registry.js\";\r\nimport { isIdentityCrypto, validateCryptoPair } from \"./persist/crypto.js\";\r\nimport { setupPersistWatch } from \"./persist/watch.js\";\r\nimport { persistLoad } from \"./persist/load.js\";\r\nimport { persistSave, flushPersistImmediately } from \"./persist/save.js\";\r\nimport type {\r\n PersistWatchEntry,\r\n PersistWatchState,\r\n PersistTimers,\r\n PersistInFlight,\r\n PersistSequence,\r\n PersistMeta,\r\n} from \"./persist/types.js\";\r\n\r\nexport type { PersistWatchEntry, PersistWatchState, PersistTimers } from \"./persist/types.js\";\r\nexport { setupPersistWatch } from \"./persist/watch.js\";\r\nexport { persistLoad } from \"./persist/load.js\";\r\nexport { persistSave, flushPersistImmediately } from \"./persist/save.js\";\r\n\r\nlet _registered = false;\r\nconst _envFromProcess = typeof process !== \"undefined\" && typeof process.env?.NODE_ENV === \"string\"\r\n ? process.env.NODE_ENV\r\n : undefined;\r\nconst _envFromImportMeta = typeof import.meta !== \"undefined\" && (import.meta as any)?.env?.MODE\r\n ? (import.meta as any).env.MODE\r\n : undefined;\r\nconst _resolvedEnv = _envFromProcess ?? _envFromImportMeta;\r\nconst isProdEnv = (): boolean => _resolvedEnv === \"production\";\r\n\r\nexport const createPersistFeatureRuntime = (): StoreFeatureRuntime => {\r\n const persistTimers: PersistTimers = {};\r\n const persistInFlight: PersistInFlight = {};\r\n const persistSequence: PersistSequence = Object.create(null);\r\n const persistKeys: Record<string, string> = Object.create(null);\r\n const persistWatchState: PersistWatchState = Object.create(null);\r\n const plaintextWarningsIssued = new Set<string>();\r\n const persistLoadState: Record<string, { loading: boolean; pendingSave: boolean }> = Object.create(null);\r\n\r\n return {\r\n api: {\r\n getPersistQueueDepth(name: string) {\r\n return persistTimers[name] ? 1 : 0;\r\n },\r\n },\r\n\r\n onStoreCreate(ctx) {\r\n const cfg = ctx.options.persist;\r\n if (!cfg) return;\r\n\r\n const isPlaintext = !cfg.encryptAsync && isIdentityCrypto(cfg.encrypt) && isIdentityCrypto(cfg.decrypt);\r\n if (isPlaintext && !cfg.allowPlaintext) {\r\n const message =\r\n `[stroid/persist] Store \"${ctx.name}\" is configured for plaintext persistence. ` +\r\n `Provide encrypt/decrypt hooks or set persist.allowPlaintext: true to acknowledge.`;\r\n if (isProdEnv()) {\r\n ctx.reportStoreError(message);\r\n ctx.options.persist = null;\r\n return;\r\n }\r\n ctx.warn(message);\r\n }\r\n if ((cfg as PersistOptions & { sensitiveData?: boolean }).sensitiveData && !cfg.encryptAsync && isIdentityCrypto(cfg.encrypt)) {\r\n ctx.reportStoreError(\r\n `persist: store \"${ctx.name}\" is marked sensitiveData but has no encrypt function. ` +\r\n `Plaintext data will be written to storage.`\r\n );\r\n return; // block registration — do not persist without encryption on sensitive stores\r\n }\r\n\r\n const cryptoValidation = validateCryptoPair(ctx.name, cfg.encrypt, cfg.decrypt);\r\n if (!cryptoValidation.ok) {\r\n ctx.reportStoreError(cryptoValidation.reason ?? `persist: encrypt/decrypt validation failed for store \"${ctx.name}\".`);\r\n ctx.options.persist = null;\r\n return; // block registration — do not persist when crypto hooks are misconfigured\r\n }\r\n\r\n if (cfg.key) {\r\n const existing = persistKeys[cfg.key];\r\n if (existing && existing !== ctx.name && ctx.isDev()) {\r\n ctx.warn(\r\n `Persist key collision: \"${cfg.key}\" already used by store \"${existing}\". ` +\r\n `Store \"${ctx.name}\" will overwrite the same storage key.`,\r\n );\r\n } else {\r\n persistKeys[cfg.key] = ctx.name;\r\n }\r\n }\r\n\r\n const loadStartVersion = ctx.getMeta()?.updateCount ?? 0;\r\n const shouldApply = () => {\r\n const meta = ctx.getMeta();\r\n if (!meta) return false;\r\n return (meta.updateCount ?? 0) === loadStartVersion;\r\n };\r\n const hadPersistedState = persistLoad({\r\n name: ctx.name,\r\n silent: true,\r\n getMeta: ctx.getMeta,\r\n getInitialState: ctx.getInitialState,\r\n applyFeatureState: ctx.applyFeatureState,\r\n reportStoreError: (name, message) => ctx.reportStoreError(message),\r\n validate: ctx.validate,\r\n log: ctx.log,\r\n hashState: ctx.hashState,\r\n deepClone: ctx.deepClone,\r\n sanitize: ctx.sanitize,\r\n shouldApply,\r\n });\r\n\r\n if (typeof (hadPersistedState as Promise<boolean>)?.then === \"function\") {\r\n persistLoadState[ctx.name] = { loading: true, pendingSave: false };\r\n (hadPersistedState as Promise<boolean>)\r\n .then((loaded) => {\r\n const state = persistLoadState[ctx.name];\r\n if (!state) return;\r\n state.loading = false;\r\n if (!loaded || state.pendingSave) {\r\n persistSave({\r\n name: ctx.name,\r\n persistTimers,\r\n persistInFlight,\r\n persistSequence,\r\n persistWatchState,\r\n plaintextWarningsIssued,\r\n exists: () => ctx.hasStore(),\r\n getMeta: ctx.getMeta,\r\n getStoreValue: ctx.getStoreValue,\r\n reportStoreError: (name, message) => ctx.reportStoreError(message),\r\n hashState: ctx.hashState,\r\n });\r\n }\r\n delete persistLoadState[ctx.name];\r\n })\r\n .catch(() => {\r\n const state = persistLoadState[ctx.name];\r\n if (!state) return;\r\n state.loading = false;\r\n if (state.pendingSave) {\r\n persistSave({\r\n name: ctx.name,\r\n persistTimers,\r\n persistInFlight,\r\n persistSequence,\r\n persistWatchState,\r\n plaintextWarningsIssued,\r\n exists: () => ctx.hasStore(),\r\n getMeta: ctx.getMeta,\r\n getStoreValue: ctx.getStoreValue,\r\n reportStoreError: (name, message) => ctx.reportStoreError(message),\r\n hashState: ctx.hashState,\r\n });\r\n }\r\n delete persistLoadState[ctx.name];\r\n });\r\n } else if (!hadPersistedState) {\r\n persistSave({\r\n name: ctx.name,\r\n persistTimers,\r\n persistInFlight,\r\n persistSequence,\r\n persistWatchState,\r\n plaintextWarningsIssued,\r\n exists: () => ctx.hasStore(),\r\n getMeta: ctx.getMeta,\r\n getStoreValue: ctx.getStoreValue,\r\n reportStoreError: (name, message) => ctx.reportStoreError(message),\r\n hashState: ctx.hashState,\r\n });\r\n }\r\n\r\n if (typeof window !== \"undefined\" && typeof window.addEventListener === \"function\") {\r\n const flush = () => {\r\n flushPersistImmediately(ctx.name, {\r\n name: ctx.name,\r\n persistTimers,\r\n persistInFlight,\r\n persistSequence,\r\n persistWatchState,\r\n plaintextWarningsIssued,\r\n exists: () => ctx.hasStore(),\r\n getMeta: ctx.getMeta,\r\n getStoreValue: ctx.getStoreValue,\r\n reportStoreError: (name, message) => ctx.reportStoreError(message),\r\n hashState: ctx.hashState,\r\n });\r\n };\r\n window.addEventListener(\"pagehide\", flush, { once: true });\r\n window.addEventListener(\"beforeunload\", flush, { once: true });\r\n }\r\n\r\n setupPersistWatch({\r\n name: ctx.name,\r\n persistConfig: cfg,\r\n persistWatchState,\r\n });\r\n },\r\n\r\n onStoreWrite(ctx) {\r\n if (!ctx.options.persist) return;\r\n const loadState = persistLoadState[ctx.name];\r\n if (loadState?.loading) {\r\n loadState.pendingSave = true;\r\n return;\r\n }\r\n persistSave({\r\n name: ctx.name,\r\n persistTimers,\r\n persistInFlight,\r\n persistSequence,\r\n persistWatchState,\r\n plaintextWarningsIssued,\r\n exists: () => ctx.hasStore(),\r\n getMeta: ctx.getMeta,\r\n getStoreValue: ctx.getStoreValue,\r\n reportStoreError: (name, message) => ctx.reportStoreError(message),\r\n hashState: ctx.hashState,\r\n });\r\n },\r\n\r\n beforeStoreDelete(ctx) {\r\n const cfg = ctx.options.persist;\r\n if (!cfg) return;\r\n\r\n delete persistLoadState[ctx.name];\r\n\r\n if (persistTimers[ctx.name]) {\r\n clearTimeout(persistTimers[ctx.name]);\r\n delete persistTimers[ctx.name];\r\n }\r\n persistInFlight[ctx.name] = null;\r\n delete persistSequence[ctx.name];\r\n\r\n try {\r\n cfg.driver.removeItem?.(cfg.key);\r\n } catch (_) {\r\n // ignore driver cleanup errors\r\n }\r\n\r\n if (cfg.key && persistKeys[cfg.key] === ctx.name) {\r\n delete persistKeys[cfg.key];\r\n }\r\n\r\n persistWatchState[ctx.name]?.dispose();\r\n delete persistWatchState[ctx.name];\r\n },\r\n\r\n resetAll() {\r\n Object.values(persistTimers).forEach((timer) => clearTimeout(timer));\r\n Object.values(persistWatchState).forEach((entry) => {\r\n try { entry.dispose(); } catch (_) { /* ignore cleanup errors */ }\r\n });\r\n\r\n Object.keys(persistTimers).forEach((key) => delete persistTimers[key]);\r\n Object.keys(persistInFlight).forEach((key) => { persistInFlight[key] = null; delete persistInFlight[key]; });\r\n Object.keys(persistSequence).forEach((key) => delete persistSequence[key]);\r\n Object.keys(persistKeys).forEach((key) => delete persistKeys[key]);\r\n Object.keys(persistWatchState).forEach((key) => delete persistWatchState[key]);\r\n Object.keys(persistLoadState).forEach((key) => delete persistLoadState[key]);\r\n plaintextWarningsIssued.clear();\r\n },\r\n };\r\n};\r\n\r\nexport const registerPersistFeature = (): void => {\r\n if (_registered) return;\r\n _registered = true;\r\n registerStoreFeature(\"persist\", createPersistFeatureRuntime);\r\n};\r\n\r\n\r\n","/**\r\n * @module features/sync\r\n *\r\n * LAYER: Feature runtime\r\n * OWNS: Module-level behavior and exports for features/sync.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { StoreValue, SyncMessage, SyncOptions } from \"../adapters/options.js\";\r\nimport { registerStoreFeature, type StoreFeatureRuntime } from \"../feature-registry.js\";\r\nimport { normalizeFeatureState, resolveUpdatedAtMs } from \"./state-helpers.js\";\r\nimport { warnAlways } from \"../utils.js\";\r\n\r\nexport type SyncChannels = Record<string, BroadcastChannel>;\r\nexport type SyncClocks = Record<string, number>;\r\nexport type SyncVersion = { clock: number; updatedAt: number; source: string };\r\nexport type SyncVersions = Record<string, SyncVersion>;\r\nexport type SyncWindowCleanup = Record<string, () => void>;\r\n\r\nlet _registered = false;\r\nconst SYNC_PROTOCOL_VERSION = 1;\r\nconst resolveProtocolVersion = (msg: { v?: unknown; protocol?: unknown }): number | undefined =>\r\n typeof msg?.v === \"number\"\r\n ? msg.v as number\r\n : (typeof msg?.protocol === \"number\" ? msg.protocol as number : undefined);\r\n\r\nconst insecureSyncWarned = new Set<string>();\r\nconst signerVerifyWarned = new Set<string>();\r\n\r\ntype SyncMeta = {\r\n updatedAt: string;\r\n updatedAtMs?: number;\r\n updateCount: number;\r\n options: {\r\n sync?: boolean | SyncOptions;\r\n };\r\n};\r\n\r\nconst byteLength = (value: string): number => {\r\n if (typeof TextEncoder !== \"undefined\") {\r\n return new TextEncoder().encode(value).length;\r\n }\r\n if (typeof Buffer !== \"undefined\") {\r\n return Buffer.byteLength(value);\r\n }\r\n return value.length;\r\n};\r\n\r\nconst compareSyncOrder = ({\r\n incoming,\r\n accepted,\r\n}: {\r\n incoming: { clock?: number; source?: string };\r\n accepted?: SyncVersion;\r\n}): number => {\r\n const localClock = accepted?.clock ?? 0;\r\n const incomingClock = typeof incoming.clock === \"number\" ? incoming.clock : 0;\r\n if (incomingClock !== localClock) return incomingClock - localClock;\r\n\r\n const incomingSource = incoming.source ?? \"\";\r\n const localSource = accepted?.source ?? \"\";\r\n if (incomingSource === localSource) return 0;\r\n return incomingSource.localeCompare(localSource, \"en\", { sensitivity: \"variant\" });\r\n};\r\n\r\nconst resolveMetaUpdatedAtMs = (meta?: SyncMeta): number =>\r\n meta?.updatedAtMs ?? resolveUpdatedAtMs({ value: meta?.updatedAt, fallbackMs: 0 });\r\n\r\nconst isValidSyncMessage = (msg: unknown): msg is {\r\n v?: number;\r\n protocol?: number;\r\n type: string;\r\n name: string;\r\n clock: number;\r\n source: string;\r\n data?: unknown;\r\n updatedAt?: number;\r\n auth?: unknown;\r\n token?: unknown;\r\n requestedAt?: number;\r\n} => {\r\n if (typeof msg !== \"object\" || msg === null) return false;\r\n const m = msg as Record<string, unknown>;\r\n const hasVersion = typeof m.v === \"number\" || typeof m.protocol === \"number\";\r\n return (\r\n hasVersion &&\r\n typeof m.type === \"string\" &&\r\n typeof m.name === \"string\" &&\r\n typeof m.clock === \"number\" &&\r\n typeof m.source === \"string\"\r\n );\r\n};\r\n\r\nconst requestSyncSnapshot = ({\r\n name,\r\n syncChannels,\r\n instanceId,\r\n authToken,\r\n reportStoreError,\r\n}: {\r\n name: string;\r\n syncChannels: SyncChannels;\r\n instanceId: string;\r\n authToken?: string;\r\n reportStoreError: (name: string, message: string) => void;\r\n}): void => {\r\n const channel = syncChannels[name];\r\n if (!channel) return;\r\n try {\r\n const payload: SyncMessage = {\r\n v: SYNC_PROTOCOL_VERSION,\r\n protocol: SYNC_PROTOCOL_VERSION,\r\n type: \"sync-request\",\r\n source: instanceId,\r\n name,\r\n clock: 0,\r\n requestedAt: Date.now(),\r\n };\r\n if (authToken) payload.token = authToken;\r\n channel.postMessage(payload);\r\n } catch (err) {\r\n reportStoreError(name, `Failed to request sync snapshot for \"${name}\": ${(err as { message?: string })?.message ?? err}`);\r\n }\r\n};\r\n\r\nexport const bumpSyncClock = (name: string, syncClocks: SyncClocks): number => {\r\n syncClocks[name] = (syncClocks[name] ?? 0) + 1;\r\n return syncClocks[name];\r\n};\r\n\r\nexport const absorbSyncClock = (\r\n name: string,\r\n incomingClock: number,\r\n syncClocks: SyncClocks\r\n): number => {\r\n syncClocks[name] = Math.max(syncClocks[name] ?? 0, incomingClock) + 1;\r\n return syncClocks[name];\r\n};\r\n\r\nexport const closeSyncResources = ({\r\n name,\r\n syncChannels,\r\n syncWindowCleanup,\r\n syncClocks,\r\n syncVersions,\r\n}: {\r\n name: string;\r\n syncChannels: SyncChannels;\r\n syncWindowCleanup: SyncWindowCleanup;\r\n syncClocks: SyncClocks;\r\n syncVersions: SyncVersions;\r\n}): void => {\r\n syncChannels[name]?.close();\r\n delete syncChannels[name];\r\n syncWindowCleanup[name]?.();\r\n delete syncWindowCleanup[name];\r\n delete syncClocks[name];\r\n delete syncVersions[name];\r\n};\r\n\r\nexport const cleanupAllSyncResources = ({\r\n syncChannels,\r\n syncWindowCleanup,\r\n}: {\r\n syncChannels: SyncChannels;\r\n syncWindowCleanup: SyncWindowCleanup;\r\n}): void => {\r\n Object.values(syncWindowCleanup).forEach((dispose) => {\r\n try { dispose(); } catch (_) { /* ignore cleanup errors */ }\r\n });\r\n Object.values(syncChannels).forEach((channel) => {\r\n try { channel.close(); } catch (_) { /* ignore cleanup errors */ }\r\n });\r\n};\r\n\r\nexport const setupSync = ({\r\n name,\r\n syncOption,\r\n syncChannels,\r\n syncClocks,\r\n syncVersions,\r\n syncWindowCleanup,\r\n instanceId,\r\n getMeta,\r\n getAcceptedSyncVersion,\r\n getStoreValue,\r\n hasStoreEntry,\r\n notify,\r\n validate,\r\n reportStoreError,\r\n warn,\r\n setStoreValue,\r\n normalizeIncomingState,\r\n acceptIncomingSyncVersion,\r\n resolveSyncVersion,\r\n broadcastSync,\r\n}: {\r\n name: string;\r\n syncOption?: boolean | SyncOptions;\r\n syncChannels: SyncChannels;\r\n syncClocks: SyncClocks;\r\n syncVersions: SyncVersions;\r\n syncWindowCleanup: SyncWindowCleanup;\r\n instanceId: string;\r\n getMeta: (name: string) => SyncMeta | undefined;\r\n getAcceptedSyncVersion: (name: string) => SyncVersion | undefined;\r\n getStoreValue: (name: string) => StoreValue;\r\n hasStoreEntry: (name: string) => boolean;\r\n notify: (name: string) => void;\r\n validate: (name: string, next: StoreValue) => { ok: boolean; value?: StoreValue };\r\n reportStoreError: (name: string, message: string) => void;\r\n warn: (message: string) => void;\r\n setStoreValue: (name: string, value: StoreValue) => void;\r\n normalizeIncomingState: (name: string, value: StoreValue) => StoreValue | null;\r\n acceptIncomingSyncVersion: (name: string, updatedAtMs: number, incomingClock: number, source: string) => void;\r\n resolveSyncVersion: (name: string, updatedAtMs: number, incomingClock: number) => number;\r\n broadcastSync: (name: string) => void;\r\n}): void => {\r\n if (!syncOption) return;\r\n if (typeof window === \"undefined\" || typeof BroadcastChannel === \"undefined\") {\r\n reportStoreError(name, `Sync enabled for \"${name}\" but BroadcastChannel not available in this environment.`);\r\n return;\r\n }\r\n const hasAuthToken = typeof syncOption === \"object\"\r\n && typeof syncOption.authToken === \"string\"\r\n && syncOption.authToken.length > 0;\r\n const hasVerify = typeof syncOption === \"object\" && typeof syncOption.verify === \"function\";\r\n const hasSign = typeof syncOption === \"object\" && typeof syncOption.sign === \"function\";\r\n\r\n if (!hasAuthToken && !hasVerify && !insecureSyncWarned.has(name)) {\r\n insecureSyncWarned.add(name);\r\n warnAlways(\r\n `Sync for \"${name}\" is unauthenticated. Any same-origin tab can forge sync messages. ` +\r\n `Provide sync.authToken or sync.verify to enforce authentication.`\r\n );\r\n }\r\n\r\n if (hasSign && !hasVerify && !signerVerifyWarned.has(name)) {\r\n signerVerifyWarned.add(name);\r\n warn(\r\n `Sync for \"${name}\" is configured with \"sign\" but no \"verify\". ` +\r\n `\"sign\" has no effect unless incoming messages are verified.`\r\n );\r\n }\r\n const expectedToken = typeof syncOption === \"object\" ? syncOption.authToken : undefined;\r\n let tokenWarned = false;\r\n const channelName = typeof syncOption === \"object\" && syncOption.channel\r\n ? syncOption.channel\r\n : `stroid_sync_${name}`;\r\n try {\r\n const channel = new BroadcastChannel(channelName);\r\n syncChannels[name] = channel;\r\n channel.onmessage = (event: MessageEvent) => {\r\n const msg = event.data as any;\r\n if (!msg || msg.source === instanceId) return;\r\n if (msg.name !== name) return;\r\n if (syncChannels[name] !== channel || !hasStoreEntry(name) || !getMeta(name)) return;\r\n if (!isValidSyncMessage(msg)) {\r\n reportStoreError(name, `Sync message for \"${name}\" is malformed; ignoring.`);\r\n return;\r\n }\r\n if (expectedToken && msg.token !== expectedToken) {\r\n if (!tokenWarned) {\r\n reportStoreError(name, `Sync message for \"${name}\" failed auth token verification; ignoring.`);\r\n tokenWarned = true;\r\n }\r\n return;\r\n }\r\n const incomingVersion = resolveProtocolVersion(msg);\r\n if (incomingVersion !== SYNC_PROTOCOL_VERSION) {\r\n reportStoreError(name, `Sync protocol mismatch for \"${name}\". Expected v${SYNC_PROTOCOL_VERSION} but received ${String(incomingVersion ?? \"unknown\")}. Ignoring message.`);\r\n return;\r\n }\r\n const isSyncState = msg.type === \"sync-state\";\r\n if (isSyncState && (typeof msg.data === \"undefined\" || typeof msg.clock !== \"number\")) {\r\n reportStoreError(name, `Sync message for \"${name}\" is malformed; ignoring.`);\r\n return;\r\n }\r\n if (typeof syncOption === \"object\" && typeof syncOption.verify === \"function\") {\r\n let verified = false;\r\n try {\r\n verified = !!syncOption.verify(msg as SyncMessage);\r\n } catch (err) {\r\n reportStoreError(\r\n name,\r\n `Sync message verification failed for \"${name}\": ${(err as { message?: string })?.message ?? err}`\r\n );\r\n return;\r\n }\r\n if (!verified) {\r\n reportStoreError(name, `Sync message for \"${name}\" failed verification; ignoring.`);\r\n return;\r\n }\r\n }\r\n if (msg.type === \"sync-request\") {\r\n broadcastSync(name);\r\n return;\r\n }\r\n const resolver = typeof syncOption === \"object\" ? syncOption.conflictResolver : null;\r\n const order = compareSyncOrder({\r\n incoming: {\r\n clock: msg.clock,\r\n source: msg.source,\r\n },\r\n accepted: getAcceptedSyncVersion(name),\r\n });\r\n if (order <= 0) {\r\n const localUpdated = resolveMetaUpdatedAtMs(getMeta(name));\r\n const incomingUpdated = typeof msg.updatedAt === \"number\" ? msg.updatedAt : Date.now();\r\n if (resolver) {\r\n const resolved = resolver({\r\n local: getStoreValue(name),\r\n incoming: msg.data,\r\n localUpdated,\r\n incomingUpdated,\r\n });\r\n if (resolved !== undefined) {\r\n const normalizedResolved = normalizeIncomingState(name, resolved);\r\n if (normalizedResolved === null) return;\r\n setStoreValue(name, normalizedResolved);\r\n const resolveUpdatedAt = typeof syncOption === \"object\" ? syncOption.resolveUpdatedAt : null;\r\n const resolvedUpdatedAt = resolveUpdatedAt\r\n ? resolveUpdatedAt({ localUpdated, incomingUpdated, now: Date.now() })\r\n : Math.max(Date.now(), localUpdated, incomingUpdated);\r\n resolveSyncVersion(name, resolvedUpdatedAt, typeof msg.clock === \"number\" ? msg.clock : 0);\r\n notify(name);\r\n broadcastSync(name);\r\n }\r\n }\r\n return;\r\n }\r\n const normalizedIncoming = normalizeIncomingState(name, msg.data);\r\n if (normalizedIncoming === null) return;\r\n setStoreValue(name, normalizedIncoming);\r\n acceptIncomingSyncVersion(\r\n name,\r\n typeof msg.updatedAt === \"number\" ? msg.updatedAt : Date.now(),\r\n typeof msg.clock === \"number\" ? msg.clock : 0,\r\n typeof msg.source === \"string\" ? msg.source : \"\"\r\n );\r\n notify(name);\r\n };\r\n\r\n if (typeof window !== \"undefined\" && typeof window.addEventListener === \"function\") {\r\n syncWindowCleanup[name]?.();\r\n const hostWindow = window;\r\n const requestLatest = () => {\r\n requestSyncSnapshot({\r\n name,\r\n syncChannels,\r\n instanceId,\r\n authToken: expectedToken,\r\n reportStoreError,\r\n });\r\n };\r\n hostWindow.addEventListener(\"focus\", requestLatest);\r\n hostWindow.addEventListener(\"online\", requestLatest);\r\n syncWindowCleanup[name] = () => {\r\n hostWindow.removeEventListener(\"focus\", requestLatest);\r\n hostWindow.removeEventListener(\"online\", requestLatest);\r\n };\r\n }\r\n\r\n queueMicrotask(() => {\r\n requestSyncSnapshot({\r\n name,\r\n syncChannels,\r\n instanceId,\r\n authToken: expectedToken,\r\n reportStoreError,\r\n });\r\n });\r\n } catch (e) {\r\n warn(`Failed to setup sync for \"${name}\": ${(e as { message?: string })?.message || e}`);\r\n }\r\n};\r\n\r\nexport const broadcastSync = ({\r\n name,\r\n syncOption,\r\n syncChannels,\r\n syncClocks,\r\n instanceId,\r\n updatedAt,\r\n data,\r\n hashState,\r\n reportStoreError,\r\n}: {\r\n name: string;\r\n syncOption?: boolean | SyncOptions;\r\n syncChannels: SyncChannels;\r\n syncClocks: SyncClocks;\r\n instanceId: string;\r\n updatedAt: string | number;\r\n data: StoreValue;\r\n hashState: (value: unknown) => number;\r\n reportStoreError: (name: string, message: string) => void;\r\n}): void => {\r\n const channel = syncChannels[name];\r\n if (!channel) return;\r\n try {\r\n const checksumMode = typeof syncOption === \"object\" && syncOption.checksum === \"none\" ? \"none\" : \"hash\";\r\n const payload: SyncMessage = {\r\n v: SYNC_PROTOCOL_VERSION,\r\n protocol: SYNC_PROTOCOL_VERSION,\r\n type: \"sync-state\",\r\n source: instanceId,\r\n name,\r\n clock: syncClocks[name] ?? 0,\r\n updatedAt: resolveUpdatedAtMs({ value: updatedAt, fallbackMs: Date.now() }),\r\n data,\r\n checksum: checksumMode === \"hash\" ? hashState(data) : null,\r\n };\r\n if (typeof syncOption === \"object\" && syncOption.authToken) {\r\n payload.token = syncOption.authToken;\r\n }\r\n if (typeof syncOption === \"object\" && typeof syncOption.sign === \"function\") {\r\n try {\r\n const auth = syncOption.sign(payload);\r\n if (auth && typeof (auth as { then?: unknown }).then === \"function\") {\r\n reportStoreError(\r\n name,\r\n `Sync signer for \"${name}\" returned a Promise. \"sign\" must be synchronous.`\r\n );\r\n return;\r\n }\r\n if (auth !== undefined) payload.auth = auth;\r\n } catch (err) {\r\n reportStoreError(\r\n name,\r\n `Failed to sign sync payload for \"${name}\": ${(err as { message?: string })?.message ?? err}`\r\n );\r\n return;\r\n }\r\n }\r\n const maxPayloadBytes = typeof syncOption === \"object\" && typeof syncOption.maxPayloadBytes === \"number\"\r\n ? syncOption.maxPayloadBytes\r\n : 64 * 1024;\r\n const payloadSize = byteLength(JSON.stringify(payload));\r\n\r\n if (payloadSize > maxPayloadBytes) {\r\n reportStoreError(\r\n name,\r\n `Sync payload for \"${name}\" exceeds ${maxPayloadBytes} bytes (${payloadSize} bytes). Skipping BroadcastChannel sync.`\r\n );\r\n return;\r\n }\r\n\r\n channel.postMessage(payload);\r\n } catch (err) {\r\n reportStoreError(name, `Failed to broadcast sync for \"${name}\": ${(err as { message?: string })?.message ?? err}`);\r\n }\r\n};\r\n\r\nexport const createSyncFeatureRuntime = (): StoreFeatureRuntime => {\r\n const syncChannels: SyncChannels = Object.create(null);\r\n const syncClocks: SyncClocks = Object.create(null);\r\n const syncVersions: SyncVersions = Object.create(null);\r\n const syncWindowCleanup: SyncWindowCleanup = Object.create(null);\r\n const instanceId = `stroid_${Math.random().toString(16).slice(2)}`;\r\n\r\n const recordLocalVersion = (name: string, updatedAt: string | number): void => {\r\n syncVersions[name] = {\r\n clock: syncClocks[name] ?? 0,\r\n updatedAt: resolveUpdatedAtMs({ value: updatedAt, fallbackMs: Date.now() }),\r\n source: instanceId,\r\n };\r\n };\r\n\r\n const ensureLocalClock = (name: string, updatedAt: string | number): void => {\r\n bumpSyncClock(name, syncClocks);\r\n recordLocalVersion(name, updatedAt);\r\n };\r\n\r\n return {\r\n onStoreCreate(ctx) {\r\n if (!ctx.options.sync) return;\r\n\r\n setupSync({\r\n name: ctx.name,\r\n syncOption: ctx.options.sync,\r\n syncChannels,\r\n syncClocks,\r\n syncVersions,\r\n syncWindowCleanup,\r\n instanceId,\r\n getMeta: ctx.getMeta,\r\n getAcceptedSyncVersion: (name) => syncVersions[name],\r\n getStoreValue: (name) => ctx.getStoreValue(),\r\n hasStoreEntry: () => ctx.hasStore(),\r\n notify: () => ctx.notify(),\r\n validate: (name, next) => ctx.validate(next),\r\n reportStoreError: (name, message) => ctx.reportStoreError(message),\r\n warn: ctx.warn,\r\n setStoreValue: (name, value) => ctx.setStoreValue(value),\r\n normalizeIncomingState: (name, value) => {\r\n const normalized = normalizeFeatureState({\r\n value,\r\n sanitize: ctx.sanitize,\r\n validate: ctx.validate,\r\n onSanitizeError: (err) => {\r\n ctx.reportStoreError(\r\n `Sanitize failed for incoming sync \"${name}\": ${(err as { message?: string })?.message ?? err}`\r\n );\r\n },\r\n });\r\n if (!normalized.ok) return null;\r\n return normalized.value;\r\n },\r\n acceptIncomingSyncVersion: (name, updatedAtMs, incomingClock, source) => {\r\n ctx.applyFeatureState(ctx.getStoreValue(), updatedAtMs);\r\n syncClocks[ctx.name] = Math.max(syncClocks[ctx.name] ?? 0, incomingClock);\r\n syncVersions[ctx.name] = {\r\n clock: incomingClock,\r\n updatedAt: updatedAtMs,\r\n source,\r\n };\r\n },\r\n resolveSyncVersion: (name, updatedAtMs, incomingClock) => {\r\n ctx.applyFeatureState(ctx.getStoreValue(), updatedAtMs);\r\n const resolvedClock = absorbSyncClock(ctx.name, incomingClock, syncClocks);\r\n syncVersions[ctx.name] = {\r\n clock: resolvedClock,\r\n updatedAt: updatedAtMs,\r\n source: instanceId,\r\n };\r\n return resolvedClock;\r\n },\r\n broadcastSync: () => {\r\n const meta = ctx.getMeta();\r\n if (!meta) return;\r\n broadcastSync({\r\n name: ctx.name,\r\n syncOption: ctx.options.sync,\r\n syncChannels,\r\n syncClocks,\r\n instanceId,\r\n updatedAt: meta.updatedAtMs ?? meta.updatedAt,\r\n data: ctx.getStoreValue(),\r\n hashState: ctx.hashState,\r\n reportStoreError: (name, message) => ctx.reportStoreError(message),\r\n });\r\n },\r\n });\r\n\r\n if (syncChannels[ctx.name]) {\r\n const meta = ctx.getMeta();\r\n recordLocalVersion(ctx.name, meta?.updatedAtMs ?? meta?.updatedAt ?? new Date().toISOString());\r\n }\r\n },\r\n\r\n onStoreWrite(ctx) {\r\n if (!ctx.options.sync) return;\r\n const meta = ctx.getMeta();\r\n if (!meta) return;\r\n ensureLocalClock(ctx.name, meta.updatedAtMs ?? meta.updatedAt);\r\n broadcastSync({\r\n name: ctx.name,\r\n syncOption: ctx.options.sync,\r\n syncChannels,\r\n syncClocks,\r\n instanceId,\r\n updatedAt: meta.updatedAtMs ?? meta.updatedAt,\r\n data: ctx.next,\r\n hashState: ctx.hashState,\r\n reportStoreError: (name, message) => ctx.reportStoreError(message),\r\n });\r\n },\r\n\r\n beforeStoreDelete(ctx) {\r\n closeSyncResources({\r\n name: ctx.name,\r\n syncChannels,\r\n syncWindowCleanup,\r\n syncClocks,\r\n syncVersions,\r\n });\r\n },\r\n\r\n resetAll() {\r\n cleanupAllSyncResources({\r\n syncChannels,\r\n syncWindowCleanup,\r\n });\r\n Object.keys(syncChannels).forEach((key) => delete syncChannels[key]);\r\n Object.keys(syncClocks).forEach((key) => delete syncClocks[key]);\r\n Object.keys(syncVersions).forEach((key) => delete syncVersions[key]);\r\n Object.keys(syncWindowCleanup).forEach((key) => delete syncWindowCleanup[key]);\r\n insecureSyncWarned.clear();\r\n signerVerifyWarned.clear();\r\n },\r\n };\r\n};\r\n\r\nexport const registerSyncFeature = (): void => {\r\n if (_registered) return;\r\n _registered = true;\r\n registerStoreFeature(\"sync\", createSyncFeatureRuntime);\r\n};\r\n\r\n\r\n","/**\r\n * @module features/devtools\r\n *\r\n * LAYER: Feature runtime\r\n * OWNS: Module-level behavior and exports for features/devtools.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { StoreValue } from \"../adapters/options.js\";\r\nimport { registerStoreFeature, type StoreFeatureRuntime } from \"../feature-registry.js\";\r\n\r\nexport type HistoryDiff = { added: string[]; removed: string[]; changed: string[] } | null;\r\n\r\nexport type HistoryEntry = {\r\n ts: number;\r\n action: string;\r\n prev: StoreValue;\r\n next: StoreValue;\r\n diff: HistoryDiff;\r\n};\r\n\r\nlet _registered = false;\r\n\r\nconst cloneValue = <T,>(value: T): T => {\r\n try {\r\n if (typeof structuredClone === \"function\") return structuredClone(value);\r\n return JSON.parse(JSON.stringify(value)) as T;\r\n } catch (_) {\r\n return value;\r\n }\r\n};\r\n\r\nexport const initDevtools = ({\r\n name,\r\n useDevtools,\r\n existingDevtools,\r\n stores,\r\n warn,\r\n}: {\r\n name: string;\r\n useDevtools: boolean;\r\n existingDevtools: any;\r\n stores: Record<string, StoreValue>;\r\n warn: (message: string) => void;\r\n}): any => {\r\n if (!useDevtools) return existingDevtools;\r\n if (typeof window === \"undefined\") return existingDevtools;\r\n const ext = (window as any).__REDUX_DEVTOOLS_EXTENSION__ || (window as any).__REDUX_DEVTOOLS_EXTENSION__;\r\n if (!ext || typeof ext.connect !== \"function\") {\r\n warn(`DevTools requested for \"${name}\" but Redux DevTools extension not found.`);\r\n return existingDevtools;\r\n }\r\n if (existingDevtools) return existingDevtools;\r\n const devtools = ext.connect({ name: \"stroid\" });\r\n devtools.init(stores);\r\n return devtools;\r\n};\r\n\r\nexport const applyRedactor = ({\r\n data,\r\n redactor,\r\n deepClone,\r\n}: {\r\n data: StoreValue;\r\n redactor?: (state: StoreValue) => StoreValue;\r\n deepClone: <T>(value: T) => T;\r\n}): StoreValue => {\r\n if (typeof redactor === \"function\") {\r\n try { return redactor(deepClone(data)); }\r\n catch (_) { return data; }\r\n }\r\n return data;\r\n};\r\n\r\nexport const diffShallow = (prev: StoreValue, next: StoreValue): HistoryDiff => {\r\n if (typeof prev !== \"object\" || typeof next !== \"object\" || prev === null || next === null) return null;\r\n const prevObj = prev as Record<string, unknown>;\r\n const nextObj = next as Record<string, unknown>;\r\n const added: string[] = [];\r\n const removed: string[] = [];\r\n const changed: string[] = [];\r\n const prevKeys = new Set(Object.keys(prevObj));\r\n const nextKeys = new Set(Object.keys(nextObj));\r\n nextKeys.forEach((k) => {\r\n if (!prevKeys.has(k)) added.push(k);\r\n else if (!Object.is(prevObj[k], nextObj[k])) changed.push(k);\r\n });\r\n prevKeys.forEach((k) => {\r\n if (!nextKeys.has(k)) removed.push(k);\r\n });\r\n return { added, removed, changed };\r\n};\r\n\r\nexport const pushHistory = ({\r\n name,\r\n action,\r\n prev,\r\n next,\r\n history,\r\n historyLimit,\r\n applyRedactor,\r\n deepClone,\r\n}: {\r\n name: string;\r\n action: string;\r\n prev: StoreValue;\r\n next: StoreValue;\r\n history: Record<string, HistoryEntry[]>;\r\n historyLimit: number;\r\n applyRedactor: (value: StoreValue) => StoreValue;\r\n deepClone: <T>(value: T) => T;\r\n}): void => {\r\n if (historyLimit === 0) return;\r\n if (!history[name]) history[name] = [];\r\n const entry: HistoryEntry = {\r\n ts: Date.now(),\r\n action,\r\n prev: deepClone(applyRedactor(prev)),\r\n next: deepClone(applyRedactor(next)),\r\n diff: diffShallow(prev, next),\r\n };\r\n history[name].push(entry);\r\n if (history[name].length > historyLimit) {\r\n history[name].splice(0, history[name].length - historyLimit);\r\n }\r\n};\r\n\r\nexport const sendDevtools = ({\r\n name,\r\n action,\r\n force = false,\r\n devtools,\r\n enabled,\r\n stores,\r\n applyRedactor,\r\n}: {\r\n name: string;\r\n action: string;\r\n force?: boolean;\r\n devtools: any;\r\n enabled: boolean;\r\n stores: Record<string, StoreValue>;\r\n applyRedactor: (value: StoreValue) => StoreValue;\r\n}): void => {\r\n if (!devtools || (!force && !enabled)) return;\r\n try {\r\n const state = { ...stores, [name]: applyRedactor(stores[name]) };\r\n devtools.send({ type: `${name}/${action}` }, state);\r\n } catch (_) {\r\n // ignore devtools transport errors\r\n }\r\n};\r\n\r\nexport const createDevtoolsFeatureRuntime = (): StoreFeatureRuntime => {\r\n const history: Record<string, HistoryEntry[]> = Object.create(null);\r\n let devtools: any;\r\n\r\n return {\r\n onStoreCreate(ctx) {\r\n devtools = initDevtools({\r\n name: ctx.name,\r\n useDevtools: !!ctx.options.devtools,\r\n existingDevtools: devtools,\r\n stores: ctx.getAllStores(),\r\n warn: ctx.warn,\r\n });\r\n\r\n pushHistory({\r\n name: ctx.name,\r\n action: \"create\",\r\n prev: null,\r\n next: ctx.getStoreValue(),\r\n history,\r\n historyLimit: ctx.options.historyLimit ?? 50,\r\n applyRedactor: (value) => applyRedactor({\r\n data: value,\r\n redactor: ctx.options.redactor,\r\n deepClone: ctx.deepClone,\r\n }),\r\n deepClone: ctx.deepClone,\r\n });\r\n },\r\n\r\n onStoreWrite(ctx) {\r\n pushHistory({\r\n name: ctx.name,\r\n action: ctx.action,\r\n prev: ctx.prev,\r\n next: ctx.next,\r\n history,\r\n historyLimit: ctx.options.historyLimit ?? 50,\r\n applyRedactor: (value) => applyRedactor({\r\n data: value,\r\n redactor: ctx.options.redactor,\r\n deepClone: ctx.deepClone,\r\n }),\r\n deepClone: ctx.deepClone,\r\n });\r\n\r\n sendDevtools({\r\n name: ctx.name,\r\n action: ctx.action,\r\n devtools,\r\n enabled: !!ctx.options.devtools,\r\n stores: ctx.getAllStores(),\r\n applyRedactor: (value) => applyRedactor({\r\n data: value,\r\n redactor: ctx.options.redactor,\r\n deepClone: ctx.deepClone,\r\n }),\r\n });\r\n },\r\n\r\n afterStoreDelete(ctx) {\r\n if (ctx.options.devtools) {\r\n sendDevtools({\r\n name: ctx.name,\r\n action: \"delete\",\r\n force: true,\r\n devtools,\r\n enabled: true,\r\n stores: ctx.getAllStores(),\r\n applyRedactor: (value) => applyRedactor({\r\n data: value,\r\n redactor: ctx.options.redactor,\r\n deepClone: ctx.deepClone,\r\n }),\r\n });\r\n }\r\n delete history[ctx.name];\r\n },\r\n\r\n resetAll() {\r\n Object.keys(history).forEach((name) => {\r\n delete history[name];\r\n });\r\n devtools = undefined;\r\n },\r\n\r\n api: {\r\n getHistory(name, limit) {\r\n if (!history[name]) return [];\r\n const entries = history[name];\r\n if (limit && limit > 0) return cloneValue(entries.slice(-limit));\r\n return cloneValue(entries);\r\n },\r\n\r\n clearHistory(name) {\r\n if (name) {\r\n delete history[name];\r\n return;\r\n }\r\n Object.keys(history).forEach((key) => {\r\n delete history[key];\r\n });\r\n },\r\n },\r\n };\r\n};\r\n\r\nexport const registerDevtoolsFeature = (): void => {\r\n if (_registered) return;\r\n _registered = true;\r\n registerStoreFeature(\"devtools\", createDevtoolsFeatureRuntime);\r\n};\r\n\r\n\r\n","/**\r\n * @module install\r\n *\r\n * LAYER: Module\r\n * OWNS: Module-level behavior and exports for install.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport { registerPersistFeature } from \"./features/persist.js\";\r\nimport { registerSyncFeature } from \"./features/sync.js\";\r\nimport { registerDevtoolsFeature } from \"./features/devtools.js\";\r\n\r\nexport const installPersist = (): void => {\r\n registerPersistFeature();\r\n};\r\n\r\nexport const installSync = (): void => {\r\n registerSyncFeature();\r\n};\r\n\r\nexport const installDevtools = (): void => {\r\n registerDevtoolsFeature();\r\n};\r\n\r\nexport const installAllFeatures = (): void => {\r\n installPersist();\r\n installSync();\r\n installDevtools();\r\n};\r\n\r\n\r\n"]}
|