synapse-storage 3.0.16 → 3.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -31
- package/dist/api.d.ts +1 -1
- package/dist/core.d.ts +16 -5
- package/dist/core.js +1 -1
- package/dist/{createSynapse-BLbPlWXK.d.ts → createSynapse-vkfKjRob.d.ts} +2 -2
- package/dist/{dispatcher.module-DcXkCRNj.d.ts → dispatcher.module-BOsMHbD5.d.ts} +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +1 -1
- package/dist/react.d.ts +25 -4
- package/dist/react.js +1 -1
- package/dist/reactive.d.ts +3 -3
- package/dist/{storage.interface-2HKvqdAJ.d.ts → storage.interface-BA_ktyDz.d.ts} +163 -16
- package/dist/utils.d.ts +4 -4
- package/dist/utils.js +1 -1
- package/package.json +1 -1
|
@@ -211,11 +211,12 @@ interface IPluginManager<T extends IPlugin> {
|
|
|
211
211
|
|
|
212
212
|
type PathSelector<T, R> = (state: T) => R;
|
|
213
213
|
declare abstract class BaseStorage<T extends Record<string, any>> implements IStorage<T> {
|
|
214
|
-
protected readonly config:
|
|
214
|
+
protected readonly config: StorageSingletonConfig<T>;
|
|
215
215
|
protected readonly pluginExecutor?: IPluginExecutor | undefined;
|
|
216
216
|
protected readonly eventEmitter?: IEventEmitter | undefined;
|
|
217
217
|
protected readonly logger?: ILogger | undefined;
|
|
218
218
|
protected static readonly GLOBAL_SUBSCRIPTION_KEY = "*";
|
|
219
|
+
protected static readonly STORAGE_TYPE: StorageType;
|
|
219
220
|
name: string;
|
|
220
221
|
private _initStatus;
|
|
221
222
|
private statusSubscribers;
|
|
@@ -223,7 +224,7 @@ declare abstract class BaseStorage<T extends Record<string, any>> implements ISt
|
|
|
223
224
|
private middlewareModule;
|
|
224
225
|
private initializedMiddlewares;
|
|
225
226
|
protected subscribers: Map<StorageKeyType, Set<(value: any) => void>>;
|
|
226
|
-
constructor(config:
|
|
227
|
+
constructor(config: StorageSingletonConfig<T>, pluginExecutor?: IPluginExecutor | undefined, eventEmitter?: IEventEmitter | undefined, logger?: ILogger | undefined);
|
|
227
228
|
get initStatus(): StorageInitStatus;
|
|
228
229
|
waitForReady(): Promise<this>;
|
|
229
230
|
onStatusChange(callback: (status: StorageInitStatus) => void): VoidFunction;
|
|
@@ -283,13 +284,14 @@ interface IndexedDBConfig {
|
|
|
283
284
|
dbVersion: number;
|
|
284
285
|
}
|
|
285
286
|
declare class IndexedDBStorage<T extends Record<string, any>> extends BaseStorage<T> {
|
|
287
|
+
protected static readonly STORAGE_TYPE: StorageType;
|
|
286
288
|
private readonly DB_NAME;
|
|
287
289
|
private readonly STORE_NAME;
|
|
288
290
|
private readonly DB_VERSION;
|
|
289
291
|
private dbManager;
|
|
290
|
-
constructor(config:
|
|
291
|
-
|
|
292
|
-
|
|
292
|
+
constructor(config: IndexedDBStorageConfig<T>, pluginExecutor?: IPluginExecutor, eventEmitter?: IEventEmitter, logger?: ILogger);
|
|
293
|
+
protected getStorageType(): StorageType;
|
|
294
|
+
static create<T extends Record<string, any>>(config: IndexedDBStorageConfig, pluginExecutor?: IPluginExecutor, eventEmitter?: IEventEmitter, logger?: ILogger): IndexedDBStorage<T>;
|
|
293
295
|
protected doInitialize(): Promise<this>;
|
|
294
296
|
static getCurrentDBVersion(dbName: string): Promise<number>;
|
|
295
297
|
static createStorages<S extends Record<string, any>>(dbName: string, configs: {
|
|
@@ -363,6 +365,149 @@ interface ShallowCompareMiddlewareOptions {
|
|
|
363
365
|
comparator?: <T>(prev: T, next: T) => boolean;
|
|
364
366
|
}
|
|
365
367
|
|
|
368
|
+
/**
|
|
369
|
+
* @example
|
|
370
|
+
* ```typescript
|
|
371
|
+
* // Строгая проверка - выбросит ошибку при любых различиях
|
|
372
|
+
* const storage1 = new MemoryStorage({
|
|
373
|
+
* name: 'user',
|
|
374
|
+
* singleton: {
|
|
375
|
+
* enabled: true,
|
|
376
|
+
* mergeStrategy: ConfigMergeStrategy.STRICT
|
|
377
|
+
* },
|
|
378
|
+
* initialState: { name: 'John' }
|
|
379
|
+
* })
|
|
380
|
+
*
|
|
381
|
+
* // Глубокое слияние - объединит объекты
|
|
382
|
+
* const storage2 = new MemoryStorage({
|
|
383
|
+
* name: 'settings',
|
|
384
|
+
* singleton: {
|
|
385
|
+
* enabled: true,
|
|
386
|
+
* mergeStrategy: ConfigMergeStrategy.DEEP_MERGE
|
|
387
|
+
* },
|
|
388
|
+
* initialState: { theme: 'dark', notifications: { email: true } }
|
|
389
|
+
* })
|
|
390
|
+
* ```
|
|
391
|
+
*/
|
|
392
|
+
declare enum ConfigMergeStrategy {
|
|
393
|
+
/**
|
|
394
|
+
* Строгая проверка - выбрасывает ошибку при любых отличиях в конфигурации
|
|
395
|
+
*
|
|
396
|
+
* Используйте когда требуется абсолютная идентичность конфигураций
|
|
397
|
+
* для обеспечения предсказуемого поведения
|
|
398
|
+
*/
|
|
399
|
+
STRICT = "strict",
|
|
400
|
+
/**
|
|
401
|
+
* Первая конфигурация побеждает - игнорирует последующие конфигурации
|
|
402
|
+
*
|
|
403
|
+
* **По умолчанию**. Безопасная стратегия, которая использует настройки
|
|
404
|
+
* первого созданного экземпляра и игнорирует все последующие
|
|
405
|
+
*/
|
|
406
|
+
FIRST_WINS = "first_wins",
|
|
407
|
+
/**
|
|
408
|
+
* Глубокое слияние объектов - рекурсивно объединяет initialState
|
|
409
|
+
*
|
|
410
|
+
* Полезно когда разные компоненты должны дополнять начальное состояние.
|
|
411
|
+
* Примитивные значения из первой конфигурации сохраняются
|
|
412
|
+
*/
|
|
413
|
+
DEEP_MERGE = "deep_merge",
|
|
414
|
+
/**
|
|
415
|
+
* Последняя конфигурация перезаписывает предыдущие (кроме name)
|
|
416
|
+
*
|
|
417
|
+
* **Осторожно!** Может привести к непредсказуемому поведению,
|
|
418
|
+
* так как результат зависит от порядка создания компонентов
|
|
419
|
+
*/
|
|
420
|
+
OVERRIDE = "override",
|
|
421
|
+
/**
|
|
422
|
+
* Предупреждение в консоли + использование первой конфигурации
|
|
423
|
+
*
|
|
424
|
+
* Как FIRST_WINS, но с подробными предупреждениями в консоли
|
|
425
|
+
* о конфликтующих настройках. Полезно для отладки
|
|
426
|
+
*/
|
|
427
|
+
WARN_AND_USE_FIRST = "warn_and_use_first"
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Позволяет переиспользовать экземпляры хранилищ между компонентами
|
|
431
|
+
* по имени, что особенно полезно в React при частых ре-рендерах
|
|
432
|
+
*
|
|
433
|
+
* @example
|
|
434
|
+
* ```typescript
|
|
435
|
+
* // Базовое использование
|
|
436
|
+
* const storage = new MemoryStorage({
|
|
437
|
+
* name: 'user-preferences',
|
|
438
|
+
* singleton: { enabled: true },
|
|
439
|
+
* initialState: { theme: 'light' }
|
|
440
|
+
* })
|
|
441
|
+
*
|
|
442
|
+
* // Продвинутые настройки
|
|
443
|
+
* const storage = new MemoryStorage({
|
|
444
|
+
* name: 'shared-state',
|
|
445
|
+
* singleton: {
|
|
446
|
+
* enabled: true,
|
|
447
|
+
* mergeStrategy: ConfigMergeStrategy.DEEP_MERGE,
|
|
448
|
+
* warnOnConflict: true,
|
|
449
|
+
* key: 'custom-singleton-key'
|
|
450
|
+
* },
|
|
451
|
+
* initialState: { user: null, settings: {} }
|
|
452
|
+
* })
|
|
453
|
+
* ```
|
|
454
|
+
*
|
|
455
|
+
* @see {@link ConfigMergeStrategy} для стратегий разрешения конфликтов
|
|
456
|
+
*/
|
|
457
|
+
interface SingletonOptions {
|
|
458
|
+
/**
|
|
459
|
+
* Включить Singleton Pattern для данного хранилища
|
|
460
|
+
*
|
|
461
|
+
* При `true` хранилища с одинаковым именем (или ключом) будут
|
|
462
|
+
* возвращать один и тот же экземпляр вместо создания нового
|
|
463
|
+
*
|
|
464
|
+
* @default false
|
|
465
|
+
*/
|
|
466
|
+
enabled: boolean;
|
|
467
|
+
/**
|
|
468
|
+
* Стратегия разрешения конфликтов при различающихся конфигурациях
|
|
469
|
+
*
|
|
470
|
+
* Определяет как поступать, когда singleton с тем же именем
|
|
471
|
+
* создается с отличающимися параметрами (initialState, middlewares и т.д.)
|
|
472
|
+
*
|
|
473
|
+
* @default ConfigMergeStrategy.FIRST_WINS
|
|
474
|
+
* @see {@link ConfigMergeStrategy}
|
|
475
|
+
*/
|
|
476
|
+
mergeStrategy?: ConfigMergeStrategy;
|
|
477
|
+
/**
|
|
478
|
+
* Выводить предупреждения при обнаружении конфликтов конфигурации
|
|
479
|
+
*
|
|
480
|
+
* При `true` будет логировать в консоль информацию о различиях
|
|
481
|
+
* в конфигурациях между экземплярами singleton (кроме стратегии STRICT)
|
|
482
|
+
*
|
|
483
|
+
* @default true
|
|
484
|
+
*/
|
|
485
|
+
warnOnConflict?: boolean;
|
|
486
|
+
/**
|
|
487
|
+
* Кастомный ключ для идентификации singleton экземпляра
|
|
488
|
+
*
|
|
489
|
+
* По умолчанию используется комбинация `{StorageType}_{name}`,
|
|
490
|
+
* но можно задать собственный ключ для более тонкого контроля
|
|
491
|
+
*
|
|
492
|
+
* @example
|
|
493
|
+
* ```typescript
|
|
494
|
+
* // Разные хранилища с одним именем, но разными ключами
|
|
495
|
+
* const userCache = new MemoryStorage({
|
|
496
|
+
* name: 'user',
|
|
497
|
+
* singleton: { enabled: true, key: 'user-cache' }
|
|
498
|
+
* })
|
|
499
|
+
*
|
|
500
|
+
* const userSettings = new LocalStorage({
|
|
501
|
+
* name: 'user', // То же имя!
|
|
502
|
+
* singleton: { enabled: true, key: 'user-settings' } // Но разный ключ
|
|
503
|
+
* })
|
|
504
|
+
* ```
|
|
505
|
+
*
|
|
506
|
+
* @default `${StorageType}_${name}`
|
|
507
|
+
*/
|
|
508
|
+
key?: string;
|
|
509
|
+
}
|
|
510
|
+
|
|
366
511
|
declare enum StorageStatus {
|
|
367
512
|
IDLE = "idle",// Не инициализировано
|
|
368
513
|
LOADING = "loading",// В процессе инициализации
|
|
@@ -424,21 +569,23 @@ interface DefaultMiddlewares {
|
|
|
424
569
|
}
|
|
425
570
|
type GetDefaultMiddleware = () => DefaultMiddlewares;
|
|
426
571
|
type ConfigureMiddlewares = (getDefaultMiddleware: GetDefaultMiddleware) => Middleware[];
|
|
427
|
-
interface StorageConfig {
|
|
572
|
+
interface StorageConfig<T extends Record<string, any> = Record<string, any>> {
|
|
428
573
|
name: string;
|
|
429
|
-
initialState?:
|
|
574
|
+
initialState?: Partial<T>;
|
|
430
575
|
middlewares?: ConfigureMiddlewares;
|
|
431
576
|
}
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
type: 'memory';
|
|
435
|
-
}
|
|
436
|
-
interface LocalStorageConfig extends StorageConfig {
|
|
437
|
-
type: 'localStorage';
|
|
577
|
+
interface StorageSingletonConfig<T extends Record<string, any> = Record<string, any>> extends StorageConfig<T> {
|
|
578
|
+
singleton?: SingletonOptions;
|
|
438
579
|
}
|
|
439
|
-
|
|
440
|
-
|
|
580
|
+
type StorageType = 'memory' | 'localStorage' | 'indexedDB';
|
|
581
|
+
type MemoryStorageConfig<T extends Record<string, any> = Record<string, any>> = StorageSingletonConfig<T>;
|
|
582
|
+
type LocalStorageConfig<T extends Record<string, any> = Record<string, any>> = StorageSingletonConfig<T>;
|
|
583
|
+
interface IndexedDBStorageConfig<T extends Record<string, any> = Record<string, any>> extends StorageSingletonConfig<T> {
|
|
441
584
|
options: IndexedDBConfig;
|
|
442
585
|
}
|
|
586
|
+
interface UniversalStorageConfig<T extends Record<string, any> = Record<string, any>> extends StorageSingletonConfig<T> {
|
|
587
|
+
type: StorageType;
|
|
588
|
+
options?: IndexedDBConfig;
|
|
589
|
+
}
|
|
443
590
|
|
|
444
|
-
export { type BatchingMiddlewareOptions as B,
|
|
591
|
+
export { type BatchingMiddlewareOptions as B, ConfigMergeStrategy as C, type DefaultMiddlewares as D, type GetDefaultMiddleware as G, IndexedDBStorage as I, type LocalStorageConfig as L, type Middleware as M, type NextFunction as N, type PluginContext as P, type ShallowCompareMiddlewareOptions as S, type UniversalStorageConfig as U, type MiddlewareAPI as a, type StorageAction as b, type StorageKeyType as c, type IPlugin as d, type IStoragePlugin as e, type IPluginExecutor as f, type IPluginManager as g, StorageStatus as h, type StorageInitStatus as i, type IStorage as j, StorageEvents as k, type StorageEvent as l, type IEventEmitter as m, type ILogger as n, type ConfigureMiddlewares as o, type StorageConfig as p, type StorageSingletonConfig as q, type StorageType as r, type MemoryStorageConfig as s, type IndexedDBStorageConfig as t, BaseStorage as u };
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as SynapseStoreWithDispatcher, A as AnySynapseStore } from './createSynapse-
|
|
2
|
-
export { S as SynapseStoreBasic, b as SynapseStoreWithEffects, c as createSynapse } from './createSynapse-
|
|
3
|
-
import { j as IStorage } from './storage.interface-
|
|
4
|
-
import { D as DispatchFunction, f as DispatchActions } from './dispatcher.module-
|
|
1
|
+
import { a as SynapseStoreWithDispatcher, A as AnySynapseStore } from './createSynapse-vkfKjRob.js';
|
|
2
|
+
export { S as SynapseStoreBasic, b as SynapseStoreWithEffects, c as createSynapse } from './createSynapse-vkfKjRob.js';
|
|
3
|
+
import { j as IStorage } from './storage.interface-BA_ktyDz.js';
|
|
4
|
+
import { D as DispatchFunction, f as DispatchActions } from './dispatcher.module-BOsMHbD5.js';
|
|
5
5
|
import 'rxjs';
|
|
6
6
|
import './selector.interface-CA5y-kD_.js';
|
|
7
7
|
|
package/dist/utils.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var y=!1,A=new Map;function N(o){let e=0;if(o.length===0)return e.toString(36);for(let t=0;t<o.length;t++){let s=o.charCodeAt(t);e=(e<<5)-e+s,e=e&e}return Math.abs(e).toString(36).substring(0,6)}function T(o,e){if(o===e)return!0;if(o==null||e==null)return!1;if(typeof o!="object"&&typeof o!="function"&&typeof e!="object"&&typeof e!="function")return o===e;if(typeof o!=typeof e)return!1;if(o instanceof Date&&e instanceof Date)return o.getTime()===e.getTime();if(Array.isArray(o)&&Array.isArray(e)){if(o.length!==e.length)return!1;for(let t=0;t<o.length;t++)if(!T(o[t],e[t]))return!1;return!0}if(typeof o=="object"&&typeof e=="object"){let t=Object.keys(o),s=Object.keys(e);return t.length!==s.length?!1:t.every(r=>Object.prototype.hasOwnProperty.call(e,r)?T(o[r],e[r]):!1)}return!1}function K(o,e=T){let t,s,r=!1;return function(i){if(!r||t!==i){let n=o(i);(!r||!e(n,s))&&(s=n),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",a="";if(e){let i=t.toString();a=N(i)}else{let i=t.map(c=>c.getId()).join("_"),n=s.toString();a=N(i+n)}return`${this.storageName}_${r}_${a}`}processPendingUpdates(){this.pendingUpdates.size===0||this.batchUpdateInProgress||(this.batchUpdateInProgress=!0,setTimeout(async()=>{try{let e=Array.from(this.pendingUpdates);this.pendingUpdates.clear(),this.cachedState=await this.source.getState();let t=e.map(async s=>{let r=this.subscriptions.get(s);if(r)try{return await r.notify()}catch(a){this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u043F\u0438\u0441\u0447\u0438\u043A\u0430 ${s}`,{error:a})}return Promise.resolve()});await Promise.all(t)}catch(e){this.logger?.error("\u041E\u0448\u0438\u0431\u043A\u0430 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0438 \u043E\u0436\u0438\u0434\u0430\u044E\u0449\u0438\u0445 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0439",{error:e})}finally{this.batchUpdateInProgress=!1,this.pendingUpdates.size>0&&this.processPendingUpdates()}},0))}createSelector(e,t,s){let r=!Array.isArray(e),a=r?t||{}:s||{},i=a.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 n,c,d=[];if(r){let u=K(e,a.equals||T),p=this.createSimpleSelector(u,{...a,name:i,equals:a.equals||T});n=p.api,d=p.unsubscribeFunctions}else{c=e;let u=this.createCombinedSelector(c,t,{...a,name:i,equals:a.equals||T});n=u.api,d=u.unsubscribeFunctions}return this.localSelectorCache.set(i,{api:n,dependencies:c,unsubscribeFunctions:d}),A.set(i,{api:n,refCount:1,unsubscribeFunctions:d}),n}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),a=r.getId();this.subscriptions.set(a,r);let n=[this.source.subscribeToAll(async c=>{c?.type==="storage:update"&&(this.pendingUpdates.add(a),this.processPendingUpdates())})];return{api:{select:()=>s(),subscribe:c=>r.subscribe(c),getId:()=>a},unsubscribeFunctions:n}}createCombinedSelector(e,t,s){let r=K(p=>t(...p),s.equals||T),a=async()=>{let p=await Promise.all(e.map(l=>l.select()));return r(p)},i=new I(s.name,a,s.equals||T,this.logger),n=i.getId();this.subscriptions.set(n,i);let c=null,d=()=>{c!==null&&clearTimeout(c),c=setTimeout(()=>{c=null,i.notify().catch(p=>this.logger?.error(`[${n}] \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:()=>a(),subscribe:p=>i.subscribe(p),getId:()=>n},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=(o={})=>{let e=o.batchSize??10,t=o.batchDelay??10,s=new Map,r=new Map,a=l=>l.type==="set"||l.type==="update",i=l=>`${l.type}_${l.key?.toString()||"default"}`,n=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=n(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=>a(h)?p(h,l,g):g(h)}};var j=(o={})=>{let{comparator:e=(r,a)=>{if(r===a)return!0;if(typeof r!="object"||typeof a!="object"||r===null||a===null)return r===a;let i=Object.keys(r),n=Object.keys(a);return i.length!==n.length?!1:i.every(c=>Object.prototype.hasOwnProperty.call(a,c)&&r[c]===a[c])},segments:t=[]}=o,s=new Map;return{name:"shallow-compare",setup:r=>{},reducer:r=>a=>async i=>{if(i.type!=="set"||t.length&&!t.includes(i.metadata?.segment??"default"))return a(i);let n=i.key,c=s.get(n),d=i.value;if(c!==void 0&&e(c,d))return{...c,t:{valueNotChanged:!0,originalValue:c}};let u=await a(i);return s.set(n,d),u}}};var O=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 a=await this.api.storage.doGet("");return Object.keys(a||{}).length>0?a:r.value?(await this.api.storage.doSet("",r.value),this.api.storage.doGet("")):a}case"keys":return this.api.storage.doKeys();default:throw new Error(`Unknown action type: ${r.type}`)}}initializeMiddlewares(){if(this.initialized)return;let e=this.baseOperation.bind(this);for(let t of[...this.middlewares].reverse()){let s=e;e=async r=>{if(r.metadata?.processed)return s(r);let a={...r,metadata:{...r.metadata,processed:!0,timestamp:r.metadata?.timestamp||Date.now()}};return t.reducer(this.api)(s)(a)}}this.dispatchFn=e,this.initialized=!0}use(e){e.setup&&e.setup(this.api),this.middlewares.push(e),this.initialized=!1}async dispatch(e){this.initialized||this.initializeMiddlewares();try{return this.dispatchFn(e)}catch(t){throw t}}};function x(o){return o instanceof b&&o.isUnparseable()?[o.toString()]:o.toString().replace(/\[/g,".").replace(/\]/g,"").split(".").filter(Boolean)}function v(o,e){return x(e).reduce((s,r)=>s===void 0?void 0:s[r],o)}function P(o,e,t){if(e==="")return t;let s=x(e);if(e instanceof b&&e.isUnparseable())return o[e.toString()]=t,o;let r=s.pop(),a=s.reduce((i,n)=>{let c=s[s.indexOf(n)+1],d=!Number.isNaN(Number(c));return n in i||(i[n]=d?[]:{}),i[n]},o);return a[r]=t,o}var R=class o{constructor(e,t,s,r){this.config=e;this.pluginExecutor=t;this.eventEmitter=s;this.logger=r;this.name=e.name,this.middlewareModule=new O({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(a){this.logger?.error("Error in status change callback",{error:a})}})}async initialize(){if(this.e.status==="ready")return this;if(this.e.status==="loading")return this.waitForReady();this.updateInitStatus({status:"loading",error:void 0});try{let e=await this.doInitialize();return this.updateInitStatus({status:"ready",error:void 0}),e}catch(e){throw this.updateInitStatus({status:"error",error:e instanceof Error?e:new Error(String(e))}),e}}ensureReady(){if(this.e.status!=="ready")throw new Error(`Storage "${this.name}" is not ready. Current status: ${this.e.status}`)}initializeMiddlewares(){this.config.middlewares&&!this.initializedMiddlewares&&(this.initializedMiddlewares=this.config.middlewares(()=>this.getDefaultMiddleware()),this.initializedMiddlewares.forEach(e=>this.middlewareModule.use(e)))}getDefaultMiddleware(){return{batching:(e={})=>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,a=await this.middlewareModule.dispatch({type:"set",key:e,value:r,metadata:s}),i=a?.t?.valueNotChanged===!0,n;if(i&&a?.t?.originalValue!==void 0?n=a.t.originalValue:n=await this.pluginExecutor?.executeAfterSet(e,a,s)??a,!i){let d=[e.toString()];this.notifySubscribers(e,n),this.notifySubscribers(o.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:n,changedPaths:d}),await this.emitEvent({type:"storage:update",payload:{key:e,value:n,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 a=this.findChangedPaths(s,r);if(a.size===0){this.logger?.debug&&this.logger.debug("No changes detected in update");return}this.logger?.debug&&this.logger.debug("Changed paths:",{paths:Array.from(a)});let i=new Set;for(let l of a){let g=l.split(".")[0];i.add(g)}let n=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:n,metadata:{...t,batchUpdate:!0,changedPaths:Array.from(a)}}),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(o.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:u,value:p,changedPaths:Array.from(a)});for(let l of a)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(a)}})}catch(t){throw this.logger?.error("Error updating state",{error:t}),t}}async delete(e){this.ensureReady();try{let t={operation:"delete",timestamp:Date.now(),key:e};if(await this.pluginExecutor?.executeBeforeDelete(e,t)===!1)return;let r=await this.middlewareModule.dispatch({type:"delete",key:e,metadata:t});if(r===!1)return;await this.pluginExecutor?.executeAfterDelete(e,t);let i=[e.toString()];this.notifySubscribers(e,void 0),this.notifySubscribers(o.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:void 0,result:r,changedPaths:i}),await this.emitEvent({type:"storage:update",payload:{key:e,value:void 0,result:r,changedPaths:i}})}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(o.GLOBAL_SUBSCRIPTION_KEY)||this.subscribers.set(o.GLOBAL_SUBSCRIPTION_KEY,new Set),this.subscribers.get(o.GLOBAL_SUBSCRIPTION_KEY).add(e),()=>{let t=this.subscribers.get(o.GLOBAL_SUBSCRIPTION_KEY);t&&(t.delete(e),t.size===0&&this.subscribers.delete(o.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(a){this.logger?.error("Error in initial callback",{key:e,error:a})}}),()=>{let r=this.subscribers.get(e);r&&(r.delete(t),r.size===0&&this.subscribers.delete(e))}}createDummyState(){let e={get:(t,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 n=0;n<e.length;n++)if(!this.isEqual(e[n],t[n]))return!1;return!0}let a=Object.keys(e),i=Object.keys(t);return a.length!==i.length?!1:a.every(n=>Object.prototype.hasOwnProperty.call(t,n)&&this.isEqual(e[n],t[n]))}extractPath(e,t){if(this.selectorPathCache.has(e))return this.selectorPathCache.get(e);let s=[],r=(a="")=>({get:(i,n)=>{if(typeof n=="symbol")return Reflect.get(i,n);let c=a?`${a}.${n}`:n;return s.push(c),new Proxy({},r(c))},has:(i,n)=>!0,ownKeys:()=>[],getOwnPropertyDescriptor:()=>({configurable:!0,enumerable:!0}),apply:(i,n,c)=>new Proxy(()=>{},r(a))});try{e(new Proxy(t,r()))}catch{}return s.length===0?"":(s.sort((a,i)=>i.length-a.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(n){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:n})}})}findChangedPaths(e,t,s="",r=new Set,a=new WeakMap){if(e===t)return r;if(typeof e!="object"||typeof t!="object"||e===null||t===null)return e!==t&&r.add(s||""),r;if(a.has(e))return r;a.set(e,!0);let i=new Set([...Object.keys(e||{}),...Object.keys(t||{})]);for(let n of i){let c=e[n],d=t[n];if(c===d)continue;let u=s?`${s}.${n}`:n;c&&d&&typeof c=="object"&&typeof d=="object"&&!Array.isArray(c)&&!Array.isArray(d)?this.findChangedPaths(c,d,u,r,a):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 a=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 n=await this.getState(),c=e(n);t(c)}catch(n){this.logger?.error("Error in selector callback",{path:r,error:n}),t(i)}};return r?this.subscribeByKey(r,a):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 n=e.valueOf();return n in t?(delete t[n],this.storage.set(this.name,t),!0):!1}let s=x(e),r=s.slice(0,-1).join("."),a=s[s.length-1],i=r?v(t,r):t;return!i||!(a in i)?!1:(delete i[a],this.storage.set(this.name,t),!0)}async doUpdate(e){let s={...this.storage.get(this.name)||{}};for(let{key:r,value:a}of e)r instanceof b&&r.isUnparseable()?s[r.valueOf()]=a:P(s,r,a);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 k}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 k;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,a=null,i=async n=>{let c=[n];if(t?.memoize&&r&&a&&t.memoize(c,r,a))return a;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(n));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(n);return d.payload=u,r=[...c],a=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 k,r,a=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}}),n=()=>{let c=s.asObservable();return e.notifyAfterSubscribe?new G(d=>{let u=!1;a().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 n.r="watchers",Object.defineProperty(n,"actionType",{value:t,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(n,"meta",{value:e.meta,writable:!1,enumerable:!0}),Object.defineProperty(n,"unsubscribe",{value:i,writable:!1,enumerable:!0}),n}async executeInWorker(e,t,s,r){return new Promise((a,i)=>{let n=`${t}_${Date.now()}_${Math.random()}`,c=d=>{d.data.requestId===n&&(e.removeEventListener("message",c),d.data.error?i(new Error(d.data.error)):a(d.data.result))};e.addEventListener("message",c),e.postMessage({type:t,args:s,requestId:n}),setTimeout(()=>{e.removeEventListener("message",c),i(new Error(`Worker execution timeout for action: ${t}`))},3e4)})}};function U(o,e){let t=new $(o),s=e(o.storage,{createAction:(r,a)=>t.createAction(r,a),createWatcher:r=>t.createWatcher(r)});for(let[r,a]of Object.entries(s))if(typeof a=="function"){let i=a.r;t[i][r]=a}return t}var St=globalThis.console;import{combineLatest as rr,merge as sr,Observable as W,of as H,pipe as ar,Subject as Y}from"rxjs";import{catchError as J,filter as ir,map as cr,share as Q,switchMap as lr,take as dr}from"rxjs/operators";import{of as $t}from"rxjs";import{concatAll as Nt,delay as Kt,mergeMap as Vt,toArray as jt}from"rxjs/operators";import{forkJoin as zt,timer as Gt}from"rxjs";import{mergeMap as Wt}from"rxjs/operators";var M=class{constructor(e,t={},s,r={},a={}){this.storage=e;this.externalStates=t;this.dispatchers=s;this.services=r;this.config=a;this.subscribeToDispatchers(),this.state$=new W(i=>{this.storage.getState().then(c=>i.next(c));let n=this.storage.subscribeToAll(()=>{this.storage.getState().then(c=>i.next(c))});return()=>n()}).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(o){if(!o.storage&&!o.createStorageFn)throw new Error('Synapse config must have either "storage" or "createStorageFn"');if(o.storage&&o.createStorageFn)throw new Error('Synapse config cannot have both "storage" and "createStorageFn". Choose one.');if(o.effects&&!o.createDispatcherFn)throw new Error('Effects require dispatcher. Add "createDispatcherFn" to config.');if(o.createEffectConfig&&!o.createDispatcherFn)throw new Error('Effect config requires dispatcher. Add "createDispatcherFn" to config.');if(o.dependencies){if(!Array.isArray(o.dependencies))throw new Error("Dependencies must be an array");o.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(o.createStorageFn&&typeof o.createStorageFn!="function")throw new Error('"createStorageFn" must be a function');if(o.createDispatcherFn&&typeof o.createDispatcherFn!="function")throw new Error('"createDispatcherFn" must be a function');if(o.createSelectorsFn&&typeof o.createSelectorsFn!="function")throw new Error('"createSelectorsFn" must be a function');if(o.createEffectConfig&&typeof o.createEffectConfig!="function")throw new Error('"createEffectConfig" must be a function');if(o.effects){if(!Array.isArray(o.effects))throw new Error("Effects must be an array");o.effects.forEach((e,t)=>{if(typeof e!="function")throw new Error(`Effect at index ${t} must be a function`)})}if(o.externalSelectors&&typeof o.externalSelectors!="object")throw new Error("External selectors must be an object")}async function Z(o=[]){o.length!==0&&await Promise.all(o.map(async(e,t)=>{try{await e.storage.waitForReady()}catch(s){throw new Error(`Dependency ${t} initialization failed: ${s}`)}}))}async function F(o){try{X(o)}catch(n){throw n}await Z(o.dependencies);let e=o.createStorageFn?await o.createStorageFn():o.storage;await e.waitForReady();let t=[],s={storage:e,selectors:{},destroy:async()=>{for(let n of t)await n()}};t.push(()=>e.destroy());let r,a,i;if(o.createSelectorsFn)try{a=new C(e);let n=o.externalSelectors||{};s.selectors=o.createSelectorsFn(a,n),typeof a.destroy=="function"&&t.push(()=>a.destroy())}catch{}if(o.createDispatcherFn&&(r=o.createDispatcherFn(e),s.dispatcher=r,r&&"dispatch"in r&&(s.actions=r.dispatch,typeof r.destroy=="function"&&t.push(()=>r.destroy()))),o.createEffectConfig&&r)try{let{dispatchers:n,api:c,config:d,externalStates:u}=o.createEffectConfig(r),p=u||{};i=new M(e,p,n,c,d),Array.isArray(o.effects)&&o.effects.forEach(l=>{i&&i.add(l)}),await i.start(),s.state$=i.state$,t.push(()=>{i&&i.stop()})}catch{}return s}function ee(o,e){return e==="*"?!0:e.includes("*")?new RegExp("^"+e.replace(/\*/g,".*")+"$").test(o):o===e}async function te(o,e){let t=await o.getState(),s=Object.entries(t.events||{});if(s.length>e){let a=s.sort((i,n)=>n[1].timestamp-i[1].timestamp).slice(0,e);await o.set("events",Object.fromEntries(a))}}var re=(o={})=>F({createStorageFn:async()=>new D({name:o.name||"eventBus",initialState:{events:{},subscriptions:{}}}).initialize(),createDispatcherFn:e=>U({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:a,metadata:i={}})=>{let n=`${r}_${Date.now()}_${Math.random()}`;return await t.set(`events.${n}`,{id:n,event:r,data:a,metadata:{ttl:i.ttl||null,priority:i.priority||"normal",...i},timestamp:Date.now()}),o.autoCleanup&&await te(t,o.maxEvents||1e3),{eventId:n,event:r,data:a}}}),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:a,options:i={}})=>{let n=`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{a(u.data,u)}catch{}}})});return await t.set(`subscriptions.${n}`,{id:n,pattern:r,options:i,createdAt:Date.now()}),{subscriptionId:n,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:a=100})=>{let i=await t.getState();return Object.values(i.events||{}).filter(n=>n.event===r).sort((n,c)=>c.timestamp-n.timestamp).slice(0,a)}}),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 a=Date.now()-r;await t.update(i=>{Object.keys(i.events||{}).forEach(n=>{i.events[n].timestamp<a&&delete i.events[n]})})}else await t.set("events",{})}}),getActiveSubscriptions:s({type:"GET_SUBSCRIPTIONS",meta:{description:"\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043F\u043E\u0434\u043F\u0438\u0441\u043E\u043A"},action:async()=>{let r=await t.getState();return Object.values(r.subscriptions||{})}})}))});function se(o){let e="pending",t,s=null,r=new Set,a=new Set,i=(async()=>{try{let n=await(o instanceof Promise?o:Promise.resolve(o));return await n.storage.waitForReady(),t=n,e="ready",r.forEach(c=>{try{c(t)}catch{}}),n}catch(n){let c=n instanceof Error?n:new Error(String(n));throw s=c,e="error",a.forEach(d=>{try{d(c)}catch{}}),c}})();return{waitForReady:()=>i,isReady:()=>e==="ready",getStoreIfReady:()=>t,onReady:n=>{if(e==="ready"&&t)try{n(t)}catch{}else r.add(n);return()=>{r.delete(n)}},onError:n=>{if(e==="error"&&s)try{n(s)}catch{}else a.add(n);return()=>{a.delete(n)}},getStatus:()=>e,getError:()=>s,destroy:()=>{r.clear(),a.clear(),t=void 0,s=null,e="pending"}}}export{re as createEventBus,F as createSynapse,se as createSynapseAwaiter};
|
|
1
|
+
var y=!1,D=new Map;function U(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 b(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(!b(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)?b(a[r],e[r]):!1)}return!1}function V(a,e=b){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 O=class{constructor(e,t,s=b,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}},B=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=U(i)}else{let i=t.map(c=>c.getId()).join("_"),o=s.toString();n=U(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(D.has(i)){let u=D.get(i);return u.refCount++,u.api}let o,c,d=[];if(r){let u=V(e,n.equals||b),g=this.createSimpleSelector(u,{...n,name:i,equals:n.equals||b});o=g.api,d=g.unsubscribeFunctions}else{c=e;let u=this.createCombinedSelector(c,t,{...n,name:i,equals:n.equals||b});o=u.api,d=u.unsubscribeFunctions}return this.localSelectorCache.set(i,{api:o,dependencies:c,unsubscribeFunctions:d}),D.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 O(t.name,s,t.equals||b,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=V(g=>t(...g),s.equals||b),n=async()=>{let g=await Promise.all(e.map(l=>l.select()));return r(g)},i=new O(s.name,n,s.equals||b,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(g=>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:g}))},10)},u=e.map(g=>g.subscribe({notify:()=>{d()}}));return{api:{select:()=>n(),subscribe:g=>i.subscribe(g),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=D.get(t);s&&(s.refCount--,s.refCount<=0&&(s.unsubscribeFunctions.forEach(r=>r()),D.delete(t)))})}};var v=class{static instances=new Map;static configs=new Map;static logger;static setLogger(e){this.logger=e}static getOrCreate(e,t,s){let r=this.configs.get(e),n=this.instances.get(e);if(n&&r){let o=this.mergeConfigurations(r,t);return{instance:n,isNewInstance:!1,appliedConfig:o.finalConfig,conflicts:o.conflicts}}let i=s(t);return this.instances.set(e,i),this.configs.set(e,{...t}),this.logger?.debug(`Created new singleton instance: ${e}`),{instance:i,isNewInstance:!0,appliedConfig:t,conflicts:[]}}static exists(e){return this.instances.has(e)}static getConfig(e){return this.configs.get(e)}static remove(e){let t=this.instances.get(e);return t?(typeof t.destroy=="function"&&t.destroy(),this.instances.delete(e),this.configs.delete(e),this.logger?.debug(`Removed singleton instance: ${e}`),!0):!1}static clear(){for(let[e,t]of this.instances)typeof t.destroy=="function"&&t.destroy();this.instances.clear(),this.configs.clear(),this.logger?.debug("Cleared all singleton instances")}static getStats(){return{instanceCount:this.instances.size,instances:Array.from(this.instances.keys())}}static mergeConfigurations(e,t){let s=t.singleton?.mergeStrategy||"first_wins",r=t.singleton?.warnOnConflict??!0;switch(s){case"strict":return this.strictMerge(e,t);case"first_wins":return this.firstWinsMerge(e,t,r);case"deep_merge":return this.deepMerge(e,t);case"override":return this.overrideMerge(e,t);case"warn_and_use_first":return this.warnAndUseFirst(e,t);default:return this.firstWinsMerge(e,t,r)}}static strictMerge(e,t){let s=this.findConflicts(e,t);if(s.length>0)throw new Error(`Strict singleton validation failed for "${e.name}". Conflicts: ${s.join(", ")}`);return{finalConfig:e,conflicts:[]}}static firstWinsMerge(e,t,s){let r=this.findConflicts(e,t);return s&&r.length>0&&(this.logger?.warn(`Singleton config conflicts for "${e.name}":`,r),this.logger?.warn("Using existing configuration")),{finalConfig:e,conflicts:r}}static deepMerge(e,t){let s=this.findConflicts(e,t),r={...e,initialState:this.deepMergeObjects(e.initialState||{},t.initialState||{})};return this.logger?.debug(`Deep merged singleton config for "${e.name}"`),{finalConfig:r,conflicts:s}}static overrideMerge(e,t){let s=this.findConflicts(e,t),r={...t,name:e.name};return this.logger?.warn(`Overriding singleton config for "${e.name}"`),{finalConfig:r,conflicts:s}}static warnAndUseFirst(e,t){let s=this.findConflicts(e,t);return s.length>0&&(this.logger?.warn(`Configuration conflicts detected for singleton "${e.name}":`),this.logger?.warn("Existing config:",e),this.logger?.warn("Incoming config:",t),this.logger?.warn("Using existing configuration")),{finalConfig:e,conflicts:s}}static findConflicts(e,t){let s=[];if(e.initialState&&t.initialState){let r=this.findObjectConflicts(e.initialState,t.initialState,"initialState");s.push(...r)}else e.initialState!==t.initialState&&s.push("initialState: one is undefined");return!!e.middlewares!=!!t.middlewares&&s.push("middlewares: configuration differs"),s}static findObjectConflicts(e,t,s){let r=[],n=new Set([...Object.keys(e||{}),...Object.keys(t||{})]);for(let i of n){let o=`${s}.${i}`,c=e?.[i],d=t?.[i];c!==d&&(c===void 0||d===void 0?r.push(`${o}: missing in one config`):typeof c!=typeof d?r.push(`${o}: type mismatch (${typeof c} vs ${typeof d})`):typeof c=="object"&&c!==null&&d!==null?r.push(...this.findObjectConflicts(c,d,o)):r.push(`${o}: value mismatch (${c} vs ${d})`))}return r}static deepMergeObjects(e,t){let s={...e};for(let r in t)t[r]!==null&&typeof t[r]=="object"&&!Array.isArray(t[r])?s[r]=this.deepMergeObjects(e[r]||{},t[r]):s[r]=t[r];return s}},R=class{static generate(e,t){return e.singleton?.key?e.singleton.key:`${t}_${e.name}`}};var A=class{static handleSingletonCreation(e,t,s,r){if(!e.singleton?.enabled)return s(e);r&&v.setLogger(r);let n=R.generate(e,t),i=v.getOrCreate(n,e,s);return i.isNewInstance?r?.debug(`Created new singleton storage: ${n}`):(r?.debug(`Reusing existing singleton storage: ${n}`),i.conflicts&&i.conflicts.length>0&&r?.debug(`Configuration conflicts detected: ${i.conflicts.join(", ")}`)),i.instance}};var T=class{constructor(e,t=!1){this.value=e;this.isRawKey=t}toString(){return this.value}toJSON(){return this.value}valueOf(){return this.value}isUnparseable(){return this.isRawKey}};var _=(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 p=new Map;for(let h of l){let S=`${h.type}_${h.key?.toString()||"default"}`;p.set(S,h)}return Array.from(p.values())},c=l=>{let p=r.get(l);p&&(globalThis.clearTimeout(p),r.delete(l))},d=(l,p)=>{let h=globalThis.setTimeout(p,t);r.set(l,h)},u=async(l,p,h)=>{let S=s.get(l);if(!(!S||S.length===0)){s.delete(l),c(l);try{let x=S.map(f=>f.action),m=o(x);for(let f of m)try{let N=await h(f);S.filter(w=>w.action.type===f.type&&w.action.key?.toString()===f.key?.toString()).forEach(w=>w.resolve(N))}catch(N){S.filter(w=>w.action.type===f.type&&w.action.key?.toString()===f.key?.toString()).forEach(w=>w.reject(N))}}catch(x){S.forEach(m=>m.reject(x))}}},g=async(l,p,h)=>new Promise((S,x)=>{let m=i(l),f=s.get(m);f||(f=[],s.set(m,f)),f.push({action:l,resolve:S,reject:x,timestamp:Date.now()}),c(m),f.length>=e?setImmediate(()=>u(m,p,h)):d(m,()=>u(m,p,h))});return{name:"batching",setup:()=>{},cleanup:async()=>{r.forEach(l=>globalThis.clearTimeout(l)),r.clear(),s.clear()},reducer:l=>p=>async h=>n(h)?g(h,l,p):p(h)}};var k=(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 $=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 P(a){return a instanceof T&&a.isUnparseable()?[a.toString()]:a.toString().replace(/\[/g,".").replace(/\]/g,"").split(".").filter(Boolean)}function E(a,e){return P(e).reduce((s,r)=>s===void 0?void 0:s[r],a)}function M(a,e,t){if(e==="")return t;let s=P(e);if(e instanceof T&&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 I=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 $({getState:this.getState.bind(this),doGet:this.doGet.bind(this),doSet:this.doSet.bind(this),doUpdate:this.doUpdate.bind(this),doDelete:this.doDelete.bind(this),doClear:this.doClear.bind(this),doKeys:this.doKeys.bind(this),notifySubscribers:this.notifySubscribers.bind(this),pluginExecutor:this.pluginExecutor,eventEmitter:this.eventEmitter,logger:this.logger}),this.initializeMiddlewares()}static GLOBAL_SUBSCRIPTION_KEY="*";static STORAGE_TYPE;name;e={status:"idle"};statusSubscribers=new Set;selectorPathCache=new WeakMap;middlewareModule;initializedMiddlewares=null;subscribers=new Map;get initStatus(){return{...this.e}}async waitForReady(){if(this.e.status==="ready")return this;if(this.e.status==="error")throw this.e.error||new Error("Storage initialization failed");return new Promise((e,t)=>{let 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={})=>_(e),shallowCompare:(e={})=>k(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 p=l.split(".")[0];i.add(p)}let o=await Promise.all(Array.from(i).map(async l=>{let p={...t,key:l},h=await this.pluginExecutor?.executeBeforeSet(r[l],p)??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 g={};u.forEach(l=>{g[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:g,changedPaths:Array.from(n)});for(let l of n)try{let p=l.split(".")[0];if(p in g){let h;if(l===p)h=g[p];else{let S=l.substring(p.length+1);h=E(g[p],S)}h!==void 0&&this.notifySubscribers(l,h)}}catch(p){this.logger?.error("Error notifying path subscribers",{path:l,error:p})}await this.emitEvent({type:"storage:update",payload:{state:g,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)===!1)return;let r=await this.middlewareModule.dispatch({type:"delete",key:e,metadata:t});if(r===!1)return;await this.pluginExecutor?.executeAfterDelete(e,t);let i=[e.toString()];this.notifySubscribers(e,void 0),this.notifySubscribers(a.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:void 0,result:r,changedPaths:i}),await this.emitEvent({type:"storage:update",payload:{key:e,value:void 0,result:r,changedPaths:i}})}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{if(await this.clear(),await this.doDestroy(),this.initializedMiddlewares&&(await Promise.all(this.initializedMiddlewares.map(async e=>{"cleanup"in e&&await e.cleanup?.()})),this.initializedMiddlewares=null),this.statusSubscribers.clear(),this.config.singleton?.enabled){let e=this.constructor.STORAGE_TYPE,t=R.generate(this.config,e);v.remove(t)}this.updateInitStatus({status:"idle"}),await this.emitEvent({type:"storage:destroy"})}catch(e){throw this.logger?.error("Error destroying storage",{error:e}),e}}subscribeByKey(e,t){this.subscribers.has(e)||this.subscribers.set(e,new Set);let 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 C=class a extends I{static STORAGE_TYPE="memory";storage=new Map;constructor(e,t,s,r){super(e,t,s,r)}static create(e,t,s,r){return A.handleSingletonCreation(e,this.STORAGE_TYPE,n=>new a(n,t,s,r),r)}async doInitialize(){try{return this.logger?.debug(`Initializing MemoryStorage "${this.name}"`),this.initializeMiddlewares(),await this.initializeWithMiddlewares(),this.logger?.debug(`MemoryStorage "${this.name}" initialized successfully`),this}catch(e){throw this.logger?.error("Error initializing MemoryStorage",{error:e}),e}}async doGet(e){let t=this.storage.get(this.name);if(t)return e instanceof T&&e.isUnparseable()?t[e.valueOf()]:E(t,e)}async doSet(e,t){let s=this.storage.get(this.name)||{};if(e instanceof T&&e.isUnparseable()){s[e.valueOf()]=t,this.storage.set(this.name,s);return}let r=M({...s},e,t);this.storage.set(this.name,r)}async doDelete(e){let t=this.storage.get(this.name);if(!t)return!1;if(e instanceof T&&e.isUnparseable()){let o=e.valueOf();return o in t?(delete t[o],this.storage.set(this.name,t),!0):!1}let s=P(e),r=s.slice(0,-1).join("."),n=s[s.length-1],i=r?E(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 T&&r.isUnparseable()?s[r.valueOf()]=n:M(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 Q,Subject as L}from"rxjs";var K=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 L;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 g=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 p=this.middlewareFunctions[l],h=g;g=async S=>p(async m=>h(m))(S)}u=await g(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 L,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 Q(d=>{let u=!1;n().then(l=>{if(!e.shouldTrigger||e.shouldTrigger(void 0,l)){let p={type:t,payload:l,meta:{...e.meta,isInitial:!0}};d.next(p),r=l,u=!0}}).catch(l=>{d.error(l)});let g=c.subscribe({next:l=>{u&&l.payload===r||d.next(l)},error:l=>d.error(l),complete:()=>d.complete()});return()=>{g.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 G(a,e){let t=new K(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 jt=globalThis.console;import{combineLatest as Er,merge as xr,Observable as Z,of as ee,pipe as Ar,Subject as te}from"rxjs";import{catchError as re,filter as Ir,map as Cr,share as se,switchMap as Dr,take as Mr}from"rxjs/operators";import{of as tr}from"rxjs";import{concatAll as sr,delay as nr,mergeMap as or,toArray as ir}from"rxjs/operators";import{forkJoin as dr,timer as gr}from"rxjs";import{mergeMap as hr}from"rxjs/operators";var F=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 Z(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(se())}effects=[];subscriptions=[];running=!1;action$=new te;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(re(r=>ee(null))).subscribe(r=>{if(r!=null&&typeof r=="function")try{r()}catch{}});this.subscriptions.push(s)}catch{}}};function ne(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 oe(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 j(a){try{ne(a)}catch(o){throw o}await oe(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 B(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),g=u||{};i=new F(e,g,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 ie(a,e){return e==="*"?!0:e.includes("*")?new RegExp("^"+e.replace(/\*/g,".*")+"$").test(a):a===e}async function ae(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 ce=(a={})=>j({createStorageFn:async()=>new C({name:a.name||"eventBus",initialState:{events:{},subscriptions:{}}}).initialize(),createDispatcherFn:e=>G({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 ae(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(ie(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||{})}})}))});function le(a){let e="pending",t,s=null,r=new Set,n=new Set,i=(async()=>{try{let o=await(a instanceof Promise?a:Promise.resolve(a));return await o.storage.waitForReady(),t=o,e="ready",r.forEach(c=>{try{c(t)}catch{}}),o}catch(o){let c=o instanceof Error?o:new Error(String(o));throw s=c,e="error",n.forEach(d=>{try{d(c)}catch{}}),c}})();return{waitForReady:()=>i,isReady:()=>e==="ready",getStoreIfReady:()=>t,onReady:o=>{if(e==="ready"&&t)try{o(t)}catch{}else r.add(o);return()=>{r.delete(o)}},onError:o=>{if(e==="error"&&s)try{o(s)}catch{}else n.add(o);return()=>{n.delete(o)}},getStatus:()=>e,getError:()=>s,destroy:()=>{r.clear(),n.clear(),t=void 0,s=null,e="pending"}}}export{ce as createEventBus,j as createSynapse,le as createSynapseAwaiter};
|