@biglogic/rgs 3.9.2 → 3.9.4
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/index.cjs +1386 -1
- package/index.js +1390 -1
- package/package.json +1 -1
- package/tsup.setup.d.ts +9 -0
- package/core/advanced.cjs +0 -1
- package/core/advanced.js +0 -1
- package/core/minimal.cjs +0 -1
- package/core/minimal.js +0 -1
package/index.cjs
CHANGED
|
@@ -1 +1,1386 @@
|
|
|
1
|
-
var e=require("react"),t=Symbol.for("immer-nothing"),n=Symbol.for("immer-draftable"),r=Symbol.for("immer-state"),s=[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},"This object has been frozen and should not be mutated",function(e){return"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+e},"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.","Immer forbids circular references","The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},"Object.defineProperty() cannot be used on an Immer draft","Object.setPrototypeOf() cannot be used on an Immer draft","Immer only supports deleting array indices","Immer only supports setting array indices and the 'length' property",function(e){return`'original' expects a draft, got: ${e}`}];function o(e,...t){{const n=s[e],r=A(n)?n.apply(null,t):n;throw new Error(`[Immer] ${r}`)}}var a=Object,i=a.getPrototypeOf,c="constructor",l="prototype",u="configurable",d="enumerable",p="writable",f="value",y=e=>!!e&&!!e[r];function h(e){return!!e&&(_(e)||E(e)||!!e[n]||!!e[c]?.[n]||C(e)||O(e))}var g=a[l][c].toString(),m=new WeakMap;function _(e){if(!e||!x(e))return!1;const t=i(e);if(null===t||t===a[l])return!0;const n=a.hasOwnProperty.call(t,c)&&t[c];if(n===Object)return!0;if(!A(n))return!1;let r=m.get(n);return void 0===r&&(r=Function.toString.call(n),m.set(n,r)),r===g}function S(e,t,n=!0){if(0===w(e)){(n?Reflect.ownKeys(e):a.keys(e)).forEach(n=>{t(n,e[n],e)})}else e.forEach((n,r)=>t(r,n,e))}function w(e){const t=e[r];return t?t.type_:E(e)?1:C(e)?2:O(e)?3:0}var b=(e,t,n=w(e))=>2===n?e.has(t):a[l].hasOwnProperty.call(e,t),v=(e,t,n=w(e))=>2===n?e.get(t):e[t],k=(e,t,n,r=w(e))=>{2===r?e.set(t,n):3===r?e.add(n):e[t]=n};var E=Array.isArray,C=e=>e instanceof Map,O=e=>e instanceof Set,x=e=>"object"==typeof e,A=e=>"function"==typeof e,D=e=>"boolean"==typeof e;var M=e=>e.copy_||e.base_,P=e=>e.modified_?e.copy_:e.base_;function R(e,t){if(C(e))return new Map(e);if(O(e))return new Set(e);if(E(e))return Array[l].slice.call(e);const n=_(e);if(!0===t||"class_only"===t&&!n){const t=a.getOwnPropertyDescriptors(e);delete t[r];let n=Reflect.ownKeys(t);for(let r=0;r<n.length;r++){const s=n[r],o=t[s];!1===o[p]&&(o[p]=!0,o[u]=!0),(o.get||o.set)&&(t[s]={[u]:!0,[p]:!0,[d]:o[d],[f]:e[s]})}return a.create(i(e),t)}{const t=i(e);if(null!==t&&n)return{...e};const r=a.create(t);return a.assign(r,e)}}function j(e,t=!1){return I(e)||y(e)||!h(e)||(w(e)>1&&a.defineProperties(e,{set:T,add:T,clear:T,delete:T}),a.freeze(e),t&&S(e,(e,t)=>{j(t,!0)},!1)),e}var T={[f]:function(){o(2)}};function I(e){return null===e||!x(e)||a.isFrozen(e)}var z="MapSet",V="Patches",$="ArrayMethods",U={};function N(e){const t=U[e];return t||o(0,e),t}var L,K=e=>!!U[e],F=()=>L;function B(e,t){t&&(e.patchPlugin_=N(V),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function J(e){W(e),e.drafts_.forEach(G),e.drafts_=null}function W(e){e===L&&(L=e.parent_)}var Q=e=>L={drafts_:[],parent_:L,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:K(z)?N(z):void 0,arrayMethodsPlugin_:K($)?N($):void 0};function G(e){const t=e[r];0===t.type_||1===t.type_?t.revoke_():t.revoked_=!0}function q(e,n){n.unfinalizedDrafts_=n.drafts_.length;const s=n.drafts_[0];if(void 0!==e&&e!==s){s[r].modified_&&(J(n),o(4)),h(e)&&(e=X(n,e));const{patchPlugin_:t}=n;t&&t.generateReplacementPatches_(s[r].base_,e,n)}else e=X(n,s);return function(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&j(t,n)}(n,e,!0),J(n),n.patches_&&n.patchListener_(n.patches_,n.inversePatches_),e!==t?e:void 0}function X(e,t){if(I(t))return t;const n=t[r];if(!n){return ne(t,e.handledSet_,e)}if(!H(n,e))return t;if(!n.modified_)return n.base_;if(!n.finalized_){const{callbacks_:t}=n;if(t)for(;t.length>0;){t.pop()(e)}te(n,e)}return n.copy_}function Z(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var H=(e,t)=>e.scope_===t,Y=[];function ee(e,t,n,r){const s=M(e),o=e.type_;if(void 0!==r){if(v(s,r,o)===t)return void k(s,r,n,o)}if(!e.draftLocations_){const t=e.draftLocations_=new Map;S(s,(e,n)=>{if(y(n)){const r=t.get(n)||[];r.push(e),t.set(n,r)}})}const a=e.draftLocations_.get(t)??Y;for(const e of a)k(s,e,n,o)}function te(e,t){if(e.modified_&&!e.finalized_&&(3===e.type_||1===e.type_&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){const{patchPlugin_:n}=t;if(n){const r=n.getPath(e);r&&n.generatePatches_(e,r,t)}Z(e)}}function ne(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||y(e)||t.has(e)||!h(e)||I(e)||(t.add(e),S(e,(s,o)=>{if(y(o)){const t=o[r];if(H(t,n)){const n=P(t);k(e,s,n,e.type_),Z(t)}}else h(o)&&ne(o,t,n)})),e}var re={get(e,t){if(t===r)return e;let n=e.scope_.arrayMethodsPlugin_;const s=1===e.type_&&"string"==typeof t;if(s&&n?.isArrayOperationMethod(t))return n.createMethodInterceptor(e,t);const o=M(e);if(!b(o,t,e.type_))return function(e,t,n){const r=ae(t,n);return r?f in r?r[f]:r.get?.call(e.draft_):void 0}(e,o,t);const a=o[t];if(e.finalized_||!h(a))return a;if(s&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&function(e){const t=+e;return Number.isInteger(t)&&String(t)===e}(t))return a;if(a===oe(e.base_,t)){ce(e);const n=1===e.type_?+t:t,r=le(e.scope_,a,e,n);return e.copy_[n]=r}return a},has:(e,t)=>t in M(e),ownKeys:e=>Reflect.ownKeys(M(e)),set(e,t,n){const s=ae(M(e),t);if(s?.set)return s.set.call(e.draft_,n),!0;if(!e.modified_){const s=oe(M(e),t),i=s?.[r];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_.set(t,!1),!0;if(((o=n)===(a=s)?0!==o||1/o==1/a:o!=o&&a!=a)&&(void 0!==n||b(e.base_,t,e.type_)))return!0;ce(e),ie(e)}var o,a;return e.copy_[t]===n&&(void 0!==n||t in e.copy_)||Number.isNaN(n)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=n,e.assigned_.set(t,!0),function(e,t,n){const{scope_:s}=e;if(y(n)){const o=n[r];H(o,s)&&o.callbacks_.push(function(){ce(e);const r=P(o);ee(e,n,r,t)})}else h(n)&&e.callbacks_.push(function(){const r=M(e);3===e.type_?r.has(n)&&ne(n,s.handledSet_,s):v(r,t,e.type_)===n&&s.drafts_.length>1&&!0===(e.assigned_.get(t)??!1)&&e.copy_&&ne(v(e.copy_,t,e.type_),s.handledSet_,s)})}(e,t,n)),!0},deleteProperty:(e,t)=>(ce(e),void 0!==oe(e.base_,t)||t in e.base_?(e.assigned_.set(t,!1),ie(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0),getOwnPropertyDescriptor(e,t){const n=M(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r?{[p]:!0,[u]:1!==e.type_||"length"!==t,[d]:r[d],[f]:n[t]}:r},defineProperty(){o(11)},getPrototypeOf:e=>i(e.base_),setPrototypeOf(){o(12)}},se={};for(let e in re){let t=re[e];se[e]=function(){const e=arguments;return e[0]=e[0][0],t.apply(this,e)}}function oe(e,t){const n=e[r];return(n?M(n):e)[t]}function ae(e,t){if(!(t in e))return;let n=i(e);for(;n;){const e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=i(n)}}function ie(e){e.modified_||(e.modified_=!0,e.parent_&&ie(e.parent_))}function ce(e){e.copy_||(e.assigned_=new Map,e.copy_=R(e.base_,e.scope_.immer_.useStrictShallowCopy_))}se.deleteProperty=function(e,t){return isNaN(parseInt(t))&&o(13),se.set.call(this,e,t,void 0)},se.set=function(e,t,n){return"length"!==t&&isNaN(parseInt(t))&&o(14),re.set.call(this,e[0],t,n,e[0])};function le(e,t,n,r){const[s,o]=C(t)?N(z).proxyMap_(t,n):O(t)?N(z).proxySet_(t,n):function(e,t){const n=E(e),r={type_:n?1:0,scope_:t?t.scope_:F(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0};let s=r,o=re;n&&(s=[r],o=se);const{revoke:a,proxy:i}=Proxy.revocable(s,o);return r.draft_=i,r.revoke_=a,[i,r]}(t,n);return(n?.scope_??F()).drafts_.push(s),o.callbacks_=n?.callbacks_??[],o.key_=r,n&&void 0!==r?function(e,t,n){e.callbacks_.push(function(r){const s=t;if(!s||!H(s,r))return;r.mapSetPlugin_?.fixSetContents(s);const o=P(s);ee(e,s.draft_??s,o,n),te(s,r)})}(n,o,r):o.callbacks_.push(function(e){e.mapSetPlugin_?.fixSetContents(o);const{patchPlugin_:t}=e;o.modified_&&t&&t.generatePatches_(o,[],e)}),s}function ue(e){if(!h(e)||I(e))return e;const t=e[r];let n,s=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=R(e,t.scope_.immer_.useStrictShallowCopy_),s=t.scope_.immer_.shouldUseStrictIteration()}else n=R(e,!0);return S(n,(e,t)=>{k(n,e,ue(t))},s),t&&(t.finalized_=!1),n}var de=(new class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(e,n,r)=>{if(A(e)&&!A(n)){const t=n;n=e;const r=this;return function(e=t,...s){return r.produce(e,e=>n.call(this,e,...s))}}let s;if(A(n)||o(6),void 0===r||A(r)||o(7),h(e)){const t=Q(this),o=le(t,e,void 0);let a=!0;try{s=n(o),a=!1}finally{a?J(t):W(t)}return B(t,r),q(s,t)}if(!e||!x(e)){if(s=n(e),void 0===s&&(s=e),s===t&&(s=void 0),this.autoFreeze_&&j(s,!0),r){const t=[],n=[];N(V).generateReplacementPatches_(e,s,{patches_:t,inversePatches_:n}),r(t,n)}return s}o(1,e)},this.produceWithPatches=(e,t)=>{if(A(e))return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},D(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),D(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),D(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){h(e)||o(8),y(e)&&(e=function(e){y(e)||o(10,e);return ue(e)}(e));const t=Q(this),n=le(t,e,void 0);return n[r].isManual_=!0,W(t),n}finishDraft(e,t){const n=e&&e[r];n&&n.isManual_||o(9);const{scope_:s}=n;return B(s,t),q(void 0,s)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){const r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}n>-1&&(t=t.slice(n+1));const r=N(V).applyPatches_;return y(e)?r(e,t):this.produce(e,e=>r(e,t))}}).produce,pe=(e,t)=>{const n=Date.now();if(/\(\.*\+\?\)\+/.test(e)||/\(\.*\?\)\*/.test(e))return!1;if(e.length>500)return!1;try{const n=new RegExp(e).test(t);Date.now();return n}catch{return!1}},fe=()=>{if("undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID)try{return crypto.randomUUID()}catch{}throw new Error("Cryptographically secure random UUID generation is required but crypto.randomUUID is unavailable. Please use a browser or environment with Web Crypto API support.")},ye="undefined"!=typeof crypto&&void 0!==crypto.subtle&&"function"==typeof crypto.subtle.generateKey,he=async(e,t)=>{const n=(new TextEncoder).encode(JSON.stringify(e)),r=await crypto.subtle.encrypt({name:"AES-GCM",iv:t.iv},t.key,n),s=new Uint8Array(t.iv.length+r.byteLength);return s.set(t.iv),s.set(new Uint8Array(r),t.iv.length),btoa(String.fromCharCode(...s))},ge=async(e,t)=>{const n=Uint8Array.from(atob(e),e=>e.charCodeAt(0)),r=n.slice(0,12),s=n.slice(12),o=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},t.key,s);return JSON.parse((new TextDecoder).decode(o))},me=null,_e=e=>{me&&me(e)},Se=(e,t,n)=>{e.set(t instanceof RegExp?t.source:t,n)},we=(e,t,n,r)=>{if(0===e.size)return!0;for(const[s,o]of e){let e;if(e="function"==typeof s?s(t,r):pe(s,t),e)return o.includes(n)||o.includes("admin")}return!1},be=e=>{if("string"==typeof e){let t=e.replace(/&#[xX]?[0-9a-fA-F]+;?/g,e=>{const t=e.match(/&#x([0-9a-fA-F]+);?/i);if(t&&t[1])return String.fromCharCode(parseInt(t[1],16));const n=e.match(/&#([0-9]+);?/);return n&&n[1]?String.fromCharCode(parseInt(n[1],10)):e});try{t=decodeURIComponent(t)}catch{}return t.replace(/\b(javascript|vbscript|data:text\/html|about:blank|chrome:)/gi,"[SEC-REMOVED]").replace(/<script\b[^>]*>[\s\S]*?<\s*\/\s*script\b[^>]*>/gi,"[SEC-REMOVED]").replace(/on\w+\s*=/gi,"[SEC-REMOVED]=").replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi,"[SEC-REMOVED]").replace(/<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi,"[SEC-REMOVED]").replace(/<embed\b[^<]*(?:(?!<\/embed>)<[^<]*)*<\/embed>/gi,"[SEC-REMOVED]").replace(/<svg\b[^<]*(?:(?!<\/svg>)<[^<]*)*<\/svg>/gi,"[SEC-REMOVED]").replace(/<form\b[^<]*(?:(?!<\/form>)<[^<]*)*<\/form>/gi,"[SEC-REMOVED]").replace(/<base\b[^<]*(?:(?!<\/base>)<[^<]*)*<\/base>/gi,"[SEC-REMOVED]").replace(/<link\b[^<]*(?:(?!<\/link>)<[^<]*)*<\/link>/gi,"[SEC-REMOVED]").replace(/<meta\b[^<]*(?:(?!<\/meta>)<[^<]*)*<\/meta>/gi,"[SEC-REMOVED]").replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi,"[SEC-REMOVED]")}if(e&&"object"==typeof e&&!Array.isArray(e)){if(Object.getPrototypeOf(e)===Object.prototype){const t={};for(const[n,r]of Object.entries(e))t[n]=be(r);return t}return e}return Array.isArray(e)?e.map(e=>be(e)):e},ve=e=>/^([a-zA-Z0-9_.-][a-zA-Z0-9_.-]*)$/.test(e)&&e.length<=256&&e.length>0,ke=(e,t,n,r)=>{const s={id:fe(),purpose:n,granted:r,timestamp:Date.now()},o=e.get(t)||[];return o.push(s),e.set(t,o),_e({timestamp:Date.now(),action:"set",key:`consent:${n}`,userId:t,success:!0}),s},Ee=e=>{if(null===e||"object"!=typeof e)return e;if("function"==typeof structuredClone)try{return structuredClone(e)}catch(e){}const t=new WeakMap,n=e=>{if(null===e||"object"!=typeof e)return e;if("function"==typeof e)return e;if(t.has(e))return t.get(e);if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e.source,e.flags);if(e instanceof Map){const r=new Map;return t.set(e,r),e.forEach((e,t)=>r.set(n(t),n(e))),r}if(e instanceof Set){const r=new Set;return t.set(e,r),e.forEach(e=>r.add(n(e))),r}const r=Array.isArray(e)?[]:Object.create(Object.getPrototypeOf(e));t.set(e,r);const s=[...Object.keys(e),...Object.getOwnPropertySymbols(e)];for(const t of s)r[t]=n(e[t]);return r};return n(e)},Ce=(e,t)=>{if(e===t)return!0;if(null===e||null===t)return e===t;if("object"!=typeof e||"object"!=typeof t)return e===t;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!Ce(e[n],t[n]))return!1;return!0}const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r=0;r<n.length;r++){const s=n[r];if(!(s in t)||!Ce(e[s],t[s]))return!1}return!0},Oe=e=>`${e}_`,xe=class{store;config;pendingQueue=new Map;remoteVersions=new Map;syncTimer=null;onlineStatusListeners=new Set;syncStateListeners=new Set;_isOnline=!0;_isSyncing=!1;constructor(e,t){this.store=e,this.config={endpoint:t.endpoint,authToken:t.authToken||"",strategy:t.strategy||"last-write-wins",autoSyncInterval:t.autoSyncInterval??3e4,syncOnReconnect:t.syncOnReconnect??!0,debounceTime:t.debounceTime??1e3,fetch:t.fetch||fetch,onSync:t.onSync||(()=>{}),onConflict:t.onConflict||(()=>({action:"accept-local"})),maxRetries:t.maxRetries??3},this._isOnline="undefined"==typeof navigator||navigator.onLine,this._setupOnlineListener(),this._setupStoreListener(),this.config.autoSyncInterval>0&&this._startAutoSync()}_getAuthToken(){const e=this.config.authToken;return"function"==typeof e?e()||"":e||""}_setupOnlineListener(){"undefined"!=typeof window&&(window.addEventListener("online",()=>{this._isOnline=!0,this._notifyOnlineChange(!0),this.config.syncOnReconnect&&this.sync()}),window.addEventListener("offline",()=>{this._isOnline=!1,this._notifyOnlineChange(!1)}))}_setupStoreListener(){this.store._subscribe(()=>{})}_startAutoSync(){setInterval(()=>{this._isOnline&&!this._isSyncing&&this.pendingQueue.size>0&&this.sync()},this.config.autoSyncInterval)}_notifyOnlineChange(e){this.onlineStatusListeners.forEach(t=>t(e)),this._notifyStateChange()}_notifyStateChange(){const e=this.getState();this.syncStateListeners.forEach(t=>t(e))}queueChange(e,t){const n=this.store._getVersion(e)||1;this.pendingQueue.set(e,{key:e,value:Ee(t),timestamp:Date.now(),version:n}),this._notifyStateChange(),this.syncTimer&&clearTimeout(this.syncTimer),this.syncTimer=setTimeout(()=>{this._isOnline&&this.sync()},this.config.debounceTime)}async sync(){if(this._isSyncing)return{success:!1,syncedKeys:[],conflicts:[],errors:["Sync already in progress"],timestamp:Date.now(),duration:0};this._isSyncing=!0,this._notifyStateChange();const e=Date.now(),t=[],n=[],r=[];try{const s=Array.from(this.pendingQueue.values());if(0===s.length)return this._isSyncing=!1,this._notifyStateChange(),{success:!0,syncedKeys:[],conflicts:[],errors:[],timestamp:Date.now(),duration:Date.now()-e};await this._fetchRemoteVersions(s.map(e=>e.key));for(const e of s)try{const r=this.remoteVersions.get(e.key);if(r)if(r.version>=e.version){const s={key:e.key,localValue:e.value,remoteValue:r.value,localVersion:e.version,remoteVersion:r.version,timestamp:e.timestamp};n.push(s);const o=this.config.onConflict(s);await this._resolveConflict(e,r,o),t.push(e.key),this.pendingQueue.delete(e.key)}else await this._pushChange(e),t.push(e.key),this.pendingQueue.delete(e.key);else await this._pushChange(e),t.push(e.key),this.pendingQueue.delete(e.key)}catch(t){r.push(`Failed to sync "${e.key}": ${t}`)}const o={success:0===r.length,syncedKeys:t,conflicts:n,errors:r,timestamp:Date.now(),duration:Date.now()-e};return this.config.onSync(o),o}catch(s){const o=`Sync failed: ${s}`;return r.push(o),{success:!1,syncedKeys:t,conflicts:n,errors:r,timestamp:Date.now(),duration:Date.now()-e}}finally{this._isSyncing=!1,this._notifyStateChange()}}async _fetchRemoteVersions(e){try{const t=this._getAuthToken(),n=await this.config.fetch(`${this.config.endpoint}/versions`,{method:"POST",headers:{"Content-Type":"application/json",...t&&{Authorization:`Bearer ${t}`}},body:JSON.stringify({keys:e})});if(n.ok){const e=await n.json();if(e.versions)for(const[t,n]of Object.entries(e.versions))this.remoteVersions.set(t,n)}}catch(e){}}async _pushChange(e){let t=0;for(;t<this.config.maxRetries;)try{const n=this._getAuthToken(),r=await this.config.fetch(`${this.config.endpoint}/sync`,{method:"POST",headers:{"Content-Type":"application/json",...n&&{Authorization:`Bearer ${n}`}},body:JSON.stringify({key:e.key,value:e.value,version:e.version,timestamp:e.timestamp})});if(r.ok){const t=await r.json();return void(t.version&&this.remoteVersions.set(e.key,{version:t.version,timestamp:t.timestamp||Date.now(),value:e.value}))}t++}catch(e){if(t++,t>=this.config.maxRetries)throw e}}async _resolveConflict(e,t,n){switch(n.action){case"accept-local":await this._pushChange({...e,version:t.version+1,timestamp:Date.now()});break;case"accept-remote":this.store.set(e.key,t.value);break;case"merge":this.store.set(e.key,n.value),await this._pushChange({key:e.key,value:n.value,version:Math.max(e.version,t.version)+1,timestamp:Date.now()})}}getState(){return{isOnline:this._isOnline,isSyncing:this._isSyncing,lastSyncTimestamp:null,pendingChanges:this.pendingQueue.size,conflicts:0}}onOnlineChange(e){return this.onlineStatusListeners.add(e),()=>this.onlineStatusListeners.delete(e)}onStateChange(e){return this.syncStateListeners.add(e),()=>this.syncStateListeners.delete(e)}async flush(){return this.sync()}destroy(){this.syncTimer&&clearTimeout(this.syncTimer),this.pendingQueue.clear(),this.onlineStatusListeners.clear(),this.syncStateListeners.clear()}},Ae=()=>{try{0;const e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:{};return void 0!==e.__DEV__&&!1===e.__DEV__}catch{return!1}},De=()=>"undefined"!=typeof window?window.localStorage:null,Me=e=>{const t=new Map,n=new Map,r=new Map,s=new Set,o=new Map,a=new Set,i=new Map,c=new Map,l=new Map,u=new Map,d=new Map,p=new Map,f=new Map,y=new Map,h=e?.namespace||"gstate",g=e?.silent??!1,m=e?.debounceTime??150,_=e?.version??0,S=e?.storage||De(),w=e?.onError,b=e?.maxObjectSize??0,v=e?.maxTotalSize??0,k=e?.encryptionKey??null,E=e?.validateInput??!0,C=e?.auditEnabled??!0,O=e?.userId,x=e?.immer??!0,A=e?.persistByDefault??e?.persistence??e?.persist??!1;e?.accessRules&&e.accessRules.forEach(e=>Se(f,e.pattern,e.permissions));let D,M=!1,P=!1,R=!1,T=0,I=null,z=null;const V=new Promise(e=>{D=e}),$=()=>({store:t,versions:n,sizes:r,totalSize:T,storage:S,config:e||{},diskQueue:d,encryptionKey:k,audit:K,onError:w,silent:g,debounceTime:m,currentVersion:_}),U=()=>({plugins:u,onError:w,silent:g}),N=e=>{if(null==e)return 0;const t=typeof e;if("boolean"===t)return 4;if("number"===t)return 8;if("string"===t)return 2*e.length;if("object"!==t)return 0;let n=0;const r=[e],s=new WeakSet;for(;r.length>0;){const e=r.pop();if("boolean"==typeof e)n+=4;else if("number"==typeof e)n+=8;else if("string"==typeof e)n+=2*e.length;else if("object"==typeof e&&null!==e){const t=e;if(s.has(t))continue;if(s.add(t),Array.isArray(t))for(let e=0;e<t.length;e++)r.push(t[e]);else for(const e of Object.keys(t))n+=2*e.length,r.push(t[e])}}return n},L=(e,t)=>{((e,t,n)=>{if(0!==e.plugins.size)for(const r of e.plugins.values()){const s=r.hooks?.[t];if(s)try{s(n)}catch(s){const o=s instanceof Error?s:new Error(String(s));e.onError?e.onError(o,{operation:`plugin:${r.name}:${t}`,key:n.key}):e.silent}}})(U(),e,t)},K=(e,t,n,r)=>{C&&null!==me&&_e&&_e({timestamp:Date.now(),action:e,key:t,userId:O,success:n,error:r})},F=e=>{const t=c.get(e);if(!t)return;const r=new Set,s=t.selector(e=>(r.add(e),c.has(e)?c.get(e).lastValue:Q.get(e)));t.deps.forEach(t=>{if(!r.has(t)){const n=l.get(t);n&&(n.delete(e),0===n.size&&l.delete(t))}}),r.forEach(n=>{t.deps.has(n)||(l.has(n)||l.set(n,new Set),l.get(n).add(e))}),t.deps=r,Ce(t.lastValue,s)||(t.lastValue=x&&null!==s&&"object"==typeof s?j(Ee(s),!0):s,n.set(e,(n.get(e)||0)+1),B(e))},B=e=>{if(e){if(l.has(e)){const t=l.get(e);for(const e of t)F(e)}const t=i.get(e);if(t){const n=Q.get(e);for(const r of t)try{r(n)}catch(t){const n=t instanceof Error?t:new Error(String(t));w&&w(n,{operation:"watcher",key:e})}}const n=o.get(e);if(n)for(const t of n)try{t()}catch(t){const n=t instanceof Error?t:new Error(String(t));w&&w(n,{operation:"keyListener",key:e})}}if(M)P=!0;else for(const e of s)try{e()}catch(e){const t=e instanceof Error?e:new Error(String(e));w&&w(t,{operation:"listener"})}},J=async()=>{(async e=>{if(!e.storage)return;const{store:t,config:n,diskQueue:r,storage:s,encryptionKey:o,audit:a,onError:i,silent:c,currentVersion:l}=e,u=Oe(n.namespace||"gstate");try{const e={};let r;t.forEach((t,n)=>{e[n]=t});const o=n?.encoded;r=o?btoa(JSON.stringify(e)):JSON.stringify(e),s.setItem(u.replace("_",""),JSON.stringify({v:1,t:Date.now(),e:null,d:r,_sys_v:l,_b64:!!o||void 0})),a("set","FULL_STATE",!0)}catch(e){const t=e instanceof Error?e:new Error(String(e));i&&i(t,{operation:"persist",key:"FULL_STATE"})}const d=Array.from(r.entries());r.clear();for(const[t,n]of d)try{if(!t||!/^[a-zA-Z0-9_.-]+$/.test(t)||t.length>256)continue;let r=n.value;const i=n.options.encoded||n.options.encrypted||n.options.secure;if(n.options.encrypted){if(!o)throw new Error(`Encryption key missing for "${t}"`);r=await he(n.value,o)}else i?r=btoa(JSON.stringify(n.value)):"object"==typeof n.value&&null!==n.value&&(r=JSON.stringify(n.value));s.setItem(`${u}${t}`,JSON.stringify({v:e.versions.get(t)||1,t:Date.now(),e:n.options.ttl?Date.now()+n.options.ttl:null,d:r,_sys_v:l,_enc:!!n.options.encrypted||void 0,_b64:!(!n.options.encoded&&!n.options.secure)||void 0})),a("set",t,!0)}catch(e){const n=e instanceof Error?e:new Error(String(e));i&&i(n,{operation:"persist",key:t})}})($())},W={},Q={_setSilently:(e,s)=>{const o=r.get(e)||0,a=x&&null!==s&&"object"==typeof s?j(Ee(s),!0):s,i=(b>0||v>0)&&!Ae()?N(a):0;T=T-o+i,r.set(e,i),t.set(e,a),n.set(e,(n.get(e)||0)+1),z=null},_registerMethod:(e,t,n)=>{const r=e=>"__proto__"===e||"constructor"===e||"prototype"===e;r(e)||r(t)||(W[e]||(W[e]={}),W[e][t]=n)},set:(s,o,a={})=>{const i=t.get(s),c=x&&"function"==typeof o?de(i,o):o;if(E&&!ve(s))return!1;if(!we(f,s,"write",O))return K("set",s,!1,"RBAC Denied"),!1;const l=E?be(c):c,u=r.get(s)||0;L("onBeforeSet",{key:s,value:l,store:Q,version:n.get(s)||0});const p=x&&null!==l&&"object"==typeof l?j(Ee(l),!0):l;if(!Ce(i,p)){const o=(b>0||v>0)&&!Ae()?N(p):0;if(b>0&&o>b){const e=new Error(`Object size (${o} bytes) exceeds maxObjectSize (${b} bytes)`);w&&w(e,{operation:"set",key:s})}if(v>0){const e=T-u+o;if(e>v){const t=new Error(`Total store size (${e} bytes) exceeds limit (${v} bytes)`);w&&w(t,{operation:"set"})}}T=T-u+o,r.set(s,o),t.set(s,p),n.set(s,(n.get(s)||0)+1),z=null;const i=a.persist??A;return i&&(d.set(s,{value:p,options:{...a,persist:i,encoded:a.encoded||e?.encoded}}),I&&clearTimeout(I),I=setTimeout(J,m)),L("onSet",{key:s,value:p,store:Q,version:n.get(s)}),K("set",s,!0),B(s),!0}return!1},get:e=>{if(!we(f,e,"read",O))return K("get",e,!1,"RBAC Denied"),null;const n=t.get(e);return L("onGet",{store:Q,key:e,value:n}),K("get",e,!0),n},compute:(e,t)=>{try{return c.has(e)||(c.set(e,{selector:t,lastValue:null,deps:new Set}),F(e)),c.get(e).lastValue}catch(t){const n=t instanceof Error?t:new Error(String(t));return w&&w(n,{operation:"compute",key:e}),null}},watch:(e,t)=>{i.has(e)||i.set(e,new Set);const n=i.get(e);return n.add(t),()=>{n.delete(t),0===n.size&&i.delete(e)}},remove:e=>{if(!we(f,e,"delete",O))return K("delete",e,!1,"RBAC Denied"),!1;const s=t.get(e),o=t.delete(e);return o&&(T-=r.get(e)||0,r.delete(e),L("onRemove",{store:Q,key:e,value:s}),z=null),n.set(e,(n.get(e)||0)+1),S&&S.removeItem(`${h}_${e}`),K("delete",e,!0),B(e),o},delete:e=>Q.remove(e),deleteAll:()=>{if(Array.from(t.keys()).forEach(e=>Q.remove(e)),S){const e=h+"_";for(let t=0;t<(S.length||0);t++){const n=S.key(t);n?.startsWith(e)&&(S.removeItem(n),t--)}}return T=0,r.clear(),z=null,!0},list:()=>Object.fromEntries(t.entries()),use:e=>{a.add(e)},transaction:e=>{M=!0,L("onTransaction",{store:Q,key:"START"});try{e()}finally{M=!1,L("onTransaction",{store:Q,key:"END"}),P&&(P=!1,B())}},destroy:()=>{I&&(clearTimeout(I),I=null),d.clear(),"undefined"!=typeof window&&window.removeEventListener("beforeunload",G),L("onDestroy",{store:Q}),s.clear(),o.clear(),i.clear(),c.clear(),l.clear(),u.clear(),t.clear(),r.clear(),T=0,f.clear(),y.clear(),n.clear(),p.clear(),a.clear()},_addPlugin:e=>{((e,t,n)=>{try{e.plugins.set(t.name,t),t.hooks?.onInstall?.({store:n})}catch(n){const r=n instanceof Error?n:new Error(String(n));e.onError?e.onError(r,{operation:"plugin:install",key:t.name}):e.silent}})(U(),e,Q)},_removePlugin:e=>{u.delete(e)},_subscribe:(e,t)=>{if(t){o.has(t)||o.set(t,new Set);const n=o.get(t);return n.add(e),()=>{n.delete(e),0===n.size&&o.delete(t)}}return s.add(e),()=>s.delete(e)},_getVersion:e=>n.get(e)??0,addAccessRule:(e,t)=>Se(f,e,t),hasPermission:(e,t,n)=>we(f,e,t,n),recordConsent:(e,t,n)=>ke(y,e,t,n),hasConsent:(e,t)=>((e,t,n)=>{const r=e.get(t);if(!r)return!1;for(let e=r.length-1;e>=0;e--){const t=r[e];if(t&&t.purpose===n)return t.granted}return!1})(y,e,t),getConsents:e=>((e,t)=>e.get(t)||[])(y,e),revokeConsent:(e,t)=>((e,t,n)=>ke(e,t,n,!1))(y,e,t),exportUserData:e=>((e,t)=>({userId:t,exportedAt:Date.now(),consents:e.get(t)||[]}))(y,e),deleteUserData:e=>((e,t)=>{const n=e.get(t)?.length||0;return e.delete(t),{success:!0,deletedConsents:n}})(y,e),getSnapshot:()=>(z||(z=Object.fromEntries(t.entries())),z),get plugins(){return W},get isReady(){return R},get namespace(){return h},get userId(){return O},whenReady:()=>V};["addAccessRule","recordConsent","hasConsent","getConsents","revokeConsent","exportUserData","deleteUserData"].forEach(e=>{const t=Q[e];t&&Q._registerMethod("security",e,t)});const G=()=>{d.size>0&&J()};"undefined"!=typeof window&&window.addEventListener("beforeunload",G),S?(async(e,t,n)=>{const{storage:r,config:s,encryptionKey:o,audit:a,onError:i,silent:c,currentVersion:l,store:u,sizes:d,versions:p}=e,f=Oe(s.namespace||"gstate"),y=s.immer??!0;if(r)try{const c={};let h=0;for(let e=0;e<(r.length||0);e++){const t=r.key(e);if(!t||!t.startsWith(f))continue;const n=r.getItem(t);if(n)try{const s=JSON.parse(n),i=t.substring(f.length);if(h=Math.max(h,void 0!==s._sys_v?s._sys_v:s.v||0),s.e&&Date.now()>s.e){r.removeItem(t),e--;continue}let l=s.d;if(s._enc&&o)l=await ge(l,o);else if("string"==typeof l)if(s._b64)try{l=JSON.parse(atob(l))}catch(e){}else if(l.startsWith("{")||l.startsWith("["))try{l=JSON.parse(l)}catch(e){}c[i]=l,a("hydrate",i,!0)}catch(e){a("hydrate",t,!1,String(e));const n=e instanceof Error?e:new Error(String(e));i&&i(n,{operation:"hydration",key:t})}}const g=h<l&&s.migrate?s.migrate(c,h):c;Object.entries(g).forEach(([n,r])=>{const s=y&&null!==r&&"object"==typeof r?j(Ee(r),!0):r,o=t(s),a=d.get(n)||0;e.totalSize=e.totalSize-a+o,d.set(n,o),u.set(n,s),p.set(n,1)}),n()}catch(e){const t=e instanceof Error?e:new Error(String(e));i&&i(t,{operation:"hydration"})}})($(),e=>(b>0||v>0)&&!Ae()?N(e):0,()=>{R=!0,z=null,D(),B()}).then(()=>{}):(R=!0,D());let q=null;return e?.sync&&(q=new xe(Q,e.sync),Q._registerMethod("sync","flush",()=>q?.flush()),Q._registerMethod("sync","getState",()=>q?.getState()),Q._registerMethod("sync","onStateChange",e=>q?.onStateChange(e))),Q},Pe=null,Re=()=>Pe;function je(t,n){const r=e.useMemo(()=>n||Pe,[n]),s=e.useMemo(()=>{const e=()=>{},t=()=>!1,n=()=>null;return{set:t,get:n,remove:t,delete:t,deleteAll:t,list:()=>({}),compute:n,watch:()=>()=>{},use:e,transaction:e,destroy:e,_subscribe:()=>()=>{},_setSilently:e,_registerMethod:e,_addPlugin:e,_removePlugin:e,_getVersion:()=>0,get isReady(){return!1},whenReady:()=>Promise.resolve(),get plugins(){return{}},getSnapshot:()=>({}),get namespace(){return"ghost"},get userId(){}}},[]),o=r||s,a="function"==typeof t,i=a?null:t,c=a?t:null,l=e.useCallback(e=>a?o._subscribe(e):o._subscribe(e,i),[o,a,i]),u=e.useCallback(()=>a?c(o.getSnapshot()):o.get(i)??void 0,[o,a,i,c]),d=e.useCallback(()=>{if(a)try{return c({})}catch{return}},[c,a]),p=e.useSyncExternalStore(l,u,d),f=e.useCallback((e,t)=>a?(Ae(),!1):o.set(i,e,t),[o,a,i]);return e.useDebugValue(p,e=>a?`Selector: ${JSON.stringify(e)}`:`${i}: ${JSON.stringify(e)}`),a?p:[p,f]}var Te=new Map;exports.SyncEngine=xe,exports.addAccessRule=(e,t)=>Re()?.addAccessRule(e,t),exports.analyticsPlugin=e=>({name:"gstate-analytics",hooks:{onSet:({key:t,value:n})=>{t&&(e.keys&&!e.keys.includes(t)||e.provider({key:t,value:n,action:"SET"}))},onRemove:({key:t})=>{t&&(e.keys&&!e.keys.includes(t)||e.provider({key:t,value:null,action:"REMOVE"}))}}}),exports.clearAccessRules=()=>{},exports.clearAllConsents=()=>{},exports.cloudSyncPlugin=e=>{const{adapter:t,autoSyncInterval:n}=e,r=new Map,s={lastSyncTimestamp:null,totalKeysSynced:0,totalBytesSynced:0,syncCount:0,lastDuration:0,errors:0};let o=null;return{name:"cloudSync",hooks:{onInstall:({store:a})=>{a._registerMethod("cloudSync","sync",async()=>{const n=performance.now(),o={};let i=0;try{const c=a.list(),l=Object.keys(c);for(const e of l){const t=a._getVersion?.(e)||0;if(t>(r.get(e)||0)){const n=c[e];o[e]=n,i+=JSON.stringify(n).length,r.set(e,t)}}if(0===Object.keys(o).length)return{status:"no-change",stats:s};if(await t.save(o))return s.lastSyncTimestamp=Date.now(),s.totalKeysSynced+=Object.keys(o).length,s.totalBytesSynced+=i,s.syncCount++,s.lastDuration=performance.now()-n,e.onSync&&e.onSync(s),{status:"success",stats:s};throw new Error(`Adapter ${t.name} failed to save.`)}catch(e){return s.errors++,{status:"error",error:String(e),stats:s}}}),a._registerMethod("cloudSync","getStats",()=>s),n&&n>0&&(o=setInterval(()=>{const e=a.plugins.cloudSync;e&&e.sync()},n))},onDestroy:()=>{o&&clearInterval(o)}}}},exports.createAsyncStore=(e,t)=>{const n=t?.key||"async_data",r=t?.store||Me({namespace:`async_${n}`,silent:!0});null==r.get(n)&&r.set(n,{data:null,loading:!1,error:null,updatedAt:null});return Object.assign(r,{execute:async()=>{const s=r.get(n);r.set(n,{...s||{data:null,loading:!1,error:null,updatedAt:null},loading:!0,error:null}),"whenReady"in r&&!r.isReady&&await r.whenReady();try{const s=await e(),o=r.get(n);r.set(n,{...o||{data:null,loading:!1,error:null,updatedAt:null},data:s,loading:!1,updatedAt:Date.now()},{persist:t?.persist})}catch(e){const t=r.get(n);r.set(n,{...t||{data:null,loading:!1,error:null,updatedAt:null},error:e instanceof Error?e:new Error(String(e)),loading:!1})}}})},exports.createFirestoreAdapter=(e,t)=>({name:"Firebase-Firestore",save:async e=>{try{Ae();return(()=>{})("[Mock] Firestore Syncing:",e),!0}catch(e){return!1}}}),exports.createMongoAdapter=(e,t)=>({name:"MongoDB-Atlas",save:async n=>(await fetch(`${e}/action/updateOne`,{method:"POST",headers:{"Content-Type":"application/json","api-key":t},body:JSON.stringify({dataSource:"Cluster0",database:"rgs_cloud",collection:"user_states",filter:{id:"global_state"},update:{$set:{data:n,updatedAt:Date.now()}},upsert:!0})})).ok}),exports.createSqlRestAdapter=(e,t)=>({name:"SQL-REST-API",save:async n=>{const r=t();if(!r)return!1;return(await fetch(e,{method:"PATCH",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify(n),credentials:"same-origin"})).ok}}),exports.createStore=Me,exports.createSyncEngine=(e,t)=>new xe(e,t),exports.debugPlugin=()=>{if(Ae())return{name:"gstate-debug-noop",hooks:{}};Ae();return{name:"gstate-debug",hooks:{onInstall:({store:e})=>{"undefined"!=typeof window&&(window.gstate={list:()=>e.list(),get:t=>{const n=e.get(t);return n},set:(t,n)=>{const r=e.set(t,n);return JSON.stringify(n),r},watch:(t,n)=>e.watch(t,n),info:()=>{const t={namespace:e.namespace,isReady:e.isReady,keys:Object.keys(e.list()),size:Object.keys(e.list()).length};return t},banner:()=>{}})},onDestroy:()=>{"undefined"!=typeof window&&delete window.gstate}}}},exports.deleteUserData=e=>{const t=Re();if(!t)throw new Error("[gstate] deleteUserData failed: No store found.");return t.deleteUserData(e)},exports.deriveKeyFromPassword=async(e,t,n=6e5)=>{if(!ye)throw new Error("Web Crypto API not available");const r=await crypto.subtle.importKey("raw",(new TextEncoder).encode(e),"PBKDF2",!1,["deriveKey"]);return{key:await crypto.subtle.deriveKey({name:"PBKDF2",salt:new Uint8Array(t),iterations:n,hash:"SHA-256"},r,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:crypto.getRandomValues(new Uint8Array(12))}},exports.destroyState=()=>{Pe&&(Pe.destroy(),Pe=null)},exports.destroySync=e=>{const t=Te.get(e);t&&(t.destroy(),Te.delete(e))},exports.devToolsPlugin=e=>{const t=globalThis.__REDUX_DEVTOOLS_EXTENSION__;if(!t?.connect)return{name:"gstate-devtools-noop",hooks:{}};let n=null;return{name:"gstate-devtools",hooks:{onInstall:({store:r})=>{n=t.connect({name:e?.name||"Magnetar Store"}),n.init(r.list())},onSet:({key:e,store:t})=>{e&&n&&n.send(`SET_${e.toUpperCase()}`,t.list())},onRemove:({key:e,store:t})=>{e&&n&&n.send(`REMOVE_${e.toUpperCase()}`,t.list())}}}},exports.exportKey=async e=>{const t=await crypto.subtle.exportKey("raw",e.key);return{key:btoa(String.fromCharCode(...new Uint8Array(t))),iv:btoa(String.fromCharCode(...e.iv))}},exports.exportUserData=e=>{const t=Re();if(!t)throw new Error("[gstate] exportUserData failed: No store found.");return t.exportUserData(e)},exports.generateEncryptionKey=async()=>{if(!ye)throw new Error("Web Crypto API not available");return{key:await crypto.subtle.generateKey({name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:crypto.getRandomValues(new Uint8Array(12))}},exports.generateSalt=(e=32)=>crypto.getRandomValues(new Uint8Array(e)),exports.getConsents=e=>Re()?.getConsents(e)??[],exports.getStore=Re,exports.gstate=(e,t)=>{const n=Me("string"==typeof t?{namespace:t}:t);e&&Object.entries(e).forEach(([e,t])=>{null===n.get(e)&&n._setSilently(e,t)});return"undefined"==typeof window||Ae()||(window.gstate=n,window.gState=n,window.rgs=n),Object.assign(e=>je(e,n),n)},exports.guardPlugin=e=>({name:"gstate-guard",hooks:{onBeforeSet:({key:t,value:n,store:r})=>{if(!t)return;const s=e[t];s&&s(n)}}}),exports.hasConsent=(e,t)=>Re()?.hasConsent(e,t)??!1,exports.hasPermission=(e,t,n)=>Re()?.hasPermission(e,t,n)??!0,exports.immerPlugin=()=>({name:"gstate-immer",hooks:{onInstall:({store:e})=>{e._registerMethod("immer","setWithProduce",(t,n)=>e.set(t,n))}}}),exports.importKey=async(e,t)=>{const n=Uint8Array.from(atob(e),e=>e.charCodeAt(0)),r=Uint8Array.from(atob(t),e=>e.charCodeAt(0));return{key:await crypto.subtle.importKey("raw",n,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:r}},exports.indexedDBPlugin=(e={})=>{const t=e.dbName||"rgs-db",n=e.storeName||"states",r=e.version||1;let s=null;const o=()=>new Promise((e,o)=>{if(s)return e(s);const a=indexedDB.open(t,r);a.onerror=()=>o(a.error),a.onsuccess=()=>{s=a.result,e(s)},a.onupgradeneeded=e=>{const t=e.target.result;t.objectStoreNames.contains(n)||t.createObjectStore(n)}}),a=async e=>{const t=await o();return new Promise((r,s)=>{const o=t.transaction(n,"readonly").objectStore(n).get(e);o.onsuccess=()=>r(o.result),o.onerror=()=>s(o.error)})};return{name:"indexedDB",hooks:{onInstall:({store:e})=>{e._registerMethod("indexedDB","clear",async()=>{(await o()).transaction(n,"readwrite").objectStore(n).clear()})},onInit:async({store:e})=>{const t=(await o()).transaction(n,"readonly").objectStore(n).getAllKeys();t.onsuccess=async()=>{const n=t.result,r=e.namespace+"_";for(const t of n)if(t.startsWith(r)){const n=await a(t);if(n){const s=t.substring(r.length);e._setSilently(s,n.d)}}}},onSet:async({key:e,value:t,store:r})=>{if(!e)return;const s=r.namespace+"_",a={d:t,t:Date.now(),v:r._getVersion?.(e)||1};await(async(e,t)=>{const r=await o();return new Promise((s,o)=>{const a=r.transaction(n,"readwrite").objectStore(n).put(t,e);a.onsuccess=()=>s(),a.onerror=()=>o(a.error)})})(`${s}${e}`,a)},onRemove:async({key:e,store:t})=>{if(!e)return;const r=t.namespace+"_";await(async e=>{const t=await o();return new Promise((r,s)=>{const o=t.transaction(n,"readwrite").objectStore(n).delete(e);o.onsuccess=()=>r(),o.onerror=()=>s(o.error)})})(`${r}${e}`)}}}},exports.initState=e=>{const t=Me(e);return Pe=t,t},exports.initSync=(e,t)=>{const n=e.namespace;if(Te.has(n))return Te.get(n);const r=new xe(e,t);return Te.set(n,r),r},exports.isCryptoAvailable=ye,exports.logAudit=_e,exports.loggerPlugin=e=>({name:"gstate-logger",hooks:{onSet:({key:e,value:t,version:n})=>{(new Date).toLocaleTimeString()},onRemove:({key:e})=>{},onTransaction:({key:e})=>{}}}),exports.recordConsent=(e,t,n)=>{const r=Re();if(!r)throw new Error("[gstate] recordConsent failed: No store found. call initState() first.");return r.recordConsent(e,t,n)},exports.revokeConsent=(e,t)=>Re()?.revokeConsent(e,t),exports.sanitizeValue=be,exports.schemaPlugin=e=>({name:"gstate-schema",hooks:{onSet:({key:t,value:n})=>{if(!t)return;const r=e[t];if(r){const e=r(n);if(!0!==e)throw new Error(`[Schema Error] Validation failed for key "${t}": ${!1===e?"Invalid type":e}`)}}}}),exports.setAuditLogger=e=>{me=e},exports.snapshotPlugin=()=>{const e=new Map;return{name:"gstate-snapshot",hooks:{onInstall:({store:t})=>{t._registerMethod("snapshot","takeSnapshot",n=>{e.set(n,t.list())}),t._registerMethod("snapshot","restoreSnapshot",n=>{const r=e.get(n);return!!r&&(t.transaction(()=>{Object.entries(r).forEach(([e,n])=>{t.set(e,n)})}),!0)}),t._registerMethod("snapshot","listSnapshots",()=>Array.from(e.keys())),t._registerMethod("snapshot","deleteSnapshot",t=>e.delete(t)),t._registerMethod("snapshot","clearSnapshots",()=>e.clear())}}}},exports.syncPlugin=e=>{const t=new BroadcastChannel(e?.channelName||"gstate_sync");let n=!1;return{name:"gstate-sync",hooks:{onInstall:({store:e})=>{t.onmessage=t=>{const{key:r,value:s,action:o}=t.data;r&&(n=!0,"REMOVE"===o?e.remove(r):e.set(r,s),n=!1)}},onSet:({key:e,value:r})=>{e&&!n&&t.postMessage({key:e,value:r,action:"SET"})},onRemove:({key:e})=>{e&&!n&&t.postMessage({key:e,action:"REMOVE"})},onDestroy:()=>{t.close()}}}},exports.triggerSync=async e=>{const t=e||Pe?.namespace;if(!t)return;const n=Te.get(t);n&&await n.flush()},exports.undoRedoPlugin=e=>{let t=[],n=-1,r=!1;const s=e?.limit||50;return{name:"gstate-undo-redo",hooks:{onInstall:({store:e})=>{t.push(e.list()),n=0,e._registerMethod("undoRedo","undo",()=>{if(n>0){r=!0,n--;const s=t[n];return!!s&&(Object.entries(s).forEach(([t,n])=>{e._setSilently(t,n)}),r=!1,!0)}return!1}),e._registerMethod("undoRedo","redo",()=>{if(n<t.length-1){r=!0,n++;const s=t[n];return!!s&&(Object.entries(s).forEach(([t,n])=>{e._setSilently(t,n)}),r=!1,!0)}return!1}),e._registerMethod("undoRedo","canUndo",()=>n>0),e._registerMethod("undoRedo","canRedo",()=>n<t.length-1)},onSet:({store:e})=>{r||(n<t.length-1&&(t=t.slice(0,n+1)),t.push(e.list()),t.length>s?t.shift():n++)}}}},exports.useGState=je,exports.useIsStoreReady=t=>{const n=t||Pe,r=e.useMemo(()=>e=>n?n._subscribe(e):()=>{},[n]);return e.useSyncExternalStore(r,()=>!!n&&n.isReady,()=>!0)},exports.useSimpleState=je,exports.useStore=je,exports.useSyncStatus=()=>{const[t,n]=e.useState({isOnline:!0,isSyncing:!1,lastSyncTimestamp:null,pendingChanges:0,conflicts:0});return e.useEffect(()=>{const e=()=>{let e=!0,t=!1,r=0,s=0;Te.forEach(n=>{const o=n.getState();e=e&&o.isOnline,t=t||o.isSyncing,r+=o.pendingChanges,s+=o.conflicts}),n({isOnline:e,isSyncing:t,lastSyncTimestamp:null,pendingChanges:r,conflicts:s})};e();const t=Array.from(Te.values()).map(t=>t.onStateChange(e));return()=>t.forEach(e=>e())},[]),t},exports.useSyncedState=function(t,n){const r=n||Pe,s=r?.namespace||"default",o=Te.get(s),a=je(t,r),i=a[0],c=a[1],[l,u]=e.useState(()=>o?.getState()||{isOnline:!0,isSyncing:!1,lastSyncTimestamp:null,pendingChanges:0,conflicts:0});return e.useEffect(()=>{if(!o)return;return o.onStateChange(u)},[o]),[i,e.useCallback((e,n)=>{const s=c(e,n);if(s&&o){const e=r?.get(t);o.queueChange(t,e)}return s},[c,o,t,r]),l]},exports.validateKey=ve;
|
|
1
|
+
var e = require("immer"), t = require("react"), n = (e, t) => {
|
|
2
|
+
const n = Date.now();
|
|
3
|
+
if (/\(\.*\+\?\)\+/.test(e) || /\(\.*\?\)\*/.test(e)) return !1;
|
|
4
|
+
if (e.length > 500) return !1;
|
|
5
|
+
try {
|
|
6
|
+
const n = new RegExp(e).test(t);
|
|
7
|
+
Date.now();
|
|
8
|
+
return n;
|
|
9
|
+
} catch {
|
|
10
|
+
return !1;
|
|
11
|
+
}
|
|
12
|
+
}, s = () => {
|
|
13
|
+
if ("undefined" != typeof crypto && "function" == typeof crypto.randomUUID) try {
|
|
14
|
+
return crypto.randomUUID();
|
|
15
|
+
} catch {}
|
|
16
|
+
throw new Error("Cryptographically secure random UUID generation is required but crypto.randomUUID is unavailable. Please use a browser or environment with Web Crypto API support.");
|
|
17
|
+
}, r = "undefined" != typeof crypto && void 0 !== crypto.subtle && "function" == typeof crypto.subtle.generateKey, o = async (e, t) => {
|
|
18
|
+
const n = (new TextEncoder).encode(JSON.stringify(e)), s = await crypto.subtle.encrypt({
|
|
19
|
+
name: "AES-GCM",
|
|
20
|
+
iv: t.iv
|
|
21
|
+
}, t.key, n), r = new Uint8Array(t.iv.length + s.byteLength);
|
|
22
|
+
return r.set(t.iv), r.set(new Uint8Array(s), t.iv.length), btoa(String.fromCharCode(...r));
|
|
23
|
+
}, a = async (e, t) => {
|
|
24
|
+
const n = Uint8Array.from(atob(e), e => e.charCodeAt(0)), s = n.slice(0, 12), r = n.slice(12), o = await crypto.subtle.decrypt({
|
|
25
|
+
name: "AES-GCM",
|
|
26
|
+
iv: s
|
|
27
|
+
}, t.key, r);
|
|
28
|
+
return JSON.parse((new TextDecoder).decode(o));
|
|
29
|
+
}, i = null, c = e => {
|
|
30
|
+
i && i(e);
|
|
31
|
+
}, l = (e, t, n) => {
|
|
32
|
+
e.set(t instanceof RegExp ? t.source : t, n);
|
|
33
|
+
}, u = (e, t, s, r) => {
|
|
34
|
+
if (0 === e.size) return !0;
|
|
35
|
+
for (const [o, a] of e) {
|
|
36
|
+
let e;
|
|
37
|
+
if (e = "function" == typeof o ? o(t, r) : n(o, t), e) return a.includes(s) || a.includes("admin");
|
|
38
|
+
}
|
|
39
|
+
return !1;
|
|
40
|
+
}, y = e => {
|
|
41
|
+
if ("string" == typeof e) {
|
|
42
|
+
let t = e.replace(/&#[xX]?[0-9a-fA-F]+;?/g, e => {
|
|
43
|
+
const t = e.match(/&#x([0-9a-fA-F]+);?/i);
|
|
44
|
+
if (t && t[1]) return String.fromCharCode(parseInt(t[1], 16));
|
|
45
|
+
const n = e.match(/&#([0-9]+);?/);
|
|
46
|
+
return n && n[1] ? String.fromCharCode(parseInt(n[1], 10)) : e;
|
|
47
|
+
});
|
|
48
|
+
try {
|
|
49
|
+
t = decodeURIComponent(t);
|
|
50
|
+
} catch {}
|
|
51
|
+
return t.replace(/\b(javascript|vbscript|data:text\/html|about:blank|chrome:)/gi, "[SEC-REMOVED]").replace(/<script\b[^>]*>[\s\S]*?<\s*\/\s*script\b[^>]*>/gi, "[SEC-REMOVED]").replace(/on\w+\s*=/gi, "[SEC-REMOVED]=").replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi, "[SEC-REMOVED]").replace(/<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi, "[SEC-REMOVED]").replace(/<embed\b[^<]*(?:(?!<\/embed>)<[^<]*)*<\/embed>/gi, "[SEC-REMOVED]").replace(/<svg\b[^<]*(?:(?!<\/svg>)<[^<]*)*<\/svg>/gi, "[SEC-REMOVED]").replace(/<form\b[^<]*(?:(?!<\/form>)<[^<]*)*<\/form>/gi, "[SEC-REMOVED]").replace(/<base\b[^<]*(?:(?!<\/base>)<[^<]*)*<\/base>/gi, "[SEC-REMOVED]").replace(/<link\b[^<]*(?:(?!<\/link>)<[^<]*)*<\/link>/gi, "[SEC-REMOVED]").replace(/<meta\b[^<]*(?:(?!<\/meta>)<[^<]*)*<\/meta>/gi, "[SEC-REMOVED]").replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi, "[SEC-REMOVED]");
|
|
52
|
+
}
|
|
53
|
+
if (e && "object" == typeof e && !Array.isArray(e)) {
|
|
54
|
+
if (Object.getPrototypeOf(e) === Object.prototype) {
|
|
55
|
+
const t = {};
|
|
56
|
+
for (const [n, s] of Object.entries(e)) t[n] = y(s);
|
|
57
|
+
return t;
|
|
58
|
+
}
|
|
59
|
+
return e;
|
|
60
|
+
}
|
|
61
|
+
return Array.isArray(e) ? e.map(e => y(e)) : e;
|
|
62
|
+
}, d = e => /^([a-zA-Z0-9_.-][a-zA-Z0-9_.-]*)$/.test(e) && e.length <= 256 && e.length > 0, p = (e, t, n, r) => {
|
|
63
|
+
const o = {
|
|
64
|
+
id: s(),
|
|
65
|
+
purpose: n,
|
|
66
|
+
granted: r,
|
|
67
|
+
timestamp: Date.now()
|
|
68
|
+
}, a = e.get(t) || [];
|
|
69
|
+
return a.push(o), e.set(t, a), c({
|
|
70
|
+
timestamp: Date.now(),
|
|
71
|
+
action: "set",
|
|
72
|
+
key: `consent:${n}`,
|
|
73
|
+
userId: t,
|
|
74
|
+
success: !0
|
|
75
|
+
}), o;
|
|
76
|
+
}, g = e => {
|
|
77
|
+
if (null === e || "object" != typeof e) return e;
|
|
78
|
+
if ("function" == typeof structuredClone) try {
|
|
79
|
+
return structuredClone(e);
|
|
80
|
+
} catch (e) {}
|
|
81
|
+
const t = new WeakMap, n = e => {
|
|
82
|
+
if (null === e || "object" != typeof e) return e;
|
|
83
|
+
if ("function" == typeof e) return e;
|
|
84
|
+
if (t.has(e)) return t.get(e);
|
|
85
|
+
if (e instanceof Date) return new Date(e.getTime());
|
|
86
|
+
if (e instanceof RegExp) return new RegExp(e.source, e.flags);
|
|
87
|
+
if (e instanceof Map) {
|
|
88
|
+
const s = new Map;
|
|
89
|
+
return t.set(e, s), e.forEach((e, t) => s.set(n(t), n(e))), s;
|
|
90
|
+
}
|
|
91
|
+
if (e instanceof Set) {
|
|
92
|
+
const s = new Set;
|
|
93
|
+
return t.set(e, s), e.forEach(e => s.add(n(e))), s;
|
|
94
|
+
}
|
|
95
|
+
const s = Array.isArray(e) ? [] : Object.create(Object.getPrototypeOf(e));
|
|
96
|
+
t.set(e, s);
|
|
97
|
+
const r = [ ...Object.keys(e), ...Object.getOwnPropertySymbols(e) ];
|
|
98
|
+
for (const t of r) s[t] = n(e[t]);
|
|
99
|
+
return s;
|
|
100
|
+
};
|
|
101
|
+
return n(e);
|
|
102
|
+
}, f = (e, t) => {
|
|
103
|
+
if (e === t) return !0;
|
|
104
|
+
if (null === e || null === t) return e === t;
|
|
105
|
+
if ("object" != typeof e || "object" != typeof t) return e === t;
|
|
106
|
+
if (Array.isArray(e) && Array.isArray(t)) {
|
|
107
|
+
if (e.length !== t.length) return !1;
|
|
108
|
+
for (let n = 0; n < e.length; n++) if (!f(e[n], t[n])) return !1;
|
|
109
|
+
return !0;
|
|
110
|
+
}
|
|
111
|
+
const n = Object.keys(e), s = Object.keys(t);
|
|
112
|
+
if (n.length !== s.length) return !1;
|
|
113
|
+
for (let s = 0; s < n.length; s++) {
|
|
114
|
+
const r = n[s];
|
|
115
|
+
if (!(r in t) || !f(e[r], t[r])) return !1;
|
|
116
|
+
}
|
|
117
|
+
return !0;
|
|
118
|
+
}, h = e => `${e}_`, m = class {
|
|
119
|
+
store;
|
|
120
|
+
config;
|
|
121
|
+
pendingQueue=new Map;
|
|
122
|
+
remoteVersions=new Map;
|
|
123
|
+
syncTimer=null;
|
|
124
|
+
onlineStatusListeners=new Set;
|
|
125
|
+
syncStateListeners=new Set;
|
|
126
|
+
_isOnline=!0;
|
|
127
|
+
_isSyncing=!1;
|
|
128
|
+
constructor(e, t) {
|
|
129
|
+
this.store = e, this.config = {
|
|
130
|
+
endpoint: t.endpoint,
|
|
131
|
+
authToken: t.authToken || "",
|
|
132
|
+
strategy: t.strategy || "last-write-wins",
|
|
133
|
+
autoSyncInterval: t.autoSyncInterval ?? 3e4,
|
|
134
|
+
syncOnReconnect: t.syncOnReconnect ?? !0,
|
|
135
|
+
debounceTime: t.debounceTime ?? 1e3,
|
|
136
|
+
fetch: t.fetch || fetch,
|
|
137
|
+
onSync: t.onSync || (() => {}),
|
|
138
|
+
onConflict: t.onConflict || (() => ({
|
|
139
|
+
action: "accept-local"
|
|
140
|
+
})),
|
|
141
|
+
maxRetries: t.maxRetries ?? 3
|
|
142
|
+
}, this._isOnline = "undefined" == typeof navigator || navigator.onLine, this._setupOnlineListener(),
|
|
143
|
+
this._setupStoreListener(), this.config.autoSyncInterval > 0 && this._startAutoSync();
|
|
144
|
+
}
|
|
145
|
+
_getAuthToken() {
|
|
146
|
+
const e = this.config.authToken;
|
|
147
|
+
return "function" == typeof e ? e() || "" : e || "";
|
|
148
|
+
}
|
|
149
|
+
_setupOnlineListener() {
|
|
150
|
+
"undefined" != typeof window && (window.addEventListener("online", () => {
|
|
151
|
+
this._isOnline = !0, this._notifyOnlineChange(!0), this.config.syncOnReconnect && this.sync();
|
|
152
|
+
}), window.addEventListener("offline", () => {
|
|
153
|
+
this._isOnline = !1, this._notifyOnlineChange(!1);
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
_setupStoreListener() {
|
|
157
|
+
this.store._subscribe(() => {});
|
|
158
|
+
}
|
|
159
|
+
_startAutoSync() {
|
|
160
|
+
setInterval(() => {
|
|
161
|
+
this._isOnline && !this._isSyncing && this.pendingQueue.size > 0 && this.sync();
|
|
162
|
+
}, this.config.autoSyncInterval);
|
|
163
|
+
}
|
|
164
|
+
_notifyOnlineChange(e) {
|
|
165
|
+
this.onlineStatusListeners.forEach(t => t(e)), this._notifyStateChange();
|
|
166
|
+
}
|
|
167
|
+
_notifyStateChange() {
|
|
168
|
+
const e = this.getState();
|
|
169
|
+
this.syncStateListeners.forEach(t => t(e));
|
|
170
|
+
}
|
|
171
|
+
queueChange(e, t) {
|
|
172
|
+
const n = this.store._getVersion(e) || 1;
|
|
173
|
+
this.pendingQueue.set(e, {
|
|
174
|
+
key: e,
|
|
175
|
+
value: g(t),
|
|
176
|
+
timestamp: Date.now(),
|
|
177
|
+
version: n
|
|
178
|
+
}), this._notifyStateChange(), this.syncTimer && clearTimeout(this.syncTimer), this.syncTimer = setTimeout(() => {
|
|
179
|
+
this._isOnline && this.sync();
|
|
180
|
+
}, this.config.debounceTime);
|
|
181
|
+
}
|
|
182
|
+
async sync() {
|
|
183
|
+
if (this._isSyncing) return {
|
|
184
|
+
success: !1,
|
|
185
|
+
syncedKeys: [],
|
|
186
|
+
conflicts: [],
|
|
187
|
+
errors: [ "Sync already in progress" ],
|
|
188
|
+
timestamp: Date.now(),
|
|
189
|
+
duration: 0
|
|
190
|
+
};
|
|
191
|
+
this._isSyncing = !0, this._notifyStateChange();
|
|
192
|
+
const e = Date.now(), t = [], n = [], s = [];
|
|
193
|
+
try {
|
|
194
|
+
const r = Array.from(this.pendingQueue.values());
|
|
195
|
+
if (0 === r.length) return this._isSyncing = !1, this._notifyStateChange(), {
|
|
196
|
+
success: !0,
|
|
197
|
+
syncedKeys: [],
|
|
198
|
+
conflicts: [],
|
|
199
|
+
errors: [],
|
|
200
|
+
timestamp: Date.now(),
|
|
201
|
+
duration: Date.now() - e
|
|
202
|
+
};
|
|
203
|
+
await this._fetchRemoteVersions(r.map(e => e.key));
|
|
204
|
+
for (const e of r) try {
|
|
205
|
+
const s = this.remoteVersions.get(e.key);
|
|
206
|
+
if (s) if (s.version >= e.version) {
|
|
207
|
+
const r = {
|
|
208
|
+
key: e.key,
|
|
209
|
+
localValue: e.value,
|
|
210
|
+
remoteValue: s.value,
|
|
211
|
+
localVersion: e.version,
|
|
212
|
+
remoteVersion: s.version,
|
|
213
|
+
timestamp: e.timestamp
|
|
214
|
+
};
|
|
215
|
+
n.push(r);
|
|
216
|
+
const o = this.config.onConflict(r);
|
|
217
|
+
await this._resolveConflict(e, s, o), t.push(e.key), this.pendingQueue.delete(e.key);
|
|
218
|
+
} else await this._pushChange(e), t.push(e.key), this.pendingQueue.delete(e.key); else await this._pushChange(e),
|
|
219
|
+
t.push(e.key), this.pendingQueue.delete(e.key);
|
|
220
|
+
} catch (t) {
|
|
221
|
+
s.push(`Failed to sync "${e.key}": ${t}`);
|
|
222
|
+
}
|
|
223
|
+
const o = {
|
|
224
|
+
success: 0 === s.length,
|
|
225
|
+
syncedKeys: t,
|
|
226
|
+
conflicts: n,
|
|
227
|
+
errors: s,
|
|
228
|
+
timestamp: Date.now(),
|
|
229
|
+
duration: Date.now() - e
|
|
230
|
+
};
|
|
231
|
+
return this.config.onSync(o), o;
|
|
232
|
+
} catch (r) {
|
|
233
|
+
const o = `Sync failed: ${r}`;
|
|
234
|
+
return s.push(o), {
|
|
235
|
+
success: !1,
|
|
236
|
+
syncedKeys: t,
|
|
237
|
+
conflicts: n,
|
|
238
|
+
errors: s,
|
|
239
|
+
timestamp: Date.now(),
|
|
240
|
+
duration: Date.now() - e
|
|
241
|
+
};
|
|
242
|
+
} finally {
|
|
243
|
+
this._isSyncing = !1, this._notifyStateChange();
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async _fetchRemoteVersions(e) {
|
|
247
|
+
try {
|
|
248
|
+
const t = this._getAuthToken(), n = await this.config.fetch(`${this.config.endpoint}/versions`, {
|
|
249
|
+
method: "POST",
|
|
250
|
+
headers: {
|
|
251
|
+
"Content-Type": "application/json",
|
|
252
|
+
...t && {
|
|
253
|
+
Authorization: `Bearer ${t}`
|
|
254
|
+
}
|
|
255
|
+
},
|
|
256
|
+
body: JSON.stringify({
|
|
257
|
+
keys: e
|
|
258
|
+
})
|
|
259
|
+
});
|
|
260
|
+
if (n.ok) {
|
|
261
|
+
const e = await n.json();
|
|
262
|
+
if (e.versions) for (const [t, n] of Object.entries(e.versions)) this.remoteVersions.set(t, n);
|
|
263
|
+
}
|
|
264
|
+
} catch (e) {}
|
|
265
|
+
}
|
|
266
|
+
async _pushChange(e) {
|
|
267
|
+
let t = 0;
|
|
268
|
+
for (;t < this.config.maxRetries; ) try {
|
|
269
|
+
const n = this._getAuthToken(), s = await this.config.fetch(`${this.config.endpoint}/sync`, {
|
|
270
|
+
method: "POST",
|
|
271
|
+
headers: {
|
|
272
|
+
"Content-Type": "application/json",
|
|
273
|
+
...n && {
|
|
274
|
+
Authorization: `Bearer ${n}`
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
body: JSON.stringify({
|
|
278
|
+
key: e.key,
|
|
279
|
+
value: e.value,
|
|
280
|
+
version: e.version,
|
|
281
|
+
timestamp: e.timestamp
|
|
282
|
+
})
|
|
283
|
+
});
|
|
284
|
+
if (s.ok) {
|
|
285
|
+
const t = await s.json();
|
|
286
|
+
return void (t.version && this.remoteVersions.set(e.key, {
|
|
287
|
+
version: t.version,
|
|
288
|
+
timestamp: t.timestamp || Date.now(),
|
|
289
|
+
value: e.value
|
|
290
|
+
}));
|
|
291
|
+
}
|
|
292
|
+
t++;
|
|
293
|
+
} catch (e) {
|
|
294
|
+
if (t++, t >= this.config.maxRetries) throw e;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
async _resolveConflict(e, t, n) {
|
|
298
|
+
switch (n.action) {
|
|
299
|
+
case "accept-local":
|
|
300
|
+
await this._pushChange({
|
|
301
|
+
...e,
|
|
302
|
+
version: t.version + 1,
|
|
303
|
+
timestamp: Date.now()
|
|
304
|
+
});
|
|
305
|
+
break;
|
|
306
|
+
|
|
307
|
+
case "accept-remote":
|
|
308
|
+
this.store.set(e.key, t.value);
|
|
309
|
+
break;
|
|
310
|
+
|
|
311
|
+
case "merge":
|
|
312
|
+
this.store.set(e.key, n.value), await this._pushChange({
|
|
313
|
+
key: e.key,
|
|
314
|
+
value: n.value,
|
|
315
|
+
version: Math.max(e.version, t.version) + 1,
|
|
316
|
+
timestamp: Date.now()
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
getState() {
|
|
321
|
+
return {
|
|
322
|
+
isOnline: this._isOnline,
|
|
323
|
+
isSyncing: this._isSyncing,
|
|
324
|
+
lastSyncTimestamp: null,
|
|
325
|
+
pendingChanges: this.pendingQueue.size,
|
|
326
|
+
conflicts: 0
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
onOnlineChange(e) {
|
|
330
|
+
return this.onlineStatusListeners.add(e), () => this.onlineStatusListeners.delete(e);
|
|
331
|
+
}
|
|
332
|
+
onStateChange(e) {
|
|
333
|
+
return this.syncStateListeners.add(e), () => this.syncStateListeners.delete(e);
|
|
334
|
+
}
|
|
335
|
+
async flush() {
|
|
336
|
+
return this.sync();
|
|
337
|
+
}
|
|
338
|
+
destroy() {
|
|
339
|
+
this.syncTimer && clearTimeout(this.syncTimer), this.pendingQueue.clear(), this.onlineStatusListeners.clear(),
|
|
340
|
+
this.syncStateListeners.clear();
|
|
341
|
+
}
|
|
342
|
+
}, S = () => {
|
|
343
|
+
try {
|
|
344
|
+
if ("undefined" != typeof process && "production" === process.env?.NODE_ENV) return !0;
|
|
345
|
+
const e = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof window ? window : {};
|
|
346
|
+
return void 0 !== e.__DEV__ && !1 === e.__DEV__;
|
|
347
|
+
} catch {
|
|
348
|
+
return !1;
|
|
349
|
+
}
|
|
350
|
+
}, w = () => "undefined" != typeof window ? window.localStorage : null, b = t => {
|
|
351
|
+
const n = new Map, s = new Map, r = new Map, b = new Set, v = new Map, E = new Set, k = new Map, _ = new Map, C = new Map, O = new Map, x = new Map, A = new Map, D = new Map, M = new Map, R = t?.namespace || "gstate", T = t?.silent ?? !1, j = t?.debounceTime ?? 150, V = t?.version ?? 0, I = t?.storage || w(), P = t?.onError, $ = t?.maxObjectSize ?? 0, U = t?.maxTotalSize ?? 0, N = t?.encryptionKey ?? null, z = t?.validateInput ?? !0, L = t?.auditEnabled ?? !0, K = t?.userId, B = t?.immer ?? !0, J = t?.persistByDefault ?? t?.persistence ?? t?.persist ?? !1;
|
|
352
|
+
t?.accessRules && t.accessRules.forEach(e => l(D, e.pattern, e.permissions));
|
|
353
|
+
let F, Q = !1, W = !1, G = !1, q = 0, X = null, Z = null;
|
|
354
|
+
const H = new Promise(e => {
|
|
355
|
+
F = e;
|
|
356
|
+
}), Y = () => ({
|
|
357
|
+
store: n,
|
|
358
|
+
versions: s,
|
|
359
|
+
sizes: r,
|
|
360
|
+
totalSize: q,
|
|
361
|
+
storage: I,
|
|
362
|
+
config: t || {},
|
|
363
|
+
diskQueue: x,
|
|
364
|
+
encryptionKey: N,
|
|
365
|
+
audit: se,
|
|
366
|
+
onError: P,
|
|
367
|
+
silent: T,
|
|
368
|
+
debounceTime: j,
|
|
369
|
+
currentVersion: V
|
|
370
|
+
}), ee = () => ({
|
|
371
|
+
plugins: O,
|
|
372
|
+
onError: P,
|
|
373
|
+
silent: T
|
|
374
|
+
}), te = e => {
|
|
375
|
+
if (null == e) return 0;
|
|
376
|
+
const t = typeof e;
|
|
377
|
+
if ("boolean" === t) return 4;
|
|
378
|
+
if ("number" === t) return 8;
|
|
379
|
+
if ("string" === t) return 2 * e.length;
|
|
380
|
+
if ("object" !== t) return 0;
|
|
381
|
+
let n = 0;
|
|
382
|
+
const s = [ e ], r = new WeakSet;
|
|
383
|
+
for (;s.length > 0; ) {
|
|
384
|
+
const e = s.pop();
|
|
385
|
+
if ("boolean" == typeof e) n += 4; else if ("number" == typeof e) n += 8; else if ("string" == typeof e) n += 2 * e.length; else if ("object" == typeof e && null !== e) {
|
|
386
|
+
const t = e;
|
|
387
|
+
if (r.has(t)) continue;
|
|
388
|
+
if (r.add(t), Array.isArray(t)) for (let e = 0; e < t.length; e++) s.push(t[e]); else for (const e of Object.keys(t)) n += 2 * e.length,
|
|
389
|
+
s.push(t[e]);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return n;
|
|
393
|
+
}, ne = (e, t) => {
|
|
394
|
+
((e, t, n) => {
|
|
395
|
+
if (0 !== e.plugins.size) for (const s of e.plugins.values()) {
|
|
396
|
+
const r = s.hooks?.[t];
|
|
397
|
+
if (r) try {
|
|
398
|
+
r(n);
|
|
399
|
+
} catch (r) {
|
|
400
|
+
const o = r instanceof Error ? r : new Error(String(r));
|
|
401
|
+
e.onError ? e.onError(o, {
|
|
402
|
+
operation: `plugin:${s.name}:${t}`,
|
|
403
|
+
key: n.key
|
|
404
|
+
}) : e.silent;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
})(ee(), e, t);
|
|
408
|
+
}, se = (e, t, n, s) => {
|
|
409
|
+
L && null !== i && c && c({
|
|
410
|
+
timestamp: Date.now(),
|
|
411
|
+
action: e,
|
|
412
|
+
key: t,
|
|
413
|
+
userId: K,
|
|
414
|
+
success: n,
|
|
415
|
+
error: s
|
|
416
|
+
});
|
|
417
|
+
}, re = t => {
|
|
418
|
+
const n = _.get(t);
|
|
419
|
+
if (!n) return;
|
|
420
|
+
const r = new Set, o = n.selector(e => (r.add(e), _.has(e) ? _.get(e).lastValue : ce.get(e)));
|
|
421
|
+
n.deps.forEach(e => {
|
|
422
|
+
if (!r.has(e)) {
|
|
423
|
+
const n = C.get(e);
|
|
424
|
+
n && (n.delete(t), 0 === n.size && C.delete(e));
|
|
425
|
+
}
|
|
426
|
+
}), r.forEach(e => {
|
|
427
|
+
n.deps.has(e) || (C.has(e) || C.set(e, new Set), C.get(e).add(t));
|
|
428
|
+
}), n.deps = r, f(n.lastValue, o) || (n.lastValue = B && null !== o && "object" == typeof o ? e.freeze(g(o), !0) : o,
|
|
429
|
+
s.set(t, (s.get(t) || 0) + 1), oe(t));
|
|
430
|
+
}, oe = e => {
|
|
431
|
+
if (e) {
|
|
432
|
+
if (C.has(e)) {
|
|
433
|
+
const t = C.get(e);
|
|
434
|
+
for (const e of t) re(e);
|
|
435
|
+
}
|
|
436
|
+
const t = k.get(e);
|
|
437
|
+
if (t) {
|
|
438
|
+
const n = ce.get(e);
|
|
439
|
+
for (const s of t) try {
|
|
440
|
+
s(n);
|
|
441
|
+
} catch (t) {
|
|
442
|
+
const n = t instanceof Error ? t : new Error(String(t));
|
|
443
|
+
P && P(n, {
|
|
444
|
+
operation: "watcher",
|
|
445
|
+
key: e
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
const n = v.get(e);
|
|
450
|
+
if (n) for (const t of n) try {
|
|
451
|
+
t();
|
|
452
|
+
} catch (t) {
|
|
453
|
+
const n = t instanceof Error ? t : new Error(String(t));
|
|
454
|
+
P && P(n, {
|
|
455
|
+
operation: "keyListener",
|
|
456
|
+
key: e
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
if (Q) W = !0; else for (const e of b) try {
|
|
461
|
+
e();
|
|
462
|
+
} catch (e) {
|
|
463
|
+
const t = e instanceof Error ? e : new Error(String(e));
|
|
464
|
+
P && P(t, {
|
|
465
|
+
operation: "listener"
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
}, ae = async () => {
|
|
469
|
+
(async e => {
|
|
470
|
+
if (!e.storage) return;
|
|
471
|
+
const {store: t, config: n, diskQueue: s, storage: r, encryptionKey: a, audit: i, onError: c, silent: l, currentVersion: u} = e, y = h(n.namespace || "gstate");
|
|
472
|
+
try {
|
|
473
|
+
const e = {};
|
|
474
|
+
let s;
|
|
475
|
+
t.forEach((t, n) => {
|
|
476
|
+
e[n] = t;
|
|
477
|
+
});
|
|
478
|
+
const o = n?.encoded;
|
|
479
|
+
s = o ? btoa(JSON.stringify(e)) : JSON.stringify(e), r.setItem(y.replace("_", ""), JSON.stringify({
|
|
480
|
+
v: 1,
|
|
481
|
+
t: Date.now(),
|
|
482
|
+
e: null,
|
|
483
|
+
d: s,
|
|
484
|
+
_sys_v: u,
|
|
485
|
+
_b64: !!o || void 0
|
|
486
|
+
})), i("set", "FULL_STATE", !0);
|
|
487
|
+
} catch (e) {
|
|
488
|
+
const t = e instanceof Error ? e : new Error(String(e));
|
|
489
|
+
c && c(t, {
|
|
490
|
+
operation: "persist",
|
|
491
|
+
key: "FULL_STATE"
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
const d = Array.from(s.entries());
|
|
495
|
+
s.clear();
|
|
496
|
+
for (const [t, n] of d) try {
|
|
497
|
+
if (!t || !/^[a-zA-Z0-9_.-]+$/.test(t) || t.length > 256) continue;
|
|
498
|
+
let s = n.value;
|
|
499
|
+
const c = n.options.encoded || n.options.encrypted || n.options.secure;
|
|
500
|
+
if (n.options.encrypted) {
|
|
501
|
+
if (!a) throw new Error(`Encryption key missing for "${t}"`);
|
|
502
|
+
s = await o(n.value, a);
|
|
503
|
+
} else c ? s = btoa(JSON.stringify(n.value)) : "object" == typeof n.value && null !== n.value && (s = JSON.stringify(n.value));
|
|
504
|
+
r.setItem(`${y}${t}`, JSON.stringify({
|
|
505
|
+
v: e.versions.get(t) || 1,
|
|
506
|
+
t: Date.now(),
|
|
507
|
+
e: n.options.ttl ? Date.now() + n.options.ttl : null,
|
|
508
|
+
d: s,
|
|
509
|
+
_sys_v: u,
|
|
510
|
+
_enc: !!n.options.encrypted || void 0,
|
|
511
|
+
_b64: !(!n.options.encoded && !n.options.secure) || void 0
|
|
512
|
+
})), i("set", t, !0);
|
|
513
|
+
} catch (e) {
|
|
514
|
+
const n = e instanceof Error ? e : new Error(String(e));
|
|
515
|
+
c && c(n, {
|
|
516
|
+
operation: "persist",
|
|
517
|
+
key: t
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
})(Y());
|
|
521
|
+
}, ie = {}, ce = {
|
|
522
|
+
_setSilently: (t, o) => {
|
|
523
|
+
const a = r.get(t) || 0, i = B && null !== o && "object" == typeof o ? e.freeze(g(o), !0) : o, c = ($ > 0 || U > 0) && !S() ? te(i) : 0;
|
|
524
|
+
q = q - a + c, r.set(t, c), n.set(t, i), s.set(t, (s.get(t) || 0) + 1), Z = null;
|
|
525
|
+
},
|
|
526
|
+
_registerMethod: (e, t, n) => {
|
|
527
|
+
const s = e => "__proto__" === e || "constructor" === e || "prototype" === e;
|
|
528
|
+
s(e) || s(t) || (ie[e] || (ie[e] = {}), ie[e][t] = n);
|
|
529
|
+
},
|
|
530
|
+
set: (o, a, i = {}) => {
|
|
531
|
+
const c = n.get(o), l = B && "function" == typeof a ? e.produce(c, a) : a;
|
|
532
|
+
if (z && !d(o)) return !1;
|
|
533
|
+
if (!u(D, o, "write", K)) return se("set", o, !1, "RBAC Denied"), !1;
|
|
534
|
+
const p = z ? y(l) : l, h = r.get(o) || 0;
|
|
535
|
+
ne("onBeforeSet", {
|
|
536
|
+
key: o,
|
|
537
|
+
value: p,
|
|
538
|
+
store: ce,
|
|
539
|
+
version: s.get(o) || 0
|
|
540
|
+
});
|
|
541
|
+
const m = B && null !== p && "object" == typeof p ? e.freeze(g(p), !0) : p;
|
|
542
|
+
if (!f(c, m)) {
|
|
543
|
+
const e = ($ > 0 || U > 0) && !S() ? te(m) : 0;
|
|
544
|
+
if ($ > 0 && e > $) {
|
|
545
|
+
const t = new Error(`Object size (${e} bytes) exceeds maxObjectSize (${$} bytes)`);
|
|
546
|
+
P && P(t, {
|
|
547
|
+
operation: "set",
|
|
548
|
+
key: o
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
if (U > 0) {
|
|
552
|
+
const t = q - h + e;
|
|
553
|
+
if (t > U) {
|
|
554
|
+
const e = new Error(`Total store size (${t} bytes) exceeds limit (${U} bytes)`);
|
|
555
|
+
P && P(e, {
|
|
556
|
+
operation: "set"
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
q = q - h + e, r.set(o, e), n.set(o, m), s.set(o, (s.get(o) || 0) + 1), Z = null;
|
|
561
|
+
const a = i.persist ?? J;
|
|
562
|
+
return a && (x.set(o, {
|
|
563
|
+
value: m,
|
|
564
|
+
options: {
|
|
565
|
+
...i,
|
|
566
|
+
persist: a,
|
|
567
|
+
encoded: i.encoded || t?.encoded
|
|
568
|
+
}
|
|
569
|
+
}), X && clearTimeout(X), X = setTimeout(ae, j)), ne("onSet", {
|
|
570
|
+
key: o,
|
|
571
|
+
value: m,
|
|
572
|
+
store: ce,
|
|
573
|
+
version: s.get(o)
|
|
574
|
+
}), se("set", o, !0), oe(o), !0;
|
|
575
|
+
}
|
|
576
|
+
return !1;
|
|
577
|
+
},
|
|
578
|
+
get: e => {
|
|
579
|
+
if (!u(D, e, "read", K)) return se("get", e, !1, "RBAC Denied"), null;
|
|
580
|
+
const t = n.get(e);
|
|
581
|
+
return ne("onGet", {
|
|
582
|
+
store: ce,
|
|
583
|
+
key: e,
|
|
584
|
+
value: t
|
|
585
|
+
}), se("get", e, !0), t;
|
|
586
|
+
},
|
|
587
|
+
compute: (e, t) => {
|
|
588
|
+
try {
|
|
589
|
+
return _.has(e) || (_.set(e, {
|
|
590
|
+
selector: t,
|
|
591
|
+
lastValue: null,
|
|
592
|
+
deps: new Set
|
|
593
|
+
}), re(e)), _.get(e).lastValue;
|
|
594
|
+
} catch (t) {
|
|
595
|
+
const n = t instanceof Error ? t : new Error(String(t));
|
|
596
|
+
return P && P(n, {
|
|
597
|
+
operation: "compute",
|
|
598
|
+
key: e
|
|
599
|
+
}), null;
|
|
600
|
+
}
|
|
601
|
+
},
|
|
602
|
+
watch: (e, t) => {
|
|
603
|
+
k.has(e) || k.set(e, new Set);
|
|
604
|
+
const n = k.get(e);
|
|
605
|
+
return n.add(t), () => {
|
|
606
|
+
n.delete(t), 0 === n.size && k.delete(e);
|
|
607
|
+
};
|
|
608
|
+
},
|
|
609
|
+
remove: e => {
|
|
610
|
+
if (!u(D, e, "delete", K)) return se("delete", e, !1, "RBAC Denied"), !1;
|
|
611
|
+
const t = n.get(e), o = n.delete(e);
|
|
612
|
+
return o && (q -= r.get(e) || 0, r.delete(e), ne("onRemove", {
|
|
613
|
+
store: ce,
|
|
614
|
+
key: e,
|
|
615
|
+
value: t
|
|
616
|
+
}), Z = null), s.set(e, (s.get(e) || 0) + 1), I && I.removeItem(`${R}_${e}`), se("delete", e, !0),
|
|
617
|
+
oe(e), o;
|
|
618
|
+
},
|
|
619
|
+
delete: e => ce.remove(e),
|
|
620
|
+
deleteAll: () => {
|
|
621
|
+
if (Array.from(n.keys()).forEach(e => ce.remove(e)), I) {
|
|
622
|
+
const e = R + "_";
|
|
623
|
+
for (let t = 0; t < (I.length || 0); t++) {
|
|
624
|
+
const n = I.key(t);
|
|
625
|
+
n?.startsWith(e) && (I.removeItem(n), t--);
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
return q = 0, r.clear(), Z = null, !0;
|
|
629
|
+
},
|
|
630
|
+
list: () => Object.fromEntries(n.entries()),
|
|
631
|
+
use: e => {
|
|
632
|
+
E.add(e);
|
|
633
|
+
},
|
|
634
|
+
transaction: e => {
|
|
635
|
+
Q = !0, ne("onTransaction", {
|
|
636
|
+
store: ce,
|
|
637
|
+
key: "START"
|
|
638
|
+
});
|
|
639
|
+
try {
|
|
640
|
+
e();
|
|
641
|
+
} finally {
|
|
642
|
+
Q = !1, ne("onTransaction", {
|
|
643
|
+
store: ce,
|
|
644
|
+
key: "END"
|
|
645
|
+
}), W && (W = !1, oe());
|
|
646
|
+
}
|
|
647
|
+
},
|
|
648
|
+
destroy: () => {
|
|
649
|
+
X && (clearTimeout(X), X = null), x.clear(), "undefined" != typeof window && window.removeEventListener("beforeunload", le),
|
|
650
|
+
ne("onDestroy", {
|
|
651
|
+
store: ce
|
|
652
|
+
}), b.clear(), v.clear(), k.clear(), _.clear(), C.clear(), O.clear(), n.clear(),
|
|
653
|
+
r.clear(), q = 0, D.clear(), M.clear(), s.clear(), A.clear(), E.clear();
|
|
654
|
+
},
|
|
655
|
+
_addPlugin: e => {
|
|
656
|
+
((e, t, n) => {
|
|
657
|
+
try {
|
|
658
|
+
e.plugins.set(t.name, t), t.hooks?.onInstall?.({
|
|
659
|
+
store: n
|
|
660
|
+
});
|
|
661
|
+
} catch (n) {
|
|
662
|
+
const s = n instanceof Error ? n : new Error(String(n));
|
|
663
|
+
e.onError ? e.onError(s, {
|
|
664
|
+
operation: "plugin:install",
|
|
665
|
+
key: t.name
|
|
666
|
+
}) : e.silent;
|
|
667
|
+
}
|
|
668
|
+
})(ee(), e, ce);
|
|
669
|
+
},
|
|
670
|
+
_removePlugin: e => {
|
|
671
|
+
O.delete(e);
|
|
672
|
+
},
|
|
673
|
+
_subscribe: (e, t) => {
|
|
674
|
+
if (t) {
|
|
675
|
+
v.has(t) || v.set(t, new Set);
|
|
676
|
+
const n = v.get(t);
|
|
677
|
+
return n.add(e), () => {
|
|
678
|
+
n.delete(e), 0 === n.size && v.delete(t);
|
|
679
|
+
};
|
|
680
|
+
}
|
|
681
|
+
return b.add(e), () => b.delete(e);
|
|
682
|
+
},
|
|
683
|
+
_getVersion: e => s.get(e) ?? 0,
|
|
684
|
+
addAccessRule: (e, t) => l(D, e, t),
|
|
685
|
+
hasPermission: (e, t, n) => u(D, e, t, n),
|
|
686
|
+
recordConsent: (e, t, n) => p(M, e, t, n),
|
|
687
|
+
hasConsent: (e, t) => ((e, t, n) => {
|
|
688
|
+
const s = e.get(t);
|
|
689
|
+
if (!s) return !1;
|
|
690
|
+
for (let e = s.length - 1; e >= 0; e--) {
|
|
691
|
+
const t = s[e];
|
|
692
|
+
if (t && t.purpose === n) return t.granted;
|
|
693
|
+
}
|
|
694
|
+
return !1;
|
|
695
|
+
})(M, e, t),
|
|
696
|
+
getConsents: e => ((e, t) => e.get(t) || [])(M, e),
|
|
697
|
+
revokeConsent: (e, t) => ((e, t, n) => p(e, t, n, !1))(M, e, t),
|
|
698
|
+
exportUserData: e => ((e, t) => ({
|
|
699
|
+
userId: t,
|
|
700
|
+
exportedAt: Date.now(),
|
|
701
|
+
consents: e.get(t) || []
|
|
702
|
+
}))(M, e),
|
|
703
|
+
deleteUserData: e => ((e, t) => {
|
|
704
|
+
const n = e.get(t)?.length || 0;
|
|
705
|
+
return e.delete(t), {
|
|
706
|
+
success: !0,
|
|
707
|
+
deletedConsents: n
|
|
708
|
+
};
|
|
709
|
+
})(M, e),
|
|
710
|
+
getSnapshot: () => (Z || (Z = Object.fromEntries(n.entries())), Z),
|
|
711
|
+
get plugins() {
|
|
712
|
+
return ie;
|
|
713
|
+
},
|
|
714
|
+
get isReady() {
|
|
715
|
+
return G;
|
|
716
|
+
},
|
|
717
|
+
get namespace() {
|
|
718
|
+
return R;
|
|
719
|
+
},
|
|
720
|
+
get userId() {
|
|
721
|
+
return K;
|
|
722
|
+
},
|
|
723
|
+
whenReady: () => H
|
|
724
|
+
};
|
|
725
|
+
[ "addAccessRule", "recordConsent", "hasConsent", "getConsents", "revokeConsent", "exportUserData", "deleteUserData" ].forEach(e => {
|
|
726
|
+
const t = ce[e];
|
|
727
|
+
t && ce._registerMethod("security", e, t);
|
|
728
|
+
});
|
|
729
|
+
const le = () => {
|
|
730
|
+
x.size > 0 && ae();
|
|
731
|
+
};
|
|
732
|
+
"undefined" != typeof window && window.addEventListener("beforeunload", le), I ? (async (t, n, s) => {
|
|
733
|
+
const {storage: r, config: o, encryptionKey: i, audit: c, onError: l, silent: u, currentVersion: y, store: d, sizes: p, versions: f} = t, m = h(o.namespace || "gstate"), S = o.immer ?? !0;
|
|
734
|
+
if (r) try {
|
|
735
|
+
const u = {};
|
|
736
|
+
let h = 0;
|
|
737
|
+
for (let e = 0; e < (r.length || 0); e++) {
|
|
738
|
+
const t = r.key(e);
|
|
739
|
+
if (!t || !t.startsWith(m)) continue;
|
|
740
|
+
const n = r.getItem(t);
|
|
741
|
+
if (n) try {
|
|
742
|
+
const s = JSON.parse(n), o = t.substring(m.length);
|
|
743
|
+
if (h = Math.max(h, void 0 !== s._sys_v ? s._sys_v : s.v || 0), s.e && Date.now() > s.e) {
|
|
744
|
+
r.removeItem(t), e--;
|
|
745
|
+
continue;
|
|
746
|
+
}
|
|
747
|
+
let l = s.d;
|
|
748
|
+
if (s._enc && i) l = await a(l, i); else if ("string" == typeof l) if (s._b64) try {
|
|
749
|
+
l = JSON.parse(atob(l));
|
|
750
|
+
} catch (e) {} else if (l.startsWith("{") || l.startsWith("[")) try {
|
|
751
|
+
l = JSON.parse(l);
|
|
752
|
+
} catch (e) {}
|
|
753
|
+
u[o] = l, c("hydrate", o, !0);
|
|
754
|
+
} catch (e) {
|
|
755
|
+
c("hydrate", t, !1, String(e));
|
|
756
|
+
const n = e instanceof Error ? e : new Error(String(e));
|
|
757
|
+
l && l(n, {
|
|
758
|
+
operation: "hydration",
|
|
759
|
+
key: t
|
|
760
|
+
});
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
const w = h < y && o.migrate ? o.migrate(u, h) : u;
|
|
764
|
+
Object.entries(w).forEach(([s, r]) => {
|
|
765
|
+
const o = S && null !== r && "object" == typeof r ? e.freeze(g(r), !0) : r, a = n(o), i = p.get(s) || 0;
|
|
766
|
+
t.totalSize = t.totalSize - i + a, p.set(s, a), d.set(s, o), f.set(s, 1);
|
|
767
|
+
}), s();
|
|
768
|
+
} catch (e) {
|
|
769
|
+
const t = e instanceof Error ? e : new Error(String(e));
|
|
770
|
+
l && l(t, {
|
|
771
|
+
operation: "hydration"
|
|
772
|
+
});
|
|
773
|
+
}
|
|
774
|
+
})(Y(), e => ($ > 0 || U > 0) && !S() ? te(e) : 0, () => {
|
|
775
|
+
G = !0, Z = null, F(), oe();
|
|
776
|
+
}).then(() => {}) : (G = !0, F());
|
|
777
|
+
let ue = null;
|
|
778
|
+
return t?.sync && (ue = new m(ce, t.sync), ce._registerMethod("sync", "flush", () => ue?.flush()),
|
|
779
|
+
ce._registerMethod("sync", "getState", () => ue?.getState()), ce._registerMethod("sync", "onStateChange", e => ue?.onStateChange(e))),
|
|
780
|
+
ce;
|
|
781
|
+
}, v = null, E = () => v;
|
|
782
|
+
|
|
783
|
+
function k(e, n) {
|
|
784
|
+
const s = t.useMemo(() => n || v, [ n ]), r = t.useMemo(() => {
|
|
785
|
+
const e = () => {}, t = () => !1, n = () => null;
|
|
786
|
+
return {
|
|
787
|
+
set: t,
|
|
788
|
+
get: n,
|
|
789
|
+
remove: t,
|
|
790
|
+
delete: t,
|
|
791
|
+
deleteAll: t,
|
|
792
|
+
list: () => ({}),
|
|
793
|
+
compute: n,
|
|
794
|
+
watch: () => () => {},
|
|
795
|
+
use: e,
|
|
796
|
+
transaction: e,
|
|
797
|
+
destroy: e,
|
|
798
|
+
_subscribe: () => () => {},
|
|
799
|
+
_setSilently: e,
|
|
800
|
+
_registerMethod: e,
|
|
801
|
+
_addPlugin: e,
|
|
802
|
+
_removePlugin: e,
|
|
803
|
+
_getVersion: () => 0,
|
|
804
|
+
get isReady() {
|
|
805
|
+
return !1;
|
|
806
|
+
},
|
|
807
|
+
whenReady: () => Promise.resolve(),
|
|
808
|
+
get plugins() {
|
|
809
|
+
return {};
|
|
810
|
+
},
|
|
811
|
+
getSnapshot: () => ({}),
|
|
812
|
+
get namespace() {
|
|
813
|
+
return "ghost";
|
|
814
|
+
},
|
|
815
|
+
get userId() {}
|
|
816
|
+
};
|
|
817
|
+
}, []), o = s || r, a = "function" == typeof e, i = a ? null : e, c = a ? e : null, l = t.useCallback(e => a ? o._subscribe(e) : o._subscribe(e, i), [ o, a, i ]), u = t.useCallback(() => a ? c(o.getSnapshot()) : o.get(i) ?? void 0, [ o, a, i, c ]), y = t.useCallback(() => {
|
|
818
|
+
if (a) try {
|
|
819
|
+
return c({});
|
|
820
|
+
} catch {
|
|
821
|
+
return;
|
|
822
|
+
}
|
|
823
|
+
}, [ c, a ]), d = t.useSyncExternalStore(l, u, y), p = t.useCallback((e, t) => a ? (S(),
|
|
824
|
+
!1) : o.set(i, e, t), [ o, a, i ]);
|
|
825
|
+
return t.useDebugValue(d, e => a ? `Selector: ${JSON.stringify(e)}` : `${i}: ${JSON.stringify(e)}`),
|
|
826
|
+
a ? d : [ d, p ];
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
var _ = new Map;
|
|
830
|
+
|
|
831
|
+
exports.SyncEngine = m, exports.addAccessRule = (e, t) => E()?.addAccessRule(e, t),
|
|
832
|
+
exports.analyticsPlugin = e => ({
|
|
833
|
+
name: "gstate-analytics",
|
|
834
|
+
hooks: {
|
|
835
|
+
onSet: ({key: t, value: n}) => {
|
|
836
|
+
t && (e.keys && !e.keys.includes(t) || e.provider({
|
|
837
|
+
key: t,
|
|
838
|
+
value: n,
|
|
839
|
+
action: "SET"
|
|
840
|
+
}));
|
|
841
|
+
},
|
|
842
|
+
onRemove: ({key: t}) => {
|
|
843
|
+
t && (e.keys && !e.keys.includes(t) || e.provider({
|
|
844
|
+
key: t,
|
|
845
|
+
value: null,
|
|
846
|
+
action: "REMOVE"
|
|
847
|
+
}));
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
}), exports.clearAccessRules = () => {}, exports.clearAllConsents = () => {}, exports.cloudSyncPlugin = e => {
|
|
851
|
+
const {adapter: t, autoSyncInterval: n} = e, s = new Map, r = {
|
|
852
|
+
lastSyncTimestamp: null,
|
|
853
|
+
totalKeysSynced: 0,
|
|
854
|
+
totalBytesSynced: 0,
|
|
855
|
+
syncCount: 0,
|
|
856
|
+
lastDuration: 0,
|
|
857
|
+
errors: 0
|
|
858
|
+
};
|
|
859
|
+
let o = null;
|
|
860
|
+
return {
|
|
861
|
+
name: "cloudSync",
|
|
862
|
+
hooks: {
|
|
863
|
+
onInstall: ({store: a}) => {
|
|
864
|
+
a._registerMethod("cloudSync", "sync", async () => {
|
|
865
|
+
const n = performance.now(), o = {};
|
|
866
|
+
let i = 0;
|
|
867
|
+
try {
|
|
868
|
+
const c = a.list(), l = Object.keys(c);
|
|
869
|
+
for (const e of l) {
|
|
870
|
+
const t = a._getVersion?.(e) || 0;
|
|
871
|
+
if (t > (s.get(e) || 0)) {
|
|
872
|
+
const n = c[e];
|
|
873
|
+
o[e] = n, i += JSON.stringify(n).length, s.set(e, t);
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
if (0 === Object.keys(o).length) return {
|
|
877
|
+
status: "no-change",
|
|
878
|
+
stats: r
|
|
879
|
+
};
|
|
880
|
+
if (await t.save(o)) return r.lastSyncTimestamp = Date.now(), r.totalKeysSynced += Object.keys(o).length,
|
|
881
|
+
r.totalBytesSynced += i, r.syncCount++, r.lastDuration = performance.now() - n,
|
|
882
|
+
e.onSync && e.onSync(r), {
|
|
883
|
+
status: "success",
|
|
884
|
+
stats: r
|
|
885
|
+
};
|
|
886
|
+
throw new Error(`Adapter ${t.name} failed to save.`);
|
|
887
|
+
} catch (e) {
|
|
888
|
+
return r.errors++, {
|
|
889
|
+
status: "error",
|
|
890
|
+
error: String(e),
|
|
891
|
+
stats: r
|
|
892
|
+
};
|
|
893
|
+
}
|
|
894
|
+
}), a._registerMethod("cloudSync", "getStats", () => r), n && n > 0 && (o = setInterval(() => {
|
|
895
|
+
const e = a.plugins.cloudSync;
|
|
896
|
+
e && e.sync();
|
|
897
|
+
}, n));
|
|
898
|
+
},
|
|
899
|
+
onDestroy: () => {
|
|
900
|
+
o && clearInterval(o);
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
};
|
|
904
|
+
}, exports.createAsyncStore = (e, t) => {
|
|
905
|
+
const n = t?.key || "async_data", s = t?.store || b({
|
|
906
|
+
namespace: `async_${n}`,
|
|
907
|
+
silent: !0
|
|
908
|
+
});
|
|
909
|
+
null == s.get(n) && s.set(n, {
|
|
910
|
+
data: null,
|
|
911
|
+
loading: !1,
|
|
912
|
+
error: null,
|
|
913
|
+
updatedAt: null
|
|
914
|
+
});
|
|
915
|
+
return Object.assign(s, {
|
|
916
|
+
execute: async () => {
|
|
917
|
+
const r = s.get(n);
|
|
918
|
+
s.set(n, {
|
|
919
|
+
...r || {
|
|
920
|
+
data: null,
|
|
921
|
+
loading: !1,
|
|
922
|
+
error: null,
|
|
923
|
+
updatedAt: null
|
|
924
|
+
},
|
|
925
|
+
loading: !0,
|
|
926
|
+
error: null
|
|
927
|
+
}), "whenReady" in s && !s.isReady && await s.whenReady();
|
|
928
|
+
try {
|
|
929
|
+
const r = await e(), o = s.get(n);
|
|
930
|
+
s.set(n, {
|
|
931
|
+
...o || {
|
|
932
|
+
data: null,
|
|
933
|
+
loading: !1,
|
|
934
|
+
error: null,
|
|
935
|
+
updatedAt: null
|
|
936
|
+
},
|
|
937
|
+
data: r,
|
|
938
|
+
loading: !1,
|
|
939
|
+
updatedAt: Date.now()
|
|
940
|
+
}, {
|
|
941
|
+
persist: t?.persist
|
|
942
|
+
});
|
|
943
|
+
} catch (e) {
|
|
944
|
+
const t = s.get(n);
|
|
945
|
+
s.set(n, {
|
|
946
|
+
...t || {
|
|
947
|
+
data: null,
|
|
948
|
+
loading: !1,
|
|
949
|
+
error: null,
|
|
950
|
+
updatedAt: null
|
|
951
|
+
},
|
|
952
|
+
error: e instanceof Error ? e : new Error(String(e)),
|
|
953
|
+
loading: !1
|
|
954
|
+
});
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
});
|
|
958
|
+
}, exports.createFirestoreAdapter = (e, t) => ({
|
|
959
|
+
name: "Firebase-Firestore",
|
|
960
|
+
save: async e => {
|
|
961
|
+
try {
|
|
962
|
+
S();
|
|
963
|
+
return (() => {})("[Mock] Firestore Syncing:", e), !0;
|
|
964
|
+
} catch (e) {
|
|
965
|
+
return !1;
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
}), exports.createMongoAdapter = (e, t) => ({
|
|
969
|
+
name: "MongoDB-Atlas",
|
|
970
|
+
save: async n => (await fetch(`${e}/action/updateOne`, {
|
|
971
|
+
method: "POST",
|
|
972
|
+
headers: {
|
|
973
|
+
"Content-Type": "application/json",
|
|
974
|
+
"api-key": t
|
|
975
|
+
},
|
|
976
|
+
body: JSON.stringify({
|
|
977
|
+
dataSource: "Cluster0",
|
|
978
|
+
database: "rgs_cloud",
|
|
979
|
+
collection: "user_states",
|
|
980
|
+
filter: {
|
|
981
|
+
id: "global_state"
|
|
982
|
+
},
|
|
983
|
+
update: {
|
|
984
|
+
$set: {
|
|
985
|
+
data: n,
|
|
986
|
+
updatedAt: Date.now()
|
|
987
|
+
}
|
|
988
|
+
},
|
|
989
|
+
upsert: !0
|
|
990
|
+
})
|
|
991
|
+
})).ok
|
|
992
|
+
}), exports.createSqlRestAdapter = (e, t) => ({
|
|
993
|
+
name: "SQL-REST-API",
|
|
994
|
+
save: async n => {
|
|
995
|
+
const s = t();
|
|
996
|
+
if (!s) return !1;
|
|
997
|
+
return (await fetch(e, {
|
|
998
|
+
method: "PATCH",
|
|
999
|
+
headers: {
|
|
1000
|
+
"Content-Type": "application/json",
|
|
1001
|
+
Authorization: `Bearer ${s}`
|
|
1002
|
+
},
|
|
1003
|
+
body: JSON.stringify(n),
|
|
1004
|
+
credentials: "same-origin"
|
|
1005
|
+
})).ok;
|
|
1006
|
+
}
|
|
1007
|
+
}), exports.createStore = b, exports.createSyncEngine = (e, t) => new m(e, t), exports.debugPlugin = () => {
|
|
1008
|
+
if (S()) return {
|
|
1009
|
+
name: "gstate-debug-noop",
|
|
1010
|
+
hooks: {}
|
|
1011
|
+
};
|
|
1012
|
+
S();
|
|
1013
|
+
return {
|
|
1014
|
+
name: "gstate-debug",
|
|
1015
|
+
hooks: {
|
|
1016
|
+
onInstall: ({store: e}) => {
|
|
1017
|
+
"undefined" != typeof window && (window.gstate = {
|
|
1018
|
+
list: () => e.list(),
|
|
1019
|
+
get: t => {
|
|
1020
|
+
const n = e.get(t);
|
|
1021
|
+
return n;
|
|
1022
|
+
},
|
|
1023
|
+
set: (t, n) => {
|
|
1024
|
+
const s = e.set(t, n);
|
|
1025
|
+
return JSON.stringify(n), s;
|
|
1026
|
+
},
|
|
1027
|
+
watch: (t, n) => e.watch(t, n),
|
|
1028
|
+
info: () => {
|
|
1029
|
+
const t = {
|
|
1030
|
+
namespace: e.namespace,
|
|
1031
|
+
isReady: e.isReady,
|
|
1032
|
+
keys: Object.keys(e.list()),
|
|
1033
|
+
size: Object.keys(e.list()).length
|
|
1034
|
+
};
|
|
1035
|
+
return t;
|
|
1036
|
+
},
|
|
1037
|
+
banner: () => {}
|
|
1038
|
+
});
|
|
1039
|
+
},
|
|
1040
|
+
onDestroy: () => {
|
|
1041
|
+
"undefined" != typeof window && delete window.gstate;
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
};
|
|
1045
|
+
}, exports.deleteUserData = e => {
|
|
1046
|
+
const t = E();
|
|
1047
|
+
if (!t) throw new Error("[gstate] deleteUserData failed: No store found.");
|
|
1048
|
+
return t.deleteUserData(e);
|
|
1049
|
+
}, exports.deriveKeyFromPassword = async (e, t, n = 6e5) => {
|
|
1050
|
+
if (!r) throw new Error("Web Crypto API not available");
|
|
1051
|
+
const s = await crypto.subtle.importKey("raw", (new TextEncoder).encode(e), "PBKDF2", !1, [ "deriveKey" ]);
|
|
1052
|
+
return {
|
|
1053
|
+
key: await crypto.subtle.deriveKey({
|
|
1054
|
+
name: "PBKDF2",
|
|
1055
|
+
salt: new Uint8Array(t),
|
|
1056
|
+
iterations: n,
|
|
1057
|
+
hash: "SHA-256"
|
|
1058
|
+
}, s, {
|
|
1059
|
+
name: "AES-GCM",
|
|
1060
|
+
length: 256
|
|
1061
|
+
}, !0, [ "encrypt", "decrypt" ]),
|
|
1062
|
+
iv: crypto.getRandomValues(new Uint8Array(12))
|
|
1063
|
+
};
|
|
1064
|
+
}, exports.destroyState = () => {
|
|
1065
|
+
v && (v.destroy(), v = null);
|
|
1066
|
+
}, exports.destroySync = e => {
|
|
1067
|
+
const t = _.get(e);
|
|
1068
|
+
t && (t.destroy(), _.delete(e));
|
|
1069
|
+
}, exports.devToolsPlugin = e => {
|
|
1070
|
+
const t = globalThis.__REDUX_DEVTOOLS_EXTENSION__;
|
|
1071
|
+
if (!t?.connect) return {
|
|
1072
|
+
name: "gstate-devtools-noop",
|
|
1073
|
+
hooks: {}
|
|
1074
|
+
};
|
|
1075
|
+
let n = null;
|
|
1076
|
+
return {
|
|
1077
|
+
name: "gstate-devtools",
|
|
1078
|
+
hooks: {
|
|
1079
|
+
onInstall: ({store: s}) => {
|
|
1080
|
+
n = t.connect({
|
|
1081
|
+
name: e?.name || "Magnetar Store"
|
|
1082
|
+
}), n.init(s.list());
|
|
1083
|
+
},
|
|
1084
|
+
onSet: ({key: e, store: t}) => {
|
|
1085
|
+
e && n && n.send(`SET_${e.toUpperCase()}`, t.list());
|
|
1086
|
+
},
|
|
1087
|
+
onRemove: ({key: e, store: t}) => {
|
|
1088
|
+
e && n && n.send(`REMOVE_${e.toUpperCase()}`, t.list());
|
|
1089
|
+
}
|
|
1090
|
+
}
|
|
1091
|
+
};
|
|
1092
|
+
}, exports.exportKey = async e => {
|
|
1093
|
+
const t = await crypto.subtle.exportKey("raw", e.key);
|
|
1094
|
+
return {
|
|
1095
|
+
key: btoa(String.fromCharCode(...new Uint8Array(t))),
|
|
1096
|
+
iv: btoa(String.fromCharCode(...e.iv))
|
|
1097
|
+
};
|
|
1098
|
+
}, exports.exportUserData = e => {
|
|
1099
|
+
const t = E();
|
|
1100
|
+
if (!t) throw new Error("[gstate] exportUserData failed: No store found.");
|
|
1101
|
+
return t.exportUserData(e);
|
|
1102
|
+
}, exports.generateEncryptionKey = async () => {
|
|
1103
|
+
if (!r) throw new Error("Web Crypto API not available");
|
|
1104
|
+
return {
|
|
1105
|
+
key: await crypto.subtle.generateKey({
|
|
1106
|
+
name: "AES-GCM",
|
|
1107
|
+
length: 256
|
|
1108
|
+
}, !0, [ "encrypt", "decrypt" ]),
|
|
1109
|
+
iv: crypto.getRandomValues(new Uint8Array(12))
|
|
1110
|
+
};
|
|
1111
|
+
}, exports.generateSalt = (e = 32) => crypto.getRandomValues(new Uint8Array(e)),
|
|
1112
|
+
exports.getConsents = e => E()?.getConsents(e) ?? [], exports.getStore = E, exports.gstate = (e, t) => {
|
|
1113
|
+
const n = b("string" == typeof t ? {
|
|
1114
|
+
namespace: t
|
|
1115
|
+
} : t);
|
|
1116
|
+
e && Object.entries(e).forEach(([e, t]) => {
|
|
1117
|
+
null === n.get(e) && n._setSilently(e, t);
|
|
1118
|
+
});
|
|
1119
|
+
return "undefined" == typeof window || S() || (window.gstate = n, window.gState = n,
|
|
1120
|
+
window.rgs = n), Object.assign(e => k(e, n), n);
|
|
1121
|
+
}, exports.guardPlugin = e => ({
|
|
1122
|
+
name: "gstate-guard",
|
|
1123
|
+
hooks: {
|
|
1124
|
+
onBeforeSet: ({key: t, value: n, store: s}) => {
|
|
1125
|
+
if (!t) return;
|
|
1126
|
+
const r = e[t];
|
|
1127
|
+
r && r(n);
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
}), exports.hasConsent = (e, t) => E()?.hasConsent(e, t) ?? !1, exports.hasPermission = (e, t, n) => E()?.hasPermission(e, t, n) ?? !0,
|
|
1131
|
+
exports.immerPlugin = () => ({
|
|
1132
|
+
name: "gstate-immer",
|
|
1133
|
+
hooks: {
|
|
1134
|
+
onInstall: ({store: e}) => {
|
|
1135
|
+
e._registerMethod("immer", "setWithProduce", (t, n) => e.set(t, n));
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
}), exports.importKey = async (e, t) => {
|
|
1139
|
+
const n = Uint8Array.from(atob(e), e => e.charCodeAt(0)), s = Uint8Array.from(atob(t), e => e.charCodeAt(0));
|
|
1140
|
+
return {
|
|
1141
|
+
key: await crypto.subtle.importKey("raw", n, {
|
|
1142
|
+
name: "AES-GCM",
|
|
1143
|
+
length: 256
|
|
1144
|
+
}, !0, [ "encrypt", "decrypt" ]),
|
|
1145
|
+
iv: s
|
|
1146
|
+
};
|
|
1147
|
+
}, exports.indexedDBPlugin = (e = {}) => {
|
|
1148
|
+
const t = e.dbName || "rgs-db", n = e.storeName || "states", s = e.version || 1;
|
|
1149
|
+
let r = null;
|
|
1150
|
+
const o = () => new Promise((e, o) => {
|
|
1151
|
+
if (r) return e(r);
|
|
1152
|
+
const a = indexedDB.open(t, s);
|
|
1153
|
+
a.onerror = () => o(a.error), a.onsuccess = () => {
|
|
1154
|
+
r = a.result, e(r);
|
|
1155
|
+
}, a.onupgradeneeded = e => {
|
|
1156
|
+
const t = e.target.result;
|
|
1157
|
+
t.objectStoreNames.contains(n) || t.createObjectStore(n);
|
|
1158
|
+
};
|
|
1159
|
+
}), a = async e => {
|
|
1160
|
+
const t = await o();
|
|
1161
|
+
return new Promise((s, r) => {
|
|
1162
|
+
const o = t.transaction(n, "readonly").objectStore(n).get(e);
|
|
1163
|
+
o.onsuccess = () => s(o.result), o.onerror = () => r(o.error);
|
|
1164
|
+
});
|
|
1165
|
+
};
|
|
1166
|
+
return {
|
|
1167
|
+
name: "indexedDB",
|
|
1168
|
+
hooks: {
|
|
1169
|
+
onInstall: ({store: e}) => {
|
|
1170
|
+
e._registerMethod("indexedDB", "clear", async () => {
|
|
1171
|
+
(await o()).transaction(n, "readwrite").objectStore(n).clear();
|
|
1172
|
+
});
|
|
1173
|
+
},
|
|
1174
|
+
onInit: async ({store: e}) => {
|
|
1175
|
+
const t = (await o()).transaction(n, "readonly").objectStore(n).getAllKeys();
|
|
1176
|
+
t.onsuccess = async () => {
|
|
1177
|
+
const n = t.result, s = e.namespace + "_";
|
|
1178
|
+
for (const t of n) if (t.startsWith(s)) {
|
|
1179
|
+
const n = await a(t);
|
|
1180
|
+
if (n) {
|
|
1181
|
+
const r = t.substring(s.length);
|
|
1182
|
+
e._setSilently(r, n.d);
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
};
|
|
1186
|
+
},
|
|
1187
|
+
onSet: async ({key: e, value: t, store: s}) => {
|
|
1188
|
+
if (!e) return;
|
|
1189
|
+
const r = s.namespace + "_", a = {
|
|
1190
|
+
d: t,
|
|
1191
|
+
t: Date.now(),
|
|
1192
|
+
v: s._getVersion?.(e) || 1
|
|
1193
|
+
};
|
|
1194
|
+
await (async (e, t) => {
|
|
1195
|
+
const s = await o();
|
|
1196
|
+
return new Promise((r, o) => {
|
|
1197
|
+
const a = s.transaction(n, "readwrite").objectStore(n).put(t, e);
|
|
1198
|
+
a.onsuccess = () => r(), a.onerror = () => o(a.error);
|
|
1199
|
+
});
|
|
1200
|
+
})(`${r}${e}`, a);
|
|
1201
|
+
},
|
|
1202
|
+
onRemove: async ({key: e, store: t}) => {
|
|
1203
|
+
if (!e) return;
|
|
1204
|
+
const s = t.namespace + "_";
|
|
1205
|
+
await (async e => {
|
|
1206
|
+
const t = await o();
|
|
1207
|
+
return new Promise((s, r) => {
|
|
1208
|
+
const o = t.transaction(n, "readwrite").objectStore(n).delete(e);
|
|
1209
|
+
o.onsuccess = () => s(), o.onerror = () => r(o.error);
|
|
1210
|
+
});
|
|
1211
|
+
})(`${s}${e}`);
|
|
1212
|
+
}
|
|
1213
|
+
}
|
|
1214
|
+
};
|
|
1215
|
+
}, exports.initState = e => {
|
|
1216
|
+
const t = b(e);
|
|
1217
|
+
return v = t, t;
|
|
1218
|
+
}, exports.initSync = (e, t) => {
|
|
1219
|
+
const n = e.namespace;
|
|
1220
|
+
if (_.has(n)) return _.get(n);
|
|
1221
|
+
const s = new m(e, t);
|
|
1222
|
+
return _.set(n, s), s;
|
|
1223
|
+
}, exports.isCryptoAvailable = r, exports.logAudit = c, exports.loggerPlugin = e => ({
|
|
1224
|
+
name: "gstate-logger",
|
|
1225
|
+
hooks: {
|
|
1226
|
+
onSet: ({key: e, value: t, version: n}) => {
|
|
1227
|
+
(new Date).toLocaleTimeString();
|
|
1228
|
+
},
|
|
1229
|
+
onRemove: ({key: e}) => {},
|
|
1230
|
+
onTransaction: ({key: e}) => {}
|
|
1231
|
+
}
|
|
1232
|
+
}), exports.recordConsent = (e, t, n) => {
|
|
1233
|
+
const s = E();
|
|
1234
|
+
if (!s) throw new Error("[gstate] recordConsent failed: No store found. call initState() first.");
|
|
1235
|
+
return s.recordConsent(e, t, n);
|
|
1236
|
+
}, exports.revokeConsent = (e, t) => E()?.revokeConsent(e, t), exports.sanitizeValue = y,
|
|
1237
|
+
exports.schemaPlugin = e => ({
|
|
1238
|
+
name: "gstate-schema",
|
|
1239
|
+
hooks: {
|
|
1240
|
+
onSet: ({key: t, value: n}) => {
|
|
1241
|
+
if (!t) return;
|
|
1242
|
+
const s = e[t];
|
|
1243
|
+
if (s) {
|
|
1244
|
+
const e = s(n);
|
|
1245
|
+
if (!0 !== e) throw new Error(`[Schema Error] Validation failed for key "${t}": ${!1 === e ? "Invalid type" : e}`);
|
|
1246
|
+
}
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1249
|
+
}), exports.setAuditLogger = e => {
|
|
1250
|
+
i = e;
|
|
1251
|
+
}, exports.snapshotPlugin = () => {
|
|
1252
|
+
const e = new Map;
|
|
1253
|
+
return {
|
|
1254
|
+
name: "gstate-snapshot",
|
|
1255
|
+
hooks: {
|
|
1256
|
+
onInstall: ({store: t}) => {
|
|
1257
|
+
t._registerMethod("snapshot", "takeSnapshot", n => {
|
|
1258
|
+
e.set(n, t.list());
|
|
1259
|
+
}), t._registerMethod("snapshot", "restoreSnapshot", n => {
|
|
1260
|
+
const s = e.get(n);
|
|
1261
|
+
return !!s && (t.transaction(() => {
|
|
1262
|
+
Object.entries(s).forEach(([e, n]) => {
|
|
1263
|
+
t.set(e, n);
|
|
1264
|
+
});
|
|
1265
|
+
}), !0);
|
|
1266
|
+
}), t._registerMethod("snapshot", "listSnapshots", () => Array.from(e.keys())),
|
|
1267
|
+
t._registerMethod("snapshot", "deleteSnapshot", t => e.delete(t)), t._registerMethod("snapshot", "clearSnapshots", () => e.clear());
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
};
|
|
1271
|
+
}, exports.syncPlugin = e => {
|
|
1272
|
+
const t = new BroadcastChannel(e?.channelName || "gstate_sync");
|
|
1273
|
+
let n = !1;
|
|
1274
|
+
return {
|
|
1275
|
+
name: "gstate-sync",
|
|
1276
|
+
hooks: {
|
|
1277
|
+
onInstall: ({store: e}) => {
|
|
1278
|
+
t.onmessage = t => {
|
|
1279
|
+
const {key: s, value: r, action: o} = t.data;
|
|
1280
|
+
s && (n = !0, "REMOVE" === o ? e.remove(s) : e.set(s, r), n = !1);
|
|
1281
|
+
};
|
|
1282
|
+
},
|
|
1283
|
+
onSet: ({key: e, value: s}) => {
|
|
1284
|
+
e && !n && t.postMessage({
|
|
1285
|
+
key: e,
|
|
1286
|
+
value: s,
|
|
1287
|
+
action: "SET"
|
|
1288
|
+
});
|
|
1289
|
+
},
|
|
1290
|
+
onRemove: ({key: e}) => {
|
|
1291
|
+
e && !n && t.postMessage({
|
|
1292
|
+
key: e,
|
|
1293
|
+
action: "REMOVE"
|
|
1294
|
+
});
|
|
1295
|
+
},
|
|
1296
|
+
onDestroy: () => {
|
|
1297
|
+
t.close();
|
|
1298
|
+
}
|
|
1299
|
+
}
|
|
1300
|
+
};
|
|
1301
|
+
}, exports.triggerSync = async e => {
|
|
1302
|
+
const t = e || v?.namespace;
|
|
1303
|
+
if (!t) return;
|
|
1304
|
+
const n = _.get(t);
|
|
1305
|
+
n && await n.flush();
|
|
1306
|
+
}, exports.undoRedoPlugin = e => {
|
|
1307
|
+
let t = [], n = -1, s = !1;
|
|
1308
|
+
const r = e?.limit || 50;
|
|
1309
|
+
return {
|
|
1310
|
+
name: "gstate-undo-redo",
|
|
1311
|
+
hooks: {
|
|
1312
|
+
onInstall: ({store: e}) => {
|
|
1313
|
+
t.push(e.list()), n = 0, e._registerMethod("undoRedo", "undo", () => {
|
|
1314
|
+
if (n > 0) {
|
|
1315
|
+
s = !0, n--;
|
|
1316
|
+
const r = t[n];
|
|
1317
|
+
return !!r && (Object.entries(r).forEach(([t, n]) => {
|
|
1318
|
+
e._setSilently(t, n);
|
|
1319
|
+
}), s = !1, !0);
|
|
1320
|
+
}
|
|
1321
|
+
return !1;
|
|
1322
|
+
}), e._registerMethod("undoRedo", "redo", () => {
|
|
1323
|
+
if (n < t.length - 1) {
|
|
1324
|
+
s = !0, n++;
|
|
1325
|
+
const r = t[n];
|
|
1326
|
+
return !!r && (Object.entries(r).forEach(([t, n]) => {
|
|
1327
|
+
e._setSilently(t, n);
|
|
1328
|
+
}), s = !1, !0);
|
|
1329
|
+
}
|
|
1330
|
+
return !1;
|
|
1331
|
+
}), e._registerMethod("undoRedo", "canUndo", () => n > 0), e._registerMethod("undoRedo", "canRedo", () => n < t.length - 1);
|
|
1332
|
+
},
|
|
1333
|
+
onSet: ({store: e}) => {
|
|
1334
|
+
s || (n < t.length - 1 && (t = t.slice(0, n + 1)), t.push(e.list()), t.length > r ? t.shift() : n++);
|
|
1335
|
+
}
|
|
1336
|
+
}
|
|
1337
|
+
};
|
|
1338
|
+
}, exports.useGState = k, exports.useIsStoreReady = e => {
|
|
1339
|
+
const n = e || v, s = t.useMemo(() => e => n ? n._subscribe(e) : () => {}, [ n ]);
|
|
1340
|
+
return t.useSyncExternalStore(s, () => !!n && n.isReady, () => !0);
|
|
1341
|
+
}, exports.useSimpleState = k, exports.useStore = k, exports.useSyncStatus = () => {
|
|
1342
|
+
const [e, n] = t.useState({
|
|
1343
|
+
isOnline: !0,
|
|
1344
|
+
isSyncing: !1,
|
|
1345
|
+
lastSyncTimestamp: null,
|
|
1346
|
+
pendingChanges: 0,
|
|
1347
|
+
conflicts: 0
|
|
1348
|
+
});
|
|
1349
|
+
return t.useEffect(() => {
|
|
1350
|
+
const e = () => {
|
|
1351
|
+
let e = !0, t = !1, s = 0, r = 0;
|
|
1352
|
+
_.forEach(n => {
|
|
1353
|
+
const o = n.getState();
|
|
1354
|
+
e = e && o.isOnline, t = t || o.isSyncing, s += o.pendingChanges, r += o.conflicts;
|
|
1355
|
+
}), n({
|
|
1356
|
+
isOnline: e,
|
|
1357
|
+
isSyncing: t,
|
|
1358
|
+
lastSyncTimestamp: null,
|
|
1359
|
+
pendingChanges: s,
|
|
1360
|
+
conflicts: r
|
|
1361
|
+
});
|
|
1362
|
+
};
|
|
1363
|
+
e();
|
|
1364
|
+
const t = Array.from(_.values()).map(t => t.onStateChange(e));
|
|
1365
|
+
return () => t.forEach(e => e());
|
|
1366
|
+
}, []), e;
|
|
1367
|
+
}, exports.useSyncedState = function(e, n) {
|
|
1368
|
+
const s = n || v, r = s?.namespace || "default", o = _.get(r), a = k(e, s), i = a[0], c = a[1], [l, u] = t.useState(() => o?.getState() || {
|
|
1369
|
+
isOnline: !0,
|
|
1370
|
+
isSyncing: !1,
|
|
1371
|
+
lastSyncTimestamp: null,
|
|
1372
|
+
pendingChanges: 0,
|
|
1373
|
+
conflicts: 0
|
|
1374
|
+
});
|
|
1375
|
+
return t.useEffect(() => {
|
|
1376
|
+
if (!o) return;
|
|
1377
|
+
return o.onStateChange(u);
|
|
1378
|
+
}, [ o ]), [ i, t.useCallback((t, n) => {
|
|
1379
|
+
const r = c(t, n);
|
|
1380
|
+
if (r && o) {
|
|
1381
|
+
const t = s?.get(e);
|
|
1382
|
+
o.queueChange(e, t);
|
|
1383
|
+
}
|
|
1384
|
+
return r;
|
|
1385
|
+
}, [ c, o, e, s ]), l ];
|
|
1386
|
+
}, exports.validateKey = d;
|