synapse-storage 3.0.19 → 4.0.1
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 +28 -168
- 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,197 @@
|
|
|
1
|
+
import { handleCallbackError, logError } from "../../../_utils/error-handling.util.js";
|
|
2
|
+
import { StorageEvents } from "../storage.interface.js";
|
|
3
|
+
import { SyncBroadcastChannel } from "../utils/broadcast.util.js";
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
// Обработка сообщений для MemoryStorage
|
|
12
|
+
async function handleMemoryStorageMessage(api, type, payload) {
|
|
13
|
+
switch(type){
|
|
14
|
+
case 'set':
|
|
15
|
+
if (payload?.key !== undefined && payload?.value !== undefined) {
|
|
16
|
+
await api.storage.doSet(payload.key, payload.value);
|
|
17
|
+
api.storage.notifySubscribers(payload.key, payload.value);
|
|
18
|
+
}
|
|
19
|
+
break;
|
|
20
|
+
case 'update':
|
|
21
|
+
if (Array.isArray(payload?.value)) {
|
|
22
|
+
await api.storage.doUpdate(payload.value);
|
|
23
|
+
//@ts-ignore
|
|
24
|
+
payload.value.forEach(({ key, value })=>{
|
|
25
|
+
//@ts-ignore
|
|
26
|
+
api.storage.notifySubscribers(key, value);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
break;
|
|
30
|
+
case 'delete':
|
|
31
|
+
if (payload?.key !== undefined) {
|
|
32
|
+
await api.storage.doDelete(payload.key);
|
|
33
|
+
api.storage.notifySubscribers(payload.key, undefined);
|
|
34
|
+
}
|
|
35
|
+
break;
|
|
36
|
+
case 'clear':
|
|
37
|
+
await api.storage.doClear();
|
|
38
|
+
api.storage.notifySubscribers('*', {
|
|
39
|
+
type: StorageEvents.STORAGE_UPDATE,
|
|
40
|
+
value: {},
|
|
41
|
+
source: 'broadcast'
|
|
42
|
+
});
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
// Уведомляем глобальных подписчиков
|
|
46
|
+
api.storage.notifySubscribers('*', {
|
|
47
|
+
type: StorageEvents.STORAGE_UPDATE,
|
|
48
|
+
key: payload?.key,
|
|
49
|
+
value: payload?.value,
|
|
50
|
+
source: 'broadcast'
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
// Обработка сообщений для LocalStorage и IndexedDB
|
|
54
|
+
async function handlePersistentStorageMessage(api, type, payload) {
|
|
55
|
+
// Для LocalStorage и IndexedDB данные уже синхронизированы браузером
|
|
56
|
+
// Нужно только получить актуальные данные и уведомить подписчиков
|
|
57
|
+
switch(type){
|
|
58
|
+
case 'set':
|
|
59
|
+
if (payload?.key !== undefined) {
|
|
60
|
+
// Получаем актуальное значение из хранилища
|
|
61
|
+
const currentValue = await api.storage.doGet(payload.key);
|
|
62
|
+
api.storage.notifySubscribers(payload.key, currentValue);
|
|
63
|
+
}
|
|
64
|
+
break;
|
|
65
|
+
case 'update':
|
|
66
|
+
if (Array.isArray(payload?.value)) {
|
|
67
|
+
// Получаем актуальные значения для каждого обновленного ключа
|
|
68
|
+
for (const { key } of payload.value){
|
|
69
|
+
const currentValue = await api.storage.doGet(key);
|
|
70
|
+
api.storage.notifySubscribers(key, currentValue);
|
|
71
|
+
}
|
|
72
|
+
// Уведомляем об обновлении с актуальными данными
|
|
73
|
+
api.storage.notifySubscribers('*', {
|
|
74
|
+
type: StorageEvents.STORAGE_UPDATE,
|
|
75
|
+
//@ts-ignore
|
|
76
|
+
key: payload.value.map(({ key })=>key),
|
|
77
|
+
value: payload.value,
|
|
78
|
+
source: 'broadcast'
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
case 'delete':
|
|
83
|
+
if (payload?.key !== undefined) {
|
|
84
|
+
api.storage.notifySubscribers(payload.key, undefined);
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
case 'clear':
|
|
88
|
+
// При очистке уведомляем всех подписчиков
|
|
89
|
+
api.storage.notifySubscribers('*', {
|
|
90
|
+
type: StorageEvents.STORAGE_UPDATE,
|
|
91
|
+
value: {},
|
|
92
|
+
source: 'broadcast'
|
|
93
|
+
});
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
// Общее уведомление для глобальных подписчиков
|
|
97
|
+
if (type !== 'update') {
|
|
98
|
+
// Для update уже отправили выше
|
|
99
|
+
api.storage.notifySubscribers('*', {
|
|
100
|
+
type: StorageEvents.STORAGE_UPDATE,
|
|
101
|
+
key: payload?.key,
|
|
102
|
+
value: type === 'delete' ? undefined : payload?.value,
|
|
103
|
+
source: 'broadcast'
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const broadcastMiddleware = (props)=>{
|
|
108
|
+
const { storageName, storageType } = props;
|
|
109
|
+
const channelName = `${storageType}-${storageName}`;
|
|
110
|
+
const channel = new SyncBroadcastChannel(channelName, {
|
|
111
|
+
debug: true
|
|
112
|
+
});
|
|
113
|
+
return {
|
|
114
|
+
name: 'broadcast',
|
|
115
|
+
setup: (api)=>{
|
|
116
|
+
// Настройка синхронизации для MemoryStorage
|
|
117
|
+
if (storageType === 'memory') {
|
|
118
|
+
channel.setSyncHandler(async ()=>{
|
|
119
|
+
const state = await api.getState();
|
|
120
|
+
const updates = Object.entries(state).map(([key, value])=>({
|
|
121
|
+
key,
|
|
122
|
+
value
|
|
123
|
+
}));
|
|
124
|
+
const action = {
|
|
125
|
+
type: 'update',
|
|
126
|
+
key: '*',
|
|
127
|
+
value: updates,
|
|
128
|
+
metadata: {
|
|
129
|
+
batchUpdate: true,
|
|
130
|
+
timestamp: Date.now()
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
return action;
|
|
134
|
+
});
|
|
135
|
+
// Запрашиваем начальную синхронизацию для MemoryStorage
|
|
136
|
+
channel.requestSync().then(async (action)=>{
|
|
137
|
+
if (action?.type === 'update' && Array.isArray(action.value)) {
|
|
138
|
+
try {
|
|
139
|
+
const validUpdates = action.value.every((update)=>update && typeof update === 'object' && 'key' in update && 'value' in update);
|
|
140
|
+
if (!validUpdates) {
|
|
141
|
+
logError('broadcastMiddleware: invalid sync response updates structure', action.value);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
await api.storage.doUpdate(action.value);
|
|
145
|
+
// Уведомляем подписчиков о каждом обновленном значении
|
|
146
|
+
action.value.forEach(({ key, value })=>{
|
|
147
|
+
api.storage.notifySubscribers(key, value);
|
|
148
|
+
});
|
|
149
|
+
// Уведомляем глобальных подписчиков
|
|
150
|
+
api.storage.notifySubscribers('*', {
|
|
151
|
+
type: StorageEvents.STORAGE_UPDATE,
|
|
152
|
+
value: action.value,
|
|
153
|
+
source: 'broadcast'
|
|
154
|
+
});
|
|
155
|
+
} catch (error) {
|
|
156
|
+
handleCallbackError('broadcastMiddleware: error applying sync updates', error);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}).catch((error)=>{
|
|
160
|
+
logError('broadcastMiddleware: initial sync failed', error, null, 'warn');
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
// Подписка на сообщения от других вкладок
|
|
164
|
+
return channel.subscribe(async (message)=>{
|
|
165
|
+
const { type, payload } = message;
|
|
166
|
+
if (storageType === 'memory') {
|
|
167
|
+
// Для MemoryStorage обновляем данные и уведомляем подписчиков
|
|
168
|
+
await handleMemoryStorageMessage(api, type, payload);
|
|
169
|
+
} else {
|
|
170
|
+
// Для LocalStorage и IndexedDB только уведомляем подписчиков
|
|
171
|
+
await handlePersistentStorageMessage(api, type, payload);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
},
|
|
175
|
+
reducer: (api)=>(next)=>async (action)=>{
|
|
176
|
+
const result = await next(action);
|
|
177
|
+
// Отправляем сообщение другим вкладкам для всех типов операций
|
|
178
|
+
// Текущая вкладка уже получила уведомления через обычный flow BaseStorage
|
|
179
|
+
if ([
|
|
180
|
+
'set',
|
|
181
|
+
'delete',
|
|
182
|
+
'clear',
|
|
183
|
+
'update'
|
|
184
|
+
].includes(action.type)) {
|
|
185
|
+
channel.broadcast(action.type, action);
|
|
186
|
+
}
|
|
187
|
+
return result;
|
|
188
|
+
},
|
|
189
|
+
cleanup: ()=>{
|
|
190
|
+
channel.close();
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
export { broadcastMiddleware };
|
|
196
|
+
|
|
197
|
+
//# sourceMappingURL=broadcast.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core/storage/middlewares/broadcast.middleware.js","sources":["../../../../src/core/storage/middlewares/broadcast.middleware.ts"],"sourcesContent":["import { handleCallbackError, logError } from '../../../_utils/error-handling.util'\nimport { StorageEvents, StorageType } from '../storage.interface'\nimport { SyncBroadcastChannel } from '../utils/broadcast.util'\nimport { Middleware, MiddlewareAPI, NextFunction, StorageAction } from '../utils/middleware-module'\n\ninterface SharedStateMiddlewareProps {\n storageType: StorageType\n storageName: string\n}\n\n// Обработка сообщений для MemoryStorage\nasync function handleMemoryStorageMessage(api: MiddlewareAPI, type: string, payload: any): Promise<void> {\n switch (type) {\n case 'set':\n if (payload?.key !== undefined && payload?.value !== undefined) {\n await api.storage.doSet(payload.key, payload.value)\n api.storage.notifySubscribers(payload.key, payload.value)\n }\n break\n\n case 'update':\n if (Array.isArray(payload?.value)) {\n await api.storage.doUpdate(payload.value)\n //@ts-ignore\n payload.value.forEach(({ key, value }) => {\n //@ts-ignore\n api.storage.notifySubscribers(key, value)\n })\n }\n break\n\n case 'delete':\n if (payload?.key !== undefined) {\n await api.storage.doDelete(payload.key)\n api.storage.notifySubscribers(payload.key, undefined)\n }\n break\n\n case 'clear':\n await api.storage.doClear()\n api.storage.notifySubscribers('*', {\n type: StorageEvents.STORAGE_UPDATE,\n value: {},\n source: 'broadcast',\n })\n break\n }\n\n // Уведомляем глобальных подписчиков\n api.storage.notifySubscribers('*', {\n type: StorageEvents.STORAGE_UPDATE,\n key: payload?.key,\n value: payload?.value,\n source: 'broadcast',\n })\n}\n\n// Обработка сообщений для LocalStorage и IndexedDB\nasync function handlePersistentStorageMessage(api: MiddlewareAPI, type: string, payload: any): Promise<void> {\n // Для LocalStorage и IndexedDB данные уже синхронизированы браузером\n // Нужно только получить актуальные данные и уведомить подписчиков\n\n switch (type) {\n case 'set':\n if (payload?.key !== undefined) {\n // Получаем актуальное значение из хранилища\n const currentValue = await api.storage.doGet(payload.key)\n api.storage.notifySubscribers(payload.key, currentValue)\n }\n break\n\n case 'update':\n if (Array.isArray(payload?.value)) {\n // Получаем актуальные значения для каждого обновленного ключа\n for (const { key } of payload.value) {\n const currentValue = await api.storage.doGet(key)\n api.storage.notifySubscribers(key, currentValue)\n }\n\n // Уведомляем об обновлении с актуальными данными\n api.storage.notifySubscribers('*', {\n type: StorageEvents.STORAGE_UPDATE,\n //@ts-ignore\n key: payload.value.map(({ key }) => key),\n value: payload.value,\n source: 'broadcast',\n })\n }\n break\n\n case 'delete':\n if (payload?.key !== undefined) {\n api.storage.notifySubscribers(payload.key, undefined)\n }\n break\n\n case 'clear':\n // При очистке уведомляем всех подписчиков\n api.storage.notifySubscribers('*', {\n type: StorageEvents.STORAGE_UPDATE,\n value: {},\n source: 'broadcast',\n })\n break\n }\n\n // Общее уведомление для глобальных подписчиков\n if (type !== 'update') {\n // Для update уже отправили выше\n api.storage.notifySubscribers('*', {\n type: StorageEvents.STORAGE_UPDATE,\n key: payload?.key,\n value: type === 'delete' ? undefined : payload?.value,\n source: 'broadcast',\n })\n }\n}\n\nexport const broadcastMiddleware = (props: SharedStateMiddlewareProps): Middleware => {\n const { storageName, storageType } = props\n const channelName = `${storageType}-${storageName}`\n const channel = new SyncBroadcastChannel<StorageAction>(channelName, { debug: true })\n\n return {\n name: 'broadcast',\n setup: (api: MiddlewareAPI) => {\n // Настройка синхронизации для MemoryStorage\n if (storageType === 'memory') {\n channel.setSyncHandler(async () => {\n const state = await api.getState()\n\n const updates = Object.entries(state).map(([key, value]) => ({\n key,\n value,\n }))\n\n const action: StorageAction = {\n type: 'update',\n key: '*',\n value: updates,\n metadata: {\n batchUpdate: true,\n timestamp: Date.now(),\n },\n }\n return action\n })\n\n // Запрашиваем начальную синхронизацию для MemoryStorage\n channel\n .requestSync()\n .then(async (action) => {\n if (action?.type === 'update' && Array.isArray(action.value)) {\n try {\n const validUpdates = action.value.every((update) => update && typeof update === 'object' && 'key' in update && 'value' in update)\n\n if (!validUpdates) {\n logError('broadcastMiddleware: invalid sync response updates structure', action.value)\n return\n }\n\n await api.storage.doUpdate(action.value)\n\n // Уведомляем подписчиков о каждом обновленном значении\n action.value.forEach(({ key, value }) => {\n api.storage.notifySubscribers(key, value)\n })\n\n // Уведомляем глобальных подписчиков\n api.storage.notifySubscribers('*', {\n type: StorageEvents.STORAGE_UPDATE,\n value: action.value,\n source: 'broadcast',\n })\n } catch (error) {\n handleCallbackError('broadcastMiddleware: error applying sync updates', error)\n }\n }\n })\n .catch((error) => {\n logError('broadcastMiddleware: initial sync failed', error, null, 'warn')\n })\n }\n\n // Подписка на сообщения от других вкладок\n return channel.subscribe(async (message) => {\n const { type, payload } = message\n\n if (storageType === 'memory') {\n // Для MemoryStorage обновляем данные и уведомляем подписчиков\n await handleMemoryStorageMessage(api, type, payload)\n } else {\n // Для LocalStorage и IndexedDB только уведомляем подписчиков\n await handlePersistentStorageMessage(api, type, payload)\n }\n })\n },\n\n reducer: (api: MiddlewareAPI) => (next: NextFunction) => async (action: StorageAction) => {\n const result = await next(action)\n\n // Отправляем сообщение другим вкладкам для всех типов операций\n // Текущая вкладка уже получила уведомления через обычный flow BaseStorage\n if (['set', 'delete', 'clear', 'update'].includes(action.type)) {\n channel.broadcast(action.type, action)\n }\n\n return result\n },\n\n cleanup: () => {\n channel.close()\n },\n }\n}\n"],"names":["handleCallbackError","logError","StorageEvents","SyncBroadcastChannel","handleMemoryStorageMessage","api","type","payload","undefined","Array","key","value","handlePersistentStorageMessage","currentValue","broadcastMiddleware","props","storageName","storageType","channelName","channel","state","updates","Object","action","Date","validUpdates","update","error","message","next","result"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { broadcastMiddleware } from './broadcast.middleware';
|
|
2
|
+
export type { BatchingMiddlewareOptions } from './storage-batching.middleware';
|
|
3
|
+
export type { ShallowCompareMiddlewareOptions } from './storage-shallow-compare.middleware';
|
|
4
|
+
export { syncBroadcastMiddleware } from './sync-broadcast.middleware';
|
|
5
|
+
export type { SyncBatchingMiddlewareOptions } from './sync-storage-batching.middleware';
|
|
6
|
+
export { syncBatchingMiddleware } from './sync-storage-batching.middleware';
|
|
7
|
+
export type { SyncShallowCompareMiddlewareOptions } from './sync-storage-shallow-compare.middleware';
|
|
8
|
+
export { syncShallowCompareMiddleware } from './sync-storage-shallow-compare.middleware';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/storage/middlewares/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,YAAY,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAC9E,YAAY,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAA;AAG3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AACrE,YAAY,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAA;AACvF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AAC3E,YAAY,EAAE,mCAAmC,EAAE,MAAM,2CAA2C,CAAA;AACpG,OAAO,EAAE,4BAA4B,EAAE,MAAM,2CAA2C,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
// Async middlewares (existing)
|
|
6
|
+
|
|
7
|
+
// Sync middlewares
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
export { broadcastMiddleware } from "./broadcast.middleware.js";
|
|
13
|
+
export { syncBroadcastMiddleware } from "./sync-broadcast.middleware.js";
|
|
14
|
+
export { syncBatchingMiddleware } from "./sync-storage-batching.middleware.js";
|
|
15
|
+
export { syncShallowCompareMiddleware } from "./sync-storage-shallow-compare.middleware.js";
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core/storage/middlewares/index.js","sources":["../../../../src/core/storage/middlewares/index.ts"],"sourcesContent":["// Async middlewares (existing)\nexport { broadcastMiddleware } from './broadcast.middleware'\nexport type { BatchingMiddlewareOptions } from './storage-batching.middleware'\nexport type { ShallowCompareMiddlewareOptions } from './storage-shallow-compare.middleware'\n\n// Sync middlewares\nexport { syncBroadcastMiddleware } from './sync-broadcast.middleware'\nexport type { SyncBatchingMiddlewareOptions } from './sync-storage-batching.middleware'\nexport { syncBatchingMiddleware } from './sync-storage-batching.middleware'\nexport type { SyncShallowCompareMiddlewareOptions } from './sync-storage-shallow-compare.middleware'\nexport { syncShallowCompareMiddleware } from './sync-storage-shallow-compare.middleware'\n"],"names":["broadcastMiddleware","syncBroadcastMiddleware","syncBatchingMiddleware","syncShallowCompareMiddleware"],"mappings":";;;;AAAA,+BAA+B;AAC6B;AAI5D,mBAAmB;AACkD;AAEM;AAEa"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Middleware } from '../utils/middleware-module';
|
|
2
|
+
export interface BatchingMiddlewareOptions {
|
|
3
|
+
batchSize?: number;
|
|
4
|
+
batchDelay?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare const batchingMiddleware: (options?: BatchingMiddlewareOptions) => Middleware;
|
|
7
|
+
//# sourceMappingURL=storage-batching.middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-batching.middleware.d.ts","sourceRoot":"","sources":["../../../../src/core/storage/middlewares/storage-batching.middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAA8C,MAAM,4BAA4B,CAAA;AAEnG,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AASD,eAAO,MAAM,kBAAkB,GAAI,UAAS,yBAA8B,KAAG,UA0H5E,CAAA"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// storage-batching.middleware.ts - ИСПРАВЛЕННАЯ ВЕРСИЯ
|
|
2
|
+
const batchingMiddleware = (options = {})=>{
|
|
3
|
+
const batchSize = options.batchSize ?? 10;
|
|
4
|
+
const batchDelay = options.batchDelay ?? 10 // Уменьшил для более быстрого батчинга
|
|
5
|
+
;
|
|
6
|
+
const queues = new Map();
|
|
7
|
+
const timeouts = new Map();
|
|
8
|
+
const shouldBatch = (action)=>{
|
|
9
|
+
return action.type === 'set' || action.type === 'update';
|
|
10
|
+
};
|
|
11
|
+
const getSegmentKey = (action)=>{
|
|
12
|
+
return `${action.type}_${action.key?.toString() || 'default'}`;
|
|
13
|
+
};
|
|
14
|
+
const mergeActions = (actions)=>{
|
|
15
|
+
const merged = new Map();
|
|
16
|
+
// Группируем по ключу и оставляем только последнее значение
|
|
17
|
+
for (const action of actions){
|
|
18
|
+
const key = `${action.type}_${action.key?.toString() || 'default'}`;
|
|
19
|
+
merged.set(key, action); // Последнее действие перезаписывает предыдущие
|
|
20
|
+
}
|
|
21
|
+
return Array.from(merged.values());
|
|
22
|
+
};
|
|
23
|
+
const clearTimeout = (segment)=>{
|
|
24
|
+
const timeout = timeouts.get(segment);
|
|
25
|
+
if (timeout) {
|
|
26
|
+
globalThis.clearTimeout(timeout);
|
|
27
|
+
timeouts.delete(segment);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const setTimeout = (segment, callback)=>{
|
|
31
|
+
const timeout = globalThis.setTimeout(callback, batchDelay);
|
|
32
|
+
timeouts.set(segment, timeout);
|
|
33
|
+
};
|
|
34
|
+
const processBatch = async (segment, api, next)=>{
|
|
35
|
+
const queue = queues.get(segment);
|
|
36
|
+
if (!queue || queue.length === 0) return;
|
|
37
|
+
// Очищаем очередь и таймер
|
|
38
|
+
queues.delete(segment);
|
|
39
|
+
clearTimeout(segment);
|
|
40
|
+
try {
|
|
41
|
+
// Объединяем действия
|
|
42
|
+
const actions = queue.map((item)=>item.action);
|
|
43
|
+
const mergedActions = mergeActions(actions);
|
|
44
|
+
// Выполняем только merged actions
|
|
45
|
+
for (const mergedAction of mergedActions){
|
|
46
|
+
try {
|
|
47
|
+
// Выполняем merged действие
|
|
48
|
+
const result = await next(mergedAction);
|
|
49
|
+
// Находим все queue items, которые соответствуют этому merged action
|
|
50
|
+
const matchingItems = queue.filter((item)=>item.action.type === mergedAction.type && item.action.key?.toString() === mergedAction.key?.toString());
|
|
51
|
+
// Все соответствующие items получают результат merged операции
|
|
52
|
+
matchingItems.forEach((item)=>item.resolve(result));
|
|
53
|
+
} catch (error) {
|
|
54
|
+
// В случае ошибки отклоняем соответствующие промисы
|
|
55
|
+
const matchingItems = queue.filter((item)=>item.action.type === mergedAction.type && item.action.key?.toString() === mergedAction.key?.toString());
|
|
56
|
+
matchingItems.forEach((item)=>item.reject(error));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
} catch (error) {
|
|
60
|
+
// В случае общей ошибки отклоняем все промисы
|
|
61
|
+
queue.forEach((item)=>item.reject(error));
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const addToQueue = async (action, api, next)=>{
|
|
65
|
+
return new Promise((resolve, reject)=>{
|
|
66
|
+
const segment = getSegmentKey(action);
|
|
67
|
+
let queue = queues.get(segment);
|
|
68
|
+
if (!queue) {
|
|
69
|
+
queue = [];
|
|
70
|
+
queues.set(segment, queue);
|
|
71
|
+
}
|
|
72
|
+
queue.push({
|
|
73
|
+
action,
|
|
74
|
+
resolve,
|
|
75
|
+
reject,
|
|
76
|
+
timestamp: Date.now()
|
|
77
|
+
});
|
|
78
|
+
clearTimeout(segment);
|
|
79
|
+
if (queue.length >= batchSize) {
|
|
80
|
+
// Немедленно обрабатываем батч
|
|
81
|
+
queueMicrotask(()=>processBatch(segment, api, next));
|
|
82
|
+
} else {
|
|
83
|
+
// Устанавливаем таймер
|
|
84
|
+
setTimeout(segment, ()=>processBatch(segment, api, next));
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
return {
|
|
89
|
+
name: 'batching',
|
|
90
|
+
setup: ()=>{},
|
|
91
|
+
cleanup: async ()=>{
|
|
92
|
+
// Очищаем таймеры
|
|
93
|
+
timeouts.forEach((timeout)=>globalThis.clearTimeout(timeout));
|
|
94
|
+
timeouts.clear();
|
|
95
|
+
queues.clear();
|
|
96
|
+
},
|
|
97
|
+
reducer: (api)=>(next)=>async (action)=>{
|
|
98
|
+
if (!shouldBatch(action)) {
|
|
99
|
+
return next(action);
|
|
100
|
+
}
|
|
101
|
+
return addToQueue(action, api, next);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
export { batchingMiddleware };
|
|
107
|
+
|
|
108
|
+
//# sourceMappingURL=storage-batching.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core/storage/middlewares/storage-batching.middleware.js","sources":["../../../../src/core/storage/middlewares/storage-batching.middleware.ts"],"sourcesContent":["// storage-batching.middleware.ts - ИСПРАВЛЕННАЯ ВЕРСИЯ\nimport { Middleware, MiddlewareAPI, NextFunction, StorageAction } from '../utils/middleware-module'\n\nexport interface BatchingMiddlewareOptions {\n batchSize?: number\n batchDelay?: number\n}\n\ninterface BatchItem {\n action: StorageAction\n resolve: (value: any) => void\n reject: (error: any) => void\n timestamp: number\n}\n\nexport const batchingMiddleware = (options: BatchingMiddlewareOptions = {}): Middleware => {\n const batchSize = options.batchSize ?? 10\n const batchDelay = options.batchDelay ?? 10 // Уменьшил для более быстрого батчинга\n\n const queues = new Map<string, BatchItem[]>()\n const timeouts = new Map<string, NodeJS.Timeout>()\n\n const shouldBatch = (action: StorageAction): boolean => {\n return action.type === 'set' || action.type === 'update'\n }\n\n const getSegmentKey = (action: StorageAction): string => {\n return `${action.type}_${action.key?.toString() || 'default'}`\n }\n\n const mergeActions = (actions: StorageAction[]): StorageAction[] => {\n const merged = new Map<string, StorageAction>()\n\n // Группируем по ключу и оставляем только последнее значение\n for (const action of actions) {\n const key = `${action.type}_${action.key?.toString() || 'default'}`\n merged.set(key, action) // Последнее действие перезаписывает предыдущие\n }\n\n return Array.from(merged.values())\n }\n\n const clearTimeout = (segment: string): void => {\n const timeout = timeouts.get(segment)\n if (timeout) {\n globalThis.clearTimeout(timeout)\n timeouts.delete(segment)\n }\n }\n\n const setTimeout = (segment: string, callback: () => void): void => {\n const timeout = globalThis.setTimeout(callback, batchDelay)\n timeouts.set(segment, timeout)\n }\n\n const processBatch = async (segment: string, api: MiddlewareAPI, next: NextFunction): Promise<void> => {\n const queue = queues.get(segment)\n if (!queue || queue.length === 0) return\n\n // Очищаем очередь и таймер\n queues.delete(segment)\n clearTimeout(segment)\n\n try {\n // Объединяем действия\n const actions = queue.map((item) => item.action)\n const mergedActions = mergeActions(actions)\n\n // Выполняем только merged actions\n for (const mergedAction of mergedActions) {\n try {\n // Выполняем merged действие\n const result = await next(mergedAction)\n\n // Находим все queue items, которые соответствуют этому merged action\n const matchingItems = queue.filter((item) => item.action.type === mergedAction.type && item.action.key?.toString() === mergedAction.key?.toString())\n\n // Все соответствующие items получают результат merged операции\n matchingItems.forEach((item) => item.resolve(result))\n } catch (error) {\n // В случае ошибки отклоняем соответствующие промисы\n const matchingItems = queue.filter((item) => item.action.type === mergedAction.type && item.action.key?.toString() === mergedAction.key?.toString())\n matchingItems.forEach((item) => item.reject(error))\n }\n }\n } catch (error) {\n // В случае общей ошибки отклоняем все промисы\n queue.forEach((item) => item.reject(error))\n }\n }\n\n const addToQueue = async (action: StorageAction, api: MiddlewareAPI, next: NextFunction): Promise<any> => {\n return new Promise((resolve, reject) => {\n const segment = getSegmentKey(action)\n\n let queue = queues.get(segment)\n if (!queue) {\n queue = []\n queues.set(segment, queue)\n }\n\n queue.push({\n action,\n resolve,\n reject,\n timestamp: Date.now(),\n })\n\n clearTimeout(segment)\n\n if (queue.length >= batchSize) {\n // Немедленно обрабатываем батч\n queueMicrotask(() => processBatch(segment, api, next))\n } else {\n // Устанавливаем таймер\n setTimeout(segment, () => processBatch(segment, api, next))\n }\n })\n }\n\n return {\n name: 'batching',\n setup: () => {},\n cleanup: async () => {\n // Очищаем таймеры\n timeouts.forEach((timeout) => globalThis.clearTimeout(timeout))\n timeouts.clear()\n queues.clear()\n },\n reducer: (api: MiddlewareAPI) => (next: NextFunction) => async (action: StorageAction) => {\n if (!shouldBatch(action)) {\n return next(action)\n }\n\n return addToQueue(action, api, next)\n },\n }\n}\n"],"names":["batchingMiddleware","options","batchSize","batchDelay","queues","Map","timeouts","shouldBatch","action","getSegmentKey","mergeActions","actions","merged","key","Array","clearTimeout","segment","timeout","globalThis","setTimeout","callback","processBatch","api","next","queue","item","mergedActions","mergedAction","result","matchingItems","error","addToQueue","Promise","resolve","reject","Date","queueMicrotask"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Middleware } from '../utils/middleware-module';
|
|
2
|
+
export interface ShallowCompareMiddlewareOptions {
|
|
3
|
+
segments?: string[];
|
|
4
|
+
comparator?: <T>(prev: T, next: T) => boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare const shallowCompareMiddleware: (options?: ShallowCompareMiddlewareOptions) => Middleware;
|
|
7
|
+
//# sourceMappingURL=storage-shallow-compare.middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-shallow-compare.middleware.d.ts","sourceRoot":"","sources":["../../../../src/core/storage/middlewares/storage-shallow-compare.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiE,MAAM,4BAA4B,CAAA;AAGtH,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,OAAO,CAAA;CAC9C;AAED,eAAO,MAAM,wBAAwB,GAAI,UAAS,+BAAoC,KAAG,UA8CxF,CAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { VALUE_NOT_CHANGED } from "../utils/middleware-module.js";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
const shallowCompareMiddleware = (options = {})=>{
|
|
6
|
+
const { comparator = (prev, next)=>{
|
|
7
|
+
if (prev === next) return true;
|
|
8
|
+
if (typeof prev !== 'object' || typeof next !== 'object' || prev === null || next === null) {
|
|
9
|
+
return prev === next;
|
|
10
|
+
}
|
|
11
|
+
const keysA = Object.keys(prev);
|
|
12
|
+
const keysB = Object.keys(next);
|
|
13
|
+
if (keysA.length !== keysB.length) return false;
|
|
14
|
+
return keysA.every((key)=>Object.prototype.hasOwnProperty.call(next, key) && prev[key] === next[key]);
|
|
15
|
+
}, segments = [] } = options;
|
|
16
|
+
// Кэш последних значений
|
|
17
|
+
const valueCache = new Map();
|
|
18
|
+
return {
|
|
19
|
+
name: 'shallow-compare',
|
|
20
|
+
setup: (api)=>{},
|
|
21
|
+
reducer: (api)=>(next)=>async (action)=>{
|
|
22
|
+
// Пропускаем действия кроме set
|
|
23
|
+
if (action.type !== 'set' || segments.length && !segments.includes(action.metadata?.segment ?? 'default')) {
|
|
24
|
+
return next(action);
|
|
25
|
+
}
|
|
26
|
+
const cacheKey = action.key;
|
|
27
|
+
const prevValue = valueCache.get(cacheKey);
|
|
28
|
+
const nextValue = action.value;
|
|
29
|
+
// Если значения равны, возвращаем sentinel — не модифицируем значение
|
|
30
|
+
if (prevValue !== undefined && comparator(prevValue, nextValue)) {
|
|
31
|
+
return VALUE_NOT_CHANGED;
|
|
32
|
+
}
|
|
33
|
+
// Иначе обновляем кэш и продолжаем
|
|
34
|
+
const result = await next(action);
|
|
35
|
+
valueCache.set(cacheKey, result !== undefined ? result : nextValue);
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export { shallowCompareMiddleware };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=storage-shallow-compare.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core/storage/middlewares/storage-shallow-compare.middleware.js","sources":["../../../../src/core/storage/middlewares/storage-shallow-compare.middleware.ts"],"sourcesContent":["import { Middleware, MiddlewareAPI, NextFunction, StorageAction, VALUE_NOT_CHANGED } from '../utils/middleware-module'\nimport { StorageKeyType } from '../utils/storage-key'\n\nexport interface ShallowCompareMiddlewareOptions {\n segments?: string[]\n comparator?: <T>(prev: T, next: T) => boolean\n}\n\nexport const shallowCompareMiddleware = (options: ShallowCompareMiddlewareOptions = {}): Middleware => {\n const {\n comparator = (prev: any, next: any) => {\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 segments = [],\n } = options\n\n // Кэш последних значений\n const valueCache = new Map<StorageKeyType, any>()\n\n return {\n name: 'shallow-compare',\n setup: (api: MiddlewareAPI) => {},\n reducer: (api: MiddlewareAPI) => (next: NextFunction) => async (action: StorageAction) => {\n // Пропускаем действия кроме set\n if (action.type !== 'set' || (segments.length && !segments.includes(action.metadata?.segment ?? 'default'))) {\n return next(action)\n }\n\n const cacheKey = action.key!\n const prevValue = valueCache.get(cacheKey)\n const nextValue = action.value\n\n // Если значения равны, возвращаем sentinel — не модифицируем значение\n if (prevValue !== undefined && comparator(prevValue, nextValue)) {\n return VALUE_NOT_CHANGED\n }\n\n // Иначе обновляем кэш и продолжаем\n const result = await next(action)\n valueCache.set(cacheKey, result !== undefined ? result : nextValue)\n return result\n },\n }\n}\n"],"names":["VALUE_NOT_CHANGED","shallowCompareMiddleware","options","comparator","prev","next","keysA","Object","keysB","key","segments","valueCache","Map","api","action","cacheKey","prevValue","nextValue","undefined","result"],"mappings":";;;AAAsH;AAQ/G,MAAMC,wBAAwBA,GAAG,CAACC,UAA2C,CAAC,CAAC;IACpF,MAAM,EACJC,aAAa,CAACC,MAAWC;QACvB,IAAID,SAASC,MAAM,OAAO;QAE1B,IAAI,OAAOD,SAAS,YAAY,OAAOC,SAAS,YAAYD,SAAS,QAAQC,SAAS,MAAM;YAC1F,OAAOD,SAASC;QAClB;QAEA,MAAMC,QAAQC,OAAO,IAAI,CAACH;QAC1B,MAAMI,QAAQD,OAAO,IAAI,CAACF;QAE1B,IAAIC,MAAM,MAAM,KAAKE,MAAM,MAAM,EAAE,OAAO;QAE1C,OAAOF,MAAM,KAAK,CAAC,CAACG,MAAQF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACF,MAAMI,QAAQL,IAAI,CAACK,IAAI,KAAKJ,IAAI,CAACI,IAAI;IACxG,CAAC,EACDC,WAAW,EAAE,EACd,GAAGR;IAEJ,yBAAyB;IACzB,MAAMS,aAAa,IAAIC;IAEvB,OAAO;QACL,MAAM;QACN,OAAO,CAACC,OAAwB;QAChC,SAAS,CAACA,MAAuB,CAACR,OAAuB,OAAOS;oBAC9D,gCAAgC;oBAChC,IAAIA,OAAO,IAAI,KAAK,SAAUJ,SAAS,MAAM,IAAI,CAACA,SAAS,QAAQ,CAACI,OAAO,QAAQ,EAAE,WAAW,YAAa;wBAC3G,OAAOT,KAAKS;oBACd;oBAEA,MAAMC,WAAWD,OAAO,GAAG;oBAC3B,MAAME,YAAYL,WAAW,GAAG,CAACI;oBACjC,MAAME,YAAYH,OAAO,KAAK;oBAE9B,sEAAsE;oBACtE,IAAIE,cAAcE,aAAaf,WAAWa,WAAWC,YAAY;wBAC/D,OAAOjB,iBAAiBA;oBAC1B;oBAEA,mCAAmC;oBACnC,MAAMmB,SAAS,MAAMd,KAAKS;oBAC1BH,WAAW,GAAG,CAACI,UAAUI,WAAWD,YAAYC,SAASF;oBACzD,OAAOE;gBACT;IACF;AACF,EAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { StorageType } from '../storage.interface';
|
|
2
|
+
import { SyncMiddleware } from '../utils/middleware-module';
|
|
3
|
+
interface SyncSharedStateMiddlewareProps {
|
|
4
|
+
storageType: StorageType;
|
|
5
|
+
storageName: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const syncBroadcastMiddleware: (props: SyncSharedStateMiddlewareProps) => SyncMiddleware;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=sync-broadcast.middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-broadcast.middleware.d.ts","sourceRoot":"","sources":["../../../../src/core/storage/middlewares/sync-broadcast.middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEjE,OAAO,EAAiB,cAAc,EAAuC,MAAM,4BAA4B,CAAA;AAE/G,UAAU,8BAA8B;IACtC,WAAW,EAAE,WAAW,CAAA;IACxB,WAAW,EAAE,MAAM,CAAA;CACpB;AA+FD,eAAO,MAAM,uBAAuB,GAAI,OAAO,8BAA8B,KAAG,cA0F/E,CAAA"}
|