synapse-storage 3.0.19 → 4.0.0
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 +661 -104
- package/dist/_utils/chunk.util.d.ts +8 -0
- package/dist/_utils/chunk.util.d.ts.map +1 -0
- package/dist/_utils/chunk.util.js +21 -0
- package/dist/_utils/chunk.util.js.map +1 -0
- package/dist/_utils/deepMerge.util.d.ts +2 -0
- package/dist/_utils/deepMerge.util.d.ts.map +1 -0
- package/dist/_utils/deepMerge.util.js +19 -0
- package/dist/_utils/deepMerge.util.js.map +1 -0
- package/dist/_utils/error-handling.util.d.ts +50 -0
- package/dist/_utils/error-handling.util.d.ts.map +1 -0
- package/dist/_utils/error-handling.util.js +67 -0
- package/dist/_utils/error-handling.util.js.map +1 -0
- package/dist/_utils/flatMap.util.d.ts +10 -0
- package/dist/_utils/flatMap.util.d.ts.map +1 -0
- package/dist/_utils/flatMap.util.js +23 -0
- package/dist/_utils/flatMap.util.js.map +1 -0
- package/dist/_utils/index.d.ts +6 -0
- package/dist/_utils/index.d.ts.map +1 -0
- package/dist/_utils/index.js +13 -0
- package/dist/_utils/index.js.map +1 -0
- package/dist/_utils/logger-console.util.d.ts +9 -0
- package/dist/_utils/logger-console.util.d.ts.map +1 -0
- package/dist/_utils/logger-console.util.js +14 -0
- package/dist/_utils/logger-console.util.js.map +1 -0
- package/dist/api/api.module.d.ts +46 -0
- package/dist/api/api.module.d.ts.map +1 -0
- package/dist/api/api.module.js +121 -0
- package/dist/api/api.module.js.map +1 -0
- package/dist/api/components/endpoint.d.ts +57 -0
- package/dist/api/components/endpoint.d.ts.map +1 -0
- package/dist/api/components/endpoint.js +385 -0
- package/dist/api/components/endpoint.js.map +1 -0
- package/dist/api/components/query-storage.d.ts +100 -0
- package/dist/api/components/query-storage.d.ts.map +1 -0
- package/dist/api/components/query-storage.js +293 -0
- package/dist/api/components/query-storage.js.map +1 -0
- package/dist/api/example.d.ts +83 -0
- package/dist/api/example.d.ts.map +1 -0
- package/dist/api/example.js +90 -0
- package/dist/api/example.js.map +1 -0
- package/dist/api/index.d.ts +4 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +11 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/types/api.interface.d.ts +126 -0
- package/dist/api/types/api.interface.d.ts.map +1 -0
- package/dist/api/types/api.interface.js +15 -0
- package/dist/api/types/api.interface.js.map +1 -0
- package/dist/api/types/endpoint.interface.d.ts +118 -0
- package/dist/api/types/endpoint.interface.d.ts.map +1 -0
- package/dist/api/types/endpoint.interface.js +6 -0
- package/dist/api/types/endpoint.interface.js.map +1 -0
- package/dist/api/types/query.interface.d.ts +85 -0
- package/dist/api/types/query.interface.d.ts.map +1 -0
- package/dist/api/types/query.interface.js +6 -0
- package/dist/api/types/query.interface.js.map +1 -0
- package/dist/api/utils/api-helpers.d.ts +22 -0
- package/dist/api/utils/api-helpers.d.ts.map +1 -0
- package/dist/api/utils/api-helpers.js +44 -0
- package/dist/api/utils/api-helpers.js.map +1 -0
- package/dist/api/utils/create-header-context.d.ts +10 -0
- package/dist/api/utils/create-header-context.d.ts.map +1 -0
- package/dist/api/utils/create-header-context.js +40 -0
- package/dist/api/utils/create-header-context.js.map +1 -0
- package/dist/api/utils/endpoint-headers.d.ts +23 -0
- package/dist/api/utils/endpoint-headers.d.ts.map +1 -0
- package/dist/api/utils/endpoint-headers.js +61 -0
- package/dist/api/utils/endpoint-headers.js.map +1 -0
- package/dist/api/utils/fetch-base-query.d.ts +9 -0
- package/dist/api/utils/fetch-base-query.d.ts.map +1 -0
- package/dist/api/utils/fetch-base-query.js +242 -0
- package/dist/api/utils/fetch-base-query.js.map +1 -0
- package/dist/api/utils/file-utils.d.ts +43 -0
- package/dist/api/utils/file-utils.d.ts.map +1 -0
- package/dist/api/utils/file-utils.js +102 -0
- package/dist/api/utils/file-utils.js.map +1 -0
- package/dist/api/utils/get-cacheable-headers.d.ts +8 -0
- package/dist/api/utils/get-cacheable-headers.d.ts.map +1 -0
- package/dist/api/utils/get-cacheable-headers.js +23 -0
- package/dist/api/utils/get-cacheable-headers.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/selector/index.d.ts +3 -0
- package/dist/core/selector/index.d.ts.map +1 -0
- package/dist/core/selector/index.js +5 -0
- package/dist/core/selector/index.js.map +1 -0
- package/dist/{selector.interface-CA5y-kD_.d.ts → core/selector/selector.interface.d.ts} +41 -8
- package/dist/core/selector/selector.interface.d.ts.map +1 -0
- package/dist/core/selector/selector.interface.js +7 -0
- package/dist/core/selector/selector.interface.js.map +1 -0
- package/dist/core/selector/selector.module.d.ts +36 -0
- package/dist/core/selector/selector.module.d.ts.map +1 -0
- package/dist/core/selector/selector.module.js +412 -0
- package/dist/core/selector/selector.module.js.map +1 -0
- package/dist/core/storage/adapters/async-base-storage.service.d.ts +49 -0
- package/dist/core/storage/adapters/async-base-storage.service.d.ts.map +1 -0
- package/dist/core/storage/adapters/async-base-storage.service.js +505 -0
- package/dist/core/storage/adapters/async-base-storage.service.js.map +1 -0
- package/dist/core/storage/adapters/indexed-DB.service.d.ts +89 -0
- package/dist/core/storage/adapters/indexed-DB.service.d.ts.map +1 -0
- package/dist/core/storage/adapters/indexed-DB.service.js +596 -0
- package/dist/core/storage/adapters/indexed-DB.service.js.map +1 -0
- package/dist/core/storage/adapters/local-storage.service.d.ts +23 -0
- package/dist/core/storage/adapters/local-storage.service.d.ts.map +1 -0
- package/dist/core/storage/adapters/local-storage.service.js +111 -0
- package/dist/core/storage/adapters/local-storage.service.js.map +1 -0
- package/dist/core/storage/adapters/memory-storage.service.d.ts +24 -0
- package/dist/core/storage/adapters/memory-storage.service.d.ts.map +1 -0
- package/dist/core/storage/adapters/memory-storage.service.js +110 -0
- package/dist/core/storage/adapters/memory-storage.service.js.map +1 -0
- package/dist/core/storage/adapters/path.utils.d.ts +5 -0
- package/dist/core/storage/adapters/path.utils.d.ts.map +1 -0
- package/dist/core/storage/adapters/path.utils.js +42 -0
- package/dist/core/storage/adapters/path.utils.js.map +1 -0
- package/dist/core/storage/adapters/storage-core.d.ts +61 -0
- package/dist/core/storage/adapters/storage-core.d.ts.map +1 -0
- package/dist/core/storage/adapters/storage-core.js +221 -0
- package/dist/core/storage/adapters/storage-core.js.map +1 -0
- package/dist/core/storage/adapters/sync-base-storage.service.d.ts +56 -0
- package/dist/core/storage/adapters/sync-base-storage.service.d.ts.map +1 -0
- package/dist/core/storage/adapters/sync-base-storage.service.js +481 -0
- package/dist/core/storage/adapters/sync-base-storage.service.js.map +1 -0
- package/dist/core/storage/index.d.ts +16 -0
- package/dist/core/storage/index.d.ts.map +1 -0
- package/dist/core/storage/index.js +38 -0
- package/dist/core/storage/index.js.map +1 -0
- package/dist/core/storage/middlewares/broadcast.middleware.d.ts +9 -0
- package/dist/core/storage/middlewares/broadcast.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/broadcast.middleware.js +197 -0
- package/dist/core/storage/middlewares/broadcast.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/index.d.ts +9 -0
- package/dist/core/storage/middlewares/index.d.ts.map +1 -0
- package/dist/core/storage/middlewares/index.js +17 -0
- package/dist/core/storage/middlewares/index.js.map +1 -0
- package/dist/core/storage/middlewares/storage-batching.middleware.d.ts +7 -0
- package/dist/core/storage/middlewares/storage-batching.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/storage-batching.middleware.js +108 -0
- package/dist/core/storage/middlewares/storage-batching.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.d.ts +7 -0
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.js +43 -0
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/sync-broadcast.middleware.d.ts +9 -0
- package/dist/core/storage/middlewares/sync-broadcast.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/sync-broadcast.middleware.js +177 -0
- package/dist/core/storage/middlewares/sync-broadcast.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/sync-storage-batching.middleware.d.ts +6 -0
- package/dist/core/storage/middlewares/sync-storage-batching.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/sync-storage-batching.middleware.js +56 -0
- package/dist/core/storage/middlewares/sync-storage-batching.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.d.ts +7 -0
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.js +39 -0
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.js.map +1 -0
- package/dist/core/storage/modules/plugin/plugin.interface.d.ts +101 -0
- package/dist/core/storage/modules/plugin/plugin.interface.d.ts.map +1 -0
- package/dist/core/storage/modules/plugin/plugin.interface.js +8 -0
- package/dist/core/storage/modules/plugin/plugin.interface.js.map +1 -0
- package/dist/core/storage/modules/plugin/plugin.service.d.ts +49 -0
- package/dist/core/storage/modules/plugin/plugin.service.d.ts.map +1 -0
- package/dist/core/storage/modules/plugin/plugin.service.js +406 -0
- package/dist/core/storage/modules/plugin/plugin.service.js.map +1 -0
- package/dist/core/storage/modules/singleton/mixin.util.d.ts +6 -0
- package/dist/core/storage/modules/singleton/mixin.util.d.ts.map +1 -0
- package/dist/core/storage/modules/singleton/mixin.util.js +30 -0
- package/dist/core/storage/modules/singleton/mixin.util.js.map +1 -0
- package/dist/core/storage/modules/singleton/models.d.ts +143 -0
- package/dist/core/storage/modules/singleton/models.d.ts.map +1 -0
- package/dist/core/storage/modules/singleton/models.js +60 -0
- package/dist/core/storage/modules/singleton/models.js.map +1 -0
- package/dist/core/storage/modules/singleton/singleton.util.d.ts +36 -0
- package/dist/core/storage/modules/singleton/singleton.util.d.ts.map +1 -0
- package/dist/core/storage/modules/singleton/singleton.util.js +216 -0
- package/dist/core/storage/modules/singleton/singleton.util.js.map +1 -0
- package/dist/core/storage/storage.interface.d.ts +168 -0
- package/dist/core/storage/storage.interface.d.ts.map +1 -0
- package/dist/core/storage/storage.interface.js +23 -0
- package/dist/core/storage/storage.interface.js.map +1 -0
- package/dist/core/storage/utils/broadcast.util.d.ts +49 -0
- package/dist/core/storage/utils/broadcast.util.d.ts.map +1 -0
- package/dist/core/storage/utils/broadcast.util.js +141 -0
- package/dist/core/storage/utils/broadcast.util.js.map +1 -0
- package/dist/core/storage/utils/cache.util.d.ts +33 -0
- package/dist/core/storage/utils/cache.util.d.ts.map +1 -0
- package/dist/core/storage/utils/cache.util.js +54 -0
- package/dist/core/storage/utils/cache.util.js.map +1 -0
- package/dist/core/storage/utils/middleware-module.d.ts +94 -0
- package/dist/core/storage/utils/middleware-module.d.ts.map +1 -0
- package/dist/core/storage/utils/middleware-module.js +258 -0
- package/dist/core/storage/utils/middleware-module.js.map +1 -0
- package/dist/core/storage/utils/path-selector.util.d.ts +15 -0
- package/dist/core/storage/utils/path-selector.util.d.ts.map +1 -0
- package/dist/core/storage/utils/path-selector.util.js +58 -0
- package/dist/core/storage/utils/path-selector.util.js.map +1 -0
- package/dist/core/storage/utils/state-diff.util.d.ts +14 -0
- package/dist/core/storage/utils/state-diff.util.d.ts.map +1 -0
- package/dist/core/storage/utils/state-diff.util.js +88 -0
- package/dist/core/storage/utils/state-diff.util.js.map +1 -0
- package/dist/core/storage/utils/storage-factory.util.d.ts +21 -0
- package/dist/core/storage/utils/storage-factory.util.d.ts.map +1 -0
- package/dist/core/storage/utils/storage-factory.util.js +40 -0
- package/dist/core/storage/utils/storage-factory.util.js.map +1 -0
- package/dist/core/storage/utils/storage-key.d.ts +11 -0
- package/dist/core/storage/utils/storage-key.d.ts.map +1 -0
- package/dist/core/storage/utils/storage-key.js +24 -0
- package/dist/core/storage/utils/storage-key.js.map +1 -0
- package/dist/core/storage/utils/storage.utils.d.ts +17 -0
- package/dist/core/storage/utils/storage.utils.d.ts.map +1 -0
- package/dist/core/storage/utils/storage.utils.js +57 -0
- package/dist/core/storage/utils/storage.utils.js.map +1 -0
- package/dist/index.d.ts +10 -12
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -0
- package/dist/react/hooks/index.d.ts +5 -0
- package/dist/react/hooks/index.d.ts.map +1 -0
- package/dist/react/hooks/index.js +11 -0
- package/dist/react/hooks/index.js.map +1 -0
- package/dist/react/hooks/useCreateStorage.d.ts +39 -0
- package/dist/react/hooks/useCreateStorage.d.ts.map +1 -0
- package/dist/react/hooks/useCreateStorage.js +137 -0
- package/dist/react/hooks/useCreateStorage.js.map +1 -0
- package/dist/react/hooks/useSelector.d.ts +21 -0
- package/dist/react/hooks/useSelector.d.ts.map +1 -0
- package/dist/react/hooks/useSelector.js +56 -0
- package/dist/react/hooks/useSelector.js.map +1 -0
- package/dist/react/hooks/useStorage.d.ts +39 -0
- package/dist/react/hooks/useStorage.d.ts.map +1 -0
- package/dist/react/hooks/useStorage.js +78 -0
- package/dist/react/hooks/useStorage.js.map +1 -0
- package/dist/react/hooks/useStorageSubscribe.d.ts +16 -0
- package/dist/react/hooks/useStorageSubscribe.d.ts.map +1 -0
- package/dist/react/hooks/useStorageSubscribe.js +55 -0
- package/dist/react/hooks/useStorageSubscribe.js.map +1 -0
- package/dist/react/index.d.ts +3 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +7 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/utils/awaitSynapse.d.ts +34 -0
- package/dist/react/utils/awaitSynapse.d.ts.map +1 -0
- package/dist/react/utils/awaitSynapse.js +87 -0
- package/dist/react/utils/awaitSynapse.js.map +1 -0
- package/dist/react/utils/createSynapseCtx.d.ts +33 -0
- package/dist/react/utils/createSynapseCtx.d.ts.map +1 -0
- package/dist/react/utils/createSynapseCtx.js +139 -0
- package/dist/react/utils/createSynapseCtx.js.map +1 -0
- package/dist/react/utils/index.d.ts +3 -0
- package/dist/react/utils/index.d.ts.map +1 -0
- package/dist/react/utils/index.js +9 -0
- package/dist/react/utils/index.js.map +1 -0
- package/dist/reactive/dispatcher/dispatcher.module.d.ts +216 -0
- package/dist/reactive/dispatcher/dispatcher.module.d.ts.map +1 -0
- package/dist/reactive/dispatcher/dispatcher.module.js +384 -0
- package/dist/reactive/dispatcher/dispatcher.module.js.map +1 -0
- package/dist/reactive/dispatcher/index.d.ts +4 -0
- package/dist/reactive/dispatcher/index.d.ts.map +1 -0
- package/dist/reactive/dispatcher/index.js +9 -0
- package/dist/reactive/dispatcher/index.js.map +1 -0
- package/dist/reactive/dispatcher/middlewares/index.d.ts +2 -0
- package/dist/reactive/dispatcher/middlewares/index.d.ts.map +1 -0
- package/dist/reactive/dispatcher/middlewares/index.js +5 -0
- package/dist/reactive/dispatcher/middlewares/index.js.map +1 -0
- package/dist/reactive/dispatcher/middlewares/logger.middleware.d.ts +37 -0
- package/dist/reactive/dispatcher/middlewares/logger.middleware.d.ts.map +1 -0
- package/dist/reactive/dispatcher/middlewares/logger.middleware.js +188 -0
- package/dist/reactive/dispatcher/middlewares/logger.middleware.js.map +1 -0
- package/dist/reactive/dispatcher/standalone.d.ts +112 -0
- package/dist/reactive/dispatcher/standalone.d.ts.map +1 -0
- package/dist/reactive/dispatcher/standalone.js +142 -0
- package/dist/reactive/dispatcher/standalone.js.map +1 -0
- package/dist/reactive/effects/effects.module.d.ts +225 -0
- package/dist/reactive/effects/effects.module.d.ts.map +1 -0
- package/dist/reactive/effects/effects.module.js +356 -0
- package/dist/reactive/effects/effects.module.js.map +1 -0
- package/dist/reactive/effects/index.d.ts +4 -0
- package/dist/reactive/effects/index.d.ts.map +1 -0
- package/dist/reactive/effects/index.js +11 -0
- package/dist/reactive/effects/index.js.map +1 -0
- package/dist/reactive/effects/utils/chunkRequestConsistent.d.ts +12 -0
- package/dist/reactive/effects/utils/chunkRequestConsistent.d.ts.map +1 -0
- package/dist/reactive/effects/utils/chunkRequestConsistent.js +25 -0
- package/dist/reactive/effects/utils/chunkRequestConsistent.js.map +1 -0
- package/dist/reactive/effects/utils/chunkRequestParallel.d.ts +12 -0
- package/dist/reactive/effects/utils/chunkRequestParallel.d.ts.map +1 -0
- package/dist/reactive/effects/utils/chunkRequestParallel.js +22 -0
- package/dist/reactive/effects/utils/chunkRequestParallel.js.map +1 -0
- package/dist/reactive/effects/utils/fromRequest.d.ts +40 -0
- package/dist/reactive/effects/utils/fromRequest.d.ts.map +1 -0
- package/dist/reactive/effects/utils/fromRequest.js +64 -0
- package/dist/reactive/effects/utils/fromRequest.js.map +1 -0
- package/dist/reactive/effects/utils/index.d.ts +5 -0
- package/dist/reactive/effects/utils/index.d.ts.map +1 -0
- package/dist/reactive/effects/utils/index.js +11 -0
- package/dist/reactive/effects/utils/index.js.map +1 -0
- package/dist/reactive/effects/utils/toObservable.d.ts +23 -0
- package/dist/reactive/effects/utils/toObservable.d.ts.map +1 -0
- package/dist/reactive/effects/utils/toObservable.js +39 -0
- package/dist/reactive/effects/utils/toObservable.js.map +1 -0
- package/dist/reactive/index.d.ts +3 -0
- package/dist/reactive/index.d.ts.map +1 -0
- package/dist/reactive/index.js +7 -0
- package/dist/reactive/index.js.map +1 -0
- package/dist/utils/createEventBus.d.ts +87 -0
- package/dist/utils/createEventBus.d.ts.map +1 -0
- package/dist/utils/createEventBus.js +215 -0
- package/dist/utils/createEventBus.js.map +1 -0
- package/dist/utils/createSynapse/createSynapse.d.ts +9 -0
- package/dist/utils/createSynapse/createSynapse.d.ts.map +1 -0
- package/dist/utils/createSynapse/createSynapse.js +103 -0
- package/dist/utils/createSynapse/createSynapse.js.map +1 -0
- package/dist/utils/createSynapse/index.d.ts +3 -0
- package/dist/utils/createSynapse/index.d.ts.map +1 -0
- package/dist/utils/createSynapse/index.js +6 -0
- package/dist/utils/createSynapse/index.js.map +1 -0
- package/dist/utils/createSynapse/types.d.ts +93 -0
- package/dist/utils/createSynapse/types.d.ts.map +1 -0
- package/dist/utils/createSynapse/types.js +6 -0
- package/dist/utils/createSynapse/types.js.map +1 -0
- package/dist/utils/createSynapse/validate.d.ts +2 -0
- package/dist/utils/createSynapse/validate.d.ts.map +1 -0
- package/dist/utils/createSynapse/validate.js +76 -0
- package/dist/utils/createSynapse/validate.js.map +1 -0
- package/dist/utils/createSynapse/waitForDependencies.d.ts +3 -0
- package/dist/utils/createSynapse/waitForDependencies.d.ts.map +1 -0
- package/dist/utils/createSynapse/waitForDependencies.js +40 -0
- package/dist/utils/createSynapse/waitForDependencies.js.map +1 -0
- package/dist/utils/createSynapseAwaiter.d.ts +46 -0
- package/dist/utils/createSynapseAwaiter.d.ts.map +1 -0
- package/dist/utils/createSynapseAwaiter.js +102 -0
- package/dist/utils/createSynapseAwaiter.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +17 -21
- package/dist/api.d.ts +0 -365
- package/dist/api.js +0 -1
- package/dist/core.d.ts +0 -106
- package/dist/core.js +0 -1
- package/dist/createSynapse-vkfKjRob.d.ts +0 -97
- package/dist/dispatcher.module-BOsMHbD5.d.ts +0 -360
- package/dist/react.d.ts +0 -119
- package/dist/react.js +0 -1
- package/dist/reactive.d.ts +0 -35
- package/dist/reactive.js +0 -1
- package/dist/storage.interface-BA_ktyDz.d.ts +0 -591
- package/dist/utils.d.ts +0 -139
- package/dist/utils.js +0 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @example
|
|
3
|
+
* ```typescript
|
|
4
|
+
* // Строгая проверка - выбросит ошибку при любых различиях
|
|
5
|
+
* const storage1 = new MemoryStorage({
|
|
6
|
+
* name: 'user',
|
|
7
|
+
* singleton: {
|
|
8
|
+
* enabled: true,
|
|
9
|
+
* mergeStrategy: ConfigMergeStrategy.STRICT
|
|
10
|
+
* },
|
|
11
|
+
* initialState: { name: 'John' }
|
|
12
|
+
* })
|
|
13
|
+
*
|
|
14
|
+
* // Глубокое слияние - объединит объекты
|
|
15
|
+
* const storage2 = new MemoryStorage({
|
|
16
|
+
* name: 'settings',
|
|
17
|
+
* singleton: {
|
|
18
|
+
* enabled: true,
|
|
19
|
+
* mergeStrategy: ConfigMergeStrategy.DEEP_MERGE
|
|
20
|
+
* },
|
|
21
|
+
* initialState: { theme: 'dark', notifications: { email: true } }
|
|
22
|
+
* })
|
|
23
|
+
* ```
|
|
24
|
+
*/ var models_ConfigMergeStrategy = /*#__PURE__*/ function(ConfigMergeStrategy) {
|
|
25
|
+
/**
|
|
26
|
+
* Строгая проверка - выбрасывает ошибку при любых отличиях в конфигурации
|
|
27
|
+
*
|
|
28
|
+
* Используйте когда требуется абсолютная идентичность конфигураций
|
|
29
|
+
* для обеспечения предсказуемого поведения
|
|
30
|
+
*/ ConfigMergeStrategy["STRICT"] = "strict";
|
|
31
|
+
/**
|
|
32
|
+
* Первая конфигурация побеждает - игнорирует последующие конфигурации
|
|
33
|
+
*
|
|
34
|
+
* **По умолчанию**. Безопасная стратегия, которая использует настройки
|
|
35
|
+
* первого созданного экземпляра и игнорирует все последующие
|
|
36
|
+
*/ ConfigMergeStrategy["FIRST_WINS"] = "first_wins";
|
|
37
|
+
/**
|
|
38
|
+
* Глубокое слияние объектов - рекурсивно объединяет initialState
|
|
39
|
+
*
|
|
40
|
+
* Полезно когда разные компоненты должны дополнять начальное состояние.
|
|
41
|
+
* Примитивные значения из первой конфигурации сохраняются
|
|
42
|
+
*/ ConfigMergeStrategy["DEEP_MERGE"] = "deep_merge";
|
|
43
|
+
/**
|
|
44
|
+
* Последняя конфигурация перезаписывает предыдущие (кроме name)
|
|
45
|
+
*
|
|
46
|
+
* **Осторожно!** Может привести к непредсказуемому поведению,
|
|
47
|
+
* так как результат зависит от порядка создания компонентов
|
|
48
|
+
*/ ConfigMergeStrategy["OVERRIDE"] = "override";
|
|
49
|
+
/**
|
|
50
|
+
* Предупреждение в консоли + использование первой конфигурации
|
|
51
|
+
*
|
|
52
|
+
* Как FIRST_WINS, но с подробными предупреждениями в консоли
|
|
53
|
+
* о конфликтующих настройках. Полезно для отладки
|
|
54
|
+
*/ ConfigMergeStrategy["WARN_AND_USE_FIRST"] = "warn_and_use_first";
|
|
55
|
+
return ConfigMergeStrategy;
|
|
56
|
+
}({});
|
|
57
|
+
|
|
58
|
+
export { models_ConfigMergeStrategy as ConfigMergeStrategy };
|
|
59
|
+
|
|
60
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core/storage/modules/singleton/models.js","sources":["../../../../../src/core/storage/modules/singleton/models.ts"],"sourcesContent":["/**\n * @example\n * ```typescript\n * // Строгая проверка - выбросит ошибку при любых различиях\n * const storage1 = new MemoryStorage({\n * name: 'user',\n * singleton: {\n * enabled: true,\n * mergeStrategy: ConfigMergeStrategy.STRICT\n * },\n * initialState: { name: 'John' }\n * })\n *\n * // Глубокое слияние - объединит объекты\n * const storage2 = new MemoryStorage({\n * name: 'settings',\n * singleton: {\n * enabled: true,\n * mergeStrategy: ConfigMergeStrategy.DEEP_MERGE\n * },\n * initialState: { theme: 'dark', notifications: { email: true } }\n * })\n * ```\n */\nexport enum ConfigMergeStrategy {\n /**\n * Строгая проверка - выбрасывает ошибку при любых отличиях в конфигурации\n *\n * Используйте когда требуется абсолютная идентичность конфигураций\n * для обеспечения предсказуемого поведения\n */\n STRICT = 'strict',\n\n /**\n * Первая конфигурация побеждает - игнорирует последующие конфигурации\n *\n * **По умолчанию**. Безопасная стратегия, которая использует настройки\n * первого созданного экземпляра и игнорирует все последующие\n */\n FIRST_WINS = 'first_wins',\n\n /**\n * Глубокое слияние объектов - рекурсивно объединяет initialState\n *\n * Полезно когда разные компоненты должны дополнять начальное состояние.\n * Примитивные значения из первой конфигурации сохраняются\n */\n DEEP_MERGE = 'deep_merge',\n\n /**\n * Последняя конфигурация перезаписывает предыдущие (кроме name)\n *\n * **Осторожно!** Может привести к непредсказуемому поведению,\n * так как результат зависит от порядка создания компонентов\n */\n OVERRIDE = 'override',\n\n /**\n * Предупреждение в консоли + использование первой конфигурации\n *\n * Как FIRST_WINS, но с подробными предупреждениями в консоли\n * о конфликтующих настройках. Полезно для отладки\n */\n WARN_AND_USE_FIRST = 'warn_and_use_first',\n}\n\n/**\n * Позволяет переиспользовать экземпляры хранилищ между компонентами\n * по имени, что особенно полезно в React при частых ре-рендерах\n *\n * @example\n * ```typescript\n * // Базовое использование\n * const storage = new MemoryStorage({\n * name: 'user-preferences',\n * singleton: { enabled: true },\n * initialState: { theme: 'light' }\n * })\n *\n * // Продвинутые настройки\n * const storage = new MemoryStorage({\n * name: 'shared-state',\n * singleton: {\n * enabled: true,\n * mergeStrategy: ConfigMergeStrategy.DEEP_MERGE,\n * warnOnConflict: true,\n * key: 'custom-singleton-key'\n * },\n * initialState: { user: null, settings: {} }\n * })\n * ```\n *\n * @see {@link ConfigMergeStrategy} для стратегий разрешения конфликтов\n */\nexport interface SingletonOptions {\n /**\n * Включить Singleton Pattern для данного хранилища\n *\n * При `true` хранилища с одинаковым именем (или ключом) будут\n * возвращать один и тот же экземпляр вместо создания нового\n *\n * @default false\n */\n enabled: boolean\n\n /**\n * Стратегия разрешения конфликтов при различающихся конфигурациях\n *\n * Определяет как поступать, когда singleton с тем же именем\n * создается с отличающимися параметрами (initialState, middlewares и т.д.)\n *\n * @default ConfigMergeStrategy.FIRST_WINS\n * @see {@link ConfigMergeStrategy}\n */\n mergeStrategy?: ConfigMergeStrategy\n\n /**\n * Выводить предупреждения при обнаружении конфликтов конфигурации\n *\n * При `true` будет логировать в консоль информацию о различиях\n * в конфигурациях между экземплярами singleton (кроме стратегии STRICT)\n *\n * @default true\n */\n warnOnConflict?: boolean\n\n /**\n * Кастомный ключ для идентификации singleton экземпляра\n *\n * По умолчанию используется комбинация `{StorageType}_{name}`,\n * но можно задать собственный ключ для более тонкого контроля\n *\n * @example\n * ```typescript\n * // Разные хранилища с одним именем, но разными ключами\n * const userCache = new MemoryStorage({\n * name: 'user',\n * singleton: { enabled: true, key: 'user-cache' }\n * })\n *\n * const userSettings = new LocalStorage({\n * name: 'user', // То же имя!\n * singleton: { enabled: true, key: 'user-settings' } // Но разный ключ\n * })\n * ```\n *\n * @default `${StorageType}_${name}`\n */\n key?: string\n}\n"],"names":["ConfigMergeStrategy"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;CAuBC,GACM,IAAKA,0BAAmBA,0BAAnBA;IACV;;;;;GAKC;IAGD;;;;;GAKC;IAGD;;;;;GAKC;IAGD;;;;;GAKC;IAGD;;;;;GAKC;WAtCSA;MAwCX"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { BaseStorageConfig, ILogger, StorageType } from '../../storage.interface';
|
|
2
|
+
interface SingletonResult<T> {
|
|
3
|
+
instance: T;
|
|
4
|
+
isNewInstance: boolean;
|
|
5
|
+
appliedConfig: BaseStorageConfig;
|
|
6
|
+
conflicts?: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare class SingletonManager {
|
|
9
|
+
private static instances;
|
|
10
|
+
private static configs;
|
|
11
|
+
private static logger?;
|
|
12
|
+
static setLogger(logger: ILogger): void;
|
|
13
|
+
static getOrCreate<T>(key: string, config: BaseStorageConfig, factory: (finalConfig: BaseStorageConfig) => T): SingletonResult<T>;
|
|
14
|
+
static exists(key: string): boolean;
|
|
15
|
+
static getConfig(key: string): BaseStorageConfig | undefined;
|
|
16
|
+
static remove(key: string): boolean;
|
|
17
|
+
static clear(): void;
|
|
18
|
+
static getStats(): {
|
|
19
|
+
instanceCount: number;
|
|
20
|
+
instances: string[];
|
|
21
|
+
};
|
|
22
|
+
private static mergeConfigurations;
|
|
23
|
+
private static strictMerge;
|
|
24
|
+
private static firstWinsMerge;
|
|
25
|
+
private static deepMerge;
|
|
26
|
+
private static overrideMerge;
|
|
27
|
+
private static warnAndUseFirst;
|
|
28
|
+
private static findConflicts;
|
|
29
|
+
private static findObjectConflicts;
|
|
30
|
+
private static deepMergeObjects;
|
|
31
|
+
}
|
|
32
|
+
export declare class SingletonKeyGenerator {
|
|
33
|
+
static generate(config: BaseStorageConfig, storageType: StorageType): string;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=singleton.util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singleton.util.d.ts","sourceRoot":"","sources":["../../../../../src/core/storage/modules/singleton/singleton.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAGjF,UAAU,eAAe,CAAC,CAAC;IACzB,QAAQ,EAAE,CAAC,CAAA;IACX,aAAa,EAAE,OAAO,CAAA;IACtB,aAAa,EAAE,iBAAiB,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAyB;IACjD,OAAO,CAAC,MAAM,CAAC,OAAO,CAAuC;IAC7D,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAS;IAE/B,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAKvC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,WAAW,EAAE,iBAAiB,KAAK,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC;IAgCjI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAKnC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAK5D,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAenC,MAAM,CAAC,KAAK,IAAI,IAAI;IAQpB,MAAM,CAAC,QAAQ,IAAI;QACjB,aAAa,EAAE,MAAM,CAAA;QACrB,SAAS,EAAE,MAAM,EAAE,CAAA;KACpB;IAOD,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAyBlC,OAAO,CAAC,MAAM,CAAC,WAAW;IAU1B,OAAO,CAAC,MAAM,CAAC,cAAc;IAW7B,OAAO,CAAC,MAAM,CAAC,SAAS;IAaxB,OAAO,CAAC,MAAM,CAAC,aAAa;IAa5B,OAAO,CAAC,MAAM,CAAC,eAAe;IAa9B,OAAO,CAAC,MAAM,CAAC,aAAa;IAqB5B,OAAO,CAAC,MAAM,CAAC,mBAAmB;IA0BlC,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAahC;AAGD,qBAAa,qBAAqB;IAChC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM;CAS7E"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { ConfigMergeStrategy } from "./models.js";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class SingletonManager {
|
|
6
|
+
static instances = new Map();
|
|
7
|
+
static configs = new Map();
|
|
8
|
+
static logger;
|
|
9
|
+
static setLogger(logger) {
|
|
10
|
+
this.logger = logger;
|
|
11
|
+
}
|
|
12
|
+
// Основной метод для создания/получения singleton
|
|
13
|
+
static getOrCreate(key, config, factory) {
|
|
14
|
+
const existingConfig = this.configs.get(key);
|
|
15
|
+
const existingInstance = this.instances.get(key);
|
|
16
|
+
// Если экземпляр уже существует
|
|
17
|
+
if (existingInstance && existingConfig) {
|
|
18
|
+
const mergeResult = this.mergeConfigurations(existingConfig, config);
|
|
19
|
+
return {
|
|
20
|
+
instance: existingInstance,
|
|
21
|
+
isNewInstance: false,
|
|
22
|
+
appliedConfig: mergeResult.finalConfig,
|
|
23
|
+
conflicts: mergeResult.conflicts
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// Создаем новый экземпляр
|
|
27
|
+
const instance = factory(config);
|
|
28
|
+
this.instances.set(key, instance);
|
|
29
|
+
this.configs.set(key, {
|
|
30
|
+
...config
|
|
31
|
+
});
|
|
32
|
+
this.logger?.debug(`Created new singleton instance: ${key}`);
|
|
33
|
+
return {
|
|
34
|
+
instance,
|
|
35
|
+
isNewInstance: true,
|
|
36
|
+
appliedConfig: config,
|
|
37
|
+
conflicts: []
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// Проверка существования singleton
|
|
41
|
+
static exists(key) {
|
|
42
|
+
return this.instances.has(key);
|
|
43
|
+
}
|
|
44
|
+
// Получение конфигурации singleton
|
|
45
|
+
static getConfig(key) {
|
|
46
|
+
return this.configs.get(key);
|
|
47
|
+
}
|
|
48
|
+
// Удаление singleton из реестра (без вызова destroy)
|
|
49
|
+
static remove(key) {
|
|
50
|
+
const existed = this.instances.has(key);
|
|
51
|
+
if (existed) {
|
|
52
|
+
this.instances.delete(key);
|
|
53
|
+
this.configs.delete(key);
|
|
54
|
+
this.logger?.debug(`Removed singleton instance: ${key}`);
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
// Очистка реестра singleton (без вызова destroy)
|
|
60
|
+
static clear() {
|
|
61
|
+
this.instances.clear();
|
|
62
|
+
this.configs.clear();
|
|
63
|
+
this.logger?.debug('Cleared all singleton instances');
|
|
64
|
+
}
|
|
65
|
+
// Получение статистики
|
|
66
|
+
static getStats() {
|
|
67
|
+
return {
|
|
68
|
+
instanceCount: this.instances.size,
|
|
69
|
+
instances: Array.from(this.instances.keys())
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
static mergeConfigurations(existing, incoming) {
|
|
73
|
+
const strategy = incoming.singleton?.mergeStrategy || ConfigMergeStrategy.FIRST_WINS;
|
|
74
|
+
const warnOnConflict = incoming.singleton?.warnOnConflict ?? true;
|
|
75
|
+
switch(strategy){
|
|
76
|
+
case ConfigMergeStrategy.STRICT:
|
|
77
|
+
return this.strictMerge(existing, incoming);
|
|
78
|
+
case ConfigMergeStrategy.FIRST_WINS:
|
|
79
|
+
return this.firstWinsMerge(existing, incoming, warnOnConflict);
|
|
80
|
+
case ConfigMergeStrategy.DEEP_MERGE:
|
|
81
|
+
return this.deepMerge(existing, incoming);
|
|
82
|
+
case ConfigMergeStrategy.OVERRIDE:
|
|
83
|
+
return this.overrideMerge(existing, incoming);
|
|
84
|
+
case ConfigMergeStrategy.WARN_AND_USE_FIRST:
|
|
85
|
+
return this.warnAndUseFirst(existing, incoming);
|
|
86
|
+
default:
|
|
87
|
+
return this.firstWinsMerge(existing, incoming, warnOnConflict);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
static strictMerge(existing, incoming) {
|
|
91
|
+
const conflicts = this.findConflicts(existing, incoming);
|
|
92
|
+
if (conflicts.length > 0) {
|
|
93
|
+
throw new Error(`Strict singleton validation failed for "${existing.name}". Conflicts: ${conflicts.join(', ')}`);
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
finalConfig: existing,
|
|
97
|
+
conflicts: []
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
static firstWinsMerge(existing, incoming, warn) {
|
|
101
|
+
const conflicts = this.findConflicts(existing, incoming);
|
|
102
|
+
if (warn && conflicts.length > 0) {
|
|
103
|
+
this.logger?.warn(`Singleton config conflicts for "${existing.name}":`, conflicts);
|
|
104
|
+
this.logger?.warn('Using existing configuration');
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
finalConfig: existing,
|
|
108
|
+
conflicts
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
static deepMerge(existing, incoming) {
|
|
112
|
+
const conflicts = this.findConflicts(existing, incoming);
|
|
113
|
+
const mergedConfig = {
|
|
114
|
+
...existing,
|
|
115
|
+
initialState: this.deepMergeObjects(existing.initialState || {}, incoming.initialState || {})
|
|
116
|
+
};
|
|
117
|
+
this.logger?.debug(`Deep merged singleton config for "${existing.name}"`);
|
|
118
|
+
return {
|
|
119
|
+
finalConfig: mergedConfig,
|
|
120
|
+
conflicts
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
static overrideMerge(existing, incoming) {
|
|
124
|
+
const conflicts = this.findConflicts(existing, incoming);
|
|
125
|
+
const mergedConfig = {
|
|
126
|
+
...incoming,
|
|
127
|
+
name: existing.name
|
|
128
|
+
};
|
|
129
|
+
this.logger?.warn(`Overriding singleton config for "${existing.name}"`);
|
|
130
|
+
return {
|
|
131
|
+
finalConfig: mergedConfig,
|
|
132
|
+
conflicts
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
static warnAndUseFirst(existing, incoming) {
|
|
136
|
+
const conflicts = this.findConflicts(existing, incoming);
|
|
137
|
+
if (conflicts.length > 0) {
|
|
138
|
+
this.logger?.warn(`Configuration conflicts detected for singleton "${existing.name}":`);
|
|
139
|
+
this.logger?.warn('Existing config:', existing);
|
|
140
|
+
this.logger?.warn('Incoming config:', incoming);
|
|
141
|
+
this.logger?.warn('Using existing configuration');
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
finalConfig: existing,
|
|
145
|
+
conflicts
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
static findConflicts(config1, config2) {
|
|
149
|
+
const conflicts = [];
|
|
150
|
+
// Проверяем initialState
|
|
151
|
+
if (config1.initialState && config2.initialState) {
|
|
152
|
+
const stateConflicts = this.findObjectConflicts(config1.initialState, config2.initialState, 'initialState');
|
|
153
|
+
conflicts.push(...stateConflicts);
|
|
154
|
+
} else if (config1.initialState !== config2.initialState) {
|
|
155
|
+
conflicts.push('initialState: one is undefined');
|
|
156
|
+
}
|
|
157
|
+
// Проверяем middlewares (базовая проверка — поле живёт в SyncStorageConfig/AsyncStorageConfig)
|
|
158
|
+
const c1 = config1;
|
|
159
|
+
const c2 = config2;
|
|
160
|
+
if (!!c1.middlewares !== !!c2.middlewares) {
|
|
161
|
+
conflicts.push('middlewares: configuration differs');
|
|
162
|
+
}
|
|
163
|
+
return conflicts;
|
|
164
|
+
}
|
|
165
|
+
static findObjectConflicts(obj1, obj2, path) {
|
|
166
|
+
const conflicts = [];
|
|
167
|
+
const allKeys = new Set([
|
|
168
|
+
...Object.keys(obj1 || {}),
|
|
169
|
+
...Object.keys(obj2 || {})
|
|
170
|
+
]);
|
|
171
|
+
for (const key of allKeys){
|
|
172
|
+
const currentPath = `${path}.${key}`;
|
|
173
|
+
const val1 = obj1?.[key];
|
|
174
|
+
const val2 = obj2?.[key];
|
|
175
|
+
if (val1 === val2) continue;
|
|
176
|
+
if (val1 === undefined || val2 === undefined) {
|
|
177
|
+
conflicts.push(`${currentPath}: missing in one config`);
|
|
178
|
+
} else if (typeof val1 !== typeof val2) {
|
|
179
|
+
conflicts.push(`${currentPath}: type mismatch (${typeof val1} vs ${typeof val2})`);
|
|
180
|
+
} else if (typeof val1 === 'object' && val1 !== null && val2 !== null) {
|
|
181
|
+
conflicts.push(...this.findObjectConflicts(val1, val2, currentPath));
|
|
182
|
+
} else {
|
|
183
|
+
conflicts.push(`${currentPath}: value mismatch (${val1} vs ${val2})`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return conflicts;
|
|
187
|
+
}
|
|
188
|
+
static deepMergeObjects(target, source) {
|
|
189
|
+
const result = {
|
|
190
|
+
...target
|
|
191
|
+
};
|
|
192
|
+
for(const key in source){
|
|
193
|
+
if (source[key] !== null && typeof source[key] === 'object' && !Array.isArray(source[key])) {
|
|
194
|
+
result[key] = this.deepMergeObjects(target[key] || {}, source[key]);
|
|
195
|
+
} else {
|
|
196
|
+
result[key] = source[key];
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Хелпер для генерации ключа singleton
|
|
203
|
+
class SingletonKeyGenerator {
|
|
204
|
+
static generate(config, storageType) {
|
|
205
|
+
// Если указан кастомный ключ
|
|
206
|
+
if (config.singleton?.key) {
|
|
207
|
+
return config.singleton.key;
|
|
208
|
+
}
|
|
209
|
+
// Стандартный ключ: тип + имя
|
|
210
|
+
return `${storageType}_${config.name}`;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export { SingletonKeyGenerator, SingletonManager };
|
|
215
|
+
|
|
216
|
+
//# sourceMappingURL=singleton.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core/storage/modules/singleton/singleton.util.js","sources":["../../../../../src/core/storage/modules/singleton/singleton.util.ts"],"sourcesContent":["import { BaseStorageConfig, ILogger, StorageType } from '../../storage.interface'\nimport { ConfigMergeStrategy } from './models'\n\ninterface SingletonResult<T> {\n instance: T\n isNewInstance: boolean\n appliedConfig: BaseStorageConfig\n conflicts?: string[]\n}\n\nexport class SingletonManager {\n private static instances = new Map<string, any>()\n private static configs = new Map<string, BaseStorageConfig>()\n private static logger?: ILogger\n\n static setLogger(logger: ILogger): void {\n this.logger = logger\n }\n\n // Основной метод для создания/получения singleton\n static getOrCreate<T>(key: string, config: BaseStorageConfig, factory: (finalConfig: BaseStorageConfig) => T): SingletonResult<T> {\n const existingConfig = this.configs.get(key)\n const existingInstance = this.instances.get(key)\n\n // Если экземпляр уже существует\n if (existingInstance && existingConfig) {\n const mergeResult = this.mergeConfigurations(existingConfig, config)\n\n return {\n instance: existingInstance,\n isNewInstance: false,\n appliedConfig: mergeResult.finalConfig,\n conflicts: mergeResult.conflicts,\n }\n }\n\n // Создаем новый экземпляр\n const instance = factory(config)\n this.instances.set(key, instance)\n this.configs.set(key, { ...config })\n\n this.logger?.debug(`Created new singleton instance: ${key}`)\n\n return {\n instance,\n isNewInstance: true,\n appliedConfig: config,\n conflicts: [],\n }\n }\n\n // Проверка существования singleton\n static exists(key: string): boolean {\n return this.instances.has(key)\n }\n\n // Получение конфигурации singleton\n static getConfig(key: string): BaseStorageConfig | undefined {\n return this.configs.get(key)\n }\n\n // Удаление singleton из реестра (без вызова destroy)\n static remove(key: string): boolean {\n const existed = this.instances.has(key)\n\n if (existed) {\n this.instances.delete(key)\n this.configs.delete(key)\n\n this.logger?.debug(`Removed singleton instance: ${key}`)\n return true\n }\n\n return false\n }\n\n // Очистка реестра singleton (без вызова destroy)\n static clear(): void {\n this.instances.clear()\n this.configs.clear()\n\n this.logger?.debug('Cleared all singleton instances')\n }\n\n // Получение статистики\n static getStats(): {\n instanceCount: number\n instances: string[]\n } {\n return {\n instanceCount: this.instances.size,\n instances: Array.from(this.instances.keys()),\n }\n }\n\n private static mergeConfigurations(existing: BaseStorageConfig, incoming: BaseStorageConfig): { finalConfig: BaseStorageConfig; conflicts: string[] } {\n const strategy = incoming.singleton?.mergeStrategy || ConfigMergeStrategy.FIRST_WINS\n const warnOnConflict = incoming.singleton?.warnOnConflict ?? true\n\n switch (strategy) {\n case ConfigMergeStrategy.STRICT:\n return this.strictMerge(existing, incoming)\n\n case ConfigMergeStrategy.FIRST_WINS:\n return this.firstWinsMerge(existing, incoming, warnOnConflict)\n\n case ConfigMergeStrategy.DEEP_MERGE:\n return this.deepMerge(existing, incoming)\n\n case ConfigMergeStrategy.OVERRIDE:\n return this.overrideMerge(existing, incoming)\n\n case ConfigMergeStrategy.WARN_AND_USE_FIRST:\n return this.warnAndUseFirst(existing, incoming)\n\n default:\n return this.firstWinsMerge(existing, incoming, warnOnConflict)\n }\n }\n\n private static strictMerge(existing: BaseStorageConfig, incoming: BaseStorageConfig): { finalConfig: BaseStorageConfig; conflicts: string[] } {\n const conflicts = this.findConflicts(existing, incoming)\n\n if (conflicts.length > 0) {\n throw new Error(`Strict singleton validation failed for \"${existing.name}\". Conflicts: ${conflicts.join(', ')}`)\n }\n\n return { finalConfig: existing, conflicts: [] }\n }\n\n private static firstWinsMerge(existing: BaseStorageConfig, incoming: BaseStorageConfig, warn: boolean): { finalConfig: BaseStorageConfig; conflicts: string[] } {\n const conflicts = this.findConflicts(existing, incoming)\n\n if (warn && conflicts.length > 0) {\n this.logger?.warn(`Singleton config conflicts for \"${existing.name}\":`, conflicts)\n this.logger?.warn('Using existing configuration')\n }\n\n return { finalConfig: existing, conflicts }\n }\n\n private static deepMerge(existing: BaseStorageConfig, incoming: BaseStorageConfig): { finalConfig: BaseStorageConfig; conflicts: string[] } {\n const conflicts = this.findConflicts(existing, incoming)\n\n const mergedConfig: BaseStorageConfig = {\n ...existing,\n initialState: this.deepMergeObjects(existing.initialState || {}, incoming.initialState || {}),\n }\n\n this.logger?.debug(`Deep merged singleton config for \"${existing.name}\"`)\n\n return { finalConfig: mergedConfig, conflicts }\n }\n\n private static overrideMerge(existing: BaseStorageConfig, incoming: BaseStorageConfig): { finalConfig: BaseStorageConfig; conflicts: string[] } {\n const conflicts = this.findConflicts(existing, incoming)\n\n const mergedConfig: BaseStorageConfig = {\n ...incoming,\n name: existing.name, // name никогда не перезаписываем\n }\n\n this.logger?.warn(`Overriding singleton config for \"${existing.name}\"`)\n\n return { finalConfig: mergedConfig, conflicts }\n }\n\n private static warnAndUseFirst(existing: BaseStorageConfig, incoming: BaseStorageConfig): { finalConfig: BaseStorageConfig; conflicts: string[] } {\n const conflicts = this.findConflicts(existing, incoming)\n\n if (conflicts.length > 0) {\n this.logger?.warn(`Configuration conflicts detected for singleton \"${existing.name}\":`)\n this.logger?.warn('Existing config:', existing)\n this.logger?.warn('Incoming config:', incoming)\n this.logger?.warn('Using existing configuration')\n }\n\n return { finalConfig: existing, conflicts }\n }\n\n private static findConflicts(config1: BaseStorageConfig, config2: BaseStorageConfig): string[] {\n const conflicts: string[] = []\n\n // Проверяем initialState\n if (config1.initialState && config2.initialState) {\n const stateConflicts = this.findObjectConflicts(config1.initialState, config2.initialState, 'initialState')\n conflicts.push(...stateConflicts)\n } else if (config1.initialState !== config2.initialState) {\n conflicts.push('initialState: one is undefined')\n }\n\n // Проверяем middlewares (базовая проверка — поле живёт в SyncStorageConfig/AsyncStorageConfig)\n const c1 = config1 as Record<string, any>\n const c2 = config2 as Record<string, any>\n if (!!c1.middlewares !== !!c2.middlewares) {\n conflicts.push('middlewares: configuration differs')\n }\n\n return conflicts\n }\n\n private static findObjectConflicts(obj1: any, obj2: any, path: string): string[] {\n const conflicts: string[] = []\n\n const allKeys = new Set([...Object.keys(obj1 || {}), ...Object.keys(obj2 || {})])\n\n for (const key of allKeys) {\n const currentPath = `${path}.${key}`\n const val1 = obj1?.[key]\n const val2 = obj2?.[key]\n\n if (val1 === val2) continue\n\n if (val1 === undefined || val2 === undefined) {\n conflicts.push(`${currentPath}: missing in one config`)\n } else if (typeof val1 !== typeof val2) {\n conflicts.push(`${currentPath}: type mismatch (${typeof val1} vs ${typeof val2})`)\n } else if (typeof val1 === 'object' && val1 !== null && val2 !== null) {\n conflicts.push(...this.findObjectConflicts(val1, val2, currentPath))\n } else {\n conflicts.push(`${currentPath}: value mismatch (${val1} vs ${val2})`)\n }\n }\n\n return conflicts\n }\n\n private static deepMergeObjects(target: any, source: any): any {\n const result = { ...target }\n\n for (const key in source) {\n if (source[key] !== null && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n result[key] = this.deepMergeObjects(target[key] || {}, source[key])\n } else {\n result[key] = source[key]\n }\n }\n\n return result\n }\n}\n\n// Хелпер для генерации ключа singleton\nexport class SingletonKeyGenerator {\n static generate(config: BaseStorageConfig, storageType: StorageType): string {\n // Если указан кастомный ключ\n if (config.singleton?.key) {\n return config.singleton.key\n }\n\n // Стандартный ключ: тип + имя\n return `${storageType}_${config.name}`\n }\n}\n"],"names":["ConfigMergeStrategy","SingletonManager","Map","logger","key","config","factory","existingConfig","existingInstance","mergeResult","instance","existed","Array","existing","incoming","strategy","warnOnConflict","conflicts","Error","warn","mergedConfig","config1","config2","stateConflicts","c1","c2","obj1","obj2","path","allKeys","Set","Object","currentPath","val1","val2","undefined","target","source","result","SingletonKeyGenerator","storageType"],"mappings":"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"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { IndexedDBConfig } from './adapters/indexed-DB.service';
|
|
2
|
+
import { BatchingMiddlewareOptions, ShallowCompareMiddlewareOptions } from './middlewares';
|
|
3
|
+
import { SingletonOptions } from './modules/singleton/models';
|
|
4
|
+
import { AsyncMiddleware, AsyncMiddlewareAPI, AsyncNextFunction, Middleware, MiddlewareAPI, NextFunction, StorageAction, SyncMiddleware, SyncMiddlewareAPI, SyncNextFunction } from './utils/middleware-module';
|
|
5
|
+
import { StorageKeyType } from './utils/storage-key';
|
|
6
|
+
export declare enum StorageStatus {
|
|
7
|
+
IDLE = "idle",
|
|
8
|
+
LOADING = "loading",
|
|
9
|
+
READY = "ready",
|
|
10
|
+
ERROR = "error"
|
|
11
|
+
}
|
|
12
|
+
export interface StorageInitStatus {
|
|
13
|
+
status: StorageStatus;
|
|
14
|
+
error?: Error;
|
|
15
|
+
}
|
|
16
|
+
export declare enum StorageEvents {
|
|
17
|
+
STORAGE_UPDATE = "storage:update",
|
|
18
|
+
STORAGE_DELETE = "storage:delete",
|
|
19
|
+
STORAGE_PATCH = "storage:patch",
|
|
20
|
+
STORAGE_SELECT = "storage:select",
|
|
21
|
+
STORAGE_CLEAR = "storage:clear",
|
|
22
|
+
STORAGE_DESTROY = "storage:destroy"
|
|
23
|
+
}
|
|
24
|
+
export interface StorageEvent<T = any> {
|
|
25
|
+
type: string;
|
|
26
|
+
payload?: T;
|
|
27
|
+
metadata?: Record<string, any>;
|
|
28
|
+
}
|
|
29
|
+
export interface IEventEmitter {
|
|
30
|
+
emit(event: StorageEvent): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
export interface ILogger {
|
|
33
|
+
debug(message: string, meta?: Record<string, any>): void;
|
|
34
|
+
info(message: string, meta?: Record<string, any>): void;
|
|
35
|
+
warn(message: string, meta?: Record<string, any>): void;
|
|
36
|
+
error(message: string, meta?: Record<string, any>): void;
|
|
37
|
+
}
|
|
38
|
+
export type { AsyncMiddleware, AsyncMiddlewareAPI, AsyncNextFunction, Middleware, MiddlewareAPI, NextFunction, StorageAction, SyncMiddleware, SyncMiddlewareAPI, SyncNextFunction };
|
|
39
|
+
/**
|
|
40
|
+
* Базовый интерфейс для всех хранилищ.
|
|
41
|
+
* Содержит lifecycle, sync-доступ к кешу, подписки и метаданные.
|
|
42
|
+
*/
|
|
43
|
+
export interface IStorageBase<T extends Record<string, any> = any> {
|
|
44
|
+
/** Имя хранилища */
|
|
45
|
+
readonly name: string;
|
|
46
|
+
/** Тип хранилища */
|
|
47
|
+
readonly type: StorageType;
|
|
48
|
+
/** Инициализация хранилища (всегда async — загрузка данных, миграции и т.д.) */
|
|
49
|
+
initialize(): Promise<this>;
|
|
50
|
+
/** Уничтожение хранилища */
|
|
51
|
+
destroy(): Promise<void>;
|
|
52
|
+
/** Ожидание готовности хранилища */
|
|
53
|
+
waitForReady(): Promise<this>;
|
|
54
|
+
/** Синхронное получение состояния из кеша (доступно для всех типов хранилищ) */
|
|
55
|
+
getStateSync(): T;
|
|
56
|
+
/** Подписка на изменение конкретного ключа */
|
|
57
|
+
subscribe(key: StorageKeyType, callback: (value: any) => void): VoidFunction;
|
|
58
|
+
/** Подписка через path-selector */
|
|
59
|
+
subscribe<R>(pathSelector: (state: T) => R, callback: (value: R) => void): VoidFunction;
|
|
60
|
+
/** Подписка на все изменения хранилища */
|
|
61
|
+
subscribeToAll(callback: (event: {
|
|
62
|
+
type: string;
|
|
63
|
+
changedPaths?: string[];
|
|
64
|
+
key?: StorageKeyType[] | StorageKeyType;
|
|
65
|
+
value?: any;
|
|
66
|
+
}) => void): VoidFunction;
|
|
67
|
+
/** Текущий статус инициализации */
|
|
68
|
+
readonly initStatus: StorageInitStatus;
|
|
69
|
+
/** Подписка на изменение статуса инициализации */
|
|
70
|
+
onStatusChange(callback: (status: StorageInitStatus) => void): VoidFunction;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Синхронное хранилище.
|
|
74
|
+
* Memory и LocalStorage реализуют этот интерфейс.
|
|
75
|
+
* Все операции чтения/записи выполняются синхронно.
|
|
76
|
+
*/
|
|
77
|
+
export interface ISyncStorage<T extends Record<string, any> = any> extends IStorageBase<T> {
|
|
78
|
+
get<R>(key: StorageKeyType): R | undefined;
|
|
79
|
+
set<R>(key: StorageKeyType, value: R): void;
|
|
80
|
+
update(updater: (state: T) => void): void;
|
|
81
|
+
remove(key: StorageKeyType): void;
|
|
82
|
+
has(key: StorageKeyType): boolean;
|
|
83
|
+
clear(): void;
|
|
84
|
+
/** Сброс состояния к initialState (или к {} если initialState не задан) */
|
|
85
|
+
reset(): void;
|
|
86
|
+
keys(): string[];
|
|
87
|
+
getState(): T;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Асинхронное хранилище.
|
|
91
|
+
* IndexedDB реализует этот интерфейс.
|
|
92
|
+
* Все операции чтения/записи возвращают Promise.
|
|
93
|
+
*/
|
|
94
|
+
export interface IAsyncStorage<T extends Record<string, any> = any> extends IStorageBase<T> {
|
|
95
|
+
get<R>(key: StorageKeyType): Promise<R | undefined>;
|
|
96
|
+
set<R>(key: StorageKeyType, value: R): Promise<void>;
|
|
97
|
+
update(updater: (state: T) => void): Promise<void>;
|
|
98
|
+
remove(key: StorageKeyType): Promise<void>;
|
|
99
|
+
has(key: StorageKeyType): Promise<boolean>;
|
|
100
|
+
clear(): Promise<void>;
|
|
101
|
+
/** Сброс состояния к initialState (или к {} если initialState не задан) */
|
|
102
|
+
reset(): Promise<void>;
|
|
103
|
+
keys(): Promise<string[]>;
|
|
104
|
+
getState(): Promise<T>;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Union type — любое хранилище.
|
|
108
|
+
* Используется когда тип хранилища неизвестен на этапе компиляции.
|
|
109
|
+
*/
|
|
110
|
+
export type IStorage<T extends Record<string, any> = any> = ISyncStorage<T> | IAsyncStorage<T>;
|
|
111
|
+
export type StorageType = 'memory' | 'localStorage' | 'indexedDB';
|
|
112
|
+
export interface SyncDefaultMiddlewares {
|
|
113
|
+
batching: (options?: BatchingMiddlewareOptions) => SyncMiddleware;
|
|
114
|
+
shallowCompare: (options?: ShallowCompareMiddlewareOptions) => SyncMiddleware;
|
|
115
|
+
}
|
|
116
|
+
export interface AsyncDefaultMiddlewares {
|
|
117
|
+
batching: (options?: BatchingMiddlewareOptions) => AsyncMiddleware;
|
|
118
|
+
shallowCompare: (options?: ShallowCompareMiddlewareOptions) => AsyncMiddleware;
|
|
119
|
+
}
|
|
120
|
+
/** @deprecated Use SyncDefaultMiddlewares or AsyncDefaultMiddlewares */
|
|
121
|
+
export type DefaultMiddlewares = AsyncDefaultMiddlewares;
|
|
122
|
+
export type GetSyncDefaultMiddleware = () => SyncDefaultMiddlewares;
|
|
123
|
+
export type GetAsyncDefaultMiddleware = () => AsyncDefaultMiddlewares;
|
|
124
|
+
/** @deprecated Use GetAsyncDefaultMiddleware */
|
|
125
|
+
export type GetDefaultMiddleware = GetAsyncDefaultMiddleware;
|
|
126
|
+
export type ConfigureSyncMiddlewares = (getDefaultMiddleware: GetSyncDefaultMiddleware) => SyncMiddleware[];
|
|
127
|
+
export type ConfigureAsyncMiddlewares = (getDefaultMiddleware: GetAsyncDefaultMiddleware) => AsyncMiddleware[];
|
|
128
|
+
/** @deprecated Use ConfigureAsyncMiddlewares */
|
|
129
|
+
export type ConfigureMiddlewares = ConfigureAsyncMiddlewares;
|
|
130
|
+
/** Базовая конфигурация хранилища (общие поля) */
|
|
131
|
+
export interface BaseStorageConfig<T extends Record<string, any> = Record<string, any>> {
|
|
132
|
+
name: string;
|
|
133
|
+
initialState?: T;
|
|
134
|
+
singleton?: SingletonOptions;
|
|
135
|
+
}
|
|
136
|
+
/** Конфигурация для sync-хранилищ (Memory, LocalStorage) */
|
|
137
|
+
export interface SyncStorageConfig<T extends Record<string, any> = Record<string, any>> extends BaseStorageConfig<T> {
|
|
138
|
+
middlewares?: ConfigureSyncMiddlewares;
|
|
139
|
+
}
|
|
140
|
+
/** Конфигурация для async-хранилищ (IndexedDB) */
|
|
141
|
+
export interface AsyncStorageConfig<T extends Record<string, any> = Record<string, any>> extends BaseStorageConfig<T> {
|
|
142
|
+
middlewares?: ConfigureAsyncMiddlewares;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* @deprecated Use SyncStorageConfig or AsyncStorageConfig
|
|
146
|
+
* Обратная совместимость — общий StorageConfig
|
|
147
|
+
*/
|
|
148
|
+
export interface StorageConfig<T extends Record<string, any> = Record<string, any>> {
|
|
149
|
+
name: string;
|
|
150
|
+
initialState?: T;
|
|
151
|
+
middlewares?: ConfigureMiddlewares;
|
|
152
|
+
}
|
|
153
|
+
/** @deprecated Use SyncStorageConfig */
|
|
154
|
+
export interface StorageSingletonConfig<T extends Record<string, any> = Record<string, any>> extends StorageConfig<T> {
|
|
155
|
+
singleton?: SingletonOptions;
|
|
156
|
+
}
|
|
157
|
+
export type MemoryStorageConfig<T extends Record<string, any> = Record<string, any>> = SyncStorageConfig<T>;
|
|
158
|
+
export type LocalStorageConfig<T extends Record<string, any> = Record<string, any>> = SyncStorageConfig<T>;
|
|
159
|
+
export interface IndexedDBStorageConfig<T extends Record<string, any> = Record<string, any>> extends AsyncStorageConfig<T> {
|
|
160
|
+
options: IndexedDBConfig;
|
|
161
|
+
}
|
|
162
|
+
/** Для универсальных методов (factory) — конфиг с явным типом */
|
|
163
|
+
export interface UniversalStorageConfig<T extends Record<string, any> = Record<string, any>> extends BaseStorageConfig<T> {
|
|
164
|
+
type: StorageType;
|
|
165
|
+
middlewares?: ConfigureSyncMiddlewares | ConfigureAsyncMiddlewares;
|
|
166
|
+
options?: IndexedDBConfig;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=storage.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.interface.d.ts","sourceRoot":"","sources":["../../../src/core/storage/storage.interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// storage.interface.ts
|
|
2
|
+
// ─── Storage Status ────────────────────────────────────────────────────────────
|
|
3
|
+
var storage_interface_StorageStatus = /*#__PURE__*/ function(StorageStatus) {
|
|
4
|
+
StorageStatus["IDLE"] = "idle";
|
|
5
|
+
StorageStatus["LOADING"] = "loading";
|
|
6
|
+
StorageStatus["READY"] = "ready";
|
|
7
|
+
StorageStatus["ERROR"] = "error";
|
|
8
|
+
return StorageStatus;
|
|
9
|
+
}({});
|
|
10
|
+
// ─── Storage Events ────────────────────────────────────────────────────────────
|
|
11
|
+
var storage_interface_StorageEvents = /*#__PURE__*/ function(StorageEvents) {
|
|
12
|
+
StorageEvents["STORAGE_UPDATE"] = "storage:update";
|
|
13
|
+
StorageEvents["STORAGE_DELETE"] = "storage:delete";
|
|
14
|
+
StorageEvents["STORAGE_PATCH"] = "storage:patch";
|
|
15
|
+
StorageEvents["STORAGE_SELECT"] = "storage:select";
|
|
16
|
+
StorageEvents["STORAGE_CLEAR"] = "storage:clear";
|
|
17
|
+
StorageEvents["STORAGE_DESTROY"] = "storage:destroy";
|
|
18
|
+
return StorageEvents;
|
|
19
|
+
}({});
|
|
20
|
+
|
|
21
|
+
export { storage_interface_StorageEvents as StorageEvents, storage_interface_StorageStatus as StorageStatus };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=storage.interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core/storage/storage.interface.js","sources":["../../../src/core/storage/storage.interface.ts"],"sourcesContent":["// storage.interface.ts\nimport { IndexedDBConfig } from './adapters/indexed-DB.service'\nimport { BatchingMiddlewareOptions, ShallowCompareMiddlewareOptions } from './middlewares'\nimport { SingletonOptions } from './modules/singleton/models'\nimport {\n AsyncMiddleware,\n AsyncMiddlewareAPI,\n AsyncNextFunction,\n Middleware,\n MiddlewareAPI,\n NextFunction,\n StorageAction,\n SyncMiddleware,\n SyncMiddlewareAPI,\n SyncNextFunction,\n} from './utils/middleware-module'\nimport { StorageKeyType } from './utils/storage-key'\n\n// ─── Storage Status ────────────────────────────────────────────────────────────\n\nexport enum StorageStatus {\n IDLE = 'idle',\n LOADING = 'loading',\n READY = 'ready',\n ERROR = 'error',\n}\n\nexport interface StorageInitStatus {\n status: StorageStatus\n error?: Error\n}\n\n// ─── Storage Events ────────────────────────────────────────────────────────────\n\nexport enum StorageEvents {\n STORAGE_UPDATE = 'storage:update',\n STORAGE_DELETE = 'storage:delete',\n STORAGE_PATCH = 'storage:patch',\n STORAGE_SELECT = 'storage:select',\n STORAGE_CLEAR = 'storage:clear',\n STORAGE_DESTROY = 'storage:destroy',\n}\n\nexport interface StorageEvent<T = any> {\n type: string\n payload?: T\n metadata?: Record<string, any>\n}\n\n// ─── Utility Interfaces ────────────────────────────────────────────────────────\n\nexport interface IEventEmitter {\n emit(event: StorageEvent): Promise<void>\n}\n\nexport interface ILogger {\n debug(message: string, meta?: Record<string, any>): void\n info(message: string, meta?: Record<string, any>): void\n warn(message: string, meta?: Record<string, any>): void\n error(message: string, meta?: Record<string, any>): void\n}\n\n// ─── Middleware Types (re-exported from middleware-module) ─────────────────────\n\nexport type { AsyncMiddleware, AsyncMiddlewareAPI, AsyncNextFunction, Middleware, MiddlewareAPI, NextFunction, StorageAction, SyncMiddleware, SyncMiddlewareAPI, SyncNextFunction }\n\n// ─── Storage Interfaces ────────────────────────────────────────────────────────\n\n/**\n * Базовый интерфейс для всех хранилищ.\n * Содержит lifecycle, sync-доступ к кешу, подписки и метаданные.\n */\nexport interface IStorageBase<T extends Record<string, any> = any> {\n /** Имя хранилища */\n readonly name: string\n\n /** Тип хранилища */\n readonly type: StorageType\n\n // ─── Lifecycle ─────────────────────────────────────────────────────────────\n\n /** Инициализация хранилища (всегда async — загрузка данных, миграции и т.д.) */\n initialize(): Promise<this>\n\n /** Уничтожение хранилища */\n destroy(): Promise<void>\n\n /** Ожидание готовности хранилища */\n waitForReady(): Promise<this>\n\n // ─── Sync-доступ к кешу ────────────────────────────────────────────────────\n\n /** Синхронное получение состояния из кеша (доступно для всех типов хранилищ) */\n getStateSync(): T\n\n // ─── Подписки ──────────────────────────────────────────────────────────────\n\n /** Подписка на изменение конкретного ключа */\n subscribe(key: StorageKeyType, callback: (value: any) => void): VoidFunction\n\n /** Подписка через path-selector */\n subscribe<R>(pathSelector: (state: T) => R, callback: (value: R) => void): VoidFunction\n\n /** Подписка на все изменения хранилища */\n subscribeToAll(callback: (event: { type: string; changedPaths?: string[]; key?: StorageKeyType[] | StorageKeyType; value?: any }) => void): VoidFunction\n\n /** Текущий статус инициализации */\n readonly initStatus: StorageInitStatus\n\n /** Подписка на изменение статуса инициализации */\n onStatusChange(callback: (status: StorageInitStatus) => void): VoidFunction\n}\n\n/**\n * Синхронное хранилище.\n * Memory и LocalStorage реализуют этот интерфейс.\n * Все операции чтения/записи выполняются синхронно.\n */\nexport interface ISyncStorage<T extends Record<string, any> = any> extends IStorageBase<T> {\n get<R>(key: StorageKeyType): R | undefined\n set<R>(key: StorageKeyType, value: R): void\n update(updater: (state: T) => void): void\n remove(key: StorageKeyType): void\n has(key: StorageKeyType): boolean\n clear(): void\n /** Сброс состояния к initialState (или к {} если initialState не задан) */\n reset(): void\n keys(): string[]\n getState(): T\n}\n\n/**\n * Асинхронное хранилище.\n * IndexedDB реализует этот интерфейс.\n * Все операции чтения/записи возвращают Promise.\n */\nexport interface IAsyncStorage<T extends Record<string, any> = any> extends IStorageBase<T> {\n get<R>(key: StorageKeyType): Promise<R | undefined>\n set<R>(key: StorageKeyType, value: R): Promise<void>\n update(updater: (state: T) => void): Promise<void>\n remove(key: StorageKeyType): Promise<void>\n has(key: StorageKeyType): Promise<boolean>\n clear(): Promise<void>\n /** Сброс состояния к initialState (или к {} если initialState не задан) */\n reset(): Promise<void>\n keys(): Promise<string[]>\n getState(): Promise<T>\n}\n\n/**\n * Union type — любое хранилище.\n * Используется когда тип хранилища неизвестен на этапе компиляции.\n */\nexport type IStorage<T extends Record<string, any> = any> = ISyncStorage<T> | IAsyncStorage<T>\n\n// ─── Config Types ──────────────────────────────────────────────────────────────\n\nexport type StorageType = 'memory' | 'localStorage' | 'indexedDB'\n\n// --- Default middleware helpers ---\n\nexport interface SyncDefaultMiddlewares {\n batching: (options?: BatchingMiddlewareOptions) => SyncMiddleware\n shallowCompare: (options?: ShallowCompareMiddlewareOptions) => SyncMiddleware\n}\n\nexport interface AsyncDefaultMiddlewares {\n batching: (options?: BatchingMiddlewareOptions) => AsyncMiddleware\n shallowCompare: (options?: ShallowCompareMiddlewareOptions) => AsyncMiddleware\n}\n\n/** @deprecated Use SyncDefaultMiddlewares or AsyncDefaultMiddlewares */\nexport type DefaultMiddlewares = AsyncDefaultMiddlewares\n\nexport type GetSyncDefaultMiddleware = () => SyncDefaultMiddlewares\nexport type GetAsyncDefaultMiddleware = () => AsyncDefaultMiddlewares\n\n/** @deprecated Use GetAsyncDefaultMiddleware */\nexport type GetDefaultMiddleware = GetAsyncDefaultMiddleware\n\nexport type ConfigureSyncMiddlewares = (getDefaultMiddleware: GetSyncDefaultMiddleware) => SyncMiddleware[]\nexport type ConfigureAsyncMiddlewares = (getDefaultMiddleware: GetAsyncDefaultMiddleware) => AsyncMiddleware[]\n\n/** @deprecated Use ConfigureAsyncMiddlewares */\nexport type ConfigureMiddlewares = ConfigureAsyncMiddlewares\n\n// --- Storage configs ---\n\n/** Базовая конфигурация хранилища (общие поля) */\nexport interface BaseStorageConfig<T extends Record<string, any> = Record<string, any>> {\n name: string\n initialState?: T\n singleton?: SingletonOptions\n}\n\n/** Конфигурация для sync-хранилищ (Memory, LocalStorage) */\nexport interface SyncStorageConfig<T extends Record<string, any> = Record<string, any>> extends BaseStorageConfig<T> {\n middlewares?: ConfigureSyncMiddlewares\n}\n\n/** Конфигурация для async-хранилищ (IndexedDB) */\nexport interface AsyncStorageConfig<T extends Record<string, any> = Record<string, any>> extends BaseStorageConfig<T> {\n middlewares?: ConfigureAsyncMiddlewares\n}\n\n/**\n * @deprecated Use SyncStorageConfig or AsyncStorageConfig\n * Обратная совместимость — общий StorageConfig\n */\nexport interface StorageConfig<T extends Record<string, any> = Record<string, any>> {\n name: string\n initialState?: T\n middlewares?: ConfigureMiddlewares\n}\n\n/** @deprecated Use SyncStorageConfig */\nexport interface StorageSingletonConfig<T extends Record<string, any> = Record<string, any>> extends StorageConfig<T> {\n singleton?: SingletonOptions\n}\n\n// --- Specific storage configs ---\n\nexport type MemoryStorageConfig<T extends Record<string, any> = Record<string, any>> = SyncStorageConfig<T>\n\nexport type LocalStorageConfig<T extends Record<string, any> = Record<string, any>> = SyncStorageConfig<T>\n\nexport interface IndexedDBStorageConfig<T extends Record<string, any> = Record<string, any>> extends AsyncStorageConfig<T> {\n options: IndexedDBConfig\n}\n\n/** Для универсальных методов (factory) — конфиг с явным типом */\nexport interface UniversalStorageConfig<T extends Record<string, any> = Record<string, any>> extends BaseStorageConfig<T> {\n type: StorageType\n middlewares?: ConfigureSyncMiddlewares | ConfigureAsyncMiddlewares\n options?: IndexedDBConfig\n}\n"],"names":["StorageStatus","StorageEvents"],"mappings":"AAAA,uBAAuB;AAkBvB,kFAAkF;AAE3E,IAAKA,+BAAaA,0BAAbA;;;;;WAAAA;MAKX;AAOD,kFAAkF;AAE3E,IAAKC,+BAAaA,0BAAbA;;;;;;;WAAAA;MAOX"}
|