synapse-storage 3.0.16 → 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/index.js CHANGED
@@ -1 +1 @@
1
- var pe={debug:(n,...e)=>{process.env.NODE_ENV},log:(n,...e)=>{process.env.NODE_ENV},info:(n,...e)=>{},warn:(n,...e)=>{},error:(n,...e)=>{}};function ge(n){return`${n?`${n}|`:""}${Math.random().toString(36).substring(2,9)+Date.now().toString(36)}`}function he(n){let e={};return n.forEach((t,s)=>{e[s.toLowerCase()]=t}),e}function U(n={},e={}){return{...n,...e,getFromStorage:n.getFromStorage||(t=>{try{let s=localStorage.getItem(t);return s?JSON.parse(s):void 0}catch{return}}),getCookie:n.getCookie||(t=>{try{let s=document.cookie.match(new RegExp(`(?:^|; )${t.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")}=([^;]*)`));return s?decodeURIComponent(s[1]):void 0}catch{return}})}}async function ye(n,e){let t=new Headers,s=e||U({},{});if(n)try{t=await Promise.resolve(n(t,s))}catch{}return t}function fe(n,e){return async(t,s)=>{let r=new Headers(t);if(n)try{r=await Promise.resolve(n(r,s))}catch{}if(e)try{r=await Promise.resolve(e(r,s))}catch{}return r}}var V=(a=>(a.Json="json",a.Blob="blob",a.ArrayBuffer="arrayBuffer",a.Text="text",a.FormData="formData",a.Raw="raw",a))(V||{});function Se(n){let e=n.toLowerCase().split(";")[0].trim();if(e.includes("application/json"))return"json";if(e.includes("text/"))return"text";if(e.includes("multipart/form-data"))return"formData";if(e.includes("application/octet-stream")||e.includes("application/pdf")||e.includes("image/")||e.includes("audio/")||e.includes("video/"))return"blob"}function te(n){let e=n.get("content-type")||"",t=n.get("content-disposition")||"",s=e.includes("application/octet-stream")||e.includes("application/pdf")||e.includes("image/")||e.includes("audio/")||e.includes("video/"),r=t.includes("attachment")||t.includes("filename=");return s||r}function ke(n){let e=n.get("content-disposition");if(!e)return;let t=e.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);if(t&&t[1])return t[1].replace(/['"]/g,"").trim()}function me(n){let e=n.get("content-type")||"",t=n.get("content-disposition")||"",s=n.get("content-length");return te(n)?{filename:ke(n),contentType:e,contentDisposition:t,size:s?parseInt(s,10):void 0}:void 0}async function Ue(n,e){let t=e,s=n.headers.get("content-type")||"";!t&&s&&(te(n.headers)?t="blob":t=Se(s)),t||(t="json");try{let r;switch((t==="blob"||t==="arrayBuffer")&&(r=me(n.headers)),t){case"json":try{let a=await n.json();return n.ok?{data:a,fileMetadata:r}:{error:a,fileMetadata:r}}catch{let i=await n.text();return n.ok?{data:i,fileMetadata:r}:{error:i,fileMetadata:r}}case"text":{let a=await n.text();return n.ok?{data:a,fileMetadata:r}:{error:a,fileMetadata:r}}case"blob":{let a=await n.blob();return n.ok?{data:a,fileMetadata:r}:{error:a,fileMetadata:r}}case"arrayBuffer":{let a=await n.arrayBuffer();return n.ok?{data:a,fileMetadata:r}:{error:a,fileMetadata:r}}case"formData":{let a=await n.formData();return n.ok?{data:a,fileMetadata:r}:{error:a,fileMetadata:r}}case"raw":return n.ok?{data:n,fileMetadata:r}:{error:n,fileMetadata:r};default:let o=await n.blob();return n.ok?{data:o,fileMetadata:r}:{error:o,fileMetadata:r}}}catch(r){return n.ok?{data:void 0}:{error:r}}}function Te(n){let{baseUrl:e,timeout:t=3e4,fetchFn:s=fetch,credentials:r="same-origin"}=n;return async(o,a={},i)=>{let{path:c,method:d,body:l,query:u,responseFormat:p}=o,{signal:g,timeout:h=t,responseFormat:y}=a,E=y||p,S=new URL(c.startsWith("http")?c:`${e}${c}`);u&&Object.entries(u).forEach(([m,b])=>{b!=null&&(Array.isArray(b)?b.forEach(x=>S.searchParams.append(m,String(x))):S.searchParams.append(m,String(b)))});let f;if(l!==void 0)if(l instanceof FormData||l instanceof Blob)f=l;else if(typeof l=="object"&&l!==null)try{f=JSON.stringify(l),i.has("Content-Type")||i.set("Content-Type","application/json")}catch{f=String(l)}else f=String(l);let R,w=new Promise((m,b)=>{h&&(R=window.setTimeout(()=>{b(new Error(`\u041F\u0440\u0435\u0432\u044B\u0448\u0435\u043D\u043E \u0432\u0440\u0435\u043C\u044F \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F \u0437\u0430\u043F\u0440\u043E\u0441\u0430 (${h}\u043C\u0441)`))},h))});try{let m=s(S.toString(),{method:d,headers:i,body:f,signal:g,credentials:r}),b=await Promise.race([m,w]),{data:x,error:ee,fileMetadata:Ne}=await Ue(b,E);return{data:x,error:ee,ok:b.ok,status:b.status,statusText:b.statusText,headers:b.headers,fileDownloadResult:Ne}}catch(m){let b=m;return{error:b,ok:!1,status:0,statusText:b.message,headers:new Headers}}finally{R&&window.clearTimeout(R)}}}function be(n,e=[]){let t={};return!n||e.length===0||e.forEach(s=>{n.has(s)&&(t[s]=n.get(s)||"")}),t}var j=class{constructor(e,t,s,r,o,a){this.name=e;this.queryStorage=t;this.configCurrentEndpoint=s;this.cacheableHeaderKeys=r;this.globalCacheConfig=o;this.baseQueryConfig=a;this.prepareHeaders=fe(a.prepareHeaders,s.prepareHeaders),this.queryFunction=Te({baseUrl:a.baseUrl,fetchFn:a.fetchFn,timeout:a.timeout,credentials:a.credentials}),this.cacheableHeaders=[...r||[],...s.includeCacheableHeaderKeys||[]].filter(i=>!s.excludeCacheableHeaderKeys?.includes(i)),this.meta.name=e,this.meta.tags=s.tags??this.meta.tags,this.meta.invalidatesTags=s.invalidatesTags??this.meta.invalidatesTags,this.meta.cache=this.queryStorage.createCacheConfig(this.configCurrentEndpoint)??this.meta.cache}endpointSubscribers=new Set;fetchCounts=0;meta={cache:!1,invalidatesTags:[],name:"",tags:[]};queryFunction;cacheableHeaders;prepareHeaders;request(e,t){this.fetchCounts++;let s=ge(this.name),r=new AbortController,o=new Set,a={status:"idle",requestParams:e,headers:{},error:void 0,data:void 0,fromCache:!1},i=U({requestParams:e},t?.context||{}),c=l=>{Object.assign(a,l),o.forEach(u=>{u({...a})})},d=new Promise(async(l,u)=>{try{let p=await ye(this.prepareHeaders,i),g=be(p,t?.cacheableHeaderKeys?t.cacheableHeaderKeys:this.cacheableHeaders),h=this.queryStorage.shouldCache(this.configCurrentEndpoint,t),[y,E]=this.queryStorage.createCacheKey(this.name,{...e,...g}),S;if(h&&(S=await this.queryStorage.getCachedResult(y)),S)c({fromCache:!0,status:"success",data:S.data,error:void 0,headers:S.headers,requestParams:e}),l({...S,fromCache:!0});else{c({fromCache:!1,status:"loading"});let f=this.configCurrentEndpoint.request(e,t?.context),R={...t,signal:r.signal},w=await this.queryFunction(f,R,p);if(w.ok){let{headers:m,...b}=w;if(this.configCurrentEndpoint.invalidatesTags?.length&&await this.queryStorage.invalidateCacheByTags(this.configCurrentEndpoint.invalidatesTags),h){let x=this.queryStorage.createCacheConfig(this.configCurrentEndpoint);await this.queryStorage.setCachedResult(y,{...b,headers:he(m)},x,E??{},this.configCurrentEndpoint.tags??[])}c({fromCache:!1,status:"success",data:w.data,error:void 0,headers:w.headers,requestParams:e}),this.endpointSubscribers.forEach(x=>{let ee={status:"success",fetchCounts:this.fetchCounts,meta:this.meta,cacheableHeaders:this.cacheableHeaders,error:void 0};x(ee)}),l({...w,fromCache:!1})}else c({fromCache:!1,status:"error",data:void 0,error:w.error,headers:w.headers,requestParams:e}),this.endpointSubscribers.forEach(m=>{let b={status:"error",fetchCounts:this.fetchCounts,meta:this.meta,cacheableHeaders:this.cacheableHeaders,error:w.error};m(b)}),u(w.error)}}catch(p){c({fromCache:!1,status:"error",data:void 0,error:p,headers:void 0,requestParams:e}),u(p)}});return{id:s,subscribe(l,u={}){let{autoUnsubscribe:p=!0}=u;o.add(l),l(a);let g=()=>o.delete(l);return p&&d.finally(()=>{g()}),g},wait:()=>d,waitWithCallbacks(l={}){let{idle:u,loading:p,success:g,error:h}=l;return this.subscribe(y=>{switch(y.status){case"idle":u?.(y);break;case"loading":p?.(y);break;case"success":g?.(y.data,y);break;case"error":h?.(y.error,y);break}},{autoUnsubscribe:!0}),d},abort:()=>{r&&!r.signal.aborted&&r.abort()},then:(l,u)=>d.then(l,u),catch:l=>d.catch(l),finally:l=>d.finally(l)}}subscribe(e){this.endpointSubscribers.add(e);let t={status:"idle",fetchCounts:this.fetchCounts,meta:this.meta,cacheableHeaders:this.cacheableHeaders,error:void 0};return e(t),()=>this.endpointSubscribers.delete(e)}reset(){return this.fetchCounts=0,Promise.resolve()}destroy(){this.endpointSubscribers.clear()}};var T=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 D=class{static createMetadata(e=0,t=[]){let s=Date.now(),r=e>0?s+e:1/0;return{createdAt:s,updatedAt:s,expiresAt:r,tags:t,createdAtDateTime:this.formatDateTime(s),updatedAtDateTime:this.formatDateTime(s),expiresAtDateTime:r===1/0?"never":this.formatDateTime(r)}}static formatDateTime(e){return new Date(e).toISOString()}static isExpired(e){return Date.now()>e.expiresAt}static updateMetadata(e){return{...e,updatedAt:Date.now()}}static createKey(...e){return new T(e.join("_"))}static createApiKey(e,t){if(!t)return[new T(e,!0),t];let s=Object.entries(t).sort(([r],[o])=>r.localeCompare(o)).map(([r,o])=>`${r}=${o}`).join("&");return[new T(`${e}_${s}`,!0),t]}static hasAnyTag(e,t=[]){return!e.tags||!t.length?!1:t.some(s=>e.tags?.includes(s))}};var H=class{constructor(e,t){this.storageExternal=e;this.globalCacheConfig=t}storage=null;cleanupInterval=null;defaultCacheOptions={ttl:5*60*1e3,cleanup:{enabled:!0,interval:10*60*1e3},invalidateOnError:!0};async initialize(){return await this.createStorage(),this.startCleanupInterval(),this}async createStorage(){try{let e=this.storageExternal;await e.initialize(),this.storage=e}catch(e){throw e}}startCleanupInterval(){this.cleanupInterval&&(clearInterval(this.cleanupInterval),this.cleanupInterval=null);let e=typeof this.globalCacheConfig=="object"?this.globalCacheConfig.cleanup:this.defaultCacheOptions.cleanup;e?.enabled&&e.interval&&(this.cleanupInterval=setInterval(()=>{this.cleanup().catch(t=>{})},e.interval))}getStorage(){return this.storage}createCacheKey(e,t){return D.createApiKey(e,t)}async getCachedResult(e){if(!this.storage)throw new Error("\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043E");let t=await this.storage.get(e);if(!t)return;if(D.isExpired(t.metadata)){await this.storage.delete(e);return}let s={...t,metadata:D.updateMetadata(t.metadata)};return await this.storage.set(e,s),t.data}async setCachedResult(e,t,s,r,o){if(!this.storage)throw new Error("\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043E");let a=D.createMetadata(s.ttl,o),i={data:t,metadata:a,params:r};await this.storage.set(e,i)}shouldCache(e,t){return!(this.globalCacheConfig===!1||e?.cache===!1||typeof e?.cache=="object"&&e?.cache.ttl===0||t?.disableCache===!0||this.globalCacheConfig===void 0&&e?.cache===void 0)}createCacheConfig(e){let t=this.defaultCacheOptions;if(typeof this.globalCacheConfig=="object"&&(t=this.globalCacheConfig),typeof e?.cache=="object"){let s=e.cache;t={...t,...s}}return t}async invalidateCacheByTags(e){if(!this.storage)throw new Error("\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043E");let t=await this.storage.keys();for(let s of t){let r=await this.storage.get(s);r&&D.hasAnyTag(r.metadata,e)&&await this.storage.delete(s)}}async invalidateCache(e){if(!this.storage)throw new Error("\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043E");await this.storage.delete(e)}async cleanup(){if(!this.storage)throw new Error("\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043E");let e=await this.storage.keys();for(let t of e){let s=await this.storage.get(t);s&&D.isExpired(s.metadata)&&await this.storage.delete(t)}}async destroy(){this.cleanupInterval&&(window.clearInterval(this.cleanupInterval),this.cleanupInterval=null),this.storage&&(await this.storage.destroy(),this.storage=null)}};var we=class{queryStorage;cacheableHeaderKeys;globalCacheConfig;baseQueryConfig;storageExternal;createEndpoints;endpoints={};constructor(e){this.cacheableHeaderKeys=e.cacheableHeaderKeys,this.globalCacheConfig=e.cache,this.baseQueryConfig=e.baseQuery,this.storageExternal=e.storage,this.createEndpoints=e.endpoints}async init(){return this.queryStorage=await new H(this.storageExternal,this.globalCacheConfig).initialize(),await this.initializeEndpoints(),this}async initializeEndpoints(){let e=s=>s,t=await this.createEndpoints(e)||{};for(let[s,r]of Object.entries(t)){let o=s;this.endpoints[o]=new j(s,this.queryStorage,r,this.cacheableHeaderKeys,this.globalCacheConfig,this.baseQueryConfig)}}getEndpoints(){return this.endpoints}async request(e,t,s){let o=this.getEndpoints()[e];if(!o)throw new Error(`\u042D\u043D\u0434\u043F\u043E\u0438\u043D\u0442 ${String(e)} \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D`);try{return await o.request(t,s).wait()}catch(a){throw pe.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0437\u0430\u043F\u0440\u043E\u0441\u0430 \u043A ${String(e)}`,{error:a,params:t}),a}}async destroy(){await Promise.all(Object.values(this.endpoints).map(async e=>(e.destroy(),Promise.resolve()))),this.endpoints={},await this.queryStorage.destroy()}};var v=!1,$=new Map;function Ee(n){let e=0;if(n.length===0)return e.toString(36);for(let t=0;t<n.length;t++){let s=n.charCodeAt(t);e=(e<<5)-e+s,e=e&e}return Math.abs(e).toString(36).substring(0,6)}function I(n,e){if(n===e)return!0;if(n==null||e==null)return!1;if(typeof n!="object"&&typeof n!="function"&&typeof e!="object"&&typeof e!="function")return n===e;if(typeof n!=typeof e)return!1;if(n instanceof Date&&e instanceof Date)return n.getTime()===e.getTime();if(Array.isArray(n)&&Array.isArray(e)){if(n.length!==e.length)return!1;for(let t=0;t<n.length;t++)if(!I(n[t],e[t]))return!1;return!0}if(typeof n=="object"&&typeof e=="object"){let t=Object.keys(n),s=Object.keys(e);return t.length!==s.length?!1:t.every(r=>Object.prototype.hasOwnProperty.call(e,r)?I(n[r],e[r]):!1)}return!1}function ve(n,e=I){let t,s,r=!1;return function(a){if(!r||t!==a){let i=n(a);(!r||!e(i,s))&&(s=i),t=a,r=!0}return s}}var L=class{constructor(e,t,s=I,r){this.name=e;this.equals=s;this.logger=r;this.id=e,this.memoizedGetState=this.createMemoizedGetState(t)}id;subscribers=new Set;lastValue;memoizedGetState;createMemoizedGetState(e){let t=null,s=!1;return async()=>{if(s&&t)return t;s=!0;try{return t=e(),await t}finally{s=!1}}}async notify(){try{let e=await this.memoizedGetState();if(this.lastValue===void 0||!this.equals(e,this.lastValue)){this.lastValue=e;let t=Array.from(this.subscribers).map(async s=>{try{await s.notify(e)}catch(r){this.logger?.error(`[${this.id}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0438 \u043F\u043E\u0434\u043F\u0438\u0441\u0447\u0438\u043A\u0430`,{error:r})}});await Promise.all(t)}}catch(e){throw this.logger?.error(`[${this.id}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 notify()`,{error:e}),e}}subscribe(e){return this.subscribers.add(e),this.lastValue!==void 0?Promise.resolve().then(()=>{try{e.notify(this.lastValue)}catch(t){this.logger?.error(`[${this.id}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u0435\u0440\u0432\u043E\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u043C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0438`,{error:t})}}):this.notify().catch(t=>{this.logger?.error(`[${this.id}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u0435\u0440\u0432\u043E\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u043C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0438`,{error:t})}),()=>{this.subscribers.delete(e)}}cleanup(){this.subscribers.clear(),this.lastValue=void 0}getId(){return this.id}},z=class{constructor(e,t){this.source=e;this.logger=t;this.storageName=e.name,this.source.getState().then(s=>{this.cachedState=s})}storageName;subscriptions=new Map;cachedState;localSelectorCache=new Map;batchUpdateInProgress=!1;pendingUpdates=new Set;generateName(e,t,s){let r=e?"simple":"combined",o="";if(e){let a=t.toString();o=Ee(a)}else{let a=t.map(c=>c.getId()).join("_"),i=s.toString();o=Ee(a+i)}return`${this.storageName}_${r}_${o}`}processPendingUpdates(){this.pendingUpdates.size===0||this.batchUpdateInProgress||(this.batchUpdateInProgress=!0,setTimeout(async()=>{try{let e=Array.from(this.pendingUpdates);this.pendingUpdates.clear(),this.cachedState=await this.source.getState();let t=e.map(async s=>{let r=this.subscriptions.get(s);if(r)try{return await r.notify()}catch(o){this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u043F\u0438\u0441\u0447\u0438\u043A\u0430 ${s}`,{error:o})}return Promise.resolve()});await Promise.all(t)}catch(e){this.logger?.error("\u041E\u0448\u0438\u0431\u043A\u0430 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0438 \u043E\u0436\u0438\u0434\u0430\u044E\u0449\u0438\u0445 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0439",{error:e})}finally{this.batchUpdateInProgress=!1,this.pendingUpdates.size>0&&this.processPendingUpdates()}},0))}createSelector(e,t,s){let r=!Array.isArray(e),o=r?t||{}:s||{},a=o.name||this.generateName(r,e,r?void 0:t);if(this.localSelectorCache.has(a))return this.localSelectorCache.get(a).api;if($.has(a)){let l=$.get(a);return l.refCount++,l.api}let i,c,d=[];if(r){let l=ve(e,o.equals||I),u=this.createSimpleSelector(l,{...o,name:a,equals:o.equals||I});i=u.api,d=u.unsubscribeFunctions}else{c=e;let l=this.createCombinedSelector(c,t,{...o,name:a,equals:o.equals||I});i=l.api,d=l.unsubscribeFunctions}return this.localSelectorCache.set(a,{api:i,dependencies:c,unsubscribeFunctions:d}),$.set(a,{api:i,refCount:1,unsubscribeFunctions:d}),i}createSimpleSelector(e,t){let s=async()=>{if(this.cachedState)return e(this.cachedState);let c=await this.source.getState();return this.cachedState=c,e(c)},r=new L(t.name,s,t.equals||I,this.logger),o=r.getId();this.subscriptions.set(o,r);let i=[this.source.subscribeToAll(async c=>{c?.type==="storage:update"&&(this.pendingUpdates.add(o),this.processPendingUpdates())})];return{api:{select:()=>s(),subscribe:c=>r.subscribe(c),getId:()=>o},unsubscribeFunctions:i}}createCombinedSelector(e,t,s){let r=ve(u=>t(...u),s.equals||I),o=async()=>{let u=await Promise.all(e.map(p=>p.select()));return r(u)},a=new L(s.name,o,s.equals||I,this.logger),i=a.getId();this.subscriptions.set(i,a);let c=null,d=()=>{c!==null&&clearTimeout(c),c=setTimeout(()=>{c=null,a.notify().catch(u=>this.logger?.error(`[${i}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u0435\u043D\u043D\u043E\u043C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0438:`,{error:u}))},10)},l=e.map(u=>u.subscribe({notify:()=>{d()}}));return{api:{select:()=>o(),subscribe:u=>a.subscribe(u),getId:()=>i},unsubscribeFunctions:l}}destroy(){this.subscriptions.forEach(t=>t.cleanup()),this.subscriptions.clear(),this.cachedState=void 0,this.pendingUpdates.clear(),this.localSelectorCache.forEach(t=>{t.unsubscribeFunctions.forEach(s=>s())});let e=new Set;this.localSelectorCache.forEach((t,s)=>{e.add(s)}),this.localSelectorCache.clear(),e.forEach(t=>{let s=$.get(t);s&&(s.refCount--,s.refCount<=0&&(s.unsubscribeFunctions.forEach(r=>r()),$.delete(t)))})}};var Re=class{constructor(e,t,s="default"){this.parentExecutor=e;this.logger=t;this.storageName=s}plugins=new Map;createContext(e){return{storageName:this.storageName,timestamp:Date.now(),metadata:e}}async add(e){if(this.plugins.has(e.name)){this.logger?.warn(`\u041F\u043B\u0430\u0433\u0438\u043D ${e.name} \u0443\u0436\u0435 \u0431\u044B\u043B \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D`);return}try{await e.initialize?.(),this.plugins.set(e.name,e),this.logger?.info("\u041F\u043B\u0430\u0433\u0438\u043D \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D",{name:e.name})}catch(t){throw t}}async remove(e){let t=this.plugins.get(e);t&&(await t.destroy?.(),this.plugins.delete(e),this.logger?.info("\u041F\u043B\u0430\u0433\u0438\u043D \u0443\u0434\u0430\u043B\u0435\u043D",{name:e}))}get(e){return this.plugins.get(e)}getAll(){return Array.from(this.plugins.values())}async initialize(){for(let e of this.plugins.values())await e.initialize?.()}async destroy(){await Promise.all(Array.from(this.plugins.values()).map(e=>e.destroy?.()??Promise.resolve())),this.plugins.clear()}async executeBeforeSet(e,t){let s=e,r=this.createContext(t);this.parentExecutor&&(s=await this.parentExecutor.executeBeforeSet(s,r));for(let o of this.plugins.values())if(o.onBeforeSet)try{s=await o.onBeforeSet(s,r)}catch(a){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${o.name} onBeforeSet`,{error:a}),a}return s}async executeAfterSet(e,t,s){let r=t,o=this.createContext(s);this.parentExecutor&&(r=await this.parentExecutor.executeAfterSet(e,r,o));for(let a of this.plugins.values())if(a.onAfterSet)try{r=await a.onAfterSet(e,r,o)}catch(i){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${a.name} onAfterSet`,{key:e,error:i}),i}return r}async executeBeforeGet(e,t){let s=e,r=this.createContext(t);this.parentExecutor&&(s=await this.parentExecutor.executeBeforeGet(s,r));for(let o of this.plugins.values())if(o.onBeforeGet)try{s=await o.onBeforeGet(s,r)}catch(a){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${o.name} onBeforeGet`,{key:e,error:a}),a}return s}async executeAfterGet(e,t,s){let r=t,o=this.createContext(s);this.parentExecutor&&(r=await this.parentExecutor.executeAfterGet(e,r,o));for(let a of this.plugins.values())if(a.onAfterGet)try{r=await a.onAfterGet(e,r,o)}catch(i){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${a.name} onAfterGet`,{key:e,error:i}),i}return r}async executeBeforeDelete(e,t){let s=!0,r=this.createContext(t);this.parentExecutor&&(s=await this.parentExecutor.executeBeforeDelete(e,r));for(let o of this.plugins.values())if(o.onBeforeDelete)try{s=await o.onBeforeDelete(e,r)&&s}catch(a){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${o.name} onBeforeDelete`,{key:e,error:a}),a}return s}async executeAfterDelete(e,t){let s=this.createContext(t);this.parentExecutor&&await this.parentExecutor.executeAfterDelete(e,s);for(let r of this.plugins.values())if(r.onAfterDelete)try{await r.onAfterDelete(e,s)}catch(o){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${r.name} onAfterDelete`,{key:e,error:o}),o}}async executeOnClear(e){let t=this.createContext(e);this.parentExecutor&&await this.parentExecutor.executeOnClear(t);for(let s of this.plugins.values())if(s.onClear)try{await s.onClear(t)}catch(r){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${s.name} onClear`,{error:r}),r}}};var xe=(r=>(r.IDLE="idle",r.LOADING="loading",r.READY="ready",r.ERROR="error",r))(xe||{}),re=(a=>(a.STORAGE_UPDATE="storage:update",a.STORAGE_DELETE="storage:delete",a.STORAGE_PATCH="storage:patch",a.STORAGE_SELECT="storage:select",a.STORAGE_CLEAR="storage:clear",a.STORAGE_DESTROY="storage:destroy",a))(re||{});var _=class{channel;tabId;messageHandlers;syncHandler;debug;syncTimeoutMs=1e3;pendingSyncRequests;constructor(e,t={}){this.channel=new BroadcastChannel(e),this.tabId=crypto.randomUUID(),this.messageHandlers=new Set,this.debug=t.debug??!1,this.pendingSyncRequests=new Map,this.channel.onmessage=this.handleMessage.bind(this),this.channel.onmessageerror=this.handleError.bind(this)}log(...e){this.debug}error(...e){}async handleMessage(e){let t=e.data;if(t.senderId!==this.tabId){if(t.type==="SYNC_REQUEST"){if(this.syncHandler)try{let s=await this.syncHandler();this.postMessage("SYNC_RESPONSE",s,t.senderId)}catch(s){this.error("Error handling sync request:",s)}return}if(t.type==="SYNC_RESPONSE"){let s=this.pendingSyncRequests.get(this.tabId);s&&(clearTimeout(s.timeout),this.pendingSyncRequests.delete(this.tabId),s.resolve(t.payload));return}for(let s of this.messageHandlers)try{await s(t)}catch(r){this.error("Error in message handler:",r)}}}handleError(e){this.error("Channel error:",e)}postMessage(e,t,s){let r={type:e,payload:t,senderId:this.tabId,timestamp:Date.now()};this.channel.postMessage(r)}subscribe(e){return this.messageHandlers.add(e),()=>this.messageHandlers.delete(e)}setSyncHandler(e){this.syncHandler=e}broadcast(e,t){this.postMessage(e,t)}async requestSync(){return new Promise((e,t)=>{let s=setTimeout(()=>{this.pendingSyncRequests.delete(this.tabId),e(null)},this.syncTimeoutMs);this.pendingSyncRequests.set(this.tabId,{resolve:e,reject:t,timeout:s}),this.postMessage("SYNC_REQUEST",{type:"sync"})})}close(){for(let[,e]of this.pendingSyncRequests)clearTimeout(e.timeout),e.reject(new Error("Channel closed"));this.pendingSyncRequests.clear(),this.messageHandlers.clear(),this.syncHandler=void 0,this.channel.close()}};async function Ve(n,e,t){switch(e){case"set":t?.key!==void 0&&t?.value!==void 0&&(await n.storage.doSet(t.key,t.value),n.storage.notifySubscribers(t.key,t.value));break;case"update":Array.isArray(t?.value)&&(await n.storage.doUpdate(t.value),t.value.forEach(({key:s,value:r})=>{n.storage.notifySubscribers(s,r)}));break;case"delete":t?.key!==void 0&&(await n.storage.doDelete(t.key),n.storage.notifySubscribers(t.key,void 0));break;case"clear":await n.storage.doClear(),n.storage.notifySubscribers("*",{type:"storage:update",value:{},source:"broadcast"});break}n.storage.notifySubscribers("*",{type:"storage:update",key:t?.key,value:t?.value,source:"broadcast"})}async function je(n,e,t){switch(e){case"set":if(t?.key!==void 0){let s=await n.storage.doGet(t.key);n.storage.notifySubscribers(t.key,s)}break;case"update":if(Array.isArray(t?.value)){for(let{key:s}of t.value){let r=await n.storage.doGet(s);n.storage.notifySubscribers(s,r)}n.storage.notifySubscribers("*",{type:"storage:update",key:t.value.map(({key:s})=>s),value:t.value,source:"broadcast"})}break;case"delete":t?.key!==void 0&&n.storage.notifySubscribers(t.key,void 0);break;case"clear":n.storage.notifySubscribers("*",{type:"storage:update",value:{},source:"broadcast"});break}e!=="update"&&n.storage.notifySubscribers("*",{type:"storage:update",key:t?.key,value:e==="delete"?void 0:t?.value,source:"broadcast"})}var Pe=n=>{let{storageName:e,storageType:t}=n,s=`${t}-${e}`,r=new _(s,{debug:!0});return{name:"broadcast",setup:o=>(t==="memory"&&(r.setSyncHandler(async()=>{let a=await o.getState();return{type:"update",key:"*",value:Object.entries(a).map(([d,l])=>({key:d,value:l})),metadata:{batchUpdate:!0,timestamp:Date.now()}}}),r.requestSync().then(async a=>{if(a?.type==="update"&&Array.isArray(a.value))try{if(!a.value.every(c=>c&&typeof c=="object"&&"key"in c&&"value"in c))return;await o.storage.doUpdate(a.value),a.value.forEach(({key:c,value:d})=>{o.storage.notifySubscribers(c,d)}),o.storage.notifySubscribers("*",{type:"storage:update",value:a.value,source:"broadcast"})}catch{}})),r.subscribe(async a=>{let{type:i,payload:c}=a;t==="memory"?await Ve(o,i,c):await je(o,i,c)})),reducer:o=>a=>async i=>{let c=await a(i);return["set","delete","clear","update"].includes(i.type)&&r.broadcast(i.type,i),c},cleanup:()=>{r.close()}}};var Ae=(n={})=>{let e=n.batchSize??10,t=n.batchDelay??10,s=new Map,r=new Map,o=p=>p.type==="set"||p.type==="update",a=p=>`${p.type}_${p.key?.toString()||"default"}`,i=p=>{let g=new Map;for(let h of p){let y=`${h.type}_${h.key?.toString()||"default"}`;g.set(y,h)}return Array.from(g.values())},c=p=>{let g=r.get(p);g&&(globalThis.clearTimeout(g),r.delete(p))},d=(p,g)=>{let h=globalThis.setTimeout(g,t);r.set(p,h)},l=async(p,g,h)=>{let y=s.get(p);if(!(!y||y.length===0)){s.delete(p),c(p);try{let E=y.map(f=>f.action),S=i(E);for(let f of S)try{let R=await h(f);y.filter(m=>m.action.type===f.type&&m.action.key?.toString()===f.key?.toString()).forEach(m=>m.resolve(R))}catch(R){y.filter(m=>m.action.type===f.type&&m.action.key?.toString()===f.key?.toString()).forEach(m=>m.reject(R))}}catch(E){y.forEach(S=>S.reject(E))}}},u=async(p,g,h)=>new Promise((y,E)=>{let S=a(p),f=s.get(S);f||(f=[],s.set(S,f)),f.push({action:p,resolve:y,reject:E,timestamp:Date.now()}),c(S),f.length>=e?setImmediate(()=>l(S,g,h)):d(S,()=>l(S,g,h))});return{name:"batching",setup:()=>{},cleanup:async()=>{r.forEach(p=>globalThis.clearTimeout(p)),r.clear(),s.clear()},reducer:p=>g=>async h=>o(h)?u(h,p,g):g(h)}};var Ce=(n={})=>{let{comparator:e=(r,o)=>{if(r===o)return!0;if(typeof r!="object"||typeof o!="object"||r===null||o===null)return r===o;let a=Object.keys(r),i=Object.keys(o);return a.length!==i.length?!1:a.every(c=>Object.prototype.hasOwnProperty.call(o,c)&&r[c]===o[c])},segments:t=[]}=n,s=new Map;return{name:"shallow-compare",setup:r=>{},reducer:r=>o=>async a=>{if(a.type!=="set"||t.length&&!t.includes(a.metadata?.segment??"default"))return o(a);let i=a.key,c=s.get(i),d=a.value;if(c!==void 0&&e(c,d))return{...c,t:{valueNotChanged:!0,originalValue:c}};let l=await o(a);return s.set(i,d),l}}};var W=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,...s}=e.metadata||{},r={...e,metadata:s};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 o=await this.api.storage.doGet("");return Object.keys(o||{}).length>0?o:r.value?(await this.api.storage.doSet("",r.value),this.api.storage.doGet("")):o}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 s=e;e=async r=>{if(r.metadata?.processed)return s(r);let o={...r,metadata:{...r.metadata,processed:!0,timestamp:r.metadata?.timestamp||Date.now()}};return t.reducer(this.api)(s)(o)}}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 A(n){return n instanceof T&&n.isUnparseable()?[n.toString()]:n.toString().replace(/\[/g,".").replace(/\]/g,"").split(".").filter(Boolean)}function C(n,e){return A(e).reduce((s,r)=>s===void 0?void 0:s[r],n)}function O(n,e,t){if(e==="")return t;let s=A(e);if(e instanceof T&&e.isUnparseable())return n[e.toString()]=t,n;let r=s.pop(),o=s.reduce((a,i)=>{let c=s[s.indexOf(i)+1],d=!Number.isNaN(Number(c));return i in a||(a[i]=d?[]:{}),a[i]},n);return o[r]=t,n}var M=class n{constructor(e,t,s,r){this.config=e;this.pluginExecutor=t;this.eventEmitter=s;this.logger=r;this.name=e.name,this.middlewareModule=new W({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="*";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 s=this.onStatusChange(r=>{r.status==="ready"?(s(),e(this)):r.status==="error"&&(s(),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 s=this.initStatus;this.statusSubscribers.forEach(r=>{try{r(s)}catch(o){this.logger?.error("Error in status change callback",{error:o})}})}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={})=>Ae(e),shallowCompare:(e={})=>Ce(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},s=await this.middlewareModule.dispatch({type:"get",key:e,metadata:t}),r=await this.pluginExecutor?.executeAfterGet(e,s,t)??s;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 s={operation:"set",timestamp:Date.now(),key:e},r=await this.pluginExecutor?.executeBeforeSet(t,s)??t,o=await this.middlewareModule.dispatch({type:"set",key:e,value:r,metadata:s}),a=o?.t?.valueNotChanged===!0,i;if(a&&o?.t?.originalValue!==void 0?i=o.t.originalValue:i=await this.pluginExecutor?.executeAfterSet(e,o,s)??o,!a){let d=[e.toString()];this.notifySubscribers(e,i),this.notifySubscribers(n.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:i,changedPaths:d}),await this.emitEvent({type:"storage:update",payload:{key:e,value:i,changedPaths:d}})}}catch(s){throw this.logger?.error("Error setting value",{key:e,error:s}),s}}async update(e){this.ensureReady();try{let t={operation:"update",timestamp:Date.now()},s=await this.getState(),r=structuredClone(s);e(r);let o=this.findChangedPaths(s,r);if(o.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(o)});let a=new Set;for(let p of o){let g=p.split(".")[0];a.add(g)}let i=await Promise.all(Array.from(a).map(async p=>{let g={...t,key:p},h=await this.pluginExecutor?.executeBeforeSet(r[p],g)??r[p];return{key:p,value:h}})),c=await this.middlewareModule.dispatch({type:"update",value:i,metadata:{...t,batchUpdate:!0,changedPaths:Array.from(o)}}),d={};Array.isArray(c)?c.forEach(p=>{p&&typeof p=="object"&&"key"in p&&"value"in p&&(d[p.key]=p.value)}):c&&typeof c=="object"&&(d={...c});let l=Object.keys(d).filter(p=>!this.isEqual(s[p],d[p]));if(l.length===0){this.logger?.debug&&this.logger.debug("No actual changes after middleware processing");return}let u={};l.forEach(p=>{u[p]=d[p]}),this.logger?.debug&&this.logger.debug("Notifying subscribers about changes:",{keys:l}),this.notifySubscribers(n.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:l,value:u,changedPaths:Array.from(o)});for(let p of o)try{let g=p.split(".")[0];if(g in u){let h;if(p===g)h=u[g];else{let y=p.substring(g.length+1);h=C(u[g],y)}h!==void 0&&this.notifySubscribers(p,h)}}catch(g){this.logger?.error("Error notifying path subscribers",{path:p,error:g})}await this.emitEvent({type:"storage:update",payload:{state:u,key:l,changedPaths:Array.from(o)}})}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(n.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(n.GLOBAL_SUBSCRIPTION_KEY)||this.subscribers.set(n.GLOBAL_SUBSCRIPTION_KEY,new Set),this.subscribers.get(n.GLOBAL_SUBSCRIPTION_KEY).add(e),()=>{let t=this.subscribers.get(n.GLOBAL_SUBSCRIPTION_KEY);t&&(t.delete(e),t.size===0&&this.subscribers.delete(n.GLOBAL_SUBSCRIPTION_KEY))}}subscribe(e,t){return typeof e=="string"?this.subscribeByKey(e,t):this.subscribeBySelector(e,t)}async destroy(){try{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.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 s=!1;return this.subscribers.get(e).add(t),this.get(e).then(r=>{try{s||(s=!0,t(r))}catch(o){this.logger?.error("Error in initial callback",{key:e,error:o})}}),()=>{let r=this.subscribers.get(e);r&&(r.delete(t),r.size===0&&this.subscribers.delete(e))}}createDummyState(){let e={get:(t,s)=>(t[s]=t[s]||new Proxy({},e),t[s])};return new Proxy({},e)}isEqual(e,t){if(e===t)return!0;if(e==null||t==null)return e===t;let s=typeof e;if(s!==typeof t)return!1;if(s!=="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 i=0;i<e.length;i++)if(!this.isEqual(e[i],t[i]))return!1;return!0}let o=Object.keys(e),a=Object.keys(t);return o.length!==a.length?!1:o.every(i=>Object.prototype.hasOwnProperty.call(t,i)&&this.isEqual(e[i],t[i]))}extractPath(e,t){if(this.selectorPathCache.has(e))return this.selectorPathCache.get(e);let s=[],r=(o="")=>({get:(a,i)=>{if(typeof i=="symbol")return Reflect.get(a,i);let c=o?`${o}.${i}`:i;return s.push(c),new Proxy({},r(c))},has:(a,i)=>!0,ownKeys:()=>[],getOwnPropertyDescriptor:()=>({configurable:!0,enumerable:!0}),apply:(a,i,c)=>new Proxy(()=>{},r(o))});try{e(new Proxy(t,r()))}catch{}return s.length===0?"":(s.sort((o,a)=>a.length-o.length),this.selectorPathCache.set(e,s[0]),s[0])}notifySubscribers(e,t){let s=e.toString(),r=this.subscribers.get(s);r?.size&&new Set(r).forEach(a=>{try{a(t)}catch(i){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:s,error:i})}})}findChangedPaths(e,t,s="",r=new Set,o=new WeakMap){if(e===t)return r;if(typeof e!="object"||typeof t!="object"||e===null||t===null)return e!==t&&r.add(s||""),r;if(o.has(e))return r;o.set(e,!0);let a=new Set([...Object.keys(e||{}),...Object.keys(t||{})]);for(let i of a){let c=e[i],d=t[i];if(c===d)continue;let l=s?`${s}.${i}`:i;c&&d&&typeof c=="object"&&typeof d=="object"&&!Array.isArray(c)&&!Array.isArray(d)?this.findChangedPaths(c,d,l,r,o):Array.isArray(c)&&Array.isArray(d)?this.isEqual(c,d)||r.add(l):this.isEqual(c,d)||r.add(l)}return r}subscribeBySelector(e,t){let s=this.createDummyState(),r=this.extractPath(e,s);this.logger?.debug&&this.logger.debug("Subscribing to path:",{path:r});let o=async a=>{try{if(a==null){let d=await this.getState(),l=e(d);t(l);return}if(typeof a!="object"||a===null){t(a);return}let i=await this.getState(),c=e(i);t(c)}catch(i){this.logger?.error("Error in selector callback",{path:r,error:i}),t(a)}};return r?this.subscribeByKey(r,o):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 se=class n{constructor(e,t,s){this.dbName=e;this.logger=s;this.dbVersion=t}static instances=new Map;db=null;initPromise=null;storeNames=new Set;dbVersion;static getInstance(e,t=1,s){n.instances.has(e)||n.instances.set(e,new n(e,t,s));let r=n.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,s)=>{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}),s(r.error)},r.onsuccess=()=>{this.db=r.result;for(let o=0;o<this.db.objectStoreNames.length;o++)this.storeNames.add(this.db.objectStoreNames[o]);this.logger?.debug(`Database "${this.dbName}" opened successfully`,{version:this.db.version,stores:Array.from(this.db.objectStoreNames)}),t(this.db)},r.onupgradeneeded=o=>{let a=o.target.result;this.logger?.debug(`Upgrading database "${this.dbName}" to version ${this.dbVersion}`);for(let i of e)a.objectStoreNames.contains(i)||(this.logger?.debug(`Creating store "${i}"`),a.createObjectStore(i))}})}closeDatabase(){this.db&&(this.db.close(),this.db=null,this.initPromise=null)}async deleteDatabase(){return this.closeDatabase(),new Promise((e,t)=>{let s=indexedDB.deleteDatabase(this.dbName);s.onsuccess=()=>{this.logger?.debug(`Database "${this.dbName}" deleted successfully`),n.instances.delete(this.dbName),this.storeNames.clear(),e()},s.onerror=()=>{this.logger?.error(`Failed to delete database "${this.dbName}"`,{error:s.error}),t(s.error)}})}async ensureStoresExist(e){await this.initialize();let t=e.filter(s=>!this.db.objectStoreNames.contains(s));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}},ne=class{constructor(e,t=1,s){this.dbName=e;this.logger=s;this.version=t}db=null;version;getCurrentVersion(){return this.version}openDatabase(e,t=[]){return new Promise((s,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 o=indexedDB.open(this.dbName,e);o.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:o.error}),r(o.error)},o.onsuccess=()=>{this.db=o.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)}),s(this.db)},o.onupgradeneeded=a=>{let i=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 c of t)i.objectStoreNames.contains(c)||(this.logger?.debug(`\u0421\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430 "${c}"`),i.createObjectStore(c))}})}async ensureStoresExist(e){this.db||(this.db=await this.openDatabase(this.version));let t=e.filter(s=>!this.db.objectStoreNames.contains(s));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)}},ae=class n extends M{DB_NAME;STORE_NAME;DB_VERSION;dbManager;constructor(e,t,s,r){super(e,t,s,r);let o=e.options;this.DB_NAME=o.dbName||"app_storage",this.STORE_NAME=e.name,this.DB_VERSION=o.dbVersion||1,this.dbManager=se.getInstance(this.DB_NAME,this.DB_VERSION,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 s=indexedDB.open(e);s.onsuccess=()=>{let r=s.result.version;s.result.close(),t(r)},s.onerror=()=>{t(0)}}catch{t(0)}})}static async createStorages(e,t,s){let o=await this.getCurrentDBVersion(e)||1,a=new ne(e,o,s),i=Object.values(t).map(d=>d.name);await a.ensureStoresExist(i);let c={};for(let[d,l]of Object.entries(t)){let u=new n({...l,options:{dbName:e,dbVersion:a.getCurrentVersion()}},l.pluginExecutor,l.eventEmitter,s);c[d]=await u.initialize()}return c}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 s=await this.dbManager.ensureStoreExists(this.STORE_NAME);if(!s.objectStoreNames.contains(this.STORE_NAME))throw new Error(`Object store "${this.STORE_NAME}" still doesn't exist after repair attempt`);return s.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,o)=>{let a=t.getAll();a.onerror=()=>o(a.error),a.onsuccess=()=>{let i=a.result,c=t.getAllKeys();c.onsuccess=()=>{let d=c.result.reduce((l,u,p)=>(u!=="root"&&(l[u]=i[p]),l),{});r(d)},c.onerror=()=>o(c.error)}});if(e instanceof T&&e.isUnparseable())return new Promise((r,o)=>{let a=t.get(e.valueOf());a.onerror=()=>o(a.error),a.onsuccess=()=>r(a.result)});let s=A(e);if(s.length>1){let r=s[0];return new Promise((o,a)=>{let i=t.get(r);i.onerror=()=>a(i.error),i.onsuccess=()=>{let c=i.result;if(!c){o(void 0);return}let d=C(c,s.slice(1).join("."));o(d)}})}return new Promise((r,o)=>{let a=t.get(s[0]);a.onerror=()=>o(a.error),a.onsuccess=()=>r(a.result)})}async doSet(e,t){if(e===""){let o=await this.getObjectStore("readwrite");return new Promise((a,i)=>{let c=o.transaction;c.oncomplete=()=>{a()},c.onerror=()=>{i(c.error)};let d=o.clear();d.onsuccess=()=>{let l=Object.entries(t);for(let[u,p]of l)o.put(p,u)},d.onerror=()=>{i(d.error)}})}let s=await this.getObjectStore("readwrite");if(e instanceof T&&e.isUnparseable()){await this.putValueInStore(s,e.valueOf(),t);return}let r=A(e);if(r.length>1){let o=r[0];return new Promise((a,i)=>{let c=s.get(o);c.onerror=()=>i(c.error),c.onsuccess=()=>{let d=c.result||{},l=O(d,r.slice(1).join("."),t),u=s.put(l,o);u.onerror=()=>i(u.error),u.onsuccess=()=>a()}})}await this.putValueInStore(s,r[0],t)}async putValueInStore(e,t,s){return new Promise((r,o)=>{let a=e.put(s,t.valueOf());a.onerror=()=>o(a.error),a.onsuccess=()=>r()})}async doUpdate(e){let t=new Map,s=[];for(let{key:r,value:o}of e){if(r instanceof T&&r.isUnparseable()){s.push({key:r.valueOf(),value:o});continue}let a=A(r),i=a[0],c=a.slice(1);t.has(i)||t.set(i,[]),t.get(i).push({path:c,value:o})}try{for(let{key:r,value:o}of s){let a=await this.getObjectStore("readwrite");await this.putValueInStore(a,r,o)}for(let[r,o]of t){let i={...await this.doGet(r)||{}};for(let{path:d,value:l}of o)d.length===0?i=l:i=O(i,d.join("."),l);let c=await this.getObjectStore("readwrite");await this.putValueInStore(c,r,i)}}catch(r){throw this.logger?.error("Error during update:",{error:r}),r}}async doDelete(e){let t=await this.getObjectStore("readwrite");if(e instanceof T&&e.isUnparseable())return new Promise((o,a)=>{let i=t.delete(e.valueOf());i.onerror=()=>a(i.error),i.onsuccess=()=>o(!0)});let s=A(e);if(s.length===1)return new Promise((o,a)=>{let i=t.delete(s[0]);i.onerror=()=>a(i.error),i.onsuccess=()=>o(!0)});let r=s[0];return new Promise((o,a)=>{let i=t.get(r);i.onerror=()=>a(i.error),i.onsuccess=()=>{let c=i.result;if(!c){o(!1);return}let d=C(c,s.slice(0,-1).join(".")),l=s[s.length-1];if(!d||!(l in d)){o(!1);return}if(Array.isArray(d)){let p=parseInt(l,10);isNaN(p)?delete d[l]:d.splice(p,1)}else delete d[l];let u=t.put(c,r);u.onerror=()=>a(u.error),u.onsuccess=()=>o(!0)}})}async doClear(){let e=await this.getObjectStore("readwrite");return new Promise((t,s)=>{let r=e.clear();r.onsuccess=()=>t(),r.onerror=()=>s(r.error)})}async doKeys(){let t=(await this.getObjectStore()).getAllKeys();return new Promise((s,r)=>{t.onsuccess=()=>{s(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 oe=class extends M{constructor(e,t,s,r){super(e,t,s,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 s=JSON.parse(t);return e instanceof T&&e.isUnparseable()?s[e.valueOf()]:C(s,e)}async doSet(e,t){let s=localStorage.getItem(this.name),r=s?JSON.parse(s):{};if(e instanceof T&&e.isUnparseable()){r[e.valueOf()]=t,localStorage.setItem(this.name,JSON.stringify(r));return}let o=O({...r},e,t);localStorage.setItem(this.name,JSON.stringify(o))}async doDelete(e){let t=localStorage.getItem(this.name);if(!t)return!1;let s=JSON.parse(t);if(e instanceof T&&e.isUnparseable()){let c=e.valueOf();return c in s?(delete s[c],localStorage.setItem(this.name,JSON.stringify(s)),!0):!1}let r=A(e),o=r.slice(0,-1).join("."),a=r[r.length-1],i=o?C(s,o):s;return!i||!(a in i)?!1:(delete i[a],localStorage.setItem(this.name,JSON.stringify(s)),!0)}async doUpdate(e){let t=localStorage.getItem(this.name),s=t?JSON.parse(t):{};for(let{key:r,value:o}of e)r instanceof T&&r.isUnparseable()?s[r.valueOf()]=o:O(s,r,o);localStorage.setItem(this.name,JSON.stringify(s))}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 B=class extends M{storage=new Map;constructor(e,t,s,r){super(e,t,s,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 T&&e.isUnparseable()?t[e.valueOf()]:C(t,e)}async doSet(e,t){let s=this.storage.get(this.name)||{};if(e instanceof T&&e.isUnparseable()){s[e.valueOf()]=t,this.storage.set(this.name,s);return}let r=O({...s},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 T&&e.isUnparseable()){let i=e.valueOf();return i in t?(delete t[i],this.storage.set(this.name,t),!0):!1}let s=A(e),r=s.slice(0,-1).join("."),o=s[s.length-1],a=r?C(t,r):t;return!a||!(o in a)?!1:(delete a[o],this.storage.set(this.name,t),!0)}async doUpdate(e){let s={...this.storage.get(this.name)||{}};for(let{key:r,value:o}of e)r instanceof T&&r.isUnparseable()?s[r.valueOf()]=o:O(s,r,o);this.storage.set(this.name,s)}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)}};import{useEffect as He,useRef as Ie,useState as De}from"react";var K=new Map;function cs(n,e){let[t,s]=De(e?.initialValue),[r,o]=De(!!e?.withLoading),a=Ie(e?.initialValue),i=Ie(e?.equals||((l,u)=>l===u)),c=n.getId(),d=l=>{(a.current===void 0||!i.current(l,a.current))&&(a.current=l,s(l))};return He(()=>{K.has(c)||K.set(c,{lastValue:void 0,listeners:new Set,unsubscribe:null});let l=K.get(c);return l.listeners.add(d),l.lastValue!==void 0?(d(l.lastValue),e?.withLoading&&o(!1)):(e?.withLoading&&o(!0),n.select().then(u=>{l.lastValue=u,l.listeners.forEach(p=>p(u)),e?.withLoading&&o(!1)}).catch(u=>{e?.withLoading&&o(!1)})),l.unsubscribe||(l.unsubscribe=n.subscribe({notify:u=>{l.lastValue=u,l.listeners.forEach(p=>{try{p(u)}catch{}})}})),()=>{let u=K.get(c);u&&(u.listeners.delete(d),u.listeners.size===0&&(u.unsubscribe&&u.unsubscribe(),K.delete(c)))}},[n,c]),e?.withLoading?{data:t,isLoading:r}:t}import{useEffect as Le,useState as ze}from"react";var us=(n,e)=>{let[t,s]=ze(void 0);return Le(()=>{let r=!0;(async()=>{try{let i=await n.getState(),c=e(i);r&&s(c)}catch{}})();let a;try{a=n.subscribe(e,i=>{r&&s(i)})}catch{a=()=>{}}return()=>{r=!1,a()}},[n,e]),t};import{useEffect as ht,useState as de}from"react";import{Observable as _e,Subject as Oe}from"rxjs";var ie=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 Oe;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,o=null,a=async i=>{let c=[i];if(t?.memoize&&r&&o&&t.memoize(c,r,o))return o;let d={type:s,meta:e.meta},l;if(this.middlewareFunctions.length>0){let u=async p=>t?.worker?this.executeInWorker(t.worker,s,c,e.action):Promise.resolve(e.action(i));for(let p=this.middlewareFunctions.length-1;p>=0;p--){let g=this.middlewareFunctions[p],h=u;u=async y=>g(async S=>h(S))(y)}l=await u(d)}else t?.worker?l=await this.executeInWorker(t.worker,s,c,e.action):l=await e.action(i);return d.payload=l,r=[...c],o=l,this.actions$.next(d),l};return a.r="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 Oe,r,o=async()=>{let c=await this.storage.getState();return e.selector(c)},a=this.storage.subscribe(e.selector,c=>{if(!e.shouldTrigger||e.shouldTrigger(r,c)){let d={type:t,payload:c,meta:e.meta};this.actions$.next(d),s.next(d),r=c}}),i=()=>{let c=s.asObservable();return e.notifyAfterSubscribe?new _e(d=>{let l=!1;o().then(p=>{if(!e.shouldTrigger||e.shouldTrigger(void 0,p)){let g={type:t,payload:p,meta:{...e.meta,isInitial:!0}};d.next(g),r=p,l=!0}}).catch(p=>{d.error(p)});let u=c.subscribe({next:p=>{l&&p.payload===r||d.next(p)},error:p=>d.error(p),complete:()=>d.complete()});return()=>{u.unsubscribe()}}):c};return i.r="watchers",Object.defineProperty(i,"actionType",{value:t,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(i,"meta",{value:e.meta,writable:!1,enumerable:!0}),Object.defineProperty(i,"unsubscribe",{value:a,writable:!1,enumerable:!0}),i}async executeInWorker(e,t,s,r){return new Promise((o,a)=>{let i=`${t}_${Date.now()}_${Math.random()}`,c=d=>{d.data.requestId===i&&(e.removeEventListener("message",c),d.data.error?a(new Error(d.data.error)):o(d.data.result))};e.addEventListener("message",c),e.postMessage({type:t,args:s,requestId:i}),setTimeout(()=>{e.removeEventListener("message",c),a(new Error(`Worker execution timeout for action: ${t}`))},3e4)})}};function Me(n,e){let t=new ie(n),s=e(n.storage,{createAction:(r,o)=>t.createAction(r,o),createWatcher:r=>t.createWatcher(r)});for(let[r,o]of Object.entries(s))if(typeof o=="function"){let a=o.r;t[a][r]=o}return t}function G(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 F=globalThis.console,P={log:(...n)=>F.log(...n),warn:(...n)=>F.warn(...n),error:(...n)=>F.error(...n),group:(...n)=>F.group(...n),groupEnd:()=>F.groupEnd(),groupCollapsed:(...n)=>F.groupCollapsed(...n)};function Fe(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 o=Fe(n[r],e[r]);Object.keys(o).length>0&&(t[r]=o)}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 Cs=(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:o,colors:a,translations:i}=s;return c=>d=>async l=>{let u=Date.now(),p=await c.getState();try{let g=await d(l),h=await c.getState(),E=Date.now()-u,S=`${l.type}`;if((r?P.groupCollapsed:P.group)(`%c ${S}`,`color: ${a.title}; font-weight: bold`),P.log(`%c ${i.action}:`,`color: ${a.action}; font-weight: bold`,l),s.diff){let R=Fe(p,h),w=Object.keys(R).length;P.log(`%c ${i.diff} (${i.changesCount}: ${w}):`,`color: ${a.diff}; font-weight: bold`,R)}return s.showFullState&&(P.groupCollapsed(`%c ${i.showFullState}`,`color: ${a.fullState}; font-weight: bold`),P.log(`%c ${i.prevState}:`,`color: ${a.prevState}; font-weight: bold`,p),P.log(`%c ${i.nextState}:`,`color: ${a.nextState}; font-weight: bold`,h),P.groupEnd()),o&&P.log(`%c ${i.duration}: %c ${E}ms`,"font-weight: bold","color: #4CAF50"),P.groupEnd(),g}catch(g){throw P.error(`%c ${i.error}:`,`color: ${a.error}; font-weight: bold`,l.type,g),g}}};import{combineLatest as et,merge as tt,Observable as rt,of as q,pipe as st,Subject as nt}from"rxjs";import{catchError as at,filter as N,map as Q,share as ot,switchMap as it,take as ct}from"rxjs/operators";import{of as $e}from"rxjs";import{concatAll as We,delay as Ge,mergeMap as Qe,toArray as Je}from"rxjs/operators";var Be=(n,e,t,s=0)=>{let r=G(e,t).map(o=>$e(o).pipe(Ge(s),Qe(n)));return $e(...r).pipe(We(),Je())};import{forkJoin as Ye,timer as Xe}from"rxjs";import{mergeMap as Ze}from"rxjs/operators";var Ke=(n,e,t,s=0)=>Ye(G(e,t).map((r,o)=>Xe(o*s).pipe(Ze(()=>n(r)))));function en(n){let{actionType:e}=n;return e?t=>t.pipe(N(s=>s!==void 0&&s.type===e)):N(()=>!1)}function tn(n){let e=n.map(t=>t.actionType).filter(Boolean);return e.length===0?N(()=>!1):t=>t.pipe(N(s=>s!==void 0&&e.includes(s.type)))}function rn(n){return e=>{let t=n.map(r=>r.actionType).filter(Boolean);if(t.length===0)return q([]);let s=t.map((r,o)=>e.pipe(N(a=>a.type===r),ct(1),Q(a=>({index:o,action:a}))));return et(s).pipe(Q(r=>(r.sort((o,a)=>o.index-a.index),r.map(o=>o.action))))}}function sn(n,...e){return n.pipe(Q(t=>e.map(s=>s(t))))}function nn(n,e){return n.pipe(Q(t=>{let s={};for(let[r,o]of Object.entries(e))s[r]=o(t);return s}))}function an({validator:n,apiCall:e}){return st(it(t=>{let s=()=>e(t,{chunkRequest:Ke,chunkRequestConsistent:Be});if(!n)return s();let r=n(t),{conditions:o,skipAction:a}=r;return o.every(Boolean)?s():Array.isArray(a)?q(...a?.filter(Boolean).map(c=>typeof c=="function"?c():c)):q(typeof a=="function"?a():a)}))}var J=class{constructor(e,t={},s,r={},o={}){this.storage=e;this.externalStates=t;this.dispatchers=s;this.services=r;this.config=o;this.subscribeToDispatchers(),this.state$=new rt(a=>{this.storage.getState().then(c=>a.next(c));let i=this.storage.subscribeToAll(()=>{this.storage.getState().then(c=>a.next(c))});return()=>i()}).pipe(ot())}effects=[];subscriptions=[];running=!1;action$=new nt;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(at(r=>q(null))).subscribe(r=>{if(r!=null&&typeof r=="function")try{r()}catch{}});this.subscriptions.push(s)}catch{}}};function on(n){return n}function cn(n){return n}function ln(...n){return(e,t,s,r,o,a)=>{let i=n.map(c=>{try{return c(e,t,s,r,o,a)}catch{return q(null)}});return tt(...i)}}function lt(n){if(!n.storage&&!n.createStorageFn)throw new Error('Synapse config must have either "storage" or "createStorageFn"');if(n.storage&&n.createStorageFn)throw new Error('Synapse config cannot have both "storage" and "createStorageFn". Choose one.');if(n.effects&&!n.createDispatcherFn)throw new Error('Effects require dispatcher. Add "createDispatcherFn" to config.');if(n.createEffectConfig&&!n.createDispatcherFn)throw new Error('Effect config requires dispatcher. Add "createDispatcherFn" to config.');if(n.dependencies){if(!Array.isArray(n.dependencies))throw new Error("Dependencies must be an array");n.dependencies.forEach((e,t)=>{if(!e||typeof e!="object")throw new Error(`Dependency at index ${t} must be an object`);if(!e.storage||typeof e.storage.waitForReady!="function")throw new Error(`Dependency at index ${t} must have a storage with waitForReady method`)})}if(n.createStorageFn&&typeof n.createStorageFn!="function")throw new Error('"createStorageFn" must be a function');if(n.createDispatcherFn&&typeof n.createDispatcherFn!="function")throw new Error('"createDispatcherFn" must be a function');if(n.createSelectorsFn&&typeof n.createSelectorsFn!="function")throw new Error('"createSelectorsFn" must be a function');if(n.createEffectConfig&&typeof n.createEffectConfig!="function")throw new Error('"createEffectConfig" must be a function');if(n.effects){if(!Array.isArray(n.effects))throw new Error("Effects must be an array");n.effects.forEach((e,t)=>{if(typeof e!="function")throw new Error(`Effect at index ${t} must be a function`)})}if(n.externalSelectors&&typeof n.externalSelectors!="object")throw new Error("External selectors must be an object")}async function dt(n=[]){n.length!==0&&await Promise.all(n.map(async(e,t)=>{try{await e.storage.waitForReady()}catch(s){throw new Error(`Dependency ${t} initialization failed: ${s}`)}}))}async function ce(n){try{lt(n)}catch(i){throw i}await dt(n.dependencies);let e=n.createStorageFn?await n.createStorageFn():n.storage;await e.waitForReady();let t=[],s={storage:e,selectors:{},destroy:async()=>{for(let i of t)await i()}};t.push(()=>e.destroy());let r,o,a;if(n.createSelectorsFn)try{o=new z(e);let i=n.externalSelectors||{};s.selectors=n.createSelectorsFn(o,i),typeof o.destroy=="function"&&t.push(()=>o.destroy())}catch{}if(n.createDispatcherFn&&(r=n.createDispatcherFn(e),s.dispatcher=r,r&&"dispatch"in r&&(s.actions=r.dispatch,typeof r.destroy=="function"&&t.push(()=>r.destroy()))),n.createEffectConfig&&r)try{let{dispatchers:i,api:c,config:d,externalStates:l}=n.createEffectConfig(r),u=l||{};a=new J(e,u,i,c,d),Array.isArray(n.effects)&&n.effects.forEach(p=>{a&&a.add(p)}),await a.start(),s.state$=a.state$,t.push(()=>{a&&a.stop()})}catch{}return s}function ut(n,e){return e==="*"?!0:e.includes("*")?new RegExp("^"+e.replace(/\*/g,".*")+"$").test(n):n===e}async function pt(n,e){let t=await n.getState(),s=Object.entries(t.events||{});if(s.length>e){let o=s.sort((a,i)=>i[1].timestamp-a[1].timestamp).slice(0,e);await n.set("events",Object.fromEntries(o))}}var gt=(n={})=>ce({createStorageFn:async()=>new B({name:n.name||"eventBus",initialState:{events:{},subscriptions:{}}}).initialize(),createDispatcherFn:e=>Me({storage:e},(t,{createAction:s})=>({publish:s({type:"PUBLISH_EVENT",meta:{description:"\u041F\u0443\u0431\u043B\u0438\u043A\u0430\u0446\u0438\u044F \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u0432 EventBus"},action:async({event:r,data:o,metadata:a={}})=>{let i=`${r}_${Date.now()}_${Math.random()}`;return await t.set(`events.${i}`,{id:i,event:r,data:o,metadata:{ttl:a.ttl||null,priority:a.priority||"normal",...a},timestamp:Date.now()}),n.autoCleanup&&await pt(t,n.maxEvents||1e3),{eventId:i,event:r,data:o}}}),subscribe:s({type:"SUBSCRIBE_TO_EVENT",meta:{description:"\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0430 \u043D\u0430 \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u0432 EventBus"},action:async({eventPattern:r,handler:o,options:a={}})=>{let i=`sub_${Date.now()}_${Math.random()}`,c=t.subscribe(d=>d.events,d=>{Object.values(d||{}).forEach(l=>{if(ut(l.event,r)){if(a.priority&&l.metadata.priority!==a.priority)return;try{o(l.data,l)}catch{}}})});return await t.set(`subscriptions.${i}`,{id:i,pattern:r,options:a,createdAt:Date.now()}),{subscriptionId:i,unsubscribe:c}}}),getEventHistory:s({type:"GET_EVENT_HISTORY",meta:{description:"\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 \u0441\u043E\u0431\u044B\u0442\u0438\u0439"},action:async({eventType:r,limit:o=100})=>{let a=await t.getState();return Object.values(a.events||{}).filter(i=>i.event===r).sort((i,c)=>c.timestamp-i.timestamp).slice(0,o)}}),clearEvents:s({type:"CLEAR_EVENTS",meta:{description:"\u041E\u0447\u0438\u0441\u0442\u043A\u0430 \u0441\u043E\u0431\u044B\u0442\u0438\u0439"},action:async({olderThan:r}={})=>{if(r){let o=Date.now()-r;await t.update(a=>{Object.keys(a.events||{}).forEach(i=>{a.events[i].timestamp<o&&delete a.events[i]})})}else await t.set("events",{})}}),getActiveSubscriptions:s({type:"GET_SUBSCRIPTIONS",meta:{description:"\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043F\u043E\u0434\u043F\u0438\u0441\u043E\u043A"},action:async()=>{let r=await t.getState();return Object.values(r.subscriptions||{})}})}))});function le(n){let e="pending",t,s=null,r=new Set,o=new Set,a=(async()=>{try{let i=await(n instanceof Promise?n:Promise.resolve(n));return await i.storage.waitForReady(),t=i,e="ready",r.forEach(c=>{try{c(t)}catch{}}),i}catch(i){let c=i instanceof Error?i:new Error(String(i));throw s=c,e="error",o.forEach(d=>{try{d(c)}catch{}}),c}})();return{waitForReady:()=>a,isReady:()=>e==="ready",getStoreIfReady:()=>t,onReady:i=>{if(e==="ready"&&t)try{i(t)}catch{}else r.add(i);return()=>{r.delete(i)}},onError:i=>{if(e==="error"&&s)try{i(s)}catch{}else o.add(i);return()=>{o.delete(i)}},getStatus:()=>e,getError:()=>s,destroy:()=>{r.clear(),o.clear(),t=void 0,s=null,e="pending"}}}import{Fragment as qe,jsx as Y,jsxs as ft}from"react/jsx-runtime";function yt(n,e){let{loadingComponent:t=Y("div",{children:"\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F..."}),errorComponent:s=i=>ft("div",{children:["\u041E\u0448\u0438\u0431\u043A\u0430 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438: ",i.message]})}=e||{},r=le(n);function o(){let[i,c]=de(()=>r.getStatus()),[d,l]=de(()=>r.getStoreIfReady()),[u,p]=de(()=>r.getError());return ht(()=>{let g=r.getStatus(),h=r.getStoreIfReady(),y=r.getError();c(g),l(h),p(y);let E=r.onReady(f=>{c("ready"),l(f),p(null)}),S=r.onError(f=>{c("error"),l(void 0),p(f)});return()=>{E(),S()}},[]),{isReady:i==="ready",isError:i==="error",isPending:i==="pending",store:d,error:u}}function a(i){function c(l){let{isReady:u,isError:p,error:g}=o();return p&&g?Y(qe,{children:s(g)}):u?Y(i,{...l}):Y(qe,{children:t})}let d=i.displayName||i.name||"Component";return c.displayName=`AwaitSynapse(${d})`,c}return{withSynapseReady:a,useSynapseReady:o,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 St,useContext as X,useEffect as mt,useState as ue}from"react";import{Fragment as wt,jsx as k}from"react/jsx-runtime";var Z="\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",Tt="\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 bt(n,e){let{loadingComponent:t=k("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||{},s=(async()=>{try{let u=await(n instanceof Promise?n:Promise.resolve(n));return await u.storage.waitForReady(),u}catch(u){throw u}})(),r=St(null),o=()=>{let u=X(r);if(!u)throw new Error(`useSynapseStorage: ${Z}`);return u.storage},a=()=>{let u=X(r);if(!u)throw new Error(`useSynapseSelectors: ${Z}`);return u.selectors},i=()=>{let u=X(r);if(!u)throw new Error(`useSynapseActions: ${Z}`);if("actions"in u)return u.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.")},c=()=>{let u=X(r);if(!u)throw new Error(`useSynapseState$: ${Z}`);if("state$"in u)return u.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 d(u){function p(h){let[y,E]=ue(null),[S,f]=ue(!1),[R,w]=ue(null);return mt(()=>{let m=!0;return(async()=>{try{let x=await s;m&&(E(x),f(!0))}catch(x){m&&w(x instanceof Error?x:new Error(String(x)))}})(),()=>{m=!1}},[]),R?k("div",{children:`${Tt}: ${R.message}`}):!S||!y?k(wt,{children:t}):k(r.Provider,{value:y,children:k(u,{...h})})}let g=u.displayName||u.name||"Component";return p.displayName=`SynapseContext(${g})`,p}return{contextSynapse:d,useSynapseStorage:o,useSynapseSelectors:a,useSynapseActions:i,useSynapseState$:c,cleanupSynapse:async()=>{try{return(await s)?.destroy()||Promise.resolve()}catch{}}}}export{we as ApiClient,ie as Dispatcher,J as EffectsModule,ae as IndexedDBStorage,oe as LocalStorage,B as MemoryStorage,V as ResponseFormat,z as SelectorModule,re as StorageEvents,Re as StoragePluginModule,xe as StorageStatus,pe as apiLogger,yt as awaitSynapse,Pe as broadcastMiddleware,ln as combineEffects,Me as createDispatcher,cn as createEffect,on as createEffectBase,gt as createEventBus,ce as createSynapse,le as createSynapseAwaiter,bt as createSynapseCtx,ge as createUniqueId,he as headersToObject,Cs as loggerDispatcherMiddleware,en as ofType,tn as ofTypes,rn as ofTypesWaitAll,sn as selectorMap,nn as selectorObject,cs as useSelector,us as useStorageSubscribe,an as validateMap};
1
+ var Te={debug:(s,...e)=>{process.env.NODE_ENV},log:(s,...e)=>{process.env.NODE_ENV},info:(s,...e)=>{},warn:(s,...e)=>{},error:(s,...e)=>{}};function be(s){return`${s?`${s}|`:""}${Math.random().toString(36).substring(2,9)+Date.now().toString(36)}`}function we(s){let e={};return s.forEach((t,n)=>{e[n.toLowerCase()]=t}),e}function G(s={},e={}){return{...s,...e,getFromStorage:s.getFromStorage||(t=>{try{let n=localStorage.getItem(t);return n?JSON.parse(n):void 0}catch{return}}),getCookie:s.getCookie||(t=>{try{let n=document.cookie.match(new RegExp(`(?:^|; )${t.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")}=([^;]*)`));return n?decodeURIComponent(n[1]):void 0}catch{return}})}}async function Ee(s,e){let t=new Headers,n=e||G({},{});if(s)try{t=await Promise.resolve(s(t,n))}catch{}return t}function Re(s,e){return async(t,n)=>{let r=new Headers(t);if(s)try{r=await Promise.resolve(s(r,n))}catch{}if(e)try{r=await Promise.resolve(e(r,n))}catch{}return r}}var H=(o=>(o.Json="json",o.Blob="blob",o.ArrayBuffer="arrayBuffer",o.Text="text",o.FormData="formData",o.Raw="raw",o))(H||{});function ve(s){let e=s.toLowerCase().split(";")[0].trim();if(e.includes("application/json"))return"json";if(e.includes("text/"))return"text";if(e.includes("multipart/form-data"))return"formData";if(e.includes("application/octet-stream")||e.includes("application/pdf")||e.includes("image/")||e.includes("audio/")||e.includes("video/"))return"blob"}function ie(s){let e=s.get("content-type")||"",t=s.get("content-disposition")||"",n=e.includes("application/octet-stream")||e.includes("application/pdf")||e.includes("image/")||e.includes("audio/")||e.includes("video/"),r=t.includes("attachment")||t.includes("filename=");return n||r}function Ge(s){let e=s.get("content-disposition");if(!e)return;let t=e.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);if(t&&t[1])return t[1].replace(/['"]/g,"").trim()}function xe(s){let e=s.get("content-type")||"",t=s.get("content-disposition")||"",n=s.get("content-length");return ie(s)?{filename:Ge(s),contentType:e,contentDisposition:t,size:n?parseInt(n,10):void 0}:void 0}async function He(s,e){let t=e,n=s.headers.get("content-type")||"";!t&&n&&(ie(s.headers)?t="blob":t=ve(n)),t||(t="json");try{let r;switch((t==="blob"||t==="arrayBuffer")&&(r=xe(s.headers)),t){case"json":try{let o=await s.json();return s.ok?{data:o,fileMetadata:r}:{error:o,fileMetadata:r}}catch{let i=await s.text();return s.ok?{data:i,fileMetadata:r}:{error:i,fileMetadata:r}}case"text":{let o=await s.text();return s.ok?{data:o,fileMetadata:r}:{error:o,fileMetadata:r}}case"blob":{let o=await s.blob();return s.ok?{data:o,fileMetadata:r}:{error:o,fileMetadata:r}}case"arrayBuffer":{let o=await s.arrayBuffer();return s.ok?{data:o,fileMetadata:r}:{error:o,fileMetadata:r}}case"formData":{let o=await s.formData();return s.ok?{data:o,fileMetadata:r}:{error:o,fileMetadata:r}}case"raw":return s.ok?{data:s,fileMetadata:r}:{error:s,fileMetadata:r};default:let a=await s.blob();return s.ok?{data:a,fileMetadata:r}:{error:a,fileMetadata:r}}}catch(r){return s.ok?{data:void 0}:{error:r}}}function Ce(s){let{baseUrl:e,timeout:t=3e4,fetchFn:n=fetch,credentials:r="same-origin"}=s;return async(a,o={},i)=>{let{path:c,method:d,body:l,query:u,responseFormat:g}=a,{signal:p,timeout:f=t,responseFormat:y}=o,b=y||g,h=new URL(c.startsWith("http")?c:`${e}${c}`);u&&Object.entries(u).forEach(([m,w])=>{w!=null&&(Array.isArray(w)?w.forEach(x=>h.searchParams.append(m,String(x))):h.searchParams.append(m,String(w)))});let S;if(l!==void 0)if(l instanceof FormData||l instanceof Blob)S=l;else if(typeof l=="object"&&l!==null)try{S=JSON.stringify(l),i.has("Content-Type")||i.set("Content-Type","application/json")}catch{S=String(l)}else S=String(l);let v,E=new Promise((m,w)=>{f&&(v=window.setTimeout(()=>{w(new Error(`\u041F\u0440\u0435\u0432\u044B\u0448\u0435\u043D\u043E \u0432\u0440\u0435\u043C\u044F \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F \u0437\u0430\u043F\u0440\u043E\u0441\u0430 (${f}\u043C\u0441)`))},f))});try{let m=n(h.toString(),{method:d,headers:i,body:S,signal:p,credentials:r}),w=await Promise.race([m,E]),{data:x,error:ae,fileMetadata:ze}=await He(w,b);return{data:x,error:ae,ok:w.ok,status:w.status,statusText:w.statusText,headers:w.headers,fileDownloadResult:ze}}catch(m){let w=m;return{error:w,ok:!1,status:0,statusText:w.message,headers:new Headers}}finally{v&&window.clearTimeout(v)}}}function Pe(s,e=[]){let t={};return!s||e.length===0||e.forEach(n=>{s.has(n)&&(t[n]=s.get(n)||"")}),t}var W=class{constructor(e,t,n,r,a,o){this.name=e;this.queryStorage=t;this.configCurrentEndpoint=n;this.cacheableHeaderKeys=r;this.globalCacheConfig=a;this.baseQueryConfig=o;this.prepareHeaders=Re(o.prepareHeaders,n.prepareHeaders),this.queryFunction=Ce({baseUrl:o.baseUrl,fetchFn:o.fetchFn,timeout:o.timeout,credentials:o.credentials}),this.cacheableHeaders=[...r||[],...n.includeCacheableHeaderKeys||[]].filter(i=>!n.excludeCacheableHeaderKeys?.includes(i)),this.meta.name=e,this.meta.tags=n.tags??this.meta.tags,this.meta.invalidatesTags=n.invalidatesTags??this.meta.invalidatesTags,this.meta.cache=this.queryStorage.createCacheConfig(this.configCurrentEndpoint)??this.meta.cache}endpointSubscribers=new Set;fetchCounts=0;meta={cache:!1,invalidatesTags:[],name:"",tags:[]};queryFunction;cacheableHeaders;prepareHeaders;request(e,t){this.fetchCounts++;let n=be(this.name),r=new AbortController,a=new Set,o={status:"idle",requestParams:e,headers:{},error:void 0,data:void 0,fromCache:!1},i=G({requestParams:e},t?.context||{}),c=l=>{Object.assign(o,l),a.forEach(u=>{u({...o})})},d=new Promise(async(l,u)=>{try{let g=await Ee(this.prepareHeaders,i),p=Pe(g,t?.cacheableHeaderKeys?t.cacheableHeaderKeys:this.cacheableHeaders),f=this.queryStorage.shouldCache(this.configCurrentEndpoint,t),[y,b]=this.queryStorage.createCacheKey(this.name,{...e,...p}),h;if(f&&(h=await this.queryStorage.getCachedResult(y)),h)c({fromCache:!0,status:"success",data:h.data,error:void 0,headers:h.headers,requestParams:e}),l({...h,fromCache:!0});else{c({fromCache:!1,status:"loading"});let S=this.configCurrentEndpoint.request(e,t?.context),v={...t,signal:r.signal},E=await this.queryFunction(S,v,g);if(E.ok){let{headers:m,...w}=E;if(this.configCurrentEndpoint.invalidatesTags?.length&&await this.queryStorage.invalidateCacheByTags(this.configCurrentEndpoint.invalidatesTags),f){let x=this.queryStorage.createCacheConfig(this.configCurrentEndpoint);await this.queryStorage.setCachedResult(y,{...w,headers:we(m)},x,b??{},this.configCurrentEndpoint.tags??[])}c({fromCache:!1,status:"success",data:E.data,error:void 0,headers:E.headers,requestParams:e}),this.endpointSubscribers.forEach(x=>{let ae={status:"success",fetchCounts:this.fetchCounts,meta:this.meta,cacheableHeaders:this.cacheableHeaders,error:void 0};x(ae)}),l({...E,fromCache:!1})}else c({fromCache:!1,status:"error",data:void 0,error:E.error,headers:E.headers,requestParams:e}),this.endpointSubscribers.forEach(m=>{let w={status:"error",fetchCounts:this.fetchCounts,meta:this.meta,cacheableHeaders:this.cacheableHeaders,error:E.error};m(w)}),u(E.error)}}catch(g){c({fromCache:!1,status:"error",data:void 0,error:g,headers:void 0,requestParams:e}),u(g)}});return{id:n,subscribe(l,u={}){let{autoUnsubscribe:g=!0}=u;a.add(l),l(o);let p=()=>a.delete(l);return g&&d.finally(()=>{p()}),p},wait:()=>d,waitWithCallbacks(l={}){let{idle:u,loading:g,success:p,error:f}=l;return this.subscribe(y=>{switch(y.status){case"idle":u?.(y);break;case"loading":g?.(y);break;case"success":p?.(y.data,y);break;case"error":f?.(y.error,y);break}},{autoUnsubscribe:!0}),d},abort:()=>{r&&!r.signal.aborted&&r.abort()},then:(l,u)=>d.then(l,u),catch:l=>d.catch(l),finally:l=>d.finally(l)}}subscribe(e){this.endpointSubscribers.add(e);let t={status:"idle",fetchCounts:this.fetchCounts,meta:this.meta,cacheableHeaders:this.cacheableHeaders,error:void 0};return e(t),()=>this.endpointSubscribers.delete(e)}reset(){return this.fetchCounts=0,Promise.resolve()}destroy(){this.endpointSubscribers.clear()}};var T=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 D=class{static createMetadata(e=0,t=[]){let n=Date.now(),r=e>0?n+e:1/0;return{createdAt:n,updatedAt:n,expiresAt:r,tags:t,createdAtDateTime:this.formatDateTime(n),updatedAtDateTime:this.formatDateTime(n),expiresAtDateTime:r===1/0?"never":this.formatDateTime(r)}}static formatDateTime(e){return new Date(e).toISOString()}static isExpired(e){return Date.now()>e.expiresAt}static updateMetadata(e){return{...e,updatedAt:Date.now()}}static createKey(...e){return new T(e.join("_"))}static createApiKey(e,t){if(!t)return[new T(e,!0),t];let n=Object.entries(t).sort(([r],[a])=>r.localeCompare(a)).map(([r,a])=>`${r}=${a}`).join("&");return[new T(`${e}_${n}`,!0),t]}static hasAnyTag(e,t=[]){return!e.tags||!t.length?!1:t.some(n=>e.tags?.includes(n))}};var Q=class{constructor(e,t){this.storageExternal=e;this.globalCacheConfig=t}storage=null;cleanupInterval=null;defaultCacheOptions={ttl:5*60*1e3,cleanup:{enabled:!0,interval:10*60*1e3},invalidateOnError:!0};async initialize(){return await this.createStorage(),this.startCleanupInterval(),this}async createStorage(){try{let e=this.storageExternal;await e.initialize(),this.storage=e}catch(e){throw e}}startCleanupInterval(){this.cleanupInterval&&(clearInterval(this.cleanupInterval),this.cleanupInterval=null);let e=typeof this.globalCacheConfig=="object"?this.globalCacheConfig.cleanup:this.defaultCacheOptions.cleanup;e?.enabled&&e.interval&&(this.cleanupInterval=setInterval(()=>{this.cleanup().catch(t=>{})},e.interval))}getStorage(){return this.storage}createCacheKey(e,t){return D.createApiKey(e,t)}async getCachedResult(e){if(!this.storage)throw new Error("\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043E");let t=await this.storage.get(e);if(!t)return;if(D.isExpired(t.metadata)){await this.storage.delete(e);return}let n={...t,metadata:D.updateMetadata(t.metadata)};return await this.storage.set(e,n),t.data}async setCachedResult(e,t,n,r,a){if(!this.storage)throw new Error("\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043E");let o=D.createMetadata(n.ttl,a),i={data:t,metadata:o,params:r};await this.storage.set(e,i)}shouldCache(e,t){return!(this.globalCacheConfig===!1||e?.cache===!1||typeof e?.cache=="object"&&e?.cache.ttl===0||t?.disableCache===!0||this.globalCacheConfig===void 0&&e?.cache===void 0)}createCacheConfig(e){let t=this.defaultCacheOptions;if(typeof this.globalCacheConfig=="object"&&(t=this.globalCacheConfig),typeof e?.cache=="object"){let n=e.cache;t={...t,...n}}return t}async invalidateCacheByTags(e){if(!this.storage)throw new Error("\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043E");let t=await this.storage.keys();for(let n of t){let r=await this.storage.get(n);r&&D.hasAnyTag(r.metadata,e)&&await this.storage.delete(n)}}async invalidateCache(e){if(!this.storage)throw new Error("\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043E");await this.storage.delete(e)}async cleanup(){if(!this.storage)throw new Error("\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043E");let e=await this.storage.keys();for(let t of e){let n=await this.storage.get(t);n&&D.isExpired(n.metadata)&&await this.storage.delete(t)}}async destroy(){this.cleanupInterval&&(window.clearInterval(this.cleanupInterval),this.cleanupInterval=null),this.storage&&(await this.storage.destroy(),this.storage=null)}};var Ae=class{queryStorage;cacheableHeaderKeys;globalCacheConfig;baseQueryConfig;storageExternal;createEndpoints;endpoints={};constructor(e){this.cacheableHeaderKeys=e.cacheableHeaderKeys,this.globalCacheConfig=e.cache,this.baseQueryConfig=e.baseQuery,this.storageExternal=e.storage,this.createEndpoints=e.endpoints}async init(){return this.queryStorage=await new Q(this.storageExternal,this.globalCacheConfig).initialize(),await this.initializeEndpoints(),this}async initializeEndpoints(){let e=n=>n,t=await this.createEndpoints(e)||{};for(let[n,r]of Object.entries(t)){let a=n;this.endpoints[a]=new W(n,this.queryStorage,r,this.cacheableHeaderKeys,this.globalCacheConfig,this.baseQueryConfig)}}getEndpoints(){return this.endpoints}async request(e,t,n){let a=this.getEndpoints()[e];if(!a)throw new Error(`\u042D\u043D\u0434\u043F\u043E\u0438\u043D\u0442 ${String(e)} \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D`);try{return await a.request(t,n).wait()}catch(o){throw Te.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0437\u0430\u043F\u0440\u043E\u0441\u0430 \u043A ${String(e)}`,{error:o,params:t}),o}}async destroy(){await Promise.all(Object.values(this.endpoints).map(async e=>(e.destroy(),Promise.resolve()))),this.endpoints={},await this.queryStorage.destroy()}};var R=!1,q=new Map;function Ie(s){let e=0;if(s.length===0)return e.toString(36);for(let t=0;t<s.length;t++){let n=s.charCodeAt(t);e=(e<<5)-e+n,e=e&e}return Math.abs(e).toString(36).substring(0,6)}function I(s,e){if(s===e)return!0;if(s==null||e==null)return!1;if(typeof s!="object"&&typeof s!="function"&&typeof e!="object"&&typeof e!="function")return s===e;if(typeof s!=typeof e)return!1;if(s instanceof Date&&e instanceof Date)return s.getTime()===e.getTime();if(Array.isArray(s)&&Array.isArray(e)){if(s.length!==e.length)return!1;for(let t=0;t<s.length;t++)if(!I(s[t],e[t]))return!1;return!0}if(typeof s=="object"&&typeof e=="object"){let t=Object.keys(s),n=Object.keys(e);return t.length!==n.length?!1:t.every(r=>Object.prototype.hasOwnProperty.call(e,r)?I(s[r],e[r]):!1)}return!1}function De(s,e=I){let t,n,r=!1;return function(o){if(!r||t!==o){let i=s(o);(!r||!e(i,n))&&(n=i),t=o,r=!0}return n}}var Y=class{constructor(e,t,n=I,r){this.name=e;this.equals=n;this.logger=r;this.id=e,this.memoizedGetState=this.createMemoizedGetState(t)}id;subscribers=new Set;lastValue;memoizedGetState;createMemoizedGetState(e){let t=null,n=!1;return async()=>{if(n&&t)return t;n=!0;try{return t=e(),await t}finally{n=!1}}}async notify(){try{let e=await this.memoizedGetState();if(this.lastValue===void 0||!this.equals(e,this.lastValue)){this.lastValue=e;let t=Array.from(this.subscribers).map(async n=>{try{await n.notify(e)}catch(r){this.logger?.error(`[${this.id}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0438 \u043F\u043E\u0434\u043F\u0438\u0441\u0447\u0438\u043A\u0430`,{error:r})}});await Promise.all(t)}}catch(e){throw this.logger?.error(`[${this.id}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 notify()`,{error:e}),e}}subscribe(e){return this.subscribers.add(e),this.lastValue!==void 0?Promise.resolve().then(()=>{try{e.notify(this.lastValue)}catch(t){this.logger?.error(`[${this.id}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u0435\u0440\u0432\u043E\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u043C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0438`,{error:t})}}):this.notify().catch(t=>{this.logger?.error(`[${this.id}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u0435\u0440\u0432\u043E\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u043C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0438`,{error:t})}),()=>{this.subscribers.delete(e)}}cleanup(){this.subscribers.clear(),this.lastValue=void 0}getId(){return this.id}},J=class{constructor(e,t){this.source=e;this.logger=t;this.storageName=e.name,this.source.getState().then(n=>{this.cachedState=n})}storageName;subscriptions=new Map;cachedState;localSelectorCache=new Map;batchUpdateInProgress=!1;pendingUpdates=new Set;generateName(e,t,n){let r=e?"simple":"combined",a="";if(e){let o=t.toString();a=Ie(o)}else{let o=t.map(c=>c.getId()).join("_"),i=n.toString();a=Ie(o+i)}return`${this.storageName}_${r}_${a}`}processPendingUpdates(){this.pendingUpdates.size===0||this.batchUpdateInProgress||(this.batchUpdateInProgress=!0,setTimeout(async()=>{try{let e=Array.from(this.pendingUpdates);this.pendingUpdates.clear(),this.cachedState=await this.source.getState();let t=e.map(async n=>{let r=this.subscriptions.get(n);if(r)try{return await r.notify()}catch(a){this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u043F\u0438\u0441\u0447\u0438\u043A\u0430 ${n}`,{error:a})}return Promise.resolve()});await Promise.all(t)}catch(e){this.logger?.error("\u041E\u0448\u0438\u0431\u043A\u0430 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0438 \u043E\u0436\u0438\u0434\u0430\u044E\u0449\u0438\u0445 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0439",{error:e})}finally{this.batchUpdateInProgress=!1,this.pendingUpdates.size>0&&this.processPendingUpdates()}},0))}createSelector(e,t,n){let r=!Array.isArray(e),a=r?t||{}:n||{},o=a.name||this.generateName(r,e,r?void 0:t);if(this.localSelectorCache.has(o))return this.localSelectorCache.get(o).api;if(q.has(o)){let l=q.get(o);return l.refCount++,l.api}let i,c,d=[];if(r){let l=De(e,a.equals||I),u=this.createSimpleSelector(l,{...a,name:o,equals:a.equals||I});i=u.api,d=u.unsubscribeFunctions}else{c=e;let l=this.createCombinedSelector(c,t,{...a,name:o,equals:a.equals||I});i=l.api,d=l.unsubscribeFunctions}return this.localSelectorCache.set(o,{api:i,dependencies:c,unsubscribeFunctions:d}),q.set(o,{api:i,refCount:1,unsubscribeFunctions:d}),i}createSimpleSelector(e,t){let n=async()=>{if(this.cachedState)return e(this.cachedState);let c=await this.source.getState();return this.cachedState=c,e(c)},r=new Y(t.name,n,t.equals||I,this.logger),a=r.getId();this.subscriptions.set(a,r);let i=[this.source.subscribeToAll(async c=>{c?.type==="storage:update"&&(this.pendingUpdates.add(a),this.processPendingUpdates())})];return{api:{select:()=>n(),subscribe:c=>r.subscribe(c),getId:()=>a},unsubscribeFunctions:i}}createCombinedSelector(e,t,n){let r=De(u=>t(...u),n.equals||I),a=async()=>{let u=await Promise.all(e.map(g=>g.select()));return r(u)},o=new Y(n.name,a,n.equals||I,this.logger),i=o.getId();this.subscriptions.set(i,o);let c=null,d=()=>{c!==null&&clearTimeout(c),c=setTimeout(()=>{c=null,o.notify().catch(u=>this.logger?.error(`[${i}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u0435\u043D\u043D\u043E\u043C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0438:`,{error:u}))},10)},l=e.map(u=>u.subscribe({notify:()=>{d()}}));return{api:{select:()=>a(),subscribe:u=>o.subscribe(u),getId:()=>i},unsubscribeFunctions:l}}destroy(){this.subscriptions.forEach(t=>t.cleanup()),this.subscriptions.clear(),this.cachedState=void 0,this.pendingUpdates.clear(),this.localSelectorCache.forEach(t=>{t.unsubscribeFunctions.forEach(n=>n())});let e=new Set;this.localSelectorCache.forEach((t,n)=>{e.add(n)}),this.localSelectorCache.clear(),e.forEach(t=>{let n=q.get(t);n&&(n.refCount--,n.refCount<=0&&(n.unsubscribeFunctions.forEach(r=>r()),q.delete(t)))})}};var Oe=class{constructor(e,t,n="default"){this.parentExecutor=e;this.logger=t;this.storageName=n}plugins=new Map;createContext(e){return{storageName:this.storageName,timestamp:Date.now(),metadata:e}}async add(e){if(this.plugins.has(e.name)){this.logger?.warn(`\u041F\u043B\u0430\u0433\u0438\u043D ${e.name} \u0443\u0436\u0435 \u0431\u044B\u043B \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D`);return}try{await e.initialize?.(),this.plugins.set(e.name,e),this.logger?.info("\u041F\u043B\u0430\u0433\u0438\u043D \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D",{name:e.name})}catch(t){throw t}}async remove(e){let t=this.plugins.get(e);t&&(await t.destroy?.(),this.plugins.delete(e),this.logger?.info("\u041F\u043B\u0430\u0433\u0438\u043D \u0443\u0434\u0430\u043B\u0435\u043D",{name:e}))}get(e){return this.plugins.get(e)}getAll(){return Array.from(this.plugins.values())}async initialize(){for(let e of this.plugins.values())await e.initialize?.()}async destroy(){await Promise.all(Array.from(this.plugins.values()).map(e=>e.destroy?.()??Promise.resolve())),this.plugins.clear()}async executeBeforeSet(e,t){let n=e,r=this.createContext(t);this.parentExecutor&&(n=await this.parentExecutor.executeBeforeSet(n,r));for(let a of this.plugins.values())if(a.onBeforeSet)try{n=await a.onBeforeSet(n,r)}catch(o){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${a.name} onBeforeSet`,{error:o}),o}return n}async executeAfterSet(e,t,n){let r=t,a=this.createContext(n);this.parentExecutor&&(r=await this.parentExecutor.executeAfterSet(e,r,a));for(let o of this.plugins.values())if(o.onAfterSet)try{r=await o.onAfterSet(e,r,a)}catch(i){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${o.name} onAfterSet`,{key:e,error:i}),i}return r}async executeBeforeGet(e,t){let n=e,r=this.createContext(t);this.parentExecutor&&(n=await this.parentExecutor.executeBeforeGet(n,r));for(let a of this.plugins.values())if(a.onBeforeGet)try{n=await a.onBeforeGet(n,r)}catch(o){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${a.name} onBeforeGet`,{key:e,error:o}),o}return n}async executeAfterGet(e,t,n){let r=t,a=this.createContext(n);this.parentExecutor&&(r=await this.parentExecutor.executeAfterGet(e,r,a));for(let o of this.plugins.values())if(o.onAfterGet)try{r=await o.onAfterGet(e,r,a)}catch(i){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${o.name} onAfterGet`,{key:e,error:i}),i}return r}async executeBeforeDelete(e,t){let n=!0,r=this.createContext(t);this.parentExecutor&&(n=await this.parentExecutor.executeBeforeDelete(e,r));for(let a of this.plugins.values())if(a.onBeforeDelete)try{n=await a.onBeforeDelete(e,r)&&n}catch(o){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${a.name} onBeforeDelete`,{key:e,error:o}),o}return n}async executeAfterDelete(e,t){let n=this.createContext(t);this.parentExecutor&&await this.parentExecutor.executeAfterDelete(e,n);for(let r of this.plugins.values())if(r.onAfterDelete)try{await r.onAfterDelete(e,n)}catch(a){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${r.name} onAfterDelete`,{key:e,error:a}),a}}async executeOnClear(e){let t=this.createContext(e);this.parentExecutor&&await this.parentExecutor.executeOnClear(t);for(let n of this.plugins.values())if(n.onClear)try{await n.onClear(t)}catch(r){throw this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435 ${n.name} onClear`,{error:r}),r}}};var ce=(a=>(a.STRICT="strict",a.FIRST_WINS="first_wins",a.DEEP_MERGE="deep_merge",a.OVERRIDE="override",a.WARN_AND_USE_FIRST="warn_and_use_first",a))(ce||{});var le=(r=>(r.IDLE="idle",r.LOADING="loading",r.READY="ready",r.ERROR="error",r))(le||{}),de=(o=>(o.STORAGE_UPDATE="storage:update",o.STORAGE_DELETE="storage:delete",o.STORAGE_PATCH="storage:patch",o.STORAGE_SELECT="storage:select",o.STORAGE_CLEAR="storage:clear",o.STORAGE_DESTROY="storage:destroy",o))(de||{});var X=class{channel;tabId;messageHandlers;syncHandler;debug;syncTimeoutMs=1e3;pendingSyncRequests;constructor(e,t={}){this.channel=new BroadcastChannel(e),this.tabId=crypto.randomUUID(),this.messageHandlers=new Set,this.debug=t.debug??!1,this.pendingSyncRequests=new Map,this.channel.onmessage=this.handleMessage.bind(this),this.channel.onmessageerror=this.handleError.bind(this)}log(...e){this.debug}error(...e){}async handleMessage(e){let t=e.data;if(t.senderId!==this.tabId){if(t.type==="SYNC_REQUEST"){if(this.syncHandler)try{let n=await this.syncHandler();this.postMessage("SYNC_RESPONSE",n,t.senderId)}catch(n){this.error("Error handling sync request:",n)}return}if(t.type==="SYNC_RESPONSE"){let n=this.pendingSyncRequests.get(this.tabId);n&&(clearTimeout(n.timeout),this.pendingSyncRequests.delete(this.tabId),n.resolve(t.payload));return}for(let n of this.messageHandlers)try{await n(t)}catch(r){this.error("Error in message handler:",r)}}}handleError(e){this.error("Channel error:",e)}postMessage(e,t,n){let r={type:e,payload:t,senderId:this.tabId,timestamp:Date.now()};this.channel.postMessage(r)}subscribe(e){return this.messageHandlers.add(e),()=>this.messageHandlers.delete(e)}setSyncHandler(e){this.syncHandler=e}broadcast(e,t){this.postMessage(e,t)}async requestSync(){return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingSyncRequests.delete(this.tabId),e(null)},this.syncTimeoutMs);this.pendingSyncRequests.set(this.tabId,{resolve:e,reject:t,timeout:n}),this.postMessage("SYNC_REQUEST",{type:"sync"})})}close(){for(let[,e]of this.pendingSyncRequests)clearTimeout(e.timeout),e.reject(new Error("Channel closed"));this.pendingSyncRequests.clear(),this.messageHandlers.clear(),this.syncHandler=void 0,this.channel.close()}};async function We(s,e,t){switch(e){case"set":t?.key!==void 0&&t?.value!==void 0&&(await s.storage.doSet(t.key,t.value),s.storage.notifySubscribers(t.key,t.value));break;case"update":Array.isArray(t?.value)&&(await s.storage.doUpdate(t.value),t.value.forEach(({key:n,value:r})=>{s.storage.notifySubscribers(n,r)}));break;case"delete":t?.key!==void 0&&(await s.storage.doDelete(t.key),s.storage.notifySubscribers(t.key,void 0));break;case"clear":await s.storage.doClear(),s.storage.notifySubscribers("*",{type:"storage:update",value:{},source:"broadcast"});break}s.storage.notifySubscribers("*",{type:"storage:update",key:t?.key,value:t?.value,source:"broadcast"})}async function Qe(s,e,t){switch(e){case"set":if(t?.key!==void 0){let n=await s.storage.doGet(t.key);s.storage.notifySubscribers(t.key,n)}break;case"update":if(Array.isArray(t?.value)){for(let{key:n}of t.value){let r=await s.storage.doGet(n);s.storage.notifySubscribers(n,r)}s.storage.notifySubscribers("*",{type:"storage:update",key:t.value.map(({key:n})=>n),value:t.value,source:"broadcast"})}break;case"delete":t?.key!==void 0&&s.storage.notifySubscribers(t.key,void 0);break;case"clear":s.storage.notifySubscribers("*",{type:"storage:update",value:{},source:"broadcast"});break}e!=="update"&&s.storage.notifySubscribers("*",{type:"storage:update",key:t?.key,value:e==="delete"?void 0:t?.value,source:"broadcast"})}var Me=s=>{let{storageName:e,storageType:t}=s,n=`${t}-${e}`,r=new X(n,{debug:!0});return{name:"broadcast",setup:a=>(t==="memory"&&(r.setSyncHandler(async()=>{let o=await a.getState();return{type:"update",key:"*",value:Object.entries(o).map(([d,l])=>({key:d,value:l})),metadata:{batchUpdate:!0,timestamp:Date.now()}}}),r.requestSync().then(async o=>{if(o?.type==="update"&&Array.isArray(o.value))try{if(!o.value.every(c=>c&&typeof c=="object"&&"key"in c&&"value"in c))return;await a.storage.doUpdate(o.value),o.value.forEach(({key:c,value:d})=>{a.storage.notifySubscribers(c,d)}),a.storage.notifySubscribers("*",{type:"storage:update",value:o.value,source:"broadcast"})}catch{}})),r.subscribe(async o=>{let{type:i,payload:c}=o;t==="memory"?await We(a,i,c):await Qe(a,i,c)})),reducer:a=>o=>async i=>{let c=await o(i);return["set","delete","clear","update"].includes(i.type)&&r.broadcast(i.type,i),c},cleanup:()=>{r.close()}}};var $=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),a=this.instances.get(e);if(a&&r){let i=this.mergeConfigurations(r,t);return{instance:a,isNewInstance:!1,appliedConfig:i.finalConfig,conflicts:i.conflicts}}let o=n(t);return this.instances.set(e,o),this.configs.set(e,{...t}),this.logger?.debug(`Created new singleton instance: ${e}`),{instance:o,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=[],a=new Set([...Object.keys(e||{}),...Object.keys(t||{})]);for(let o of a){let i=`${n}.${o}`,c=e?.[o],d=t?.[o];c!==d&&(c===void 0||d===void 0?r.push(`${i}: missing in one config`):typeof c!=typeof d?r.push(`${i}: type mismatch (${typeof c} vs ${typeof d})`):typeof c=="object"&&c!==null&&d!==null?r.push(...this.findObjectConflicts(c,d,i)):r.push(`${i}: value mismatch (${c} vs ${d})`))}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}},K=class{static generate(e,t){return e.singleton?.key?e.singleton.key:`${t}_${e.name}`}};var M=class{static handleSingletonCreation(e,t,n,r){if(!e.singleton?.enabled)return n(e);r&&$.setLogger(r);let a=K.generate(e,t),o=$.getOrCreate(a,e,n);return o.isNewInstance?r?.debug(`Created new singleton storage: ${a}`):(r?.debug(`Reusing existing singleton storage: ${a}`),o.conflicts&&o.conflicts.length>0&&r?.debug(`Configuration conflicts detected: ${o.conflicts.join(", ")}`)),o.instance}};var Fe=(s={})=>{let e=s.batchSize??10,t=s.batchDelay??10,n=new Map,r=new Map,a=g=>g.type==="set"||g.type==="update",o=g=>`${g.type}_${g.key?.toString()||"default"}`,i=g=>{let p=new Map;for(let f of g){let y=`${f.type}_${f.key?.toString()||"default"}`;p.set(y,f)}return Array.from(p.values())},c=g=>{let p=r.get(g);p&&(globalThis.clearTimeout(p),r.delete(g))},d=(g,p)=>{let f=globalThis.setTimeout(p,t);r.set(g,f)},l=async(g,p,f)=>{let y=n.get(g);if(!(!y||y.length===0)){n.delete(g),c(g);try{let b=y.map(S=>S.action),h=i(b);for(let S of h)try{let v=await f(S);y.filter(m=>m.action.type===S.type&&m.action.key?.toString()===S.key?.toString()).forEach(m=>m.resolve(v))}catch(v){y.filter(m=>m.action.type===S.type&&m.action.key?.toString()===S.key?.toString()).forEach(m=>m.reject(v))}}catch(b){y.forEach(h=>h.reject(b))}}},u=async(g,p,f)=>new Promise((y,b)=>{let h=o(g),S=n.get(h);S||(S=[],n.set(h,S)),S.push({action:g,resolve:y,reject:b,timestamp:Date.now()}),c(h),S.length>=e?setImmediate(()=>l(h,p,f)):d(h,()=>l(h,p,f))});return{name:"batching",setup:()=>{},cleanup:async()=>{r.forEach(g=>globalThis.clearTimeout(g)),r.clear(),n.clear()},reducer:g=>p=>async f=>a(f)?u(f,g,p):p(f)}};var $e=(s={})=>{let{comparator:e=(r,a)=>{if(r===a)return!0;if(typeof r!="object"||typeof a!="object"||r===null||a===null)return r===a;let o=Object.keys(r),i=Object.keys(a);return o.length!==i.length?!1:o.every(c=>Object.prototype.hasOwnProperty.call(a,c)&&r[c]===a[c])},segments:t=[]}=s,n=new Map;return{name:"shallow-compare",setup:r=>{},reducer:r=>a=>async o=>{if(o.type!=="set"||t.length&&!t.includes(o.metadata?.segment??"default"))return a(o);let i=o.key,c=n.get(i),d=o.value;if(c!==void 0&&e(c,d))return{...c,t:{valueNotChanged:!0,originalValue:c}};let l=await a(o);return n.set(i,d),l}}};var Z=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 a=await this.api.storage.doGet("");return Object.keys(a||{}).length>0?a:r.value?(await this.api.storage.doSet("",r.value),this.api.storage.doGet("")):a}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 a={...r,metadata:{...r.metadata,processed:!0,timestamp:r.metadata?.timestamp||Date.now()}};return t.reducer(this.api)(n)(a)}}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 P(s){return s instanceof T&&s.isUnparseable()?[s.toString()]:s.toString().replace(/\[/g,".").replace(/\]/g,"").split(".").filter(Boolean)}function A(s,e){return P(e).reduce((n,r)=>n===void 0?void 0:n[r],s)}function O(s,e,t){if(e==="")return t;let n=P(e);if(e instanceof T&&e.isUnparseable())return s[e.toString()]=t,s;let r=n.pop(),a=n.reduce((o,i)=>{let c=n[n.indexOf(i)+1],d=!Number.isNaN(Number(c));return i in o||(o[i]=d?[]:{}),o[i]},s);return a[r]=t,s}var F=class s{constructor(e,t,n,r){this.config=e;this.pluginExecutor=t;this.eventEmitter=n;this.logger=r;this.name=e.name,this.middlewareModule=new Z({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(a){this.logger?.error("Error in status change callback",{error:a})}})}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={})=>Fe(e),shallowCompare:(e={})=>$e(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,a=await this.middlewareModule.dispatch({type:"set",key:e,value:r,metadata:n}),o=a?.t?.valueNotChanged===!0,i;if(o&&a?.t?.originalValue!==void 0?i=a.t.originalValue:i=await this.pluginExecutor?.executeAfterSet(e,a,n)??a,!o){let d=[e.toString()];this.notifySubscribers(e,i),this.notifySubscribers(s.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:i,changedPaths:d}),await this.emitEvent({type:"storage:update",payload:{key:e,value:i,changedPaths:d}})}}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 a=this.findChangedPaths(n,r);if(a.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(a)});let o=new Set;for(let g of a){let p=g.split(".")[0];o.add(p)}let i=await Promise.all(Array.from(o).map(async g=>{let p={...t,key:g},f=await this.pluginExecutor?.executeBeforeSet(r[g],p)??r[g];return{key:g,value:f}})),c=await this.middlewareModule.dispatch({type:"update",value:i,metadata:{...t,batchUpdate:!0,changedPaths:Array.from(a)}}),d={};Array.isArray(c)?c.forEach(g=>{g&&typeof g=="object"&&"key"in g&&"value"in g&&(d[g.key]=g.value)}):c&&typeof c=="object"&&(d={...c});let l=Object.keys(d).filter(g=>!this.isEqual(n[g],d[g]));if(l.length===0){this.logger?.debug&&this.logger.debug("No actual changes after middleware processing");return}let u={};l.forEach(g=>{u[g]=d[g]}),this.logger?.debug&&this.logger.debug("Notifying subscribers about changes:",{keys:l}),this.notifySubscribers(s.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:l,value:u,changedPaths:Array.from(a)});for(let g of a)try{let p=g.split(".")[0];if(p in u){let f;if(g===p)f=u[p];else{let y=g.substring(p.length+1);f=A(u[p],y)}f!==void 0&&this.notifySubscribers(g,f)}}catch(p){this.logger?.error("Error notifying path subscribers",{path:g,error:p})}await this.emitEvent({type:"storage:update",payload:{state:u,key:l,changedPaths:Array.from(a)}})}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 o=[e.toString()];this.notifySubscribers(e,void 0),this.notifySubscribers(s.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:void 0,result:r,changedPaths:o}),await this.emitEvent({type:"storage:update",payload:{key:e,value:void 0,result:r,changedPaths:o}})}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(s.GLOBAL_SUBSCRIPTION_KEY)||this.subscribers.set(s.GLOBAL_SUBSCRIPTION_KEY,new Set),this.subscribers.get(s.GLOBAL_SUBSCRIPTION_KEY).add(e),()=>{let t=this.subscribers.get(s.GLOBAL_SUBSCRIPTION_KEY);t&&(t.delete(e),t.size===0&&this.subscribers.delete(s.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=K.generate(this.config,e);$.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(a){this.logger?.error("Error in initial callback",{key:e,error:a})}}),()=>{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 i=0;i<e.length;i++)if(!this.isEqual(e[i],t[i]))return!1;return!0}let a=Object.keys(e),o=Object.keys(t);return a.length!==o.length?!1:a.every(i=>Object.prototype.hasOwnProperty.call(t,i)&&this.isEqual(e[i],t[i]))}extractPath(e,t){if(this.selectorPathCache.has(e))return this.selectorPathCache.get(e);let n=[],r=(a="")=>({get:(o,i)=>{if(typeof i=="symbol")return Reflect.get(o,i);let c=a?`${a}.${i}`:i;return n.push(c),new Proxy({},r(c))},has:(o,i)=>!0,ownKeys:()=>[],getOwnPropertyDescriptor:()=>({configurable:!0,enumerable:!0}),apply:(o,i,c)=>new Proxy(()=>{},r(a))});try{e(new Proxy(t,r()))}catch{}return n.length===0?"":(n.sort((a,o)=>o.length-a.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(o=>{try{o(t)}catch(i){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:i})}})}findChangedPaths(e,t,n="",r=new Set,a=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(a.has(e))return r;a.set(e,!0);let o=new Set([...Object.keys(e||{}),...Object.keys(t||{})]);for(let i of o){let c=e[i],d=t[i];if(c===d)continue;let l=n?`${n}.${i}`:i;c&&d&&typeof c=="object"&&typeof d=="object"&&!Array.isArray(c)&&!Array.isArray(d)?this.findChangedPaths(c,d,l,r,a):Array.isArray(c)&&Array.isArray(d)?this.isEqual(c,d)||r.add(l):this.isEqual(c,d)||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 a=async o=>{try{if(o==null){let d=await this.getState(),l=e(d);t(l);return}if(typeof o!="object"||o===null){t(o);return}let i=await this.getState(),c=e(i);t(c)}catch(i){this.logger?.error("Error in selector callback",{path:r,error:i}),t(o)}};return r?this.subscribeByKey(r,a):this.subscribeToAll(()=>{this.getState().then(o=>{t(e(o))})})}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 ue=class s{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){s.instances.has(e)||s.instances.set(e,new s(e,t,n));let r=s.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 a=0;a<this.db.objectStoreNames.length;a++)this.storeNames.add(this.db.objectStoreNames[a]);this.logger?.debug(`Database "${this.dbName}" opened successfully`,{version:this.db.version,stores:Array.from(this.db.objectStoreNames)}),t(this.db)},r.onupgradeneeded=a=>{let o=a.target.result;this.logger?.debug(`Upgrading database "${this.dbName}" to version ${this.dbVersion}`);for(let i of e)o.objectStoreNames.contains(i)||(this.logger?.debug(`Creating store "${i}"`),o.createObjectStore(i))}})}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`),s.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}},ge=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 a=indexedDB.open(this.dbName,e);a.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:a.error}),r(a.error)},a.onsuccess=()=>{this.db=a.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)},a.onupgradeneeded=o=>{let i=o.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 c of t)i.objectStoreNames.contains(c)||(this.logger?.debug(`\u0421\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430 "${c}"`),i.createObjectStore(c))}})}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)}},k=class s extends F{static STORAGE_TYPE="memory";DB_NAME;STORE_NAME;DB_VERSION;dbManager;constructor(e,t,n,r){super(e,t,n,r);let a=e.options;this.DB_NAME=a.dbName||"app_storage",this.STORE_NAME=e.name,this.DB_VERSION=a.dbVersion||1,this.dbManager=ue.getInstance(this.DB_NAME,this.DB_VERSION,r)}getStorageType(){return"memory"}static create(e,t,n,r){return M.handleSingletonCreation(e,this.STORAGE_TYPE,a=>new s(a,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 a=await this.getCurrentDBVersion(e)||1,o=new ge(e,a,n),i=Object.values(t).map(d=>d.name);await o.ensureStoresExist(i);let c={};for(let[d,l]of Object.entries(t)){let u=new s({...l,options:{dbName:e,dbVersion:o.getCurrentVersion()}},l.pluginExecutor,l.eventEmitter,n);c[d]=await u.initialize()}return c}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,a)=>{let o=t.getAll();o.onerror=()=>a(o.error),o.onsuccess=()=>{let i=o.result,c=t.getAllKeys();c.onsuccess=()=>{let d=c.result.reduce((l,u,g)=>(u!=="root"&&(l[u]=i[g]),l),{});r(d)},c.onerror=()=>a(c.error)}});if(e instanceof T&&e.isUnparseable())return new Promise((r,a)=>{let o=t.get(e.valueOf());o.onerror=()=>a(o.error),o.onsuccess=()=>r(o.result)});let n=P(e);if(n.length>1){let r=n[0];return new Promise((a,o)=>{let i=t.get(r);i.onerror=()=>o(i.error),i.onsuccess=()=>{let c=i.result;if(!c){a(void 0);return}let d=A(c,n.slice(1).join("."));a(d)}})}return new Promise((r,a)=>{let o=t.get(n[0]);o.onerror=()=>a(o.error),o.onsuccess=()=>r(o.result)})}async doSet(e,t){if(e===""){let a=await this.getObjectStore("readwrite");return new Promise((o,i)=>{let c=a.transaction;c.oncomplete=()=>{o()},c.onerror=()=>{i(c.error)};let d=a.clear();d.onsuccess=()=>{let l=Object.entries(t);for(let[u,g]of l)a.put(g,u)},d.onerror=()=>{i(d.error)}})}let n=await this.getObjectStore("readwrite");if(e instanceof T&&e.isUnparseable()){await this.putValueInStore(n,e.valueOf(),t);return}let r=P(e);if(r.length>1){let a=r[0];return new Promise((o,i)=>{let c=n.get(a);c.onerror=()=>i(c.error),c.onsuccess=()=>{let d=c.result||{},l=O(d,r.slice(1).join("."),t),u=n.put(l,a);u.onerror=()=>i(u.error),u.onsuccess=()=>o()}})}await this.putValueInStore(n,r[0],t)}async putValueInStore(e,t,n){return new Promise((r,a)=>{let o=e.put(n,t.valueOf());o.onerror=()=>a(o.error),o.onsuccess=()=>r()})}async doUpdate(e){let t=new Map,n=[];for(let{key:r,value:a}of e){if(r instanceof T&&r.isUnparseable()){n.push({key:r.valueOf(),value:a});continue}let o=P(r),i=o[0],c=o.slice(1);t.has(i)||t.set(i,[]),t.get(i).push({path:c,value:a})}try{for(let{key:r,value:a}of n){let o=await this.getObjectStore("readwrite");await this.putValueInStore(o,r,a)}for(let[r,a]of t){let i={...await this.doGet(r)||{}};for(let{path:d,value:l}of a)d.length===0?i=l:i=O(i,d.join("."),l);let c=await this.getObjectStore("readwrite");await this.putValueInStore(c,r,i)}}catch(r){throw this.logger?.error("Error during update:",{error:r}),r}}async doDelete(e){let t=await this.getObjectStore("readwrite");if(e instanceof T&&e.isUnparseable())return new Promise((a,o)=>{let i=t.delete(e.valueOf());i.onerror=()=>o(i.error),i.onsuccess=()=>a(!0)});let n=P(e);if(n.length===1)return new Promise((a,o)=>{let i=t.delete(n[0]);i.onerror=()=>o(i.error),i.onsuccess=()=>a(!0)});let r=n[0];return new Promise((a,o)=>{let i=t.get(r);i.onerror=()=>o(i.error),i.onsuccess=()=>{let c=i.result;if(!c){a(!1);return}let d=A(c,n.slice(0,-1).join(".")),l=n[n.length-1];if(!d||!(l in d)){a(!1);return}if(Array.isArray(d)){let g=parseInt(l,10);isNaN(g)?delete d[l]:d.splice(g,1)}else delete d[l];let u=t.put(c,r);u.onerror=()=>o(u.error),u.onsuccess=()=>a(!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 U=class s extends F{static STORAGE_TYPE="localStorage";constructor(e,t,n,r){super(e,t,n,r)}static create(e,t,n,r){return M.handleSingletonCreation(e,this.STORAGE_TYPE,a=>new s(a,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 T&&e.isUnparseable()?n[e.valueOf()]:A(n,e)}async doSet(e,t){let n=localStorage.getItem(this.name),r=n?JSON.parse(n):{};if(e instanceof T&&e.isUnparseable()){r[e.valueOf()]=t,localStorage.setItem(this.name,JSON.stringify(r));return}let a=O({...r},e,t);localStorage.setItem(this.name,JSON.stringify(a))}async doDelete(e){let t=localStorage.getItem(this.name);if(!t)return!1;let n=JSON.parse(t);if(e instanceof T&&e.isUnparseable()){let c=e.valueOf();return c in n?(delete n[c],localStorage.setItem(this.name,JSON.stringify(n)),!0):!1}let r=P(e),a=r.slice(0,-1).join("."),o=r[r.length-1],i=a?A(n,a):n;return!i||!(o in i)?!1:(delete i[o],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:a}of e)r instanceof T&&r.isUnparseable()?n[r.valueOf()]=a:O(n,r,a);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 B=class s extends F{static STORAGE_TYPE="memory";storage=new Map;constructor(e,t,n,r){super(e,t,n,r)}static create(e,t,n,r){return M.handleSingletonCreation(e,this.STORAGE_TYPE,a=>new s(a,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 T&&e.isUnparseable()?t[e.valueOf()]:A(t,e)}async doSet(e,t){let n=this.storage.get(this.name)||{};if(e instanceof T&&e.isUnparseable()){n[e.valueOf()]=t,this.storage.set(this.name,n);return}let r=O({...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 T&&e.isUnparseable()){let i=e.valueOf();return i in t?(delete t[i],this.storage.set(this.name,t),!0):!1}let n=P(e),r=n.slice(0,-1).join("."),a=n[n.length-1],o=r?A(t,r):t;return!o||!(a in o)?!1:(delete o[a],this.storage.set(this.name,t),!0)}async doUpdate(e){let n={...this.storage.get(this.name)||{}};for(let{key:r,value:a}of e)r instanceof T&&r.isUnparseable()?n[r.valueOf()]=a:O(n,r,a);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 L=class{static createMemory(e,t,n,r){return B.create(e,t,n,r)}static createLocal(e,t,n,r){return U.create(e,t,n,r)}static createIndexedDB(e,t,n,r){return k.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}`)}}};import{useCallback as Be,useEffect as pe,useMemo as Ye,useRef as Je,useState as Xe}from"react";function jn(s,e={},t,n,r){let{autoInitialize:a=!0,destroyOnUnmount:o=!0}=e,i=Je(null),[c,d]=Xe({status:"idle"}),l=Ye(()=>{if(!i.current)try{i.current=L.create(s,t,n,r)}catch(b){return d({status:"error",error:b}),null}return i.current},[s,t,n,r]),u=Be(async()=>{if(l)try{d({status:"loading"}),await l.initialize(),d({status:"ready"})}catch(b){d({status:"error",error:b})}},[l]),g=Be(async()=>{if(l)try{await l.destroy(),d({status:"idle"})}catch(b){d({status:"error",error:b})}},[l]);pe(()=>l?l.onStatusChange(h=>{d(h)}):void 0,[l]),pe(()=>{a&&l&&c.status==="idle"&&u()},[a,l,c.status,u]),pe(()=>()=>{o&&l&&l.destroy().catch(console.error)},[o,l]);let p=c.status==="ready",f=c.status==="loading",y=c.status==="error";return{storage:l,status:c,initialize:u,destroy:g,isReady:p,isLoading:f,hasError:y}}import{useEffect as Ze,useRef as Ke,useState as Ne}from"react";var j=new Map;function zn(s,e){let[t,n]=Ne(e?.initialValue),[r,a]=Ne(!!e?.withLoading),o=Ke(e?.initialValue),i=Ke(e?.equals||((l,u)=>l===u)),c=s.getId(),d=l=>{(o.current===void 0||!i.current(l,o.current))&&(o.current=l,n(l))};return Ze(()=>{j.has(c)||j.set(c,{lastValue:void 0,listeners:new Set,unsubscribe:null});let l=j.get(c);return l.listeners.add(d),l.lastValue!==void 0?(d(l.lastValue),e?.withLoading&&a(!1)):(e?.withLoading&&a(!0),s.select().then(u=>{l.lastValue=u,l.listeners.forEach(g=>g(u)),e?.withLoading&&a(!1)}).catch(u=>{e?.withLoading&&a(!1)})),l.unsubscribe||(l.unsubscribe=s.subscribe({notify:u=>{l.lastValue=u,l.listeners.forEach(g=>{try{g(u)}catch{}})}})),()=>{let u=j.get(c);u&&(u.listeners.delete(d),u.listeners.size===0&&(u.unsubscribe&&u.unsubscribe(),j.delete(c)))}},[s,c]),e?.withLoading?{data:t,isLoading:r}:t}import{useEffect as et,useState as tt}from"react";var Wn=(s,e)=>{let[t,n]=tt(void 0);return et(()=>{let r=!0;(async()=>{try{let i=await s.getState(),c=e(i);r&&n(c)}catch{}})();let o;try{o=s.subscribe(e,i=>{r&&n(i)})}catch{o=()=>{}}return()=>{r=!1,o()}},[s,e]),t};import{useEffect as vt,useState as Se}from"react";import{Observable as rt,Subject as qe}from"rxjs";var fe=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 qe;actions=this.actions$.asObservable();dispatch={};watchers={};storage;middlewareFunctions=[];middlewareAPI;use(...e){for(let t=0;t<e.length;t++)try{let n=e[t](this.middlewareAPI);this.middlewareFunctions.push(n)}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 n=`[${this.storage.name}]${e.type}`,r=null,a=null,o=async i=>{let c=[i];if(t?.memoize&&r&&a&&t.memoize(c,r,a))return a;let d={type:n,meta:e.meta},l;if(this.middlewareFunctions.length>0){let u=async g=>t?.worker?this.executeInWorker(t.worker,n,c,e.action):Promise.resolve(e.action(i));for(let g=this.middlewareFunctions.length-1;g>=0;g--){let p=this.middlewareFunctions[g],f=u;u=async y=>p(async h=>f(h))(y)}l=await u(d)}else t?.worker?l=await this.executeInWorker(t.worker,n,c,e.action):l=await e.action(i);return d.payload=l,r=[...c],a=l,this.actions$.next(d),l};return o.r="dispatch",Object.defineProperty(o,"actionType",{value:n,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(o,"meta",{value:e.meta,writable:!1,enumerable:!0}),o}createWatcher(e){let t=`[${this.storage.name}]${e.type}`,n=new qe,r,a=async()=>{let c=await this.storage.getState();return e.selector(c)},o=this.storage.subscribe(e.selector,c=>{if(!e.shouldTrigger||e.shouldTrigger(r,c)){let d={type:t,payload:c,meta:e.meta};this.actions$.next(d),n.next(d),r=c}}),i=()=>{let c=n.asObservable();return e.notifyAfterSubscribe?new rt(d=>{let l=!1;a().then(g=>{if(!e.shouldTrigger||e.shouldTrigger(void 0,g)){let p={type:t,payload:g,meta:{...e.meta,isInitial:!0}};d.next(p),r=g,l=!0}}).catch(g=>{d.error(g)});let u=c.subscribe({next:g=>{l&&g.payload===r||d.next(g)},error:g=>d.error(g),complete:()=>d.complete()});return()=>{u.unsubscribe()}}):c};return i.r="watchers",Object.defineProperty(i,"actionType",{value:t,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(i,"meta",{value:e.meta,writable:!1,enumerable:!0}),Object.defineProperty(i,"unsubscribe",{value:o,writable:!1,enumerable:!0}),i}async executeInWorker(e,t,n,r){return new Promise((a,o)=>{let i=`${t}_${Date.now()}_${Math.random()}`,c=d=>{d.data.requestId===i&&(e.removeEventListener("message",c),d.data.error?o(new Error(d.data.error)):a(d.data.result))};e.addEventListener("message",c),e.postMessage({type:t,args:n,requestId:i}),setTimeout(()=>{e.removeEventListener("message",c),o(new Error(`Worker execution timeout for action: ${t}`))},3e4)})}};function ke(s,e){let t=new fe(s),n=e(s.storage,{createAction:(r,a)=>t.createAction(r,a),createWatcher:r=>t.createWatcher(r)});for(let[r,a]of Object.entries(n))if(typeof a=="function"){let o=a.r;t[o][r]=a}return t}function ee(s,e=1){if(e<=0)throw new Error("Size must be greater than 0");if(!s||!s.length)return[];let t=[],n=s.length,r=0;for(;r<n;)t.push(s.slice(r,r+e)),r+=e;return t}var N=globalThis.console,C={log:(...s)=>N.log(...s),warn:(...s)=>N.warn(...s),error:(...s)=>N.error(...s),group:(...s)=>N.group(...s),groupEnd:()=>N.groupEnd(),groupCollapsed:(...s)=>N.groupCollapsed(...s)};function Ue(s,e){let t={};return[...new Set([...Object.keys(s),...Object.keys(e)])].forEach(r=>{if(r in s&&r in e)if(typeof s[r]=="object"&&s[r]!==null&&typeof e[r]=="object"&&e[r]!==null&&!Array.isArray(s[r])&&!Array.isArray(e[r])){let a=Ue(s[r],e[r]);Object.keys(a).length>0&&(t[r]=a)}else JSON.stringify(s[r])!==JSON.stringify(e[r])&&(t[r]={PREV:s[r],NEXT:e[r]});else r in s?t[r]={PREV:s[r],NEXT:void 0}:t[r]={PREV:void 0,NEXT:e[r]}}),t}var gs=(s={})=>{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"}},n={...t,...s,translations:{...e,...s.translations||{}},colors:{...t.colors,...s.colors||{}}},{collapsed:r,duration:a,colors:o,translations:i}=n;return c=>d=>async l=>{let u=Date.now(),g=await c.getState();try{let p=await d(l),f=await c.getState(),b=Date.now()-u,h=`${l.type}`;if((r?C.groupCollapsed:C.group)(`%c ${h}`,`color: ${o.title}; font-weight: bold`),C.log(`%c ${i.action}:`,`color: ${o.action}; font-weight: bold`,l),n.diff){let v=Ue(g,f),E=Object.keys(v).length;C.log(`%c ${i.diff} (${i.changesCount}: ${E}):`,`color: ${o.diff}; font-weight: bold`,v)}return n.showFullState&&(C.groupCollapsed(`%c ${i.showFullState}`,`color: ${o.fullState}; font-weight: bold`),C.log(`%c ${i.prevState}:`,`color: ${o.prevState}; font-weight: bold`,g),C.log(`%c ${i.nextState}:`,`color: ${o.nextState}; font-weight: bold`,f),C.groupEnd()),a&&C.log(`%c ${i.duration}: %c ${b}ms`,"font-weight: bold","color: #4CAF50"),C.groupEnd(),p}catch(p){throw C.error(`%c ${i.error}:`,`color: ${o.error}; font-weight: bold`,l.type,p),p}}};import{combineLatest as dt,merge as ut,Observable as gt,of as V,pipe as pt,Subject as ft}from"rxjs";import{catchError as yt,filter as _,map as te,share as ht,switchMap as St,take as mt}from"rxjs/operators";import{of as Le}from"rxjs";import{concatAll as nt,delay as st,mergeMap as ot,toArray as at}from"rxjs/operators";var je=(s,e,t,n=0)=>{let r=ee(e,t).map(a=>Le(a).pipe(st(n),ot(s)));return Le(...r).pipe(nt(),at())};import{forkJoin as it,timer as ct}from"rxjs";import{mergeMap as lt}from"rxjs/operators";var Ve=(s,e,t,n=0)=>it(ee(e,t).map((r,a)=>ct(a*n).pipe(lt(()=>s(r)))));function qs(s){let{actionType:e}=s;return e?t=>t.pipe(_(n=>n!==void 0&&n.type===e)):_(()=>!1)}function ks(s){let e=s.map(t=>t.actionType).filter(Boolean);return e.length===0?_(()=>!1):t=>t.pipe(_(n=>n!==void 0&&e.includes(n.type)))}function Us(s){return e=>{let t=s.map(r=>r.actionType).filter(Boolean);if(t.length===0)return V([]);let n=t.map((r,a)=>e.pipe(_(o=>o.type===r),mt(1),te(o=>({index:a,action:o}))));return dt(n).pipe(te(r=>(r.sort((a,o)=>a.index-o.index),r.map(a=>a.action))))}}function Ls(s,...e){return s.pipe(te(t=>e.map(n=>n(t))))}function js(s,e){return s.pipe(te(t=>{let n={};for(let[r,a]of Object.entries(e))n[r]=a(t);return n}))}function Vs({validator:s,apiCall:e}){return pt(St(t=>{let n=()=>e(t,{chunkRequest:Ve,chunkRequestConsistent:je});if(!s)return n();let r=s(t),{conditions:a,skipAction:o}=r;return a.every(Boolean)?n():Array.isArray(o)?V(...o?.filter(Boolean).map(c=>typeof c=="function"?c():c)):V(typeof o=="function"?o():o)}))}var re=class{constructor(e,t={},n,r={},a={}){this.storage=e;this.externalStates=t;this.dispatchers=n;this.services=r;this.config=a;this.subscribeToDispatchers(),this.state$=new gt(o=>{this.storage.getState().then(c=>o.next(c));let i=this.storage.subscribeToAll(()=>{this.storage.getState().then(c=>o.next(c))});return()=>i()}).pipe(ht())}effects=[];subscriptions=[];running=!1;action$=new ft;state$;subscribeToDispatchers(){for(let[e,t]of Object.entries(this.dispatchers)){let n=t.actions.subscribe(r=>{this.action$.next(r)});this.subscriptions.push(n)}}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 n=e(this.action$.asObservable(),this.state$,this.externalStates,this.dispatchers,this.services,this.config).pipe(yt(r=>V(null))).subscribe(r=>{if(r!=null&&typeof r=="function")try{r()}catch{}});this.subscriptions.push(n)}catch{}}};function _s(s){return s}function zs(s){return s}function Gs(...s){return(e,t,n,r,a,o)=>{let i=s.map(c=>{try{return c(e,t,n,r,a,o)}catch{return V(null)}});return ut(...i)}}function Tt(s){if(!s.storage&&!s.createStorageFn)throw new Error('Synapse config must have either "storage" or "createStorageFn"');if(s.storage&&s.createStorageFn)throw new Error('Synapse config cannot have both "storage" and "createStorageFn". Choose one.');if(s.effects&&!s.createDispatcherFn)throw new Error('Effects require dispatcher. Add "createDispatcherFn" to config.');if(s.createEffectConfig&&!s.createDispatcherFn)throw new Error('Effect config requires dispatcher. Add "createDispatcherFn" to config.');if(s.dependencies){if(!Array.isArray(s.dependencies))throw new Error("Dependencies must be an array");s.dependencies.forEach((e,t)=>{if(!e||typeof e!="object")throw new Error(`Dependency at index ${t} must be an object`);if(!e.storage||typeof e.storage.waitForReady!="function")throw new Error(`Dependency at index ${t} must have a storage with waitForReady method`)})}if(s.createStorageFn&&typeof s.createStorageFn!="function")throw new Error('"createStorageFn" must be a function');if(s.createDispatcherFn&&typeof s.createDispatcherFn!="function")throw new Error('"createDispatcherFn" must be a function');if(s.createSelectorsFn&&typeof s.createSelectorsFn!="function")throw new Error('"createSelectorsFn" must be a function');if(s.createEffectConfig&&typeof s.createEffectConfig!="function")throw new Error('"createEffectConfig" must be a function');if(s.effects){if(!Array.isArray(s.effects))throw new Error("Effects must be an array");s.effects.forEach((e,t)=>{if(typeof e!="function")throw new Error(`Effect at index ${t} must be a function`)})}if(s.externalSelectors&&typeof s.externalSelectors!="object")throw new Error("External selectors must be an object")}async function bt(s=[]){s.length!==0&&await Promise.all(s.map(async(e,t)=>{try{await e.storage.waitForReady()}catch(n){throw new Error(`Dependency ${t} initialization failed: ${n}`)}}))}async function ye(s){try{Tt(s)}catch(i){throw i}await bt(s.dependencies);let e=s.createStorageFn?await s.createStorageFn():s.storage;await e.waitForReady();let t=[],n={storage:e,selectors:{},destroy:async()=>{for(let i of t)await i()}};t.push(()=>e.destroy());let r,a,o;if(s.createSelectorsFn)try{a=new J(e);let i=s.externalSelectors||{};n.selectors=s.createSelectorsFn(a,i),typeof a.destroy=="function"&&t.push(()=>a.destroy())}catch{}if(s.createDispatcherFn&&(r=s.createDispatcherFn(e),n.dispatcher=r,r&&"dispatch"in r&&(n.actions=r.dispatch,typeof r.destroy=="function"&&t.push(()=>r.destroy()))),s.createEffectConfig&&r)try{let{dispatchers:i,api:c,config:d,externalStates:l}=s.createEffectConfig(r),u=l||{};o=new re(e,u,i,c,d),Array.isArray(s.effects)&&s.effects.forEach(g=>{o&&o.add(g)}),await o.start(),n.state$=o.state$,t.push(()=>{o&&o.stop()})}catch{}return n}function wt(s,e){return e==="*"?!0:e.includes("*")?new RegExp("^"+e.replace(/\*/g,".*")+"$").test(s):s===e}async function Et(s,e){let t=await s.getState(),n=Object.entries(t.events||{});if(n.length>e){let a=n.sort((o,i)=>i[1].timestamp-o[1].timestamp).slice(0,e);await s.set("events",Object.fromEntries(a))}}var Rt=(s={})=>ye({createStorageFn:async()=>new B({name:s.name||"eventBus",initialState:{events:{},subscriptions:{}}}).initialize(),createDispatcherFn:e=>ke({storage:e},(t,{createAction:n})=>({publish:n({type:"PUBLISH_EVENT",meta:{description:"\u041F\u0443\u0431\u043B\u0438\u043A\u0430\u0446\u0438\u044F \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u0432 EventBus"},action:async({event:r,data:a,metadata:o={}})=>{let i=`${r}_${Date.now()}_${Math.random()}`;return await t.set(`events.${i}`,{id:i,event:r,data:a,metadata:{ttl:o.ttl||null,priority:o.priority||"normal",...o},timestamp:Date.now()}),s.autoCleanup&&await Et(t,s.maxEvents||1e3),{eventId:i,event:r,data:a}}}),subscribe:n({type:"SUBSCRIBE_TO_EVENT",meta:{description:"\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0430 \u043D\u0430 \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u0432 EventBus"},action:async({eventPattern:r,handler:a,options:o={}})=>{let i=`sub_${Date.now()}_${Math.random()}`,c=t.subscribe(d=>d.events,d=>{Object.values(d||{}).forEach(l=>{if(wt(l.event,r)){if(o.priority&&l.metadata.priority!==o.priority)return;try{a(l.data,l)}catch{}}})});return await t.set(`subscriptions.${i}`,{id:i,pattern:r,options:o,createdAt:Date.now()}),{subscriptionId:i,unsubscribe:c}}}),getEventHistory:n({type:"GET_EVENT_HISTORY",meta:{description:"\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 \u0441\u043E\u0431\u044B\u0442\u0438\u0439"},action:async({eventType:r,limit:a=100})=>{let o=await t.getState();return Object.values(o.events||{}).filter(i=>i.event===r).sort((i,c)=>c.timestamp-i.timestamp).slice(0,a)}}),clearEvents:n({type:"CLEAR_EVENTS",meta:{description:"\u041E\u0447\u0438\u0441\u0442\u043A\u0430 \u0441\u043E\u0431\u044B\u0442\u0438\u0439"},action:async({olderThan:r}={})=>{if(r){let a=Date.now()-r;await t.update(o=>{Object.keys(o.events||{}).forEach(i=>{o.events[i].timestamp<a&&delete o.events[i]})})}else await t.set("events",{})}}),getActiveSubscriptions:n({type:"GET_SUBSCRIPTIONS",meta:{description:"\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043F\u043E\u0434\u043F\u0438\u0441\u043E\u043A"},action:async()=>{let r=await t.getState();return Object.values(r.subscriptions||{})}})}))});function he(s){let e="pending",t,n=null,r=new Set,a=new Set,o=(async()=>{try{let i=await(s instanceof Promise?s:Promise.resolve(s));return await i.storage.waitForReady(),t=i,e="ready",r.forEach(c=>{try{c(t)}catch{}}),i}catch(i){let c=i instanceof Error?i:new Error(String(i));throw n=c,e="error",a.forEach(d=>{try{d(c)}catch{}}),c}})();return{waitForReady:()=>o,isReady:()=>e==="ready",getStoreIfReady:()=>t,onReady:i=>{if(e==="ready"&&t)try{i(t)}catch{}else r.add(i);return()=>{r.delete(i)}},onError:i=>{if(e==="error"&&n)try{i(n)}catch{}else a.add(i);return()=>{a.delete(i)}},getStatus:()=>e,getError:()=>n,destroy:()=>{r.clear(),a.clear(),t=void 0,n=null,e="pending"}}}import{Fragment as _e,jsx as ne,jsxs as Ct}from"react/jsx-runtime";function xt(s,e){let{loadingComponent:t=ne("div",{children:"\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F..."}),errorComponent:n=i=>Ct("div",{children:["\u041E\u0448\u0438\u0431\u043A\u0430 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438: ",i.message]})}=e||{},r=he(s);function a(){let[i,c]=Se(()=>r.getStatus()),[d,l]=Se(()=>r.getStoreIfReady()),[u,g]=Se(()=>r.getError());return vt(()=>{let p=r.getStatus(),f=r.getStoreIfReady(),y=r.getError();c(p),l(f),g(y);let b=r.onReady(S=>{c("ready"),l(S),g(null)}),h=r.onError(S=>{c("error"),l(void 0),g(S)});return()=>{b(),h()}},[]),{isReady:i==="ready",isError:i==="error",isPending:i==="pending",store:d,error:u}}function o(i){function c(l){let{isReady:u,isError:g,error:p}=a();return g&&p?ne(_e,{children:n(p)}):u?ne(i,{...l}):ne(_e,{children:t})}let d=i.displayName||i.name||"Component";return c.displayName=`AwaitSynapse(${d})`,c}return{withSynapseReady:o,useSynapseReady:a,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 Pt,useContext as se,useEffect as At,useState as me}from"react";import{Fragment as Ot,jsx as z}from"react/jsx-runtime";var oe="\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",It="\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 Dt(s,e){let{loadingComponent:t=z("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 u=await(s instanceof Promise?s:Promise.resolve(s));return await u.storage.waitForReady(),u}catch(u){throw u}})(),r=Pt(null),a=()=>{let u=se(r);if(!u)throw new Error(`useSynapseStorage: ${oe}`);return u.storage},o=()=>{let u=se(r);if(!u)throw new Error(`useSynapseSelectors: ${oe}`);return u.selectors},i=()=>{let u=se(r);if(!u)throw new Error(`useSynapseActions: ${oe}`);if("actions"in u)return u.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.")},c=()=>{let u=se(r);if(!u)throw new Error(`useSynapseState$: ${oe}`);if("state$"in u)return u.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 d(u){function g(f){let[y,b]=me(null),[h,S]=me(!1),[v,E]=me(null);return At(()=>{let m=!0;return(async()=>{try{let x=await n;m&&(b(x),S(!0))}catch(x){m&&E(x instanceof Error?x:new Error(String(x)))}})(),()=>{m=!1}},[]),v?z("div",{children:`${It}: ${v.message}`}):!h||!y?z(Ot,{children:t}):z(r.Provider,{value:y,children:z(u,{...f})})}let p=u.displayName||u.name||"Component";return g.displayName=`SynapseContext(${p})`,g}return{contextSynapse:d,useSynapseStorage:a,useSynapseSelectors:o,useSynapseActions:i,useSynapseState$:c,cleanupSynapse:async()=>{try{return(await n)?.destroy()||Promise.resolve()}catch{}}}}export{Ae as ApiClient,ce as ConfigMergeStrategy,fe as Dispatcher,re as EffectsModule,k as IndexedDBStorage,U as LocalStorage,B as MemoryStorage,H as ResponseFormat,J as SelectorModule,de as StorageEvents,L as StorageFactory,Oe as StoragePluginModule,le as StorageStatus,Te as apiLogger,xt as awaitSynapse,Me as broadcastMiddleware,Gs as combineEffects,ke as createDispatcher,zs as createEffect,_s as createEffectBase,Rt as createEventBus,ye as createSynapse,he as createSynapseAwaiter,Dt as createSynapseCtx,be as createUniqueId,we as headersToObject,gs as loggerDispatcherMiddleware,qs as ofType,ks as ofTypes,Us as ofTypesWaitAll,Ls as selectorMap,js as selectorObject,jn as useCreateStorage,zn as useSelector,Wn as useStorageSubscribe,Vs as validateMap};
package/dist/react.d.ts CHANGED
@@ -1,10 +1,31 @@
1
+ import { j as IStorage, i as StorageInitStatus, U as UniversalStorageConfig, f as IPluginExecutor, m as IEventEmitter, n as ILogger } from './storage.interface-BA_ktyDz.js';
1
2
  import { S as SelectorAPI } from './selector.interface-CA5y-kD_.js';
2
- import { j as IStorage } from './storage.interface-2HKvqdAJ.js';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { ReactNode, ComponentType } from 'react';
5
- import { A as AnySynapseStore, b as SynapseStoreWithEffects, a as SynapseStoreWithDispatcher, S as SynapseStoreBasic } from './createSynapse-BLbPlWXK.js';
5
+ import { A as AnySynapseStore, b as SynapseStoreWithEffects, a as SynapseStoreWithDispatcher, S as SynapseStoreBasic } from './createSynapse-vkfKjRob.js';
6
6
  import { Observable } from 'rxjs';
7
- import './dispatcher.module-DcXkCRNj.js';
7
+ import './dispatcher.module-BOsMHbD5.js';
8
+
9
+ interface UseSynapseStorageOptions {
10
+ /**
11
+ * Автоматически инициализировать при монтировании
12
+ */
13
+ autoInitialize?: boolean;
14
+ /**
15
+ * Уничтожать storage при размонтировании
16
+ */
17
+ destroyOnUnmount?: boolean;
18
+ }
19
+ interface UseSynapseStorageReturn<T extends Record<string, any>> {
20
+ storage: IStorage<T> | null;
21
+ status: StorageInitStatus;
22
+ initialize: () => Promise<void>;
23
+ destroy: () => Promise<void>;
24
+ isReady: boolean;
25
+ isLoading: boolean;
26
+ hasError: boolean;
27
+ }
28
+ declare function useCreateStorage<T extends Record<string, any>>(config: UniversalStorageConfig<T>, options?: UseSynapseStorageOptions, pluginExecutor?: IPluginExecutor, eventEmitter?: IEventEmitter, logger?: ILogger): UseSynapseStorageReturn<T>;
8
29
 
9
30
  interface UseSelectorOptions<T> {
10
31
  /** Начальное значение до загрузки данных из селектора */
@@ -95,4 +116,4 @@ declare function createSynapseCtx<TStore extends Record<string, any>, TStorage e
95
116
  cleanupSynapse: () => Promise<void>;
96
117
  };
97
118
 
98
- export { awaitSynapse, createSynapseCtx, useSelector, useStorageSubscribe };
119
+ export { type UseSynapseStorageOptions, type UseSynapseStorageReturn, awaitSynapse, createSynapseCtx, useCreateStorage, useSelector, useStorageSubscribe };
package/dist/react.js CHANGED
@@ -1 +1 @@
1
- import{useEffect as U,useRef as M,useState as $}from"react";var f=new Map;function se(a,s){let[i,c]=$(s?.initialValue),[r,l]=$(!!s?.withLoading),d=M(s?.initialValue),t=M(s?.equals||((n,e)=>n===e)),o=a.getId(),u=n=>{(d.current===void 0||!t.current(n,d.current))&&(d.current=n,c(n))};return U(()=>{f.has(o)||f.set(o,{lastValue:void 0,listeners:new Set,unsubscribe:null});let n=f.get(o);return n.listeners.add(u),n.lastValue!==void 0?(u(n.lastValue),s?.withLoading&&l(!1)):(s?.withLoading&&l(!0),a.select().then(e=>{n.lastValue=e,n.listeners.forEach(p=>p(e)),s?.withLoading&&l(!1)}).catch(e=>{s?.withLoading&&l(!1)})),n.unsubscribe||(n.unsubscribe=a.subscribe({notify:e=>{n.lastValue=e,n.listeners.forEach(p=>{try{p(e)}catch{}})}})),()=>{let e=f.get(o);e&&(e.listeners.delete(u),e.listeners.size===0&&(e.unsubscribe&&e.unsubscribe(),f.delete(o)))}},[a,o]),s?.withLoading?{data:i,isLoading:r}:i}import{useEffect as j,useState as k}from"react";var ae=(a,s)=>{let[i,c]=k(void 0);return j(()=>{let r=!0;(async()=>{try{let t=await a.getState(),o=s(t);r&&c(o)}catch{}})();let d;try{d=a.subscribe(s,t=>{r&&c(t)})}catch{d=()=>{}}return()=>{r=!1,d()}},[a,s]),i};import{useEffect as G,useState as D}from"react";import{Observable as Et,Subject as xt}from"rxjs";var Dt=globalThis.console;import{combineLatest as yr,merge as hr,Observable as fr,of as Sr,pipe as Tr,Subject as br}from"rxjs";import{catchError as vr,filter as Er,map as xr,share as Rr,switchMap as Ar,take as Pr}from"rxjs/operators";import{of as Wt}from"rxjs";import{concatAll as Ht,delay as Yt,mergeMap as Jt,toArray as Xt}from"rxjs/operators";import{forkJoin as tr,timer as sr}from"rxjs";import{mergeMap as nr}from"rxjs/operators";function I(a){let s="pending",i,c=null,r=new Set,l=new Set,d=(async()=>{try{let t=await(a instanceof Promise?a:Promise.resolve(a));return await t.storage.waitForReady(),i=t,s="ready",r.forEach(o=>{try{o(i)}catch{}}),t}catch(t){let o=t instanceof Error?t:new Error(String(t));throw c=o,s="error",l.forEach(u=>{try{u(o)}catch{}}),o}})();return{waitForReady:()=>d,isReady:()=>s==="ready",getStoreIfReady:()=>i,onReady:t=>{if(s==="ready"&&i)try{t(i)}catch{}else r.add(t);return()=>{r.delete(t)}},onError:t=>{if(s==="error"&&c)try{t(c)}catch{}else l.add(t);return()=>{l.delete(t)}},getStatus:()=>s,getError:()=>c,destroy:()=>{r.clear(),l.clear(),i=void 0,c=null,s="pending"}}}import{Fragment as K,jsx as T,jsxs as Y}from"react/jsx-runtime";function H(a,s){let{loadingComponent:i=T("div",{children:"\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F..."}),errorComponent:c=t=>Y("div",{children:["\u041E\u0448\u0438\u0431\u043A\u0430 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438: ",t.message]})}=s||{},r=I(a);function l(){let[t,o]=D(()=>r.getStatus()),[u,n]=D(()=>r.getStoreIfReady()),[e,p]=D(()=>r.getError());return G(()=>{let g=r.getStatus(),v=r.getStoreIfReady(),m=r.getError();o(g),n(v),p(m);let E=r.onReady(y=>{o("ready"),n(y),p(null)}),x=r.onError(y=>{o("error"),n(void 0),p(y)});return()=>{E(),x()}},[]),{isReady:t==="ready",isError:t==="error",isPending:t==="pending",store:u,error:e}}function d(t){function o(n){let{isReady:e,isError:p,error:g}=l();return p&&g?T(K,{children:c(g)}):e?T(t,{...n}):T(K,{children:i})}let u=t.displayName||t.name||"Component";return o.displayName=`AwaitSynapse(${u})`,o}return{withSynapseReady:d,useSynapseReady:l,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 J,useContext as b,useEffect as X,useState as C}from"react";import{Fragment as ee,jsx as S}from"react/jsx-runtime";var w="\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",Q="\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 Z(a,s){let{loadingComponent:i=S("div",{children:"\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430..."})}=s||{},c=(async()=>{try{let e=await(a instanceof Promise?a:Promise.resolve(a));return await e.storage.waitForReady(),e}catch(e){throw e}})(),r=J(null),l=()=>{let e=b(r);if(!e)throw new Error(`useSynapseStorage: ${w}`);return e.storage},d=()=>{let e=b(r);if(!e)throw new Error(`useSynapseSelectors: ${w}`);return e.selectors},t=()=>{let e=b(r);if(!e)throw new Error(`useSynapseActions: ${w}`);if("actions"in e)return e.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.")},o=()=>{let e=b(r);if(!e)throw new Error(`useSynapseState$: ${w}`);if("state$"in e)return e.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 u(e){function p(v){let[m,E]=C(null),[x,y]=C(!1),[O,V]=C(null);return X(()=>{let R=!0;return(async()=>{try{let h=await c;R&&(E(h),y(!0))}catch(h){R&&V(h instanceof Error?h:new Error(String(h)))}})(),()=>{R=!1}},[]),O?S("div",{children:`${Q}: ${O.message}`}):!x||!m?S(ee,{children:i}):S(r.Provider,{value:m,children:S(e,{...v})})}let g=e.displayName||e.name||"Component";return p.displayName=`SynapseContext(${g})`,p}return{contextSynapse:u,useSynapseStorage:l,useSynapseSelectors:d,useSynapseActions:t,useSynapseState$:o,cleanupSynapse:async()=>{try{return(await c)?.destroy()||Promise.resolve()}catch{}}}}export{H as awaitSynapse,Z as createSynapseCtx,se as useSelector,ae 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-DcXkCRNj.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-DcXkCRNj.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;