UNPKG

synapse-storage

Version:

Набор инструментов для управления состоянием и апи-запросами

2 lines (1 loc) 40.8 kB
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};