synapse-storage 4.1.2 → 5.0.3
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 +142 -12
- package/dist/_utils/chunk.util.d.ts +0 -1
- package/dist/_utils/deepMerge.util.d.ts +0 -1
- package/dist/_utils/error-handling.util.d.ts +0 -1
- package/dist/_utils/flatMap.util.d.ts +0 -1
- package/dist/_utils/index.d.ts +0 -1
- package/dist/_utils/logger-console.util.d.ts +0 -1
- package/dist/api/api.module.d.ts +0 -1
- package/dist/api/components/endpoint.d.ts +11 -12
- package/dist/api/components/endpoint.js.map +1 -1
- package/dist/api/components/query-storage.d.ts +0 -1
- package/dist/api/components/query-storage.js +1 -1
- package/dist/api/components/query-storage.js.map +1 -1
- package/dist/api/index.d.ts +0 -1
- package/dist/api/types/api.interface.d.ts +0 -1
- package/dist/api/types/endpoint.interface.d.ts +0 -1
- package/dist/api/types/query.interface.d.ts +0 -1
- package/dist/api/utils/api-helpers.d.ts +0 -1
- package/dist/{core/storage → api}/utils/cache.util.d.ts +3 -6
- package/dist/{core/storage → api}/utils/cache.util.js +4 -7
- package/dist/api/utils/cache.util.js.map +1 -0
- package/dist/api/utils/create-header-context.d.ts +0 -1
- package/dist/api/utils/endpoint-headers.d.ts +0 -1
- package/dist/api/utils/fetch-base-query.d.ts +0 -1
- package/dist/api/utils/file-utils.d.ts +0 -1
- package/dist/api/utils/get-cacheable-headers.d.ts +0 -1
- package/dist/core/index.d.ts +0 -1
- package/dist/core/selector/index.d.ts +1 -1
- package/dist/core/selector/index.js +2 -0
- package/dist/core/selector/index.js.map +1 -1
- package/dist/core/selector/selector.interface.d.ts +15 -30
- package/dist/core/selector/selector.interface.js +2 -2
- package/dist/core/selector/selector.interface.js.map +1 -1
- package/dist/core/selector/selector.module.d.ts +16 -1
- package/dist/core/selector/selector.module.js +82 -20
- package/dist/core/selector/selector.module.js.map +1 -1
- package/dist/core/selector/selectors.base.d.ts +56 -0
- package/dist/core/selector/selectors.base.js +118 -0
- package/dist/core/selector/selectors.base.js.map +1 -0
- package/dist/core/storage/adapters/async-base-storage.service.d.ts +15 -4
- package/dist/core/storage/adapters/async-base-storage.service.js +106 -36
- package/dist/core/storage/adapters/async-base-storage.service.js.map +1 -1
- package/dist/core/storage/adapters/indexed-DB.service.d.ts +4 -5
- package/dist/core/storage/adapters/indexed-DB.service.js +66 -14
- package/dist/core/storage/adapters/indexed-DB.service.js.map +1 -1
- package/dist/core/storage/adapters/local-storage.service.d.ts +9 -4
- package/dist/core/storage/adapters/local-storage.service.js +25 -5
- package/dist/core/storage/adapters/local-storage.service.js.map +1 -1
- package/dist/core/storage/adapters/memory-storage.service.d.ts +2 -4
- package/dist/core/storage/adapters/memory-storage.service.js +5 -5
- package/dist/core/storage/adapters/memory-storage.service.js.map +1 -1
- package/dist/core/storage/adapters/path.utils.d.ts +0 -1
- package/dist/core/storage/adapters/storage-core.d.ts +6 -2
- package/dist/core/storage/adapters/storage-core.js +6 -3
- package/dist/core/storage/adapters/storage-core.js.map +1 -1
- package/dist/core/storage/adapters/sync-base-storage.service.d.ts +20 -4
- package/dist/core/storage/adapters/sync-base-storage.service.js +110 -35
- package/dist/core/storage/adapters/sync-base-storage.service.js.map +1 -1
- package/dist/core/storage/index.d.ts +2 -5
- package/dist/core/storage/index.js +1 -5
- package/dist/core/storage/index.js.map +1 -1
- package/dist/core/storage/middlewares/broadcast.middleware.d.ts +0 -1
- package/dist/core/storage/middlewares/index.d.ts +3 -1
- package/dist/core/storage/middlewares/index.js +6 -0
- package/dist/core/storage/middlewares/index.js.map +1 -1
- package/dist/core/storage/middlewares/storage-batching.middleware.d.ts +0 -1
- package/dist/core/storage/middlewares/storage-logger.middleware.d.ts +20 -0
- package/dist/core/storage/middlewares/storage-logger.middleware.js +53 -0
- package/dist/core/storage/middlewares/storage-logger.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.d.ts +0 -1
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.js +4 -10
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.js.map +1 -1
- package/dist/core/storage/middlewares/sync-broadcast.middleware.d.ts +0 -1
- package/dist/core/storage/middlewares/sync-storage-batching.middleware.d.ts +0 -1
- package/dist/core/storage/middlewares/sync-storage-logger.middleware.d.ts +7 -0
- package/dist/core/storage/middlewares/sync-storage-logger.middleware.js +48 -0
- package/dist/core/storage/middlewares/sync-storage-logger.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.d.ts +0 -1
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.js +4 -10
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.js.map +1 -1
- package/dist/core/storage/modules/singleton/mixin.util.d.ts +0 -1
- package/dist/core/storage/modules/singleton/models.d.ts +0 -1
- package/dist/core/storage/modules/singleton/singleton.util.d.ts +0 -1
- package/dist/core/storage/storage.interface.d.ts +59 -4
- package/dist/core/storage/storage.interface.js +0 -2
- package/dist/core/storage/storage.interface.js.map +1 -1
- package/dist/core/storage/utils/broadcast.util.d.ts +0 -1
- package/dist/core/storage/utils/middleware-module.d.ts +0 -3
- package/dist/core/storage/utils/middleware-module.js +0 -8
- package/dist/core/storage/utils/middleware-module.js.map +1 -1
- package/dist/core/storage/utils/migration.util.d.ts +38 -0
- package/dist/core/storage/utils/migration.util.js +48 -0
- package/dist/core/storage/utils/migration.util.js.map +1 -0
- package/dist/core/storage/utils/path-selector.util.d.ts +0 -1
- package/dist/core/storage/utils/state-diff.util.d.ts +8 -1
- package/dist/core/storage/utils/state-diff.util.js +17 -1
- package/dist/core/storage/utils/state-diff.util.js.map +1 -1
- package/dist/core/storage/utils/storage-factory.util.d.ts +7 -9
- package/dist/core/storage/utils/storage-factory.util.js +10 -10
- package/dist/core/storage/utils/storage-factory.util.js.map +1 -1
- package/dist/core/storage/utils/storage-key.d.ts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/react/hooks/index.d.ts +2 -1
- package/dist/react/hooks/index.js +4 -0
- package/dist/react/hooks/index.js.map +1 -1
- package/dist/react/hooks/useCreateStorage.d.ts +5 -6
- package/dist/react/hooks/useCreateStorage.js +2 -2
- package/dist/react/hooks/useCreateStorage.js.map +1 -1
- package/dist/react/hooks/useObservable.d.ts +17 -0
- package/dist/react/hooks/useObservable.js +38 -0
- package/dist/react/hooks/useObservable.js.map +1 -0
- package/dist/react/hooks/useSelector.d.ts +0 -1
- package/dist/react/hooks/useSelector.js +5 -2
- package/dist/react/hooks/useSelector.js.map +1 -1
- package/dist/react/hooks/useStorage.d.ts +0 -1
- package/dist/react/hooks/useStorageSubscribe.d.ts +0 -1
- package/dist/react/hooks/useSubscription.d.ts +13 -0
- package/dist/react/hooks/useSubscription.js +23 -0
- package/dist/react/hooks/useSubscription.js.map +1 -0
- package/dist/react/index.d.ts +0 -1
- package/dist/react/utils/awaitSynapse.d.ts +9 -10
- package/dist/react/utils/awaitSynapse.js +3 -2
- package/dist/react/utils/awaitSynapse.js.map +1 -1
- package/dist/react/utils/createSynapseCtx.d.ts +18 -23
- package/dist/react/utils/createSynapseCtx.js +64 -39
- package/dist/react/utils/createSynapseCtx.js.map +1 -1
- package/dist/react/utils/index.d.ts +0 -1
- package/dist/reactive/dispatcher/dispatcher.base.d.ts +122 -0
- package/dist/reactive/dispatcher/dispatcher.base.js +294 -0
- package/dist/reactive/dispatcher/dispatcher.base.js.map +1 -0
- package/dist/reactive/dispatcher/dispatcher.module.d.ts +12 -67
- package/dist/reactive/dispatcher/dispatcher.module.js +13 -72
- package/dist/reactive/dispatcher/dispatcher.module.js.map +1 -1
- package/dist/reactive/dispatcher/index.d.ts +1 -1
- package/dist/reactive/dispatcher/index.js +2 -0
- package/dist/reactive/dispatcher/index.js.map +1 -1
- package/dist/reactive/dispatcher/middlewares/index.d.ts +0 -1
- package/dist/reactive/dispatcher/middlewares/logger.middleware.d.ts +0 -1
- package/dist/reactive/dispatcher/path.util.d.ts +15 -0
- package/dist/reactive/dispatcher/path.util.js +34 -0
- package/dist/reactive/dispatcher/path.util.js.map +1 -0
- package/dist/reactive/dispatcher/standalone.d.ts +1 -150
- package/dist/reactive/dispatcher/standalone.js +6 -217
- package/dist/reactive/dispatcher/standalone.js.map +1 -1
- package/dist/reactive/effects/effects.base.d.ts +62 -0
- package/dist/reactive/effects/effects.base.js +90 -0
- package/dist/reactive/effects/effects.base.js.map +1 -0
- package/dist/reactive/effects/effects.module.d.ts +122 -11
- package/dist/reactive/effects/effects.module.js +129 -17
- package/dist/reactive/effects/effects.module.js.map +1 -1
- package/dist/reactive/effects/index.d.ts +1 -1
- package/dist/reactive/effects/index.js +2 -0
- package/dist/reactive/effects/index.js.map +1 -1
- package/dist/reactive/effects/utils/chunkRequestConsistent.d.ts +0 -1
- package/dist/reactive/effects/utils/chunkRequestParallel.d.ts +0 -1
- package/dist/reactive/effects/utils/fromRequest.d.ts +0 -1
- package/dist/reactive/effects/utils/index.d.ts +0 -1
- package/dist/reactive/effects/utils/toObservable.d.ts +0 -1
- package/dist/reactive/index.d.ts +0 -1
- package/dist/utils/createEventBus.d.ts +47 -46
- package/dist/utils/createEventBus.js +152 -174
- package/dist/utils/createEventBus.js.map +1 -1
- package/dist/utils/createSynapse/createSynapse.d.ts +25 -7
- package/dist/utils/createSynapse/createSynapse.js +28 -98
- package/dist/utils/createSynapse/createSynapse.js.map +1 -1
- package/dist/utils/createSynapse/factory.d.ts +6 -0
- package/dist/utils/createSynapse/factory.js +256 -0
- package/dist/utils/createSynapse/factory.js.map +1 -0
- package/dist/utils/createSynapse/index.d.ts +2 -2
- package/dist/utils/createSynapse/index.js.map +1 -1
- package/dist/utils/createSynapse/synapse.types.d.ts +87 -0
- package/dist/utils/createSynapse/synapse.types.js +11 -0
- package/dist/utils/createSynapse/synapse.types.js.map +1 -0
- package/dist/utils/createSynapse/types.d.ts +6 -85
- package/dist/utils/createSynapse/types.js +2 -1
- package/dist/utils/createSynapse/types.js.map +1 -1
- package/dist/utils/createSynapse/waitForDependencies.d.ts +0 -1
- package/dist/utils/createSynapse/waitForDependencies.js +1 -1
- package/dist/utils/createSynapse/waitForDependencies.js.map +1 -1
- package/dist/utils/createSynapseAwaiter.d.ts +13 -10
- package/dist/utils/createSynapseAwaiter.js +30 -3
- package/dist/utils/createSynapseAwaiter.js.map +1 -1
- package/dist/utils/dehydrateModule.d.ts +6 -0
- package/dist/utils/dehydrateModule.js +43 -0
- package/dist/utils/dehydrateModule.js.map +1 -0
- package/dist/utils/index.d.ts +3 -3
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -1
- package/package.json +12 -2
- package/dist/_utils/chunk.util.d.ts.map +0 -1
- package/dist/_utils/deepMerge.util.d.ts.map +0 -1
- package/dist/_utils/error-handling.util.d.ts.map +0 -1
- package/dist/_utils/flatMap.util.d.ts.map +0 -1
- package/dist/_utils/index.d.ts.map +0 -1
- package/dist/_utils/logger-console.util.d.ts.map +0 -1
- package/dist/api/api.module.d.ts.map +0 -1
- package/dist/api/components/endpoint.d.ts.map +0 -1
- package/dist/api/components/query-storage.d.ts.map +0 -1
- package/dist/api/example.d.ts +0 -83
- package/dist/api/example.d.ts.map +0 -1
- package/dist/api/example.js +0 -90
- package/dist/api/example.js.map +0 -1
- package/dist/api/index.d.ts.map +0 -1
- package/dist/api/types/api.interface.d.ts.map +0 -1
- package/dist/api/types/endpoint.interface.d.ts.map +0 -1
- package/dist/api/types/query.interface.d.ts.map +0 -1
- package/dist/api/utils/api-helpers.d.ts.map +0 -1
- package/dist/api/utils/create-header-context.d.ts.map +0 -1
- package/dist/api/utils/endpoint-headers.d.ts.map +0 -1
- package/dist/api/utils/fetch-base-query.d.ts.map +0 -1
- package/dist/api/utils/file-utils.d.ts.map +0 -1
- package/dist/api/utils/get-cacheable-headers.d.ts.map +0 -1
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/selector/index.d.ts.map +0 -1
- package/dist/core/selector/selector.interface.d.ts.map +0 -1
- package/dist/core/selector/selector.module.d.ts.map +0 -1
- package/dist/core/storage/adapters/async-base-storage.service.d.ts.map +0 -1
- package/dist/core/storage/adapters/indexed-DB.service.d.ts.map +0 -1
- package/dist/core/storage/adapters/local-storage.service.d.ts.map +0 -1
- package/dist/core/storage/adapters/memory-storage.service.d.ts.map +0 -1
- package/dist/core/storage/adapters/path.utils.d.ts.map +0 -1
- package/dist/core/storage/adapters/storage-core.d.ts.map +0 -1
- package/dist/core/storage/adapters/sync-base-storage.service.d.ts.map +0 -1
- package/dist/core/storage/index.d.ts.map +0 -1
- package/dist/core/storage/middlewares/broadcast.middleware.d.ts.map +0 -1
- package/dist/core/storage/middlewares/index.d.ts.map +0 -1
- package/dist/core/storage/middlewares/storage-batching.middleware.d.ts.map +0 -1
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.d.ts.map +0 -1
- package/dist/core/storage/middlewares/sync-broadcast.middleware.d.ts.map +0 -1
- package/dist/core/storage/middlewares/sync-storage-batching.middleware.d.ts.map +0 -1
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.d.ts.map +0 -1
- package/dist/core/storage/modules/plugin/plugin.interface.d.ts +0 -101
- package/dist/core/storage/modules/plugin/plugin.interface.d.ts.map +0 -1
- package/dist/core/storage/modules/plugin/plugin.interface.js +0 -8
- package/dist/core/storage/modules/plugin/plugin.interface.js.map +0 -1
- package/dist/core/storage/modules/plugin/plugin.service.d.ts +0 -49
- package/dist/core/storage/modules/plugin/plugin.service.d.ts.map +0 -1
- package/dist/core/storage/modules/plugin/plugin.service.js +0 -406
- package/dist/core/storage/modules/plugin/plugin.service.js.map +0 -1
- package/dist/core/storage/modules/singleton/mixin.util.d.ts.map +0 -1
- package/dist/core/storage/modules/singleton/models.d.ts.map +0 -1
- package/dist/core/storage/modules/singleton/singleton.util.d.ts.map +0 -1
- package/dist/core/storage/storage.interface.d.ts.map +0 -1
- package/dist/core/storage/utils/broadcast.util.d.ts.map +0 -1
- package/dist/core/storage/utils/cache.util.d.ts.map +0 -1
- package/dist/core/storage/utils/cache.util.js.map +0 -1
- package/dist/core/storage/utils/middleware-module.d.ts.map +0 -1
- package/dist/core/storage/utils/path-selector.util.d.ts.map +0 -1
- package/dist/core/storage/utils/state-diff.util.d.ts.map +0 -1
- package/dist/core/storage/utils/storage-factory.util.d.ts.map +0 -1
- package/dist/core/storage/utils/storage-key.d.ts.map +0 -1
- package/dist/core/storage/utils/storage.utils.d.ts +0 -17
- package/dist/core/storage/utils/storage.utils.d.ts.map +0 -1
- package/dist/core/storage/utils/storage.utils.js +0 -57
- package/dist/core/storage/utils/storage.utils.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/react/hooks/index.d.ts.map +0 -1
- package/dist/react/hooks/useCreateStorage.d.ts.map +0 -1
- package/dist/react/hooks/useSelector.d.ts.map +0 -1
- package/dist/react/hooks/useStorage.d.ts.map +0 -1
- package/dist/react/hooks/useStorageSubscribe.d.ts.map +0 -1
- package/dist/react/index.d.ts.map +0 -1
- package/dist/react/utils/awaitSynapse.d.ts.map +0 -1
- package/dist/react/utils/createSynapseCtx.d.ts.map +0 -1
- package/dist/react/utils/index.d.ts.map +0 -1
- package/dist/reactive/dispatcher/dispatcher.module.d.ts.map +0 -1
- package/dist/reactive/dispatcher/index.d.ts.map +0 -1
- package/dist/reactive/dispatcher/middlewares/index.d.ts.map +0 -1
- package/dist/reactive/dispatcher/middlewares/logger.middleware.d.ts.map +0 -1
- package/dist/reactive/dispatcher/standalone.d.ts.map +0 -1
- package/dist/reactive/effects/effects.module.d.ts.map +0 -1
- package/dist/reactive/effects/index.d.ts.map +0 -1
- package/dist/reactive/effects/utils/chunkRequestConsistent.d.ts.map +0 -1
- package/dist/reactive/effects/utils/chunkRequestParallel.d.ts.map +0 -1
- package/dist/reactive/effects/utils/fromRequest.d.ts.map +0 -1
- package/dist/reactive/effects/utils/index.d.ts.map +0 -1
- package/dist/reactive/effects/utils/toObservable.d.ts.map +0 -1
- package/dist/reactive/index.d.ts.map +0 -1
- package/dist/utils/createEventBus.d.ts.map +0 -1
- package/dist/utils/createSynapse/createSynapse.d.ts.map +0 -1
- package/dist/utils/createSynapse/index.d.ts.map +0 -1
- package/dist/utils/createSynapse/types.d.ts.map +0 -1
- package/dist/utils/createSynapse/validate.d.ts +0 -2
- package/dist/utils/createSynapse/validate.d.ts.map +0 -1
- package/dist/utils/createSynapse/validate.js +0 -76
- package/dist/utils/createSynapse/validate.js.map +0 -1
- package/dist/utils/createSynapse/waitForDependencies.d.ts.map +0 -1
- package/dist/utils/createSynapseAwaiter.d.ts.map +0 -1
- package/dist/utils/index.d.ts.map +0 -1
|
@@ -68,7 +68,6 @@ export declare class AsyncMiddlewareModule {
|
|
|
68
68
|
private middlewares;
|
|
69
69
|
private api;
|
|
70
70
|
private initialized;
|
|
71
|
-
private depth;
|
|
72
71
|
private dispatchFn;
|
|
73
72
|
constructor(storage: any);
|
|
74
73
|
private baseOperation;
|
|
@@ -83,7 +82,6 @@ export declare class SyncMiddlewareModule {
|
|
|
83
82
|
private middlewares;
|
|
84
83
|
private api;
|
|
85
84
|
private initialized;
|
|
86
|
-
private depth;
|
|
87
85
|
private dispatchFn;
|
|
88
86
|
constructor(storage: any);
|
|
89
87
|
private baseOperation;
|
|
@@ -91,4 +89,3 @@ export declare class SyncMiddlewareModule {
|
|
|
91
89
|
use(middleware: SyncMiddleware): void;
|
|
92
90
|
dispatch(action: StorageAction): any;
|
|
93
91
|
}
|
|
94
|
-
//# sourceMappingURL=middleware-module.d.ts.map
|
|
@@ -11,7 +11,6 @@ class AsyncMiddlewareModule {
|
|
|
11
11
|
middlewares = [];
|
|
12
12
|
api;
|
|
13
13
|
initialized = false;
|
|
14
|
-
depth = 0;
|
|
15
14
|
dispatchFn;
|
|
16
15
|
constructor(storage){
|
|
17
16
|
this.api = {
|
|
@@ -118,13 +117,10 @@ class AsyncMiddlewareModule {
|
|
|
118
117
|
if (!this.initialized) {
|
|
119
118
|
this.initializeMiddlewares();
|
|
120
119
|
}
|
|
121
|
-
this.depth++;
|
|
122
120
|
try {
|
|
123
121
|
return await this.dispatchFn(action);
|
|
124
122
|
} catch (error) {
|
|
125
123
|
handleOperationError('AsyncMiddlewareModule: error in middleware chain', error);
|
|
126
|
-
} finally{
|
|
127
|
-
this.depth--;
|
|
128
124
|
}
|
|
129
125
|
}
|
|
130
126
|
}
|
|
@@ -135,7 +131,6 @@ class SyncMiddlewareModule {
|
|
|
135
131
|
middlewares = [];
|
|
136
132
|
api;
|
|
137
133
|
initialized = false;
|
|
138
|
-
depth = 0;
|
|
139
134
|
dispatchFn;
|
|
140
135
|
constructor(storage){
|
|
141
136
|
this.api = {
|
|
@@ -242,13 +237,10 @@ class SyncMiddlewareModule {
|
|
|
242
237
|
if (!this.initialized) {
|
|
243
238
|
this.initializeMiddlewares();
|
|
244
239
|
}
|
|
245
|
-
this.depth++;
|
|
246
240
|
try {
|
|
247
241
|
return this.dispatchFn(action);
|
|
248
242
|
} catch (error) {
|
|
249
243
|
handleOperationError('SyncMiddlewareModule: error in middleware chain', error);
|
|
250
|
-
} finally{
|
|
251
|
-
this.depth--;
|
|
252
244
|
}
|
|
253
245
|
}
|
|
254
246
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core/storage/utils/middleware-module.js","sources":["../../../../src/core/storage/utils/middleware-module.ts"],"sourcesContent":["import { handleOperationError } from '../../../_utils/error-handling.util'\nimport { StorageKeyType } from './storage-key'\n\n/**\n * Sentinel object returned by middleware to signal that the value has not changed.\n * BaseStorage checks for this by reference equality to skip subscriber notifications.\n */\nexport const VALUE_NOT_CHANGED: unique symbol = Symbol('VALUE_NOT_CHANGED')\n\nexport type StorageActionType = 'get' | 'set' | 'delete' | 'clear' | 'init' | 'keys' | 'update' | 'reset'\n\nexport type StorageAction = {\n type: StorageActionType\n key?: StorageKeyType\n value?: any\n metadata?: Record<string, any>\n source?: string\n timestamp?: number\n}\n\n// ─── Async Middleware Types ────────────────────────────────────────────────────\n\nexport type MiddlewareAPI = {\n dispatch: (action: StorageAction) => Promise<any>\n getState: () => Promise<Record<string, any>>\n storage: {\n doGet: (key: StorageKeyType) => Promise<any>\n doSet: (key: StorageKeyType, value: any) => Promise<void>\n doUpdate: (updates: Array<{ key: StorageKeyType; value: any }>) => Promise<void>\n doDelete: (key: StorageKeyType) => Promise<boolean>\n doClear: () => Promise<void>\n doKeys: () => Promise<string[]>\n notifySubscribers: (key: StorageKeyType, value: any) => void\n }\n}\n\nexport type NextFunction = (action: StorageAction) => Promise<any>\n\nexport type SetupEventsFunction = (api: MiddlewareAPI) => void\n\nexport type Middleware = {\n name: string\n setup?: SetupEventsFunction\n cleanup?: () => Promise<void> | void\n reducer: (api: MiddlewareAPI) => (next: NextFunction) => (action: StorageAction) => Promise<any>\n}\n\n// Алиасы для явного разделения\nexport type AsyncMiddlewareAPI = MiddlewareAPI\nexport type AsyncNextFunction = NextFunction\nexport type AsyncMiddleware = Middleware\n\n// ─── Sync Middleware Types ─────────────────────────────────────────────────────\n\nexport type SyncMiddlewareAPI = {\n dispatch: (action: StorageAction) => any\n getState: () => Record<string, any>\n storage: {\n doGet: (key: StorageKeyType) => any\n doSet: (key: StorageKeyType, value: any) => void\n doUpdate: (updates: Array<{ key: StorageKeyType; value: any }>) => void\n doRemove: (key: StorageKeyType) => boolean\n doClear: () => void\n doKeys: () => string[]\n notifySubscribers: (key: StorageKeyType, value: any) => void\n }\n}\n\nexport type SyncNextFunction = (action: StorageAction) => any\n\nexport type SyncSetupEventsFunction = (api: SyncMiddlewareAPI) => void\n\nexport type SyncMiddleware = {\n name: string\n setup?: SyncSetupEventsFunction\n cleanup?: () => void\n reducer: (api: SyncMiddlewareAPI) => (next: SyncNextFunction) => (action: StorageAction) => any\n}\n\n// ─── Async Middleware Module ───────────────────────────────────────────────────\n\nexport class AsyncMiddlewareModule {\n private middlewares: Middleware[] = []\n\n private api: MiddlewareAPI\n\n private initialized = false\n\n private depth = 0\n\n private dispatchFn!: (action: StorageAction) => Promise<any>\n\n constructor(storage: any) {\n this.api = {\n dispatch: async (action: StorageAction) => this.dispatch(action),\n getState: () => storage.getState(),\n storage: {\n doGet: storage.doGet.bind(storage),\n doSet: storage.doSet.bind(storage),\n doUpdate: storage.doUpdate.bind(storage),\n doDelete: storage.doDelete.bind(storage),\n doClear: storage.doClear.bind(storage),\n doKeys: storage.doKeys.bind(storage),\n notifySubscribers: storage.notifySubscribers.bind(storage),\n },\n }\n }\n\n private async baseOperation(action: StorageAction): Promise<any> {\n switch (action.type) {\n case 'get': {\n return this.api.storage.doGet(action.key!)\n }\n\n case 'set': {\n await this.api.storage.doSet(action.key!, action.value)\n return this.api.storage.doGet(action.key!)\n }\n\n case 'update': {\n if (Array.isArray(action.value)) {\n await this.api.storage.doUpdate(action.value)\n return this.api.storage.doGet('')\n }\n return action.value\n }\n\n case 'delete': {\n return this.api.storage.doDelete(action.key!)\n }\n\n case 'clear': {\n return this.api.storage.doClear()\n }\n\n case 'reset': {\n if (action.value) {\n await this.api.storage.doClear()\n await this.api.storage.doSet('', action.value)\n return this.api.storage.doGet('')\n }\n return this.api.storage.doClear()\n }\n\n case 'init': {\n const currentState = await this.api.storage.doGet('')\n if (Object.keys(currentState || {}).length > 0) {\n return currentState\n }\n if (action.value) {\n await this.api.storage.doSet('', action.value)\n return this.api.storage.doGet('')\n }\n return currentState\n }\n\n case 'keys': {\n return this.api.storage.doKeys()\n }\n\n default: {\n throw new Error(`Unknown action type: ${action.type}`)\n }\n }\n }\n\n private initializeMiddlewares() {\n if (this.initialized) return\n\n let chain = this.baseOperation.bind(this)\n\n for (const middleware of [...this.middlewares].reverse()) {\n const nextChain = chain\n chain = async (action) => {\n const actionWithMeta = {\n ...action,\n metadata: {\n ...action.metadata,\n timestamp: action.metadata?.timestamp || Date.now(),\n },\n }\n\n return middleware.reducer(this.api)(nextChain)(actionWithMeta)\n }\n }\n\n this.dispatchFn = chain\n this.initialized = true\n }\n\n use(middleware: Middleware): void {\n if (middleware.setup) {\n middleware.setup(this.api)\n }\n\n this.middlewares.push(middleware)\n this.initialized = false\n }\n\n async dispatch(action: StorageAction): Promise<any> {\n if (!this.initialized) {\n this.initializeMiddlewares()\n }\n\n this.depth++\n try {\n return await this.dispatchFn(action)\n } catch (error) {\n handleOperationError('AsyncMiddlewareModule: error in middleware chain', error)\n } finally {\n this.depth--\n }\n }\n}\n\n/** @deprecated Use AsyncMiddlewareModule */\nexport class MiddlewareModule extends AsyncMiddlewareModule {}\n\n// ─── Sync Middleware Module ────────────────────────────────────────────────────\n\nexport class SyncMiddlewareModule {\n private middlewares: SyncMiddleware[] = []\n\n private api: SyncMiddlewareAPI\n\n private initialized = false\n\n private depth = 0\n\n private dispatchFn!: (action: StorageAction) => any\n\n constructor(storage: any) {\n this.api = {\n dispatch: (action: StorageAction) => this.dispatch(action),\n getState: () => storage.getState(),\n storage: {\n doGet: storage.doGet.bind(storage),\n doSet: storage.doSet.bind(storage),\n doUpdate: storage.doUpdate.bind(storage),\n doRemove: storage.doRemove.bind(storage),\n doClear: storage.doClear.bind(storage),\n doKeys: storage.doKeys.bind(storage),\n notifySubscribers: storage.notifySubscribers.bind(storage),\n },\n }\n }\n\n private baseOperation(action: StorageAction): any {\n switch (action.type) {\n case 'get': {\n return this.api.storage.doGet(action.key!)\n }\n\n case 'set': {\n this.api.storage.doSet(action.key!, action.value)\n return this.api.storage.doGet(action.key!)\n }\n\n case 'update': {\n if (Array.isArray(action.value)) {\n this.api.storage.doUpdate(action.value)\n return this.api.storage.doGet('')\n }\n return action.value\n }\n\n case 'delete': {\n return this.api.storage.doRemove(action.key!)\n }\n\n case 'clear': {\n return this.api.storage.doClear()\n }\n\n case 'reset': {\n if (action.value) {\n this.api.storage.doClear()\n this.api.storage.doSet('', action.value)\n return this.api.storage.doGet('')\n }\n return this.api.storage.doClear()\n }\n\n case 'init': {\n const currentState = this.api.storage.doGet('')\n if (Object.keys(currentState || {}).length > 0) {\n return currentState\n }\n if (action.value) {\n this.api.storage.doSet('', action.value)\n return this.api.storage.doGet('')\n }\n return currentState\n }\n\n case 'keys': {\n return this.api.storage.doKeys()\n }\n\n default: {\n throw new Error(`Unknown action type: ${action.type}`)\n }\n }\n }\n\n private initializeMiddlewares() {\n if (this.initialized) return\n\n let chain = this.baseOperation.bind(this)\n\n for (const middleware of [...this.middlewares].reverse()) {\n const nextChain = chain\n chain = (action) => {\n const actionWithMeta = {\n ...action,\n metadata: {\n ...action.metadata,\n timestamp: action.metadata?.timestamp || Date.now(),\n },\n }\n\n return middleware.reducer(this.api)(nextChain)(actionWithMeta)\n }\n }\n\n this.dispatchFn = chain\n this.initialized = true\n }\n\n use(middleware: SyncMiddleware): void {\n if (middleware.setup) {\n middleware.setup(this.api)\n }\n\n this.middlewares.push(middleware)\n this.initialized = false\n }\n\n dispatch(action: StorageAction): any {\n if (!this.initialized) {\n this.initializeMiddlewares()\n }\n\n this.depth++\n try {\n return this.dispatchFn(action)\n } catch (error) {\n handleOperationError('SyncMiddlewareModule: error in middleware chain', error)\n } finally {\n this.depth--\n }\n }\n}\n"],"names":["handleOperationError","VALUE_NOT_CHANGED","Symbol","AsyncMiddlewareModule","storage","action","Array","currentState","Object","Error","chain","middleware","nextChain","actionWithMeta","Date","error","MiddlewareModule","SyncMiddlewareModule"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core/storage/utils/middleware-module.js","sources":["../../../../src/core/storage/utils/middleware-module.ts"],"sourcesContent":["import { handleOperationError } from '../../../_utils/error-handling.util'\nimport { StorageKeyType } from './storage-key'\n\n/**\n * Sentinel object returned by middleware to signal that the value has not changed.\n * BaseStorage checks for this by reference equality to skip subscriber notifications.\n */\nexport const VALUE_NOT_CHANGED: unique symbol = Symbol('VALUE_NOT_CHANGED')\n\nexport type StorageActionType = 'get' | 'set' | 'delete' | 'clear' | 'init' | 'keys' | 'update' | 'reset'\n\nexport type StorageAction = {\n type: StorageActionType\n key?: StorageKeyType\n value?: any\n metadata?: Record<string, any>\n source?: string\n timestamp?: number\n}\n\n// ─── Async Middleware Types ────────────────────────────────────────────────────\n\nexport type MiddlewareAPI = {\n dispatch: (action: StorageAction) => Promise<any>\n getState: () => Promise<Record<string, any>>\n storage: {\n doGet: (key: StorageKeyType) => Promise<any>\n doSet: (key: StorageKeyType, value: any) => Promise<void>\n doUpdate: (updates: Array<{ key: StorageKeyType; value: any }>) => Promise<void>\n doDelete: (key: StorageKeyType) => Promise<boolean>\n doClear: () => Promise<void>\n doKeys: () => Promise<string[]>\n notifySubscribers: (key: StorageKeyType, value: any) => void\n }\n}\n\nexport type NextFunction = (action: StorageAction) => Promise<any>\n\nexport type SetupEventsFunction = (api: MiddlewareAPI) => void\n\nexport type Middleware = {\n name: string\n setup?: SetupEventsFunction\n cleanup?: () => Promise<void> | void\n reducer: (api: MiddlewareAPI) => (next: NextFunction) => (action: StorageAction) => Promise<any>\n}\n\n// Алиасы для явного разделения\nexport type AsyncMiddlewareAPI = MiddlewareAPI\nexport type AsyncNextFunction = NextFunction\nexport type AsyncMiddleware = Middleware\n\n// ─── Sync Middleware Types ─────────────────────────────────────────────────────\n\nexport type SyncMiddlewareAPI = {\n dispatch: (action: StorageAction) => any\n getState: () => Record<string, any>\n storage: {\n doGet: (key: StorageKeyType) => any\n doSet: (key: StorageKeyType, value: any) => void\n doUpdate: (updates: Array<{ key: StorageKeyType; value: any }>) => void\n doRemove: (key: StorageKeyType) => boolean\n doClear: () => void\n doKeys: () => string[]\n notifySubscribers: (key: StorageKeyType, value: any) => void\n }\n}\n\nexport type SyncNextFunction = (action: StorageAction) => any\n\nexport type SyncSetupEventsFunction = (api: SyncMiddlewareAPI) => void\n\nexport type SyncMiddleware = {\n name: string\n setup?: SyncSetupEventsFunction\n cleanup?: () => void\n reducer: (api: SyncMiddlewareAPI) => (next: SyncNextFunction) => (action: StorageAction) => any\n}\n\n// ─── Async Middleware Module ───────────────────────────────────────────────────\n\nexport class AsyncMiddlewareModule {\n private middlewares: Middleware[] = []\n\n private api: MiddlewareAPI\n\n private initialized = false\n\n private dispatchFn!: (action: StorageAction) => Promise<any>\n\n constructor(storage: any) {\n this.api = {\n dispatch: async (action: StorageAction) => this.dispatch(action),\n getState: () => storage.getState(),\n storage: {\n doGet: storage.doGet.bind(storage),\n doSet: storage.doSet.bind(storage),\n doUpdate: storage.doUpdate.bind(storage),\n doDelete: storage.doDelete.bind(storage),\n doClear: storage.doClear.bind(storage),\n doKeys: storage.doKeys.bind(storage),\n notifySubscribers: storage.notifySubscribers.bind(storage),\n },\n }\n }\n\n private async baseOperation(action: StorageAction): Promise<any> {\n switch (action.type) {\n case 'get': {\n return this.api.storage.doGet(action.key!)\n }\n\n case 'set': {\n await this.api.storage.doSet(action.key!, action.value)\n return this.api.storage.doGet(action.key!)\n }\n\n case 'update': {\n if (Array.isArray(action.value)) {\n await this.api.storage.doUpdate(action.value)\n return this.api.storage.doGet('')\n }\n return action.value\n }\n\n case 'delete': {\n return this.api.storage.doDelete(action.key!)\n }\n\n case 'clear': {\n return this.api.storage.doClear()\n }\n\n case 'reset': {\n if (action.value) {\n await this.api.storage.doClear()\n await this.api.storage.doSet('', action.value)\n return this.api.storage.doGet('')\n }\n return this.api.storage.doClear()\n }\n\n case 'init': {\n const currentState = await this.api.storage.doGet('')\n if (Object.keys(currentState || {}).length > 0) {\n return currentState\n }\n if (action.value) {\n await this.api.storage.doSet('', action.value)\n return this.api.storage.doGet('')\n }\n return currentState\n }\n\n case 'keys': {\n return this.api.storage.doKeys()\n }\n\n default: {\n throw new Error(`Unknown action type: ${action.type}`)\n }\n }\n }\n\n private initializeMiddlewares() {\n if (this.initialized) return\n\n let chain = this.baseOperation.bind(this)\n\n for (const middleware of [...this.middlewares].reverse()) {\n const nextChain = chain\n chain = async (action) => {\n const actionWithMeta = {\n ...action,\n metadata: {\n ...action.metadata,\n timestamp: action.metadata?.timestamp || Date.now(),\n },\n }\n\n return middleware.reducer(this.api)(nextChain)(actionWithMeta)\n }\n }\n\n this.dispatchFn = chain\n this.initialized = true\n }\n\n use(middleware: Middleware): void {\n if (middleware.setup) {\n middleware.setup(this.api)\n }\n\n this.middlewares.push(middleware)\n this.initialized = false\n }\n\n async dispatch(action: StorageAction): Promise<any> {\n if (!this.initialized) {\n this.initializeMiddlewares()\n }\n\n try {\n return await this.dispatchFn(action)\n } catch (error) {\n handleOperationError('AsyncMiddlewareModule: error in middleware chain', error)\n }\n }\n}\n\n/** @deprecated Use AsyncMiddlewareModule */\nexport class MiddlewareModule extends AsyncMiddlewareModule {}\n\n// ─── Sync Middleware Module ────────────────────────────────────────────────────\n\nexport class SyncMiddlewareModule {\n private middlewares: SyncMiddleware[] = []\n\n private api: SyncMiddlewareAPI\n\n private initialized = false\n\n private dispatchFn!: (action: StorageAction) => any\n\n constructor(storage: any) {\n this.api = {\n dispatch: (action: StorageAction) => this.dispatch(action),\n getState: () => storage.getState(),\n storage: {\n doGet: storage.doGet.bind(storage),\n doSet: storage.doSet.bind(storage),\n doUpdate: storage.doUpdate.bind(storage),\n doRemove: storage.doRemove.bind(storage),\n doClear: storage.doClear.bind(storage),\n doKeys: storage.doKeys.bind(storage),\n notifySubscribers: storage.notifySubscribers.bind(storage),\n },\n }\n }\n\n private baseOperation(action: StorageAction): any {\n switch (action.type) {\n case 'get': {\n return this.api.storage.doGet(action.key!)\n }\n\n case 'set': {\n this.api.storage.doSet(action.key!, action.value)\n return this.api.storage.doGet(action.key!)\n }\n\n case 'update': {\n if (Array.isArray(action.value)) {\n this.api.storage.doUpdate(action.value)\n return this.api.storage.doGet('')\n }\n return action.value\n }\n\n case 'delete': {\n return this.api.storage.doRemove(action.key!)\n }\n\n case 'clear': {\n return this.api.storage.doClear()\n }\n\n case 'reset': {\n if (action.value) {\n this.api.storage.doClear()\n this.api.storage.doSet('', action.value)\n return this.api.storage.doGet('')\n }\n return this.api.storage.doClear()\n }\n\n case 'init': {\n const currentState = this.api.storage.doGet('')\n if (Object.keys(currentState || {}).length > 0) {\n return currentState\n }\n if (action.value) {\n this.api.storage.doSet('', action.value)\n return this.api.storage.doGet('')\n }\n return currentState\n }\n\n case 'keys': {\n return this.api.storage.doKeys()\n }\n\n default: {\n throw new Error(`Unknown action type: ${action.type}`)\n }\n }\n }\n\n private initializeMiddlewares() {\n if (this.initialized) return\n\n let chain = this.baseOperation.bind(this)\n\n for (const middleware of [...this.middlewares].reverse()) {\n const nextChain = chain\n chain = (action) => {\n const actionWithMeta = {\n ...action,\n metadata: {\n ...action.metadata,\n timestamp: action.metadata?.timestamp || Date.now(),\n },\n }\n\n return middleware.reducer(this.api)(nextChain)(actionWithMeta)\n }\n }\n\n this.dispatchFn = chain\n this.initialized = true\n }\n\n use(middleware: SyncMiddleware): void {\n if (middleware.setup) {\n middleware.setup(this.api)\n }\n\n this.middlewares.push(middleware)\n this.initialized = false\n }\n\n dispatch(action: StorageAction): any {\n if (!this.initialized) {\n this.initializeMiddlewares()\n }\n\n try {\n return this.dispatchFn(action)\n } catch (error) {\n handleOperationError('SyncMiddlewareModule: error in middleware chain', error)\n }\n }\n}\n"],"names":["handleOperationError","VALUE_NOT_CHANGED","Symbol","AsyncMiddlewareModule","storage","action","Array","currentState","Object","Error","chain","middleware","nextChain","actionWithMeta","Date","error","MiddlewareModule","SyncMiddlewareModule"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { MigrateFn } from '../storage.interface';
|
|
2
|
+
/**
|
|
3
|
+
* Решение о миграции персистентного состояния, принимаемое до записи. Чистая функция —
|
|
4
|
+
* не трогает хранилище; применяет результат вызывающий (`initializeWithMiddlewares`),
|
|
5
|
+
* т.к. запись отличается в sync/async адаптерах.
|
|
6
|
+
*/
|
|
7
|
+
export type MigrationDecision<T> =
|
|
8
|
+
/** Данных нет — записать `initialState` (если задан) и текущую версию. */
|
|
9
|
+
{
|
|
10
|
+
kind: 'seed';
|
|
11
|
+
}
|
|
12
|
+
/** Данные старой версии — записать `state` (результат `migrate`) и текущую версию. */
|
|
13
|
+
| {
|
|
14
|
+
kind: 'migrate';
|
|
15
|
+
state: T;
|
|
16
|
+
}
|
|
17
|
+
/** Данные актуальной формы, но версию надо обновить (например, поднята без `migrate`). */
|
|
18
|
+
| {
|
|
19
|
+
kind: 'bump';
|
|
20
|
+
}
|
|
21
|
+
/** Ничего не делать (версии совпадают либо сохранённая новее текущей). */
|
|
22
|
+
| {
|
|
23
|
+
kind: 'none';
|
|
24
|
+
};
|
|
25
|
+
export interface DecideMigrationOptions<T extends Record<string, any>> {
|
|
26
|
+
hasExisting: boolean;
|
|
27
|
+
existingState: any;
|
|
28
|
+
persistedVersion: number | undefined;
|
|
29
|
+
targetVersion: number;
|
|
30
|
+
migrate?: MigrateFn<T>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Сравнивает сохранённую версию схемы с текущей (`config.version`) и решает, что делать
|
|
34
|
+
* с персистентными данными при инициализации. Dev-предупреждения (в non-production) —
|
|
35
|
+
* только при потенциально опасных рассогласованиях (версия поднята без `migrate`,
|
|
36
|
+
* сохранённая версия новее текущей).
|
|
37
|
+
*/
|
|
38
|
+
export declare function decideMigration<T extends Record<string, any>>(options: DecideMigrationOptions<T>): MigrationDecision<T>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { loggerConsole } from "../../../_utils/index.js";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Сравнивает сохранённую версию схемы с текущей (`config.version`) и решает, что делать
|
|
7
|
+
* с персистентными данными при инициализации. Dev-предупреждения (в non-production) —
|
|
8
|
+
* только при потенциально опасных рассогласованиях (версия поднята без `migrate`,
|
|
9
|
+
* сохранённая версия новее текущей).
|
|
10
|
+
*/ function decideMigration(options) {
|
|
11
|
+
const { hasExisting, existingState, targetVersion, migrate } = options;
|
|
12
|
+
if (!hasExisting) {
|
|
13
|
+
return {
|
|
14
|
+
kind: 'seed'
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const persistedVersion = options.persistedVersion ?? 0;
|
|
18
|
+
if (persistedVersion === targetVersion) {
|
|
19
|
+
return {
|
|
20
|
+
kind: 'none'
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
if (persistedVersion > targetVersion) {
|
|
24
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
25
|
+
loggerConsole.warn(`[synapse] persisted state version (${persistedVersion}) новее текущей config.version (${targetVersion}). ` + 'Оставляю данные как есть. Похоже, открыта старая сборка поверх данных новой схемы.');
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
kind: 'none'
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
// persistedVersion < targetVersion → нужна миграция
|
|
32
|
+
if (migrate) {
|
|
33
|
+
return {
|
|
34
|
+
kind: 'migrate',
|
|
35
|
+
state: migrate(existingState, persistedVersion)
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
39
|
+
loggerConsole.warn(`[synapse] config.version поднята до ${targetVersion} (в хранилище версия ${persistedVersion}), но migrate не задан. ` + 'Оставляю сохранённые данные старой схемы как есть — задайте migrate(oldState, oldVersion) для преобразования.');
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
kind: 'bump'
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export { decideMigration };
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=migration.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core/storage/utils/migration.util.js","sources":["../../../../src/core/storage/utils/migration.util.ts"],"sourcesContent":["import { loggerConsole } from '../../../_utils'\nimport type { MigrateFn } from '../storage.interface'\n\n/**\n * Решение о миграции персистентного состояния, принимаемое до записи. Чистая функция —\n * не трогает хранилище; применяет результат вызывающий (`initializeWithMiddlewares`),\n * т.к. запись отличается в sync/async адаптерах.\n */\nexport type MigrationDecision<T> =\n /** Данных нет — записать `initialState` (если задан) и текущую версию. */\n | { kind: 'seed' }\n /** Данные старой версии — записать `state` (результат `migrate`) и текущую версию. */\n | { kind: 'migrate'; state: T }\n /** Данные актуальной формы, но версию надо обновить (например, поднята без `migrate`). */\n | { kind: 'bump' }\n /** Ничего не делать (версии совпадают либо сохранённая новее текущей). */\n | { kind: 'none' }\n\nexport interface DecideMigrationOptions<T extends Record<string, any>> {\n hasExisting: boolean\n existingState: any\n persistedVersion: number | undefined\n targetVersion: number\n migrate?: MigrateFn<T>\n}\n\n/**\n * Сравнивает сохранённую версию схемы с текущей (`config.version`) и решает, что делать\n * с персистентными данными при инициализации. Dev-предупреждения (в non-production) —\n * только при потенциально опасных рассогласованиях (версия поднята без `migrate`,\n * сохранённая версия новее текущей).\n */\nexport function decideMigration<T extends Record<string, any>>(options: DecideMigrationOptions<T>): MigrationDecision<T> {\n const { hasExisting, existingState, targetVersion, migrate } = options\n\n if (!hasExisting) {\n return { kind: 'seed' }\n }\n\n const persistedVersion = options.persistedVersion ?? 0\n\n if (persistedVersion === targetVersion) {\n return { kind: 'none' }\n }\n\n if (persistedVersion > targetVersion) {\n if (process.env.NODE_ENV !== 'production') {\n loggerConsole.warn(\n `[synapse] persisted state version (${persistedVersion}) новее текущей config.version (${targetVersion}). ` +\n 'Оставляю данные как есть. Похоже, открыта старая сборка поверх данных новой схемы.',\n )\n }\n return { kind: 'none' }\n }\n\n // persistedVersion < targetVersion → нужна миграция\n if (migrate) {\n return { kind: 'migrate', state: migrate(existingState, persistedVersion) }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n loggerConsole.warn(\n `[synapse] config.version поднята до ${targetVersion} (в хранилище версия ${persistedVersion}), но migrate не задан. ` +\n 'Оставляю сохранённые данные старой схемы как есть — задайте migrate(oldState, oldVersion) для преобразования.',\n )\n }\n return { kind: 'bump' }\n}\n"],"names":["loggerConsole","decideMigration","options","hasExisting","existingState","targetVersion","migrate","persistedVersion","process"],"mappings":";;;AAA+C;AA0B/C;;;;;CAKC,GACM,SAASC,eAAeA,CAAgCC,OAAkC;IAC/F,MAAM,EAAEC,WAAW,EAAEC,aAAa,EAAEC,aAAa,EAAEC,OAAO,EAAE,GAAGJ;IAE/D,IAAI,CAACC,aAAa;QAChB,OAAO;YAAE,MAAM;QAAO;IACxB;IAEA,MAAMI,mBAAmBL,QAAQ,gBAAgB,IAAI;IAErD,IAAIK,qBAAqBF,eAAe;QACtC,OAAO;YAAE,MAAM;QAAO;IACxB;IAEA,IAAIE,mBAAmBF,eAAe;QACpC,IAAIG,QAAQ,GAAG,CAAC,QAAQ,KAAK,cAAc;YACzCR,kBAAkB,CAChB,CAAC,mCAAmC,EAAEO,iBAAiB,gCAAgC,EAAEF,cAAc,GAAG,CAAC,GACzG;QAEN;QACA,OAAO;YAAE,MAAM;QAAO;IACxB;IAEA,oDAAoD;IACpD,IAAIC,SAAS;QACX,OAAO;YAAE,MAAM;YAAW,OAAOA,QAAQF,eAAeG;QAAkB;IAC5E;IAEA,IAAIC,QAAQ,GAAG,CAAC,QAAQ,KAAK,cAAc;QACzCR,kBAAkB,CAChB,CAAC,oCAAoC,EAAEK,cAAc,qBAAqB,EAAEE,iBAAiB,wBAAwB,CAAC,GACpH;IAEN;IACA,OAAO;QAAE,MAAM;IAAO;AACxB"}
|
|
@@ -12,4 +12,3 @@ export declare function createDummyState<T>(): T;
|
|
|
12
12
|
* - For such cases use string-based subscription: `storage.subscribe('user.permissions', callback)`
|
|
13
13
|
*/
|
|
14
14
|
export declare function extractPath<T>(selector: (state: T) => any, dummyState: T, cache?: WeakMap<(...args: any[]) => any, string>): string;
|
|
15
|
-
//# sourceMappingURL=path-selector.util.d.ts.map
|
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
* Deep equality check for two values.
|
|
3
3
|
*/
|
|
4
4
|
export declare function isEqual(a: any, b: any): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Shallow (one-level) equality check. Two values are equal when they are the
|
|
7
|
+
* same reference, equal primitives, or objects with the same keys whose values
|
|
8
|
+
* are strictly equal (`===`) — nested objects are NOT compared deeply.
|
|
9
|
+
*
|
|
10
|
+
* Shared default comparator for the shallow-compare middlewares (sync + async).
|
|
11
|
+
*/
|
|
12
|
+
export declare function shallowEqual(prev: any, next: any): boolean;
|
|
5
13
|
/**
|
|
6
14
|
* Finds all changed paths between two objects.
|
|
7
15
|
*/
|
|
@@ -11,4 +19,3 @@ export declare function findChangedPaths(oldObj: any, newObj: any, prefix?: stri
|
|
|
11
19
|
* Shallow copy initially, structuredClone on first nested property access.
|
|
12
20
|
*/
|
|
13
21
|
export declare function createLazyClone<T extends Record<string, any>>(source: T): T;
|
|
14
|
-
//# sourceMappingURL=state-diff.util.d.ts.map
|
|
@@ -22,6 +22,22 @@
|
|
|
22
22
|
if (keysA.length !== keysB.length) return false;
|
|
23
23
|
return keysA.every((key)=>Object.prototype.hasOwnProperty.call(b, key) && isEqual(a[key], b[key]));
|
|
24
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Shallow (one-level) equality check. Two values are equal when they are the
|
|
27
|
+
* same reference, equal primitives, or objects with the same keys whose values
|
|
28
|
+
* are strictly equal (`===`) — nested objects are NOT compared deeply.
|
|
29
|
+
*
|
|
30
|
+
* Shared default comparator for the shallow-compare middlewares (sync + async).
|
|
31
|
+
*/ function shallowEqual(prev, next) {
|
|
32
|
+
if (prev === next) return true;
|
|
33
|
+
if (typeof prev !== 'object' || typeof next !== 'object' || prev === null || next === null) {
|
|
34
|
+
return prev === next;
|
|
35
|
+
}
|
|
36
|
+
const keysA = Object.keys(prev);
|
|
37
|
+
const keysB = Object.keys(next);
|
|
38
|
+
if (keysA.length !== keysB.length) return false;
|
|
39
|
+
return keysA.every((key)=>Object.prototype.hasOwnProperty.call(next, key) && prev[key] === next[key]);
|
|
40
|
+
}
|
|
25
41
|
/**
|
|
26
42
|
* Finds all changed paths between two objects.
|
|
27
43
|
*/ function findChangedPaths(oldObj, newObj, prefix = '', changedPaths = new Set(), visited = new WeakMap()) {
|
|
@@ -94,6 +110,6 @@
|
|
|
94
110
|
});
|
|
95
111
|
}
|
|
96
112
|
|
|
97
|
-
export { createLazyClone, findChangedPaths, isEqual };
|
|
113
|
+
export { createLazyClone, findChangedPaths, isEqual, shallowEqual };
|
|
98
114
|
|
|
99
115
|
//# sourceMappingURL=state-diff.util.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core/storage/utils/state-diff.util.js","sources":["../../../../src/core/storage/utils/state-diff.util.ts"],"sourcesContent":["/**\n * Deep equality check for two values.\n */\nexport function isEqual(a: any, b: any): boolean {\n if (a === b) return true\n if (a == null || b == null) return a === b\n\n const typeA = typeof a\n const typeB = typeof b\n if (typeA !== typeB) return false\n if (typeA !== 'object') return a === b\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime()\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!isEqual(a[i], b[i])) return false\n }\n return true\n }\n\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n\n return keysA.every((key) => Object.prototype.hasOwnProperty.call(b, key) && isEqual(a[key], b[key]))\n}\n\n/**\n * Finds all changed paths between two objects.\n */\nexport function findChangedPaths(oldObj: any, newObj: any, prefix = '', changedPaths: Set<string> = new Set<string>(), visited = new WeakMap<any, WeakSet<any>>()): Set<string> {\n if (oldObj === newObj) return changedPaths\n\n if (typeof oldObj !== 'object' || typeof newObj !== 'object' || oldObj === null || newObj === null) {\n if (oldObj !== newObj) {\n changedPaths.add(prefix || '')\n }\n return changedPaths\n }\n\n // Cycle/dedup guard keyed by the (oldObj, newObj) PAIR, not by oldObj alone.\n // structuredClone deduplicates shared references, so a single `oldObj` can be\n // reached via different paths leading to DIFFERENT `newObj`s. Keying on oldObj\n // alone would skip the second, genuinely-changed branch entirely.\n const seenNew = visited.get(oldObj)\n if (seenNew) {\n if (seenNew.has(newObj)) return changedPaths\n seenNew.add(newObj)\n } else {\n visited.set(oldObj, new WeakSet([newObj]))\n }\n\n const allKeys = new Set([...Object.keys(oldObj || {}), ...Object.keys(newObj || {})])\n\n for (const key of allKeys) {\n const oldValue = oldObj[key]\n const newValue = newObj[key]\n if (oldValue === newValue) continue\n\n const path = prefix ? `${prefix}.${key}` : key\n\n if (oldValue && newValue && typeof oldValue === 'object' && typeof newValue === 'object' && !Array.isArray(oldValue) && !Array.isArray(newValue)) {\n findChangedPaths(oldValue, newValue, path, changedPaths, visited)\n } else if (Array.isArray(oldValue) && Array.isArray(newValue)) {\n if (!isEqual(oldValue, newValue)) {\n changedPaths.add(path)\n }\n } else if (!isEqual(oldValue, newValue)) {\n changedPaths.add(path)\n }\n }\n\n return changedPaths\n}\n\n/**\n * Creates a lazy deep-clone of an object.\n * Shallow copy initially, structuredClone on first nested property access.\n */\nexport function createLazyClone<T extends Record<string, any>>(source: T): T {\n const cloned = new Set<string>()\n const shallow = { ...source }\n\n return new Proxy(shallow, {\n get(target, prop, receiver) {\n if (typeof prop === 'string' && !cloned.has(prop)) {\n const val = target[prop as keyof typeof target]\n if (val !== null && typeof val === 'object') {\n cloned.add(prop)\n ;(target as any)[prop] = structuredClone(val)\n }\n }\n return Reflect.get(target, prop, receiver)\n },\n set(target, prop, value) {\n if (typeof prop === 'string') {\n cloned.add(prop)\n }\n return Reflect.set(target, prop, value)\n },\n }) as T\n}\n"],"names":["isEqual","a","b","typeA","typeB","Date","Array","i","keysA","Object","keysB","key","findChangedPaths","oldObj","newObj","prefix","changedPaths","Set","visited","WeakMap","seenNew","WeakSet","allKeys","oldValue","newValue","path","createLazyClone","source","cloned","shallow","Proxy","target","prop","receiver","val","structuredClone","Reflect","value"],"mappings":"AAAA;;CAEC,GACM,SAASA,OAAOA,CAACC,CAAM,EAAEC,CAAM;IACpC,IAAID,MAAMC,GAAG,OAAO;IACpB,IAAID,KAAK,QAAQC,KAAK,MAAM,OAAOD,MAAMC;IAEzC,MAAMC,QAAQ,OAAOF;IACrB,MAAMG,QAAQ,OAAOF;IACrB,IAAIC,UAAUC,OAAO,OAAO;IAC5B,IAAID,UAAU,UAAU,OAAOF,MAAMC;IAErC,IAAID,aAAaI,QAAQH,aAAaG,MAAM;QAC1C,OAAOJ,EAAE,OAAO,OAAOC,EAAE,OAAO;IAClC;IAEA,IAAII,MAAM,OAAO,CAACL,MAAMK,MAAM,OAAO,CAACJ,IAAI;QACxC,IAAID,EAAE,MAAM,KAAKC,EAAE,MAAM,EAAE,OAAO;QAClC,IAAK,IAAIK,IAAI,GAAGA,IAAIN,EAAE,MAAM,EAAEM,IAAK;YACjC,IAAI,CAACP,OAAOA,CAACC,CAAC,CAACM,EAAE,EAAEL,CAAC,CAACK,EAAE,GAAG,OAAO;QACnC;QACA,OAAO;IACT;IAEA,MAAMC,QAAQC,OAAO,IAAI,CAACR;IAC1B,MAAMS,QAAQD,OAAO,IAAI,CAACP;IAC1B,IAAIM,MAAM,MAAM,KAAKE,MAAM,MAAM,EAAE,OAAO;IAE1C,OAAOF,MAAM,KAAK,CAAC,CAACG,MAAQF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACP,GAAGS,QAAQX,OAAOA,CAACC,CAAC,CAACU,IAAI,EAAET,CAAC,CAACS,IAAI;AACpG;AAEA;;CAEC,GACM,
|
|
1
|
+
{"version":3,"file":"core/storage/utils/state-diff.util.js","sources":["../../../../src/core/storage/utils/state-diff.util.ts"],"sourcesContent":["/**\n * Deep equality check for two values.\n */\nexport function isEqual(a: any, b: any): boolean {\n if (a === b) return true\n if (a == null || b == null) return a === b\n\n const typeA = typeof a\n const typeB = typeof b\n if (typeA !== typeB) return false\n if (typeA !== 'object') return a === b\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime()\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!isEqual(a[i], b[i])) return false\n }\n return true\n }\n\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n\n return keysA.every((key) => Object.prototype.hasOwnProperty.call(b, key) && isEqual(a[key], b[key]))\n}\n\n/**\n * Shallow (one-level) equality check. Two values are equal when they are the\n * same reference, equal primitives, or objects with the same keys whose values\n * are strictly equal (`===`) — nested objects are NOT compared deeply.\n *\n * Shared default comparator for the shallow-compare middlewares (sync + async).\n */\nexport function shallowEqual(prev: any, next: any): boolean {\n if (prev === next) return true\n\n if (typeof prev !== 'object' || typeof next !== 'object' || prev === null || next === null) {\n return prev === next\n }\n\n const keysA = Object.keys(prev)\n const keysB = Object.keys(next)\n\n if (keysA.length !== keysB.length) return false\n\n return keysA.every((key) => Object.prototype.hasOwnProperty.call(next, key) && prev[key] === next[key])\n}\n\n/**\n * Finds all changed paths between two objects.\n */\nexport function findChangedPaths(oldObj: any, newObj: any, prefix = '', changedPaths: Set<string> = new Set<string>(), visited = new WeakMap<any, WeakSet<any>>()): Set<string> {\n if (oldObj === newObj) return changedPaths\n\n if (typeof oldObj !== 'object' || typeof newObj !== 'object' || oldObj === null || newObj === null) {\n if (oldObj !== newObj) {\n changedPaths.add(prefix || '')\n }\n return changedPaths\n }\n\n // Cycle/dedup guard keyed by the (oldObj, newObj) PAIR, not by oldObj alone.\n // structuredClone deduplicates shared references, so a single `oldObj` can be\n // reached via different paths leading to DIFFERENT `newObj`s. Keying on oldObj\n // alone would skip the second, genuinely-changed branch entirely.\n const seenNew = visited.get(oldObj)\n if (seenNew) {\n if (seenNew.has(newObj)) return changedPaths\n seenNew.add(newObj)\n } else {\n visited.set(oldObj, new WeakSet([newObj]))\n }\n\n const allKeys = new Set([...Object.keys(oldObj || {}), ...Object.keys(newObj || {})])\n\n for (const key of allKeys) {\n const oldValue = oldObj[key]\n const newValue = newObj[key]\n if (oldValue === newValue) continue\n\n const path = prefix ? `${prefix}.${key}` : key\n\n if (oldValue && newValue && typeof oldValue === 'object' && typeof newValue === 'object' && !Array.isArray(oldValue) && !Array.isArray(newValue)) {\n findChangedPaths(oldValue, newValue, path, changedPaths, visited)\n } else if (Array.isArray(oldValue) && Array.isArray(newValue)) {\n if (!isEqual(oldValue, newValue)) {\n changedPaths.add(path)\n }\n } else if (!isEqual(oldValue, newValue)) {\n changedPaths.add(path)\n }\n }\n\n return changedPaths\n}\n\n/**\n * Creates a lazy deep-clone of an object.\n * Shallow copy initially, structuredClone on first nested property access.\n */\nexport function createLazyClone<T extends Record<string, any>>(source: T): T {\n const cloned = new Set<string>()\n const shallow = { ...source }\n\n return new Proxy(shallow, {\n get(target, prop, receiver) {\n if (typeof prop === 'string' && !cloned.has(prop)) {\n const val = target[prop as keyof typeof target]\n if (val !== null && typeof val === 'object') {\n cloned.add(prop)\n ;(target as any)[prop] = structuredClone(val)\n }\n }\n return Reflect.get(target, prop, receiver)\n },\n set(target, prop, value) {\n if (typeof prop === 'string') {\n cloned.add(prop)\n }\n return Reflect.set(target, prop, value)\n },\n }) as T\n}\n"],"names":["isEqual","a","b","typeA","typeB","Date","Array","i","keysA","Object","keysB","key","shallowEqual","prev","next","findChangedPaths","oldObj","newObj","prefix","changedPaths","Set","visited","WeakMap","seenNew","WeakSet","allKeys","oldValue","newValue","path","createLazyClone","source","cloned","shallow","Proxy","target","prop","receiver","val","structuredClone","Reflect","value"],"mappings":"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"}
|
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
import { IndexedDBStorage } from '../adapters/indexed-DB.service';
|
|
2
2
|
import { LocalStorage } from '../adapters/local-storage.service';
|
|
3
3
|
import { MemoryStorage } from '../adapters/memory-storage.service';
|
|
4
|
-
import { IAsyncPluginExecutor, ISyncPluginExecutor } from '../modules/plugin/plugin.interface';
|
|
5
4
|
import { IAsyncStorage, IEventEmitter, ILogger, IndexedDBStorageConfig, IStorage, ISyncStorage, LocalStorageConfig, MemoryStorageConfig, UniversalStorageConfig } from '../storage.interface';
|
|
6
5
|
export declare class StorageFactory {
|
|
7
|
-
static createMemory<T extends Record<string, any>>(config: MemoryStorageConfig<T>,
|
|
8
|
-
static createLocal<T extends Record<string, any>>(config: LocalStorageConfig<T>,
|
|
9
|
-
static createIndexedDB<T extends Record<string, any>>(config: IndexedDBStorageConfig<T>,
|
|
6
|
+
static createMemory<T extends Record<string, any>>(config: MemoryStorageConfig<T>, eventEmitter?: IEventEmitter, logger?: ILogger): MemoryStorage<T>;
|
|
7
|
+
static createLocal<T extends Record<string, any>>(config: LocalStorageConfig<T>, eventEmitter?: IEventEmitter, logger?: ILogger): LocalStorage<T>;
|
|
8
|
+
static createIndexedDB<T extends Record<string, any>>(config: IndexedDBStorageConfig<T>, eventEmitter?: IEventEmitter, logger?: ILogger): IndexedDBStorage<T>;
|
|
10
9
|
static create<T extends Record<string, any>>(config: UniversalStorageConfig<T> & {
|
|
11
10
|
type: 'memory';
|
|
12
|
-
},
|
|
11
|
+
}, eventEmitter?: IEventEmitter, logger?: ILogger): ISyncStorage<T>;
|
|
13
12
|
static create<T extends Record<string, any>>(config: UniversalStorageConfig<T> & {
|
|
14
13
|
type: 'localStorage';
|
|
15
|
-
},
|
|
14
|
+
}, eventEmitter?: IEventEmitter, logger?: ILogger): ISyncStorage<T>;
|
|
16
15
|
static create<T extends Record<string, any>>(config: UniversalStorageConfig<T> & {
|
|
17
16
|
type: 'indexedDB';
|
|
18
|
-
},
|
|
19
|
-
static create<T extends Record<string, any>>(config: UniversalStorageConfig<T>,
|
|
17
|
+
}, eventEmitter?: IEventEmitter, logger?: ILogger): IAsyncStorage<T>;
|
|
18
|
+
static create<T extends Record<string, any>>(config: UniversalStorageConfig<T>, eventEmitter?: IEventEmitter, logger?: ILogger): IStorage<T>;
|
|
20
19
|
}
|
|
21
|
-
//# sourceMappingURL=storage-factory.util.d.ts.map
|
|
@@ -9,24 +9,24 @@ import { MemoryStorage } from "../adapters/memory-storage.service.js";
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class StorageFactory {
|
|
12
|
-
static createMemory(config,
|
|
13
|
-
return MemoryStorage.create(config,
|
|
12
|
+
static createMemory(config, eventEmitter, logger) {
|
|
13
|
+
return MemoryStorage.create(config, eventEmitter, logger);
|
|
14
14
|
}
|
|
15
|
-
static createLocal(config,
|
|
16
|
-
return LocalStorage.create(config,
|
|
15
|
+
static createLocal(config, eventEmitter, logger) {
|
|
16
|
+
return LocalStorage.create(config, eventEmitter, logger);
|
|
17
17
|
}
|
|
18
|
-
static createIndexedDB(config,
|
|
19
|
-
return IndexedDBStorage.create(config,
|
|
18
|
+
static createIndexedDB(config, eventEmitter, logger) {
|
|
19
|
+
return IndexedDBStorage.create(config, eventEmitter, logger);
|
|
20
20
|
}
|
|
21
21
|
// ─── Реализация ─────────────────────────────────────────────────────────────
|
|
22
|
-
static create(config,
|
|
22
|
+
static create(config, eventEmitter, logger) {
|
|
23
23
|
switch(config.type){
|
|
24
24
|
case 'memory':
|
|
25
|
-
return this.createMemory(config,
|
|
25
|
+
return this.createMemory(config, eventEmitter, logger);
|
|
26
26
|
case 'localStorage':
|
|
27
|
-
return this.createLocal(config,
|
|
27
|
+
return this.createLocal(config, eventEmitter, logger);
|
|
28
28
|
case 'indexedDB':
|
|
29
|
-
return this.createIndexedDB(config,
|
|
29
|
+
return this.createIndexedDB(config, eventEmitter, logger);
|
|
30
30
|
default:
|
|
31
31
|
{
|
|
32
32
|
throw new Error(`Unsupported storage type: ${config.type}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core/storage/utils/storage-factory.util.js","sources":["../../../../src/core/storage/utils/storage-factory.util.ts"],"sourcesContent":["import { IndexedDBStorage } from '../adapters/indexed-DB.service'\nimport { LocalStorage } from '../adapters/local-storage.service'\nimport { MemoryStorage } from '../adapters/memory-storage.service'\nimport {
|
|
1
|
+
{"version":3,"file":"core/storage/utils/storage-factory.util.js","sources":["../../../../src/core/storage/utils/storage-factory.util.ts"],"sourcesContent":["import { IndexedDBStorage } from '../adapters/indexed-DB.service'\nimport { LocalStorage } from '../adapters/local-storage.service'\nimport { MemoryStorage } from '../adapters/memory-storage.service'\nimport {\n IAsyncStorage,\n IEventEmitter,\n ILogger,\n IndexedDBStorageConfig,\n IStorage,\n ISyncStorage,\n LocalStorageConfig,\n MemoryStorageConfig,\n UniversalStorageConfig,\n} from '../storage.interface'\n\nexport class StorageFactory {\n static createMemory<T extends Record<string, any>>(config: MemoryStorageConfig<T>, eventEmitter?: IEventEmitter, logger?: ILogger): MemoryStorage<T> {\n return MemoryStorage.create<T>(config, eventEmitter, logger)\n }\n\n static createLocal<T extends Record<string, any>>(config: LocalStorageConfig<T>, eventEmitter?: IEventEmitter, logger?: ILogger): LocalStorage<T> {\n return LocalStorage.create<T>(config, eventEmitter, logger)\n }\n\n static createIndexedDB<T extends Record<string, any>>(config: IndexedDBStorageConfig<T>, eventEmitter?: IEventEmitter, logger?: ILogger): IndexedDBStorage<T> {\n return IndexedDBStorage.create<T>(config, eventEmitter, logger)\n }\n\n // ─── Перегрузки для правильного вывода типов ────────────────────────────────\n\n static create<T extends Record<string, any>>(config: UniversalStorageConfig<T> & { type: 'memory' }, eventEmitter?: IEventEmitter, logger?: ILogger): ISyncStorage<T>\n\n static create<T extends Record<string, any>>(config: UniversalStorageConfig<T> & { type: 'localStorage' }, eventEmitter?: IEventEmitter, logger?: ILogger): ISyncStorage<T>\n\n static create<T extends Record<string, any>>(config: UniversalStorageConfig<T> & { type: 'indexedDB' }, eventEmitter?: IEventEmitter, logger?: ILogger): IAsyncStorage<T>\n\n static create<T extends Record<string, any>>(config: UniversalStorageConfig<T>, eventEmitter?: IEventEmitter, logger?: ILogger): IStorage<T>\n\n // ─── Реализация ─────────────────────────────────────────────────────────────\n\n static create<T extends Record<string, any>>(config: UniversalStorageConfig<T>, eventEmitter?: IEventEmitter, logger?: ILogger): IStorage<T> {\n switch (config.type) {\n case 'memory':\n return this.createMemory<T>(config as MemoryStorageConfig<T>, eventEmitter, logger)\n case 'localStorage':\n return this.createLocal<T>(config as LocalStorageConfig<T>, eventEmitter, logger)\n case 'indexedDB':\n return this.createIndexedDB<T>(config as IndexedDBStorageConfig<T>, eventEmitter, logger)\n default: {\n throw new Error(`Unsupported storage type: ${(config as any).type}`)\n }\n }\n }\n}\n"],"names":["IndexedDBStorage","LocalStorage","MemoryStorage","StorageFactory","config","eventEmitter","logger","Error"],"mappings":";;;;;;;AAAiE;AACD;AACE;AAa3D,MAAMG,cAAcA;IACzB,OAAO,aAA4CC,MAA8B,EAAEC,YAA4B,EAAEC,MAAgB,EAAoB;QACnJ,OAAOJ,oBAAoB,CAAIE,QAAQC,cAAcC;IACvD;IAEA,OAAO,YAA2CF,MAA6B,EAAEC,YAA4B,EAAEC,MAAgB,EAAmB;QAChJ,OAAOL,mBAAmB,CAAIG,QAAQC,cAAcC;IACtD;IAEA,OAAO,gBAA+CF,MAAiC,EAAEC,YAA4B,EAAEC,MAAgB,EAAuB;QAC5J,OAAON,uBAAuB,CAAII,QAAQC,cAAcC;IAC1D;IAYA,+EAA+E;IAE/E,OAAO,OAAsCF,MAAiC,EAAEC,YAA4B,EAAEC,MAAgB,EAAe;QAC3I,OAAQF,OAAO,IAAI;YACjB,KAAK;gBACH,OAAO,IAAI,CAAC,YAAY,CAAIA,QAAkCC,cAAcC;YAC9E,KAAK;gBACH,OAAO,IAAI,CAAC,WAAW,CAAIF,QAAiCC,cAAcC;YAC5E,KAAK;gBACH,OAAO,IAAI,CAAC,eAAe,CAAIF,QAAqCC,cAAcC;YACpF;gBAAS;oBACP,MAAM,IAAIC,MAAM,CAAC,0BAA0B,EAAGH,OAAe,IAAI,EAAE;gBACrE;QACF;IACF;AACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react/hooks/index.js","sources":["../../../src/react/hooks/index.ts"],"sourcesContent":["export * from './useCreateStorage'\nexport * from './useSelector'\nexport * from './useStorage'\nexport * from './useStorageSubscribe'\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"react/hooks/index.js","sources":["../../../src/react/hooks/index.ts"],"sourcesContent":["export * from './useCreateStorage'\nexport * from './useObservable'\nexport * from './useSelector'\nexport * from './useStorage'\nexport * from './useStorageSubscribe'\nexport * from './useSubscription'\n"],"names":[],"mappings":";;;;;;AAAkC;AACH;AACF;AACD;AACS;AACJ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IAsyncStorage, IEventEmitter, ILogger, IStorage, ISyncStorage, StorageInitStatus, UniversalStorageConfig } from '../../core';
|
|
2
2
|
export interface UseSynapseStorageOptions {
|
|
3
3
|
/**
|
|
4
4
|
* Автоматически инициализировать при монтировании
|
|
@@ -28,12 +28,11 @@ export type UseSynapseStorageReturn<S> = {
|
|
|
28
28
|
};
|
|
29
29
|
export declare function useCreateStorage<T extends Record<string, any>>(config: UniversalStorageConfig<T> & {
|
|
30
30
|
type: 'memory';
|
|
31
|
-
}, options?: UseSynapseStorageOptions,
|
|
31
|
+
}, options?: UseSynapseStorageOptions, eventEmitter?: IEventEmitter, logger?: ILogger): UseSynapseStorageReturn<ISyncStorage<T>>;
|
|
32
32
|
export declare function useCreateStorage<T extends Record<string, any>>(config: UniversalStorageConfig<T> & {
|
|
33
33
|
type: 'localStorage';
|
|
34
|
-
}, options?: UseSynapseStorageOptions,
|
|
34
|
+
}, options?: UseSynapseStorageOptions, eventEmitter?: IEventEmitter, logger?: ILogger): UseSynapseStorageReturn<ISyncStorage<T>>;
|
|
35
35
|
export declare function useCreateStorage<T extends Record<string, any>>(config: UniversalStorageConfig<T> & {
|
|
36
36
|
type: 'indexedDB';
|
|
37
|
-
}, options?: UseSynapseStorageOptions,
|
|
38
|
-
export declare function useCreateStorage<T extends Record<string, any>>(config: UniversalStorageConfig<T>, options?: UseSynapseStorageOptions,
|
|
39
|
-
//# sourceMappingURL=useCreateStorage.d.ts.map
|
|
37
|
+
}, options?: UseSynapseStorageOptions, eventEmitter?: IEventEmitter, logger?: ILogger): UseSynapseStorageReturn<IAsyncStorage<T>>;
|
|
38
|
+
export declare function useCreateStorage<T extends Record<string, any>>(config: UniversalStorageConfig<T>, options?: UseSynapseStorageOptions, eventEmitter?: IEventEmitter, logger?: ILogger): UseSynapseStorageReturn<IStorage<T>>;
|
|
@@ -9,7 +9,7 @@ import { StorageFactory, StorageStatus } from "../../core/index.js";
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
// ─── Реализация ─────────────────────────────────────────────────────────────
|
|
12
|
-
function useCreateStorage(config, options = {},
|
|
12
|
+
function useCreateStorage(config, options = {}, eventEmitter, logger) {
|
|
13
13
|
const destroyDefault = config.type === 'indexedDB' ? false : true;
|
|
14
14
|
const { autoInitialize = true, destroyOnUnmount = destroyDefault } = options;
|
|
15
15
|
const [status, setStatus] = useState({
|
|
@@ -17,7 +17,7 @@ function useCreateStorage(config, options = {}, pluginExecutor, eventEmitter, lo
|
|
|
17
17
|
});
|
|
18
18
|
const [storage] = useState(()=>{
|
|
19
19
|
try {
|
|
20
|
-
return StorageFactory.create(config,
|
|
20
|
+
return StorageFactory.create(config, eventEmitter, logger);
|
|
21
21
|
} catch (error) {
|
|
22
22
|
setStatus({
|
|
23
23
|
status: StorageStatus.ERROR,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react/hooks/useCreateStorage.js","sources":["../../../src/react/hooks/useCreateStorage.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { handleCleanupError } from '../../_utils/error-handling.util'\nimport {
|
|
1
|
+
{"version":3,"file":"react/hooks/useCreateStorage.js","sources":["../../../src/react/hooks/useCreateStorage.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { handleCleanupError } from '../../_utils/error-handling.util'\nimport { IAsyncStorage, IEventEmitter, ILogger, IStorage, ISyncStorage, StorageFactory, StorageInitStatus, StorageStatus, UniversalStorageConfig } from '../../core'\n\nexport interface UseSynapseStorageOptions {\n /**\n * Автоматически инициализировать при монтировании\n */\n autoInitialize?: boolean\n /**\n * Уничтожать storage при размонтировании\n */\n destroyOnUnmount?: boolean\n}\n\nexport type UseSynapseStorageReturn<S> =\n | {\n storage: S\n status: StorageInitStatus\n initialize: () => Promise<void>\n destroy: () => Promise<void>\n isReady: true\n isLoading: false\n hasError: false\n }\n | {\n storage: null\n status: StorageInitStatus\n initialize: () => Promise<void>\n destroy: () => Promise<void>\n isReady: false\n isLoading: boolean\n hasError: boolean\n }\n\n// ─── Перегрузки ─────────────────────────────────────────────────────────────\n\nexport function useCreateStorage<T extends Record<string, any>>(\n config: UniversalStorageConfig<T> & { type: 'memory' },\n options?: UseSynapseStorageOptions,\n eventEmitter?: IEventEmitter,\n logger?: ILogger,\n): UseSynapseStorageReturn<ISyncStorage<T>>\n\nexport function useCreateStorage<T extends Record<string, any>>(\n config: UniversalStorageConfig<T> & { type: 'localStorage' },\n options?: UseSynapseStorageOptions,\n eventEmitter?: IEventEmitter,\n logger?: ILogger,\n): UseSynapseStorageReturn<ISyncStorage<T>>\n\nexport function useCreateStorage<T extends Record<string, any>>(\n config: UniversalStorageConfig<T> & { type: 'indexedDB' },\n options?: UseSynapseStorageOptions,\n eventEmitter?: IEventEmitter,\n logger?: ILogger,\n): UseSynapseStorageReturn<IAsyncStorage<T>>\n\nexport function useCreateStorage<T extends Record<string, any>>(\n config: UniversalStorageConfig<T>,\n options?: UseSynapseStorageOptions,\n eventEmitter?: IEventEmitter,\n logger?: ILogger,\n): UseSynapseStorageReturn<IStorage<T>>\n\n// ─── Реализация ─────────────────────────────────────────────────────────────\n\nexport function useCreateStorage<T extends Record<string, any>>(\n config: UniversalStorageConfig<T>,\n options: UseSynapseStorageOptions = {},\n eventEmitter?: IEventEmitter,\n logger?: ILogger,\n): UseSynapseStorageReturn<IStorage<T>> {\n const destroyDefault = config.type === 'indexedDB' ? false : true\n const { autoInitialize = true, destroyOnUnmount = destroyDefault } = options\n\n const [status, setStatus] = useState<StorageInitStatus>({\n status: StorageStatus.IDLE,\n })\n\n const [storage] = useState<IStorage<T> | null>(() => {\n try {\n return StorageFactory.create<T>(config, eventEmitter, logger)\n } catch (error) {\n setStatus({\n status: StorageStatus.ERROR,\n error: error as Error,\n })\n return null\n }\n })\n\n const destroyOnUnmountRef = useRef(destroyOnUnmount)\n destroyOnUnmountRef.current = destroyOnUnmount\n\n const initialize = useCallback(async () => {\n if (!storage) return\n\n try {\n setStatus({ status: StorageStatus.LOADING })\n await storage.initialize()\n setStatus({ status: StorageStatus.READY })\n } catch (error) {\n setStatus({\n status: StorageStatus.ERROR,\n error: error as Error,\n })\n }\n }, [storage])\n\n const destroy = useCallback(async () => {\n if (!storage) return\n\n try {\n await storage.destroy()\n setStatus({ status: StorageStatus.IDLE })\n } catch (error) {\n setStatus({\n status: StorageStatus.ERROR,\n error: error as Error,\n })\n }\n }, [storage])\n\n useEffect(() => {\n if (!storage) return\n\n const unsubscribe = storage.onStatusChange((newStatus) => {\n setStatus(newStatus)\n })\n\n return unsubscribe\n }, [storage])\n\n // Автоматическая инициализация\n useEffect(() => {\n let cancelled = false\n\n if (autoInitialize && storage && status.status === StorageStatus.IDLE) {\n setStatus({ status: StorageStatus.LOADING })\n storage\n .initialize()\n .then(() => {\n if (!cancelled) setStatus({ status: StorageStatus.READY })\n })\n .catch((error) => {\n if (!cancelled) setStatus({ status: StorageStatus.ERROR, error: error as Error })\n })\n }\n\n return () => {\n cancelled = true\n }\n }, [autoInitialize, storage, status.status])\n\n useEffect(() => {\n return () => {\n if (destroyOnUnmountRef.current && storage) {\n storage.destroy().catch((err) => handleCleanupError('useCreateStorage: error during unmount destroy', err))\n }\n }\n }, [storage])\n\n const isReady = status.status === StorageStatus.READY\n const isLoading = status.status === StorageStatus.LOADING\n const hasError = status.status === StorageStatus.ERROR\n\n if (isReady && storage) {\n return {\n storage,\n status,\n initialize,\n destroy,\n isReady: true as const,\n isLoading: false as const,\n hasError: false as const,\n }\n }\n\n return {\n storage: null,\n status,\n initialize,\n destroy,\n isReady: false as const,\n isLoading,\n hasError,\n }\n}\n"],"names":["useCallback","useEffect","useRef","useState","handleCleanupError","StorageFactory","StorageStatus","useCreateStorage","config","options","eventEmitter","logger","destroyDefault","autoInitialize","destroyOnUnmount","status","setStatus","storage","error","destroyOnUnmountRef","initialize","destroy","unsubscribe","newStatus","cancelled","err","isReady","isLoading","hasError"],"mappings":";;;;;;;AAAgE;AAEK;AAC+F;AA+DpK,+EAA+E;AAExE,SAASO,gBAAgBA,CAC9BC,MAAiC,EACjCC,UAAoC,CAAC,CAAC,EACtCC,YAA4B,EAC5BC,MAAgB;IAEhB,MAAMC,iBAAiBJ,OAAO,IAAI,KAAK,cAAc,QAAQ;IAC7D,MAAM,EAAEK,iBAAiB,IAAI,EAAEC,mBAAmBF,cAAc,EAAE,GAAGH;IAErE,MAAM,CAACM,QAAQC,UAAU,GAAGb,QAAQA,CAAoB;QACtD,QAAQG,kBAAkB;IAC5B;IAEA,MAAM,CAACW,QAAQ,GAAGd,QAAQA,CAAqB;QAC7C,IAAI;YACF,OAAOE,qBAAqB,CAAIG,QAAQE,cAAcC;QACxD,EAAE,OAAOO,OAAO;YACdF,UAAU;gBACR,QAAQV,mBAAmB;gBAC3B,OAAOY;YACT;YACA,OAAO;QACT;IACF;IAEA,MAAMC,sBAAsBjB,MAAMA,CAACY;IACnCK,oBAAoB,OAAO,GAAGL;IAE9B,MAAMM,aAAapB,WAAWA,CAAC;QAC7B,IAAI,CAACiB,SAAS;QAEd,IAAI;YACFD,UAAU;gBAAE,QAAQV,qBAAqB;YAAC;YAC1C,MAAMW,QAAQ,UAAU;YACxBD,UAAU;gBAAE,QAAQV,mBAAmB;YAAC;QAC1C,EAAE,OAAOY,OAAO;YACdF,UAAU;gBACR,QAAQV,mBAAmB;gBAC3B,OAAOY;YACT;QACF;IACF,GAAG;QAACD;KAAQ;IAEZ,MAAMI,UAAUrB,WAAWA,CAAC;QAC1B,IAAI,CAACiB,SAAS;QAEd,IAAI;YACF,MAAMA,QAAQ,OAAO;YACrBD,UAAU;gBAAE,QAAQV,kBAAkB;YAAC;QACzC,EAAE,OAAOY,OAAO;YACdF,UAAU;gBACR,QAAQV,mBAAmB;gBAC3B,OAAOY;YACT;QACF;IACF,GAAG;QAACD;KAAQ;IAEZhB,SAASA,CAAC;QACR,IAAI,CAACgB,SAAS;QAEd,MAAMK,cAAcL,QAAQ,cAAc,CAAC,CAACM;YAC1CP,UAAUO;QACZ;QAEA,OAAOD;IACT,GAAG;QAACL;KAAQ;IAEZ,+BAA+B;IAC/BhB,SAASA,CAAC;QACR,IAAIuB,YAAY;QAEhB,IAAIX,kBAAkBI,WAAWF,OAAO,MAAM,KAAKT,kBAAkB,EAAE;YACrEU,UAAU;gBAAE,QAAQV,qBAAqB;YAAC;YAC1CW,QACG,UAAU,GACV,IAAI,CAAC;gBACJ,IAAI,CAACO,WAAWR,UAAU;oBAAE,QAAQV,mBAAmB;gBAAC;YAC1D,GACC,KAAK,CAAC,CAACY;gBACN,IAAI,CAACM,WAAWR,UAAU;oBAAE,QAAQV,mBAAmB;oBAAE,OAAOY;gBAAe;YACjF;QACJ;QAEA,OAAO;YACLM,YAAY;QACd;IACF,GAAG;QAACX;QAAgBI;QAASF,OAAO,MAAM;KAAC;IAE3Cd,SAASA,CAAC;QACR,OAAO;YACL,IAAIkB,oBAAoB,OAAO,IAAIF,SAAS;gBAC1CA,QAAQ,OAAO,GAAG,KAAK,CAAC,CAACQ,MAAQrB,kBAAkBA,CAAC,kDAAkDqB;YACxG;QACF;IACF,GAAG;QAACR;KAAQ;IAEZ,MAAMS,UAAUX,OAAO,MAAM,KAAKT,mBAAmB;IACrD,MAAMqB,YAAYZ,OAAO,MAAM,KAAKT,qBAAqB;IACzD,MAAMsB,WAAWb,OAAO,MAAM,KAAKT,mBAAmB;IAEtD,IAAIoB,WAAWT,SAAS;QACtB,OAAO;YACLA;YACAF;YACAK;YACAC;YACA,SAAS;YACT,WAAW;YACX,UAAU;QACZ;IACF;IAEA,OAAO;QACL,SAAS;QACTN;QACAK;QACAC;QACA,SAAS;QACTM;QACAC;IACF;AACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DependencyList } from 'react';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
/**
|
|
4
|
+
* Подписка на Observable из компонента.
|
|
5
|
+
*
|
|
6
|
+
* `source` — либо готовый `Observable<T>` (например `selector.$`), либо фабрика
|
|
7
|
+
* `() => Observable<T>`, собирающая цепочку (`pipe(debounceTime(...))`) при подписке.
|
|
8
|
+
*
|
|
9
|
+
* До первого эмита возвращается `initialValue`. Подписка снимается на unmount и
|
|
10
|
+
* пересоздаётся при смене `deps` (вся цепочка строится заново — актуально для
|
|
11
|
+
* операторов с состоянием вроде `debounceTime`/`scan`). Если `deps` не переданы:
|
|
12
|
+
* для прямого Observable цепочка пересоздаётся при смене ссылки `source`, для
|
|
13
|
+
* фабрики — создаётся один раз.
|
|
14
|
+
*
|
|
15
|
+
* @template T тип значения потока
|
|
16
|
+
*/
|
|
17
|
+
export declare function useObservable<T>(source: Observable<T> | (() => Observable<T>), initialValue: T, deps?: DependencyList): T;
|