synapse-storage 3.0.14 → 3.0.15

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 le={debug:(n,...e)=>{process.env.NODE_ENV},log:(n,...e)=>{process.env.NODE_ENV},info:(n,...e)=>{},warn:(n,...e)=>{},error:(n,...e)=>{}};function de(n){return`${n?`${n}|`:""}${Math.random().toString(36).substring(2,9)+Date.now().toString(36)}`}function ue(n){let e={};return n.forEach((t,s)=>{e[s.toLowerCase()]=t}),e}function N(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 pe(n,e){let t=new Headers,s=e||N({},{});if(n)try{t=await Promise.resolve(n(t,s))}catch{}return t}function ge(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 k=(a=>(a.Json="json",a.Blob="blob",a.ArrayBuffer="arrayBuffer",a.Text="text",a.FormData="formData",a.Raw="raw",a))(k||{});function he(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 Z(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 ye(n){let e=n.get("content-type")||"",t=n.get("content-disposition")||"",s=n.get("content-length");return Z(n)?{filename:Ke(n),contentType:e,contentDisposition:t,size:s?parseInt(s,10):void 0}:void 0}async function qe(n,e){let t=e,s=n.headers.get("content-type")||"";!t&&s&&(Z(n.headers)?t="blob":t=he(s)),t||(t="json");try{let r;switch((t==="blob"||t==="arrayBuffer")&&(r=ye(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 fe(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:p,responseFormat:u}=o,{signal:h,timeout:g=t,responseFormat:y}=a,v=y||u,f=new URL(c.startsWith("http")?c:`${e}${c}`);p&&Object.entries(p).forEach(([S,T])=>{T!=null&&(Array.isArray(T)?T.forEach(D=>f.searchParams.append(S,String(D))):f.searchParams.append(S,String(T)))});let m;if(l!==void 0)if(l instanceof FormData||l instanceof Blob)m=l;else if(typeof l=="object"&&l!==null)try{m=JSON.stringify(l),i.has("Content-Type")||i.set("Content-Type","application/json")}catch{m=String(l)}else m=String(l);let x,w=new Promise((S,T)=>{g&&(x=window.setTimeout(()=>{T(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 (${g}\u043C\u0441)`))},g))});try{let S=s(f.toString(),{method:d,headers:i,body:m,signal:h,credentials:r}),T=await Promise.race([S,w]),{data:D,error:M,fileMetadata:ce}=await qe(T,v);return{data:D,error:M,ok:T.ok,status:T.status,statusText:T.statusText,headers:T.headers,fileDownloadResult:ce}}catch(S){let T=S;return{error:T,ok:!1,status:0,statusText:T.message,headers:new Headers}}finally{x&&window.clearTimeout(x)}}}function me(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=ge(a.prepareHeaders,s.prepareHeaders),this.queryFunction=fe({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=de(this.name),r=new AbortController,o=new Set,a={status:"idle",requestParams:e,headers:{},error:void 0,data:void 0,fromCache:!1},i=N({requestParams:e},t?.context||{}),c=l=>{Object.assign(a,l),o.forEach(p=>{p({...a})})},d=new Promise(async(l,p)=>{try{let u=await pe(this.prepareHeaders,i),h=me(u,t?.cacheableHeaderKeys?t.cacheableHeaderKeys:this.cacheableHeaders),g=this.queryStorage.shouldCache(this.configCurrentEndpoint,t),[y,v]=this.queryStorage.createCacheKey(this.name,{...e,...h}),f;if(g&&(f=await this.queryStorage.getCachedResult(y)),f)c({fromCache:!0,status:"success",data:f.data,error:void 0,headers:f.headers,requestParams:e}),l({...f,fromCache:!0});else{c({fromCache:!1,status:"loading"});let m=this.configCurrentEndpoint.request(e,t?.context),x={...t,signal:r.signal},w=await this.queryFunction(m,x,u);if(w.ok){let{headers:S,...T}=w;if(g){let D=this.queryStorage.createCacheConfig(this.configCurrentEndpoint);await this.queryStorage.setCachedResult(y,{...T,headers:ue(S)},D,v??{},this.configCurrentEndpoint.tags??[],this.configCurrentEndpoint.invalidatesTags??[])}c({fromCache:!1,status:"success",data:w.data,error:void 0,headers:w.headers,requestParams:e}),this.endpointSubscribers.forEach(D=>{let M={status:"success",fetchCounts:this.fetchCounts,meta:this.meta,cacheableHeaders:this.cacheableHeaders,error:void 0};D(M)}),l({...w,fromCache:!1})}else c({fromCache:!1,status:"error",data:void 0,error:w.error,headers:w.headers,requestParams:e}),this.endpointSubscribers.forEach(S=>{let T={status:"error",fetchCounts:this.fetchCounts,meta:this.meta,cacheableHeaders:this.cacheableHeaders,error:w.error};S(T)}),p(w.error)}}catch(u){c({fromCache:!1,status:"error",data:void 0,error:u,headers:void 0,requestParams:e}),p(u)}});return{id:s,subscribe(l,p={}){let{autoUnsubscribe:u=!0}=p;o.add(l),l(a);let h=()=>o.delete(l);return u&&d.finally(()=>{h()}),h},wait:()=>d,waitWithCallbacks(l={}){let{idle:p,loading:u,success:h,error:g}=l;return this.subscribe(y=>{switch(y.status){case"idle":p?.(y);break;case"loading":u?.(y);break;case"success":h?.(y.data,y);break;case"error":g?.(y.error,y);break}},{autoUnsubscribe:!0}),d},abort:()=>{r&&!r.signal.aborted&&r.abort()},then:(l,p)=>d.then(l,p),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 b=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 C=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 b(e.join("_"))}static createApiKey(e,t){if(!t)return[new b(e,!0),t];let s=Object.entries(t).sort(([r],[o])=>r.localeCompare(o)).map(([r,o])=>`${r}=${o}`).join("&");return[new b(`${e}_${s}`,!0),t]}static hasAnyTag(e,t=[]){return!e.tags||!t.length?!1:t.some(s=>e.tags?.includes(s))}};var U=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 C.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(C.isExpired(t.metadata)){await this.storage.delete(e);return}let s={...t,metadata:C.updateMetadata(t.metadata)};return await this.storage.set(e,s),t.data}async setCachedResult(e,t,s,r,o,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");a?.length&&await this.invalidateCacheByTags(a);let i=C.createMetadata(s.ttl,o),c={data:t,metadata:i,params:r};await this.storage.set(e,c)}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&&C.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&&C.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 Se=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 U(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 le.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 E=!1,F=new Map;function be(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 A(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(!A(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)?A(n[r],e[r]):!1)}return!1}function Te(n,e=A){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 V=class{constructor(e,t,s=A,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=be(a)}else{let a=t.map(c=>c.getId()).join("_"),i=s.toString();o=be(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(F.has(a)){let l=F.get(a);return l.refCount++,l.api}let i,c,d=[];if(r){let l=Te(e,o.equals||A),p=this.createSimpleSelector(l,{...o,name:a,equals:o.equals||A});i=p.api,d=p.unsubscribeFunctions}else{c=e;let l=this.createCombinedSelector(c,t,{...o,name:a,equals:o.equals||A});i=l.api,d=l.unsubscribeFunctions}return this.localSelectorCache.set(a,{api:i,dependencies:c,unsubscribeFunctions:d}),F.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 V(t.name,s,t.equals||A,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=Te(p=>t(...p),s.equals||A),o=async()=>{let p=await Promise.all(e.map(u=>u.select()));return r(p)},a=new V(s.name,o,s.equals||A,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(p=>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:p}))},10)},l=e.map(p=>p.subscribe({notify:()=>{d()}}));return{api:{select:()=>o(),subscribe:p=>a.subscribe(p),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=F.get(t);s&&(s.refCount--,s.refCount<=0&&(s.unsubscribeFunctions.forEach(r=>r()),F.delete(t)))})}};var we=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 Ee=(r=>(r.IDLE="idle",r.LOADING="loading",r.READY="ready",r.ERROR="error",r))(Ee||{}),ee=(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))(ee||{});var L=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 Ne(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 ke(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 ve=n=>{let{storageName:e,storageType:t}=n,s=`${t}-${e}`,r=new L(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 Ne(o,i,c):await ke(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 xe=(n={})=>{let e=n.batchSize??10,t=n.batchDelay??10,s=new Map,r=new Map,o=u=>u.type==="set"||u.type==="update",a=u=>`${u.type}_${u.key?.toString()||"default"}`,i=u=>{let h=new Map;for(let g of u){let y=`${g.type}_${g.key?.toString()||"default"}`;h.set(y,g)}return Array.from(h.values())},c=u=>{let h=r.get(u);h&&(globalThis.clearTimeout(h),r.delete(u))},d=(u,h)=>{let g=globalThis.setTimeout(h,t);r.set(u,g)},l=async(u,h,g)=>{let y=s.get(u);if(!(!y||y.length===0)){s.delete(u),c(u);try{let v=y.map(m=>m.action),f=i(v);for(let m of f)try{let x=await g(m);y.filter(S=>S.action.type===m.type&&S.action.key?.toString()===m.key?.toString()).forEach(S=>S.resolve(x))}catch(x){y.filter(S=>S.action.type===m.type&&S.action.key?.toString()===m.key?.toString()).forEach(S=>S.reject(x))}}catch(v){y.forEach(f=>f.reject(v))}}},p=async(u,h,g)=>new Promise((y,v)=>{let f=a(u),m=s.get(f);m||(m=[],s.set(f,m)),m.push({action:u,resolve:y,reject:v,timestamp:Date.now()}),c(f),m.length>=e?setImmediate(()=>l(f,h,g)):d(f,()=>l(f,h,g))});return{name:"batching",setup:()=>{},cleanup:async()=>{r.forEach(u=>globalThis.clearTimeout(u)),r.clear(),s.clear()},reducer:u=>h=>async g=>o(g)?p(g,u,h):h(g)}};var Re=(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 H=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 R(n){return n instanceof b&&n.isUnparseable()?[n.toString()]:n.toString().replace(/\[/g,".").replace(/\]/g,"").split(".").filter(Boolean)}function P(n,e){return R(e).reduce((s,r)=>s===void 0?void 0:s[r],n)}function I(n,e,t){if(e==="")return t;let s=R(e);if(e instanceof b&&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 O=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 H({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={})=>xe(e),shallowCompare:(e={})=>Re(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 u of o){let h=u.split(".")[0];a.add(h)}let i=await Promise.all(Array.from(a).map(async u=>{let h={...t,key:u},g=await this.pluginExecutor?.executeBeforeSet(r[u],h)??r[u];return{key:u,value:g}})),c=await this.middlewareModule.dispatch({type:"update",value:i,metadata:{...t,batchUpdate:!0,changedPaths:Array.from(o)}}),d={};Array.isArray(c)?c.forEach(u=>{u&&typeof u=="object"&&"key"in u&&"value"in u&&(d[u.key]=u.value)}):c&&typeof c=="object"&&(d={...c});let l=Object.keys(d).filter(u=>!this.isEqual(s[u],d[u]));if(l.length===0){this.logger?.debug&&this.logger.debug("No actual changes after middleware processing");return}let p={};l.forEach(u=>{p[u]=d[u]}),this.logger?.debug&&this.logger.debug("Notifying subscribers about changes:",{keys:l}),this.notifySubscribers(n.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:l,value:p,changedPaths:Array.from(o)});for(let u of o)try{let h=u.split(".")[0];if(h in p){let g;if(u===h)g=p[h];else{let y=u.substring(h.length+1);g=P(p[h],y)}g!==void 0&&this.notifySubscribers(u,g)}}catch(h){this.logger?.error("Error notifying path subscribers",{path:u,error:h})}await this.emitEvent({type:"storage:update",payload:{state:p,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)){let s=await this.middlewareModule.dispatch({type:"delete",key:e,metadata:t});await this.pluginExecutor?.executeAfterDelete(e,t);let o=[e.toString()];this.notifySubscribers(e,void 0),this.notifySubscribers(n.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:void 0,result:s,changedPaths:o}),await this.emitEvent({type:"storage:update",payload:{key:e,value:void 0,result:s,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(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 te=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}},re=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)}},se=class n extends O{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=te.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 re(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 p=new n({...l,options:{dbName:e,dbVersion:a.getCurrentVersion()}},l.pluginExecutor,l.eventEmitter,s);c[d]=await p.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,p,u)=>(p!=="root"&&(l[p]=i[u]),l),{});r(d)},c.onerror=()=>o(c.error)}});if(e instanceof b&&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=R(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=P(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[p,u]of l)o.put(u,p)},d.onerror=()=>{i(d.error)}})}let s=await this.getObjectStore("readwrite");if(e instanceof b&&e.isUnparseable()){await this.putValueInStore(s,e.valueOf(),t);return}let r=R(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=I(d,r.slice(1).join("."),t),p=s.put(l,o);p.onerror=()=>i(p.error),p.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 b&&r.isUnparseable()){s.push({key:r.valueOf(),value:o});continue}let a=R(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=I(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 b&&e.isUnparseable())return new Promise((o,a)=>{let i=t.delete(e.valueOf());i.onerror=()=>a(i.error),i.onsuccess=()=>o(!0)});let s=R(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=P(c,s.slice(0,-1).join(".")),l=s[s.length-1];if(!d||!(l in d)){o(!1);return}if(Array.isArray(d)){let u=parseInt(l,10);isNaN(u)?delete d[l]:d.splice(u,1)}else delete d[l];let p=t.put(c,r);p.onerror=()=>a(p.error),p.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 ne=class extends O{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 b&&e.isUnparseable()?s[e.valueOf()]:P(s,e)}async doSet(e,t){let s=localStorage.getItem(this.name),r=s?JSON.parse(s):{};if(e instanceof b&&e.isUnparseable()){r[e.valueOf()]=t,localStorage.setItem(this.name,JSON.stringify(r));return}let o=I({...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 b&&e.isUnparseable()){let c=e.valueOf();return c in s?(delete s[c],localStorage.setItem(this.name,JSON.stringify(s)),!0):!1}let r=R(e),o=r.slice(0,-1).join("."),a=r[r.length-1],i=o?P(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 b&&r.isUnparseable()?s[r.valueOf()]=o:I(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 O{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 b&&e.isUnparseable()?t[e.valueOf()]:P(t,e)}async doSet(e,t){let s=this.storage.get(this.name)||{};if(e instanceof b&&e.isUnparseable()){s[e.valueOf()]=t,this.storage.set(this.name,s);return}let r=I({...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 b&&e.isUnparseable()){let i=e.valueOf();return i in t?(delete t[i],this.storage.set(this.name,t),!0):!1}let s=R(e),r=s.slice(0,-1).join("."),o=s[s.length-1],a=r?P(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 b&&r.isUnparseable()?s[r.valueOf()]=o:I(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 je,useRef as Pe,useState as Ae}from"react";var $=new Map;function Xr(n,e){let[t,s]=Ae(e?.initialValue),[r,o]=Ae(!!e?.withLoading),a=Pe(e?.initialValue),i=Pe(e?.equals||((l,p)=>l===p)),c=n.getId(),d=l=>{(a.current===void 0||!i.current(l,a.current))&&(a.current=l,s(l))};return je(()=>{$.has(c)||$.set(c,{lastValue:void 0,listeners:new Set,unsubscribe:null});let l=$.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(p=>{l.lastValue=p,l.listeners.forEach(u=>u(p)),e?.withLoading&&o(!1)}).catch(p=>{e?.withLoading&&o(!1)})),l.unsubscribe||(l.unsubscribe=n.subscribe({notify:p=>{l.lastValue=p,l.listeners.forEach(u=>{try{u(p)}catch{}})}})),()=>{let p=$.get(c);p&&(p.listeners.delete(d),p.listeners.size===0&&(p.unsubscribe&&p.unsubscribe(),$.delete(c)))}},[n,c]),e?.withLoading?{data:t,isLoading:r}:t}import{useEffect as Ue,useState as Ve}from"react";var ts=(n,e)=>{let[t,s]=Ve(void 0);return Ue(()=>{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{createContext as ze,useContext as W,useEffect as Ce,useRef as Le,useState as Ie}from"react";function _(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 ae=(n,e)=>{for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&(typeof e[t]=="object"&&e[t]!==null&&!Array.isArray(e[t])?((!n[t]||typeof n[t]!="object")&&(n[t]={}),ae(n[t],e[t])):n[t]=e[t])};import{jsx as Q}from"react/jsx-runtime";var G="useSynapseActions \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430 contextSynapse";function ms(n,e){let{loadingComponent:t=null,mergeFn:s=ae}=e||{},r=null,o=!1,a=(async()=>{try{r=await(n instanceof Promise?n:Promise.resolve(n)),o=!0}catch{}})(),i=ze(null),c=()=>{let g=W(i);if(!g)throw new Error(G);return g.storage},d=()=>{let g=W(i);if(!g)throw new Error(G);return g.selectors},l=()=>{let g=W(i);if(!g)throw new Error(G);if("actions"in g)return g.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.")},p=()=>{let g=W(i);if(!g)throw new Error(G);if("state$"in g)return g.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(g){function y({contextProps:f,...m}){let[x,w]=Ie(!1),[S,T]=Ie(o),D=Le(`synapse-${r?.storage.name||"initializing"}`);return Ce(()=>{o||a.then(()=>{T(!0)})},[]),Ce(()=>{if(!S)return;let M=!0;return(async()=>{try{r&&f&&Object.keys(f).length>0&&await r.storage.update(X=>{s(X,f)}),M&&w(!0)}catch{}})(),()=>{M=!1}},[f,S]),S?x?Q(i.Provider,{value:r,children:Q(g,{...m})}):t||Q("div",{children:"\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430..."}):t||Q("div",{children:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430..."})}let v=g.displayName||g.name||"Component";return y.displayName=`SynapseContext(${v})`,y}return{contextSynapse:u,useSynapseStorage:c,useSynapseSelectors:d,useSynapseActions:l,useSynapseState$:p,cleanupSynapse:async()=>(await a,r?.destroy()||Promise.resolve())}}import{Observable as He,Subject as De}from"rxjs";var oe=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 De;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 p=async u=>t?.worker?this.executeInWorker(t.worker,s,c,e.action):Promise.resolve(e.action(i));for(let u=this.middlewareFunctions.length-1;u>=0;u--){let h=this.middlewareFunctions[u],g=p;p=async y=>h(async f=>g(f))(y)}l=await p(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 De,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 He(d=>{let l=!1;o().then(u=>{if(!e.shouldTrigger||e.shouldTrigger(void 0,u)){let h={type:t,payload:u,meta:{...e.meta,isInitial:!0}};d.next(h),r=u,l=!0}}).catch(u=>{d.error(u)});let p=c.subscribe({next:u=>{l&&u.payload===r||d.next(u)},error:u=>d.error(u),complete:()=>d.complete()});return()=>{p.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 Oe(n,e){let t=new oe(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 Me(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=Me(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 As=(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 p=Date.now(),u=await c.getState();try{let h=await d(l),g=await c.getState(),v=Date.now()-p,f=`${l.type}`;if((r?console.groupCollapsed:console.group)(`%c ${f}`,`color: ${a.title}; font-weight: bold`),s.diff){let x=Me(u,g),w=Object.keys(x).length}return s.showFullState,h}catch(h){throw h}}};import{combineLatest as Ze,merge as et,Observable as tt,of as K,pipe as rt,Subject as st}from"rxjs";import{catchError as nt,filter as q,map as J,share as at,switchMap as ot,take as it}from"rxjs/operators";import{of as Fe}from"rxjs";import{concatAll as _e,delay as We,mergeMap as Ge,toArray as Qe}from"rxjs/operators";var Be=(n,e,t,s=0)=>{let r=_(e,t).map(o=>Fe(o).pipe(We(s),Ge(n)));return Fe(...r).pipe(_e(),Qe())};import{forkJoin as Je,timer as Ye}from"rxjs";import{mergeMap as Xe}from"rxjs/operators";var $e=(n,e,t,s=0)=>Je(_(e,t).map((r,o)=>Ye(o*s).pipe(Xe(()=>n(r)))));function Zs(n){let{actionType:e}=n;return e?t=>t.pipe(q(s=>s!==void 0&&s.type===e)):q(()=>!1)}function en(n){let e=n.map(t=>t.actionType).filter(Boolean);return e.length===0?q(()=>!1):t=>t.pipe(q(s=>s!==void 0&&e.includes(s.type)))}function tn(n){return e=>{let t=n.map(r=>r.actionType).filter(Boolean);if(t.length===0)return K([]);let s=t.map((r,o)=>e.pipe(q(a=>a.type===r),it(1),J(a=>({index:o,action:a}))));return Ze(s).pipe(J(r=>(r.sort((o,a)=>o.index-a.index),r.map(o=>o.action))))}}function rn(n,...e){return n.pipe(J(t=>e.map(s=>s(t))))}function sn(n,e){return n.pipe(J(t=>{let s={};for(let[r,o]of Object.entries(e))s[r]=o(t);return s}))}function nn({validator:n,apiCall:e}){return rt(ot(t=>{let s=()=>e(t,{chunkRequest:$e,chunkRequestConsistent:Be});if(!n)return s();let r=n(t),{conditions:o,skipAction:a}=r;return o.every(Boolean)?s():Array.isArray(a)?K(...a?.filter(Boolean).map(c=>typeof c=="function"?c():c)):K(typeof a=="function"?a():a)}))}var Y=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 tt(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(at())}effects=[];subscriptions=[];running=!1;action$=new st;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(nt(r=>K(null))).subscribe(r=>{if(r!=null&&typeof r=="function")try{r()}catch{}});this.subscriptions.push(s)}catch{}}};function an(n){return n}function on(n){return n}function cn(...n){return(e,t,s,r,o,a)=>{let i=n.map(c=>{try{return c(e,t,s,r,o,a)}catch{return K(null)}});return et(...i)}}function ct(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 lt(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 ie(n){try{ct(n)}catch(i){throw i}await lt(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),p=l||{};a=new Y(e,p,i,c,d),Array.isArray(n.effects)&&n.effects.forEach(u=>{a&&a.add(u)}),await a.start(),s.state$=a.state$,t.push(()=>{a&&a.stop()})}catch{}return s}function dt(n,e){return e==="*"?!0:e.includes("*")?new RegExp("^"+e.replace(/\*/g,".*")+"$").test(n):n===e}async function ut(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 pt=(n={})=>ie({createStorageFn:async()=>new B({name:n.name||"eventBus",initialState:{events:{},subscriptions:{}}}).initialize(),createDispatcherFn:e=>Oe({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 ut(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(dt(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||{})}})}))});export{Se as ApiClient,oe as Dispatcher,Y as EffectsModule,se as IndexedDBStorage,ne as LocalStorage,B as MemoryStorage,k as ResponseFormat,z as SelectorModule,ee as StorageEvents,we as StoragePluginModule,Ee as StorageStatus,le as apiLogger,ve as broadcastMiddleware,cn as combineEffects,Oe as createDispatcher,on as createEffect,an as createEffectBase,pt as createEventBus,ie as createSynapse,ms as createSynapseCtx,de as createUniqueId,ue as headersToObject,As as loggerDispatcherMiddleware,Zs as ofType,en as ofTypes,tn as ofTypesWaitAll,rn as selectorMap,sn as selectorObject,Xr as useSelector,ts as useStorageSubscribe,nn as validateMap};
1
+ var ue={debug:(n,...e)=>{process.env.NODE_ENV},log:(n,...e)=>{process.env.NODE_ENV},info:(n,...e)=>{},warn:(n,...e)=>{},error:(n,...e)=>{}};function pe(n){return`${n?`${n}|`:""}${Math.random().toString(36).substring(2,9)+Date.now().toString(36)}`}function ge(n){let e={};return n.forEach((t,s)=>{e[s.toLowerCase()]=t}),e}function j(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 he(n,e){let t=new Headers,s=e||j({},{});if(n)try{t=await Promise.resolve(n(t,s))}catch{}return t}function ye(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 U=(a=>(a.Json="json",a.Blob="blob",a.ArrayBuffer="arrayBuffer",a.Text="text",a.FormData="formData",a.Raw="raw",a))(U||{});function fe(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 Ne(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:Ne(n),contentType:e,contentDisposition:t,size:s?parseInt(s,10):void 0}:void 0}async function ke(n,e){let t=e,s=n.headers.get("content-type")||"";!t&&s&&(te(n.headers)?t="blob":t=fe(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 Se(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:p,responseFormat:u}=o,{signal:h,timeout:g=t,responseFormat:y}=a,v=y||u,f=new URL(c.startsWith("http")?c:`${e}${c}`);p&&Object.entries(p).forEach(([S,T])=>{T!=null&&(Array.isArray(T)?T.forEach(O=>f.searchParams.append(S,String(O))):f.searchParams.append(S,String(T)))});let m;if(l!==void 0)if(l instanceof FormData||l instanceof Blob)m=l;else if(typeof l=="object"&&l!==null)try{m=JSON.stringify(l),i.has("Content-Type")||i.set("Content-Type","application/json")}catch{m=String(l)}else m=String(l);let x,w=new Promise((S,T)=>{g&&(x=window.setTimeout(()=>{T(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 (${g}\u043C\u0441)`))},g))});try{let S=s(f.toString(),{method:d,headers:i,body:m,signal:h,credentials:r}),T=await Promise.race([S,w]),{data:O,error:F,fileMetadata:de}=await ke(T,v);return{data:O,error:F,ok:T.ok,status:T.status,statusText:T.statusText,headers:T.headers,fileDownloadResult:de}}catch(S){let T=S;return{error:T,ok:!1,status:0,statusText:T.message,headers:new Headers}}finally{x&&window.clearTimeout(x)}}}function be(n,e=[]){let t={};return!n||e.length===0||e.forEach(s=>{n.has(s)&&(t[s]=n.get(s)||"")}),t}var V=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=ye(a.prepareHeaders,s.prepareHeaders),this.queryFunction=Se({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=pe(this.name),r=new AbortController,o=new Set,a={status:"idle",requestParams:e,headers:{},error:void 0,data:void 0,fromCache:!1},i=j({requestParams:e},t?.context||{}),c=l=>{Object.assign(a,l),o.forEach(p=>{p({...a})})},d=new Promise(async(l,p)=>{try{let u=await he(this.prepareHeaders,i),h=be(u,t?.cacheableHeaderKeys?t.cacheableHeaderKeys:this.cacheableHeaders),g=this.queryStorage.shouldCache(this.configCurrentEndpoint,t),[y,v]=this.queryStorage.createCacheKey(this.name,{...e,...h}),f;if(g&&(f=await this.queryStorage.getCachedResult(y)),f)c({fromCache:!0,status:"success",data:f.data,error:void 0,headers:f.headers,requestParams:e}),l({...f,fromCache:!0});else{c({fromCache:!1,status:"loading"});let m=this.configCurrentEndpoint.request(e,t?.context),x={...t,signal:r.signal},w=await this.queryFunction(m,x,u);if(w.ok){let{headers:S,...T}=w;if(g){let O=this.queryStorage.createCacheConfig(this.configCurrentEndpoint);await this.queryStorage.setCachedResult(y,{...T,headers:ge(S)},O,v??{},this.configCurrentEndpoint.tags??[],this.configCurrentEndpoint.invalidatesTags??[])}c({fromCache:!1,status:"success",data:w.data,error:void 0,headers:w.headers,requestParams:e}),this.endpointSubscribers.forEach(O=>{let F={status:"success",fetchCounts:this.fetchCounts,meta:this.meta,cacheableHeaders:this.cacheableHeaders,error:void 0};O(F)}),l({...w,fromCache:!1})}else c({fromCache:!1,status:"error",data:void 0,error:w.error,headers:w.headers,requestParams:e}),this.endpointSubscribers.forEach(S=>{let T={status:"error",fetchCounts:this.fetchCounts,meta:this.meta,cacheableHeaders:this.cacheableHeaders,error:w.error};S(T)}),p(w.error)}}catch(u){c({fromCache:!1,status:"error",data:void 0,error:u,headers:void 0,requestParams:e}),p(u)}});return{id:s,subscribe(l,p={}){let{autoUnsubscribe:u=!0}=p;o.add(l),l(a);let h=()=>o.delete(l);return u&&d.finally(()=>{h()}),h},wait:()=>d,waitWithCallbacks(l={}){let{idle:p,loading:u,success:h,error:g}=l;return this.subscribe(y=>{switch(y.status){case"idle":p?.(y);break;case"loading":u?.(y);break;case"success":h?.(y.data,y);break;case"error":g?.(y.error,y);break}},{autoUnsubscribe:!0}),d},abort:()=>{r&&!r.signal.aborted&&r.abort()},then:(l,p)=>d.then(l,p),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 b=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 I=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 b(e.join("_"))}static createApiKey(e,t){if(!t)return[new b(e,!0),t];let s=Object.entries(t).sort(([r],[o])=>r.localeCompare(o)).map(([r,o])=>`${r}=${o}`).join("&");return[new b(`${e}_${s}`,!0),t]}static hasAnyTag(e,t=[]){return!e.tags||!t.length?!1:t.some(s=>e.tags?.includes(s))}};var z=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 I.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(I.isExpired(t.metadata)){await this.storage.delete(e);return}let s={...t,metadata:I.updateMetadata(t.metadata)};return await this.storage.set(e,s),t.data}async setCachedResult(e,t,s,r,o,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");a?.length&&await this.invalidateCacheByTags(a);let i=I.createMetadata(s.ttl,o),c={data:t,metadata:i,params:r};await this.storage.set(e,c)}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&&I.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&&I.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 Te=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 z(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 V(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 ue.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 E=!1,$=new Map;function we(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 C(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(!C(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)?C(n[r],e[r]):!1)}return!1}function Ee(n,e=C){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=C,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}},H=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=we(a)}else{let a=t.map(c=>c.getId()).join("_"),i=s.toString();o=we(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=Ee(e,o.equals||C),p=this.createSimpleSelector(l,{...o,name:a,equals:o.equals||C});i=p.api,d=p.unsubscribeFunctions}else{c=e;let l=this.createCombinedSelector(c,t,{...o,name:a,equals:o.equals||C});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||C,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=Ee(p=>t(...p),s.equals||C),o=async()=>{let p=await Promise.all(e.map(u=>u.select()));return r(p)},a=new L(s.name,o,s.equals||C,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(p=>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:p}))},10)},l=e.map(p=>p.subscribe({notify:()=>{d()}}));return{api:{select:()=>o(),subscribe:p=>a.subscribe(p),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 ve=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 je(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 Ue(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 Re=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 je(o,i,c):await Ue(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 Pe=(n={})=>{let e=n.batchSize??10,t=n.batchDelay??10,s=new Map,r=new Map,o=u=>u.type==="set"||u.type==="update",a=u=>`${u.type}_${u.key?.toString()||"default"}`,i=u=>{let h=new Map;for(let g of u){let y=`${g.type}_${g.key?.toString()||"default"}`;h.set(y,g)}return Array.from(h.values())},c=u=>{let h=r.get(u);h&&(globalThis.clearTimeout(h),r.delete(u))},d=(u,h)=>{let g=globalThis.setTimeout(h,t);r.set(u,g)},l=async(u,h,g)=>{let y=s.get(u);if(!(!y||y.length===0)){s.delete(u),c(u);try{let v=y.map(m=>m.action),f=i(v);for(let m of f)try{let x=await g(m);y.filter(S=>S.action.type===m.type&&S.action.key?.toString()===m.key?.toString()).forEach(S=>S.resolve(x))}catch(x){y.filter(S=>S.action.type===m.type&&S.action.key?.toString()===m.key?.toString()).forEach(S=>S.reject(x))}}catch(v){y.forEach(f=>f.reject(v))}}},p=async(u,h,g)=>new Promise((y,v)=>{let f=a(u),m=s.get(f);m||(m=[],s.set(f,m)),m.push({action:u,resolve:y,reject:v,timestamp:Date.now()}),c(f),m.length>=e?setImmediate(()=>l(f,h,g)):d(f,()=>l(f,h,g))});return{name:"batching",setup:()=>{},cleanup:async()=>{r.forEach(u=>globalThis.clearTimeout(u)),r.clear(),s.clear()},reducer:u=>h=>async g=>o(g)?p(g,u,h):h(g)}};var Ae=(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 P(n){return n instanceof b&&n.isUnparseable()?[n.toString()]:n.toString().replace(/\[/g,".").replace(/\]/g,"").split(".").filter(Boolean)}function A(n,e){return P(e).reduce((s,r)=>s===void 0?void 0:s[r],n)}function D(n,e,t){if(e==="")return t;let s=P(e);if(e instanceof b&&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={})=>Pe(e),shallowCompare:(e={})=>Ae(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 u of o){let h=u.split(".")[0];a.add(h)}let i=await Promise.all(Array.from(a).map(async u=>{let h={...t,key:u},g=await this.pluginExecutor?.executeBeforeSet(r[u],h)??r[u];return{key:u,value:g}})),c=await this.middlewareModule.dispatch({type:"update",value:i,metadata:{...t,batchUpdate:!0,changedPaths:Array.from(o)}}),d={};Array.isArray(c)?c.forEach(u=>{u&&typeof u=="object"&&"key"in u&&"value"in u&&(d[u.key]=u.value)}):c&&typeof c=="object"&&(d={...c});let l=Object.keys(d).filter(u=>!this.isEqual(s[u],d[u]));if(l.length===0){this.logger?.debug&&this.logger.debug("No actual changes after middleware processing");return}let p={};l.forEach(u=>{p[u]=d[u]}),this.logger?.debug&&this.logger.debug("Notifying subscribers about changes:",{keys:l}),this.notifySubscribers(n.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:l,value:p,changedPaths:Array.from(o)});for(let u of o)try{let h=u.split(".")[0];if(h in p){let g;if(u===h)g=p[h];else{let y=u.substring(h.length+1);g=A(p[h],y)}g!==void 0&&this.notifySubscribers(u,g)}}catch(h){this.logger?.error("Error notifying path subscribers",{path:u,error:h})}await this.emitEvent({type:"storage:update",payload:{state:p,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)){let s=await this.middlewareModule.dispatch({type:"delete",key:e,metadata:t});await this.pluginExecutor?.executeAfterDelete(e,t);let o=[e.toString()];this.notifySubscribers(e,void 0),this.notifySubscribers(n.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:void 0,result:s,changedPaths:o}),await this.emitEvent({type:"storage:update",payload:{key:e,value:void 0,result:s,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(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 p=new n({...l,options:{dbName:e,dbVersion:a.getCurrentVersion()}},l.pluginExecutor,l.eventEmitter,s);c[d]=await p.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,p,u)=>(p!=="root"&&(l[p]=i[u]),l),{});r(d)},c.onerror=()=>o(c.error)}});if(e instanceof b&&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=P(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=A(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[p,u]of l)o.put(u,p)},d.onerror=()=>{i(d.error)}})}let s=await this.getObjectStore("readwrite");if(e instanceof b&&e.isUnparseable()){await this.putValueInStore(s,e.valueOf(),t);return}let r=P(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=D(d,r.slice(1).join("."),t),p=s.put(l,o);p.onerror=()=>i(p.error),p.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 b&&r.isUnparseable()){s.push({key:r.valueOf(),value:o});continue}let a=P(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=D(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 b&&e.isUnparseable())return new Promise((o,a)=>{let i=t.delete(e.valueOf());i.onerror=()=>a(i.error),i.onsuccess=()=>o(!0)});let s=P(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=A(c,s.slice(0,-1).join(".")),l=s[s.length-1];if(!d||!(l in d)){o(!1);return}if(Array.isArray(d)){let u=parseInt(l,10);isNaN(u)?delete d[l]:d.splice(u,1)}else delete d[l];let p=t.put(c,r);p.onerror=()=>a(p.error),p.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 b&&e.isUnparseable()?s[e.valueOf()]:A(s,e)}async doSet(e,t){let s=localStorage.getItem(this.name),r=s?JSON.parse(s):{};if(e instanceof b&&e.isUnparseable()){r[e.valueOf()]=t,localStorage.setItem(this.name,JSON.stringify(r));return}let o=D({...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 b&&e.isUnparseable()){let c=e.valueOf();return c in s?(delete s[c],localStorage.setItem(this.name,JSON.stringify(s)),!0):!1}let r=P(e),o=r.slice(0,-1).join("."),a=r[r.length-1],i=o?A(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 b&&r.isUnparseable()?s[r.valueOf()]=o:D(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 K=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 b&&e.isUnparseable()?t[e.valueOf()]:A(t,e)}async doSet(e,t){let s=this.storage.get(this.name)||{};if(e instanceof b&&e.isUnparseable()){s[e.valueOf()]=t,this.storage.set(this.name,s);return}let r=D({...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 b&&e.isUnparseable()){let i=e.valueOf();return i in t?(delete t[i],this.storage.set(this.name,t),!0):!1}let s=P(e),r=s.slice(0,-1).join("."),o=s[s.length-1],a=r?A(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 b&&r.isUnparseable()?s[r.valueOf()]=o:D(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 Ve,useRef as Ce,useState as Ie}from"react";var q=new Map;function es(n,e){let[t,s]=Ie(e?.initialValue),[r,o]=Ie(!!e?.withLoading),a=Ce(e?.initialValue),i=Ce(e?.equals||((l,p)=>l===p)),c=n.getId(),d=l=>{(a.current===void 0||!i.current(l,a.current))&&(a.current=l,s(l))};return Ve(()=>{q.has(c)||q.set(c,{lastValue:void 0,listeners:new Set,unsubscribe:null});let l=q.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(p=>{l.lastValue=p,l.listeners.forEach(u=>u(p)),e?.withLoading&&o(!1)}).catch(p=>{e?.withLoading&&o(!1)})),l.unsubscribe||(l.unsubscribe=n.subscribe({notify:p=>{l.lastValue=p,l.listeners.forEach(u=>{try{u(p)}catch{}})}})),()=>{let p=q.get(c);p&&(p.listeners.delete(d),p.listeners.size===0&&(p.unsubscribe&&p.unsubscribe(),q.delete(c)))}},[n,c]),e?.withLoading?{data:t,isLoading:r}:t}import{useEffect as ze,useState as Le}from"react";var ss=(n,e)=>{let[t,s]=Le(void 0);return ze(()=>{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{createContext as He,useContext as Q,useEffect as De,useRef as _e,useState as Oe}from"react";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 ie=(n,e)=>{for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&(typeof e[t]=="object"&&e[t]!==null&&!Array.isArray(e[t])?((!n[t]||typeof n[t]!="object")&&(n[t]={}),ie(n[t],e[t])):n[t]=e[t])};var B=globalThis.console,R={log:(...n)=>B.log(...n),warn:(...n)=>B.warn(...n),error:(...n)=>B.error(...n),group:(...n)=>B.group(...n),groupEnd:()=>B.groupEnd(),groupCollapsed:(...n)=>B.groupCollapsed(...n)};import{jsx as Y}from"react/jsx-runtime";var J="useSynapseActions \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430 contextSynapse";function ws(n,e){let{loadingComponent:t=null,mergeFn:s=ie}=e||{},r=null,o=!1,a=(async()=>{try{r=await(n instanceof Promise?n:Promise.resolve(n)),o=!0}catch{}})(),i=He(null),c=()=>{let g=Q(i);if(!g)throw new Error(J);return g.storage},d=()=>{let g=Q(i);if(!g)throw new Error(J);return g.selectors},l=()=>{let g=Q(i);if(!g)throw new Error(J);if("actions"in g)return g.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.")},p=()=>{let g=Q(i);if(!g)throw new Error(J);if("state$"in g)return g.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(g){function y({contextProps:f,...m}){let[x,w]=Oe(!1),[S,T]=Oe(o),O=_e(`synapse-${r?.storage.name||"initializing"}`);return De(()=>{o||a.then(()=>{T(!0)})},[]),De(()=>{if(!S)return;let F=!0;return(async()=>{try{r&&f&&Object.keys(f).length>0&&await r.storage.update(ee=>{s(ee,f)}),F&&w(!0)}catch{}})(),()=>{F=!1}},[f,S]),S?x?Y(i.Provider,{value:r,children:Y(g,{...m})}):t||Y("div",{children:"\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430..."}):t||Y("div",{children:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430..."})}let v=g.displayName||g.name||"Component";return y.displayName=`SynapseContext(${v})`,y}return{contextSynapse:u,useSynapseStorage:c,useSynapseSelectors:d,useSynapseActions:l,useSynapseState$:p,cleanupSynapse:async()=>(await a,r?.destroy()||Promise.resolve())}}import{Observable as We,Subject as Me}from"rxjs";var ce=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 Me;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 p=async u=>t?.worker?this.executeInWorker(t.worker,s,c,e.action):Promise.resolve(e.action(i));for(let u=this.middlewareFunctions.length-1;u>=0;u--){let h=this.middlewareFunctions[u],g=p;p=async y=>h(async f=>g(f))(y)}l=await p(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 Me,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 We(d=>{let l=!1;o().then(u=>{if(!e.shouldTrigger||e.shouldTrigger(void 0,u)){let h={type:t,payload:u,meta:{...e.meta,isInitial:!0}};d.next(h),r=u,l=!0}}).catch(u=>{d.error(u)});let p=c.subscribe({next:u=>{l&&u.payload===r||d.next(u)},error:u=>d.error(u),complete:()=>d.complete()});return()=>{p.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 Fe(n,e){let t=new ce(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 Be(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=Be(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 Ms=(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 p=Date.now(),u=await c.getState();try{let h=await d(l),g=await c.getState(),v=Date.now()-p,f=`${l.type}`;if((r?R.groupCollapsed:R.group)(`%c ${f}`,`color: ${a.title}; font-weight: bold`),R.log(`%c ${i.action}:`,`color: ${a.action}; font-weight: bold`,l),s.diff){let x=Be(u,g),w=Object.keys(x).length;R.log(`%c ${i.diff} (${i.changesCount}: ${w}):`,`color: ${a.diff}; font-weight: bold`,x)}return s.showFullState&&(R.groupCollapsed(`%c ${i.showFullState}`,`color: ${a.fullState}; font-weight: bold`),R.log(`%c ${i.prevState}:`,`color: ${a.prevState}; font-weight: bold`,u),R.log(`%c ${i.nextState}:`,`color: ${a.nextState}; font-weight: bold`,g),R.groupEnd()),o&&R.log(`%c ${i.duration}: %c ${v}ms`,"font-weight: bold","color: #4CAF50"),R.groupEnd(),h}catch(h){throw R.error(`%c ${i.error}:`,`color: ${a.error}; font-weight: bold`,l.type,h),h}}};import{combineLatest as tt,merge as rt,Observable as st,of as N,pipe as nt,Subject as at}from"rxjs";import{catchError as ot,filter as k,map as X,share as it,switchMap as ct,take as lt}from"rxjs/operators";import{of as $e}from"rxjs";import{concatAll as Ge,delay as Qe,mergeMap as Je,toArray as Ye}from"rxjs/operators";var Ke=(n,e,t,s=0)=>{let r=G(e,t).map(o=>$e(o).pipe(Qe(s),Je(n)));return $e(...r).pipe(Ge(),Ye())};import{forkJoin as Xe,timer as Ze}from"rxjs";import{mergeMap as et}from"rxjs/operators";var qe=(n,e,t,s=0)=>Xe(G(e,t).map((r,o)=>Ze(o*s).pipe(et(()=>n(r)))));function nn(n){let{actionType:e}=n;return e?t=>t.pipe(k(s=>s!==void 0&&s.type===e)):k(()=>!1)}function an(n){let e=n.map(t=>t.actionType).filter(Boolean);return e.length===0?k(()=>!1):t=>t.pipe(k(s=>s!==void 0&&e.includes(s.type)))}function on(n){return e=>{let t=n.map(r=>r.actionType).filter(Boolean);if(t.length===0)return N([]);let s=t.map((r,o)=>e.pipe(k(a=>a.type===r),lt(1),X(a=>({index:o,action:a}))));return tt(s).pipe(X(r=>(r.sort((o,a)=>o.index-a.index),r.map(o=>o.action))))}}function cn(n,...e){return n.pipe(X(t=>e.map(s=>s(t))))}function ln(n,e){return n.pipe(X(t=>{let s={};for(let[r,o]of Object.entries(e))s[r]=o(t);return s}))}function dn({validator:n,apiCall:e}){return nt(ct(t=>{let s=()=>e(t,{chunkRequest:qe,chunkRequestConsistent:Ke});if(!n)return s();let r=n(t),{conditions:o,skipAction:a}=r;return o.every(Boolean)?s():Array.isArray(a)?N(...a?.filter(Boolean).map(c=>typeof c=="function"?c():c)):N(typeof a=="function"?a():a)}))}var Z=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 st(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(it())}effects=[];subscriptions=[];running=!1;action$=new at;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(ot(r=>N(null))).subscribe(r=>{if(r!=null&&typeof r=="function")try{r()}catch{}});this.subscriptions.push(s)}catch{}}};function un(n){return n}function pn(n){return n}function gn(...n){return(e,t,s,r,o,a)=>{let i=n.map(c=>{try{return c(e,t,s,r,o,a)}catch{return N(null)}});return rt(...i)}}function dt(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 ut(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 le(n){try{dt(n)}catch(i){throw i}await ut(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 H(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),p=l||{};a=new Z(e,p,i,c,d),Array.isArray(n.effects)&&n.effects.forEach(u=>{a&&a.add(u)}),await a.start(),s.state$=a.state$,t.push(()=>{a&&a.stop()})}catch{}return s}function pt(n,e){return e==="*"?!0:e.includes("*")?new RegExp("^"+e.replace(/\*/g,".*")+"$").test(n):n===e}async function gt(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 ht=(n={})=>le({createStorageFn:async()=>new K({name:n.name||"eventBus",initialState:{events:{},subscriptions:{}}}).initialize(),createDispatcherFn:e=>Fe({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 gt(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(pt(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||{})}})}))});export{Te as ApiClient,ce as Dispatcher,Z as EffectsModule,ae as IndexedDBStorage,oe as LocalStorage,K as MemoryStorage,U as ResponseFormat,H as SelectorModule,re as StorageEvents,ve as StoragePluginModule,xe as StorageStatus,ue as apiLogger,Re as broadcastMiddleware,gn as combineEffects,Fe as createDispatcher,pn as createEffect,un as createEffectBase,ht as createEventBus,le as createSynapse,ws as createSynapseCtx,pe as createUniqueId,ge as headersToObject,Ms as loggerDispatcherMiddleware,nn as ofType,an as ofTypes,on as ofTypesWaitAll,cn as selectorMap,ln as selectorObject,es as useSelector,ss as useStorageSubscribe,dn as validateMap};
package/dist/react.js CHANGED
@@ -1 +1 @@
1
- import{useEffect as $,useRef as R,useState as A}from"react";var f=new Map;function k(o,e){let[t,l]=A(e?.initialValue),[a,p]=A(!!e?.withLoading),c=R(e?.initialValue),i=R(e?.equals||((n,s)=>n===s)),S=o.getId(),u=n=>{(c.current===void 0||!i.current(n,c.current))&&(c.current=n,l(n))};return $(()=>{f.has(S)||f.set(S,{lastValue:void 0,listeners:new Set,unsubscribe:null});let n=f.get(S);return n.listeners.add(u),n.lastValue!==void 0?(u(n.lastValue),e?.withLoading&&p(!1)):(e?.withLoading&&p(!0),o.select().then(s=>{n.lastValue=s,n.listeners.forEach(T=>T(s)),e?.withLoading&&p(!1)}).catch(s=>{e?.withLoading&&p(!1)})),n.unsubscribe||(n.unsubscribe=o.subscribe({notify:s=>{n.lastValue=s,n.listeners.forEach(T=>{try{T(s)}catch{}})}})),()=>{let s=f.get(S);s&&(s.listeners.delete(u),s.listeners.size===0&&(s.unsubscribe&&s.unsubscribe(),f.delete(S)))}},[o,S]),e?.withLoading?{data:t,isLoading:a}:t}import{useEffect as z,useState as F}from"react";var U=(o,e)=>{let[t,l]=F(void 0);return z(()=>{let a=!0;(async()=>{try{let i=await o.getState(),S=e(i);a&&l(S)}catch{}})();let c;try{c=o.subscribe(e,i=>{a&&l(i)})}catch{c=()=>{}}return()=>{a=!1,c()}},[o,e]),t};import{createContext as N,useContext as y,useEffect as E,useRef as _,useState as w}from"react";var h=(o,e)=>{for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&(typeof e[t]=="object"&&e[t]!==null&&!Array.isArray(e[t])?((!o[t]||typeof o[t]!="object")&&(o[t]={}),h(o[t],e[t])):o[t]=e[t])};import{jsx as g}from"react/jsx-runtime";var m="useSynapseActions \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430 contextSynapse";function ae(o,e){let{loadingComponent:t=null,mergeFn:l=h}=e||{},a=null,p=!1,c=(async()=>{try{a=await(o instanceof Promise?o:Promise.resolve(o)),p=!0}catch{}})(),i=N(null),S=()=>{let r=y(i);if(!r)throw new Error(m);return r.storage},u=()=>{let r=y(i);if(!r)throw new Error(m);return r.selectors},n=()=>{let r=y(i);if(!r)throw new Error(m);if("actions"in r)return r.actions;throw new Error("useSynapseActions: actions \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0442\u0438\u043F\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u043D\u0430 \u0444\u0443\u043D\u043A\u0446\u0438\u044F createDispatcherFn \u043F\u0440\u0438 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0438 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430.")},s=()=>{let r=y(i);if(!r)throw new Error(m);if("state$"in r)return r.state$;throw new Error("useSynapseState$: state$ \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0442\u0438\u043F\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u043D\u044B \u0444\u0443\u043D\u043A\u0446\u0438\u0438 createDispatcherFn \u0438 createEffectConfig \u043F\u0440\u0438 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0438 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430.")};function T(r){function C({contextProps:d,...O}){let[W,L]=w(!1),[x,V]=w(p),D=_(`synapse-${a?.storage.name||"initializing"}`);return E(()=>{p||c.then(()=>{V(!0)})},[]),E(()=>{if(!x)return;let P=!0;return(async()=>{try{a&&d&&Object.keys(d).length>0&&await a.storage.update(b=>{l(b,d)}),P&&L(!0)}catch{}})(),()=>{P=!1}},[d,x]),x?W?g(i.Provider,{value:a,children:g(r,{...O})}):t||g("div",{children:"\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430..."}):t||g("div",{children:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430..."})}let v=r.displayName||r.name||"Component";return C.displayName=`SynapseContext(${v})`,C}return{contextSynapse:T,useSynapseStorage:S,useSynapseSelectors:u,useSynapseActions:n,useSynapseState$:s,cleanupSynapse:async()=>(await c,a?.destroy()||Promise.resolve())}}export{ae as createSynapseCtx,k as useSelector,U as useStorageSubscribe};
1
+ import{useEffect as $,useRef as R,useState as A}from"react";var f=new Map;function k(o,e){let[t,l]=A(e?.initialValue),[a,p]=A(!!e?.withLoading),c=R(e?.initialValue),i=R(e?.equals||((n,s)=>n===s)),S=o.getId(),u=n=>{(c.current===void 0||!i.current(n,c.current))&&(c.current=n,l(n))};return $(()=>{f.has(S)||f.set(S,{lastValue:void 0,listeners:new Set,unsubscribe:null});let n=f.get(S);return n.listeners.add(u),n.lastValue!==void 0?(u(n.lastValue),e?.withLoading&&p(!1)):(e?.withLoading&&p(!0),o.select().then(s=>{n.lastValue=s,n.listeners.forEach(T=>T(s)),e?.withLoading&&p(!1)}).catch(s=>{e?.withLoading&&p(!1)})),n.unsubscribe||(n.unsubscribe=o.subscribe({notify:s=>{n.lastValue=s,n.listeners.forEach(T=>{try{T(s)}catch{}})}})),()=>{let s=f.get(S);s&&(s.listeners.delete(u),s.listeners.size===0&&(s.unsubscribe&&s.unsubscribe(),f.delete(S)))}},[o,S]),e?.withLoading?{data:t,isLoading:a}:t}import{useEffect as z,useState as F}from"react";var U=(o,e)=>{let[t,l]=F(void 0);return z(()=>{let a=!0;(async()=>{try{let i=await o.getState(),S=e(i);a&&l(S)}catch{}})();let c;try{c=o.subscribe(e,i=>{a&&l(i)})}catch{c=()=>{}}return()=>{a=!1,c()}},[o,e]),t};import{createContext as N,useContext as y,useEffect as E,useRef as _,useState as w}from"react";var h=(o,e)=>{for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&(typeof e[t]=="object"&&e[t]!==null&&!Array.isArray(e[t])?((!o[t]||typeof o[t]!="object")&&(o[t]={}),h(o[t],e[t])):o[t]=e[t])};var Z=globalThis.console;import{jsx as m}from"react/jsx-runtime";var g="useSynapseActions \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430 contextSynapse";function pe(o,e){let{loadingComponent:t=null,mergeFn:l=h}=e||{},a=null,p=!1,c=(async()=>{try{a=await(o instanceof Promise?o:Promise.resolve(o)),p=!0}catch{}})(),i=N(null),S=()=>{let r=y(i);if(!r)throw new Error(g);return r.storage},u=()=>{let r=y(i);if(!r)throw new Error(g);return r.selectors},n=()=>{let r=y(i);if(!r)throw new Error(g);if("actions"in r)return r.actions;throw new Error("useSynapseActions: actions \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0442\u0438\u043F\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u043D\u0430 \u0444\u0443\u043D\u043A\u0446\u0438\u044F createDispatcherFn \u043F\u0440\u0438 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0438 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430.")},s=()=>{let r=y(i);if(!r)throw new Error(g);if("state$"in r)return r.state$;throw new Error("useSynapseState$: state$ \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0442\u0438\u043F\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u043D\u044B \u0444\u0443\u043D\u043A\u0446\u0438\u0438 createDispatcherFn \u0438 createEffectConfig \u043F\u0440\u0438 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0438 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430.")};function T(r){function C({contextProps:d,...O}){let[W,L]=w(!1),[x,V]=w(p),D=_(`synapse-${a?.storage.name||"initializing"}`);return E(()=>{p||c.then(()=>{V(!0)})},[]),E(()=>{if(!x)return;let b=!0;return(async()=>{try{a&&d&&Object.keys(d).length>0&&await a.storage.update(P=>{l(P,d)}),b&&L(!0)}catch{}})(),()=>{b=!1}},[d,x]),x?W?m(i.Provider,{value:a,children:m(r,{...O})}):t||m("div",{children:"\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430..."}):t||m("div",{children:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430..."})}let v=r.displayName||r.name||"Component";return C.displayName=`SynapseContext(${v})`,C}return{contextSynapse:T,useSynapseStorage:S,useSynapseSelectors:u,useSynapseActions:n,useSynapseState$:s,cleanupSynapse:async()=>(await c,a?.destroy()||Promise.resolve())}}export{pe as createSynapseCtx,k as useSelector,U as useStorageSubscribe};
package/dist/reactive.js CHANGED
@@ -1 +1 @@
1
- import{Observable as O,Subject as A}from"rxjs";var m=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 A;actions=this.actions$.asObservable();dispatch={};watchers={};storage;middlewareFunctions=[];middlewareAPI;use(...e){for(let t=0;t<e.length;t++)try{let r=e[t](this.middlewareAPI);this.middlewareFunctions.push(r)}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 r=`[${this.storage.name}]${e.type}`,n=null,i=null,a=async l=>{let o=[l];if(t?.memoize&&n&&i&&t.memoize(o,n,i))return i;let c={type:r,meta:e.meta},u;if(this.middlewareFunctions.length>0){let d=async p=>t?.worker?this.executeInWorker(t.worker,r,o,e.action):Promise.resolve(e.action(l));for(let p=this.middlewareFunctions.length-1;p>=0;p--){let T=this.middlewareFunctions[p],b=d;d=async x=>T(async R=>b(R))(x)}u=await d(c)}else t?.worker?u=await this.executeInWorker(t.worker,r,o,e.action):u=await e.action(l);return c.payload=u,n=[...o],i=u,this.actions$.next(c),u};return a.e="dispatch",Object.defineProperty(a,"actionType",{value:r,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}`,r=new A,n,i=async()=>{let o=await this.storage.getState();return e.selector(o)},a=this.storage.subscribe(e.selector,o=>{if(!e.shouldTrigger||e.shouldTrigger(n,o)){let c={type:t,payload:o,meta:e.meta};this.actions$.next(c),r.next(c),n=o}}),l=()=>{let o=r.asObservable();return e.notifyAfterSubscribe?new O(c=>{let u=!1;i().then(p=>{if(!e.shouldTrigger||e.shouldTrigger(void 0,p)){let T={type:t,payload:p,meta:{...e.meta,isInitial:!0}};c.next(T),n=p,u=!0}}).catch(p=>{c.error(p)});let d=o.subscribe({next:p=>{u&&p.payload===n||c.next(p)},error:p=>c.error(p),complete:()=>c.complete()});return()=>{d.unsubscribe()}}):o};return l.e="watchers",Object.defineProperty(l,"actionType",{value:t,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(l,"meta",{value:e.meta,writable:!1,enumerable:!0}),Object.defineProperty(l,"unsubscribe",{value:a,writable:!1,enumerable:!0}),l}async executeInWorker(e,t,r,n){return new Promise((i,a)=>{let l=`${t}_${Date.now()}_${Math.random()}`,o=c=>{c.data.requestId===l&&(e.removeEventListener("message",o),c.data.error?a(new Error(c.data.error)):i(c.data.result))};e.addEventListener("message",o),e.postMessage({type:t,args:r,requestId:l}),setTimeout(()=>{e.removeEventListener("message",o),a(new Error(`Worker execution timeout for action: ${t}`))},3e4)})}};function H(s,e){let t=new m(s),r=e(s.storage,{createAction:(n,i)=>t.createAction(n,i),createWatcher:n=>t.createWatcher(n)});for(let[n,i]of Object.entries(r))if(typeof i=="function"){let a=i.e;t[a][n]=i}return t}function v(s,e){let t={};return[...new Set([...Object.keys(s),...Object.keys(e)])].forEach(n=>{if(n in s&&n in e)if(typeof s[n]=="object"&&s[n]!==null&&typeof e[n]=="object"&&e[n]!==null&&!Array.isArray(s[n])&&!Array.isArray(e[n])){let i=v(s[n],e[n]);Object.keys(i).length>0&&(t[n]=i)}else JSON.stringify(s[n])!==JSON.stringify(e[n])&&(t[n]={PREV:s[n],NEXT:e[n]});else n in s?t[n]={PREV:s[n],NEXT:void 0}:t[n]={PREV:void 0,NEXT:e[n]}}),t}var Y=(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"}},r={...t,...s,translations:{...e,...s.translations||{}},colors:{...t.colors,...s.colors||{}}},{collapsed:n,duration:i,colors:a,translations:l}=r;return o=>c=>async u=>{let d=Date.now(),p=await o.getState();try{let T=await c(u),b=await o.getState(),P=Date.now()-d,R=`${u.type}`;if((n?console.groupCollapsed:console.group)(`%c ${R}`,`color: ${a.title}; font-weight: bold`),r.diff){let F=v(p,b),X=Object.keys(F).length}return r.showFullState,T}catch(T){throw T}}};import{combineLatest as q,merge as B,Observable as K,of as f,pipe as L,Subject as V}from"rxjs";import{catchError as N,filter as h,map as g,share as U,switchMap as z,take as _}from"rxjs/operators";import{of as S}from"rxjs";import{concatAll as $,delay as C,mergeMap as W,toArray as k}from"rxjs/operators";function y(s,e=1){if(e<=0)throw new Error("Size must be greater than 0");if(!s||!s.length)return[];let t=[],r=s.length,n=0;for(;n<r;)t.push(s.slice(n,n+e)),n+=e;return t}var w=(s,e,t,r=0)=>{let n=y(e,t).map(i=>S(i).pipe(C(r),W(s)));return S(...n).pipe($(),k())};import{forkJoin as M,timer as j}from"rxjs";import{mergeMap as I}from"rxjs/operators";var E=(s,e,t,r=0)=>M(y(e,t).map((n,i)=>j(i*r).pipe(I(()=>s(n)))));function $e(s){let{actionType:e}=s;return e?t=>t.pipe(h(r=>r!==void 0&&r.type===e)):h(()=>!1)}function Ce(s){let e=s.map(t=>t.actionType).filter(Boolean);return e.length===0?h(()=>!1):t=>t.pipe(h(r=>r!==void 0&&e.includes(r.type)))}function We(s){return e=>{let t=s.map(n=>n.actionType).filter(Boolean);if(t.length===0)return f([]);let r=t.map((n,i)=>e.pipe(h(a=>a.type===n),_(1),g(a=>({index:i,action:a}))));return q(r).pipe(g(n=>(n.sort((i,a)=>i.index-a.index),n.map(i=>i.action))))}}function ke(s,...e){return s.pipe(g(t=>e.map(r=>r(t))))}function Me(s,e){return s.pipe(g(t=>{let r={};for(let[n,i]of Object.entries(e))r[n]=i(t);return r}))}function je({validator:s,apiCall:e}){return L(z(t=>{let r=()=>e(t,{chunkRequest:E,chunkRequestConsistent:w});if(!s)return r();let n=s(t),{conditions:i,skipAction:a}=n;return i.every(Boolean)?r():Array.isArray(a)?f(...a?.filter(Boolean).map(o=>typeof o=="function"?o():o)):f(typeof a=="function"?a():a)}))}var D=class{constructor(e,t={},r,n={},i={}){this.storage=e;this.externalStates=t;this.dispatchers=r;this.services=n;this.config=i;this.subscribeToDispatchers(),this.state$=new K(a=>{this.storage.getState().then(o=>a.next(o));let l=this.storage.subscribeToAll(()=>{this.storage.getState().then(o=>a.next(o))});return()=>l()}).pipe(U())}effects=[];subscriptions=[];running=!1;action$=new V;state$;subscribeToDispatchers(){for(let[e,t]of Object.entries(this.dispatchers)){let r=t.actions.subscribe(n=>{this.action$.next(n)});this.subscriptions.push(r)}}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 r=e(this.action$.asObservable(),this.state$,this.externalStates,this.dispatchers,this.services,this.config).pipe(N(n=>f(null))).subscribe(n=>{if(n!=null&&typeof n=="function")try{n()}catch{}});this.subscriptions.push(r)}catch{}}};function Ie(s){return s}function qe(s){return s}function Be(...s){return(e,t,r,n,i,a)=>{let l=s.map(o=>{try{return o(e,t,r,n,i,a)}catch{return f(null)}});return B(...l)}}export{m as Dispatcher,D as EffectsModule,Be as combineEffects,H as createDispatcher,qe as createEffect,Ie as createEffectBase,Y as loggerDispatcherMiddleware,$e as ofType,Ce as ofTypes,We as ofTypesWaitAll,ke as selectorMap,Me as selectorObject,je as validateMap};
1
+ import{Observable as W,Subject as E}from"rxjs";var A=class{constructor(e){this.options=e;this.storage=e.storage,this.middlewareAPI={getState:()=>this.storage.getState(),dispatch:async t=>(this.actions$.next(t),t.payload),storage:this.storage,actions$:this.actions,actions:this.dispatch,watchers:this.watchers,findActionByType:t=>this.findActionByType(t),findWatcherByType:t=>this.findWatcherByType(t)},e.middlewares&&e.middlewares.length>0&&this.use(...e.middlewares)}actions$=new E;actions=this.actions$.asObservable();dispatch={};watchers={};storage;middlewareFunctions=[];middlewareAPI;use(...e){for(let t=0;t<e.length;t++)try{let s=e[t](this.middlewareAPI);this.middlewareFunctions.push(s)}catch{}return this}getActions(){return this.dispatch}getTypedDispatch(){return this.dispatch}getTypedWatchers(){return this.watchers}findActionByType(e){return Object.values(this.dispatch).find(t=>t.actionType.split(`[${this.storage.name}]`)[1]===e)}findWatcherByType(e){return Object.values(this.watchers).find(t=>t.actionType===e)}createAction(e,t){let s=`[${this.storage.name}]${e.type}`,r=null,i=null,a=async c=>{let o=[c];if(t?.memoize&&r&&i&&t.memoize(o,r,i))return i;let l={type:s,meta:e.meta},u;if(this.middlewareFunctions.length>0){let f=async p=>t?.worker?this.executeInWorker(t.worker,s,o,e.action):Promise.resolve(e.action(c));for(let p=this.middlewareFunctions.length-1;p>=0;p--){let T=this.middlewareFunctions[p],b=f;f=async v=>T(async x=>b(x))(v)}u=await f(l)}else t?.worker?u=await this.executeInWorker(t.worker,s,o,e.action):u=await e.action(c);return l.payload=u,r=[...o],i=u,this.actions$.next(l),u};return a.e="dispatch",Object.defineProperty(a,"actionType",{value:s,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(a,"meta",{value:e.meta,writable:!1,enumerable:!0}),a}createWatcher(e){let t=`[${this.storage.name}]${e.type}`,s=new E,r,i=async()=>{let o=await this.storage.getState();return e.selector(o)},a=this.storage.subscribe(e.selector,o=>{if(!e.shouldTrigger||e.shouldTrigger(r,o)){let l={type:t,payload:o,meta:e.meta};this.actions$.next(l),s.next(l),r=o}}),c=()=>{let o=s.asObservable();return e.notifyAfterSubscribe?new W(l=>{let u=!1;i().then(p=>{if(!e.shouldTrigger||e.shouldTrigger(void 0,p)){let T={type:t,payload:p,meta:{...e.meta,isInitial:!0}};l.next(T),r=p,u=!0}}).catch(p=>{l.error(p)});let f=o.subscribe({next:p=>{u&&p.payload===r||l.next(p)},error:p=>l.error(p),complete:()=>l.complete()});return()=>{f.unsubscribe()}}):o};return c.e="watchers",Object.defineProperty(c,"actionType",{value:t,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(c,"meta",{value:e.meta,writable:!1,enumerable:!0}),Object.defineProperty(c,"unsubscribe",{value:a,writable:!1,enumerable:!0}),c}async executeInWorker(e,t,s,r){return new Promise((i,a)=>{let c=`${t}_${Date.now()}_${Math.random()}`,o=l=>{l.data.requestId===c&&(e.removeEventListener("message",o),l.data.error?a(new Error(l.data.error)):i(l.data.result))};e.addEventListener("message",o),e.postMessage({type:t,args:s,requestId:c}),setTimeout(()=>{e.removeEventListener("message",o),a(new Error(`Worker execution timeout for action: ${t}`))},3e4)})}};function Y(n,e){let t=new A(n),s=e(n.storage,{createAction:(r,i)=>t.createAction(r,i),createWatcher:r=>t.createWatcher(r)});for(let[r,i]of Object.entries(s))if(typeof i=="function"){let a=i.e;t[a][r]=i}return t}function R(n,e=1){if(e<=0)throw new Error("Size must be greater than 0");if(!n||!n.length)return[];let t=[],s=n.length,r=0;for(;r<s;)t.push(n.slice(r,r+e)),r+=e;return t}var h=globalThis.console,d={log:(...n)=>h.log(...n),warn:(...n)=>h.warn(...n),error:(...n)=>h.error(...n),group:(...n)=>h.group(...n),groupEnd:()=>h.groupEnd(),groupCollapsed:(...n)=>h.groupCollapsed(...n)};function D(n,e){let t={};return[...new Set([...Object.keys(n),...Object.keys(e)])].forEach(r=>{if(r in n&&r in e)if(typeof n[r]=="object"&&n[r]!==null&&typeof e[r]=="object"&&e[r]!==null&&!Array.isArray(n[r])&&!Array.isArray(e[r])){let i=D(n[r],e[r]);Object.keys(i).length>0&&(t[r]=i)}else JSON.stringify(n[r])!==JSON.stringify(e[r])&&(t[r]={PREV:n[r],NEXT:e[r]});else r in n?t[r]={PREV:n[r],NEXT:void 0}:t[r]={PREV:void 0,NEXT:e[r]}}),t}var pe=(n={})=>{let e={action:"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435",prevState:"\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435",nextState:"\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435",duration:"\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C",error:"\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438",diff:"\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F",changesCount:"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439",showFullState:"\u041F\u043E\u043B\u043D\u043E\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435"},t={collapsed:!1,duration:!0,diff:!1,showFullState:!0,translations:e,colors:{title:"#3498db",prevState:"#9E9E9E",fullState:"#008a15",action:"#03A9F4",nextState:"#4CAF50",error:"#F20404",diff:"#9C27B0"}},s={...t,...n,translations:{...e,...n.translations||{}},colors:{...t.colors,...n.colors||{}}},{collapsed:r,duration:i,colors:a,translations:c}=s;return o=>l=>async u=>{let f=Date.now(),p=await o.getState();try{let T=await l(u),b=await o.getState(),S=Date.now()-f,x=`${u.type}`;if((r?d.groupCollapsed:d.group)(`%c ${x}`,`color: ${a.title}; font-weight: bold`),d.log(`%c ${c.action}:`,`color: ${a.action}; font-weight: bold`,u),s.diff){let w=D(p,b),$=Object.keys(w).length;d.log(`%c ${c.diff} (${c.changesCount}: ${$}):`,`color: ${a.diff}; font-weight: bold`,w)}return s.showFullState&&(d.groupCollapsed(`%c ${c.showFullState}`,`color: ${a.fullState}; font-weight: bold`),d.log(`%c ${c.prevState}:`,`color: ${a.prevState}; font-weight: bold`,p),d.log(`%c ${c.nextState}:`,`color: ${a.nextState}; font-weight: bold`,b),d.groupEnd()),i&&d.log(`%c ${c.duration}: %c ${S}ms`,"font-weight: bold","color: #4CAF50"),d.groupEnd(),T}catch(T){throw d.error(`%c ${c.error}:`,`color: ${a.error}; font-weight: bold`,u.type,T),T}}};import{combineLatest as L,merge as V,Observable as N,of as y,pipe as U,Subject as z}from"rxjs";import{catchError as _,filter as g,map as m,share as J,switchMap as X,take as G}from"rxjs/operators";import{of as P}from"rxjs";import{concatAll as k,delay as M,mergeMap as j,toArray as I}from"rxjs/operators";var F=(n,e,t,s=0)=>{let r=R(e,t).map(i=>P(i).pipe(M(s),j(n)));return P(...r).pipe(k(),I())};import{forkJoin as q,timer as B}from"rxjs";import{mergeMap as K}from"rxjs/operators";var O=(n,e,t,s=0)=>q(R(e,t).map((r,i)=>B(i*s).pipe(K(()=>n(r)))));function je(n){let{actionType:e}=n;return e?t=>t.pipe(g(s=>s!==void 0&&s.type===e)):g(()=>!1)}function Ie(n){let e=n.map(t=>t.actionType).filter(Boolean);return e.length===0?g(()=>!1):t=>t.pipe(g(s=>s!==void 0&&e.includes(s.type)))}function qe(n){return e=>{let t=n.map(r=>r.actionType).filter(Boolean);if(t.length===0)return y([]);let s=t.map((r,i)=>e.pipe(g(a=>a.type===r),G(1),m(a=>({index:i,action:a}))));return L(s).pipe(m(r=>(r.sort((i,a)=>i.index-a.index),r.map(i=>i.action))))}}function Be(n,...e){return n.pipe(m(t=>e.map(s=>s(t))))}function Ke(n,e){return n.pipe(m(t=>{let s={};for(let[r,i]of Object.entries(e))s[r]=i(t);return s}))}function Le({validator:n,apiCall:e}){return U(X(t=>{let s=()=>e(t,{chunkRequest:O,chunkRequestConsistent:F});if(!n)return s();let r=n(t),{conditions:i,skipAction:a}=r;return i.every(Boolean)?s():Array.isArray(a)?y(...a?.filter(Boolean).map(o=>typeof o=="function"?o():o)):y(typeof a=="function"?a():a)}))}var C=class{constructor(e,t={},s,r={},i={}){this.storage=e;this.externalStates=t;this.dispatchers=s;this.services=r;this.config=i;this.subscribeToDispatchers(),this.state$=new N(a=>{this.storage.getState().then(o=>a.next(o));let c=this.storage.subscribeToAll(()=>{this.storage.getState().then(o=>a.next(o))});return()=>c()}).pipe(J())}effects=[];subscriptions=[];running=!1;action$=new z;state$;subscribeToDispatchers(){for(let[e,t]of Object.entries(this.dispatchers)){let s=t.actions.subscribe(r=>{this.action$.next(r)});this.subscriptions.push(s)}}add(e){return this.effects.push(e),this.running&&this.subscribeToEffect(e),this}addEffects(e){return e.forEach(t=>this.add(t)),this}async start(){return this.running?this:(await this.storage.waitForReady(),this.effects.forEach(e=>this.subscribeToEffect(e)),this.running=!0,this)}stop(){return this.subscriptions.forEach(e=>e.unsubscribe()),this.subscriptions=[],this.running=!1,this}subscribeToEffect(e){try{let s=e(this.action$.asObservable(),this.state$,this.externalStates,this.dispatchers,this.services,this.config).pipe(_(r=>y(null))).subscribe(r=>{if(r!=null&&typeof r=="function")try{r()}catch{}});this.subscriptions.push(s)}catch{}}};function Ve(n){return n}function Ne(n){return n}function Ue(...n){return(e,t,s,r,i,a)=>{let c=n.map(o=>{try{return o(e,t,s,r,i,a)}catch{return y(null)}});return V(...c)}}export{A as Dispatcher,C as EffectsModule,Ue as combineEffects,Y as createDispatcher,Ne as createEffect,Ve as createEffectBase,pe as loggerDispatcherMiddleware,je as ofType,Ie as ofTypes,qe as ofTypesWaitAll,Be as selectorMap,Ke as selectorObject,Le as validateMap};
package/dist/utils.js CHANGED
@@ -1 +1 @@
1
- var y=!1,A=new Map;function N(a){let e=0;if(a.length===0)return e.toString(36);for(let t=0;t<a.length;t++){let s=a.charCodeAt(t);e=(e<<5)-e+s,e=e&e}return Math.abs(e).toString(36).substring(0,6)}function T(a,e){if(a===e)return!0;if(a==null||e==null)return!1;if(typeof a!="object"&&typeof a!="function"&&typeof e!="object"&&typeof e!="function")return a===e;if(typeof a!=typeof e)return!1;if(a instanceof Date&&e instanceof Date)return a.getTime()===e.getTime();if(Array.isArray(a)&&Array.isArray(e)){if(a.length!==e.length)return!1;for(let t=0;t<a.length;t++)if(!T(a[t],e[t]))return!1;return!0}if(typeof a=="object"&&typeof e=="object"){let t=Object.keys(a),s=Object.keys(e);return t.length!==s.length?!1:t.every(r=>Object.prototype.hasOwnProperty.call(e,r)?T(a[r],e[r]):!1)}return!1}function K(a,e=T){let t,s,r=!1;return function(o){if(!r||t!==o){let i=a(o);(!r||!e(i,s))&&(s=i),t=o,r=!0}return s}}var I=class{constructor(e,t,s=T,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}},C=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",n="";if(e){let o=t.toString();n=N(o)}else{let o=t.map(c=>c.getId()).join("_"),i=s.toString();n=N(o+i)}return`${this.storageName}_${r}_${n}`}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(n){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:n})}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),n=r?t||{}:s||{},o=n.name||this.generateName(r,e,r?void 0:t);if(this.localSelectorCache.has(o))return this.localSelectorCache.get(o).api;if(A.has(o)){let u=A.get(o);return u.refCount++,u.api}let i,c,d=[];if(r){let u=K(e,n.equals||T),p=this.createSimpleSelector(u,{...n,name:o,equals:n.equals||T});i=p.api,d=p.unsubscribeFunctions}else{c=e;let u=this.createCombinedSelector(c,t,{...n,name:o,equals:n.equals||T});i=u.api,d=u.unsubscribeFunctions}return this.localSelectorCache.set(o,{api:i,dependencies:c,unsubscribeFunctions:d}),A.set(o,{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 I(t.name,s,t.equals||T,this.logger),n=r.getId();this.subscriptions.set(n,r);let i=[this.source.subscribeToAll(async c=>{c?.type==="storage:update"&&(this.pendingUpdates.add(n),this.processPendingUpdates())})];return{api:{select:()=>s(),subscribe:c=>r.subscribe(c),getId:()=>n},unsubscribeFunctions:i}}createCombinedSelector(e,t,s){let r=K(p=>t(...p),s.equals||T),n=async()=>{let p=await Promise.all(e.map(l=>l.select()));return r(p)},o=new I(s.name,n,s.equals||T,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(p=>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:p}))},10)},u=e.map(p=>p.subscribe({notify:()=>{d()}}));return{api:{select:()=>n(),subscribe:p=>o.subscribe(p),getId:()=>i},unsubscribeFunctions:u}}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=A.get(t);s&&(s.refCount--,s.refCount<=0&&(s.unsubscribeFunctions.forEach(r=>r()),A.delete(t)))})}};var b=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 V=(a={})=>{let e=a.batchSize??10,t=a.batchDelay??10,s=new Map,r=new Map,n=l=>l.type==="set"||l.type==="update",o=l=>`${l.type}_${l.key?.toString()||"default"}`,i=l=>{let g=new Map;for(let h of l){let S=`${h.type}_${h.key?.toString()||"default"}`;g.set(S,h)}return Array.from(g.values())},c=l=>{let g=r.get(l);g&&(globalThis.clearTimeout(g),r.delete(l))},d=(l,g)=>{let h=globalThis.setTimeout(g,t);r.set(l,h)},u=async(l,g,h)=>{let S=s.get(l);if(!(!S||S.length===0)){s.delete(l),c(l);try{let E=S.map(f=>f.action),m=i(E);for(let f of m)try{let B=await h(f);S.filter(w=>w.action.type===f.type&&w.action.key?.toString()===f.key?.toString()).forEach(w=>w.resolve(B))}catch(B){S.filter(w=>w.action.type===f.type&&w.action.key?.toString()===f.key?.toString()).forEach(w=>w.reject(B))}}catch(E){S.forEach(m=>m.reject(E))}}},p=async(l,g,h)=>new Promise((S,E)=>{let m=o(l),f=s.get(m);f||(f=[],s.set(m,f)),f.push({action:l,resolve:S,reject:E,timestamp:Date.now()}),c(m),f.length>=e?setImmediate(()=>u(m,g,h)):d(m,()=>u(m,g,h))});return{name:"batching",setup:()=>{},cleanup:async()=>{r.forEach(l=>globalThis.clearTimeout(l)),r.clear(),s.clear()},reducer:l=>g=>async h=>n(h)?p(h,l,g):g(h)}};var j=(a={})=>{let{comparator:e=(r,n)=>{if(r===n)return!0;if(typeof r!="object"||typeof n!="object"||r===null||n===null)return r===n;let o=Object.keys(r),i=Object.keys(n);return o.length!==i.length?!1:o.every(c=>Object.prototype.hasOwnProperty.call(n,c)&&r[c]===n[c])},segments:t=[]}=a,s=new Map;return{name:"shallow-compare",setup:r=>{},reducer:r=>n=>async o=>{if(o.type!=="set"||t.length&&!t.includes(o.metadata?.segment??"default"))return n(o);let i=o.key,c=s.get(i),d=o.value;if(c!==void 0&&e(c,d))return{...c,t:{valueNotChanged:!0,originalValue:c}};let u=await n(o);return s.set(i,d),u}}};var M=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 n=await this.api.storage.doGet("");return Object.keys(n||{}).length>0?n:r.value?(await this.api.storage.doSet("",r.value),this.api.storage.doGet("")):n}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 n={...r,metadata:{...r.metadata,processed:!0,timestamp:r.metadata?.timestamp||Date.now()}};return t.reducer(this.api)(s)(n)}}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 x(a){return a instanceof b&&a.isUnparseable()?[a.toString()]:a.toString().replace(/\[/g,".").replace(/\]/g,"").split(".").filter(Boolean)}function v(a,e){return x(e).reduce((s,r)=>s===void 0?void 0:s[r],a)}function P(a,e,t){if(e==="")return t;let s=x(e);if(e instanceof b&&e.isUnparseable())return a[e.toString()]=t,a;let r=s.pop(),n=s.reduce((o,i)=>{let c=s[s.indexOf(i)+1],d=!Number.isNaN(Number(c));return i in o||(o[i]=d?[]:{}),o[i]},a);return n[r]=t,a}var R=class a{constructor(e,t,s,r){this.config=e;this.pluginExecutor=t;this.eventEmitter=s;this.logger=r;this.name=e.name,this.middlewareModule=new M({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(n){this.logger?.error("Error in status change callback",{error:n})}})}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={})=>V(e),shallowCompare:(e={})=>j(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,n=await this.middlewareModule.dispatch({type:"set",key:e,value:r,metadata:s}),o=n?.t?.valueNotChanged===!0,i;if(o&&n?.t?.originalValue!==void 0?i=n.t.originalValue:i=await this.pluginExecutor?.executeAfterSet(e,n,s)??n,!o){let d=[e.toString()];this.notifySubscribers(e,i),this.notifySubscribers(a.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 n=this.findChangedPaths(s,r);if(n.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(n)});let o=new Set;for(let l of n){let g=l.split(".")[0];o.add(g)}let i=await Promise.all(Array.from(o).map(async l=>{let g={...t,key:l},h=await this.pluginExecutor?.executeBeforeSet(r[l],g)??r[l];return{key:l,value:h}})),c=await this.middlewareModule.dispatch({type:"update",value:i,metadata:{...t,batchUpdate:!0,changedPaths:Array.from(n)}}),d={};Array.isArray(c)?c.forEach(l=>{l&&typeof l=="object"&&"key"in l&&"value"in l&&(d[l.key]=l.value)}):c&&typeof c=="object"&&(d={...c});let u=Object.keys(d).filter(l=>!this.isEqual(s[l],d[l]));if(u.length===0){this.logger?.debug&&this.logger.debug("No actual changes after middleware processing");return}let p={};u.forEach(l=>{p[l]=d[l]}),this.logger?.debug&&this.logger.debug("Notifying subscribers about changes:",{keys:u}),this.notifySubscribers(a.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:u,value:p,changedPaths:Array.from(n)});for(let l of n)try{let g=l.split(".")[0];if(g in p){let h;if(l===g)h=p[g];else{let S=l.substring(g.length+1);h=v(p[g],S)}h!==void 0&&this.notifySubscribers(l,h)}}catch(g){this.logger?.error("Error notifying path subscribers",{path:l,error:g})}await this.emitEvent({type:"storage:update",payload:{state:p,key:u,changedPaths:Array.from(n)}})}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)){let s=await this.middlewareModule.dispatch({type:"delete",key:e,metadata:t});await this.pluginExecutor?.executeAfterDelete(e,t);let n=[e.toString()];this.notifySubscribers(e,void 0),this.notifySubscribers(a.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:void 0,result:s,changedPaths:n}),await this.emitEvent({type:"storage:update",payload:{key:e,value:void 0,result:s,changedPaths:n}})}}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(a.GLOBAL_SUBSCRIPTION_KEY)||this.subscribers.set(a.GLOBAL_SUBSCRIPTION_KEY,new Set),this.subscribers.get(a.GLOBAL_SUBSCRIPTION_KEY).add(e),()=>{let t=this.subscribers.get(a.GLOBAL_SUBSCRIPTION_KEY);t&&(t.delete(e),t.size===0&&this.subscribers.delete(a.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(n){this.logger?.error("Error in initial callback",{key:e,error:n})}}),()=>{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 n=Object.keys(e),o=Object.keys(t);return n.length!==o.length?!1:n.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=(n="")=>({get:(o,i)=>{if(typeof i=="symbol")return Reflect.get(o,i);let c=n?`${n}.${i}`:i;return s.push(c),new Proxy({},r(c))},has:(o,i)=>!0,ownKeys:()=>[],getOwnPropertyDescriptor:()=>({configurable:!0,enumerable:!0}),apply:(o,i,c)=>new Proxy(()=>{},r(n))});try{e(new Proxy(t,r()))}catch{}return s.length===0?"":(s.sort((n,o)=>o.length-n.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(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:s,error:i})}})}findChangedPaths(e,t,s="",r=new Set,n=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(n.has(e))return r;n.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 u=s?`${s}.${i}`:i;c&&d&&typeof c=="object"&&typeof d=="object"&&!Array.isArray(c)&&!Array.isArray(d)?this.findChangedPaths(c,d,u,r,n):Array.isArray(c)&&Array.isArray(d)?this.isEqual(c,d)||r.add(u):this.isEqual(c,d)||r.add(u)}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 n=async o=>{try{if(o==null){let d=await this.getState(),u=e(d);t(u);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,n):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 D=class extends R{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 b&&e.isUnparseable()?t[e.valueOf()]:v(t,e)}async doSet(e,t){let s=this.storage.get(this.name)||{};if(e instanceof b&&e.isUnparseable()){s[e.valueOf()]=t,this.storage.set(this.name,s);return}let r=P({...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 b&&e.isUnparseable()){let i=e.valueOf();return i in t?(delete t[i],this.storage.set(this.name,t),!0):!1}let s=x(e),r=s.slice(0,-1).join("."),n=s[s.length-1],o=r?v(t,r):t;return!o||!(n in o)?!1:(delete o[n],this.storage.set(this.name,t),!0)}async doUpdate(e){let s={...this.storage.get(this.name)||{}};for(let{key:r,value:n}of e)r instanceof b&&r.isUnparseable()?s[r.valueOf()]=n:P(s,r,n);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{Observable as G,Subject as U}from"rxjs";var $=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 U;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,n=null,o=async i=>{let c=[i];if(t?.memoize&&r&&n&&t.memoize(c,r,n))return n;let d={type:s,meta:e.meta},u;if(this.middlewareFunctions.length>0){let p=async l=>t?.worker?this.executeInWorker(t.worker,s,c,e.action):Promise.resolve(e.action(i));for(let l=this.middlewareFunctions.length-1;l>=0;l--){let g=this.middlewareFunctions[l],h=p;p=async S=>g(async m=>h(m))(S)}u=await p(d)}else t?.worker?u=await this.executeInWorker(t.worker,s,c,e.action):u=await e.action(i);return d.payload=u,r=[...c],n=u,this.actions$.next(d),u};return o.r="dispatch",Object.defineProperty(o,"actionType",{value:s,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}`,s=new U,r,n=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),s.next(d),r=c}}),i=()=>{let c=s.asObservable();return e.notifyAfterSubscribe?new G(d=>{let u=!1;n().then(l=>{if(!e.shouldTrigger||e.shouldTrigger(void 0,l)){let g={type:t,payload:l,meta:{...e.meta,isInitial:!0}};d.next(g),r=l,u=!0}}).catch(l=>{d.error(l)});let p=c.subscribe({next:l=>{u&&l.payload===r||d.next(l)},error:l=>d.error(l),complete:()=>d.complete()});return()=>{p.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,s,r){return new Promise((n,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)):n(d.data.result))};e.addEventListener("message",c),e.postMessage({type:t,args:s,requestId:i}),setTimeout(()=>{e.removeEventListener("message",c),o(new Error(`Worker execution timeout for action: ${t}`))},3e4)})}};function k(a,e){let t=new $(a),s=e(a.storage,{createAction:(r,n)=>t.createAction(r,n),createWatcher:r=>t.createWatcher(r)});for(let[r,n]of Object.entries(s))if(typeof n=="function"){let o=n.r;t[o][r]=n}return t}import{combineLatest as Jt,merge as Qt,Observable as W,of as H,pipe as Zt,Subject as Y}from"rxjs";import{catchError as J,filter as tr,map as rr,share as Q,switchMap as sr,take as nr}from"rxjs/operators";import{of as Dt}from"rxjs";import{concatAll as Ct,delay as Mt,mergeMap as Ot,toArray as Bt}from"rxjs/operators";import{forkJoin as Kt,timer as jt}from"rxjs";import{mergeMap as kt}from"rxjs/operators";var O=class{constructor(e,t={},s,r={},n={}){this.storage=e;this.externalStates=t;this.dispatchers=s;this.services=r;this.config=n;this.subscribeToDispatchers(),this.state$=new W(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(Q())}effects=[];subscriptions=[];running=!1;action$=new Y;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(J(r=>H(null))).subscribe(r=>{if(r!=null&&typeof r=="function")try{r()}catch{}});this.subscriptions.push(s)}catch{}}};function X(a){if(!a.storage&&!a.createStorageFn)throw new Error('Synapse config must have either "storage" or "createStorageFn"');if(a.storage&&a.createStorageFn)throw new Error('Synapse config cannot have both "storage" and "createStorageFn". Choose one.');if(a.effects&&!a.createDispatcherFn)throw new Error('Effects require dispatcher. Add "createDispatcherFn" to config.');if(a.createEffectConfig&&!a.createDispatcherFn)throw new Error('Effect config requires dispatcher. Add "createDispatcherFn" to config.');if(a.dependencies){if(!Array.isArray(a.dependencies))throw new Error("Dependencies must be an array");a.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(a.createStorageFn&&typeof a.createStorageFn!="function")throw new Error('"createStorageFn" must be a function');if(a.createDispatcherFn&&typeof a.createDispatcherFn!="function")throw new Error('"createDispatcherFn" must be a function');if(a.createSelectorsFn&&typeof a.createSelectorsFn!="function")throw new Error('"createSelectorsFn" must be a function');if(a.createEffectConfig&&typeof a.createEffectConfig!="function")throw new Error('"createEffectConfig" must be a function');if(a.effects){if(!Array.isArray(a.effects))throw new Error("Effects must be an array");a.effects.forEach((e,t)=>{if(typeof e!="function")throw new Error(`Effect at index ${t} must be a function`)})}if(a.externalSelectors&&typeof a.externalSelectors!="object")throw new Error("External selectors must be an object")}async function Z(a=[]){a.length!==0&&await Promise.all(a.map(async(e,t)=>{try{await e.storage.waitForReady()}catch(s){throw new Error(`Dependency ${t} initialization failed: ${s}`)}}))}async function F(a){try{X(a)}catch(i){throw i}await Z(a.dependencies);let e=a.createStorageFn?await a.createStorageFn():a.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,n,o;if(a.createSelectorsFn)try{n=new C(e);let i=a.externalSelectors||{};s.selectors=a.createSelectorsFn(n,i),typeof n.destroy=="function"&&t.push(()=>n.destroy())}catch{}if(a.createDispatcherFn&&(r=a.createDispatcherFn(e),s.dispatcher=r,r&&"dispatch"in r&&(s.actions=r.dispatch,typeof r.destroy=="function"&&t.push(()=>r.destroy()))),a.createEffectConfig&&r)try{let{dispatchers:i,api:c,config:d,externalStates:u}=a.createEffectConfig(r),p=u||{};o=new O(e,p,i,c,d),Array.isArray(a.effects)&&a.effects.forEach(l=>{o&&o.add(l)}),await o.start(),s.state$=o.state$,t.push(()=>{o&&o.stop()})}catch{}return s}function ee(a,e){return e==="*"?!0:e.includes("*")?new RegExp("^"+e.replace(/\*/g,".*")+"$").test(a):a===e}async function te(a,e){let t=await a.getState(),s=Object.entries(t.events||{});if(s.length>e){let n=s.sort((o,i)=>i[1].timestamp-o[1].timestamp).slice(0,e);await a.set("events",Object.fromEntries(n))}}var re=(a={})=>F({createStorageFn:async()=>new D({name:a.name||"eventBus",initialState:{events:{},subscriptions:{}}}).initialize(),createDispatcherFn:e=>k({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:n,metadata:o={}})=>{let i=`${r}_${Date.now()}_${Math.random()}`;return await t.set(`events.${i}`,{id:i,event:r,data:n,metadata:{ttl:o.ttl||null,priority:o.priority||"normal",...o},timestamp:Date.now()}),a.autoCleanup&&await te(t,a.maxEvents||1e3),{eventId:i,event:r,data:n}}}),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:n,options:o={}})=>{let i=`sub_${Date.now()}_${Math.random()}`,c=t.subscribe(d=>d.events,d=>{Object.values(d||{}).forEach(u=>{if(ee(u.event,r)){if(o.priority&&u.metadata.priority!==o.priority)return;try{n(u.data,u)}catch{}}})});return await t.set(`subscriptions.${i}`,{id:i,pattern:r,options:o,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:n=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,n)}}),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 n=Date.now()-r;await t.update(o=>{Object.keys(o.events||{}).forEach(i=>{o.events[i].timestamp<n&&delete o.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||{})}})}))});export{re as createEventBus,F as createSynapse};
1
+ var y=!1,A=new Map;function N(a){let e=0;if(a.length===0)return e.toString(36);for(let t=0;t<a.length;t++){let s=a.charCodeAt(t);e=(e<<5)-e+s,e=e&e}return Math.abs(e).toString(36).substring(0,6)}function T(a,e){if(a===e)return!0;if(a==null||e==null)return!1;if(typeof a!="object"&&typeof a!="function"&&typeof e!="object"&&typeof e!="function")return a===e;if(typeof a!=typeof e)return!1;if(a instanceof Date&&e instanceof Date)return a.getTime()===e.getTime();if(Array.isArray(a)&&Array.isArray(e)){if(a.length!==e.length)return!1;for(let t=0;t<a.length;t++)if(!T(a[t],e[t]))return!1;return!0}if(typeof a=="object"&&typeof e=="object"){let t=Object.keys(a),s=Object.keys(e);return t.length!==s.length?!1:t.every(r=>Object.prototype.hasOwnProperty.call(e,r)?T(a[r],e[r]):!1)}return!1}function K(a,e=T){let t,s,r=!1;return function(i){if(!r||t!==i){let o=a(i);(!r||!e(o,s))&&(s=o),t=i,r=!0}return s}}var I=class{constructor(e,t,s=T,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}},C=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",n="";if(e){let i=t.toString();n=N(i)}else{let i=t.map(c=>c.getId()).join("_"),o=s.toString();n=N(i+o)}return`${this.storageName}_${r}_${n}`}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(n){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:n})}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),n=r?t||{}:s||{},i=n.name||this.generateName(r,e,r?void 0:t);if(this.localSelectorCache.has(i))return this.localSelectorCache.get(i).api;if(A.has(i)){let u=A.get(i);return u.refCount++,u.api}let o,c,d=[];if(r){let u=K(e,n.equals||T),p=this.createSimpleSelector(u,{...n,name:i,equals:n.equals||T});o=p.api,d=p.unsubscribeFunctions}else{c=e;let u=this.createCombinedSelector(c,t,{...n,name:i,equals:n.equals||T});o=u.api,d=u.unsubscribeFunctions}return this.localSelectorCache.set(i,{api:o,dependencies:c,unsubscribeFunctions:d}),A.set(i,{api:o,refCount:1,unsubscribeFunctions:d}),o}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 I(t.name,s,t.equals||T,this.logger),n=r.getId();this.subscriptions.set(n,r);let o=[this.source.subscribeToAll(async c=>{c?.type==="storage:update"&&(this.pendingUpdates.add(n),this.processPendingUpdates())})];return{api:{select:()=>s(),subscribe:c=>r.subscribe(c),getId:()=>n},unsubscribeFunctions:o}}createCombinedSelector(e,t,s){let r=K(p=>t(...p),s.equals||T),n=async()=>{let p=await Promise.all(e.map(l=>l.select()));return r(p)},i=new I(s.name,n,s.equals||T,this.logger),o=i.getId();this.subscriptions.set(o,i);let c=null,d=()=>{c!==null&&clearTimeout(c),c=setTimeout(()=>{c=null,i.notify().catch(p=>this.logger?.error(`[${o}] \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:p}))},10)},u=e.map(p=>p.subscribe({notify:()=>{d()}}));return{api:{select:()=>n(),subscribe:p=>i.subscribe(p),getId:()=>o},unsubscribeFunctions:u}}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=A.get(t);s&&(s.refCount--,s.refCount<=0&&(s.unsubscribeFunctions.forEach(r=>r()),A.delete(t)))})}};var b=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 V=(a={})=>{let e=a.batchSize??10,t=a.batchDelay??10,s=new Map,r=new Map,n=l=>l.type==="set"||l.type==="update",i=l=>`${l.type}_${l.key?.toString()||"default"}`,o=l=>{let g=new Map;for(let h of l){let S=`${h.type}_${h.key?.toString()||"default"}`;g.set(S,h)}return Array.from(g.values())},c=l=>{let g=r.get(l);g&&(globalThis.clearTimeout(g),r.delete(l))},d=(l,g)=>{let h=globalThis.setTimeout(g,t);r.set(l,h)},u=async(l,g,h)=>{let S=s.get(l);if(!(!S||S.length===0)){s.delete(l),c(l);try{let E=S.map(f=>f.action),m=o(E);for(let f of m)try{let B=await h(f);S.filter(w=>w.action.type===f.type&&w.action.key?.toString()===f.key?.toString()).forEach(w=>w.resolve(B))}catch(B){S.filter(w=>w.action.type===f.type&&w.action.key?.toString()===f.key?.toString()).forEach(w=>w.reject(B))}}catch(E){S.forEach(m=>m.reject(E))}}},p=async(l,g,h)=>new Promise((S,E)=>{let m=i(l),f=s.get(m);f||(f=[],s.set(m,f)),f.push({action:l,resolve:S,reject:E,timestamp:Date.now()}),c(m),f.length>=e?setImmediate(()=>u(m,g,h)):d(m,()=>u(m,g,h))});return{name:"batching",setup:()=>{},cleanup:async()=>{r.forEach(l=>globalThis.clearTimeout(l)),r.clear(),s.clear()},reducer:l=>g=>async h=>n(h)?p(h,l,g):g(h)}};var j=(a={})=>{let{comparator:e=(r,n)=>{if(r===n)return!0;if(typeof r!="object"||typeof n!="object"||r===null||n===null)return r===n;let i=Object.keys(r),o=Object.keys(n);return i.length!==o.length?!1:i.every(c=>Object.prototype.hasOwnProperty.call(n,c)&&r[c]===n[c])},segments:t=[]}=a,s=new Map;return{name:"shallow-compare",setup:r=>{},reducer:r=>n=>async i=>{if(i.type!=="set"||t.length&&!t.includes(i.metadata?.segment??"default"))return n(i);let o=i.key,c=s.get(o),d=i.value;if(c!==void 0&&e(c,d))return{...c,t:{valueNotChanged:!0,originalValue:c}};let u=await n(i);return s.set(o,d),u}}};var M=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 n=await this.api.storage.doGet("");return Object.keys(n||{}).length>0?n:r.value?(await this.api.storage.doSet("",r.value),this.api.storage.doGet("")):n}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 n={...r,metadata:{...r.metadata,processed:!0,timestamp:r.metadata?.timestamp||Date.now()}};return t.reducer(this.api)(s)(n)}}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 x(a){return a instanceof b&&a.isUnparseable()?[a.toString()]:a.toString().replace(/\[/g,".").replace(/\]/g,"").split(".").filter(Boolean)}function v(a,e){return x(e).reduce((s,r)=>s===void 0?void 0:s[r],a)}function P(a,e,t){if(e==="")return t;let s=x(e);if(e instanceof b&&e.isUnparseable())return a[e.toString()]=t,a;let r=s.pop(),n=s.reduce((i,o)=>{let c=s[s.indexOf(o)+1],d=!Number.isNaN(Number(c));return o in i||(i[o]=d?[]:{}),i[o]},a);return n[r]=t,a}var R=class a{constructor(e,t,s,r){this.config=e;this.pluginExecutor=t;this.eventEmitter=s;this.logger=r;this.name=e.name,this.middlewareModule=new M({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(n){this.logger?.error("Error in status change callback",{error:n})}})}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={})=>V(e),shallowCompare:(e={})=>j(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,n=await this.middlewareModule.dispatch({type:"set",key:e,value:r,metadata:s}),i=n?.t?.valueNotChanged===!0,o;if(i&&n?.t?.originalValue!==void 0?o=n.t.originalValue:o=await this.pluginExecutor?.executeAfterSet(e,n,s)??n,!i){let d=[e.toString()];this.notifySubscribers(e,o),this.notifySubscribers(a.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:o,changedPaths:d}),await this.emitEvent({type:"storage:update",payload:{key:e,value:o,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 n=this.findChangedPaths(s,r);if(n.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(n)});let i=new Set;for(let l of n){let g=l.split(".")[0];i.add(g)}let o=await Promise.all(Array.from(i).map(async l=>{let g={...t,key:l},h=await this.pluginExecutor?.executeBeforeSet(r[l],g)??r[l];return{key:l,value:h}})),c=await this.middlewareModule.dispatch({type:"update",value:o,metadata:{...t,batchUpdate:!0,changedPaths:Array.from(n)}}),d={};Array.isArray(c)?c.forEach(l=>{l&&typeof l=="object"&&"key"in l&&"value"in l&&(d[l.key]=l.value)}):c&&typeof c=="object"&&(d={...c});let u=Object.keys(d).filter(l=>!this.isEqual(s[l],d[l]));if(u.length===0){this.logger?.debug&&this.logger.debug("No actual changes after middleware processing");return}let p={};u.forEach(l=>{p[l]=d[l]}),this.logger?.debug&&this.logger.debug("Notifying subscribers about changes:",{keys:u}),this.notifySubscribers(a.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:u,value:p,changedPaths:Array.from(n)});for(let l of n)try{let g=l.split(".")[0];if(g in p){let h;if(l===g)h=p[g];else{let S=l.substring(g.length+1);h=v(p[g],S)}h!==void 0&&this.notifySubscribers(l,h)}}catch(g){this.logger?.error("Error notifying path subscribers",{path:l,error:g})}await this.emitEvent({type:"storage:update",payload:{state:p,key:u,changedPaths:Array.from(n)}})}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)){let s=await this.middlewareModule.dispatch({type:"delete",key:e,metadata:t});await this.pluginExecutor?.executeAfterDelete(e,t);let n=[e.toString()];this.notifySubscribers(e,void 0),this.notifySubscribers(a.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:void 0,result:s,changedPaths:n}),await this.emitEvent({type:"storage:update",payload:{key:e,value:void 0,result:s,changedPaths:n}})}}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(a.GLOBAL_SUBSCRIPTION_KEY)||this.subscribers.set(a.GLOBAL_SUBSCRIPTION_KEY,new Set),this.subscribers.get(a.GLOBAL_SUBSCRIPTION_KEY).add(e),()=>{let t=this.subscribers.get(a.GLOBAL_SUBSCRIPTION_KEY);t&&(t.delete(e),t.size===0&&this.subscribers.delete(a.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(n){this.logger?.error("Error in initial callback",{key:e,error:n})}}),()=>{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 o=0;o<e.length;o++)if(!this.isEqual(e[o],t[o]))return!1;return!0}let n=Object.keys(e),i=Object.keys(t);return n.length!==i.length?!1:n.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 s=[],r=(n="")=>({get:(i,o)=>{if(typeof o=="symbol")return Reflect.get(i,o);let c=n?`${n}.${o}`:o;return s.push(c),new Proxy({},r(c))},has:(i,o)=>!0,ownKeys:()=>[],getOwnPropertyDescriptor:()=>({configurable:!0,enumerable:!0}),apply:(i,o,c)=>new Proxy(()=>{},r(n))});try{e(new Proxy(t,r()))}catch{}return s.length===0?"":(s.sort((n,i)=>i.length-n.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(i=>{try{i(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:s,error:o})}})}findChangedPaths(e,t,s="",r=new Set,n=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(n.has(e))return r;n.set(e,!0);let i=new Set([...Object.keys(e||{}),...Object.keys(t||{})]);for(let o of i){let c=e[o],d=t[o];if(c===d)continue;let u=s?`${s}.${o}`:o;c&&d&&typeof c=="object"&&typeof d=="object"&&!Array.isArray(c)&&!Array.isArray(d)?this.findChangedPaths(c,d,u,r,n):Array.isArray(c)&&Array.isArray(d)?this.isEqual(c,d)||r.add(u):this.isEqual(c,d)||r.add(u)}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 n=async i=>{try{if(i==null){let d=await this.getState(),u=e(d);t(u);return}if(typeof i!="object"||i===null){t(i);return}let o=await this.getState(),c=e(o);t(c)}catch(o){this.logger?.error("Error in selector callback",{path:r,error:o}),t(i)}};return r?this.subscribeByKey(r,n):this.subscribeToAll(()=>{this.getState().then(i=>{t(e(i))})})}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 D=class extends R{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 b&&e.isUnparseable()?t[e.valueOf()]:v(t,e)}async doSet(e,t){let s=this.storage.get(this.name)||{};if(e instanceof b&&e.isUnparseable()){s[e.valueOf()]=t,this.storage.set(this.name,s);return}let r=P({...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 b&&e.isUnparseable()){let o=e.valueOf();return o in t?(delete t[o],this.storage.set(this.name,t),!0):!1}let s=x(e),r=s.slice(0,-1).join("."),n=s[s.length-1],i=r?v(t,r):t;return!i||!(n in i)?!1:(delete i[n],this.storage.set(this.name,t),!0)}async doUpdate(e){let s={...this.storage.get(this.name)||{}};for(let{key:r,value:n}of e)r instanceof b&&r.isUnparseable()?s[r.valueOf()]=n:P(s,r,n);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{Observable as G,Subject as U}from"rxjs";var $=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 U;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,n=null,i=async o=>{let c=[o];if(t?.memoize&&r&&n&&t.memoize(c,r,n))return n;let d={type:s,meta:e.meta},u;if(this.middlewareFunctions.length>0){let p=async l=>t?.worker?this.executeInWorker(t.worker,s,c,e.action):Promise.resolve(e.action(o));for(let l=this.middlewareFunctions.length-1;l>=0;l--){let g=this.middlewareFunctions[l],h=p;p=async S=>g(async m=>h(m))(S)}u=await p(d)}else t?.worker?u=await this.executeInWorker(t.worker,s,c,e.action):u=await e.action(o);return d.payload=u,r=[...c],n=u,this.actions$.next(d),u};return i.r="dispatch",Object.defineProperty(i,"actionType",{value:s,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(i,"meta",{value:e.meta,writable:!1,enumerable:!0}),i}createWatcher(e){let t=`[${this.storage.name}]${e.type}`,s=new U,r,n=async()=>{let c=await this.storage.getState();return e.selector(c)},i=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}}),o=()=>{let c=s.asObservable();return e.notifyAfterSubscribe?new G(d=>{let u=!1;n().then(l=>{if(!e.shouldTrigger||e.shouldTrigger(void 0,l)){let g={type:t,payload:l,meta:{...e.meta,isInitial:!0}};d.next(g),r=l,u=!0}}).catch(l=>{d.error(l)});let p=c.subscribe({next:l=>{u&&l.payload===r||d.next(l)},error:l=>d.error(l),complete:()=>d.complete()});return()=>{p.unsubscribe()}}):c};return o.r="watchers",Object.defineProperty(o,"actionType",{value:t,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(o,"meta",{value:e.meta,writable:!1,enumerable:!0}),Object.defineProperty(o,"unsubscribe",{value:i,writable:!1,enumerable:!0}),o}async executeInWorker(e,t,s,r){return new Promise((n,i)=>{let o=`${t}_${Date.now()}_${Math.random()}`,c=d=>{d.data.requestId===o&&(e.removeEventListener("message",c),d.data.error?i(new Error(d.data.error)):n(d.data.result))};e.addEventListener("message",c),e.postMessage({type:t,args:s,requestId:o}),setTimeout(()=>{e.removeEventListener("message",c),i(new Error(`Worker execution timeout for action: ${t}`))},3e4)})}};function k(a,e){let t=new $(a),s=e(a.storage,{createAction:(r,n)=>t.createAction(r,n),createWatcher:r=>t.createWatcher(r)});for(let[r,n]of Object.entries(s))if(typeof n=="function"){let i=n.r;t[i][r]=n}return t}var ft=globalThis.console;import{combineLatest as tr,merge as rr,Observable as W,of as H,pipe as nr,Subject as Y}from"rxjs";import{catchError as J,filter as ir,map as or,share as Q,switchMap as cr,take as lr}from"rxjs/operators";import{of as Bt}from"rxjs";import{concatAll as Ft,delay as Nt,mergeMap as Kt,toArray as Vt}from"rxjs/operators";import{forkJoin as qt,timer as _t}from"rxjs";import{mergeMap as Lt}from"rxjs/operators";var O=class{constructor(e,t={},s,r={},n={}){this.storage=e;this.externalStates=t;this.dispatchers=s;this.services=r;this.config=n;this.subscribeToDispatchers(),this.state$=new W(i=>{this.storage.getState().then(c=>i.next(c));let o=this.storage.subscribeToAll(()=>{this.storage.getState().then(c=>i.next(c))});return()=>o()}).pipe(Q())}effects=[];subscriptions=[];running=!1;action$=new Y;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(J(r=>H(null))).subscribe(r=>{if(r!=null&&typeof r=="function")try{r()}catch{}});this.subscriptions.push(s)}catch{}}};function X(a){if(!a.storage&&!a.createStorageFn)throw new Error('Synapse config must have either "storage" or "createStorageFn"');if(a.storage&&a.createStorageFn)throw new Error('Synapse config cannot have both "storage" and "createStorageFn". Choose one.');if(a.effects&&!a.createDispatcherFn)throw new Error('Effects require dispatcher. Add "createDispatcherFn" to config.');if(a.createEffectConfig&&!a.createDispatcherFn)throw new Error('Effect config requires dispatcher. Add "createDispatcherFn" to config.');if(a.dependencies){if(!Array.isArray(a.dependencies))throw new Error("Dependencies must be an array");a.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(a.createStorageFn&&typeof a.createStorageFn!="function")throw new Error('"createStorageFn" must be a function');if(a.createDispatcherFn&&typeof a.createDispatcherFn!="function")throw new Error('"createDispatcherFn" must be a function');if(a.createSelectorsFn&&typeof a.createSelectorsFn!="function")throw new Error('"createSelectorsFn" must be a function');if(a.createEffectConfig&&typeof a.createEffectConfig!="function")throw new Error('"createEffectConfig" must be a function');if(a.effects){if(!Array.isArray(a.effects))throw new Error("Effects must be an array");a.effects.forEach((e,t)=>{if(typeof e!="function")throw new Error(`Effect at index ${t} must be a function`)})}if(a.externalSelectors&&typeof a.externalSelectors!="object")throw new Error("External selectors must be an object")}async function Z(a=[]){a.length!==0&&await Promise.all(a.map(async(e,t)=>{try{await e.storage.waitForReady()}catch(s){throw new Error(`Dependency ${t} initialization failed: ${s}`)}}))}async function F(a){try{X(a)}catch(o){throw o}await Z(a.dependencies);let e=a.createStorageFn?await a.createStorageFn():a.storage;await e.waitForReady();let t=[],s={storage:e,selectors:{},destroy:async()=>{for(let o of t)await o()}};t.push(()=>e.destroy());let r,n,i;if(a.createSelectorsFn)try{n=new C(e);let o=a.externalSelectors||{};s.selectors=a.createSelectorsFn(n,o),typeof n.destroy=="function"&&t.push(()=>n.destroy())}catch{}if(a.createDispatcherFn&&(r=a.createDispatcherFn(e),s.dispatcher=r,r&&"dispatch"in r&&(s.actions=r.dispatch,typeof r.destroy=="function"&&t.push(()=>r.destroy()))),a.createEffectConfig&&r)try{let{dispatchers:o,api:c,config:d,externalStates:u}=a.createEffectConfig(r),p=u||{};i=new O(e,p,o,c,d),Array.isArray(a.effects)&&a.effects.forEach(l=>{i&&i.add(l)}),await i.start(),s.state$=i.state$,t.push(()=>{i&&i.stop()})}catch{}return s}function ee(a,e){return e==="*"?!0:e.includes("*")?new RegExp("^"+e.replace(/\*/g,".*")+"$").test(a):a===e}async function te(a,e){let t=await a.getState(),s=Object.entries(t.events||{});if(s.length>e){let n=s.sort((i,o)=>o[1].timestamp-i[1].timestamp).slice(0,e);await a.set("events",Object.fromEntries(n))}}var re=(a={})=>F({createStorageFn:async()=>new D({name:a.name||"eventBus",initialState:{events:{},subscriptions:{}}}).initialize(),createDispatcherFn:e=>k({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:n,metadata:i={}})=>{let o=`${r}_${Date.now()}_${Math.random()}`;return await t.set(`events.${o}`,{id:o,event:r,data:n,metadata:{ttl:i.ttl||null,priority:i.priority||"normal",...i},timestamp:Date.now()}),a.autoCleanup&&await te(t,a.maxEvents||1e3),{eventId:o,event:r,data:n}}}),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:n,options:i={}})=>{let o=`sub_${Date.now()}_${Math.random()}`,c=t.subscribe(d=>d.events,d=>{Object.values(d||{}).forEach(u=>{if(ee(u.event,r)){if(i.priority&&u.metadata.priority!==i.priority)return;try{n(u.data,u)}catch{}}})});return await t.set(`subscriptions.${o}`,{id:o,pattern:r,options:i,createdAt:Date.now()}),{subscriptionId:o,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:n=100})=>{let i=await t.getState();return Object.values(i.events||{}).filter(o=>o.event===r).sort((o,c)=>c.timestamp-o.timestamp).slice(0,n)}}),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 n=Date.now()-r;await t.update(i=>{Object.keys(i.events||{}).forEach(o=>{i.events[o].timestamp<n&&delete i.events[o]})})}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||{})}})}))});export{re as createEventBus,F as createSynapse};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synapse-storage",
3
- "version": "3.0.14",
3
+ "version": "3.0.15",
4
4
  "description": "Набор инструментов для управления состоянием и апи-запросами",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",