synapse-storage 3.0.19 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +661 -104
- package/dist/_utils/chunk.util.d.ts +8 -0
- package/dist/_utils/chunk.util.d.ts.map +1 -0
- package/dist/_utils/chunk.util.js +21 -0
- package/dist/_utils/chunk.util.js.map +1 -0
- package/dist/_utils/deepMerge.util.d.ts +2 -0
- package/dist/_utils/deepMerge.util.d.ts.map +1 -0
- package/dist/_utils/deepMerge.util.js +19 -0
- package/dist/_utils/deepMerge.util.js.map +1 -0
- package/dist/_utils/error-handling.util.d.ts +50 -0
- package/dist/_utils/error-handling.util.d.ts.map +1 -0
- package/dist/_utils/error-handling.util.js +67 -0
- package/dist/_utils/error-handling.util.js.map +1 -0
- package/dist/_utils/flatMap.util.d.ts +10 -0
- package/dist/_utils/flatMap.util.d.ts.map +1 -0
- package/dist/_utils/flatMap.util.js +23 -0
- package/dist/_utils/flatMap.util.js.map +1 -0
- package/dist/_utils/index.d.ts +6 -0
- package/dist/_utils/index.d.ts.map +1 -0
- package/dist/_utils/index.js +13 -0
- package/dist/_utils/index.js.map +1 -0
- package/dist/_utils/logger-console.util.d.ts +9 -0
- package/dist/_utils/logger-console.util.d.ts.map +1 -0
- package/dist/_utils/logger-console.util.js +14 -0
- package/dist/_utils/logger-console.util.js.map +1 -0
- package/dist/api/api.module.d.ts +46 -0
- package/dist/api/api.module.d.ts.map +1 -0
- package/dist/api/api.module.js +121 -0
- package/dist/api/api.module.js.map +1 -0
- package/dist/api/components/endpoint.d.ts +57 -0
- package/dist/api/components/endpoint.d.ts.map +1 -0
- package/dist/api/components/endpoint.js +385 -0
- package/dist/api/components/endpoint.js.map +1 -0
- package/dist/api/components/query-storage.d.ts +100 -0
- package/dist/api/components/query-storage.d.ts.map +1 -0
- package/dist/api/components/query-storage.js +293 -0
- package/dist/api/components/query-storage.js.map +1 -0
- package/dist/api/example.d.ts +83 -0
- package/dist/api/example.d.ts.map +1 -0
- package/dist/api/example.js +90 -0
- package/dist/api/example.js.map +1 -0
- package/dist/api/index.d.ts +4 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +11 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/types/api.interface.d.ts +126 -0
- package/dist/api/types/api.interface.d.ts.map +1 -0
- package/dist/api/types/api.interface.js +15 -0
- package/dist/api/types/api.interface.js.map +1 -0
- package/dist/api/types/endpoint.interface.d.ts +118 -0
- package/dist/api/types/endpoint.interface.d.ts.map +1 -0
- package/dist/api/types/endpoint.interface.js +6 -0
- package/dist/api/types/endpoint.interface.js.map +1 -0
- package/dist/api/types/query.interface.d.ts +85 -0
- package/dist/api/types/query.interface.d.ts.map +1 -0
- package/dist/api/types/query.interface.js +6 -0
- package/dist/api/types/query.interface.js.map +1 -0
- package/dist/api/utils/api-helpers.d.ts +22 -0
- package/dist/api/utils/api-helpers.d.ts.map +1 -0
- package/dist/api/utils/api-helpers.js +44 -0
- package/dist/api/utils/api-helpers.js.map +1 -0
- package/dist/api/utils/create-header-context.d.ts +10 -0
- package/dist/api/utils/create-header-context.d.ts.map +1 -0
- package/dist/api/utils/create-header-context.js +40 -0
- package/dist/api/utils/create-header-context.js.map +1 -0
- package/dist/api/utils/endpoint-headers.d.ts +23 -0
- package/dist/api/utils/endpoint-headers.d.ts.map +1 -0
- package/dist/api/utils/endpoint-headers.js +61 -0
- package/dist/api/utils/endpoint-headers.js.map +1 -0
- package/dist/api/utils/fetch-base-query.d.ts +9 -0
- package/dist/api/utils/fetch-base-query.d.ts.map +1 -0
- package/dist/api/utils/fetch-base-query.js +242 -0
- package/dist/api/utils/fetch-base-query.js.map +1 -0
- package/dist/api/utils/file-utils.d.ts +43 -0
- package/dist/api/utils/file-utils.d.ts.map +1 -0
- package/dist/api/utils/file-utils.js +102 -0
- package/dist/api/utils/file-utils.js.map +1 -0
- package/dist/api/utils/get-cacheable-headers.d.ts +8 -0
- package/dist/api/utils/get-cacheable-headers.d.ts.map +1 -0
- package/dist/api/utils/get-cacheable-headers.js +23 -0
- package/dist/api/utils/get-cacheable-headers.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/selector/index.d.ts +3 -0
- package/dist/core/selector/index.d.ts.map +1 -0
- package/dist/core/selector/index.js +5 -0
- package/dist/core/selector/index.js.map +1 -0
- package/dist/{selector.interface-CA5y-kD_.d.ts → core/selector/selector.interface.d.ts} +41 -8
- package/dist/core/selector/selector.interface.d.ts.map +1 -0
- package/dist/core/selector/selector.interface.js +7 -0
- package/dist/core/selector/selector.interface.js.map +1 -0
- package/dist/core/selector/selector.module.d.ts +36 -0
- package/dist/core/selector/selector.module.d.ts.map +1 -0
- package/dist/core/selector/selector.module.js +412 -0
- package/dist/core/selector/selector.module.js.map +1 -0
- package/dist/core/storage/adapters/async-base-storage.service.d.ts +49 -0
- package/dist/core/storage/adapters/async-base-storage.service.d.ts.map +1 -0
- package/dist/core/storage/adapters/async-base-storage.service.js +505 -0
- package/dist/core/storage/adapters/async-base-storage.service.js.map +1 -0
- package/dist/core/storage/adapters/indexed-DB.service.d.ts +89 -0
- package/dist/core/storage/adapters/indexed-DB.service.d.ts.map +1 -0
- package/dist/core/storage/adapters/indexed-DB.service.js +596 -0
- package/dist/core/storage/adapters/indexed-DB.service.js.map +1 -0
- package/dist/core/storage/adapters/local-storage.service.d.ts +23 -0
- package/dist/core/storage/adapters/local-storage.service.d.ts.map +1 -0
- package/dist/core/storage/adapters/local-storage.service.js +111 -0
- package/dist/core/storage/adapters/local-storage.service.js.map +1 -0
- package/dist/core/storage/adapters/memory-storage.service.d.ts +24 -0
- package/dist/core/storage/adapters/memory-storage.service.d.ts.map +1 -0
- package/dist/core/storage/adapters/memory-storage.service.js +110 -0
- package/dist/core/storage/adapters/memory-storage.service.js.map +1 -0
- package/dist/core/storage/adapters/path.utils.d.ts +5 -0
- package/dist/core/storage/adapters/path.utils.d.ts.map +1 -0
- package/dist/core/storage/adapters/path.utils.js +42 -0
- package/dist/core/storage/adapters/path.utils.js.map +1 -0
- package/dist/core/storage/adapters/storage-core.d.ts +61 -0
- package/dist/core/storage/adapters/storage-core.d.ts.map +1 -0
- package/dist/core/storage/adapters/storage-core.js +221 -0
- package/dist/core/storage/adapters/storage-core.js.map +1 -0
- package/dist/core/storage/adapters/sync-base-storage.service.d.ts +56 -0
- package/dist/core/storage/adapters/sync-base-storage.service.d.ts.map +1 -0
- package/dist/core/storage/adapters/sync-base-storage.service.js +481 -0
- package/dist/core/storage/adapters/sync-base-storage.service.js.map +1 -0
- package/dist/core/storage/index.d.ts +16 -0
- package/dist/core/storage/index.d.ts.map +1 -0
- package/dist/core/storage/index.js +38 -0
- package/dist/core/storage/index.js.map +1 -0
- package/dist/core/storage/middlewares/broadcast.middleware.d.ts +9 -0
- package/dist/core/storage/middlewares/broadcast.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/broadcast.middleware.js +197 -0
- package/dist/core/storage/middlewares/broadcast.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/index.d.ts +9 -0
- package/dist/core/storage/middlewares/index.d.ts.map +1 -0
- package/dist/core/storage/middlewares/index.js +17 -0
- package/dist/core/storage/middlewares/index.js.map +1 -0
- package/dist/core/storage/middlewares/storage-batching.middleware.d.ts +7 -0
- package/dist/core/storage/middlewares/storage-batching.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/storage-batching.middleware.js +108 -0
- package/dist/core/storage/middlewares/storage-batching.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.d.ts +7 -0
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.js +43 -0
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/sync-broadcast.middleware.d.ts +9 -0
- package/dist/core/storage/middlewares/sync-broadcast.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/sync-broadcast.middleware.js +177 -0
- package/dist/core/storage/middlewares/sync-broadcast.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/sync-storage-batching.middleware.d.ts +6 -0
- package/dist/core/storage/middlewares/sync-storage-batching.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/sync-storage-batching.middleware.js +56 -0
- package/dist/core/storage/middlewares/sync-storage-batching.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.d.ts +7 -0
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.d.ts.map +1 -0
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.js +39 -0
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.js.map +1 -0
- package/dist/core/storage/modules/plugin/plugin.interface.d.ts +101 -0
- package/dist/core/storage/modules/plugin/plugin.interface.d.ts.map +1 -0
- package/dist/core/storage/modules/plugin/plugin.interface.js +8 -0
- package/dist/core/storage/modules/plugin/plugin.interface.js.map +1 -0
- package/dist/core/storage/modules/plugin/plugin.service.d.ts +49 -0
- package/dist/core/storage/modules/plugin/plugin.service.d.ts.map +1 -0
- package/dist/core/storage/modules/plugin/plugin.service.js +406 -0
- package/dist/core/storage/modules/plugin/plugin.service.js.map +1 -0
- package/dist/core/storage/modules/singleton/mixin.util.d.ts +6 -0
- package/dist/core/storage/modules/singleton/mixin.util.d.ts.map +1 -0
- package/dist/core/storage/modules/singleton/mixin.util.js +30 -0
- package/dist/core/storage/modules/singleton/mixin.util.js.map +1 -0
- package/dist/core/storage/modules/singleton/models.d.ts +143 -0
- package/dist/core/storage/modules/singleton/models.d.ts.map +1 -0
- package/dist/core/storage/modules/singleton/models.js +60 -0
- package/dist/core/storage/modules/singleton/models.js.map +1 -0
- package/dist/core/storage/modules/singleton/singleton.util.d.ts +36 -0
- package/dist/core/storage/modules/singleton/singleton.util.d.ts.map +1 -0
- package/dist/core/storage/modules/singleton/singleton.util.js +216 -0
- package/dist/core/storage/modules/singleton/singleton.util.js.map +1 -0
- package/dist/core/storage/storage.interface.d.ts +168 -0
- package/dist/core/storage/storage.interface.d.ts.map +1 -0
- package/dist/core/storage/storage.interface.js +23 -0
- package/dist/core/storage/storage.interface.js.map +1 -0
- package/dist/core/storage/utils/broadcast.util.d.ts +49 -0
- package/dist/core/storage/utils/broadcast.util.d.ts.map +1 -0
- package/dist/core/storage/utils/broadcast.util.js +141 -0
- package/dist/core/storage/utils/broadcast.util.js.map +1 -0
- package/dist/core/storage/utils/cache.util.d.ts +33 -0
- package/dist/core/storage/utils/cache.util.d.ts.map +1 -0
- package/dist/core/storage/utils/cache.util.js +54 -0
- package/dist/core/storage/utils/cache.util.js.map +1 -0
- package/dist/core/storage/utils/middleware-module.d.ts +94 -0
- package/dist/core/storage/utils/middleware-module.d.ts.map +1 -0
- package/dist/core/storage/utils/middleware-module.js +258 -0
- package/dist/core/storage/utils/middleware-module.js.map +1 -0
- package/dist/core/storage/utils/path-selector.util.d.ts +15 -0
- package/dist/core/storage/utils/path-selector.util.d.ts.map +1 -0
- package/dist/core/storage/utils/path-selector.util.js +58 -0
- package/dist/core/storage/utils/path-selector.util.js.map +1 -0
- package/dist/core/storage/utils/state-diff.util.d.ts +14 -0
- package/dist/core/storage/utils/state-diff.util.d.ts.map +1 -0
- package/dist/core/storage/utils/state-diff.util.js +88 -0
- package/dist/core/storage/utils/state-diff.util.js.map +1 -0
- package/dist/core/storage/utils/storage-factory.util.d.ts +21 -0
- package/dist/core/storage/utils/storage-factory.util.d.ts.map +1 -0
- package/dist/core/storage/utils/storage-factory.util.js +40 -0
- package/dist/core/storage/utils/storage-factory.util.js.map +1 -0
- package/dist/core/storage/utils/storage-key.d.ts +11 -0
- package/dist/core/storage/utils/storage-key.d.ts.map +1 -0
- package/dist/core/storage/utils/storage-key.js +24 -0
- package/dist/core/storage/utils/storage-key.js.map +1 -0
- package/dist/core/storage/utils/storage.utils.d.ts +17 -0
- package/dist/core/storage/utils/storage.utils.d.ts.map +1 -0
- package/dist/core/storage/utils/storage.utils.js +57 -0
- package/dist/core/storage/utils/storage.utils.js.map +1 -0
- package/dist/index.d.ts +10 -12
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -0
- package/dist/react/hooks/index.d.ts +5 -0
- package/dist/react/hooks/index.d.ts.map +1 -0
- package/dist/react/hooks/index.js +11 -0
- package/dist/react/hooks/index.js.map +1 -0
- package/dist/react/hooks/useCreateStorage.d.ts +39 -0
- package/dist/react/hooks/useCreateStorage.d.ts.map +1 -0
- package/dist/react/hooks/useCreateStorage.js +137 -0
- package/dist/react/hooks/useCreateStorage.js.map +1 -0
- package/dist/react/hooks/useSelector.d.ts +21 -0
- package/dist/react/hooks/useSelector.d.ts.map +1 -0
- package/dist/react/hooks/useSelector.js +56 -0
- package/dist/react/hooks/useSelector.js.map +1 -0
- package/dist/react/hooks/useStorage.d.ts +39 -0
- package/dist/react/hooks/useStorage.d.ts.map +1 -0
- package/dist/react/hooks/useStorage.js +78 -0
- package/dist/react/hooks/useStorage.js.map +1 -0
- package/dist/react/hooks/useStorageSubscribe.d.ts +16 -0
- package/dist/react/hooks/useStorageSubscribe.d.ts.map +1 -0
- package/dist/react/hooks/useStorageSubscribe.js +55 -0
- package/dist/react/hooks/useStorageSubscribe.js.map +1 -0
- package/dist/react/index.d.ts +3 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +7 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/utils/awaitSynapse.d.ts +34 -0
- package/dist/react/utils/awaitSynapse.d.ts.map +1 -0
- package/dist/react/utils/awaitSynapse.js +87 -0
- package/dist/react/utils/awaitSynapse.js.map +1 -0
- package/dist/react/utils/createSynapseCtx.d.ts +33 -0
- package/dist/react/utils/createSynapseCtx.d.ts.map +1 -0
- package/dist/react/utils/createSynapseCtx.js +139 -0
- package/dist/react/utils/createSynapseCtx.js.map +1 -0
- package/dist/react/utils/index.d.ts +3 -0
- package/dist/react/utils/index.d.ts.map +1 -0
- package/dist/react/utils/index.js +9 -0
- package/dist/react/utils/index.js.map +1 -0
- package/dist/reactive/dispatcher/dispatcher.module.d.ts +216 -0
- package/dist/reactive/dispatcher/dispatcher.module.d.ts.map +1 -0
- package/dist/reactive/dispatcher/dispatcher.module.js +384 -0
- package/dist/reactive/dispatcher/dispatcher.module.js.map +1 -0
- package/dist/reactive/dispatcher/index.d.ts +4 -0
- package/dist/reactive/dispatcher/index.d.ts.map +1 -0
- package/dist/reactive/dispatcher/index.js +9 -0
- package/dist/reactive/dispatcher/index.js.map +1 -0
- package/dist/reactive/dispatcher/middlewares/index.d.ts +2 -0
- package/dist/reactive/dispatcher/middlewares/index.d.ts.map +1 -0
- package/dist/reactive/dispatcher/middlewares/index.js +5 -0
- package/dist/reactive/dispatcher/middlewares/index.js.map +1 -0
- package/dist/reactive/dispatcher/middlewares/logger.middleware.d.ts +37 -0
- package/dist/reactive/dispatcher/middlewares/logger.middleware.d.ts.map +1 -0
- package/dist/reactive/dispatcher/middlewares/logger.middleware.js +188 -0
- package/dist/reactive/dispatcher/middlewares/logger.middleware.js.map +1 -0
- package/dist/reactive/dispatcher/standalone.d.ts +112 -0
- package/dist/reactive/dispatcher/standalone.d.ts.map +1 -0
- package/dist/reactive/dispatcher/standalone.js +142 -0
- package/dist/reactive/dispatcher/standalone.js.map +1 -0
- package/dist/reactive/effects/effects.module.d.ts +225 -0
- package/dist/reactive/effects/effects.module.d.ts.map +1 -0
- package/dist/reactive/effects/effects.module.js +356 -0
- package/dist/reactive/effects/effects.module.js.map +1 -0
- package/dist/reactive/effects/index.d.ts +4 -0
- package/dist/reactive/effects/index.d.ts.map +1 -0
- package/dist/reactive/effects/index.js +11 -0
- package/dist/reactive/effects/index.js.map +1 -0
- package/dist/reactive/effects/utils/chunkRequestConsistent.d.ts +12 -0
- package/dist/reactive/effects/utils/chunkRequestConsistent.d.ts.map +1 -0
- package/dist/reactive/effects/utils/chunkRequestConsistent.js +25 -0
- package/dist/reactive/effects/utils/chunkRequestConsistent.js.map +1 -0
- package/dist/reactive/effects/utils/chunkRequestParallel.d.ts +12 -0
- package/dist/reactive/effects/utils/chunkRequestParallel.d.ts.map +1 -0
- package/dist/reactive/effects/utils/chunkRequestParallel.js +22 -0
- package/dist/reactive/effects/utils/chunkRequestParallel.js.map +1 -0
- package/dist/reactive/effects/utils/fromRequest.d.ts +40 -0
- package/dist/reactive/effects/utils/fromRequest.d.ts.map +1 -0
- package/dist/reactive/effects/utils/fromRequest.js +64 -0
- package/dist/reactive/effects/utils/fromRequest.js.map +1 -0
- package/dist/reactive/effects/utils/index.d.ts +5 -0
- package/dist/reactive/effects/utils/index.d.ts.map +1 -0
- package/dist/reactive/effects/utils/index.js +11 -0
- package/dist/reactive/effects/utils/index.js.map +1 -0
- package/dist/reactive/effects/utils/toObservable.d.ts +23 -0
- package/dist/reactive/effects/utils/toObservable.d.ts.map +1 -0
- package/dist/reactive/effects/utils/toObservable.js +39 -0
- package/dist/reactive/effects/utils/toObservable.js.map +1 -0
- package/dist/reactive/index.d.ts +3 -0
- package/dist/reactive/index.d.ts.map +1 -0
- package/dist/reactive/index.js +7 -0
- package/dist/reactive/index.js.map +1 -0
- package/dist/utils/createEventBus.d.ts +87 -0
- package/dist/utils/createEventBus.d.ts.map +1 -0
- package/dist/utils/createEventBus.js +215 -0
- package/dist/utils/createEventBus.js.map +1 -0
- package/dist/utils/createSynapse/createSynapse.d.ts +9 -0
- package/dist/utils/createSynapse/createSynapse.d.ts.map +1 -0
- package/dist/utils/createSynapse/createSynapse.js +103 -0
- package/dist/utils/createSynapse/createSynapse.js.map +1 -0
- package/dist/utils/createSynapse/index.d.ts +3 -0
- package/dist/utils/createSynapse/index.d.ts.map +1 -0
- package/dist/utils/createSynapse/index.js +6 -0
- package/dist/utils/createSynapse/index.js.map +1 -0
- package/dist/utils/createSynapse/types.d.ts +93 -0
- package/dist/utils/createSynapse/types.d.ts.map +1 -0
- package/dist/utils/createSynapse/types.js +6 -0
- package/dist/utils/createSynapse/types.js.map +1 -0
- package/dist/utils/createSynapse/validate.d.ts +2 -0
- package/dist/utils/createSynapse/validate.d.ts.map +1 -0
- package/dist/utils/createSynapse/validate.js +76 -0
- package/dist/utils/createSynapse/validate.js.map +1 -0
- package/dist/utils/createSynapse/waitForDependencies.d.ts +3 -0
- package/dist/utils/createSynapse/waitForDependencies.d.ts.map +1 -0
- package/dist/utils/createSynapse/waitForDependencies.js +40 -0
- package/dist/utils/createSynapse/waitForDependencies.js.map +1 -0
- package/dist/utils/createSynapseAwaiter.d.ts +46 -0
- package/dist/utils/createSynapseAwaiter.d.ts.map +1 -0
- package/dist/utils/createSynapseAwaiter.js +102 -0
- package/dist/utils/createSynapseAwaiter.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +17 -21
- package/dist/api.d.ts +0 -365
- package/dist/api.js +0 -1
- package/dist/core.d.ts +0 -106
- package/dist/core.js +0 -1
- package/dist/createSynapse-vkfKjRob.d.ts +0 -97
- package/dist/dispatcher.module-BOsMHbD5.d.ts +0 -360
- package/dist/react.d.ts +0 -119
- package/dist/react.js +0 -1
- package/dist/reactive.d.ts +0 -35
- package/dist/reactive.js +0 -1
- package/dist/storage.interface-BA_ktyDz.d.ts +0 -591
- package/dist/utils.d.ts +0 -139
- package/dist/utils.js +0 -1
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { handleCallbackError } from "../_utils/error-handling.util.js";
|
|
2
|
+
import { MemoryStorage } from "../core/index.js";
|
|
3
|
+
import { createDispatcher } from "../reactive/index.js";
|
|
4
|
+
import { createSynapse } from "./createSynapse/index.js";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
function matchEventPattern(eventName, pattern) {
|
|
15
|
+
if (pattern === '*') return true;
|
|
16
|
+
if (pattern.includes('*')) {
|
|
17
|
+
const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
|
|
18
|
+
return regex.test(eventName);
|
|
19
|
+
}
|
|
20
|
+
return eventName === pattern;
|
|
21
|
+
}
|
|
22
|
+
function cleanupOldEvents(storage, maxEvents) {
|
|
23
|
+
const state = storage.getState();
|
|
24
|
+
const events = Object.entries(state.events || {});
|
|
25
|
+
if (events.length > maxEvents) {
|
|
26
|
+
const sorted = events.sort((a, b)=>b[1].timestamp - a[1].timestamp);
|
|
27
|
+
const toKeep = sorted.slice(0, maxEvents);
|
|
28
|
+
storage.set('events', Object.fromEntries(toKeep));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Создает EventBus для связи между модулями
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* // Создание EventBus
|
|
37
|
+
* const eventBus = await createEventBus({
|
|
38
|
+
* name: 'app-events',
|
|
39
|
+
* autoCleanup: true,
|
|
40
|
+
* maxEvents: 500
|
|
41
|
+
* })
|
|
42
|
+
*
|
|
43
|
+
* // Использование в Synapse
|
|
44
|
+
* const mySynapse = await createSynapse({
|
|
45
|
+
* dependencies: [eventBus],
|
|
46
|
+
* createEffectConfig: () => ({
|
|
47
|
+
* externalDispatchers: {
|
|
48
|
+
* eventBus: eventBus.dispatcher
|
|
49
|
+
* }
|
|
50
|
+
* }),
|
|
51
|
+
* effects: [
|
|
52
|
+
* createEffect((action$, _, { dispatcher, externalDispatchers: { eventBus } }) => {
|
|
53
|
+
* // Публикация события
|
|
54
|
+
* eventBus.dispatch.publish({
|
|
55
|
+
* event: 'USER_UPDATED',
|
|
56
|
+
* data: { userId: 123 }
|
|
57
|
+
* })
|
|
58
|
+
*
|
|
59
|
+
* // Подписка на события
|
|
60
|
+
* eventBus.dispatch.subscribe({
|
|
61
|
+
* eventPattern: 'CORE_*',
|
|
62
|
+
* handler: (data, event) => console.log('Received:', event.event, data)
|
|
63
|
+
* })
|
|
64
|
+
* })
|
|
65
|
+
* ]
|
|
66
|
+
* })
|
|
67
|
+
* ```
|
|
68
|
+
*/ const createEventBus = (config = {})=>createSynapse({
|
|
69
|
+
createStorageFn: async ()=>{
|
|
70
|
+
return new MemoryStorage({
|
|
71
|
+
name: config.name || 'eventBus',
|
|
72
|
+
initialState: {
|
|
73
|
+
events: {},
|
|
74
|
+
subscriptions: {}
|
|
75
|
+
}
|
|
76
|
+
}).initialize();
|
|
77
|
+
},
|
|
78
|
+
createDispatcherFn: (_storage)=>{
|
|
79
|
+
// MemoryStorage — синхронное хранилище, безопасно кастуем
|
|
80
|
+
const storage = _storage;
|
|
81
|
+
// Хранилище активных подписок для очистки при destroy
|
|
82
|
+
const activeSubscriptions = new Map();
|
|
83
|
+
const dispatcher = createDispatcher({
|
|
84
|
+
storage
|
|
85
|
+
}, (_s, { createAction })=>({
|
|
86
|
+
// Публикация события
|
|
87
|
+
publish: createAction({
|
|
88
|
+
type: 'PUBLISH_EVENT',
|
|
89
|
+
meta: {
|
|
90
|
+
description: 'Публикация события в EventBus'
|
|
91
|
+
},
|
|
92
|
+
action: ({ event, data, metadata = {} })=>{
|
|
93
|
+
const eventId = `${event}_${Date.now()}_${Math.random()}`;
|
|
94
|
+
storage.set(`events.${eventId}`, {
|
|
95
|
+
id: eventId,
|
|
96
|
+
event,
|
|
97
|
+
data,
|
|
98
|
+
metadata: {
|
|
99
|
+
ttl: metadata.ttl || null,
|
|
100
|
+
priority: metadata.priority || 'normal',
|
|
101
|
+
...metadata
|
|
102
|
+
},
|
|
103
|
+
timestamp: Date.now()
|
|
104
|
+
});
|
|
105
|
+
// Очистка старых событий
|
|
106
|
+
if (config.autoCleanup) {
|
|
107
|
+
cleanupOldEvents(storage, config.maxEvents || 1000);
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
eventId,
|
|
111
|
+
event,
|
|
112
|
+
data
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}),
|
|
116
|
+
// Подписка на события
|
|
117
|
+
subscribe: createAction({
|
|
118
|
+
type: 'SUBSCRIBE_TO_EVENT',
|
|
119
|
+
meta: {
|
|
120
|
+
description: 'Подписка на события в EventBus'
|
|
121
|
+
},
|
|
122
|
+
action: ({ eventPattern, handler, options = {} })=>{
|
|
123
|
+
const subscriptionId = `sub_${Date.now()}_${Math.random()}`;
|
|
124
|
+
const unsubscribe = storage.subscribe((state)=>state.events, (events)=>{
|
|
125
|
+
Object.values(events || {}).forEach((event)=>{
|
|
126
|
+
// Поддержка паттернов
|
|
127
|
+
if (matchEventPattern(event.event, eventPattern)) {
|
|
128
|
+
// Фильтрация по приоритету
|
|
129
|
+
if (options.priority && event.metadata.priority !== options.priority) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
handler(event.data, event);
|
|
134
|
+
} catch (error) {
|
|
135
|
+
handleCallbackError(`EventBus: error in handler for "${event.event}"`, error);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
// Сохраняем подписку для управления
|
|
141
|
+
storage.set(`subscriptions.${subscriptionId}`, {
|
|
142
|
+
id: subscriptionId,
|
|
143
|
+
pattern: eventPattern,
|
|
144
|
+
options,
|
|
145
|
+
createdAt: Date.now()
|
|
146
|
+
});
|
|
147
|
+
activeSubscriptions.set(subscriptionId, unsubscribe);
|
|
148
|
+
const wrappedUnsubscribe = ()=>{
|
|
149
|
+
activeSubscriptions.delete(subscriptionId);
|
|
150
|
+
unsubscribe();
|
|
151
|
+
};
|
|
152
|
+
return {
|
|
153
|
+
subscriptionId,
|
|
154
|
+
unsubscribe: wrappedUnsubscribe
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}),
|
|
158
|
+
// Получение истории событий
|
|
159
|
+
getEventHistory: createAction({
|
|
160
|
+
type: 'GET_EVENT_HISTORY',
|
|
161
|
+
meta: {
|
|
162
|
+
description: 'Получение истории событий'
|
|
163
|
+
},
|
|
164
|
+
action: ({ eventType, limit = 100 })=>{
|
|
165
|
+
const state = storage.getState();
|
|
166
|
+
return Object.values(state.events || {}).filter((e)=>e.event === eventType).sort((a, b)=>b.timestamp - a.timestamp).slice(0, limit);
|
|
167
|
+
}
|
|
168
|
+
}),
|
|
169
|
+
// Очистка событий
|
|
170
|
+
clearEvents: createAction({
|
|
171
|
+
type: 'CLEAR_EVENTS',
|
|
172
|
+
meta: {
|
|
173
|
+
description: 'Очистка событий'
|
|
174
|
+
},
|
|
175
|
+
action: ({ olderThan } = {})=>{
|
|
176
|
+
if (olderThan) {
|
|
177
|
+
const cutoff = Date.now() - olderThan;
|
|
178
|
+
storage.update((state)=>{
|
|
179
|
+
Object.keys(state.events || {}).forEach((key)=>{
|
|
180
|
+
if (state.events[key].timestamp < cutoff) {
|
|
181
|
+
delete state.events[key];
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
} else {
|
|
186
|
+
storage.set('events', {});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}),
|
|
190
|
+
// Получение активных подписок
|
|
191
|
+
getActiveSubscriptions: createAction({
|
|
192
|
+
type: 'GET_SUBSCRIPTIONS',
|
|
193
|
+
meta: {
|
|
194
|
+
description: 'Получение активных подписок'
|
|
195
|
+
},
|
|
196
|
+
action: ()=>{
|
|
197
|
+
const state = storage.getState();
|
|
198
|
+
return Object.values(state.subscriptions || {});
|
|
199
|
+
}
|
|
200
|
+
})
|
|
201
|
+
}));
|
|
202
|
+
// Оборачиваем destroy для очистки всех активных подписок
|
|
203
|
+
const originalDestroy = dispatcher.destroy.bind(dispatcher);
|
|
204
|
+
dispatcher.destroy = ()=>{
|
|
205
|
+
activeSubscriptions.forEach((unsub)=>unsub());
|
|
206
|
+
activeSubscriptions.clear();
|
|
207
|
+
originalDestroy();
|
|
208
|
+
};
|
|
209
|
+
return dispatcher;
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
export { createEventBus };
|
|
214
|
+
|
|
215
|
+
//# sourceMappingURL=createEventBus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils/createEventBus.js","sources":["../../src/utils/createEventBus.ts"],"sourcesContent":["import { handleCallbackError } from '../_utils/error-handling.util'\nimport { IStorage, ISyncStorage, MemoryStorage } from '../core'\nimport { createDispatcher } from '../reactive'\nimport { createSynapse } from './createSynapse'\n\nexport interface EventBusEvent {\n id: string\n event: string\n data: any\n metadata: {\n ttl?: number | null\n priority?: 'low' | 'normal' | 'high'\n [key: string]: any\n }\n timestamp: number\n}\n\nexport interface EventBusState {\n events: Record<string, EventBusEvent>\n subscriptions: Record<string, any>\n}\n\nexport interface EventBusConfig {\n name?: string\n autoCleanup?: boolean\n maxEvents?: number\n}\n\nfunction matchEventPattern(eventName: string, pattern: string): boolean {\n if (pattern === '*') return true\n if (pattern.includes('*')) {\n const regex = new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$')\n return regex.test(eventName)\n }\n return eventName === pattern\n}\n\nfunction cleanupOldEvents(storage: ISyncStorage<EventBusState>, maxEvents: number): void {\n const state = storage.getState()\n const events = Object.entries(state.events || {})\n\n if (events.length > maxEvents) {\n const sorted = events.sort((a, b) => b[1].timestamp - a[1].timestamp)\n const toKeep = sorted.slice(0, maxEvents)\n\n storage.set('events', Object.fromEntries(toKeep))\n }\n}\n\n/**\n * Создает EventBus для связи между модулями\n *\n * @example\n * ```typescript\n * // Создание EventBus\n * const eventBus = await createEventBus({\n * name: 'app-events',\n * autoCleanup: true,\n * maxEvents: 500\n * })\n *\n * // Использование в Synapse\n * const mySynapse = await createSynapse({\n * dependencies: [eventBus],\n * createEffectConfig: () => ({\n * externalDispatchers: {\n * eventBus: eventBus.dispatcher\n * }\n * }),\n * effects: [\n * createEffect((action$, _, { dispatcher, externalDispatchers: { eventBus } }) => {\n * // Публикация события\n * eventBus.dispatch.publish({\n * event: 'USER_UPDATED',\n * data: { userId: 123 }\n * })\n *\n * // Подписка на события\n * eventBus.dispatch.subscribe({\n * eventPattern: 'CORE_*',\n * handler: (data, event) => console.log('Received:', event.event, data)\n * })\n * })\n * ]\n * })\n * ```\n */\nexport const createEventBus = (config: EventBusConfig = {}) =>\n createSynapse({\n createStorageFn: async () => {\n return new MemoryStorage<EventBusState>({\n name: config.name || 'eventBus',\n initialState: {\n events: {},\n subscriptions: {},\n },\n }).initialize()\n },\n\n createDispatcherFn: (_storage: IStorage<EventBusState>) => {\n // MemoryStorage — синхронное хранилище, безопасно кастуем\n const storage = _storage as ISyncStorage<EventBusState>\n // Хранилище активных подписок для очистки при destroy\n const activeSubscriptions = new Map<string, VoidFunction>()\n\n const dispatcher = createDispatcher({ storage }, (_s, { createAction }) => ({\n // Публикация события\n publish: createAction({\n type: 'PUBLISH_EVENT',\n meta: { description: 'Публикация события в EventBus' },\n action: ({ event, data, metadata = {} }: { event: string; data: any; metadata?: Record<string, any> }) => {\n const eventId = `${event}_${Date.now()}_${Math.random()}`\n\n storage.set(`events.${eventId}`, {\n id: eventId,\n event,\n data,\n metadata: {\n ttl: metadata.ttl || null,\n priority: metadata.priority || 'normal',\n ...metadata,\n },\n timestamp: Date.now(),\n })\n\n // Очистка старых событий\n if (config.autoCleanup) {\n cleanupOldEvents(storage, config.maxEvents || 1000)\n }\n\n return { eventId, event, data }\n },\n }),\n\n // Подписка на события\n subscribe: createAction({\n type: 'SUBSCRIBE_TO_EVENT',\n meta: { description: 'Подписка на события в EventBus' },\n action: ({\n eventPattern,\n handler,\n options = {},\n }: {\n eventPattern: string\n handler: (data: any, event: EventBusEvent) => void | Promise<void>\n options?: Record<string, any>\n }) => {\n const subscriptionId = `sub_${Date.now()}_${Math.random()}`\n\n const unsubscribe = storage.subscribe(\n (state) => state.events,\n (events) => {\n Object.values(events || {}).forEach((event) => {\n // Поддержка паттернов\n if (matchEventPattern(event.event, eventPattern)) {\n // Фильтрация по приоритету\n if (options.priority && event.metadata.priority !== options.priority) {\n return\n }\n\n try {\n handler(event.data, event)\n } catch (error) {\n handleCallbackError(`EventBus: error in handler for \"${event.event}\"`, error)\n }\n }\n })\n },\n )\n\n // Сохраняем подписку для управления\n storage.set(`subscriptions.${subscriptionId}`, {\n id: subscriptionId,\n pattern: eventPattern,\n options,\n createdAt: Date.now(),\n })\n\n activeSubscriptions.set(subscriptionId, unsubscribe)\n\n const wrappedUnsubscribe = () => {\n activeSubscriptions.delete(subscriptionId)\n unsubscribe()\n }\n\n return { subscriptionId, unsubscribe: wrappedUnsubscribe }\n },\n }),\n\n // Получение истории событий\n getEventHistory: createAction({\n type: 'GET_EVENT_HISTORY',\n meta: { description: 'Получение истории событий' },\n action: ({ eventType, limit = 100 }: { eventType: string; limit?: number }) => {\n const state = storage.getState()\n return Object.values(state.events || {})\n .filter((e) => e.event === eventType)\n .sort((a, b) => b.timestamp - a.timestamp)\n .slice(0, limit)\n },\n }),\n\n // Очистка событий\n clearEvents: createAction({\n type: 'CLEAR_EVENTS',\n meta: { description: 'Очистка событий' },\n action: ({ olderThan }: { olderThan?: number } = {}) => {\n if (olderThan) {\n const cutoff = Date.now() - olderThan\n storage.update((state) => {\n Object.keys(state.events || {}).forEach((key) => {\n if (state.events[key].timestamp < cutoff) {\n delete state.events[key]\n }\n })\n })\n } else {\n storage.set('events', {})\n }\n },\n }),\n\n // Получение активных подписок\n getActiveSubscriptions: createAction({\n type: 'GET_SUBSCRIPTIONS',\n meta: { description: 'Получение активных подписок' },\n action: () => {\n const state = storage.getState()\n return Object.values(state.subscriptions || {})\n },\n }),\n }))\n\n // Оборачиваем destroy для очистки всех активных подписок\n const originalDestroy = dispatcher.destroy.bind(dispatcher)\n dispatcher.destroy = () => {\n activeSubscriptions.forEach((unsub) => unsub())\n activeSubscriptions.clear()\n originalDestroy()\n }\n\n return dispatcher\n },\n })\n"],"names":["handleCallbackError","MemoryStorage","createDispatcher","createSynapse","matchEventPattern","eventName","pattern","regex","RegExp","cleanupOldEvents","storage","maxEvents","state","events","Object","sorted","a","b","toKeep","createEventBus","config","_storage","activeSubscriptions","Map","dispatcher","_s","createAction","event","data","metadata","eventId","Date","Math","eventPattern","handler","options","subscriptionId","unsubscribe","error","wrappedUnsubscribe","eventType","limit","e","olderThan","cutoff","key","originalDestroy","unsub"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { IStorage } from '../../core';
|
|
2
|
+
import type { CreateSynapseConfigBasic, CreateSynapseConfigWithDispatcher, CreateSynapseConfigWithEffects, ExtractDispatchType, SynapseStoreBasic, SynapseStoreWithDispatcher, SynapseStoreWithEffects } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Перегрузки функции createSynapse
|
|
5
|
+
*/
|
|
6
|
+
export declare function createSynapse<TStore extends Record<string, any>, TSelectors = any, TDispatcher = any, TServices extends Record<string, any> = Record<string, never>, TConfig extends Record<string, any> = Record<string, never>, TExternalSelectors extends Record<string, any> = Record<string, any>, TStorage extends IStorage<TStore> = IStorage<TStore>>(config: CreateSynapseConfigWithEffects<TStore, TSelectors, TDispatcher, TServices, TConfig, TExternalSelectors>): Promise<SynapseStoreWithEffects<TStore, TStorage, TSelectors, ExtractDispatchType<TDispatcher>>>;
|
|
7
|
+
export declare function createSynapse<TStore extends Record<string, any>, TSelectors = any, TDispatcher = any, TExternalSelectors extends Record<string, any> = Record<string, any>, TStorage extends IStorage<TStore> = IStorage<TStore>>(config: CreateSynapseConfigWithDispatcher<TStore, TSelectors, TDispatcher, TExternalSelectors>): Promise<SynapseStoreWithDispatcher<TStore, TStorage, TSelectors, ExtractDispatchType<TDispatcher>>>;
|
|
8
|
+
export declare function createSynapse<TStore extends Record<string, any>, TSelectors = any, TExternalSelectors extends Record<string, any> = Record<string, any>, TStorage extends IStorage<TStore> = IStorage<TStore>>(config: CreateSynapseConfigBasic<TStore, TSelectors, TExternalSelectors>): Promise<SynapseStoreBasic<TStore, TStorage, TSelectors>>;
|
|
9
|
+
//# sourceMappingURL=createSynapse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSynapse.d.ts","sourceRoot":"","sources":["../../../src/utils/createSynapse/createSynapse.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,QAAQ,EAAkB,MAAM,YAAY,CAAA;AAEtE,OAAO,KAAK,EACV,wBAAwB,EACxB,iCAAiC,EACjC,8BAA8B,EAC9B,mBAAmB,EACnB,iBAAiB,EACjB,0BAA0B,EAC1B,uBAAuB,EACxB,MAAM,SAAS,CAAA;AAIhB;;GAEG;AAGH,wBAAgB,aAAa,CAC3B,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClC,UAAU,GAAG,GAAG,EAChB,WAAW,GAAG,GAAG,EACjB,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAC7D,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAC3D,kBAAkB,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpE,QAAQ,SAAS,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,EAEpD,MAAM,EAAE,8BAA8B,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,CAAC,GAC9G,OAAO,CAAC,uBAAuB,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;AAGnG,wBAAgB,aAAa,CAC3B,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClC,UAAU,GAAG,GAAG,EAChB,WAAW,GAAG,GAAG,EACjB,kBAAkB,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpE,QAAQ,SAAS,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,EAEpD,MAAM,EAAE,iCAAiC,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,CAAC,GAC7F,OAAO,CAAC,0BAA0B,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;AAGtG,wBAAgB,aAAa,CAC3B,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClC,UAAU,GAAG,GAAG,EAChB,kBAAkB,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpE,QAAQ,SAAS,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,EACpD,MAAM,EAAE,wBAAwB,CAAC,MAAM,EAAE,UAAU,EAAE,kBAAkB,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { handleCallbackError, handleOperationError } from "../../_utils/error-handling.util.js";
|
|
2
|
+
import { SelectorModule } from "../../core/index.js";
|
|
3
|
+
import { EffectsModule } from "../../reactive/index.js";
|
|
4
|
+
import { validateSynapseConfig } from "./validate.js";
|
|
5
|
+
import { waitForDependencies } from "./waitForDependencies.js";
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
// Основная реализация
|
|
18
|
+
async function createSynapse(config) {
|
|
19
|
+
// 0. Валидируем конфигурацию
|
|
20
|
+
try {
|
|
21
|
+
validateSynapseConfig(config);
|
|
22
|
+
} catch (error) {
|
|
23
|
+
handleOperationError('createSynapse: configuration validation failed', error);
|
|
24
|
+
}
|
|
25
|
+
// 1. Сначала ждем готовности всех зависимостей
|
|
26
|
+
await waitForDependencies(config.dependencies, config.dependencyTimeout);
|
|
27
|
+
// 2. Выполняем setup (например, инициализация API-клиентов)
|
|
28
|
+
if (config.setup) {
|
|
29
|
+
try {
|
|
30
|
+
await config.setup();
|
|
31
|
+
} catch (error) {
|
|
32
|
+
handleOperationError('createSynapse: setup failed', error);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// 3. Создаем и инициализируем хранилище
|
|
36
|
+
const storageInstance = config.createStorageFn ? await config.createStorageFn() : config.storage;
|
|
37
|
+
await storageInstance.initialize();
|
|
38
|
+
// Создаем сборщики для последующей очистки
|
|
39
|
+
const cleanupCallbacks = [];
|
|
40
|
+
const result = {
|
|
41
|
+
storage: storageInstance,
|
|
42
|
+
selectors: {},
|
|
43
|
+
destroy: async ()=>{
|
|
44
|
+
for (const callback of cleanupCallbacks){
|
|
45
|
+
await callback();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
cleanupCallbacks.push(()=>storageInstance.destroy());
|
|
50
|
+
let dispatcher;
|
|
51
|
+
let selectorModule;
|
|
52
|
+
let effectsModule;
|
|
53
|
+
// 4. Создаем модуль селекторов
|
|
54
|
+
if (config.createSelectorsFn) {
|
|
55
|
+
try {
|
|
56
|
+
selectorModule = new SelectorModule(storageInstance);
|
|
57
|
+
const externalSelectors = config.externalSelectors || {};
|
|
58
|
+
result.selectors = config.createSelectorsFn(selectorModule, externalSelectors);
|
|
59
|
+
if (typeof selectorModule.destroy === 'function') {
|
|
60
|
+
cleanupCallbacks.push(()=>selectorModule.destroy());
|
|
61
|
+
}
|
|
62
|
+
} catch (error) {
|
|
63
|
+
handleCallbackError('createSynapse: error creating selectors', error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// 5. Создаем диспетчер
|
|
67
|
+
if (config.createDispatcherFn) {
|
|
68
|
+
dispatcher = config.createDispatcherFn(storageInstance);
|
|
69
|
+
result.dispatcher = dispatcher;
|
|
70
|
+
// @ts-ignore
|
|
71
|
+
if (dispatcher && 'dispatch' in dispatcher) {
|
|
72
|
+
result.actions = dispatcher.dispatch;
|
|
73
|
+
if (typeof dispatcher.destroy === 'function') {
|
|
74
|
+
cleanupCallbacks.push(()=>dispatcher.destroy());
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// 6. Создаем и настраиваем модуль эффектов
|
|
79
|
+
if (config.createEffectConfig && dispatcher) {
|
|
80
|
+
try {
|
|
81
|
+
const { services, config: effectConfig, externalDispatchers, externalStates } = config.createEffectConfig();
|
|
82
|
+
effectsModule = new EffectsModule(storageInstance, dispatcher, externalDispatchers || {}, services, effectConfig, externalStates || {});
|
|
83
|
+
if (Array.isArray(config.effects)) {
|
|
84
|
+
// @ts-ignore
|
|
85
|
+
config.effects.forEach((effect)=>{
|
|
86
|
+
if (effectsModule) effectsModule.add(effect);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
await effectsModule.start();
|
|
90
|
+
result.state$ = effectsModule.state$;
|
|
91
|
+
cleanupCallbacks.push(()=>{
|
|
92
|
+
if (effectsModule) effectsModule.stop();
|
|
93
|
+
});
|
|
94
|
+
} catch (error) {
|
|
95
|
+
handleCallbackError('createSynapse: error creating effects module', error);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export { createSynapse };
|
|
102
|
+
|
|
103
|
+
//# sourceMappingURL=createSynapse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils/createSynapse/createSynapse.js","sources":["../../../src/utils/createSynapse/createSynapse.ts"],"sourcesContent":["import { handleCallbackError, handleOperationError } from '../../_utils/error-handling.util'\nimport { ISelectorModule, IStorage, SelectorModule } from '../../core'\nimport { EffectsModule } from '../../reactive'\nimport type {\n CreateSynapseConfigBasic,\n CreateSynapseConfigWithDispatcher,\n CreateSynapseConfigWithEffects,\n ExtractDispatchType,\n SynapseStoreBasic,\n SynapseStoreWithDispatcher,\n SynapseStoreWithEffects,\n} from './types'\nimport { validateSynapseConfig } from './validate'\nimport { waitForDependencies } from './waitForDependencies'\n\n/**\n * Перегрузки функции createSynapse\n */\n\n// Случай 1: С dispatcher и effects\nexport function createSynapse<\n TStore extends Record<string, any>,\n TSelectors = any,\n TDispatcher = any,\n TServices extends Record<string, any> = Record<string, never>,\n TConfig extends Record<string, any> = Record<string, never>,\n TExternalSelectors extends Record<string, any> = Record<string, any>,\n TStorage extends IStorage<TStore> = IStorage<TStore>,\n>(\n config: CreateSynapseConfigWithEffects<TStore, TSelectors, TDispatcher, TServices, TConfig, TExternalSelectors>,\n): Promise<SynapseStoreWithEffects<TStore, TStorage, TSelectors, ExtractDispatchType<TDispatcher>>>\n\n// Случай 2: Только с dispatcher\nexport function createSynapse<\n TStore extends Record<string, any>,\n TSelectors = any,\n TDispatcher = any,\n TExternalSelectors extends Record<string, any> = Record<string, any>,\n TStorage extends IStorage<TStore> = IStorage<TStore>,\n>(\n config: CreateSynapseConfigWithDispatcher<TStore, TSelectors, TDispatcher, TExternalSelectors>,\n): Promise<SynapseStoreWithDispatcher<TStore, TStorage, TSelectors, ExtractDispatchType<TDispatcher>>>\n\n// Случай 3: Без dispatcher\nexport function createSynapse<\n TStore extends Record<string, any>,\n TSelectors = any,\n TExternalSelectors extends Record<string, any> = Record<string, any>,\n TStorage extends IStorage<TStore> = IStorage<TStore>,\n>(config: CreateSynapseConfigBasic<TStore, TSelectors, TExternalSelectors>): Promise<SynapseStoreBasic<TStore, TStorage, TSelectors>>\n\n// Основная реализация\nexport async function createSynapse<\n TStore extends Record<string, any>,\n TSelectors = any,\n TDispatcher = any,\n TApi extends Record<string, any> = Record<string, never>,\n TConfig extends Record<string, any> = Record<string, never>,\n TExternalSelectors extends Record<string, any> = Record<string, any>,\n TStorage extends IStorage<TStore> = IStorage<TStore>,\n>(config: any): Promise<any> {\n // 0. Валидируем конфигурацию\n try {\n validateSynapseConfig(config)\n } catch (error) {\n handleOperationError('createSynapse: configuration validation failed', error)\n }\n\n // 1. Сначала ждем готовности всех зависимостей\n await waitForDependencies(config.dependencies, config.dependencyTimeout)\n\n // 2. Выполняем setup (например, инициализация API-клиентов)\n if (config.setup) {\n try {\n await config.setup()\n } catch (error) {\n handleOperationError('createSynapse: setup failed', error)\n }\n }\n\n // 3. Создаем и инициализируем хранилище\n const storageInstance = (config.createStorageFn ? await config.createStorageFn() : config.storage!) as TStorage\n await storageInstance.initialize()\n\n // Создаем сборщики для последующей очистки\n const cleanupCallbacks: Array<() => Promise<void> | void> = []\n\n const result: any = {\n storage: storageInstance,\n selectors: {} as TSelectors,\n destroy: async () => {\n for (const callback of cleanupCallbacks) {\n await callback()\n }\n },\n }\n\n cleanupCallbacks.push(() => storageInstance.destroy())\n\n let dispatcher: TDispatcher | undefined\n let selectorModule: ISelectorModule<TStore>\n let effectsModule: any\n\n // 4. Создаем модуль селекторов\n if (config.createSelectorsFn) {\n try {\n selectorModule = new SelectorModule(storageInstance)\n\n const externalSelectors = config.externalSelectors || ({} as TExternalSelectors)\n\n result.selectors = config.createSelectorsFn(selectorModule, externalSelectors)\n\n if (typeof (selectorModule as any).destroy === 'function') {\n cleanupCallbacks.push(() => selectorModule.destroy())\n }\n } catch (error) {\n handleCallbackError('createSynapse: error creating selectors', error)\n }\n }\n\n // 5. Создаем диспетчер\n if (config.createDispatcherFn) {\n dispatcher = config.createDispatcherFn(storageInstance)\n result.dispatcher = dispatcher\n\n // @ts-ignore\n if (dispatcher && 'dispatch' in dispatcher) {\n result.actions = (dispatcher as any).dispatch\n\n if (typeof (dispatcher as any).destroy === 'function') {\n cleanupCallbacks.push(() => (dispatcher as any).destroy())\n }\n }\n }\n\n // 6. Создаем и настраиваем модуль эффектов\n if (config.createEffectConfig && dispatcher) {\n try {\n const { services, config: effectConfig, externalDispatchers, externalStates } = config.createEffectConfig()\n\n effectsModule = new EffectsModule(storageInstance, dispatcher as any, externalDispatchers || {}, services, effectConfig, externalStates || {})\n\n if (Array.isArray(config.effects)) {\n // @ts-ignore\n config.effects.forEach((effect) => {\n if (effectsModule) effectsModule.add(effect)\n })\n }\n\n await effectsModule.start()\n result.state$ = effectsModule.state$\n\n cleanupCallbacks.push(() => {\n if (effectsModule) effectsModule.stop()\n })\n } catch (error) {\n handleCallbackError('createSynapse: error creating effects module', error)\n }\n }\n\n return result\n}\n"],"names":["handleCallbackError","handleOperationError","SelectorModule","EffectsModule","validateSynapseConfig","waitForDependencies","createSynapse","config","error","storageInstance","cleanupCallbacks","result","callback","dispatcher","selectorModule","effectsModule","externalSelectors","services","effectConfig","externalDispatchers","externalStates","Array","effect"],"mappings":";;;;;;;;;;;AAA4F;AACtB;AACxB;AAUI;AACS;AAsC3D,sBAAsB;AACf,eAAeM,aAAaA,CAQjCC,MAAW;IACX,6BAA6B;IAC7B,IAAI;QACFH,qBAAqBA,CAACG;IACxB,EAAE,OAAOC,OAAO;QACdP,oBAAoBA,CAAC,kDAAkDO;IACzE;IAEA,+CAA+C;IAC/C,MAAMH,mBAAmBA,CAACE,OAAO,YAAY,EAAEA,OAAO,iBAAiB;IAEvE,4DAA4D;IAC5D,IAAIA,OAAO,KAAK,EAAE;QAChB,IAAI;YACF,MAAMA,OAAO,KAAK;QACpB,EAAE,OAAOC,OAAO;YACdP,oBAAoBA,CAAC,+BAA+BO;QACtD;IACF;IAEA,wCAAwC;IACxC,MAAMC,kBAAmBF,OAAO,eAAe,GAAG,MAAMA,OAAO,eAAe,KAAKA,OAAO,OAAO;IACjG,MAAME,gBAAgB,UAAU;IAEhC,2CAA2C;IAC3C,MAAMC,mBAAsD,EAAE;IAE9D,MAAMC,SAAc;QAClB,SAASF;QACT,WAAW,CAAC;QACZ,SAAS;YACP,KAAK,MAAMG,YAAYF,iBAAkB;gBACvC,MAAME;YACR;QACF;IACF;IAEAF,iBAAiB,IAAI,CAAC,IAAMD,gBAAgB,OAAO;IAEnD,IAAII;IACJ,IAAIC;IACJ,IAAIC;IAEJ,+BAA+B;IAC/B,IAAIR,OAAO,iBAAiB,EAAE;QAC5B,IAAI;YACFO,iBAAiB,IAAIZ,cAAcA,CAACO;YAEpC,MAAMO,oBAAoBT,OAAO,iBAAiB,IAAK,CAAC;YAExDI,OAAO,SAAS,GAAGJ,OAAO,iBAAiB,CAACO,gBAAgBE;YAE5D,IAAI,OAAQF,eAAuB,OAAO,KAAK,YAAY;gBACzDJ,iBAAiB,IAAI,CAAC,IAAMI,eAAe,OAAO;YACpD;QACF,EAAE,OAAON,OAAO;YACdR,mBAAmBA,CAAC,2CAA2CQ;QACjE;IACF;IAEA,uBAAuB;IACvB,IAAID,OAAO,kBAAkB,EAAE;QAC7BM,aAAaN,OAAO,kBAAkB,CAACE;QACvCE,OAAO,UAAU,GAAGE;QAEpB,aAAa;QACb,IAAIA,cAAc,cAAcA,YAAY;YAC1CF,OAAO,OAAO,GAAIE,WAAmB,QAAQ;YAE7C,IAAI,OAAQA,WAAmB,OAAO,KAAK,YAAY;gBACrDH,iBAAiB,IAAI,CAAC,IAAOG,WAAmB,OAAO;YACzD;QACF;IACF;IAEA,2CAA2C;IAC3C,IAAIN,OAAO,kBAAkB,IAAIM,YAAY;QAC3C,IAAI;YACF,MAAM,EAAEI,QAAQ,EAAE,QAAQC,YAAY,EAAEC,mBAAmB,EAAEC,cAAc,EAAE,GAAGb,OAAO,kBAAkB;YAEzGQ,gBAAgB,IAAIZ,aAAaA,CAACM,iBAAiBI,YAAmBM,uBAAuB,CAAC,GAAGF,UAAUC,cAAcE,kBAAkB,CAAC;YAE5I,IAAIC,MAAM,OAAO,CAACd,OAAO,OAAO,GAAG;gBACjC,aAAa;gBACbA,OAAO,OAAO,CAAC,OAAO,CAAC,CAACe;oBACtB,IAAIP,eAAeA,cAAc,GAAG,CAACO;gBACvC;YACF;YAEA,MAAMP,cAAc,KAAK;YACzBJ,OAAO,MAAM,GAAGI,cAAc,MAAM;YAEpCL,iBAAiB,IAAI,CAAC;gBACpB,IAAIK,eAAeA,cAAc,IAAI;YACvC;QACF,EAAE,OAAOP,OAAO;YACdR,mBAAmBA,CAAC,gDAAgDQ;QACtE;IACF;IAEA,OAAOG;AACT"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { createSynapse } from './createSynapse';
|
|
2
|
+
export type { AnySynapseStore, CreateSynapseConfigBasic, CreateSynapseConfigWithDispatcher, CreateSynapseConfigWithEffects, ExtractDispatchType, ExtractPromiseType, ExtractStorageType, StorageCreatorFunction, SynapseDependency, SynapseStoreBasic, SynapseStoreWithDispatcher, SynapseStoreWithEffects, } from './types';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/createSynapse/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,YAAY,EACV,eAAe,EACf,wBAAwB,EACxB,iCAAiC,EACjC,8BAA8B,EAC9B,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,SAAS,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils/createSynapse/index.js","sources":["../../../src/utils/createSynapse/index.ts"],"sourcesContent":["export { createSynapse } from './createSynapse'\nexport type {\n AnySynapseStore,\n CreateSynapseConfigBasic,\n CreateSynapseConfigWithDispatcher,\n CreateSynapseConfigWithEffects,\n ExtractDispatchType,\n ExtractPromiseType,\n ExtractStorageType,\n StorageCreatorFunction,\n SynapseDependency,\n SynapseStoreBasic,\n SynapseStoreWithDispatcher,\n SynapseStoreWithEffects,\n} from './types'\n"],"names":["createSynapse"],"mappings":";AAA+C"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { ISelectorModule, IStorage, IStorageBase } from '../../core';
|
|
3
|
+
import { Effect, ExternalStates } from '../../reactive';
|
|
4
|
+
export type ExtractPromiseType<T> = T extends Promise<infer U> ? U : T;
|
|
5
|
+
export type ExtractStorageType<T> = T extends IStorageBase<infer U> ? U : never;
|
|
6
|
+
export type ExtractDispatchType<T> = T extends {
|
|
7
|
+
dispatch: infer D;
|
|
8
|
+
} ? D : never;
|
|
9
|
+
export type StorageCreatorFunction<T extends Record<string, any>> = () => Promise<IStorage<T>>;
|
|
10
|
+
export type SynapseDependency = {
|
|
11
|
+
storage: IStorageBase<any>;
|
|
12
|
+
};
|
|
13
|
+
/** Всё что можно передать в dependencies[]: raw storage, обёртка { storage }, или Promise от другого synapse */
|
|
14
|
+
export type DependencyInput = IStorageBase<any> | SynapseDependency | Promise<AnySynapseStore>;
|
|
15
|
+
/**
|
|
16
|
+
* Базовая конфигурация хранилища
|
|
17
|
+
*/
|
|
18
|
+
export type BaseSynapseConfig<TStore extends Record<string, any>, TSelectors = any, TExternalSelectors extends Record<string, any> = Record<string, any>> = ({
|
|
19
|
+
storage: IStorage<TStore>;
|
|
20
|
+
createStorageFn?: undefined;
|
|
21
|
+
} | {
|
|
22
|
+
storage?: undefined;
|
|
23
|
+
createStorageFn: StorageCreatorFunction<TStore>;
|
|
24
|
+
}) & {
|
|
25
|
+
setup?: () => Promise<void> | void;
|
|
26
|
+
dependencies?: DependencyInput[];
|
|
27
|
+
dependencyTimeout?: number;
|
|
28
|
+
externalSelectors?: TExternalSelectors;
|
|
29
|
+
createSelectorsFn?: (selectorModule: ISelectorModule<TStore>, externalSelectors: TExternalSelectors) => TSelectors;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Конфигурация с dispatcher и effects
|
|
33
|
+
*/
|
|
34
|
+
export type CreateSynapseConfigWithEffects<TStore extends Record<string, any>, TSelectors = any, TDispatcher = any, TServices extends Record<string, any> = Record<string, never>, TConfig extends Record<string, any> = Record<string, never>, TExternalSelectors extends Record<string, any> = Record<string, any>> = BaseSynapseConfig<TStore, TSelectors, TExternalSelectors> & {
|
|
35
|
+
createDispatcherFn: (storage: IStorage<TStore>) => TDispatcher;
|
|
36
|
+
createEffectConfig: () => {
|
|
37
|
+
services?: TServices;
|
|
38
|
+
config?: TConfig;
|
|
39
|
+
externalDispatchers?: Record<string, any>;
|
|
40
|
+
externalStates?: ExternalStates;
|
|
41
|
+
};
|
|
42
|
+
effects?: Effect<TStore, any, TServices, TConfig, any, any>[];
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Конфигурация только с dispatcher
|
|
46
|
+
*/
|
|
47
|
+
export type CreateSynapseConfigWithDispatcher<TStore extends Record<string, any>, TSelectors = any, TDispatcher = any, TExternalSelectors extends Record<string, any> = Record<string, any>> = BaseSynapseConfig<TStore, TSelectors, TExternalSelectors> & {
|
|
48
|
+
createDispatcherFn: (storage: IStorage<TStore>) => TDispatcher;
|
|
49
|
+
createEffectConfig?: never;
|
|
50
|
+
effects?: never;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Конфигурация без dispatcher
|
|
54
|
+
*/
|
|
55
|
+
export type CreateSynapseConfigBasic<TStore extends Record<string, any>, TSelectors = any, TExternalSelectors extends Record<string, any> = Record<string, any>> = BaseSynapseConfig<TStore, TSelectors, TExternalSelectors> & {
|
|
56
|
+
createDispatcherFn?: never;
|
|
57
|
+
createEffectConfig?: never;
|
|
58
|
+
effects?: never;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Результат с dispatcher и effects
|
|
62
|
+
*/
|
|
63
|
+
export interface SynapseStoreWithEffects<TStore extends Record<string, any>, TStorage extends IStorageBase<TStore>, TSelectors, TActions> {
|
|
64
|
+
storage: TStorage;
|
|
65
|
+
selectors: TSelectors;
|
|
66
|
+
actions: TActions;
|
|
67
|
+
state$: Observable<TStore>;
|
|
68
|
+
dispatcher: any;
|
|
69
|
+
destroy: () => Promise<void>;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Результат только с dispatcher
|
|
73
|
+
*/
|
|
74
|
+
export interface SynapseStoreWithDispatcher<TStore extends Record<string, any>, TStorage extends IStorageBase<TStore>, TSelectors, TActions> {
|
|
75
|
+
storage: TStorage;
|
|
76
|
+
selectors: TSelectors;
|
|
77
|
+
actions: TActions;
|
|
78
|
+
dispatcher: any;
|
|
79
|
+
destroy: () => Promise<void>;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Результат без dispatcher
|
|
83
|
+
*/
|
|
84
|
+
export interface SynapseStoreBasic<TStore extends Record<string, any>, TStorage extends IStorageBase<TStore>, TSelectors> {
|
|
85
|
+
storage: TStorage;
|
|
86
|
+
selectors: TSelectors;
|
|
87
|
+
destroy: () => Promise<void>;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Union-тип для всех возможных результатов createSynapse
|
|
91
|
+
*/
|
|
92
|
+
export type AnySynapseStore<TStore extends Record<string, any> = any, TStorage extends IStorageBase<TStore> = IStorage<any>, TSelectors = any, TActions = any> = SynapseStoreWithEffects<TStore, TStorage, TSelectors, TActions> | SynapseStoreWithDispatcher<TStore, TStorage, TSelectors, TActions> | SynapseStoreBasic<TStore, TStorage, TSelectors>;
|
|
93
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/createSynapse/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils/createSynapse/types.js","sources":["../../../src/utils/createSynapse/types.ts"],"sourcesContent":["import { Observable } from 'rxjs'\n\nimport { ISelectorModule, IStorage, IStorageBase } from '../../core'\nimport { Effect, ExternalStates } from '../../reactive'\n\n// Вспомогательные типы для извлечения типов из других типов\nexport type ExtractPromiseType<T> = T extends Promise<infer U> ? U : T\nexport type ExtractStorageType<T> = T extends IStorageBase<infer U> ? U : never\nexport type ExtractDispatchType<T> = T extends { dispatch: infer D } ? D : never\n\nexport type StorageCreatorFunction<T extends Record<string, any>> = () => Promise<IStorage<T>>\n\nexport type SynapseDependency = {\n storage: IStorageBase<any>\n}\n\n/** Всё что можно передать в dependencies[]: raw storage, обёртка { storage }, или Promise от другого synapse */\nexport type DependencyInput = IStorageBase<any> | SynapseDependency | Promise<AnySynapseStore>\n\n/**\n * Базовая конфигурация хранилища\n */\nexport type BaseSynapseConfig<TStore extends Record<string, any>, TSelectors = any, TExternalSelectors extends Record<string, any> = Record<string, any>> = (\n | { storage: IStorage<TStore>; createStorageFn?: undefined }\n | { storage?: undefined; createStorageFn: StorageCreatorFunction<TStore> }\n) & {\n // Асинхронная функция инициализации, вызывается после готовности зависимостей, до инициализации хранилища\n setup?: () => Promise<void> | void\n // Зависимости от других synapse\n dependencies?: DependencyInput[]\n // Таймаут ожидания готовности зависимостей (мс, по умолчанию 30000)\n dependencyTimeout?: number\n // Внешние селекторы\n externalSelectors?: TExternalSelectors\n // Функция создания селекторов\n createSelectorsFn?: (selectorModule: ISelectorModule<TStore>, externalSelectors: TExternalSelectors) => TSelectors\n}\n\n/**\n * Конфигурация с dispatcher и effects\n */\nexport type CreateSynapseConfigWithEffects<\n TStore extends Record<string, any>,\n TSelectors = any,\n TDispatcher = any,\n TServices extends Record<string, any> = Record<string, never>,\n TConfig extends Record<string, any> = Record<string, never>,\n TExternalSelectors extends Record<string, any> = Record<string, any>,\n> = BaseSynapseConfig<TStore, TSelectors, TExternalSelectors> & {\n // Функция создания диспетчера (обязательная)\n createDispatcherFn: (storage: IStorage<TStore>) => TDispatcher\n // Функция создания конфигурации для эффектов (dispatcher передаётся автоматически)\n createEffectConfig: () => {\n services?: TServices\n config?: TConfig\n externalDispatchers?: Record<string, any>\n externalStates?: ExternalStates\n }\n // Эффекты\n effects?: Effect<TStore, any, TServices, TConfig, any, any>[]\n}\n\n/**\n * Конфигурация только с dispatcher\n */\nexport type CreateSynapseConfigWithDispatcher<\n TStore extends Record<string, any>,\n TSelectors = any,\n TDispatcher = any,\n TExternalSelectors extends Record<string, any> = Record<string, any>,\n> = BaseSynapseConfig<TStore, TSelectors, TExternalSelectors> & {\n // Функция создания диспетчера (обязательная)\n createDispatcherFn: (storage: IStorage<TStore>) => TDispatcher\n // Эффекты отсутствуют\n createEffectConfig?: never\n effects?: never\n}\n\n/**\n * Конфигурация без dispatcher\n */\nexport type CreateSynapseConfigBasic<\n TStore extends Record<string, any>,\n TSelectors = any,\n TExternalSelectors extends Record<string, any> = Record<string, any>,\n> = BaseSynapseConfig<TStore, TSelectors, TExternalSelectors> & {\n // Dispatcher отсутствует\n createDispatcherFn?: never\n createEffectConfig?: never\n effects?: never\n}\n\n/**\n * Результат с dispatcher и effects\n */\nexport interface SynapseStoreWithEffects<TStore extends Record<string, any>, TStorage extends IStorageBase<TStore>, TSelectors, TActions> {\n storage: TStorage\n selectors: TSelectors\n actions: TActions\n state$: Observable<TStore>\n dispatcher: any\n destroy: () => Promise<void>\n}\n\n/**\n * Результат только с dispatcher\n */\nexport interface SynapseStoreWithDispatcher<TStore extends Record<string, any>, TStorage extends IStorageBase<TStore>, TSelectors, TActions> {\n storage: TStorage\n selectors: TSelectors\n actions: TActions\n dispatcher: any\n destroy: () => Promise<void>\n}\n\n/**\n * Результат без dispatcher\n */\nexport interface SynapseStoreBasic<TStore extends Record<string, any>, TStorage extends IStorageBase<TStore>, TSelectors> {\n storage: TStorage\n selectors: TSelectors\n destroy: () => Promise<void>\n}\n\n/**\n * Union-тип для всех возможных результатов createSynapse\n */\nexport type AnySynapseStore<TStore extends Record<string, any> = any, TStorage extends IStorageBase<TStore> = IStorage<any>, TSelectors = any, TActions = any> =\n | SynapseStoreWithEffects<TStore, TStorage, TSelectors, TActions>\n | SynapseStoreWithDispatcher<TStore, TStorage, TSelectors, TActions>\n | SynapseStoreBasic<TStore, TStorage, TSelectors>\n"],"names":[],"mappings":"AA4HA;;CAEC,GAIkD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/utils/createSynapse/validate.ts"],"names":[],"mappings":"AAAA,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAwFvD"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
function validateSynapseConfig(config) {
|
|
2
|
+
// Проверяем базовые требования к хранилищу
|
|
3
|
+
if (!config.storage && !config.createStorageFn) {
|
|
4
|
+
throw new Error('Synapse config must have either "storage" or "createStorageFn"');
|
|
5
|
+
}
|
|
6
|
+
if (config.storage && config.createStorageFn) {
|
|
7
|
+
throw new Error('Synapse config cannot have both "storage" and "createStorageFn". Choose one.');
|
|
8
|
+
}
|
|
9
|
+
// Проверяем зависимости эффектов от диспетчера
|
|
10
|
+
if (config.effects && !config.createDispatcherFn) {
|
|
11
|
+
throw new Error('Effects require dispatcher. Add "createDispatcherFn" to config.');
|
|
12
|
+
}
|
|
13
|
+
if (config.createEffectConfig && !config.createDispatcherFn) {
|
|
14
|
+
throw new Error('Effect config requires dispatcher. Add "createDispatcherFn" to config.');
|
|
15
|
+
}
|
|
16
|
+
// Проверяем зависимости
|
|
17
|
+
if (config.dependencies) {
|
|
18
|
+
if (!Array.isArray(config.dependencies)) {
|
|
19
|
+
throw new Error('Dependencies must be an array');
|
|
20
|
+
}
|
|
21
|
+
config.dependencies.forEach((dependency, index)=>{
|
|
22
|
+
if (!dependency || typeof dependency !== 'object') {
|
|
23
|
+
throw new Error(`Dependency at index ${index} must be an object`);
|
|
24
|
+
}
|
|
25
|
+
// Skip validation for Promises — they will be resolved and validated in waitForDependencies
|
|
26
|
+
if (dependency instanceof Promise || typeof dependency.then === 'function') {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Raw IStorageBase (имеет waitForReady напрямую)
|
|
30
|
+
if (typeof dependency.waitForReady === 'function') {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Обёртка { storage: IStorageBase }
|
|
34
|
+
if (dependency.storage && typeof dependency.storage.waitForReady === 'function') {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
throw new Error(`Dependency at index ${index} must be IStorageBase, { storage: IStorageBase }, or Promise<SynapseStore>`);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
// Проверяем функции создания
|
|
41
|
+
if (config.createStorageFn && typeof config.createStorageFn !== 'function') {
|
|
42
|
+
throw new Error('"createStorageFn" must be a function');
|
|
43
|
+
}
|
|
44
|
+
if (config.createDispatcherFn && typeof config.createDispatcherFn !== 'function') {
|
|
45
|
+
throw new Error('"createDispatcherFn" must be a function');
|
|
46
|
+
}
|
|
47
|
+
if (config.createSelectorsFn && typeof config.createSelectorsFn !== 'function') {
|
|
48
|
+
throw new Error('"createSelectorsFn" must be a function');
|
|
49
|
+
}
|
|
50
|
+
if (config.createEffectConfig && typeof config.createEffectConfig !== 'function') {
|
|
51
|
+
throw new Error('"createEffectConfig" must be a function');
|
|
52
|
+
}
|
|
53
|
+
// Проверяем эффекты
|
|
54
|
+
if (config.effects) {
|
|
55
|
+
if (!Array.isArray(config.effects)) {
|
|
56
|
+
throw new Error('Effects must be an array');
|
|
57
|
+
}
|
|
58
|
+
config.effects.forEach((effect, index)=>{
|
|
59
|
+
if (typeof effect !== 'function') {
|
|
60
|
+
throw new Error(`Effect at index ${index} must be a function`);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// Проверяем setup
|
|
65
|
+
if (config.setup && typeof config.setup !== 'function') {
|
|
66
|
+
throw new Error('"setup" must be a function');
|
|
67
|
+
}
|
|
68
|
+
// Проверяем внешние селекторы
|
|
69
|
+
if (config.externalSelectors && typeof config.externalSelectors !== 'object') {
|
|
70
|
+
throw new Error('External selectors must be an object');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export { validateSynapseConfig };
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils/createSynapse/validate.js","sources":["../../../src/utils/createSynapse/validate.ts"],"sourcesContent":["export function validateSynapseConfig(config: any): void {\n // Проверяем базовые требования к хранилищу\n if (!config.storage && !config.createStorageFn) {\n throw new Error('Synapse config must have either \"storage\" or \"createStorageFn\"')\n }\n\n if (config.storage && config.createStorageFn) {\n throw new Error('Synapse config cannot have both \"storage\" and \"createStorageFn\". Choose one.')\n }\n\n // Проверяем зависимости эффектов от диспетчера\n if (config.effects && !config.createDispatcherFn) {\n throw new Error('Effects require dispatcher. Add \"createDispatcherFn\" to config.')\n }\n\n if (config.createEffectConfig && !config.createDispatcherFn) {\n throw new Error('Effect config requires dispatcher. Add \"createDispatcherFn\" to config.')\n }\n\n // Проверяем зависимости\n if (config.dependencies) {\n if (!Array.isArray(config.dependencies)) {\n throw new Error('Dependencies must be an array')\n }\n\n config.dependencies.forEach((dependency: any, index: number) => {\n if (!dependency || typeof dependency !== 'object') {\n throw new Error(`Dependency at index ${index} must be an object`)\n }\n\n // Skip validation for Promises — they will be resolved and validated in waitForDependencies\n if (dependency instanceof Promise || typeof dependency.then === 'function') {\n return\n }\n\n // Raw IStorageBase (имеет waitForReady напрямую)\n if (typeof dependency.waitForReady === 'function') {\n return\n }\n\n // Обёртка { storage: IStorageBase }\n if (dependency.storage && typeof dependency.storage.waitForReady === 'function') {\n return\n }\n\n throw new Error(`Dependency at index ${index} must be IStorageBase, { storage: IStorageBase }, or Promise<SynapseStore>`)\n })\n }\n\n // Проверяем функции создания\n if (config.createStorageFn && typeof config.createStorageFn !== 'function') {\n throw new Error('\"createStorageFn\" must be a function')\n }\n\n if (config.createDispatcherFn && typeof config.createDispatcherFn !== 'function') {\n throw new Error('\"createDispatcherFn\" must be a function')\n }\n\n if (config.createSelectorsFn && typeof config.createSelectorsFn !== 'function') {\n throw new Error('\"createSelectorsFn\" must be a function')\n }\n\n if (config.createEffectConfig && typeof config.createEffectConfig !== 'function') {\n throw new Error('\"createEffectConfig\" must be a function')\n }\n\n // Проверяем эффекты\n if (config.effects) {\n if (!Array.isArray(config.effects)) {\n throw new Error('Effects must be an array')\n }\n\n config.effects.forEach((effect: any, index: number) => {\n if (typeof effect !== 'function') {\n throw new Error(`Effect at index ${index} must be a function`)\n }\n })\n }\n\n // Проверяем setup\n if (config.setup && typeof config.setup !== 'function') {\n throw new Error('\"setup\" must be a function')\n }\n\n // Проверяем внешние селекторы\n if (config.externalSelectors && typeof config.externalSelectors !== 'object') {\n throw new Error('External selectors must be an object')\n }\n}\n"],"names":["validateSynapseConfig","config","Error","Array","dependency","index","Promise","effect"],"mappings":"AAAO,SAASA,qBAAqBA,CAACC,MAAW;IAC/C,2CAA2C;IAC3C,IAAI,CAACA,OAAO,OAAO,IAAI,CAACA,OAAO,eAAe,EAAE;QAC9C,MAAM,IAAIC,MAAM;IAClB;IAEA,IAAID,OAAO,OAAO,IAAIA,OAAO,eAAe,EAAE;QAC5C,MAAM,IAAIC,MAAM;IAClB;IAEA,+CAA+C;IAC/C,IAAID,OAAO,OAAO,IAAI,CAACA,OAAO,kBAAkB,EAAE;QAChD,MAAM,IAAIC,MAAM;IAClB;IAEA,IAAID,OAAO,kBAAkB,IAAI,CAACA,OAAO,kBAAkB,EAAE;QAC3D,MAAM,IAAIC,MAAM;IAClB;IAEA,wBAAwB;IACxB,IAAID,OAAO,YAAY,EAAE;QACvB,IAAI,CAACE,MAAM,OAAO,CAACF,OAAO,YAAY,GAAG;YACvC,MAAM,IAAIC,MAAM;QAClB;QAEAD,OAAO,YAAY,CAAC,OAAO,CAAC,CAACG,YAAiBC;YAC5C,IAAI,CAACD,cAAc,OAAOA,eAAe,UAAU;gBACjD,MAAM,IAAIF,MAAM,CAAC,oBAAoB,EAAEG,MAAM,kBAAkB,CAAC;YAClE;YAEA,4FAA4F;YAC5F,IAAID,sBAAsBE,WAAW,OAAOF,WAAW,IAAI,KAAK,YAAY;gBAC1E;YACF;YAEA,iDAAiD;YACjD,IAAI,OAAOA,WAAW,YAAY,KAAK,YAAY;gBACjD;YACF;YAEA,oCAAoC;YACpC,IAAIA,WAAW,OAAO,IAAI,OAAOA,WAAW,OAAO,CAAC,YAAY,KAAK,YAAY;gBAC/E;YACF;YAEA,MAAM,IAAIF,MAAM,CAAC,oBAAoB,EAAEG,MAAM,0EAA0E,CAAC;QAC1H;IACF;IAEA,6BAA6B;IAC7B,IAAIJ,OAAO,eAAe,IAAI,OAAOA,OAAO,eAAe,KAAK,YAAY;QAC1E,MAAM,IAAIC,MAAM;IAClB;IAEA,IAAID,OAAO,kBAAkB,IAAI,OAAOA,OAAO,kBAAkB,KAAK,YAAY;QAChF,MAAM,IAAIC,MAAM;IAClB;IAEA,IAAID,OAAO,iBAAiB,IAAI,OAAOA,OAAO,iBAAiB,KAAK,YAAY;QAC9E,MAAM,IAAIC,MAAM;IAClB;IAEA,IAAID,OAAO,kBAAkB,IAAI,OAAOA,OAAO,kBAAkB,KAAK,YAAY;QAChF,MAAM,IAAIC,MAAM;IAClB;IAEA,oBAAoB;IACpB,IAAID,OAAO,OAAO,EAAE;QAClB,IAAI,CAACE,MAAM,OAAO,CAACF,OAAO,OAAO,GAAG;YAClC,MAAM,IAAIC,MAAM;QAClB;QAEAD,OAAO,OAAO,CAAC,OAAO,CAAC,CAACM,QAAaF;YACnC,IAAI,OAAOE,WAAW,YAAY;gBAChC,MAAM,IAAIL,MAAM,CAAC,gBAAgB,EAAEG,MAAM,mBAAmB,CAAC;YAC/D;QACF;IACF;IAEA,kBAAkB;IAClB,IAAIJ,OAAO,KAAK,IAAI,OAAOA,OAAO,KAAK,KAAK,YAAY;QACtD,MAAM,IAAIC,MAAM;IAClB;IAEA,8BAA8B;IAC9B,IAAID,OAAO,iBAAiB,IAAI,OAAOA,OAAO,iBAAiB,KAAK,UAAU;QAC5E,MAAM,IAAIC,MAAM;IAClB;AACF"}
|