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 @@
|
|
|
1
|
+
{"version":3,"file":"reactive/dispatcher/standalone.js","sources":["../../../src/reactive/dispatcher/standalone.ts"],"sourcesContent":["import type { IStorage } from '../../core'\n\n// ────────────────────────────────────────────────────────────────────────────\n// Types\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Параметры исполнения действия (мемоизация)\n */\nexport interface ActionExecutionOptions<TParams, TResult> {\n memoize?: (currentArgs: TParams, previousArgs: TParams, previousResult: TResult) => boolean\n}\n\n/**\n * Рецепт действия — standalone-определение, не привязанное к хранилищу.\n * Привязывается к storage при регистрации в createDispatcher.\n */\nexport interface ActionRecipe<TState extends Record<string, any>, TParams, TResult> {\n readonly _type: 'action-recipe'\n readonly _config: {\n action: (storage: IStorage<TState>, params: TParams) => Promise<TResult> | TResult\n meta?: Record<string, any>\n }\n readonly _executionOptions?: ActionExecutionOptions<TParams, TResult>\n}\n\n/**\n * Рецепт watcher'а — standalone-определение, не привязанное к хранилищу.\n */\nexport interface WatcherRecipe<TState extends Record<string, any>, R> {\n readonly _type: 'watcher-recipe'\n readonly _config: {\n selector: (state: TState) => R\n meta?: Record<string, any>\n shouldTrigger?: (prev: R | undefined, current: R) => boolean\n notifyAfterSubscribe?: boolean\n }\n}\n\n/**\n * Состояние API-запроса для createApiActions\n */\nexport interface ApiRequestState {\n status: 'idle' | 'loading' | 'success' | 'error' | 'reset'\n error: string | null\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// defineAction\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Создаёт standalone-определение действия.\n * Фиксирует TState через первый вызов, TParams/TResult инферятся из action.\n *\n * @example\n * ```ts\n * const action = defineAction<MyState>()\n *\n * export const increment = action({\n * action: (storage, amount: number) => {\n * storage.update((s) => { s.count += amount })\n * return amount\n * },\n * })\n *\n * // Void action (без параметров и возврата):\n * export const reset = action({\n * action: (storage) => {\n * storage.update((s) => { s.count = 0 })\n * },\n * })\n * ```\n */\nexport function defineAction<TState extends Record<string, any>>() {\n return <TParams = void, TResult = void>(\n config: {\n action: (storage: IStorage<TState>, params: TParams) => Promise<TResult> | TResult\n meta?: Record<string, any>\n },\n executionOptions?: ActionExecutionOptions<TParams, TResult>,\n ): ActionRecipe<TState, TParams, TResult> => ({\n _type: 'action-recipe' as const,\n _config: config,\n _executionOptions: executionOptions,\n })\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// defineWatcher\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Создаёт standalone-определение watcher'а.\n *\n * @example\n * ```ts\n * export const watchCount = defineWatcher<MyState>()({\n * selector: (s) => s.items.length,\n * notifyAfterSubscribe: true,\n * })\n * ```\n */\nexport function defineWatcher<TState extends Record<string, any>>() {\n return <R>(config: {\n selector: (state: TState) => R\n meta?: Record<string, any>\n shouldTrigger?: (prev: R | undefined, current: R) => boolean\n notifyAfterSubscribe?: boolean\n }): WatcherRecipe<TState, R> => ({\n _type: 'watcher-recipe' as const,\n _config: config,\n })\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// createApiActions\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Вычисляет путь к свойству через Proxy-перехват обращений.\n */\nfunction resolvePath<T>(accessor: (draft: T) => any): string[] {\n const path: string[] = []\n const handler: ProxyHandler<any> = {\n get(_, prop) {\n if (typeof prop === 'string') {\n path.push(prop)\n }\n return new Proxy({}, handler)\n },\n }\n accessor(new Proxy({}, handler) as T)\n return path\n}\n\n/**\n * Записывает значение по пути в объекте.\n */\nfunction setByPath(obj: any, path: string[], value: any): void {\n let current = obj\n for (let i = 0; i < path.length - 1; i++) {\n current = current[path[i]]\n }\n current[path[path.length - 1]] = value\n}\n\n/**\n * Создаёт набор шаблонных lifecycle-действий для API-запроса.\n * Accessor указывает на поле ApiRequestState в стейте — путь вычисляется автоматически.\n *\n * @param accessor - Функция-accessor, указывающая на поле ApiRequestState в стейте\n *\n * @example\n * ```ts\n * const listRequest = createApiActions<MyState>(\n * (draft) => draft.api.listRequest\n * )\n *\n * // В dispatcher:\n * createDispatcher({ storage }, {\n * loadListInit: listRequest.init,\n * loadListLoading: listRequest.loading,\n * loadListSuccess: listRequest.success,\n * loadListFailure: listRequest.failure,\n * loadListReset: listRequest.reset,\n * })\n * ```\n */\nexport function createApiActions<TState extends Record<string, any>>(accessor: (draft: TState) => ApiRequestState) {\n const path = resolvePath(accessor)\n const action = defineAction<TState>()\n\n const update = (storage: IStorage<TState>, request: ApiRequestState) => {\n storage.update((s) => setByPath(s, path, request))\n }\n\n return {\n init: action({\n action: (storage) => update(storage, { status: 'idle', error: null }),\n }),\n\n loading: action({\n action: (storage) => update(storage, { status: 'loading', error: null }),\n }),\n\n success: action({\n action: (storage) => update(storage, { status: 'success', error: null }),\n }),\n\n failure: action({\n action: (storage, error: string) => update(storage, { status: 'error', error }),\n }),\n\n reset: action({\n action: (storage) => update(storage, { status: 'reset', error: null }),\n }),\n }\n}\n"],"names":["defineAction","config","executionOptions","defineWatcher","resolvePath","accessor","path","handler","_","prop","Proxy","setByPath","obj","value","current","i","createApiActions","action","update","storage","request","s","error"],"mappings":"AA+CA,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;;CAsBC,GACM,SAASA,YAAYA;IAC1B,OAAO,CACLC,QAIAC,mBAC4C;YAC5C,OAAO;YACP,SAASD;YACT,mBAAmBC;QACrB;AACF;AAEA,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E;;;;;;;;;;CAUC,GACM,SAASC,aAAaA;IAC3B,OAAO,CAAIF,SAKsB;YAC/B,OAAO;YACP,SAASA;QACX;AACF;AAEA,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;CAEC,GACD,SAASG,WAAWA,CAAIC,QAA2B;IACjD,MAAMC,OAAiB,EAAE;IACzB,MAAMC,UAA6B;QACjC,KAAIC,CAAC,EAAEC,IAAI;YACT,IAAI,OAAOA,SAAS,UAAU;gBAC5BH,KAAK,IAAI,CAACG;YACZ;YACA,OAAO,IAAIC,MAAM,CAAC,GAAGH;QACvB;IACF;IACAF,SAAS,IAAIK,MAAM,CAAC,GAAGH;IACvB,OAAOD;AACT;AAEA;;CAEC,GACD,SAASK,SAASA,CAACC,GAAQ,EAAEN,IAAc,EAAEO,KAAU;IACrD,IAAIC,UAAUF;IACd,IAAK,IAAIG,IAAI,GAAGA,IAAIT,KAAK,MAAM,GAAG,GAAGS,IAAK;QACxCD,UAAUA,OAAO,CAACR,IAAI,CAACS,EAAE,CAAC;IAC5B;IACAD,OAAO,CAACR,IAAI,CAACA,KAAK,MAAM,GAAG,EAAE,CAAC,GAAGO;AACnC;AAEA;;;;;;;;;;;;;;;;;;;;;CAqBC,GACM,SAASG,gBAAgBA,CAAqCX,QAA4C;IAC/G,MAAMC,OAAOF,WAAWA,CAACC;IACzB,MAAMY,SAASjB,YAAYA;IAE3B,MAAMkB,SAAS,CAACC,SAA2BC;QACzCD,QAAQ,MAAM,CAAC,CAACE,IAAMV,SAASA,CAACU,GAAGf,MAAMc;IAC3C;IAEA,OAAO;QACL,MAAMH,OAAO;YACX,QAAQ,CAACE,UAAYD,OAAOC,SAAS;oBAAE,QAAQ;oBAAQ,OAAO;gBAAK;QACrE;QAEA,SAASF,OAAO;YACd,QAAQ,CAACE,UAAYD,OAAOC,SAAS;oBAAE,QAAQ;oBAAW,OAAO;gBAAK;QACxE;QAEA,SAASF,OAAO;YACd,QAAQ,CAACE,UAAYD,OAAOC,SAAS;oBAAE,QAAQ;oBAAW,OAAO;gBAAK;QACxE;QAEA,SAASF,OAAO;YACd,QAAQ,CAACE,SAASG,QAAkBJ,OAAOC,SAAS;oBAAE,QAAQ;oBAASG;gBAAM;QAC/E;QAEA,OAAOL,OAAO;YACZ,QAAQ,CAACE,UAAYD,OAAOC,SAAS;oBAAE,QAAQ;oBAAS,OAAO;gBAAK;QACtE;IACF;AACF"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { Observable, OperatorFunction } from 'rxjs';
|
|
2
|
+
import { IStorage, IStorageBase } from '../../core';
|
|
3
|
+
import { Action, ActionsResult, Dispatcher, DispatchFunction, ExtractResultType, WatcherFunction } from '../dispatcher';
|
|
4
|
+
import { ChunkRequestConsistent, ChunkRequestParallel } from './utils';
|
|
5
|
+
/**
|
|
6
|
+
* Тип действия с типизированным payload
|
|
7
|
+
*/
|
|
8
|
+
export interface TypedAction<P> extends Action<P> {
|
|
9
|
+
type: string;
|
|
10
|
+
payload: P;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Тип для внешних состояний — Observable или хранилище (IStorageBase), которое автоматически конвертируется в Observable
|
|
14
|
+
*/
|
|
15
|
+
export type ExternalStates = Record<string, Observable<any> | IStorageBase<any>>;
|
|
16
|
+
/**
|
|
17
|
+
* Контекст эффекта — объект с зависимостями, передаваемый третьим аргументом
|
|
18
|
+
*/
|
|
19
|
+
export interface EffectContext<TDispatcher = any, TServices extends Record<string, any> = Record<string, never>, TConfig extends Record<string, any> = Record<string, never>, TExternalDispatchers extends Record<string, Dispatcher<any, any>> = Record<string, never>, TExternalStates extends ExternalStates = Record<string, never>> {
|
|
20
|
+
/** Основной dispatcher текущего synapse */
|
|
21
|
+
dispatcher: TDispatcher;
|
|
22
|
+
/** Внешние dispatcher'ы из других synapse */
|
|
23
|
+
externalDispatchers: TExternalDispatchers;
|
|
24
|
+
/** Внешние состояния — Observable'ы от других хранилищ (Synapse.state$, или любой Observable) */
|
|
25
|
+
externalStates: TExternalStates;
|
|
26
|
+
/** Сервисы (API-клиенты и т.д.) */
|
|
27
|
+
services: TServices;
|
|
28
|
+
/** Глобальная конфигурация для эффектов */
|
|
29
|
+
config: TConfig;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Тип для эффекта с доступом к состоянию и контексту — основной тип
|
|
33
|
+
*/
|
|
34
|
+
export type Effect<TState extends Record<string, any> = any, TDispatcher = any, TServices extends Record<string, any> = Record<string, never>, TConfig extends Record<string, any> = Record<string, never>, TExternalDispatchers extends Record<string, Dispatcher<any, any>> = Record<string, never>, TExternalStates extends ExternalStates = Record<string, never>> = (action$: Observable<Action>, state$: Observable<TState>, context: EffectContext<TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates>) => Observable<unknown>;
|
|
35
|
+
/**
|
|
36
|
+
* Тип для получения типов действий диспетчера
|
|
37
|
+
*/
|
|
38
|
+
export type DispatcherActions<T> = T extends Dispatcher<any, infer A> ? ActionsResult<A> : Record<string, DispatchFunction<any, any>>;
|
|
39
|
+
/**
|
|
40
|
+
* Конфигурация для валидации в validateMap
|
|
41
|
+
*/
|
|
42
|
+
export interface ValidateConfig {
|
|
43
|
+
conditions: boolean[];
|
|
44
|
+
skipAction: (() => any) | any | ((() => any) | any)[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Утилиты для запросов в validateMap
|
|
48
|
+
*/
|
|
49
|
+
export interface ValidateMapRequestUtils {
|
|
50
|
+
chunkRequest: ChunkRequestParallel;
|
|
51
|
+
chunkRequestConsistent: ChunkRequestConsistent;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Оператор для фильтрации действий по типу с сохранением типа payload
|
|
55
|
+
*/
|
|
56
|
+
export declare function ofType<T extends DispatchFunction<any, any> | WatcherFunction<any>>(actionFn: T): OperatorFunction<Action, TypedAction<T extends WatcherFunction<infer R> ? R : ExtractResultType<T>>>;
|
|
57
|
+
/**
|
|
58
|
+
* Оператор для фильтрации действий по нескольким типам с объединением типов payload
|
|
59
|
+
* @param actionFns Массив функций действий
|
|
60
|
+
*/
|
|
61
|
+
export declare function ofTypes<T extends DispatchFunction<any, any>[]>(actionFns: [...T]): OperatorFunction<Action, TypedAction<ExtractResultType<T[number]>>>;
|
|
62
|
+
/**
|
|
63
|
+
* Оператор для ожидания выполнения всех указанных действий.
|
|
64
|
+
*
|
|
65
|
+
* **Важно:** Использует `combineLatest` — Observable не эмитит, пока КАЖДЫЙ из
|
|
66
|
+
* указанных action не будет диспатчнут хотя бы один раз. Если хотя бы один action
|
|
67
|
+
* никогда не будет вызван, поток зависнет навсегда без уведомления.
|
|
68
|
+
* Убедитесь, что все указанные actions гарантированно будут диспатчнуты,
|
|
69
|
+
* либо используйте `ofTypes` с ручной агрегацией при необходимости таймаута.
|
|
70
|
+
*
|
|
71
|
+
* @param actionFns Массив функций действий
|
|
72
|
+
*/
|
|
73
|
+
export declare function ofTypesWaitAll<T extends DispatchFunction<any, any>[]>(actionFns: [...T]): (source$: Observable<Action>) => Observable<{ [K in keyof T]: TypedAction<ExtractResultType<T[K]>>; }>;
|
|
74
|
+
/**
|
|
75
|
+
* Создает Observable с выбранными данными из состояния
|
|
76
|
+
* @param state$ Поток состояния
|
|
77
|
+
* @param selectors Селекторы для выбора частей состояния
|
|
78
|
+
* @returns Observable с массивом выбранных значений
|
|
79
|
+
*/
|
|
80
|
+
export declare function selectorMap<TState, TResults extends any[]>(state$: Observable<TState>, ...selectors: {
|
|
81
|
+
[K in keyof TResults]: (state: TState) => TResults[K];
|
|
82
|
+
}): Observable<TResults>;
|
|
83
|
+
/**
|
|
84
|
+
* Создает именованный объект вместо массива
|
|
85
|
+
* @param state$ Поток состояния
|
|
86
|
+
* @param selectors Объект с селекторами
|
|
87
|
+
* @returns Observable с объектом выбранных значений
|
|
88
|
+
*/
|
|
89
|
+
export declare function selectorObject<TState, TResult extends Record<string, any>>(state$: Observable<TState>, selectors: {
|
|
90
|
+
[K in keyof TResult]: (state: TState) => TResult[K];
|
|
91
|
+
}): Observable<TResult>;
|
|
92
|
+
/**
|
|
93
|
+
* Оператор validateMap для валидации данных и условного вызова API
|
|
94
|
+
*/
|
|
95
|
+
export declare function validateMap<T, TResult = any>({ validator, loadingAction, errorAction, apiCall, }: {
|
|
96
|
+
validator?: (value: T) => ValidateConfig;
|
|
97
|
+
/** Вызывается после успешной валидации, перед apiCall. Типичное использование — dispatch loading-статуса. */
|
|
98
|
+
loadingAction?: (value: T) => void;
|
|
99
|
+
/** Вызывается при ошибке в apiCall (catchError). Получает ошибку + те же данные что loadingAction/apiCall. */
|
|
100
|
+
errorAction?: (error: any, value: T) => void;
|
|
101
|
+
apiCall: (value: T, utils: ValidateMapRequestUtils) => Observable<TResult>;
|
|
102
|
+
}): OperatorFunction<T, any>;
|
|
103
|
+
/**
|
|
104
|
+
* Метаданные ответа API, доступные в колбэках apiResult.
|
|
105
|
+
*/
|
|
106
|
+
export interface ApiResultMeta {
|
|
107
|
+
status: number;
|
|
108
|
+
statusText: string;
|
|
109
|
+
headers: Headers;
|
|
110
|
+
fromCache?: boolean;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Ошибка API-запроса. Бросается apiResult при !result.ok.
|
|
114
|
+
* Ловится errorAction в validateMap.
|
|
115
|
+
*/
|
|
116
|
+
export declare class ApiError extends Error {
|
|
117
|
+
readonly originalError: any;
|
|
118
|
+
readonly meta: ApiResultMeta;
|
|
119
|
+
constructor(originalError: any, meta: ApiResultMeta);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Оператор для обработки успешного результата API-запроса (QueryResult).
|
|
123
|
+
*
|
|
124
|
+
* При `result.ok` — вызывает callback с `data` и `meta`.
|
|
125
|
+
* При `!result.ok` — бросает `ApiError`, который ловится `errorAction` в `validateMap`.
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* ```ts
|
|
129
|
+
* // Простой случай
|
|
130
|
+
* validateMap({
|
|
131
|
+
* errorAction: (err) => dispatcher.dispatch.loadError(String(err)),
|
|
132
|
+
* apiCall: () => from(api.request('getList', params)).pipe(
|
|
133
|
+
* apiResult((data) => dispatcher.dispatch.loadSuccess(data)),
|
|
134
|
+
* ),
|
|
135
|
+
* })
|
|
136
|
+
*
|
|
137
|
+
* // С доступом к headers (пагинация)
|
|
138
|
+
* apiResult((data, meta) => {
|
|
139
|
+
* const total = Number(meta.headers.get('X-Total-Count'))
|
|
140
|
+
* dispatcher.dispatch.loadSuccess({ items: data, total })
|
|
141
|
+
* })
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
export declare function apiResult<TData, TResult = void>(onSuccess: (data: TData, meta: ApiResultMeta) => TResult | Promise<TResult>): OperatorFunction<{
|
|
145
|
+
ok: boolean;
|
|
146
|
+
data?: TData;
|
|
147
|
+
error?: any;
|
|
148
|
+
status?: number;
|
|
149
|
+
statusText?: string;
|
|
150
|
+
headers?: Headers;
|
|
151
|
+
fromCache?: boolean;
|
|
152
|
+
}, TResult>;
|
|
153
|
+
/**
|
|
154
|
+
* Класс для управления эффектами с поддержкой доступа к состоянию и контексту
|
|
155
|
+
* Основной класс, который следует использовать
|
|
156
|
+
*/
|
|
157
|
+
export declare class EffectsModule<TState extends Record<string, any> = any, TDispatcher = any, TServices extends Record<string, any> = Record<string, never>, TConfig extends Record<string, any> = Record<string, never>, TExternalDispatchers extends Record<string, Dispatcher<any, any>> = Record<string, never>, TExternalStates extends ExternalStates = Record<string, never>> {
|
|
158
|
+
private storage;
|
|
159
|
+
private dispatcher;
|
|
160
|
+
private externalDispatchers;
|
|
161
|
+
private services;
|
|
162
|
+
private config;
|
|
163
|
+
private effects;
|
|
164
|
+
private subscriptions;
|
|
165
|
+
private running;
|
|
166
|
+
private action$;
|
|
167
|
+
private externalStates;
|
|
168
|
+
/**
|
|
169
|
+
* Поток состояния
|
|
170
|
+
*/
|
|
171
|
+
readonly state$: Observable<TState>;
|
|
172
|
+
/**
|
|
173
|
+
* Создает модуль эффектов
|
|
174
|
+
* @param storage Хранилище состояния
|
|
175
|
+
* @param dispatcher Основной dispatcher текущего synapse
|
|
176
|
+
* @param externalDispatchers Внешние dispatcher'ы из других synapse
|
|
177
|
+
* @param services Сервисы (API-клиенты и т.д.)
|
|
178
|
+
* @param config Глобальная конфигурация для всех эффектов
|
|
179
|
+
* @param externalStates Внешние состояния (Observable'ы от других хранилищ)
|
|
180
|
+
*/
|
|
181
|
+
constructor(storage: IStorage<TState>, dispatcher: TDispatcher & {
|
|
182
|
+
actions: Observable<Action>;
|
|
183
|
+
}, externalDispatchers?: TExternalDispatchers, services?: TServices, config?: TConfig, externalStates?: TExternalStates);
|
|
184
|
+
/**
|
|
185
|
+
* Нормализует externalStates: конвертирует IStorageBase в Observable, пропускает Observable как есть
|
|
186
|
+
*/
|
|
187
|
+
private normalizeExternalStates;
|
|
188
|
+
/**
|
|
189
|
+
* Подписывается на действия от основного dispatcher'а и внешних dispatcher'ов
|
|
190
|
+
*/
|
|
191
|
+
private subscribeToDispatchers;
|
|
192
|
+
add(effect: Effect<TState, TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates>): this;
|
|
193
|
+
/**
|
|
194
|
+
* Добавляет несколько эффектов
|
|
195
|
+
* @param effects Эффекты для добавления
|
|
196
|
+
* @returns Текущий модуль
|
|
197
|
+
*/
|
|
198
|
+
addEffects(effects: Effect<TState, TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates>[]): this;
|
|
199
|
+
/**
|
|
200
|
+
* Запускает все эффекты
|
|
201
|
+
* @returns Текущий модуль
|
|
202
|
+
*/
|
|
203
|
+
start(): Promise<this>;
|
|
204
|
+
/**
|
|
205
|
+
* Останавливает все эффекты
|
|
206
|
+
* @returns Текущий модуль
|
|
207
|
+
*/
|
|
208
|
+
stop(): this;
|
|
209
|
+
/**
|
|
210
|
+
* Подписывается на конкретный эффект
|
|
211
|
+
* @param effect Эффект для подписки
|
|
212
|
+
*/
|
|
213
|
+
private subscribeToEffect;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Вспомогательная функция для создания типизированного эффекта
|
|
217
|
+
*/
|
|
218
|
+
export declare function createEffect<TState extends Record<string, any>, TDispatcher = any, TServices extends Record<string, any> = Record<string, never>, TConfig extends Record<string, any> = Record<string, never>, TExternalDispatchers extends Record<string, Dispatcher<any, any>> = Record<string, never>, TExternalStates extends ExternalStates = Record<string, never>>(effect: Effect<TState, TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates>): Effect<TState, TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates>;
|
|
219
|
+
/**
|
|
220
|
+
* Объединяет несколько эффектов в один
|
|
221
|
+
* @param effects Эффекты для объединения
|
|
222
|
+
* @returns Объединенный эффект
|
|
223
|
+
*/
|
|
224
|
+
export declare function combineEffects<TState extends Record<string, any>, TDispatcher = any, TServices extends Record<string, any> = Record<string, never>, TConfig extends Record<string, any> = Record<string, never>, TExternalDispatchers extends Record<string, Dispatcher<any, any>> = Record<string, never>, TExternalStates extends ExternalStates = Record<string, never>>(...effects: Effect<TState, TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates>[]): Effect<TState, TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates>;
|
|
225
|
+
//# sourceMappingURL=effects.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.module.d.ts","sourceRoot":"","sources":["../../../src/reactive/effects/effects.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { EMPTY, Observable, Subject, combineLatest, from, merge, of, pipe } from "rxjs";
|
|
2
|
+
import { catchError, filter, map, share, switchMap, take } from "rxjs/operators";
|
|
3
|
+
import { handleCallbackError, logError } from "../../_utils/error-handling.util.js";
|
|
4
|
+
import { chunkRequestConsistent, chunkRequestParallel, isStorage, toObservable } from "./utils/index.js";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Оператор для фильтрации действий по типу с сохранением типа payload
|
|
16
|
+
*/ function ofType(actionFn) {
|
|
17
|
+
const { actionType } = actionFn;
|
|
18
|
+
if (!actionType) {
|
|
19
|
+
logError('ofType: action function does not have actionType property', actionFn, null, 'warn');
|
|
20
|
+
return filter(()=>false);
|
|
21
|
+
}
|
|
22
|
+
// Улучшенная реализация с явными типами
|
|
23
|
+
return (source$)=>{
|
|
24
|
+
return source$.pipe(filter((action)=>action !== undefined && action.type === actionType));
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Оператор для фильтрации действий по нескольким типам с объединением типов payload
|
|
29
|
+
* @param actionFns Массив функций действий
|
|
30
|
+
*/ function ofTypes(actionFns) {
|
|
31
|
+
// Получаем типы действий
|
|
32
|
+
const actionTypes = actionFns.map((fn)=>fn.actionType).filter(Boolean);
|
|
33
|
+
if (actionTypes.length === 0) {
|
|
34
|
+
logError('ofTypes: no valid action types found in array', actionFns, null, 'warn');
|
|
35
|
+
return filter(()=>false);
|
|
36
|
+
}
|
|
37
|
+
// Улучшенная реализация с явными типами
|
|
38
|
+
return (source$)=>{
|
|
39
|
+
return source$.pipe(filter((action)=>action !== undefined && actionTypes.includes(action.type)));
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Оператор для ожидания выполнения всех указанных действий.
|
|
44
|
+
*
|
|
45
|
+
* **Важно:** Использует `combineLatest` — Observable не эмитит, пока КАЖДЫЙ из
|
|
46
|
+
* указанных action не будет диспатчнут хотя бы один раз. Если хотя бы один action
|
|
47
|
+
* никогда не будет вызван, поток зависнет навсегда без уведомления.
|
|
48
|
+
* Убедитесь, что все указанные actions гарантированно будут диспатчнуты,
|
|
49
|
+
* либо используйте `ofTypes` с ручной агрегацией при необходимости таймаута.
|
|
50
|
+
*
|
|
51
|
+
* @param actionFns Массив функций действий
|
|
52
|
+
*/ function ofTypesWaitAll(actionFns) {
|
|
53
|
+
return (source$)=>{
|
|
54
|
+
// Создаем потоки для каждого типа действия
|
|
55
|
+
const actionTypes = actionFns.map((fn)=>fn.actionType).filter(Boolean);
|
|
56
|
+
if (actionTypes.length === 0) {
|
|
57
|
+
logError('ofTypesWaitAll: no valid action types found in array', actionFns, null, 'warn');
|
|
58
|
+
return of([]);
|
|
59
|
+
}
|
|
60
|
+
// Для каждого типа действия создаем поток,
|
|
61
|
+
// который берет первое срабатывание
|
|
62
|
+
const actionStreams = actionTypes.map((type, index)=>source$.pipe(filter((action)=>action.type === type), take(1), map((action)=>// Сохраняем ассоциацию с индексом, чтобы соответствовать
|
|
63
|
+
// порядку в исходном массиве actionFns
|
|
64
|
+
({
|
|
65
|
+
index,
|
|
66
|
+
action
|
|
67
|
+
}))));
|
|
68
|
+
// Ждем, пока все потоки выдадут значения, и сортируем результаты
|
|
69
|
+
// по индексу для сохранения порядка
|
|
70
|
+
return combineLatest(actionStreams).pipe(map((results)=>{
|
|
71
|
+
// Сортируем по индексу
|
|
72
|
+
results.sort((a, b)=>a.index - b.index);
|
|
73
|
+
// Убираем индекс и возвращаем только действия
|
|
74
|
+
return results.map((r)=>r.action);
|
|
75
|
+
}));
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Создает Observable с выбранными данными из состояния
|
|
80
|
+
* @param state$ Поток состояния
|
|
81
|
+
* @param selectors Селекторы для выбора частей состояния
|
|
82
|
+
* @returns Observable с массивом выбранных значений
|
|
83
|
+
*/ function selectorMap(state$, ...selectors) {
|
|
84
|
+
return state$.pipe(map((state)=>{
|
|
85
|
+
return selectors.map((selector)=>selector(state));
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Создает именованный объект вместо массива
|
|
90
|
+
* @param state$ Поток состояния
|
|
91
|
+
* @param selectors Объект с селекторами
|
|
92
|
+
* @returns Observable с объектом выбранных значений
|
|
93
|
+
*/ function selectorObject(state$, selectors) {
|
|
94
|
+
return state$.pipe(map((state)=>{
|
|
95
|
+
const result = {};
|
|
96
|
+
for (const [key, selector] of Object.entries(selectors)){
|
|
97
|
+
result[key] = selector(state);
|
|
98
|
+
}
|
|
99
|
+
return result;
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Оператор validateMap для валидации данных и условного вызова API
|
|
104
|
+
*/ function validateMap({ validator, loadingAction, errorAction, apiCall }) {
|
|
105
|
+
return pipe(switchMap((pipeData)=>{
|
|
106
|
+
/**
|
|
107
|
+
* Функция вызова API-метода
|
|
108
|
+
*/ const callApi = ()=>{
|
|
109
|
+
if (loadingAction) loadingAction(pipeData);
|
|
110
|
+
const apiCall$ = apiCall(pipeData, {
|
|
111
|
+
chunkRequest: chunkRequestParallel,
|
|
112
|
+
chunkRequestConsistent: chunkRequestConsistent
|
|
113
|
+
});
|
|
114
|
+
if (!errorAction) return apiCall$;
|
|
115
|
+
return apiCall$.pipe(catchError((err)=>{
|
|
116
|
+
errorAction(err, pipeData);
|
|
117
|
+
return EMPTY;
|
|
118
|
+
}));
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Если валидацию не используем - сразу вызываем запрос
|
|
122
|
+
*/ if (!validator) return callApi();
|
|
123
|
+
const validateConfig = validator(pipeData);
|
|
124
|
+
const { conditions, skipAction } = validateConfig;
|
|
125
|
+
const conditionMet = conditions.every(Boolean);
|
|
126
|
+
/**
|
|
127
|
+
* Если валидация не пройдена - вызываем экшн сброса
|
|
128
|
+
*/ if (!conditionMet) {
|
|
129
|
+
if (Array.isArray(skipAction)) {
|
|
130
|
+
// eslint-disable-next-line no-unsafe-optional-chaining
|
|
131
|
+
return of(...skipAction?.filter(Boolean).map((action)=>typeof action === 'function' ? action() : action));
|
|
132
|
+
}
|
|
133
|
+
return of(typeof skipAction === 'function' ? skipAction() : skipAction);
|
|
134
|
+
}
|
|
135
|
+
return callApi();
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Ошибка API-запроса. Бросается apiResult при !result.ok.
|
|
140
|
+
* Ловится errorAction в validateMap.
|
|
141
|
+
*/ class ApiError extends Error {
|
|
142
|
+
originalError;
|
|
143
|
+
meta;
|
|
144
|
+
constructor(originalError, meta){
|
|
145
|
+
super(typeof originalError === 'string' ? originalError : originalError?.message ?? 'API request failed'), this.originalError = originalError, this.meta = meta;
|
|
146
|
+
this.name = 'ApiError';
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Оператор для обработки успешного результата API-запроса (QueryResult).
|
|
151
|
+
*
|
|
152
|
+
* При `result.ok` — вызывает callback с `data` и `meta`.
|
|
153
|
+
* При `!result.ok` — бросает `ApiError`, который ловится `errorAction` в `validateMap`.
|
|
154
|
+
*
|
|
155
|
+
* @example
|
|
156
|
+
* ```ts
|
|
157
|
+
* // Простой случай
|
|
158
|
+
* validateMap({
|
|
159
|
+
* errorAction: (err) => dispatcher.dispatch.loadError(String(err)),
|
|
160
|
+
* apiCall: () => from(api.request('getList', params)).pipe(
|
|
161
|
+
* apiResult((data) => dispatcher.dispatch.loadSuccess(data)),
|
|
162
|
+
* ),
|
|
163
|
+
* })
|
|
164
|
+
*
|
|
165
|
+
* // С доступом к headers (пагинация)
|
|
166
|
+
* apiResult((data, meta) => {
|
|
167
|
+
* const total = Number(meta.headers.get('X-Total-Count'))
|
|
168
|
+
* dispatcher.dispatch.loadSuccess({ items: data, total })
|
|
169
|
+
* })
|
|
170
|
+
* ```
|
|
171
|
+
*/ function apiResult(onSuccess) {
|
|
172
|
+
return pipe(switchMap((result)=>{
|
|
173
|
+
const meta = {
|
|
174
|
+
status: result.status ?? 0,
|
|
175
|
+
statusText: result.statusText ?? '',
|
|
176
|
+
headers: result.headers ?? new Headers(),
|
|
177
|
+
fromCache: result.fromCache
|
|
178
|
+
};
|
|
179
|
+
if (result.ok && result.data !== undefined) {
|
|
180
|
+
const out = onSuccess(result.data, meta);
|
|
181
|
+
return from(Promise.resolve(out));
|
|
182
|
+
}
|
|
183
|
+
throw new ApiError(result.error ?? 'Unknown error', meta);
|
|
184
|
+
}));
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Класс для управления эффектами с поддержкой доступа к состоянию и контексту
|
|
188
|
+
* Основной класс, который следует использовать
|
|
189
|
+
*/ class EffectsModule {
|
|
190
|
+
storage;
|
|
191
|
+
dispatcher;
|
|
192
|
+
externalDispatchers;
|
|
193
|
+
services;
|
|
194
|
+
config;
|
|
195
|
+
effects = [];
|
|
196
|
+
subscriptions = [];
|
|
197
|
+
running = false;
|
|
198
|
+
action$ = new Subject();
|
|
199
|
+
externalStates;
|
|
200
|
+
/**
|
|
201
|
+
* Поток состояния
|
|
202
|
+
*/ state$;
|
|
203
|
+
/**
|
|
204
|
+
* Создает модуль эффектов
|
|
205
|
+
* @param storage Хранилище состояния
|
|
206
|
+
* @param dispatcher Основной dispatcher текущего synapse
|
|
207
|
+
* @param externalDispatchers Внешние dispatcher'ы из других synapse
|
|
208
|
+
* @param services Сервисы (API-клиенты и т.д.)
|
|
209
|
+
* @param config Глобальная конфигурация для всех эффектов
|
|
210
|
+
* @param externalStates Внешние состояния (Observable'ы от других хранилищ)
|
|
211
|
+
*/ constructor(storage, dispatcher, externalDispatchers = {}, services = {}, config = {}, externalStates = {}){
|
|
212
|
+
this.storage = storage;
|
|
213
|
+
this.dispatcher = dispatcher;
|
|
214
|
+
this.externalDispatchers = externalDispatchers;
|
|
215
|
+
this.services = services;
|
|
216
|
+
this.config = config;
|
|
217
|
+
// Нормализуем externalStates: конвертируем storage → Observable
|
|
218
|
+
this.externalStates = this.normalizeExternalStates(externalStates);
|
|
219
|
+
// Создаем поток состояния
|
|
220
|
+
this.state$ = new Observable((observer)=>{
|
|
221
|
+
// Отправляем начальное состояние
|
|
222
|
+
Promise.resolve(this.storage.getState()).then((state)=>observer.next(state));
|
|
223
|
+
// Подписываемся на все изменения
|
|
224
|
+
const unsubscribe = this.storage.subscribeToAll(()=>{
|
|
225
|
+
Promise.resolve(this.storage.getState()).then((state)=>observer.next(state));
|
|
226
|
+
});
|
|
227
|
+
// Отписываемся при завершении
|
|
228
|
+
return ()=>unsubscribe();
|
|
229
|
+
}).pipe(share());
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Нормализует externalStates: конвертирует IStorageBase в Observable, пропускает Observable как есть
|
|
233
|
+
*/ normalizeExternalStates(states) {
|
|
234
|
+
const normalized = {};
|
|
235
|
+
for (const [key, value] of Object.entries(states)){
|
|
236
|
+
normalized[key] = isStorage(value) ? toObservable(value) : value;
|
|
237
|
+
}
|
|
238
|
+
return normalized;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Подписывается на действия от основного dispatcher'а и внешних dispatcher'ов
|
|
242
|
+
*/ subscribeToDispatchers() {
|
|
243
|
+
// Основной dispatcher
|
|
244
|
+
const mainSub = this.dispatcher.actions.subscribe((action)=>{
|
|
245
|
+
this.action$.next(action);
|
|
246
|
+
});
|
|
247
|
+
this.subscriptions.push(mainSub);
|
|
248
|
+
// Внешние dispatcher'ы
|
|
249
|
+
for (const [_, dispatcher] of Object.entries(this.externalDispatchers)){
|
|
250
|
+
const subscription = dispatcher.actions.subscribe((action)=>{
|
|
251
|
+
this.action$.next(action);
|
|
252
|
+
});
|
|
253
|
+
this.subscriptions.push(subscription);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
add(effect) {
|
|
257
|
+
this.effects.push(effect);
|
|
258
|
+
if (this.running) {
|
|
259
|
+
this.subscribeToEffect(effect);
|
|
260
|
+
}
|
|
261
|
+
return this;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Добавляет несколько эффектов
|
|
265
|
+
* @param effects Эффекты для добавления
|
|
266
|
+
* @returns Текущий модуль
|
|
267
|
+
*/ addEffects(effects) {
|
|
268
|
+
effects.forEach((effect)=>this.add(effect));
|
|
269
|
+
return this;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Запускает все эффекты
|
|
273
|
+
* @returns Текущий модуль
|
|
274
|
+
*/ async start() {
|
|
275
|
+
if (this.running) {
|
|
276
|
+
return this;
|
|
277
|
+
}
|
|
278
|
+
// Ждем готовности основного хранилища
|
|
279
|
+
await this.storage.waitForReady();
|
|
280
|
+
// Переподписываемся на dispatchers (подписки были очищены в stop())
|
|
281
|
+
this.subscribeToDispatchers();
|
|
282
|
+
this.effects.forEach((effect)=>this.subscribeToEffect(effect));
|
|
283
|
+
this.running = true;
|
|
284
|
+
return this;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Останавливает все эффекты
|
|
288
|
+
* @returns Текущий модуль
|
|
289
|
+
*/ stop() {
|
|
290
|
+
this.subscriptions.forEach((sub)=>sub.unsubscribe());
|
|
291
|
+
this.subscriptions = [];
|
|
292
|
+
this.action$.complete();
|
|
293
|
+
this.action$ = new Subject();
|
|
294
|
+
this.running = false;
|
|
295
|
+
return this;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Подписывается на конкретный эффект
|
|
299
|
+
* @param effect Эффект для подписки
|
|
300
|
+
*/ subscribeToEffect(effect) {
|
|
301
|
+
try {
|
|
302
|
+
const context = {
|
|
303
|
+
dispatcher: this.dispatcher,
|
|
304
|
+
externalDispatchers: this.externalDispatchers,
|
|
305
|
+
externalStates: this.externalStates,
|
|
306
|
+
services: this.services,
|
|
307
|
+
config: this.config
|
|
308
|
+
};
|
|
309
|
+
const output$ = effect(this.action$.asObservable(), this.state$, context).pipe(catchError((err)=>{
|
|
310
|
+
handleCallbackError('EffectsModule: error in effect', err);
|
|
311
|
+
return of(null);
|
|
312
|
+
}));
|
|
313
|
+
const subscription = output$.subscribe((result)=>{
|
|
314
|
+
if (result === null || result === undefined) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
if (typeof result === 'function') {
|
|
318
|
+
try {
|
|
319
|
+
result();
|
|
320
|
+
} catch (callError) {
|
|
321
|
+
handleCallbackError('EffectsModule: error calling effect result function', callError);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
this.subscriptions.push(subscription);
|
|
326
|
+
} catch (setupError) {
|
|
327
|
+
handleCallbackError('EffectsModule: error setting up effect', setupError);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Вспомогательная функция для создания типизированного эффекта
|
|
333
|
+
*/ function createEffect(effect) {
|
|
334
|
+
return effect;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Объединяет несколько эффектов в один
|
|
338
|
+
* @param effects Эффекты для объединения
|
|
339
|
+
* @returns Объединенный эффект
|
|
340
|
+
*/ function combineEffects(...effects) {
|
|
341
|
+
return (action$, state$, context)=>{
|
|
342
|
+
const outputs = effects.map((effect)=>{
|
|
343
|
+
try {
|
|
344
|
+
return effect(action$, state$, context);
|
|
345
|
+
} catch (error) {
|
|
346
|
+
handleCallbackError('combineEffects: error in one of combined effects', error);
|
|
347
|
+
return of(null);
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
return merge(...outputs);
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
export { ApiError, EffectsModule, apiResult, combineEffects, createEffect, ofType, ofTypes, ofTypesWaitAll, selectorMap, selectorObject, validateMap };
|
|
355
|
+
|
|
356
|
+
//# sourceMappingURL=effects.module.js.map
|