synapse-storage 4.1.2 → 5.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +142 -12
- package/dist/_utils/chunk.util.d.ts +0 -1
- package/dist/_utils/deepMerge.util.d.ts +0 -1
- package/dist/_utils/error-handling.util.d.ts +0 -1
- package/dist/_utils/flatMap.util.d.ts +0 -1
- package/dist/_utils/index.d.ts +0 -1
- package/dist/_utils/logger-console.util.d.ts +0 -1
- package/dist/api/api.module.d.ts +0 -1
- package/dist/api/components/endpoint.d.ts +11 -12
- package/dist/api/components/endpoint.js.map +1 -1
- package/dist/api/components/query-storage.d.ts +0 -1
- package/dist/api/components/query-storage.js +1 -1
- package/dist/api/components/query-storage.js.map +1 -1
- package/dist/api/index.d.ts +0 -1
- package/dist/api/types/api.interface.d.ts +0 -1
- package/dist/api/types/endpoint.interface.d.ts +0 -1
- package/dist/api/types/query.interface.d.ts +0 -1
- package/dist/api/utils/api-helpers.d.ts +0 -1
- package/dist/{core/storage → api}/utils/cache.util.d.ts +3 -6
- package/dist/{core/storage → api}/utils/cache.util.js +4 -7
- package/dist/api/utils/cache.util.js.map +1 -0
- package/dist/api/utils/create-header-context.d.ts +0 -1
- package/dist/api/utils/endpoint-headers.d.ts +0 -1
- package/dist/api/utils/fetch-base-query.d.ts +0 -1
- package/dist/api/utils/file-utils.d.ts +0 -1
- package/dist/api/utils/get-cacheable-headers.d.ts +0 -1
- package/dist/core/index.d.ts +0 -1
- package/dist/core/selector/index.d.ts +1 -1
- package/dist/core/selector/index.js +2 -0
- package/dist/core/selector/index.js.map +1 -1
- package/dist/core/selector/selector.interface.d.ts +15 -30
- package/dist/core/selector/selector.interface.js +2 -2
- package/dist/core/selector/selector.interface.js.map +1 -1
- package/dist/core/selector/selector.module.d.ts +16 -1
- package/dist/core/selector/selector.module.js +82 -20
- package/dist/core/selector/selector.module.js.map +1 -1
- package/dist/core/selector/selectors.base.d.ts +56 -0
- package/dist/core/selector/selectors.base.js +118 -0
- package/dist/core/selector/selectors.base.js.map +1 -0
- package/dist/core/storage/adapters/async-base-storage.service.d.ts +15 -4
- package/dist/core/storage/adapters/async-base-storage.service.js +106 -36
- package/dist/core/storage/adapters/async-base-storage.service.js.map +1 -1
- package/dist/core/storage/adapters/indexed-DB.service.d.ts +4 -5
- package/dist/core/storage/adapters/indexed-DB.service.js +66 -14
- package/dist/core/storage/adapters/indexed-DB.service.js.map +1 -1
- package/dist/core/storage/adapters/local-storage.service.d.ts +9 -4
- package/dist/core/storage/adapters/local-storage.service.js +25 -5
- package/dist/core/storage/adapters/local-storage.service.js.map +1 -1
- package/dist/core/storage/adapters/memory-storage.service.d.ts +2 -4
- package/dist/core/storage/adapters/memory-storage.service.js +5 -5
- package/dist/core/storage/adapters/memory-storage.service.js.map +1 -1
- package/dist/core/storage/adapters/path.utils.d.ts +0 -1
- package/dist/core/storage/adapters/storage-core.d.ts +6 -2
- package/dist/core/storage/adapters/storage-core.js +6 -3
- package/dist/core/storage/adapters/storage-core.js.map +1 -1
- package/dist/core/storage/adapters/sync-base-storage.service.d.ts +20 -4
- package/dist/core/storage/adapters/sync-base-storage.service.js +110 -35
- package/dist/core/storage/adapters/sync-base-storage.service.js.map +1 -1
- package/dist/core/storage/index.d.ts +2 -5
- package/dist/core/storage/index.js +1 -5
- package/dist/core/storage/index.js.map +1 -1
- package/dist/core/storage/middlewares/broadcast.middleware.d.ts +0 -1
- package/dist/core/storage/middlewares/index.d.ts +3 -1
- package/dist/core/storage/middlewares/index.js +6 -0
- package/dist/core/storage/middlewares/index.js.map +1 -1
- package/dist/core/storage/middlewares/storage-batching.middleware.d.ts +0 -1
- package/dist/core/storage/middlewares/storage-logger.middleware.d.ts +20 -0
- package/dist/core/storage/middlewares/storage-logger.middleware.js +53 -0
- package/dist/core/storage/middlewares/storage-logger.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.d.ts +0 -1
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.js +4 -10
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.js.map +1 -1
- package/dist/core/storage/middlewares/sync-broadcast.middleware.d.ts +0 -1
- package/dist/core/storage/middlewares/sync-storage-batching.middleware.d.ts +0 -1
- package/dist/core/storage/middlewares/sync-storage-logger.middleware.d.ts +7 -0
- package/dist/core/storage/middlewares/sync-storage-logger.middleware.js +48 -0
- package/dist/core/storage/middlewares/sync-storage-logger.middleware.js.map +1 -0
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.d.ts +0 -1
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.js +4 -10
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.js.map +1 -1
- package/dist/core/storage/modules/singleton/mixin.util.d.ts +0 -1
- package/dist/core/storage/modules/singleton/models.d.ts +0 -1
- package/dist/core/storage/modules/singleton/singleton.util.d.ts +0 -1
- package/dist/core/storage/storage.interface.d.ts +59 -4
- package/dist/core/storage/storage.interface.js +0 -2
- package/dist/core/storage/storage.interface.js.map +1 -1
- package/dist/core/storage/utils/broadcast.util.d.ts +0 -1
- package/dist/core/storage/utils/middleware-module.d.ts +0 -3
- package/dist/core/storage/utils/middleware-module.js +0 -8
- package/dist/core/storage/utils/middleware-module.js.map +1 -1
- package/dist/core/storage/utils/migration.util.d.ts +38 -0
- package/dist/core/storage/utils/migration.util.js +48 -0
- package/dist/core/storage/utils/migration.util.js.map +1 -0
- package/dist/core/storage/utils/path-selector.util.d.ts +0 -1
- package/dist/core/storage/utils/state-diff.util.d.ts +8 -1
- package/dist/core/storage/utils/state-diff.util.js +17 -1
- package/dist/core/storage/utils/state-diff.util.js.map +1 -1
- package/dist/core/storage/utils/storage-factory.util.d.ts +7 -9
- package/dist/core/storage/utils/storage-factory.util.js +10 -10
- package/dist/core/storage/utils/storage-factory.util.js.map +1 -1
- package/dist/core/storage/utils/storage-key.d.ts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/react/hooks/index.d.ts +2 -1
- package/dist/react/hooks/index.js +4 -0
- package/dist/react/hooks/index.js.map +1 -1
- package/dist/react/hooks/useCreateStorage.d.ts +5 -6
- package/dist/react/hooks/useCreateStorage.js +2 -2
- package/dist/react/hooks/useCreateStorage.js.map +1 -1
- package/dist/react/hooks/useObservable.d.ts +17 -0
- package/dist/react/hooks/useObservable.js +38 -0
- package/dist/react/hooks/useObservable.js.map +1 -0
- package/dist/react/hooks/useSelector.d.ts +0 -1
- package/dist/react/hooks/useSelector.js +5 -2
- package/dist/react/hooks/useSelector.js.map +1 -1
- package/dist/react/hooks/useStorage.d.ts +0 -1
- package/dist/react/hooks/useStorageSubscribe.d.ts +0 -1
- package/dist/react/hooks/useSubscription.d.ts +13 -0
- package/dist/react/hooks/useSubscription.js +23 -0
- package/dist/react/hooks/useSubscription.js.map +1 -0
- package/dist/react/index.d.ts +0 -1
- package/dist/react/utils/awaitSynapse.d.ts +9 -10
- package/dist/react/utils/awaitSynapse.js +3 -2
- package/dist/react/utils/awaitSynapse.js.map +1 -1
- package/dist/react/utils/createSynapseCtx.d.ts +18 -23
- package/dist/react/utils/createSynapseCtx.js +64 -39
- package/dist/react/utils/createSynapseCtx.js.map +1 -1
- package/dist/react/utils/index.d.ts +0 -1
- package/dist/reactive/dispatcher/dispatcher.base.d.ts +122 -0
- package/dist/reactive/dispatcher/dispatcher.base.js +294 -0
- package/dist/reactive/dispatcher/dispatcher.base.js.map +1 -0
- package/dist/reactive/dispatcher/dispatcher.module.d.ts +12 -67
- package/dist/reactive/dispatcher/dispatcher.module.js +13 -72
- package/dist/reactive/dispatcher/dispatcher.module.js.map +1 -1
- package/dist/reactive/dispatcher/index.d.ts +1 -1
- package/dist/reactive/dispatcher/index.js +2 -0
- package/dist/reactive/dispatcher/index.js.map +1 -1
- package/dist/reactive/dispatcher/middlewares/index.d.ts +0 -1
- package/dist/reactive/dispatcher/middlewares/logger.middleware.d.ts +0 -1
- package/dist/reactive/dispatcher/path.util.d.ts +15 -0
- package/dist/reactive/dispatcher/path.util.js +34 -0
- package/dist/reactive/dispatcher/path.util.js.map +1 -0
- package/dist/reactive/dispatcher/standalone.d.ts +1 -150
- package/dist/reactive/dispatcher/standalone.js +6 -217
- package/dist/reactive/dispatcher/standalone.js.map +1 -1
- package/dist/reactive/effects/effects.base.d.ts +62 -0
- package/dist/reactive/effects/effects.base.js +90 -0
- package/dist/reactive/effects/effects.base.js.map +1 -0
- package/dist/reactive/effects/effects.module.d.ts +122 -11
- package/dist/reactive/effects/effects.module.js +129 -17
- package/dist/reactive/effects/effects.module.js.map +1 -1
- package/dist/reactive/effects/index.d.ts +1 -1
- package/dist/reactive/effects/index.js +2 -0
- package/dist/reactive/effects/index.js.map +1 -1
- package/dist/reactive/effects/utils/chunkRequestConsistent.d.ts +0 -1
- package/dist/reactive/effects/utils/chunkRequestParallel.d.ts +0 -1
- package/dist/reactive/effects/utils/fromRequest.d.ts +0 -1
- package/dist/reactive/effects/utils/index.d.ts +0 -1
- package/dist/reactive/effects/utils/toObservable.d.ts +0 -1
- package/dist/reactive/index.d.ts +0 -1
- package/dist/utils/createEventBus.d.ts +47 -46
- package/dist/utils/createEventBus.js +152 -174
- package/dist/utils/createEventBus.js.map +1 -1
- package/dist/utils/createSynapse/createSynapse.d.ts +25 -7
- package/dist/utils/createSynapse/createSynapse.js +28 -98
- package/dist/utils/createSynapse/createSynapse.js.map +1 -1
- package/dist/utils/createSynapse/factory.d.ts +6 -0
- package/dist/utils/createSynapse/factory.js +256 -0
- package/dist/utils/createSynapse/factory.js.map +1 -0
- package/dist/utils/createSynapse/index.d.ts +2 -2
- package/dist/utils/createSynapse/index.js.map +1 -1
- package/dist/utils/createSynapse/synapse.types.d.ts +87 -0
- package/dist/utils/createSynapse/synapse.types.js +11 -0
- package/dist/utils/createSynapse/synapse.types.js.map +1 -0
- package/dist/utils/createSynapse/types.d.ts +6 -85
- package/dist/utils/createSynapse/types.js +2 -1
- package/dist/utils/createSynapse/types.js.map +1 -1
- package/dist/utils/createSynapse/waitForDependencies.d.ts +0 -1
- package/dist/utils/createSynapse/waitForDependencies.js +1 -1
- package/dist/utils/createSynapse/waitForDependencies.js.map +1 -1
- package/dist/utils/createSynapseAwaiter.d.ts +13 -10
- package/dist/utils/createSynapseAwaiter.js +30 -3
- package/dist/utils/createSynapseAwaiter.js.map +1 -1
- package/dist/utils/dehydrateModule.d.ts +6 -0
- package/dist/utils/dehydrateModule.js +43 -0
- package/dist/utils/dehydrateModule.js.map +1 -0
- package/dist/utils/index.d.ts +3 -3
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -1
- package/package.json +12 -2
- package/dist/_utils/chunk.util.d.ts.map +0 -1
- package/dist/_utils/deepMerge.util.d.ts.map +0 -1
- package/dist/_utils/error-handling.util.d.ts.map +0 -1
- package/dist/_utils/flatMap.util.d.ts.map +0 -1
- package/dist/_utils/index.d.ts.map +0 -1
- package/dist/_utils/logger-console.util.d.ts.map +0 -1
- package/dist/api/api.module.d.ts.map +0 -1
- package/dist/api/components/endpoint.d.ts.map +0 -1
- package/dist/api/components/query-storage.d.ts.map +0 -1
- package/dist/api/example.d.ts +0 -83
- package/dist/api/example.d.ts.map +0 -1
- package/dist/api/example.js +0 -90
- package/dist/api/example.js.map +0 -1
- package/dist/api/index.d.ts.map +0 -1
- package/dist/api/types/api.interface.d.ts.map +0 -1
- package/dist/api/types/endpoint.interface.d.ts.map +0 -1
- package/dist/api/types/query.interface.d.ts.map +0 -1
- package/dist/api/utils/api-helpers.d.ts.map +0 -1
- package/dist/api/utils/create-header-context.d.ts.map +0 -1
- package/dist/api/utils/endpoint-headers.d.ts.map +0 -1
- package/dist/api/utils/fetch-base-query.d.ts.map +0 -1
- package/dist/api/utils/file-utils.d.ts.map +0 -1
- package/dist/api/utils/get-cacheable-headers.d.ts.map +0 -1
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/selector/index.d.ts.map +0 -1
- package/dist/core/selector/selector.interface.d.ts.map +0 -1
- package/dist/core/selector/selector.module.d.ts.map +0 -1
- package/dist/core/storage/adapters/async-base-storage.service.d.ts.map +0 -1
- package/dist/core/storage/adapters/indexed-DB.service.d.ts.map +0 -1
- package/dist/core/storage/adapters/local-storage.service.d.ts.map +0 -1
- package/dist/core/storage/adapters/memory-storage.service.d.ts.map +0 -1
- package/dist/core/storage/adapters/path.utils.d.ts.map +0 -1
- package/dist/core/storage/adapters/storage-core.d.ts.map +0 -1
- package/dist/core/storage/adapters/sync-base-storage.service.d.ts.map +0 -1
- package/dist/core/storage/index.d.ts.map +0 -1
- package/dist/core/storage/middlewares/broadcast.middleware.d.ts.map +0 -1
- package/dist/core/storage/middlewares/index.d.ts.map +0 -1
- package/dist/core/storage/middlewares/storage-batching.middleware.d.ts.map +0 -1
- package/dist/core/storage/middlewares/storage-shallow-compare.middleware.d.ts.map +0 -1
- package/dist/core/storage/middlewares/sync-broadcast.middleware.d.ts.map +0 -1
- package/dist/core/storage/middlewares/sync-storage-batching.middleware.d.ts.map +0 -1
- package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.d.ts.map +0 -1
- package/dist/core/storage/modules/plugin/plugin.interface.d.ts +0 -101
- package/dist/core/storage/modules/plugin/plugin.interface.d.ts.map +0 -1
- package/dist/core/storage/modules/plugin/plugin.interface.js +0 -8
- package/dist/core/storage/modules/plugin/plugin.interface.js.map +0 -1
- package/dist/core/storage/modules/plugin/plugin.service.d.ts +0 -49
- package/dist/core/storage/modules/plugin/plugin.service.d.ts.map +0 -1
- package/dist/core/storage/modules/plugin/plugin.service.js +0 -406
- package/dist/core/storage/modules/plugin/plugin.service.js.map +0 -1
- package/dist/core/storage/modules/singleton/mixin.util.d.ts.map +0 -1
- package/dist/core/storage/modules/singleton/models.d.ts.map +0 -1
- package/dist/core/storage/modules/singleton/singleton.util.d.ts.map +0 -1
- package/dist/core/storage/storage.interface.d.ts.map +0 -1
- package/dist/core/storage/utils/broadcast.util.d.ts.map +0 -1
- package/dist/core/storage/utils/cache.util.d.ts.map +0 -1
- package/dist/core/storage/utils/cache.util.js.map +0 -1
- package/dist/core/storage/utils/middleware-module.d.ts.map +0 -1
- package/dist/core/storage/utils/path-selector.util.d.ts.map +0 -1
- package/dist/core/storage/utils/state-diff.util.d.ts.map +0 -1
- package/dist/core/storage/utils/storage-factory.util.d.ts.map +0 -1
- package/dist/core/storage/utils/storage-key.d.ts.map +0 -1
- package/dist/core/storage/utils/storage.utils.d.ts +0 -17
- package/dist/core/storage/utils/storage.utils.d.ts.map +0 -1
- package/dist/core/storage/utils/storage.utils.js +0 -57
- package/dist/core/storage/utils/storage.utils.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/react/hooks/index.d.ts.map +0 -1
- package/dist/react/hooks/useCreateStorage.d.ts.map +0 -1
- package/dist/react/hooks/useSelector.d.ts.map +0 -1
- package/dist/react/hooks/useStorage.d.ts.map +0 -1
- package/dist/react/hooks/useStorageSubscribe.d.ts.map +0 -1
- package/dist/react/index.d.ts.map +0 -1
- package/dist/react/utils/awaitSynapse.d.ts.map +0 -1
- package/dist/react/utils/createSynapseCtx.d.ts.map +0 -1
- package/dist/react/utils/index.d.ts.map +0 -1
- package/dist/reactive/dispatcher/dispatcher.module.d.ts.map +0 -1
- package/dist/reactive/dispatcher/index.d.ts.map +0 -1
- package/dist/reactive/dispatcher/middlewares/index.d.ts.map +0 -1
- package/dist/reactive/dispatcher/middlewares/logger.middleware.d.ts.map +0 -1
- package/dist/reactive/dispatcher/standalone.d.ts.map +0 -1
- package/dist/reactive/effects/effects.module.d.ts.map +0 -1
- package/dist/reactive/effects/index.d.ts.map +0 -1
- package/dist/reactive/effects/utils/chunkRequestConsistent.d.ts.map +0 -1
- package/dist/reactive/effects/utils/chunkRequestParallel.d.ts.map +0 -1
- package/dist/reactive/effects/utils/fromRequest.d.ts.map +0 -1
- package/dist/reactive/effects/utils/index.d.ts.map +0 -1
- package/dist/reactive/effects/utils/toObservable.d.ts.map +0 -1
- package/dist/reactive/index.d.ts.map +0 -1
- package/dist/utils/createEventBus.d.ts.map +0 -1
- package/dist/utils/createSynapse/createSynapse.d.ts.map +0 -1
- package/dist/utils/createSynapse/index.d.ts.map +0 -1
- package/dist/utils/createSynapse/types.d.ts.map +0 -1
- package/dist/utils/createSynapse/validate.d.ts +0 -2
- package/dist/utils/createSynapse/validate.d.ts.map +0 -1
- package/dist/utils/createSynapse/validate.js +0 -76
- package/dist/utils/createSynapse/validate.js.map +0 -1
- package/dist/utils/createSynapse/waitForDependencies.d.ts.map +0 -1
- package/dist/utils/createSynapseAwaiter.d.ts.map +0 -1
- package/dist/utils/index.d.ts.map +0 -1
|
@@ -9,4 +9,3 @@ import { Observable } from 'rxjs';
|
|
|
9
9
|
*/
|
|
10
10
|
export declare const chunkRequestConsistent: <T, R>(fn: (chunk: T[]) => Observable<R>, arr: T[], size: number, delayMs?: number) => Observable<R[]>;
|
|
11
11
|
export type ChunkRequestConsistent = typeof chunkRequestConsistent;
|
|
12
|
-
//# sourceMappingURL=chunkRequestConsistent.d.ts.map
|
|
@@ -9,4 +9,3 @@ import { Observable } from 'rxjs';
|
|
|
9
9
|
*/
|
|
10
10
|
export declare const chunkRequestParallel: <T, R>(fn: (chunk: T[]) => Observable<R>, arr: T[], size: number, delayMs?: number) => Observable<R[]>;
|
|
11
11
|
export type ChunkRequestParallel = typeof chunkRequestParallel;
|
|
12
|
-
//# sourceMappingURL=chunkRequestParallel.d.ts.map
|
|
@@ -20,4 +20,3 @@ export declare function toObservable<T extends Record<string, any>>(storage: ISt
|
|
|
20
20
|
* Проверяет, является ли значение хранилищем (IStorageBase)
|
|
21
21
|
*/
|
|
22
22
|
export declare function isStorage(value: any): value is IStorageBase<any>;
|
|
23
|
-
//# sourceMappingURL=toObservable.d.ts.map
|
package/dist/reactive/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MemoryStorage } from '../core';
|
|
2
|
+
import { Dispatcher } from '../reactive';
|
|
2
3
|
export interface EventBusEvent {
|
|
3
4
|
id: string;
|
|
4
5
|
event: string;
|
|
@@ -20,45 +21,15 @@ export interface EventBusConfig {
|
|
|
20
21
|
maxEvents?: number;
|
|
21
22
|
}
|
|
22
23
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* ```typescript
|
|
27
|
-
* // Создание EventBus
|
|
28
|
-
* const eventBus = await createEventBus({
|
|
29
|
-
* name: 'app-events',
|
|
30
|
-
* autoCleanup: true,
|
|
31
|
-
* maxEvents: 500
|
|
32
|
-
* })
|
|
33
|
-
*
|
|
34
|
-
* // Использование в Synapse
|
|
35
|
-
* const mySynapse = await createSynapse({
|
|
36
|
-
* dependencies: [eventBus],
|
|
37
|
-
* createEffectConfig: () => ({
|
|
38
|
-
* externalDispatchers: {
|
|
39
|
-
* eventBus: eventBus.dispatcher
|
|
40
|
-
* }
|
|
41
|
-
* }),
|
|
42
|
-
* effects: [
|
|
43
|
-
* createEffect((action$, _, { dispatcher, externalDispatchers: { eventBus } }) => {
|
|
44
|
-
* // Публикация события
|
|
45
|
-
* eventBus.dispatch.publish({
|
|
46
|
-
* event: 'USER_UPDATED',
|
|
47
|
-
* data: { userId: 123 }
|
|
48
|
-
* })
|
|
49
|
-
*
|
|
50
|
-
* // Подписка на события
|
|
51
|
-
* eventBus.dispatch.subscribe({
|
|
52
|
-
* eventPattern: 'CORE_*',
|
|
53
|
-
* handler: (data, event) => console.log('Received:', event.event, data)
|
|
54
|
-
* })
|
|
55
|
-
* })
|
|
56
|
-
* ]
|
|
57
|
-
* })
|
|
58
|
-
* ```
|
|
24
|
+
* Class-диспетчер EventBus. Экшены объявляются как поля (имя экшена = имя поля),
|
|
25
|
+
* сервисы (storage-каст, реестр активных подписок, config) захватываются в замыкания
|
|
26
|
+
* через конструктор.
|
|
59
27
|
*/
|
|
60
|
-
|
|
61
|
-
|
|
28
|
+
declare class EventBusDispatcher extends Dispatcher<EventBusState> {
|
|
29
|
+
#private;
|
|
30
|
+
constructor(storage: MemoryStorage<EventBusState>, config: EventBusConfig);
|
|
31
|
+
/** Публикация события в EventBus. */
|
|
32
|
+
readonly publish: import("..").DispatchFunction<{
|
|
62
33
|
event: string;
|
|
63
34
|
data: any;
|
|
64
35
|
metadata?: Record<string, any>;
|
|
@@ -67,7 +38,8 @@ export declare const createEventBus: (config?: EventBusConfig) => Promise<import
|
|
|
67
38
|
event: string;
|
|
68
39
|
data: any;
|
|
69
40
|
}>;
|
|
70
|
-
|
|
41
|
+
/** Подписка на события в EventBus. */
|
|
42
|
+
readonly subscribe: import("..").DispatchFunction<{
|
|
71
43
|
eventPattern: string;
|
|
72
44
|
handler: (data: any, event: EventBusEvent) => void | Promise<void>;
|
|
73
45
|
options?: Record<string, any>;
|
|
@@ -75,13 +47,42 @@ export declare const createEventBus: (config?: EventBusConfig) => Promise<import
|
|
|
75
47
|
subscriptionId: string;
|
|
76
48
|
unsubscribe: () => void;
|
|
77
49
|
}>;
|
|
78
|
-
|
|
50
|
+
/** Получение истории событий. */
|
|
51
|
+
readonly getEventHistory: import("..").DispatchFunction<{
|
|
79
52
|
eventType: string;
|
|
80
53
|
limit?: number;
|
|
81
54
|
}, EventBusEvent[]>;
|
|
82
|
-
|
|
55
|
+
/** Очистка событий. */
|
|
56
|
+
readonly clearEvents: import("..").DispatchFunction<{
|
|
83
57
|
olderThan?: number;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
58
|
+
}, void>;
|
|
59
|
+
/** Получение активных подписок. */
|
|
60
|
+
readonly getActiveSubscriptions: import("..").DispatchFunction<void, any[]>;
|
|
61
|
+
destroy(): void;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Создает EventBus для связи между модулями.
|
|
65
|
+
*
|
|
66
|
+
* Возвращает `SynapseModule`-handle (ленивый, PromiseLike): фабрика исполняется при
|
|
67
|
+
* первом `await`/`ready()`. `eventBus.dispatcher` — инстанс class-диспетчера, его поля
|
|
68
|
+
* (`publish`/`subscribe`/...) и есть dispatch-функции.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* const eventBus = createEventBus({ name: 'app-events', autoCleanup: true, maxEvents: 500 })
|
|
73
|
+
* const bus = await eventBus
|
|
74
|
+
*
|
|
75
|
+
* bus.dispatcher.publish({ event: 'USER_UPDATED', data: { userId: 123 } })
|
|
76
|
+
* bus.dispatcher.subscribe({ eventPattern: 'CORE_*', handler: (data, event) => {} })
|
|
77
|
+
*
|
|
78
|
+
* // Использование как зависимости / внешнего диспетчера другого synapse:
|
|
79
|
+
* const mySynapse = createSynapse(() => ({
|
|
80
|
+
* storage,
|
|
81
|
+
* dispatcher: new MyDispatcher(storage),
|
|
82
|
+
* effects: new MyEffects(),
|
|
83
|
+
* externalDispatchers: { eventBus: bus.dispatcher },
|
|
84
|
+
* }))
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare const createEventBus: (config?: EventBusConfig) => import("./createSynapse").SynapseModule<EventBusState, EventBusDispatcher, undefined>;
|
|
88
|
+
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { handleCallbackError } from "../_utils/error-handling.util.js";
|
|
2
2
|
import { MemoryStorage } from "../core/index.js";
|
|
3
|
-
import {
|
|
3
|
+
import { Dispatcher } from "../reactive/index.js";
|
|
4
4
|
import { createSynapse } from "./createSynapse/index.js";
|
|
5
5
|
|
|
6
6
|
|
|
@@ -29,185 +29,163 @@ function cleanupOldEvents(storage, maxEvents) {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
32
|
+
* Class-диспетчер EventBus. Экшены объявляются как поля (имя экшена = имя поля),
|
|
33
|
+
* сервисы (storage-каст, реестр активных подписок, config) захватываются в замыкания
|
|
34
|
+
* через конструктор.
|
|
35
|
+
*/ class EventBusDispatcher extends Dispatcher {
|
|
36
|
+
/** MemoryStorage синхронный — безопасно кастуем для синхронного API. */ #sync;
|
|
37
|
+
/** Активные подписки для очистки при destroy. */ #activeSubscriptions = new Map();
|
|
38
|
+
#config;
|
|
39
|
+
constructor(storage, config){
|
|
40
|
+
super(storage);
|
|
41
|
+
this.#sync = storage;
|
|
42
|
+
this.#config = config;
|
|
43
|
+
}
|
|
44
|
+
/** Публикация события в EventBus. */ publish = this.action((_storage, { event, data, metadata = {} })=>{
|
|
45
|
+
const storage = this.#sync;
|
|
46
|
+
const eventId = `${event}_${Date.now()}_${Math.random()}`;
|
|
47
|
+
storage.set(`events.${eventId}`, {
|
|
48
|
+
id: eventId,
|
|
49
|
+
event,
|
|
50
|
+
data,
|
|
51
|
+
metadata: {
|
|
52
|
+
ttl: metadata.ttl || null,
|
|
53
|
+
priority: metadata.priority || 'normal',
|
|
54
|
+
...metadata
|
|
55
|
+
},
|
|
56
|
+
timestamp: Date.now()
|
|
57
|
+
});
|
|
58
|
+
if (this.#config.autoCleanup) {
|
|
59
|
+
cleanupOldEvents(storage, this.#config.maxEvents || 1000);
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
eventId,
|
|
63
|
+
event,
|
|
64
|
+
data
|
|
65
|
+
};
|
|
66
|
+
}, {
|
|
67
|
+
type: 'PUBLISH_EVENT',
|
|
68
|
+
meta: {
|
|
69
|
+
description: 'Публикация события в EventBus'
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
/** Подписка на события в EventBus. */ subscribe = this.action((_storage, { eventPattern, handler, options = {} })=>{
|
|
73
|
+
const storage = this.#sync;
|
|
74
|
+
const subscriptionId = `sub_${Date.now()}_${Math.random()}`;
|
|
75
|
+
const unsubscribe = storage.subscribe((state)=>state.events, (events)=>{
|
|
76
|
+
Object.values(events || {}).forEach((event)=>{
|
|
77
|
+
if (matchEventPattern(event.event, eventPattern)) {
|
|
78
|
+
if (options.priority && event.metadata.priority !== options.priority) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
handler(event.data, event);
|
|
83
|
+
} catch (error) {
|
|
84
|
+
handleCallbackError(`EventBus: error in handler for "${event.event}"`, error);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
storage.set(`subscriptions.${subscriptionId}`, {
|
|
90
|
+
id: subscriptionId,
|
|
91
|
+
pattern: eventPattern,
|
|
92
|
+
options,
|
|
93
|
+
createdAt: Date.now()
|
|
94
|
+
});
|
|
95
|
+
this.#activeSubscriptions.set(subscriptionId, unsubscribe);
|
|
96
|
+
const wrappedUnsubscribe = ()=>{
|
|
97
|
+
this.#activeSubscriptions.delete(subscriptionId);
|
|
98
|
+
unsubscribe();
|
|
99
|
+
};
|
|
100
|
+
return {
|
|
101
|
+
subscriptionId,
|
|
102
|
+
unsubscribe: wrappedUnsubscribe
|
|
103
|
+
};
|
|
104
|
+
}, {
|
|
105
|
+
type: 'SUBSCRIBE_TO_EVENT',
|
|
106
|
+
meta: {
|
|
107
|
+
description: 'Подписка на события в EventBus'
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
/** Получение истории событий. */ getEventHistory = this.action((_storage, { eventType, limit = 100 })=>{
|
|
111
|
+
const state = this.#sync.getState();
|
|
112
|
+
return Object.values(state.events || {}).filter((e)=>e.event === eventType).sort((a, b)=>b.timestamp - a.timestamp).slice(0, limit);
|
|
113
|
+
}, {
|
|
114
|
+
type: 'GET_EVENT_HISTORY',
|
|
115
|
+
meta: {
|
|
116
|
+
description: 'Получение истории событий'
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
/** Очистка событий. */ clearEvents = this.action((_storage, { olderThan } = {})=>{
|
|
120
|
+
const storage = this.#sync;
|
|
121
|
+
if (olderThan) {
|
|
122
|
+
const cutoff = Date.now() - olderThan;
|
|
123
|
+
storage.update((state)=>{
|
|
124
|
+
Object.keys(state.events || {}).forEach((key)=>{
|
|
125
|
+
if (state.events[key].timestamp < cutoff) {
|
|
126
|
+
delete state.events[key];
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
} else {
|
|
131
|
+
storage.set('events', {});
|
|
132
|
+
}
|
|
133
|
+
}, {
|
|
134
|
+
type: 'CLEAR_EVENTS',
|
|
135
|
+
meta: {
|
|
136
|
+
description: 'Очистка событий'
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
/** Получение активных подписок. */ getActiveSubscriptions = this.action(()=>{
|
|
140
|
+
const state = this.#sync.getState();
|
|
141
|
+
return Object.values(state.subscriptions || {});
|
|
142
|
+
}, {
|
|
143
|
+
type: 'GET_SUBSCRIPTIONS',
|
|
144
|
+
meta: {
|
|
145
|
+
description: 'Получение активных подписок'
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
destroy() {
|
|
149
|
+
this.#activeSubscriptions.forEach((unsub)=>unsub());
|
|
150
|
+
this.#activeSubscriptions.clear();
|
|
151
|
+
super.destroy();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Создает EventBus для связи между модулями.
|
|
156
|
+
*
|
|
157
|
+
* Возвращает `SynapseModule`-handle (ленивый, PromiseLike): фабрика исполняется при
|
|
158
|
+
* первом `await`/`ready()`. `eventBus.dispatcher` — инстанс class-диспетчера, его поля
|
|
159
|
+
* (`publish`/`subscribe`/...) и есть dispatch-функции.
|
|
33
160
|
*
|
|
34
161
|
* @example
|
|
35
162
|
* ```typescript
|
|
36
|
-
*
|
|
37
|
-
* const
|
|
38
|
-
* name: 'app-events',
|
|
39
|
-
* autoCleanup: true,
|
|
40
|
-
* maxEvents: 500
|
|
41
|
-
* })
|
|
163
|
+
* const eventBus = createEventBus({ name: 'app-events', autoCleanup: true, maxEvents: 500 })
|
|
164
|
+
* const bus = await eventBus
|
|
42
165
|
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
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
|
-
* })
|
|
166
|
+
* bus.dispatcher.publish({ event: 'USER_UPDATED', data: { userId: 123 } })
|
|
167
|
+
* bus.dispatcher.subscribe({ eventPattern: 'CORE_*', handler: (data, event) => {} })
|
|
58
168
|
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* })
|
|
169
|
+
* // Использование как зависимости / внешнего диспетчера другого synapse:
|
|
170
|
+
* const mySynapse = createSynapse(() => ({
|
|
171
|
+
* storage,
|
|
172
|
+
* dispatcher: new MyDispatcher(storage),
|
|
173
|
+
* effects: new MyEffects(),
|
|
174
|
+
* externalDispatchers: { eventBus: bus.dispatcher },
|
|
175
|
+
* }))
|
|
67
176
|
* ```
|
|
68
|
-
*/ const createEventBus = (config = {})=>createSynapse({
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
}
|
|
177
|
+
*/ const createEventBus = (config = {})=>createSynapse(()=>{
|
|
178
|
+
const storage = new MemoryStorage({
|
|
179
|
+
name: config.name || 'eventBus',
|
|
180
|
+
initialState: {
|
|
181
|
+
events: {},
|
|
182
|
+
subscriptions: {}
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
return {
|
|
186
|
+
storage,
|
|
187
|
+
dispatcher: new EventBusDispatcher(storage, config)
|
|
188
|
+
};
|
|
211
189
|
});
|
|
212
190
|
|
|
213
191
|
export { createEventBus };
|
|
@@ -1 +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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"}
|
|
1
|
+
{"version":3,"file":"utils/createEventBus.js","sources":["../../src/utils/createEventBus.ts"],"sourcesContent":["import { handleCallbackError } from '../_utils/error-handling.util'\nimport { ISyncStorage, MemoryStorage } from '../core'\nimport { Dispatcher } 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 * Class-диспетчер EventBus. Экшены объявляются как поля (имя экшена = имя поля),\n * сервисы (storage-каст, реестр активных подписок, config) захватываются в замыкания\n * через конструктор.\n */\nclass EventBusDispatcher extends Dispatcher<EventBusState> {\n /** MemoryStorage синхронный — безопасно кастуем для синхронного API. */\n readonly #sync: ISyncStorage<EventBusState>\n /** Активные подписки для очистки при destroy. */\n readonly #activeSubscriptions = new Map<string, VoidFunction>()\n readonly #config: EventBusConfig\n\n constructor(storage: MemoryStorage<EventBusState>, config: EventBusConfig) {\n super(storage)\n this.#sync = storage as ISyncStorage<EventBusState>\n this.#config = config\n }\n\n /** Публикация события в EventBus. */\n readonly publish = this.action(\n (_storage, { event, data, metadata = {} }: { event: string; data: any; metadata?: Record<string, any> }) => {\n const storage = this.#sync\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 if (this.#config.autoCleanup) {\n cleanupOldEvents(storage, this.#config.maxEvents || 1000)\n }\n\n return { eventId, event, data }\n },\n { type: 'PUBLISH_EVENT', meta: { description: 'Публикация события в EventBus' } },\n )\n\n /** Подписка на события в EventBus. */\n readonly subscribe = this.action(\n (\n _storage,\n {\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 ) => {\n const storage = this.#sync\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 if (matchEventPattern(event.event, eventPattern)) {\n if (options.priority && event.metadata.priority !== options.priority) {\n return\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 storage.set(`subscriptions.${subscriptionId}`, {\n id: subscriptionId,\n pattern: eventPattern,\n options,\n createdAt: Date.now(),\n })\n\n this.#activeSubscriptions.set(subscriptionId, unsubscribe)\n\n const wrappedUnsubscribe = () => {\n this.#activeSubscriptions.delete(subscriptionId)\n unsubscribe()\n }\n\n return { subscriptionId, unsubscribe: wrappedUnsubscribe }\n },\n { type: 'SUBSCRIBE_TO_EVENT', meta: { description: 'Подписка на события в EventBus' } },\n )\n\n /** Получение истории событий. */\n readonly getEventHistory = this.action(\n (_storage, { eventType, limit = 100 }: { eventType: string; limit?: number }) => {\n const state = this.#sync.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 { type: 'GET_EVENT_HISTORY', meta: { description: 'Получение истории событий' } },\n )\n\n /** Очистка событий. */\n readonly clearEvents = this.action(\n (_storage, { olderThan }: { olderThan?: number } = {}) => {\n const storage = this.#sync\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 { type: 'CLEAR_EVENTS', meta: { description: 'Очистка событий' } },\n )\n\n /** Получение активных подписок. */\n readonly getActiveSubscriptions = this.action(\n () => {\n const state = this.#sync.getState()\n return Object.values(state.subscriptions || {})\n },\n { type: 'GET_SUBSCRIPTIONS', meta: { description: 'Получение активных подписок' } },\n )\n\n override destroy(): void {\n this.#activeSubscriptions.forEach((unsub) => unsub())\n this.#activeSubscriptions.clear()\n super.destroy()\n }\n}\n\n/**\n * Создает EventBus для связи между модулями.\n *\n * Возвращает `SynapseModule`-handle (ленивый, PromiseLike): фабрика исполняется при\n * первом `await`/`ready()`. `eventBus.dispatcher` — инстанс class-диспетчера, его поля\n * (`publish`/`subscribe`/...) и есть dispatch-функции.\n *\n * @example\n * ```typescript\n * const eventBus = createEventBus({ name: 'app-events', autoCleanup: true, maxEvents: 500 })\n * const bus = await eventBus\n *\n * bus.dispatcher.publish({ event: 'USER_UPDATED', data: { userId: 123 } })\n * bus.dispatcher.subscribe({ eventPattern: 'CORE_*', handler: (data, event) => {} })\n *\n * // Использование как зависимости / внешнего диспетчера другого synapse:\n * const mySynapse = createSynapse(() => ({\n * storage,\n * dispatcher: new MyDispatcher(storage),\n * effects: new MyEffects(),\n * externalDispatchers: { eventBus: bus.dispatcher },\n * }))\n * ```\n */\nexport const createEventBus = (config: EventBusConfig = {}) =>\n createSynapse(() => {\n const storage = new MemoryStorage<EventBusState>({\n name: config.name || 'eventBus',\n initialState: {\n events: {},\n subscriptions: {},\n },\n })\n\n return {\n storage,\n dispatcher: new EventBusDispatcher(storage, config),\n }\n })\n"],"names":["handleCallbackError","MemoryStorage","Dispatcher","createSynapse","matchEventPattern","eventName","pattern","regex","RegExp","cleanupOldEvents","storage","maxEvents","state","events","Object","sorted","a","b","toKeep","EventBusDispatcher","Map","config","_storage","event","data","metadata","eventId","Date","Math","eventPattern","handler","options","subscriptionId","unsubscribe","error","wrappedUnsubscribe","eventType","limit","e","olderThan","cutoff","key","unsub","createEventBus"],"mappings":"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"}
|
|
@@ -1,9 +1,27 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type {
|
|
1
|
+
import type { Selectors } from '../../core';
|
|
2
|
+
import type { Dispatcher, Effects } from '../../reactive';
|
|
3
|
+
import type { SynapseConfig, SynapseModule } from './synapse.types';
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
+
* Создаёт ленивый class-based synapse из фабрики-конфига.
|
|
6
|
+
*
|
|
7
|
+
* Фабрика возвращает {@link SynapseConfig} с уже сконструированными class-слоями
|
|
8
|
+
* (`Dispatcher`/`Selectors`/`Effects`). Возвращается {@link SynapseModule}-handle:
|
|
9
|
+
* фабрика исполняется один раз при первом `await`/`ready()`, повторные `await` делят
|
|
10
|
+
* один промис, `destroy()` сбрасывает мемоизацию (handle пересоздаваемый).
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const postsSynapse = createSynapse(() => {
|
|
15
|
+
* const storage = new MemoryStorage<PostsState>({ name: 'posts', initialState })
|
|
16
|
+
* return {
|
|
17
|
+
* storage,
|
|
18
|
+
* dispatcher: new PostsDispatcher(storage),
|
|
19
|
+
* selectors: new PostsSelectors(storage),
|
|
20
|
+
* effects: new PostsEffects(api),
|
|
21
|
+
* }
|
|
22
|
+
* })
|
|
23
|
+
*
|
|
24
|
+
* const { dispatcher, selectors } = await postsSynapse
|
|
25
|
+
* ```
|
|
5
26
|
*/
|
|
6
|
-
export declare function createSynapse<
|
|
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
|
|
27
|
+
export declare function createSynapse<TState extends Record<string, any>, TDispatcher extends Dispatcher<TState> | undefined = undefined, TSelectors extends Selectors<TState> | undefined = undefined, TEffects extends Effects<TState, NonNullable<TDispatcher>, any> | undefined = undefined>(factory: () => SynapseConfig<TState, TDispatcher, TSelectors, TEffects> | Promise<SynapseConfig<TState, TDispatcher, TSelectors, TEffects>>): SynapseModule<TState, TDispatcher, TSelectors>;
|