synapse-storage 3.0.15 → 3.0.19

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/dist/react.js CHANGED
@@ -1 +1 @@
1
- import{useEffect as $,useRef as R,useState as A}from"react";var f=new Map;function k(o,e){let[t,l]=A(e?.initialValue),[a,p]=A(!!e?.withLoading),c=R(e?.initialValue),i=R(e?.equals||((n,s)=>n===s)),S=o.getId(),u=n=>{(c.current===void 0||!i.current(n,c.current))&&(c.current=n,l(n))};return $(()=>{f.has(S)||f.set(S,{lastValue:void 0,listeners:new Set,unsubscribe:null});let n=f.get(S);return n.listeners.add(u),n.lastValue!==void 0?(u(n.lastValue),e?.withLoading&&p(!1)):(e?.withLoading&&p(!0),o.select().then(s=>{n.lastValue=s,n.listeners.forEach(T=>T(s)),e?.withLoading&&p(!1)}).catch(s=>{e?.withLoading&&p(!1)})),n.unsubscribe||(n.unsubscribe=o.subscribe({notify:s=>{n.lastValue=s,n.listeners.forEach(T=>{try{T(s)}catch{}})}})),()=>{let s=f.get(S);s&&(s.listeners.delete(u),s.listeners.size===0&&(s.unsubscribe&&s.unsubscribe(),f.delete(S)))}},[o,S]),e?.withLoading?{data:t,isLoading:a}:t}import{useEffect as z,useState as F}from"react";var U=(o,e)=>{let[t,l]=F(void 0);return z(()=>{let a=!0;(async()=>{try{let i=await o.getState(),S=e(i);a&&l(S)}catch{}})();let c;try{c=o.subscribe(e,i=>{a&&l(i)})}catch{c=()=>{}}return()=>{a=!1,c()}},[o,e]),t};import{createContext as N,useContext as y,useEffect as E,useRef as _,useState as w}from"react";var h=(o,e)=>{for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&(typeof e[t]=="object"&&e[t]!==null&&!Array.isArray(e[t])?((!o[t]||typeof o[t]!="object")&&(o[t]={}),h(o[t],e[t])):o[t]=e[t])};var Z=globalThis.console;import{jsx as m}from"react/jsx-runtime";var g="useSynapseActions \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430 contextSynapse";function pe(o,e){let{loadingComponent:t=null,mergeFn:l=h}=e||{},a=null,p=!1,c=(async()=>{try{a=await(o instanceof Promise?o:Promise.resolve(o)),p=!0}catch{}})(),i=N(null),S=()=>{let r=y(i);if(!r)throw new Error(g);return r.storage},u=()=>{let r=y(i);if(!r)throw new Error(g);return r.selectors},n=()=>{let r=y(i);if(!r)throw new Error(g);if("actions"in r)return r.actions;throw new Error("useSynapseActions: actions \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0442\u0438\u043F\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u043D\u0430 \u0444\u0443\u043D\u043A\u0446\u0438\u044F createDispatcherFn \u043F\u0440\u0438 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0438 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430.")},s=()=>{let r=y(i);if(!r)throw new Error(g);if("state$"in r)return r.state$;throw new Error("useSynapseState$: state$ \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0442\u0438\u043F\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u043D\u044B \u0444\u0443\u043D\u043A\u0446\u0438\u0438 createDispatcherFn \u0438 createEffectConfig \u043F\u0440\u0438 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0438 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430.")};function T(r){function C({contextProps:d,...O}){let[W,L]=w(!1),[x,V]=w(p),D=_(`synapse-${a?.storage.name||"initializing"}`);return E(()=>{p||c.then(()=>{V(!0)})},[]),E(()=>{if(!x)return;let b=!0;return(async()=>{try{a&&d&&Object.keys(d).length>0&&await a.storage.update(P=>{l(P,d)}),b&&L(!0)}catch{}})(),()=>{b=!1}},[d,x]),x?W?m(i.Provider,{value:a,children:m(r,{...O})}):t||m("div",{children:"\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430..."}):t||m("div",{children:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430..."})}let v=r.displayName||r.name||"Component";return C.displayName=`SynapseContext(${v})`,C}return{contextSynapse:T,useSynapseStorage:S,useSynapseSelectors:u,useSynapseActions:n,useSynapseState$:s,cleanupSynapse:async()=>(await c,a?.destroy()||Promise.resolve())}}export{pe as createSynapseCtx,k as useSelector,U as useStorageSubscribe};
1
+ import{useCallback as Y,useEffect as k,useMemo as ne,useRef as se,useState as oe}from"react";var A=class{static instances=new Map;static configs=new Map;static logger;static setLogger(e){this.logger=e}static getOrCreate(e,t,n){let r=this.configs.get(e),s=this.instances.get(e);if(s&&r){let o=this.mergeConfigurations(r,t);return{instance:s,isNewInstance:!1,appliedConfig:o.finalConfig,conflicts:o.conflicts}}let a=n(t);return this.instances.set(e,a),this.configs.set(e,{...t}),this.logger?.debug(`Created new singleton instance: ${e}`),{instance:a,isNewInstance:!0,appliedConfig:t,conflicts:[]}}static exists(e){return this.instances.has(e)}static getConfig(e){return this.configs.get(e)}static remove(e){let t=this.instances.get(e);return t?(typeof t.destroy=="function"&&t.destroy(),this.instances.delete(e),this.configs.delete(e),this.logger?.debug(`Removed singleton instance: ${e}`),!0):!1}static clear(){for(let[e,t]of this.instances)typeof t.destroy=="function"&&t.destroy();this.instances.clear(),this.configs.clear(),this.logger?.debug("Cleared all singleton instances")}static getStats(){return{instanceCount:this.instances.size,instances:Array.from(this.instances.keys())}}static mergeConfigurations(e,t){let n=t.singleton?.mergeStrategy||"first_wins",r=t.singleton?.warnOnConflict??!0;switch(n){case"strict":return this.strictMerge(e,t);case"first_wins":return this.firstWinsMerge(e,t,r);case"deep_merge":return this.deepMerge(e,t);case"override":return this.overrideMerge(e,t);case"warn_and_use_first":return this.warnAndUseFirst(e,t);default:return this.firstWinsMerge(e,t,r)}}static strictMerge(e,t){let n=this.findConflicts(e,t);if(n.length>0)throw new Error(`Strict singleton validation failed for "${e.name}". Conflicts: ${n.join(", ")}`);return{finalConfig:e,conflicts:[]}}static firstWinsMerge(e,t,n){let r=this.findConflicts(e,t);return n&&r.length>0&&(this.logger?.warn(`Singleton config conflicts for "${e.name}":`,r),this.logger?.warn("Using existing configuration")),{finalConfig:e,conflicts:r}}static deepMerge(e,t){let n=this.findConflicts(e,t),r={...e,initialState:this.deepMergeObjects(e.initialState||{},t.initialState||{})};return this.logger?.debug(`Deep merged singleton config for "${e.name}"`),{finalConfig:r,conflicts:n}}static overrideMerge(e,t){let n=this.findConflicts(e,t),r={...t,name:e.name};return this.logger?.warn(`Overriding singleton config for "${e.name}"`),{finalConfig:r,conflicts:n}}static warnAndUseFirst(e,t){let n=this.findConflicts(e,t);return n.length>0&&(this.logger?.warn(`Configuration conflicts detected for singleton "${e.name}":`),this.logger?.warn("Existing config:",e),this.logger?.warn("Incoming config:",t),this.logger?.warn("Using existing configuration")),{finalConfig:e,conflicts:n}}static findConflicts(e,t){let n=[];if(e.initialState&&t.initialState){let r=this.findObjectConflicts(e.initialState,t.initialState,"initialState");n.push(...r)}else e.initialState!==t.initialState&&n.push("initialState: one is undefined");return!!e.middlewares!=!!t.middlewares&&n.push("middlewares: configuration differs"),n}static findObjectConflicts(e,t,n){let r=[],s=new Set([...Object.keys(e||{}),...Object.keys(t||{})]);for(let a of s){let o=`${n}.${a}`,i=e?.[a],c=t?.[a];i!==c&&(i===void 0||c===void 0?r.push(`${o}: missing in one config`):typeof i!=typeof c?r.push(`${o}: type mismatch (${typeof i} vs ${typeof c})`):typeof i=="object"&&i!==null&&c!==null?r.push(...this.findObjectConflicts(i,c,o)):r.push(`${o}: value mismatch (${i} vs ${c})`))}return r}static deepMergeObjects(e,t){let n={...e};for(let r in t)t[r]!==null&&typeof t[r]=="object"&&!Array.isArray(t[r])?n[r]=this.deepMergeObjects(e[r]||{},t[r]):n[r]=t[r];return n}},C=class{static generate(e,t){return e.singleton?.key?e.singleton.key:`${t}_${e.name}`}};var x=class{static handleSingletonCreation(e,t,n,r){if(!e.singleton?.enabled)return n(e);r&&A.setLogger(r);let s=C.generate(e,t),a=A.getOrCreate(s,e,n);return a.isNewInstance?r?.debug(`Created new singleton storage: ${s}`):(r?.debug(`Reusing existing singleton storage: ${s}`),a.conflicts&&a.conflicts.length>0&&r?.debug(`Configuration conflicts detected: ${a.conflicts.join(", ")}`)),a.instance}};var h=class{constructor(e,t=!1){this.value=e;this.isRawKey=t}toString(){return this.value}toJSON(){return this.value}valueOf(){return this.value}isUnparseable(){return this.isRawKey}};var q=(g={})=>{let e=g.batchSize??10,t=g.batchDelay??10,n=new Map,r=new Map,s=u=>u.type==="set"||u.type==="update",a=u=>`${u.type}_${u.key?.toString()||"default"}`,o=u=>{let p=new Map;for(let y of u){let S=`${y.type}_${y.key?.toString()||"default"}`;p.set(S,y)}return Array.from(p.values())},i=u=>{let p=r.get(u);p&&(globalThis.clearTimeout(p),r.delete(u))},c=(u,p)=>{let y=globalThis.setTimeout(p,t);r.set(u,y)},l=async(u,p,y)=>{let S=n.get(u);if(!(!S||S.length===0)){n.delete(u),i(u);try{let m=S.map(f=>f.action),T=o(m);for(let f of T)try{let P=await y(f);S.filter(b=>b.action.type===f.type&&b.action.key?.toString()===f.key?.toString()).forEach(b=>b.resolve(P))}catch(P){S.filter(b=>b.action.type===f.type&&b.action.key?.toString()===f.key?.toString()).forEach(b=>b.reject(P))}}catch(m){S.forEach(T=>T.reject(m))}}},d=async(u,p,y)=>new Promise((S,m)=>{let T=a(u),f=n.get(T);f||(f=[],n.set(T,f)),f.push({action:u,resolve:S,reject:m,timestamp:Date.now()}),i(T),f.length>=e?setImmediate(()=>l(T,p,y)):c(T,()=>l(T,p,y))});return{name:"batching",setup:()=>{},cleanup:async()=>{r.forEach(u=>globalThis.clearTimeout(u)),r.clear(),n.clear()},reducer:u=>p=>async y=>s(y)?d(y,u,p):p(y)}};var H=(g={})=>{let{comparator:e=(r,s)=>{if(r===s)return!0;if(typeof r!="object"||typeof s!="object"||r===null||s===null)return r===s;let a=Object.keys(r),o=Object.keys(s);return a.length!==o.length?!1:a.every(i=>Object.prototype.hasOwnProperty.call(s,i)&&r[i]===s[i])},segments:t=[]}=g,n=new Map;return{name:"shallow-compare",setup:r=>{},reducer:r=>s=>async a=>{if(a.type!=="set"||t.length&&!t.includes(a.metadata?.segment??"default"))return s(a);let o=a.key,i=n.get(o),c=a.value;if(i!==void 0&&e(i,c))return{...i,t:{valueNotChanged:!0,originalValue:i}};let l=await s(a);return n.set(o,c),l}}};var N=class{middlewares=[];api;initialized=!1;dispatchFn;constructor(e){this.api={dispatch:async t=>this.dispatch(t),getState:()=>e.getState(),storage:{doGet:e.doGet.bind(e),doSet:e.doSet.bind(e),doUpdate:e.doUpdate.bind(e),doDelete:e.doDelete.bind(e),doClear:e.doClear.bind(e),doKeys:e.doKeys.bind(e),notifySubscribers:e.notifySubscribers.bind(e)}}}async baseOperation(e){let{processed:t,...n}=e.metadata||{},r={...e,metadata:n};switch(r.type){case"get":return this.api.storage.doGet(r.key);case"set":return await this.api.storage.doSet(r.key,r.value),this.api.storage.doGet(r.key);case"update":return Array.isArray(r.value)?(await this.api.storage.doUpdate(r.value),this.api.storage.doGet("")):r.value;case"delete":return this.api.storage.doDelete(r.key);case"clear":return this.api.storage.doClear();case"init":{let s=await this.api.storage.doGet("");return Object.keys(s||{}).length>0?s:r.value?(await this.api.storage.doSet("",r.value),this.api.storage.doGet("")):s}case"keys":return this.api.storage.doKeys();default:throw new Error(`Unknown action type: ${r.type}`)}}initializeMiddlewares(){if(this.initialized)return;let e=this.baseOperation.bind(this);for(let t of[...this.middlewares].reverse()){let n=e;e=async r=>{if(r.metadata?.processed)return n(r);let s={...r,metadata:{...r.metadata,processed:!0,timestamp:r.metadata?.timestamp||Date.now()}};return t.reducer(this.api)(n)(s)}}this.dispatchFn=e,this.initialized=!0}use(e){e.setup&&e.setup(this.api),this.middlewares.push(e),this.initialized=!1}async dispatch(e){this.initialized||this.initializeMiddlewares();try{return this.dispatchFn(e)}catch(t){throw t}}};function w(g){return g instanceof h&&g.isUnparseable()?[g.toString()]:g.toString().replace(/\[/g,".").replace(/\]/g,"").split(".").filter(Boolean)}function v(g,e){return w(e).reduce((n,r)=>n===void 0?void 0:n[r],g)}function E(g,e,t){if(e==="")return t;let n=w(e);if(e instanceof h&&e.isUnparseable())return g[e.toString()]=t,g;let r=n.pop(),s=n.reduce((a,o)=>{let i=n[n.indexOf(o)+1],c=!Number.isNaN(Number(i));return o in a||(a[o]=c?[]:{}),a[o]},g);return s[r]=t,g}var R=class g{constructor(e,t,n,r){this.config=e;this.pluginExecutor=t;this.eventEmitter=n;this.logger=r;this.name=e.name,this.middlewareModule=new N({getState:this.getState.bind(this),doGet:this.doGet.bind(this),doSet:this.doSet.bind(this),doUpdate:this.doUpdate.bind(this),doDelete:this.doDelete.bind(this),doClear:this.doClear.bind(this),doKeys:this.doKeys.bind(this),notifySubscribers:this.notifySubscribers.bind(this),pluginExecutor:this.pluginExecutor,eventEmitter:this.eventEmitter,logger:this.logger}),this.initializeMiddlewares()}static GLOBAL_SUBSCRIPTION_KEY="*";static STORAGE_TYPE;name;e={status:"idle"};statusSubscribers=new Set;selectorPathCache=new WeakMap;middlewareModule;initializedMiddlewares=null;subscribers=new Map;get initStatus(){return{...this.e}}async waitForReady(){if(this.e.status==="ready")return this;if(this.e.status==="error")throw this.e.error||new Error("Storage initialization failed");return new Promise((e,t)=>{let n=this.onStatusChange(r=>{r.status==="ready"?(n(),e(this)):r.status==="error"&&(n(),t(r.error||new Error("Storage initialization failed")))})})}onStatusChange(e){return this.statusSubscribers.add(e),e(this.initStatus),()=>{this.statusSubscribers.delete(e)}}updateInitStatus(e){let t=this.e.status;this.e={...this.e,...e},t!==this.e.status&&this.logger?.debug(`Storage "${this.name}" status changed: ${t} -> ${this.e.status}`);let n=this.initStatus;this.statusSubscribers.forEach(r=>{try{r(n)}catch(s){this.logger?.error("Error in status change callback",{error:s})}})}async initialize(){if(this.e.status==="ready")return this;if(this.e.status==="loading")return this.waitForReady();this.updateInitStatus({status:"loading",error:void 0});try{let e=await this.doInitialize();return this.updateInitStatus({status:"ready",error:void 0}),e}catch(e){throw this.updateInitStatus({status:"error",error:e instanceof Error?e:new Error(String(e))}),e}}ensureReady(){if(this.e.status!=="ready")throw new Error(`Storage "${this.name}" is not ready. Current status: ${this.e.status}`)}initializeMiddlewares(){this.config.middlewares&&!this.initializedMiddlewares&&(this.initializedMiddlewares=this.config.middlewares(()=>this.getDefaultMiddleware()),this.initializedMiddlewares.forEach(e=>this.middlewareModule.use(e)))}getDefaultMiddleware(){return{batching:(e={})=>q(e),shallowCompare:(e={})=>H(e)}}async initializeWithMiddlewares(){try{let e=await this.getState();!(Object.keys(e).length>0)&&this.config.initialState&&await this.middlewareModule.dispatch({type:"init",value:this.config.initialState})}catch(e){throw this.logger?.error("\u041E\u0448\u0438\u0431\u043A\u0430 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430",{error:e}),e}}async get(e){this.ensureReady();try{let t={operation:"get",timestamp:Date.now(),key:e},n=await this.middlewareModule.dispatch({type:"get",key:e,metadata:t}),r=await this.pluginExecutor?.executeAfterGet(e,n,t)??n;return await this.emitEvent({type:"storage:select",payload:{key:e,value:r}}),r}catch(t){throw this.logger?.error("Error getting value",{key:e,error:t}),t}}async set(e,t){this.ensureReady();try{let n={operation:"set",timestamp:Date.now(),key:e},r=await this.pluginExecutor?.executeBeforeSet(t,n)??t,s=await this.middlewareModule.dispatch({type:"set",key:e,value:r,metadata:n}),a=s?.t?.valueNotChanged===!0,o;if(a&&s?.t?.originalValue!==void 0?o=s.t.originalValue:o=await this.pluginExecutor?.executeAfterSet(e,s,n)??s,!a){let c=[e.toString()];this.notifySubscribers(e,o),this.notifySubscribers(g.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:o,changedPaths:c}),await this.emitEvent({type:"storage:update",payload:{key:e,value:o,changedPaths:c}})}}catch(n){throw this.logger?.error("Error setting value",{key:e,error:n}),n}}async update(e){this.ensureReady();try{let t={operation:"update",timestamp:Date.now()},n=await this.getState(),r=structuredClone(n);e(r);let s=this.findChangedPaths(n,r);if(s.size===0){this.logger?.debug&&this.logger.debug("No changes detected in update");return}this.logger?.debug&&this.logger.debug("Changed paths:",{paths:Array.from(s)});let a=new Set;for(let u of s){let p=u.split(".")[0];a.add(p)}let o=await Promise.all(Array.from(a).map(async u=>{let p={...t,key:u},y=await this.pluginExecutor?.executeBeforeSet(r[u],p)??r[u];return{key:u,value:y}})),i=await this.middlewareModule.dispatch({type:"update",value:o,metadata:{...t,batchUpdate:!0,changedPaths:Array.from(s)}}),c={};Array.isArray(i)?i.forEach(u=>{u&&typeof u=="object"&&"key"in u&&"value"in u&&(c[u.key]=u.value)}):i&&typeof i=="object"&&(c={...i});let l=Object.keys(c).filter(u=>!this.isEqual(n[u],c[u]));if(l.length===0){this.logger?.debug&&this.logger.debug("No actual changes after middleware processing");return}let d={};l.forEach(u=>{d[u]=c[u]}),this.logger?.debug&&this.logger.debug("Notifying subscribers about changes:",{keys:l}),this.notifySubscribers(g.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:l,value:d,changedPaths:Array.from(s)});for(let u of s)try{let p=u.split(".")[0];if(p in d){let y;if(u===p)y=d[p];else{let S=u.substring(p.length+1);y=v(d[p],S)}y!==void 0&&this.notifySubscribers(u,y)}}catch(p){this.logger?.error("Error notifying path subscribers",{path:u,error:p})}await this.emitEvent({type:"storage:update",payload:{state:d,key:l,changedPaths:Array.from(s)}})}catch(t){throw this.logger?.error("Error updating state",{error:t}),t}}async delete(e){this.ensureReady();try{let t={operation:"delete",timestamp:Date.now(),key:e};if(await this.pluginExecutor?.executeBeforeDelete(e,t)===!1)return;let r=await this.middlewareModule.dispatch({type:"delete",key:e,metadata:t});if(r===!1)return;await this.pluginExecutor?.executeAfterDelete(e,t);let a=[e.toString()];this.notifySubscribers(e,void 0),this.notifySubscribers(g.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:void 0,result:r,changedPaths:a}),await this.emitEvent({type:"storage:update",payload:{key:e,value:void 0,result:r,changedPaths:a}})}catch(t){throw this.logger?.error("Error deleting value",{key:e,error:t}),t}}async clear(){this.ensureReady();try{this.pluginExecutor?.executeOnClear(),await this.middlewareModule.dispatch({type:"clear"})}catch(e){throw this.logger?.error("Error clearing storage",{error:e}),e}}async keys(){this.ensureReady();try{return await this.middlewareModule.dispatch({type:"keys"})}catch(e){throw this.logger?.error("Error getting keys",{error:e}),e}}async has(e){this.ensureReady();try{return await this.doHas(e)}catch(t){throw this.logger?.error("Error checking value existence",{key:e,error:t}),t}}async getState(){try{return await this.doGet("")||{}}catch(e){throw this.logger?.error("Error getting state",{error:e}),e}}subscribeToAll(e){return this.subscribers.has(g.GLOBAL_SUBSCRIPTION_KEY)||this.subscribers.set(g.GLOBAL_SUBSCRIPTION_KEY,new Set),this.subscribers.get(g.GLOBAL_SUBSCRIPTION_KEY).add(e),()=>{let t=this.subscribers.get(g.GLOBAL_SUBSCRIPTION_KEY);t&&(t.delete(e),t.size===0&&this.subscribers.delete(g.GLOBAL_SUBSCRIPTION_KEY))}}subscribe(e,t){return typeof e=="string"?this.subscribeByKey(e,t):this.subscribeBySelector(e,t)}async destroy(){try{if(await this.clear(),await this.doDestroy(),this.initializedMiddlewares&&(await Promise.all(this.initializedMiddlewares.map(async e=>{"cleanup"in e&&await e.cleanup?.()})),this.initializedMiddlewares=null),this.statusSubscribers.clear(),this.config.singleton?.enabled){let e=this.constructor.STORAGE_TYPE,t=C.generate(this.config,e);A.remove(t)}this.updateInitStatus({status:"idle"}),await this.emitEvent({type:"storage:destroy"})}catch(e){throw this.logger?.error("Error destroying storage",{error:e}),e}}subscribeByKey(e,t){this.subscribers.has(e)||this.subscribers.set(e,new Set);let n=!1;return this.subscribers.get(e).add(t),this.get(e).then(r=>{try{n||(n=!0,t(r))}catch(s){this.logger?.error("Error in initial callback",{key:e,error:s})}}),()=>{let r=this.subscribers.get(e);r&&(r.delete(t),r.size===0&&this.subscribers.delete(e))}}createDummyState(){let e={get:(t,n)=>(t[n]=t[n]||new Proxy({},e),t[n])};return new Proxy({},e)}isEqual(e,t){if(e===t)return!0;if(e==null||t==null)return e===t;let n=typeof e;if(n!==typeof t)return!1;if(n!=="object")return e===t;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let o=0;o<e.length;o++)if(!this.isEqual(e[o],t[o]))return!1;return!0}let s=Object.keys(e),a=Object.keys(t);return s.length!==a.length?!1:s.every(o=>Object.prototype.hasOwnProperty.call(t,o)&&this.isEqual(e[o],t[o]))}extractPath(e,t){if(this.selectorPathCache.has(e))return this.selectorPathCache.get(e);let n=[],r=(s="")=>({get:(a,o)=>{if(typeof o=="symbol")return Reflect.get(a,o);let i=s?`${s}.${o}`:o;return n.push(i),new Proxy({},r(i))},has:(a,o)=>!0,ownKeys:()=>[],getOwnPropertyDescriptor:()=>({configurable:!0,enumerable:!0}),apply:(a,o,i)=>new Proxy(()=>{},r(s))});try{e(new Proxy(t,r()))}catch{}return n.length===0?"":(n.sort((s,a)=>a.length-s.length),this.selectorPathCache.set(e,n[0]),n[0])}notifySubscribers(e,t){let n=e.toString(),r=this.subscribers.get(n);r?.size&&new Set(r).forEach(a=>{try{a(t)}catch(o){this.logger?.error("\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043E\u0434\u043F\u0438\u0441\u0447\u0438\u043A\u0435 \u043D\u0430 \u043A\u043E\u043B\u0431\u044D\u043A",{key:n,error:o})}})}findChangedPaths(e,t,n="",r=new Set,s=new WeakMap){if(e===t)return r;if(typeof e!="object"||typeof t!="object"||e===null||t===null)return e!==t&&r.add(n||""),r;if(s.has(e))return r;s.set(e,!0);let a=new Set([...Object.keys(e||{}),...Object.keys(t||{})]);for(let o of a){let i=e[o],c=t[o];if(i===c)continue;let l=n?`${n}.${o}`:o;i&&c&&typeof i=="object"&&typeof c=="object"&&!Array.isArray(i)&&!Array.isArray(c)?this.findChangedPaths(i,c,l,r,s):Array.isArray(i)&&Array.isArray(c)?this.isEqual(i,c)||r.add(l):this.isEqual(i,c)||r.add(l)}return r}subscribeBySelector(e,t){let n=this.createDummyState(),r=this.extractPath(e,n);this.logger?.debug&&this.logger.debug("Subscribing to path:",{path:r});let s=async a=>{try{if(a==null){let c=await this.getState(),l=e(c);t(l);return}if(typeof a!="object"||a===null){t(a);return}let o=await this.getState(),i=e(o);t(i)}catch(o){this.logger?.error("Error in selector callback",{path:r,error:o}),t(a)}};return r?this.subscribeByKey(r,s):this.subscribeToAll(()=>{this.getState().then(a=>{t(e(a))})})}async emitEvent(e){try{await this.eventEmitter?.emit({...e,metadata:{...e.metadata||{},timestamp:Date.now(),storageName:this.name}})}catch(t){this.logger?.error("Error emitting event",{event:e,error:t})}}};var j=class g{constructor(e,t,n){this.dbName=e;this.logger=n;this.dbVersion=t}static instances=new Map;db=null;initPromise=null;storeNames=new Set;dbVersion;static getInstance(e,t=1,n){g.instances.has(e)||g.instances.set(e,new g(e,t,n));let r=g.instances.get(e);return t>r.dbVersion&&(r.dbVersion=t),r}async initialize(){return this.db?this.db:(this.initPromise||(this.initPromise=this.openDatabase()),this.initPromise)}async ensureStoreExists(e){if(await this.initialize(),this.db.objectStoreNames.contains(e))return this.storeNames.add(e),this.db;this.logger?.debug(`Store "${e}" not found, upgrading database`,{dbName:this.dbName,currentStores:Array.from(this.db.objectStoreNames)}),this.db.close(),this.db=null,this.dbVersion++,this.initPromise=this.openDatabase([e]);let t=await this.initPromise;return this.storeNames.add(e),t}async openDatabase(e=[]){return new Promise((t,n)=>{this.logger?.debug(`Opening database "${this.dbName}" with version ${this.dbVersion}`);let r=indexedDB.open(this.dbName,this.dbVersion);r.onerror=()=>{this.logger?.error(`Failed to open database "${this.dbName}"`,{error:r.error}),n(r.error)},r.onsuccess=()=>{this.db=r.result;for(let s=0;s<this.db.objectStoreNames.length;s++)this.storeNames.add(this.db.objectStoreNames[s]);this.logger?.debug(`Database "${this.dbName}" opened successfully`,{version:this.db.version,stores:Array.from(this.db.objectStoreNames)}),t(this.db)},r.onupgradeneeded=s=>{let a=s.target.result;this.logger?.debug(`Upgrading database "${this.dbName}" to version ${this.dbVersion}`);for(let o of e)a.objectStoreNames.contains(o)||(this.logger?.debug(`Creating store "${o}"`),a.createObjectStore(o))}})}closeDatabase(){this.db&&(this.db.close(),this.db=null,this.initPromise=null)}async deleteDatabase(){return this.closeDatabase(),new Promise((e,t)=>{let n=indexedDB.deleteDatabase(this.dbName);n.onsuccess=()=>{this.logger?.debug(`Database "${this.dbName}" deleted successfully`),g.instances.delete(this.dbName),this.storeNames.clear(),e()},n.onerror=()=>{this.logger?.error(`Failed to delete database "${this.dbName}"`,{error:n.error}),t(n.error)}})}async ensureStoresExist(e){await this.initialize();let t=e.filter(n=>!this.db.objectStoreNames.contains(n));return t.length===0?this.db:(this.logger?.debug(`\u0421\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u044E\u0449\u0438\u0445 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449: ${t.join(", ")}`,{dbName:this.dbName,currentStores:Array.from(this.db.objectStoreNames)}),this.db.close(),this.db=null,this.dbVersion++,this.initPromise=this.openDatabase(t),this.initPromise)}getCurrentVersion(){return this.dbVersion}},_=class{constructor(e,t=1,n){this.dbName=e;this.logger=n;this.version=t}db=null;version;getCurrentVersion(){return this.version}openDatabase(e,t=[]){return new Promise((n,r)=>{this.logger?.debug(`\u041E\u0442\u043A\u0440\u044B\u0442\u0438\u0435 \u0431\u0430\u0437\u044B \u0434\u0430\u043D\u043D\u044B\u0445 "${this.dbName}" \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 ${e}`);let s=indexedDB.open(this.dbName,e);s.onerror=()=>{this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u0438 \u0431\u0430\u0437\u044B \u0434\u0430\u043D\u043D\u044B\u0445 "${this.dbName}"`,{error:s.error}),r(s.error)},s.onsuccess=()=>{this.db=s.result,this.version=this.db.version,this.logger?.debug(`\u0411\u0430\u0437\u0430 \u0434\u0430\u043D\u043D\u044B\u0445 "${this.dbName}" \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043E\u0442\u043A\u0440\u044B\u0442\u0430`,{version:this.db.version,stores:Array.from(this.db.objectStoreNames)}),n(this.db)},s.onupgradeneeded=a=>{let o=a.target.result;this.logger?.debug(`\u041E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u0431\u0430\u0437\u044B \u0434\u0430\u043D\u043D\u044B\u0445 "${this.dbName}" \u0434\u043E \u0432\u0435\u0440\u0441\u0438\u0438 ${e}`);for(let i of t)o.objectStoreNames.contains(i)||(this.logger?.debug(`\u0421\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430 "${i}"`),o.createObjectStore(i))}})}async ensureStoresExist(e){this.db||(this.db=await this.openDatabase(this.version));let t=e.filter(n=>!this.db.objectStoreNames.contains(n));return t.length===0?this.db:(this.logger?.debug(`\u041D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430: ${t.join(", ")}`,{dbName:this.dbName,currentVersion:this.version}),this.db.close(),this.db=null,this.version++,this.db=await this.openDatabase(this.version,t),this.db)}close(){this.db&&(this.db.close(),this.db=null)}},O=class g extends R{static STORAGE_TYPE="memory";DB_NAME;STORE_NAME;DB_VERSION;dbManager;constructor(e,t,n,r){super(e,t,n,r);let s=e.options;this.DB_NAME=s.dbName||"app_storage",this.STORE_NAME=e.name,this.DB_VERSION=s.dbVersion||1,this.dbManager=j.getInstance(this.DB_NAME,this.DB_VERSION,r)}getStorageType(){return"memory"}static create(e,t,n,r){return x.handleSingletonCreation(e,this.STORAGE_TYPE,s=>new g(s,t,n,r),r)}async doInitialize(){try{if(this.logger?.debug(`Initializing IndexedDB storage "${this.STORE_NAME}"`),await this.dbManager.ensureStoreExists(this.STORE_NAME),!(await this.dbManager.initialize()).objectStoreNames.contains(this.STORE_NAME))throw new Error(`Store "${this.STORE_NAME}" not found after initialization`);return this.initializeMiddlewares(),await this.initializeWithMiddlewares(),this.logger?.debug(`IndexedDB storage "${this.STORE_NAME}" initialized successfully`),this}catch(e){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438 IndexedDB "${this.name}"`,{error:e}),e}}static async getCurrentDBVersion(e){return new Promise(t=>{try{let n=indexedDB.open(e);n.onsuccess=()=>{let r=n.result.version;n.result.close(),t(r)},n.onerror=()=>{t(0)}}catch{t(0)}})}static async createStorages(e,t,n){let s=await this.getCurrentDBVersion(e)||1,a=new _(e,s,n),o=Object.values(t).map(c=>c.name);await a.ensureStoresExist(o);let i={};for(let[c,l]of Object.entries(t)){let d=new g({...l,options:{dbName:e,dbVersion:a.getCurrentVersion()}},l.pluginExecutor,l.eventEmitter,n);i[c]=await d.initialize()}return i}async getTransaction(e="readonly"){try{let t=await this.dbManager.ensureStoreExists(this.STORE_NAME);if(!t.objectStoreNames.contains(this.STORE_NAME)){this.logger?.warn(`Object store "${this.STORE_NAME}" not found, attempting to repair`),t.close(),this.dbManager.closeDatabase();let n=await this.dbManager.ensureStoreExists(this.STORE_NAME);if(!n.objectStoreNames.contains(this.STORE_NAME))throw new Error(`Object store "${this.STORE_NAME}" still doesn't exist after repair attempt`);return n.transaction(this.STORE_NAME,e)}return t.transaction(this.STORE_NAME,e)}catch(t){throw this.logger?.error(`Failed to create transaction for store "${this.STORE_NAME}"`,{error:t}),t}}async getObjectStore(e="readonly"){return(await this.getTransaction(e)).objectStore(this.STORE_NAME)}async doGet(e){let t=await this.getObjectStore();if(e==="")return new Promise((r,s)=>{let a=t.getAll();a.onerror=()=>s(a.error),a.onsuccess=()=>{let o=a.result,i=t.getAllKeys();i.onsuccess=()=>{let c=i.result.reduce((l,d,u)=>(d!=="root"&&(l[d]=o[u]),l),{});r(c)},i.onerror=()=>s(i.error)}});if(e instanceof h&&e.isUnparseable())return new Promise((r,s)=>{let a=t.get(e.valueOf());a.onerror=()=>s(a.error),a.onsuccess=()=>r(a.result)});let n=w(e);if(n.length>1){let r=n[0];return new Promise((s,a)=>{let o=t.get(r);o.onerror=()=>a(o.error),o.onsuccess=()=>{let i=o.result;if(!i){s(void 0);return}let c=v(i,n.slice(1).join("."));s(c)}})}return new Promise((r,s)=>{let a=t.get(n[0]);a.onerror=()=>s(a.error),a.onsuccess=()=>r(a.result)})}async doSet(e,t){if(e===""){let s=await this.getObjectStore("readwrite");return new Promise((a,o)=>{let i=s.transaction;i.oncomplete=()=>{a()},i.onerror=()=>{o(i.error)};let c=s.clear();c.onsuccess=()=>{let l=Object.entries(t);for(let[d,u]of l)s.put(u,d)},c.onerror=()=>{o(c.error)}})}let n=await this.getObjectStore("readwrite");if(e instanceof h&&e.isUnparseable()){await this.putValueInStore(n,e.valueOf(),t);return}let r=w(e);if(r.length>1){let s=r[0];return new Promise((a,o)=>{let i=n.get(s);i.onerror=()=>o(i.error),i.onsuccess=()=>{let c=i.result||{},l=E(c,r.slice(1).join("."),t),d=n.put(l,s);d.onerror=()=>o(d.error),d.onsuccess=()=>a()}})}await this.putValueInStore(n,r[0],t)}async putValueInStore(e,t,n){return new Promise((r,s)=>{let a=e.put(n,t.valueOf());a.onerror=()=>s(a.error),a.onsuccess=()=>r()})}async doUpdate(e){let t=new Map,n=[];for(let{key:r,value:s}of e){if(r instanceof h&&r.isUnparseable()){n.push({key:r.valueOf(),value:s});continue}let a=w(r),o=a[0],i=a.slice(1);t.has(o)||t.set(o,[]),t.get(o).push({path:i,value:s})}try{for(let{key:r,value:s}of n){let a=await this.getObjectStore("readwrite");await this.putValueInStore(a,r,s)}for(let[r,s]of t){let o={...await this.doGet(r)||{}};for(let{path:c,value:l}of s)c.length===0?o=l:o=E(o,c.join("."),l);let i=await this.getObjectStore("readwrite");await this.putValueInStore(i,r,o)}}catch(r){throw this.logger?.error("Error during update:",{error:r}),r}}async doDelete(e){let t=await this.getObjectStore("readwrite");if(e instanceof h&&e.isUnparseable())return new Promise((s,a)=>{let o=t.delete(e.valueOf());o.onerror=()=>a(o.error),o.onsuccess=()=>s(!0)});let n=w(e);if(n.length===1)return new Promise((s,a)=>{let o=t.delete(n[0]);o.onerror=()=>a(o.error),o.onsuccess=()=>s(!0)});let r=n[0];return new Promise((s,a)=>{let o=t.get(r);o.onerror=()=>a(o.error),o.onsuccess=()=>{let i=o.result;if(!i){s(!1);return}let c=v(i,n.slice(0,-1).join(".")),l=n[n.length-1];if(!c||!(l in c)){s(!1);return}if(Array.isArray(c)){let u=parseInt(l,10);isNaN(u)?delete c[l]:c.splice(u,1)}else delete c[l];let d=t.put(i,r);d.onerror=()=>a(d.error),d.onsuccess=()=>s(!0)}})}async doClear(){let e=await this.getObjectStore("readwrite");return new Promise((t,n)=>{let r=e.clear();r.onsuccess=()=>t(),r.onerror=()=>n(r.error)})}async doKeys(){let t=(await this.getObjectStore()).getAllKeys();return new Promise((n,r)=>{t.onsuccess=()=>{n(t.result)},t.onerror=()=>r(t.error)})}async doHas(e){return await this.doGet(e)!==void 0}async doDestroy(){try{await this.doClear()}catch(e){throw this.logger?.error(`Error destroying store "${this.STORE_NAME}"`,{error:e}),e}}};var M=class g extends R{static STORAGE_TYPE="localStorage";constructor(e,t,n,r){super(e,t,n,r)}static create(e,t,n,r){return x.handleSingletonCreation(e,this.STORAGE_TYPE,s=>new g(s,t,n,r),r)}async doInitialize(){try{return this.logger?.debug(`Initializing LocalStorage "${this.name}"`),this.initializeMiddlewares(),await this.initializeWithMiddlewares(),this.logger?.debug(`LocalStorage "${this.name}" initialized successfully`),this}catch(e){throw this.logger?.error("Error initializing LocalStorage",{error:e}),e}}async doGet(e){let t=localStorage.getItem(this.name);if(!t)return;let n=JSON.parse(t);return e instanceof h&&e.isUnparseable()?n[e.valueOf()]:v(n,e)}async doSet(e,t){let n=localStorage.getItem(this.name),r=n?JSON.parse(n):{};if(e instanceof h&&e.isUnparseable()){r[e.valueOf()]=t,localStorage.setItem(this.name,JSON.stringify(r));return}let s=E({...r},e,t);localStorage.setItem(this.name,JSON.stringify(s))}async doDelete(e){let t=localStorage.getItem(this.name);if(!t)return!1;let n=JSON.parse(t);if(e instanceof h&&e.isUnparseable()){let i=e.valueOf();return i in n?(delete n[i],localStorage.setItem(this.name,JSON.stringify(n)),!0):!1}let r=w(e),s=r.slice(0,-1).join("."),a=r[r.length-1],o=s?v(n,s):n;return!o||!(a in o)?!1:(delete o[a],localStorage.setItem(this.name,JSON.stringify(n)),!0)}async doUpdate(e){let t=localStorage.getItem(this.name),n=t?JSON.parse(t):{};for(let{key:r,value:s}of e)r instanceof h&&r.isUnparseable()?n[r.valueOf()]=s:E(n,r,s);localStorage.setItem(this.name,JSON.stringify(n))}async doClear(){localStorage.removeItem(this.name)}async doKeys(){let e=localStorage.getItem(this.name);if(!e)return[];let t=JSON.parse(e);return this.getAllKeys(t)}async doHas(e){return await this.doGet(e)!==void 0}getAllKeys(e){return Object.keys(e)}async doDestroy(){await this.doClear()}};var I=class g extends R{static STORAGE_TYPE="memory";storage=new Map;constructor(e,t,n,r){super(e,t,n,r)}static create(e,t,n,r){return x.handleSingletonCreation(e,this.STORAGE_TYPE,s=>new g(s,t,n,r),r)}async doInitialize(){try{return this.logger?.debug(`Initializing MemoryStorage "${this.name}"`),this.initializeMiddlewares(),await this.initializeWithMiddlewares(),this.logger?.debug(`MemoryStorage "${this.name}" initialized successfully`),this}catch(e){throw this.logger?.error("Error initializing MemoryStorage",{error:e}),e}}async doGet(e){let t=this.storage.get(this.name);if(t)return e instanceof h&&e.isUnparseable()?t[e.valueOf()]:v(t,e)}async doSet(e,t){let n=this.storage.get(this.name)||{};if(e instanceof h&&e.isUnparseable()){n[e.valueOf()]=t,this.storage.set(this.name,n);return}let r=E({...n},e,t);this.storage.set(this.name,r)}async doDelete(e){let t=this.storage.get(this.name);if(!t)return!1;if(e instanceof h&&e.isUnparseable()){let o=e.valueOf();return o in t?(delete t[o],this.storage.set(this.name,t),!0):!1}let n=w(e),r=n.slice(0,-1).join("."),s=n[n.length-1],a=r?v(t,r):t;return!a||!(s in a)?!1:(delete a[s],this.storage.set(this.name,t),!0)}async doUpdate(e){let n={...this.storage.get(this.name)||{}};for(let{key:r,value:s}of e)r instanceof h&&r.isUnparseable()?n[r.valueOf()]=s:E(n,r,s);this.storage.set(this.name,n)}async doClear(){this.storage.delete(this.name)}async doKeys(){let e=this.storage.get(this.name);return e?this.getAllKeys(e):[]}async doHas(e){return await this.doGet(e)!==void 0}async doDestroy(){this.storage.delete(this.name)}getAllKeys(e){return Object.keys(e)}};var $=class{static createMemory(e,t,n,r){return I.create(e,t,n,r)}static createLocal(e,t,n,r){return M.create(e,t,n,r)}static createIndexedDB(e,t,n,r){return O.create(e,t,n,r)}static create(e,t,n,r){switch(e.type){case"memory":return this.createMemory(e,t,n,r);case"localStorage":return this.createLocal(e,t,n,r);case"indexedDB":return this.createIndexedDB(e,t,n,r);default:throw new Error(`Unsupported storage type: ${e.type}`)}}};function Yt(g,e={},t,n,r){let{autoInitialize:s=!0,destroyOnUnmount:a=!0}=e,o=se(null),[i,c]=oe({status:"idle"}),l=ne(()=>{if(!o.current)try{o.current=$.create(g,t,n,r)}catch(m){return c({status:"error",error:m}),null}return o.current},[g,t,n,r]),d=Y(async()=>{if(l)try{c({status:"loading"}),await l.initialize(),c({status:"ready"})}catch(m){c({status:"error",error:m})}},[l]),u=Y(async()=>{if(l)try{await l.destroy(),c({status:"idle"})}catch(m){c({status:"error",error:m})}},[l]);k(()=>l?l.onStatusChange(T=>{c(T)}):void 0,[l]),k(()=>{s&&l&&i.status==="idle"&&d()},[s,l,i.status,d]),k(()=>()=>{a&&l&&l.destroy().catch(console.error)},[a,l]);let p=i.status==="ready",y=i.status==="loading",S=i.status==="error";return{storage:l,status:i,initialize:d,destroy:u,isReady:p,isLoading:y,hasError:S}}import{useEffect as ae,useRef as J,useState as X}from"react";var B=new Map;function Qt(g,e){let[t,n]=X(e?.initialValue),[r,s]=X(!!e?.withLoading),a=J(e?.initialValue),o=J(e?.equals||((l,d)=>l===d)),i=g.getId(),c=l=>{(a.current===void 0||!o.current(l,a.current))&&(a.current=l,n(l))};return ae(()=>{B.has(i)||B.set(i,{lastValue:void 0,listeners:new Set,unsubscribe:null});let l=B.get(i);return l.listeners.add(c),l.lastValue!==void 0?(c(l.lastValue),e?.withLoading&&s(!1)):(e?.withLoading&&s(!0),g.select().then(d=>{l.lastValue=d,l.listeners.forEach(u=>u(d)),e?.withLoading&&s(!1)}).catch(d=>{e?.withLoading&&s(!1)})),l.unsubscribe||(l.unsubscribe=g.subscribe({notify:d=>{l.lastValue=d,l.listeners.forEach(u=>{try{u(d)}catch{}})}})),()=>{let d=B.get(i);d&&(d.listeners.delete(c),d.listeners.size===0&&(d.unsubscribe&&d.unsubscribe(),B.delete(i)))}},[g,i]),e?.withLoading?{data:t,isLoading:r}:t}import{useEffect as ie,useState as ce}from"react";var tr=(g,e)=>{let[t,n]=ce(void 0);return ie(()=>{let r=!0;(async()=>{try{let o=await g.getState(),i=e(o);r&&n(i)}catch{}})();let a;try{a=g.subscribe(e,o=>{r&&n(o)})}catch{a=()=>{}}return()=>{r=!1,a()}},[g,e]),t};import{useEffect as ue,useState as z}from"react";import{Observable as cr,Subject as lr}from"rxjs";var yr=globalThis.console;import{combineLatest as Zr,merge as en,Observable as tn,of as rn,pipe as sn,Subject as on}from"rxjs";import{catchError as cn,filter as ln,map as dn,share as un,switchMap as gn,take as pn}from"rxjs/operators";import{of as Or}from"rxjs";import{concatAll as $r,delay as Br,mergeMap as Fr,toArray as Nr}from"rxjs/operators";import{forkJoin as Ur,timer as _r}from"rxjs";import{mergeMap as Gr}from"rxjs/operators";function G(g){let e="pending",t,n=null,r=new Set,s=new Set,a=(async()=>{try{let o=await(g instanceof Promise?g:Promise.resolve(g));return await o.storage.waitForReady(),t=o,e="ready",r.forEach(i=>{try{i(t)}catch{}}),o}catch(o){let i=o instanceof Error?o:new Error(String(o));throw n=i,e="error",s.forEach(c=>{try{c(i)}catch{}}),i}})();return{waitForReady:()=>a,isReady:()=>e==="ready",getStoreIfReady:()=>t,onReady:o=>{if(e==="ready"&&t)try{o(t)}catch{}else r.add(o);return()=>{r.delete(o)}},onError:o=>{if(e==="error"&&n)try{o(n)}catch{}else s.add(o);return()=>{s.delete(o)}},getStatus:()=>e,getError:()=>n,destroy:()=>{r.clear(),s.clear(),t=void 0,n=null,e="pending"}}}import{Fragment as Q,jsx as K,jsxs as pe}from"react/jsx-runtime";function ge(g,e){let{loadingComponent:t=K("div",{children:"\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F..."}),errorComponent:n=o=>pe("div",{children:["\u041E\u0448\u0438\u0431\u043A\u0430 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438: ",o.message]})}=e||{},r=G(g);function s(){let[o,i]=z(()=>r.getStatus()),[c,l]=z(()=>r.getStoreIfReady()),[d,u]=z(()=>r.getError());return ue(()=>{let p=r.getStatus(),y=r.getStoreIfReady(),S=r.getError();i(p),l(y),u(S);let m=r.onReady(f=>{i("ready"),l(f),u(null)}),T=r.onError(f=>{i("error"),l(void 0),u(f)});return()=>{m(),T()}},[]),{isReady:o==="ready",isError:o==="error",isPending:o==="pending",store:c,error:d}}function a(o){function i(l){let{isReady:d,isError:u,error:p}=s();return u&&p?K(Q,{children:n(p)}):d?K(o,{...l}):K(Q,{children:t})}let c=o.displayName||o.name||"Component";return i.displayName=`AwaitSynapse(${c})`,i}return{withSynapseReady:a,useSynapseReady:s,waitForReady:r.waitForReady,isReady:r.isReady,getStoreIfReady:r.getStoreIfReady,onReady:r.onReady,onError:r.onError,getStatus:r.getStatus,getError:r.getError,destroy:r.destroy}}import{createContext as ye,useContext as L,useEffect as fe,useState as W}from"react";import{Fragment as me,jsx as F}from"react/jsx-runtime";var V="\u0425\u0443\u043A \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430 contextSynapse",he="\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430:";function Se(g,e){let{loadingComponent:t=F("div",{children:"\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430..."})}=e||{},n=(async()=>{try{let d=await(g instanceof Promise?g:Promise.resolve(g));return await d.storage.waitForReady(),d}catch(d){throw d}})(),r=ye(null),s=()=>{let d=L(r);if(!d)throw new Error(`useSynapseStorage: ${V}`);return d.storage},a=()=>{let d=L(r);if(!d)throw new Error(`useSynapseSelectors: ${V}`);return d.selectors},o=()=>{let d=L(r);if(!d)throw new Error(`useSynapseActions: ${V}`);if("actions"in d)return d.actions;throw new Error("useSynapseActions: actions \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0442\u0438\u043F\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u043D\u0430 \u0444\u0443\u043D\u043A\u0446\u0438\u044F createDispatcherFn \u043F\u0440\u0438 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0438 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430.")},i=()=>{let d=L(r);if(!d)throw new Error(`useSynapseState$: ${V}`);if("state$"in d)return d.state$;throw new Error("useSynapseState$: state$ \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0442\u0438\u043F\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u043D\u044B \u0444\u0443\u043D\u043A\u0446\u0438\u0438 createDispatcherFn \u0438 createEffectConfig \u043F\u0440\u0438 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0438 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430.")};function c(d){function u(y){let[S,m]=W(null),[T,f]=W(!1),[P,U]=W(null);return fe(()=>{let b=!0;return(async()=>{try{let D=await n;b&&(m(D),f(!0))}catch(D){b&&U(D instanceof Error?D:new Error(String(D)))}})(),()=>{b=!1}},[]),P?F("div",{children:`${he}: ${P.message}`}):!T||!S?F(me,{children:t}):F(r.Provider,{value:S,children:F(d,{...y})})}let p=d.displayName||d.name||"Component";return u.displayName=`SynapseContext(${p})`,u}return{contextSynapse:c,useSynapseStorage:s,useSynapseSelectors:a,useSynapseActions:o,useSynapseState$:i,cleanupSynapse:async()=>{try{return(await n)?.destroy()||Promise.resolve()}catch{}}}}export{ge as awaitSynapse,Se as createSynapseCtx,Yt as useCreateStorage,Qt as useSelector,tr as useStorageSubscribe};
@@ -1,7 +1,7 @@
1
- import { a as EnhancedMiddleware } from './dispatcher.module-DjMloBXe.js';
2
- export { A as Action, b as ActionDefinition, e as ActionsResult, c as ActionsSetupWithUtils, C as CreateDispatcherType, f as DispatchActions, D as DispatchFunction, j as Dispatcher, o as DispatcherActions, i as DispatcherMiddleware, h as DispatcherMiddlewareAPI, n as Effect, m as EffectBase, w as EffectsModule, E as EnhancedMiddlewareAPI, l as ExternalStates, d as ExtractResultType, T as TypedAction, V as ValidateConfig, p as ValidateMapRequestUtils, g as WatcherActions, W as WatcherFunction, z as combineEffects, k as createDispatcher, y as createEffect, x as createEffectBase, q as ofType, r as ofTypes, s as ofTypesWaitAll, t as selectorMap, u as selectorObject, v as validateMap } from './dispatcher.module-DjMloBXe.js';
1
+ import { a as EnhancedMiddleware } from './dispatcher.module-BOsMHbD5.js';
2
+ export { A as Action, b as ActionDefinition, e as ActionsResult, c as ActionsSetupWithUtils, C as CreateDispatcherType, f as DispatchActions, D as DispatchFunction, j as Dispatcher, o as DispatcherActions, i as DispatcherMiddleware, h as DispatcherMiddlewareAPI, n as Effect, m as EffectBase, w as EffectsModule, E as EnhancedMiddlewareAPI, l as ExternalStates, d as ExtractResultType, T as TypedAction, V as ValidateConfig, p as ValidateMapRequestUtils, g as WatcherActions, W as WatcherFunction, z as combineEffects, k as createDispatcher, y as createEffect, x as createEffectBase, q as ofType, r as ofTypes, s as ofTypesWaitAll, t as selectorMap, u as selectorObject, v as validateMap } from './dispatcher.module-BOsMHbD5.js';
3
3
  import 'rxjs';
4
- import './storage.interface-2HKvqdAJ.js';
4
+ import './storage.interface-BA_ktyDz.js';
5
5
 
6
6
  interface LoggerTranslations {
7
7
  action: string;
package/dist/reactive.js CHANGED
@@ -1 +1 @@
1
- import{Observable as W,Subject as E}from"rxjs";var A=class{constructor(e){this.options=e;this.storage=e.storage,this.middlewareAPI={getState:()=>this.storage.getState(),dispatch:async t=>(this.actions$.next(t),t.payload),storage:this.storage,actions$:this.actions,actions:this.dispatch,watchers:this.watchers,findActionByType:t=>this.findActionByType(t),findWatcherByType:t=>this.findWatcherByType(t)},e.middlewares&&e.middlewares.length>0&&this.use(...e.middlewares)}actions$=new E;actions=this.actions$.asObservable();dispatch={};watchers={};storage;middlewareFunctions=[];middlewareAPI;use(...e){for(let t=0;t<e.length;t++)try{let s=e[t](this.middlewareAPI);this.middlewareFunctions.push(s)}catch{}return this}getActions(){return this.dispatch}getTypedDispatch(){return this.dispatch}getTypedWatchers(){return this.watchers}findActionByType(e){return Object.values(this.dispatch).find(t=>t.actionType.split(`[${this.storage.name}]`)[1]===e)}findWatcherByType(e){return Object.values(this.watchers).find(t=>t.actionType===e)}createAction(e,t){let s=`[${this.storage.name}]${e.type}`,r=null,i=null,a=async c=>{let o=[c];if(t?.memoize&&r&&i&&t.memoize(o,r,i))return i;let l={type:s,meta:e.meta},u;if(this.middlewareFunctions.length>0){let f=async p=>t?.worker?this.executeInWorker(t.worker,s,o,e.action):Promise.resolve(e.action(c));for(let p=this.middlewareFunctions.length-1;p>=0;p--){let T=this.middlewareFunctions[p],b=f;f=async v=>T(async x=>b(x))(v)}u=await f(l)}else t?.worker?u=await this.executeInWorker(t.worker,s,o,e.action):u=await e.action(c);return l.payload=u,r=[...o],i=u,this.actions$.next(l),u};return a.e="dispatch",Object.defineProperty(a,"actionType",{value:s,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(a,"meta",{value:e.meta,writable:!1,enumerable:!0}),a}createWatcher(e){let t=`[${this.storage.name}]${e.type}`,s=new E,r,i=async()=>{let o=await this.storage.getState();return e.selector(o)},a=this.storage.subscribe(e.selector,o=>{if(!e.shouldTrigger||e.shouldTrigger(r,o)){let l={type:t,payload:o,meta:e.meta};this.actions$.next(l),s.next(l),r=o}}),c=()=>{let o=s.asObservable();return e.notifyAfterSubscribe?new W(l=>{let u=!1;i().then(p=>{if(!e.shouldTrigger||e.shouldTrigger(void 0,p)){let T={type:t,payload:p,meta:{...e.meta,isInitial:!0}};l.next(T),r=p,u=!0}}).catch(p=>{l.error(p)});let f=o.subscribe({next:p=>{u&&p.payload===r||l.next(p)},error:p=>l.error(p),complete:()=>l.complete()});return()=>{f.unsubscribe()}}):o};return c.e="watchers",Object.defineProperty(c,"actionType",{value:t,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(c,"meta",{value:e.meta,writable:!1,enumerable:!0}),Object.defineProperty(c,"unsubscribe",{value:a,writable:!1,enumerable:!0}),c}async executeInWorker(e,t,s,r){return new Promise((i,a)=>{let c=`${t}_${Date.now()}_${Math.random()}`,o=l=>{l.data.requestId===c&&(e.removeEventListener("message",o),l.data.error?a(new Error(l.data.error)):i(l.data.result))};e.addEventListener("message",o),e.postMessage({type:t,args:s,requestId:c}),setTimeout(()=>{e.removeEventListener("message",o),a(new Error(`Worker execution timeout for action: ${t}`))},3e4)})}};function Y(n,e){let t=new A(n),s=e(n.storage,{createAction:(r,i)=>t.createAction(r,i),createWatcher:r=>t.createWatcher(r)});for(let[r,i]of Object.entries(s))if(typeof i=="function"){let a=i.e;t[a][r]=i}return t}function R(n,e=1){if(e<=0)throw new Error("Size must be greater than 0");if(!n||!n.length)return[];let t=[],s=n.length,r=0;for(;r<s;)t.push(n.slice(r,r+e)),r+=e;return t}var h=globalThis.console,d={log:(...n)=>h.log(...n),warn:(...n)=>h.warn(...n),error:(...n)=>h.error(...n),group:(...n)=>h.group(...n),groupEnd:()=>h.groupEnd(),groupCollapsed:(...n)=>h.groupCollapsed(...n)};function D(n,e){let t={};return[...new Set([...Object.keys(n),...Object.keys(e)])].forEach(r=>{if(r in n&&r in e)if(typeof n[r]=="object"&&n[r]!==null&&typeof e[r]=="object"&&e[r]!==null&&!Array.isArray(n[r])&&!Array.isArray(e[r])){let i=D(n[r],e[r]);Object.keys(i).length>0&&(t[r]=i)}else JSON.stringify(n[r])!==JSON.stringify(e[r])&&(t[r]={PREV:n[r],NEXT:e[r]});else r in n?t[r]={PREV:n[r],NEXT:void 0}:t[r]={PREV:void 0,NEXT:e[r]}}),t}var pe=(n={})=>{let e={action:"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435",prevState:"\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435",nextState:"\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435",duration:"\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C",error:"\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438",diff:"\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F",changesCount:"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439",showFullState:"\u041F\u043E\u043B\u043D\u043E\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435"},t={collapsed:!1,duration:!0,diff:!1,showFullState:!0,translations:e,colors:{title:"#3498db",prevState:"#9E9E9E",fullState:"#008a15",action:"#03A9F4",nextState:"#4CAF50",error:"#F20404",diff:"#9C27B0"}},s={...t,...n,translations:{...e,...n.translations||{}},colors:{...t.colors,...n.colors||{}}},{collapsed:r,duration:i,colors:a,translations:c}=s;return o=>l=>async u=>{let f=Date.now(),p=await o.getState();try{let T=await l(u),b=await o.getState(),S=Date.now()-f,x=`${u.type}`;if((r?d.groupCollapsed:d.group)(`%c ${x}`,`color: ${a.title}; font-weight: bold`),d.log(`%c ${c.action}:`,`color: ${a.action}; font-weight: bold`,u),s.diff){let w=D(p,b),$=Object.keys(w).length;d.log(`%c ${c.diff} (${c.changesCount}: ${$}):`,`color: ${a.diff}; font-weight: bold`,w)}return s.showFullState&&(d.groupCollapsed(`%c ${c.showFullState}`,`color: ${a.fullState}; font-weight: bold`),d.log(`%c ${c.prevState}:`,`color: ${a.prevState}; font-weight: bold`,p),d.log(`%c ${c.nextState}:`,`color: ${a.nextState}; font-weight: bold`,b),d.groupEnd()),i&&d.log(`%c ${c.duration}: %c ${S}ms`,"font-weight: bold","color: #4CAF50"),d.groupEnd(),T}catch(T){throw d.error(`%c ${c.error}:`,`color: ${a.error}; font-weight: bold`,u.type,T),T}}};import{combineLatest as L,merge as V,Observable as N,of as y,pipe as U,Subject as z}from"rxjs";import{catchError as _,filter as g,map as m,share as J,switchMap as X,take as G}from"rxjs/operators";import{of as P}from"rxjs";import{concatAll as k,delay as M,mergeMap as j,toArray as I}from"rxjs/operators";var F=(n,e,t,s=0)=>{let r=R(e,t).map(i=>P(i).pipe(M(s),j(n)));return P(...r).pipe(k(),I())};import{forkJoin as q,timer as B}from"rxjs";import{mergeMap as K}from"rxjs/operators";var O=(n,e,t,s=0)=>q(R(e,t).map((r,i)=>B(i*s).pipe(K(()=>n(r)))));function je(n){let{actionType:e}=n;return e?t=>t.pipe(g(s=>s!==void 0&&s.type===e)):g(()=>!1)}function Ie(n){let e=n.map(t=>t.actionType).filter(Boolean);return e.length===0?g(()=>!1):t=>t.pipe(g(s=>s!==void 0&&e.includes(s.type)))}function qe(n){return e=>{let t=n.map(r=>r.actionType).filter(Boolean);if(t.length===0)return y([]);let s=t.map((r,i)=>e.pipe(g(a=>a.type===r),G(1),m(a=>({index:i,action:a}))));return L(s).pipe(m(r=>(r.sort((i,a)=>i.index-a.index),r.map(i=>i.action))))}}function Be(n,...e){return n.pipe(m(t=>e.map(s=>s(t))))}function Ke(n,e){return n.pipe(m(t=>{let s={};for(let[r,i]of Object.entries(e))s[r]=i(t);return s}))}function Le({validator:n,apiCall:e}){return U(X(t=>{let s=()=>e(t,{chunkRequest:O,chunkRequestConsistent:F});if(!n)return s();let r=n(t),{conditions:i,skipAction:a}=r;return i.every(Boolean)?s():Array.isArray(a)?y(...a?.filter(Boolean).map(o=>typeof o=="function"?o():o)):y(typeof a=="function"?a():a)}))}var C=class{constructor(e,t={},s,r={},i={}){this.storage=e;this.externalStates=t;this.dispatchers=s;this.services=r;this.config=i;this.subscribeToDispatchers(),this.state$=new N(a=>{this.storage.getState().then(o=>a.next(o));let c=this.storage.subscribeToAll(()=>{this.storage.getState().then(o=>a.next(o))});return()=>c()}).pipe(J())}effects=[];subscriptions=[];running=!1;action$=new z;state$;subscribeToDispatchers(){for(let[e,t]of Object.entries(this.dispatchers)){let s=t.actions.subscribe(r=>{this.action$.next(r)});this.subscriptions.push(s)}}add(e){return this.effects.push(e),this.running&&this.subscribeToEffect(e),this}addEffects(e){return e.forEach(t=>this.add(t)),this}async start(){return this.running?this:(await this.storage.waitForReady(),this.effects.forEach(e=>this.subscribeToEffect(e)),this.running=!0,this)}stop(){return this.subscriptions.forEach(e=>e.unsubscribe()),this.subscriptions=[],this.running=!1,this}subscribeToEffect(e){try{let s=e(this.action$.asObservable(),this.state$,this.externalStates,this.dispatchers,this.services,this.config).pipe(_(r=>y(null))).subscribe(r=>{if(r!=null&&typeof r=="function")try{r()}catch{}});this.subscriptions.push(s)}catch{}}};function Ve(n){return n}function Ne(n){return n}function Ue(...n){return(e,t,s,r,i,a)=>{let c=n.map(o=>{try{return o(e,t,s,r,i,a)}catch{return y(null)}});return V(...c)}}export{A as Dispatcher,C as EffectsModule,Ue as combineEffects,Y as createDispatcher,Ne as createEffect,Ve as createEffectBase,pe as loggerDispatcherMiddleware,je as ofType,Ie as ofTypes,qe as ofTypesWaitAll,Be as selectorMap,Ke as selectorObject,Le as validateMap};
1
+ import{Observable as W,Subject as E}from"rxjs";var A=class{constructor(e){this.options=e;this.storage=e.storage,this.middlewareAPI={getState:()=>this.storage.getState(),dispatch:async t=>(this.actions$.next(t),t.payload),storage:this.storage,actions$:this.actions,actions:this.dispatch,watchers:this.watchers,findActionByType:t=>this.findActionByType(t),findWatcherByType:t=>this.findWatcherByType(t)},e.middlewares&&e.middlewares.length>0&&this.use(...e.middlewares)}actions$=new E;actions=this.actions$.asObservable();dispatch={};watchers={};storage;middlewareFunctions=[];middlewareAPI;use(...e){for(let t=0;t<e.length;t++)try{let s=e[t](this.middlewareAPI);this.middlewareFunctions.push(s)}catch{}return this}getActions(){return this.dispatch}getTypedDispatch(){return this.dispatch}getTypedWatchers(){return this.watchers}findActionByType(e){return Object.values(this.dispatch).find(t=>t.actionType.split(`[${this.storage.name}]`)[1]===e)}findWatcherByType(e){return Object.values(this.watchers).find(t=>t.actionType===e)}createAction(e,t){let s=`[${this.storage.name}]${e.type}`,r=null,i=null,a=async c=>{let o=[c];if(t?.memoize&&r&&i&&t.memoize(o,r,i))return i;let l={type:s,meta:e.meta},u;if(this.middlewareFunctions.length>0){let f=async p=>t?.worker?this.executeInWorker(t.worker,s,o,e.action):Promise.resolve(e.action(c));for(let p=this.middlewareFunctions.length-1;p>=0;p--){let T=this.middlewareFunctions[p],b=f;f=async v=>T(async x=>b(x))(v)}u=await f(l)}else t?.worker?u=await this.executeInWorker(t.worker,s,o,e.action):u=await e.action(c);return l.payload=u,r=[...o],i=u,this.actions$.next(l),u};return a.e="dispatch",Object.defineProperty(a,"actionType",{value:s,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(a,"meta",{value:e.meta,writable:!1,enumerable:!0}),a}createWatcher(e){let t=`[${this.storage.name}]${e.type}`,s=new E,r,i=async()=>{let o=await this.storage.getState();return e.selector(o)},a=this.storage.subscribe(e.selector,o=>{if(!e.shouldTrigger||e.shouldTrigger(r,o)){let l={type:t,payload:o,meta:e.meta};this.actions$.next(l),s.next(l),r=o}}),c=()=>{let o=s.asObservable();return e.notifyAfterSubscribe?new W(l=>{let u=!1;i().then(p=>{if(!e.shouldTrigger||e.shouldTrigger(void 0,p)){let T={type:t,payload:p,meta:{...e.meta,isInitial:!0}};l.next(T),r=p,u=!0}}).catch(p=>{l.error(p)});let f=o.subscribe({next:p=>{u&&p.payload===r||l.next(p)},error:p=>l.error(p),complete:()=>l.complete()});return()=>{f.unsubscribe()}}):o};return c.e="watchers",Object.defineProperty(c,"actionType",{value:t,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(c,"meta",{value:e.meta,writable:!1,enumerable:!0}),Object.defineProperty(c,"unsubscribe",{value:a,writable:!1,enumerable:!0}),c}async executeInWorker(e,t,s,r){return new Promise((i,a)=>{let c=`${t}_${Date.now()}_${Math.random()}`,o=l=>{l.data.requestId===c&&(e.removeEventListener("message",o),l.data.error?a(new Error(l.data.error)):i(l.data.result))};e.addEventListener("message",o),e.postMessage({type:t,args:s,requestId:c}),setTimeout(()=>{e.removeEventListener("message",o),a(new Error(`Worker execution timeout for action: ${t}`))},3e4)})}};function Y(n,e){let t=new A(n),s=e(n.storage,{createAction:(r,i)=>t.createAction(r,i),createWatcher:r=>t.createWatcher(r)});for(let[r,i]of Object.entries(s))if(typeof i=="function"){let a=i.e;t[a][r]=i}return t}function R(n,e=1){if(e<=0)throw new Error("Size must be greater than 0");if(!n||!n.length)return[];let t=[],s=n.length,r=0;for(;r<s;)t.push(n.slice(r,r+e)),r+=e;return t}var h=globalThis.console,d={log:(...n)=>h.log(...n),warn:(...n)=>h.warn(...n),error:(...n)=>h.error(...n),group:(...n)=>h.group(...n),groupEnd:()=>h.groupEnd(),groupCollapsed:(...n)=>h.groupCollapsed(...n)};function P(n,e){let t={};return[...new Set([...Object.keys(n),...Object.keys(e)])].forEach(r=>{if(r in n&&r in e)if(typeof n[r]=="object"&&n[r]!==null&&typeof e[r]=="object"&&e[r]!==null&&!Array.isArray(n[r])&&!Array.isArray(e[r])){let i=P(n[r],e[r]);Object.keys(i).length>0&&(t[r]=i)}else JSON.stringify(n[r])!==JSON.stringify(e[r])&&(t[r]={PREV:n[r],NEXT:e[r]});else r in n?t[r]={PREV:n[r],NEXT:void 0}:t[r]={PREV:void 0,NEXT:e[r]}}),t}var pe=(n={})=>{let e={action:"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435",prevState:"\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435",nextState:"\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435",duration:"\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C",error:"\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438",diff:"\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F",changesCount:"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439",showFullState:"\u041F\u043E\u043B\u043D\u043E\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435"},t={collapsed:!1,duration:!0,diff:!1,showFullState:!0,translations:e,colors:{title:"#3498db",prevState:"#9E9E9E",fullState:"#008a15",action:"#03A9F4",nextState:"#4CAF50",error:"#F20404",diff:"#9C27B0"}},s={...t,...n,translations:{...e,...n.translations||{}},colors:{...t.colors,...n.colors||{}}},{collapsed:r,duration:i,colors:a,translations:c}=s;return o=>l=>async u=>{let f=Date.now(),p=await o.getState();try{let T=await l(u),b=await o.getState(),S=Date.now()-f,x=`${u.type}`;if((r?d.groupCollapsed:d.group)(`%c ${x}`,`color: ${a.title}; font-weight: bold`),d.log(`%c ${c.action}:`,`color: ${a.action}; font-weight: bold`,u),s.diff){let w=P(p,b),$=Object.keys(w).length;d.log(`%c ${c.diff} (${c.changesCount}: ${$}):`,`color: ${a.diff}; font-weight: bold`,w)}return s.showFullState&&(d.groupCollapsed(`%c ${c.showFullState}`,`color: ${a.fullState}; font-weight: bold`),d.log(`%c ${c.prevState}:`,`color: ${a.prevState}; font-weight: bold`,p),d.log(`%c ${c.nextState}:`,`color: ${a.nextState}; font-weight: bold`,b),d.groupEnd()),i&&d.log(`%c ${c.duration}: %c ${S}ms`,"font-weight: bold","color: #4CAF50"),d.groupEnd(),T}catch(T){throw d.error(`%c ${c.error}:`,`color: ${a.error}; font-weight: bold`,u.type,T),T}}};import{combineLatest as L,merge as V,Observable as N,of as y,pipe as U,Subject as z}from"rxjs";import{catchError as _,filter as g,map as m,share as J,switchMap as X,take as G}from"rxjs/operators";import{of as D}from"rxjs";import{concatAll as k,delay as M,mergeMap as j,toArray as I}from"rxjs/operators";var F=(n,e,t,s=0)=>{let r=R(e,t).map(i=>D(i).pipe(M(s),j(n)));return D(...r).pipe(k(),I())};import{forkJoin as q,timer as B}from"rxjs";import{mergeMap as K}from"rxjs/operators";var O=(n,e,t,s=0)=>q(R(e,t).map((r,i)=>B(i*s).pipe(K(()=>n(r)))));function je(n){let{actionType:e}=n;return e?t=>t.pipe(g(s=>s!==void 0&&s.type===e)):g(()=>!1)}function Ie(n){let e=n.map(t=>t.actionType).filter(Boolean);return e.length===0?g(()=>!1):t=>t.pipe(g(s=>s!==void 0&&e.includes(s.type)))}function qe(n){return e=>{let t=n.map(r=>r.actionType).filter(Boolean);if(t.length===0)return y([]);let s=t.map((r,i)=>e.pipe(g(a=>a.type===r),G(1),m(a=>({index:i,action:a}))));return L(s).pipe(m(r=>(r.sort((i,a)=>i.index-a.index),r.map(i=>i.action))))}}function Be(n,...e){return n.pipe(m(t=>e.map(s=>s(t))))}function Ke(n,e){return n.pipe(m(t=>{let s={};for(let[r,i]of Object.entries(e))s[r]=i(t);return s}))}function Le({validator:n,apiCall:e}){return U(X(t=>{let s=()=>e(t,{chunkRequest:O,chunkRequestConsistent:F});if(!n)return s();let r=n(t),{conditions:i,skipAction:a}=r;return i.every(Boolean)?s():Array.isArray(a)?y(...a?.filter(Boolean).map(o=>typeof o=="function"?o():o)):y(typeof a=="function"?a():a)}))}var C=class{constructor(e,t={},s,r={},i={}){this.storage=e;this.externalStates=t;this.dispatchers=s;this.services=r;this.config=i;this.subscribeToDispatchers(),this.state$=new N(a=>{this.storage.getState().then(o=>a.next(o));let c=this.storage.subscribeToAll(()=>{this.storage.getState().then(o=>a.next(o))});return()=>c()}).pipe(J())}effects=[];subscriptions=[];running=!1;action$=new z;state$;subscribeToDispatchers(){for(let[e,t]of Object.entries(this.dispatchers)){let s=t.actions.subscribe(r=>{this.action$.next(r)});this.subscriptions.push(s)}}add(e){return this.effects.push(e),this.running&&this.subscribeToEffect(e),this}addEffects(e){return e.forEach(t=>this.add(t)),this}async start(){return this.running?this:(await this.storage.waitForReady(),this.effects.forEach(e=>this.subscribeToEffect(e)),this.running=!0,this)}stop(){return this.subscriptions.forEach(e=>e.unsubscribe()),this.subscriptions=[],this.running=!1,this}subscribeToEffect(e){try{let s=e(this.action$.asObservable(),this.state$,this.externalStates,this.dispatchers,this.services,this.config).pipe(_(r=>y(null))).subscribe(r=>{if(r!=null&&typeof r=="function")try{r()}catch{}});this.subscriptions.push(s)}catch{}}};function Ve(n){return n}function Ne(n){return n}function Ue(...n){return(e,t,s,r,i,a)=>{let c=n.map(o=>{try{return o(e,t,s,r,i,a)}catch{return y(null)}});return V(...c)}}export{A as Dispatcher,C as EffectsModule,Ue as combineEffects,Y as createDispatcher,Ne as createEffect,Ve as createEffectBase,pe as loggerDispatcherMiddleware,je as ofType,Ie as ofTypes,qe as ofTypesWaitAll,Be as selectorMap,Ke as selectorObject,Le as validateMap};
@@ -211,11 +211,12 @@ interface IPluginManager<T extends IPlugin> {
211
211
 
212
212
  type PathSelector<T, R> = (state: T) => R;
213
213
  declare abstract class BaseStorage<T extends Record<string, any>> implements IStorage<T> {
214
- protected readonly config: StorageConfig;
214
+ protected readonly config: StorageSingletonConfig<T>;
215
215
  protected readonly pluginExecutor?: IPluginExecutor | undefined;
216
216
  protected readonly eventEmitter?: IEventEmitter | undefined;
217
217
  protected readonly logger?: ILogger | undefined;
218
218
  protected static readonly GLOBAL_SUBSCRIPTION_KEY = "*";
219
+ protected static readonly STORAGE_TYPE: StorageType;
219
220
  name: string;
220
221
  private _initStatus;
221
222
  private statusSubscribers;
@@ -223,7 +224,7 @@ declare abstract class BaseStorage<T extends Record<string, any>> implements ISt
223
224
  private middlewareModule;
224
225
  private initializedMiddlewares;
225
226
  protected subscribers: Map<StorageKeyType, Set<(value: any) => void>>;
226
- constructor(config: StorageConfig, pluginExecutor?: IPluginExecutor | undefined, eventEmitter?: IEventEmitter | undefined, logger?: ILogger | undefined);
227
+ constructor(config: StorageSingletonConfig<T>, pluginExecutor?: IPluginExecutor | undefined, eventEmitter?: IEventEmitter | undefined, logger?: ILogger | undefined);
227
228
  get initStatus(): StorageInitStatus;
228
229
  waitForReady(): Promise<this>;
229
230
  onStatusChange(callback: (status: StorageInitStatus) => void): VoidFunction;
@@ -283,13 +284,14 @@ interface IndexedDBConfig {
283
284
  dbVersion: number;
284
285
  }
285
286
  declare class IndexedDBStorage<T extends Record<string, any>> extends BaseStorage<T> {
287
+ protected static readonly STORAGE_TYPE: StorageType;
286
288
  private readonly DB_NAME;
287
289
  private readonly STORE_NAME;
288
290
  private readonly DB_VERSION;
289
291
  private dbManager;
290
- constructor(config: StorageConfig & {
291
- options: IndexedDBConfig;
292
- }, pluginExecutor?: IPluginExecutor, eventEmitter?: IEventEmitter, logger?: ILogger);
292
+ constructor(config: IndexedDBStorageConfig<T>, pluginExecutor?: IPluginExecutor, eventEmitter?: IEventEmitter, logger?: ILogger);
293
+ protected getStorageType(): StorageType;
294
+ static create<T extends Record<string, any>>(config: IndexedDBStorageConfig, pluginExecutor?: IPluginExecutor, eventEmitter?: IEventEmitter, logger?: ILogger): IndexedDBStorage<T>;
293
295
  protected doInitialize(): Promise<this>;
294
296
  static getCurrentDBVersion(dbName: string): Promise<number>;
295
297
  static createStorages<S extends Record<string, any>>(dbName: string, configs: {
@@ -363,6 +365,149 @@ interface ShallowCompareMiddlewareOptions {
363
365
  comparator?: <T>(prev: T, next: T) => boolean;
364
366
  }
365
367
 
368
+ /**
369
+ * @example
370
+ * ```typescript
371
+ * // Строгая проверка - выбросит ошибку при любых различиях
372
+ * const storage1 = new MemoryStorage({
373
+ * name: 'user',
374
+ * singleton: {
375
+ * enabled: true,
376
+ * mergeStrategy: ConfigMergeStrategy.STRICT
377
+ * },
378
+ * initialState: { name: 'John' }
379
+ * })
380
+ *
381
+ * // Глубокое слияние - объединит объекты
382
+ * const storage2 = new MemoryStorage({
383
+ * name: 'settings',
384
+ * singleton: {
385
+ * enabled: true,
386
+ * mergeStrategy: ConfigMergeStrategy.DEEP_MERGE
387
+ * },
388
+ * initialState: { theme: 'dark', notifications: { email: true } }
389
+ * })
390
+ * ```
391
+ */
392
+ declare enum ConfigMergeStrategy {
393
+ /**
394
+ * Строгая проверка - выбрасывает ошибку при любых отличиях в конфигурации
395
+ *
396
+ * Используйте когда требуется абсолютная идентичность конфигураций
397
+ * для обеспечения предсказуемого поведения
398
+ */
399
+ STRICT = "strict",
400
+ /**
401
+ * Первая конфигурация побеждает - игнорирует последующие конфигурации
402
+ *
403
+ * **По умолчанию**. Безопасная стратегия, которая использует настройки
404
+ * первого созданного экземпляра и игнорирует все последующие
405
+ */
406
+ FIRST_WINS = "first_wins",
407
+ /**
408
+ * Глубокое слияние объектов - рекурсивно объединяет initialState
409
+ *
410
+ * Полезно когда разные компоненты должны дополнять начальное состояние.
411
+ * Примитивные значения из первой конфигурации сохраняются
412
+ */
413
+ DEEP_MERGE = "deep_merge",
414
+ /**
415
+ * Последняя конфигурация перезаписывает предыдущие (кроме name)
416
+ *
417
+ * **Осторожно!** Может привести к непредсказуемому поведению,
418
+ * так как результат зависит от порядка создания компонентов
419
+ */
420
+ OVERRIDE = "override",
421
+ /**
422
+ * Предупреждение в консоли + использование первой конфигурации
423
+ *
424
+ * Как FIRST_WINS, но с подробными предупреждениями в консоли
425
+ * о конфликтующих настройках. Полезно для отладки
426
+ */
427
+ WARN_AND_USE_FIRST = "warn_and_use_first"
428
+ }
429
+ /**
430
+ * Позволяет переиспользовать экземпляры хранилищ между компонентами
431
+ * по имени, что особенно полезно в React при частых ре-рендерах
432
+ *
433
+ * @example
434
+ * ```typescript
435
+ * // Базовое использование
436
+ * const storage = new MemoryStorage({
437
+ * name: 'user-preferences',
438
+ * singleton: { enabled: true },
439
+ * initialState: { theme: 'light' }
440
+ * })
441
+ *
442
+ * // Продвинутые настройки
443
+ * const storage = new MemoryStorage({
444
+ * name: 'shared-state',
445
+ * singleton: {
446
+ * enabled: true,
447
+ * mergeStrategy: ConfigMergeStrategy.DEEP_MERGE,
448
+ * warnOnConflict: true,
449
+ * key: 'custom-singleton-key'
450
+ * },
451
+ * initialState: { user: null, settings: {} }
452
+ * })
453
+ * ```
454
+ *
455
+ * @see {@link ConfigMergeStrategy} для стратегий разрешения конфликтов
456
+ */
457
+ interface SingletonOptions {
458
+ /**
459
+ * Включить Singleton Pattern для данного хранилища
460
+ *
461
+ * При `true` хранилища с одинаковым именем (или ключом) будут
462
+ * возвращать один и тот же экземпляр вместо создания нового
463
+ *
464
+ * @default false
465
+ */
466
+ enabled: boolean;
467
+ /**
468
+ * Стратегия разрешения конфликтов при различающихся конфигурациях
469
+ *
470
+ * Определяет как поступать, когда singleton с тем же именем
471
+ * создается с отличающимися параметрами (initialState, middlewares и т.д.)
472
+ *
473
+ * @default ConfigMergeStrategy.FIRST_WINS
474
+ * @see {@link ConfigMergeStrategy}
475
+ */
476
+ mergeStrategy?: ConfigMergeStrategy;
477
+ /**
478
+ * Выводить предупреждения при обнаружении конфликтов конфигурации
479
+ *
480
+ * При `true` будет логировать в консоль информацию о различиях
481
+ * в конфигурациях между экземплярами singleton (кроме стратегии STRICT)
482
+ *
483
+ * @default true
484
+ */
485
+ warnOnConflict?: boolean;
486
+ /**
487
+ * Кастомный ключ для идентификации singleton экземпляра
488
+ *
489
+ * По умолчанию используется комбинация `{StorageType}_{name}`,
490
+ * но можно задать собственный ключ для более тонкого контроля
491
+ *
492
+ * @example
493
+ * ```typescript
494
+ * // Разные хранилища с одним именем, но разными ключами
495
+ * const userCache = new MemoryStorage({
496
+ * name: 'user',
497
+ * singleton: { enabled: true, key: 'user-cache' }
498
+ * })
499
+ *
500
+ * const userSettings = new LocalStorage({
501
+ * name: 'user', // То же имя!
502
+ * singleton: { enabled: true, key: 'user-settings' } // Но разный ключ
503
+ * })
504
+ * ```
505
+ *
506
+ * @default `${StorageType}_${name}`
507
+ */
508
+ key?: string;
509
+ }
510
+
366
511
  declare enum StorageStatus {
367
512
  IDLE = "idle",// Не инициализировано
368
513
  LOADING = "loading",// В процессе инициализации
@@ -424,21 +569,23 @@ interface DefaultMiddlewares {
424
569
  }
425
570
  type GetDefaultMiddleware = () => DefaultMiddlewares;
426
571
  type ConfigureMiddlewares = (getDefaultMiddleware: GetDefaultMiddleware) => Middleware[];
427
- interface StorageConfig {
572
+ interface StorageConfig<T extends Record<string, any> = Record<string, any>> {
428
573
  name: string;
429
- initialState?: Record<string, any>;
574
+ initialState?: Partial<T>;
430
575
  middlewares?: ConfigureMiddlewares;
431
576
  }
432
- type StorageType = 'memory' | 'localStorage' | 'indexedDB';
433
- interface MemoryStorageConfig extends StorageConfig {
434
- type: 'memory';
435
- }
436
- interface LocalStorageConfig extends StorageConfig {
437
- type: 'localStorage';
577
+ interface StorageSingletonConfig<T extends Record<string, any> = Record<string, any>> extends StorageConfig<T> {
578
+ singleton?: SingletonOptions;
438
579
  }
439
- interface IndexedDBStorageConfig extends StorageConfig {
440
- type: 'indexedDB';
580
+ type StorageType = 'memory' | 'localStorage' | 'indexedDB';
581
+ type MemoryStorageConfig<T extends Record<string, any> = Record<string, any>> = StorageSingletonConfig<T>;
582
+ type LocalStorageConfig<T extends Record<string, any> = Record<string, any>> = StorageSingletonConfig<T>;
583
+ interface IndexedDBStorageConfig<T extends Record<string, any> = Record<string, any>> extends StorageSingletonConfig<T> {
441
584
  options: IndexedDBConfig;
442
585
  }
586
+ interface UniversalStorageConfig<T extends Record<string, any> = Record<string, any>> extends StorageSingletonConfig<T> {
587
+ type: StorageType;
588
+ options?: IndexedDBConfig;
589
+ }
443
590
 
444
- export { type BatchingMiddlewareOptions as B, type ConfigureMiddlewares as C, type DefaultMiddlewares as D, type GetDefaultMiddleware as G, IndexedDBStorage as I, type LocalStorageConfig as L, type Middleware as M, type NextFunction as N, type PluginContext as P, type ShallowCompareMiddlewareOptions as S, type MiddlewareAPI as a, type StorageAction as b, type StorageKeyType as c, type IPlugin as d, type IStoragePlugin as e, type IPluginExecutor as f, type IPluginManager as g, StorageStatus as h, type StorageInitStatus as i, type IStorage as j, StorageEvents as k, type StorageEvent as l, type IEventEmitter as m, type ILogger as n, type StorageConfig as o, type StorageType as p, type MemoryStorageConfig as q, type IndexedDBStorageConfig as r, BaseStorage as s };
591
+ export { type BatchingMiddlewareOptions as B, ConfigMergeStrategy as C, type DefaultMiddlewares as D, type GetDefaultMiddleware as G, IndexedDBStorage as I, type LocalStorageConfig as L, type Middleware as M, type NextFunction as N, type PluginContext as P, type ShallowCompareMiddlewareOptions as S, type UniversalStorageConfig as U, type MiddlewareAPI as a, type StorageAction as b, type StorageKeyType as c, type IPlugin as d, type IStoragePlugin as e, type IPluginExecutor as f, type IPluginManager as g, StorageStatus as h, type StorageInitStatus as i, type IStorage as j, StorageEvents as k, type StorageEvent as l, type IEventEmitter as m, type ILogger as n, type ConfigureMiddlewares as o, type StorageConfig as p, type StorageSingletonConfig as q, type StorageType as r, type MemoryStorageConfig as s, type IndexedDBStorageConfig as t, BaseStorage as u };
package/dist/utils.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { a as SynapseStoreWithDispatcher } from './createSynapse-CzeX0ONj.js';
2
- export { A as AnySynapseStore, S as SynapseStoreBasic, b as SynapseStoreWithEffects, c as createSynapse } from './createSynapse-CzeX0ONj.js';
3
- import { j as IStorage } from './storage.interface-2HKvqdAJ.js';
4
- import { D as DispatchFunction, f as DispatchActions } from './dispatcher.module-DjMloBXe.js';
1
+ import { a as SynapseStoreWithDispatcher, A as AnySynapseStore } from './createSynapse-vkfKjRob.js';
2
+ export { S as SynapseStoreBasic, b as SynapseStoreWithEffects, c as createSynapse } from './createSynapse-vkfKjRob.js';
3
+ import { j as IStorage } from './storage.interface-BA_ktyDz.js';
4
+ import { D as DispatchFunction, f as DispatchActions } from './dispatcher.module-BOsMHbD5.js';
5
5
  import 'rxjs';
6
6
  import './selector.interface-CA5y-kD_.js';
7
7
 
@@ -92,4 +92,48 @@ declare const createEventBus: (config?: EventBusConfig) => Promise<SynapseStoreW
92
92
  getActiveSubscriptions: DispatchFunction<any, any[]>;
93
93
  }>>>;
94
94
 
95
- export { type EventBusConfig, type EventBusEvent, type EventBusState, SynapseStoreWithDispatcher, createEventBus };
95
+ interface SynapseAwaiter<TStore extends Record<string, any>, TStorage extends IStorage<TStore>, TSelectors, TActions> {
96
+ /**
97
+ * Возвращает Promise, который резолвится когда Synapse готов
98
+ */
99
+ waitForReady(): Promise<AnySynapseStore<TStore, TStorage, TSelectors, TActions>>;
100
+ /**
101
+ * Проверяет, готов ли Synapse прямо сейчас (синхронно)
102
+ */
103
+ isReady(): boolean;
104
+ /**
105
+ * Получает store если он готов, иначе undefined
106
+ */
107
+ getStoreIfReady(): AnySynapseStore<TStore, TStorage, TSelectors, TActions> | undefined;
108
+ /**
109
+ * Подписывается на событие готовности
110
+ * @param callback Функция, вызываемая когда store становится готов
111
+ * @returns Функция отписки
112
+ */
113
+ onReady(callback: (store: AnySynapseStore<TStore, TStorage, TSelectors, TActions>) => void): VoidFunction;
114
+ /**
115
+ * Подписывается на ошибки инициализации
116
+ * @param callback Функция, вызываемая при ошибке
117
+ * @returns Функция отписки
118
+ */
119
+ onError(callback: (error: Error) => void): VoidFunction;
120
+ /**
121
+ * Получает текущий статус
122
+ */
123
+ getStatus(): 'pending' | 'ready' | 'error';
124
+ /**
125
+ * Получает ошибку если есть
126
+ */
127
+ getError(): Error | null;
128
+ /**
129
+ * Очищает ресурсы
130
+ */
131
+ destroy(): void;
132
+ }
133
+ /**
134
+ * Создает фреймворк-независимую утилиту для ожидания готовности Synapse
135
+ * Работает в любом JS окружении: Node.js, браузер, React Native, и т.д.
136
+ */
137
+ declare function createSynapseAwaiter<TStore extends Record<string, any>, TStorage extends IStorage<TStore>, TSelectors, TActions>(synapseStorePromise: Promise<AnySynapseStore<TStore, TStorage, TSelectors, TActions>> | AnySynapseStore<TStore, TStorage, TSelectors, TActions>): SynapseAwaiter<TStore, TStorage, TSelectors, TActions>;
138
+
139
+ export { AnySynapseStore, type EventBusConfig, type EventBusEvent, type EventBusState, SynapseStoreWithDispatcher, createEventBus, createSynapseAwaiter };