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.
Files changed (289) hide show
  1. package/README.md +142 -12
  2. package/dist/_utils/chunk.util.d.ts +0 -1
  3. package/dist/_utils/deepMerge.util.d.ts +0 -1
  4. package/dist/_utils/error-handling.util.d.ts +0 -1
  5. package/dist/_utils/flatMap.util.d.ts +0 -1
  6. package/dist/_utils/index.d.ts +0 -1
  7. package/dist/_utils/logger-console.util.d.ts +0 -1
  8. package/dist/api/api.module.d.ts +0 -1
  9. package/dist/api/components/endpoint.d.ts +11 -12
  10. package/dist/api/components/endpoint.js.map +1 -1
  11. package/dist/api/components/query-storage.d.ts +0 -1
  12. package/dist/api/components/query-storage.js +1 -1
  13. package/dist/api/components/query-storage.js.map +1 -1
  14. package/dist/api/index.d.ts +0 -1
  15. package/dist/api/types/api.interface.d.ts +0 -1
  16. package/dist/api/types/endpoint.interface.d.ts +0 -1
  17. package/dist/api/types/query.interface.d.ts +0 -1
  18. package/dist/api/utils/api-helpers.d.ts +0 -1
  19. package/dist/{core/storage → api}/utils/cache.util.d.ts +3 -6
  20. package/dist/{core/storage → api}/utils/cache.util.js +4 -7
  21. package/dist/api/utils/cache.util.js.map +1 -0
  22. package/dist/api/utils/create-header-context.d.ts +0 -1
  23. package/dist/api/utils/endpoint-headers.d.ts +0 -1
  24. package/dist/api/utils/fetch-base-query.d.ts +0 -1
  25. package/dist/api/utils/file-utils.d.ts +0 -1
  26. package/dist/api/utils/get-cacheable-headers.d.ts +0 -1
  27. package/dist/core/index.d.ts +0 -1
  28. package/dist/core/selector/index.d.ts +1 -1
  29. package/dist/core/selector/index.js +2 -0
  30. package/dist/core/selector/index.js.map +1 -1
  31. package/dist/core/selector/selector.interface.d.ts +15 -30
  32. package/dist/core/selector/selector.interface.js +2 -2
  33. package/dist/core/selector/selector.interface.js.map +1 -1
  34. package/dist/core/selector/selector.module.d.ts +16 -1
  35. package/dist/core/selector/selector.module.js +82 -20
  36. package/dist/core/selector/selector.module.js.map +1 -1
  37. package/dist/core/selector/selectors.base.d.ts +56 -0
  38. package/dist/core/selector/selectors.base.js +118 -0
  39. package/dist/core/selector/selectors.base.js.map +1 -0
  40. package/dist/core/storage/adapters/async-base-storage.service.d.ts +15 -4
  41. package/dist/core/storage/adapters/async-base-storage.service.js +106 -36
  42. package/dist/core/storage/adapters/async-base-storage.service.js.map +1 -1
  43. package/dist/core/storage/adapters/indexed-DB.service.d.ts +4 -5
  44. package/dist/core/storage/adapters/indexed-DB.service.js +66 -14
  45. package/dist/core/storage/adapters/indexed-DB.service.js.map +1 -1
  46. package/dist/core/storage/adapters/local-storage.service.d.ts +9 -4
  47. package/dist/core/storage/adapters/local-storage.service.js +25 -5
  48. package/dist/core/storage/adapters/local-storage.service.js.map +1 -1
  49. package/dist/core/storage/adapters/memory-storage.service.d.ts +2 -4
  50. package/dist/core/storage/adapters/memory-storage.service.js +5 -5
  51. package/dist/core/storage/adapters/memory-storage.service.js.map +1 -1
  52. package/dist/core/storage/adapters/path.utils.d.ts +0 -1
  53. package/dist/core/storage/adapters/storage-core.d.ts +6 -2
  54. package/dist/core/storage/adapters/storage-core.js +6 -3
  55. package/dist/core/storage/adapters/storage-core.js.map +1 -1
  56. package/dist/core/storage/adapters/sync-base-storage.service.d.ts +20 -4
  57. package/dist/core/storage/adapters/sync-base-storage.service.js +110 -35
  58. package/dist/core/storage/adapters/sync-base-storage.service.js.map +1 -1
  59. package/dist/core/storage/index.d.ts +2 -5
  60. package/dist/core/storage/index.js +1 -5
  61. package/dist/core/storage/index.js.map +1 -1
  62. package/dist/core/storage/middlewares/broadcast.middleware.d.ts +0 -1
  63. package/dist/core/storage/middlewares/index.d.ts +3 -1
  64. package/dist/core/storage/middlewares/index.js +6 -0
  65. package/dist/core/storage/middlewares/index.js.map +1 -1
  66. package/dist/core/storage/middlewares/storage-batching.middleware.d.ts +0 -1
  67. package/dist/core/storage/middlewares/storage-logger.middleware.d.ts +20 -0
  68. package/dist/core/storage/middlewares/storage-logger.middleware.js +53 -0
  69. package/dist/core/storage/middlewares/storage-logger.middleware.js.map +1 -0
  70. package/dist/core/storage/middlewares/storage-shallow-compare.middleware.d.ts +0 -1
  71. package/dist/core/storage/middlewares/storage-shallow-compare.middleware.js +4 -10
  72. package/dist/core/storage/middlewares/storage-shallow-compare.middleware.js.map +1 -1
  73. package/dist/core/storage/middlewares/sync-broadcast.middleware.d.ts +0 -1
  74. package/dist/core/storage/middlewares/sync-storage-batching.middleware.d.ts +0 -1
  75. package/dist/core/storage/middlewares/sync-storage-logger.middleware.d.ts +7 -0
  76. package/dist/core/storage/middlewares/sync-storage-logger.middleware.js +48 -0
  77. package/dist/core/storage/middlewares/sync-storage-logger.middleware.js.map +1 -0
  78. package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.d.ts +0 -1
  79. package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.js +4 -10
  80. package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.js.map +1 -1
  81. package/dist/core/storage/modules/singleton/mixin.util.d.ts +0 -1
  82. package/dist/core/storage/modules/singleton/models.d.ts +0 -1
  83. package/dist/core/storage/modules/singleton/singleton.util.d.ts +0 -1
  84. package/dist/core/storage/storage.interface.d.ts +59 -4
  85. package/dist/core/storage/storage.interface.js +0 -2
  86. package/dist/core/storage/storage.interface.js.map +1 -1
  87. package/dist/core/storage/utils/broadcast.util.d.ts +0 -1
  88. package/dist/core/storage/utils/middleware-module.d.ts +0 -3
  89. package/dist/core/storage/utils/middleware-module.js +0 -8
  90. package/dist/core/storage/utils/middleware-module.js.map +1 -1
  91. package/dist/core/storage/utils/migration.util.d.ts +38 -0
  92. package/dist/core/storage/utils/migration.util.js +48 -0
  93. package/dist/core/storage/utils/migration.util.js.map +1 -0
  94. package/dist/core/storage/utils/path-selector.util.d.ts +0 -1
  95. package/dist/core/storage/utils/state-diff.util.d.ts +8 -1
  96. package/dist/core/storage/utils/state-diff.util.js +17 -1
  97. package/dist/core/storage/utils/state-diff.util.js.map +1 -1
  98. package/dist/core/storage/utils/storage-factory.util.d.ts +7 -9
  99. package/dist/core/storage/utils/storage-factory.util.js +10 -10
  100. package/dist/core/storage/utils/storage-factory.util.js.map +1 -1
  101. package/dist/core/storage/utils/storage-key.d.ts +0 -1
  102. package/dist/index.d.ts +0 -1
  103. package/dist/react/hooks/index.d.ts +2 -1
  104. package/dist/react/hooks/index.js +4 -0
  105. package/dist/react/hooks/index.js.map +1 -1
  106. package/dist/react/hooks/useCreateStorage.d.ts +5 -6
  107. package/dist/react/hooks/useCreateStorage.js +2 -2
  108. package/dist/react/hooks/useCreateStorage.js.map +1 -1
  109. package/dist/react/hooks/useObservable.d.ts +17 -0
  110. package/dist/react/hooks/useObservable.js +38 -0
  111. package/dist/react/hooks/useObservable.js.map +1 -0
  112. package/dist/react/hooks/useSelector.d.ts +0 -1
  113. package/dist/react/hooks/useSelector.js +5 -2
  114. package/dist/react/hooks/useSelector.js.map +1 -1
  115. package/dist/react/hooks/useStorage.d.ts +0 -1
  116. package/dist/react/hooks/useStorageSubscribe.d.ts +0 -1
  117. package/dist/react/hooks/useSubscription.d.ts +13 -0
  118. package/dist/react/hooks/useSubscription.js +23 -0
  119. package/dist/react/hooks/useSubscription.js.map +1 -0
  120. package/dist/react/index.d.ts +0 -1
  121. package/dist/react/utils/awaitSynapse.d.ts +9 -10
  122. package/dist/react/utils/awaitSynapse.js +3 -2
  123. package/dist/react/utils/awaitSynapse.js.map +1 -1
  124. package/dist/react/utils/createSynapseCtx.d.ts +18 -23
  125. package/dist/react/utils/createSynapseCtx.js +64 -39
  126. package/dist/react/utils/createSynapseCtx.js.map +1 -1
  127. package/dist/react/utils/index.d.ts +0 -1
  128. package/dist/reactive/dispatcher/dispatcher.base.d.ts +122 -0
  129. package/dist/reactive/dispatcher/dispatcher.base.js +294 -0
  130. package/dist/reactive/dispatcher/dispatcher.base.js.map +1 -0
  131. package/dist/reactive/dispatcher/dispatcher.module.d.ts +12 -67
  132. package/dist/reactive/dispatcher/dispatcher.module.js +13 -72
  133. package/dist/reactive/dispatcher/dispatcher.module.js.map +1 -1
  134. package/dist/reactive/dispatcher/index.d.ts +1 -1
  135. package/dist/reactive/dispatcher/index.js +2 -0
  136. package/dist/reactive/dispatcher/index.js.map +1 -1
  137. package/dist/reactive/dispatcher/middlewares/index.d.ts +0 -1
  138. package/dist/reactive/dispatcher/middlewares/logger.middleware.d.ts +0 -1
  139. package/dist/reactive/dispatcher/path.util.d.ts +15 -0
  140. package/dist/reactive/dispatcher/path.util.js +34 -0
  141. package/dist/reactive/dispatcher/path.util.js.map +1 -0
  142. package/dist/reactive/dispatcher/standalone.d.ts +1 -150
  143. package/dist/reactive/dispatcher/standalone.js +6 -217
  144. package/dist/reactive/dispatcher/standalone.js.map +1 -1
  145. package/dist/reactive/effects/effects.base.d.ts +62 -0
  146. package/dist/reactive/effects/effects.base.js +90 -0
  147. package/dist/reactive/effects/effects.base.js.map +1 -0
  148. package/dist/reactive/effects/effects.module.d.ts +122 -11
  149. package/dist/reactive/effects/effects.module.js +129 -17
  150. package/dist/reactive/effects/effects.module.js.map +1 -1
  151. package/dist/reactive/effects/index.d.ts +1 -1
  152. package/dist/reactive/effects/index.js +2 -0
  153. package/dist/reactive/effects/index.js.map +1 -1
  154. package/dist/reactive/effects/utils/chunkRequestConsistent.d.ts +0 -1
  155. package/dist/reactive/effects/utils/chunkRequestParallel.d.ts +0 -1
  156. package/dist/reactive/effects/utils/fromRequest.d.ts +0 -1
  157. package/dist/reactive/effects/utils/index.d.ts +0 -1
  158. package/dist/reactive/effects/utils/toObservable.d.ts +0 -1
  159. package/dist/reactive/index.d.ts +0 -1
  160. package/dist/utils/createEventBus.d.ts +47 -46
  161. package/dist/utils/createEventBus.js +152 -174
  162. package/dist/utils/createEventBus.js.map +1 -1
  163. package/dist/utils/createSynapse/createSynapse.d.ts +25 -7
  164. package/dist/utils/createSynapse/createSynapse.js +28 -98
  165. package/dist/utils/createSynapse/createSynapse.js.map +1 -1
  166. package/dist/utils/createSynapse/factory.d.ts +6 -0
  167. package/dist/utils/createSynapse/factory.js +256 -0
  168. package/dist/utils/createSynapse/factory.js.map +1 -0
  169. package/dist/utils/createSynapse/index.d.ts +2 -2
  170. package/dist/utils/createSynapse/index.js.map +1 -1
  171. package/dist/utils/createSynapse/synapse.types.d.ts +87 -0
  172. package/dist/utils/createSynapse/synapse.types.js +11 -0
  173. package/dist/utils/createSynapse/synapse.types.js.map +1 -0
  174. package/dist/utils/createSynapse/types.d.ts +6 -85
  175. package/dist/utils/createSynapse/types.js +2 -1
  176. package/dist/utils/createSynapse/types.js.map +1 -1
  177. package/dist/utils/createSynapse/waitForDependencies.d.ts +0 -1
  178. package/dist/utils/createSynapse/waitForDependencies.js +1 -1
  179. package/dist/utils/createSynapse/waitForDependencies.js.map +1 -1
  180. package/dist/utils/createSynapseAwaiter.d.ts +13 -10
  181. package/dist/utils/createSynapseAwaiter.js +30 -3
  182. package/dist/utils/createSynapseAwaiter.js.map +1 -1
  183. package/dist/utils/dehydrateModule.d.ts +6 -0
  184. package/dist/utils/dehydrateModule.js +43 -0
  185. package/dist/utils/dehydrateModule.js.map +1 -0
  186. package/dist/utils/index.d.ts +3 -3
  187. package/dist/utils/index.js +3 -0
  188. package/dist/utils/index.js.map +1 -1
  189. package/package.json +12 -2
  190. package/dist/_utils/chunk.util.d.ts.map +0 -1
  191. package/dist/_utils/deepMerge.util.d.ts.map +0 -1
  192. package/dist/_utils/error-handling.util.d.ts.map +0 -1
  193. package/dist/_utils/flatMap.util.d.ts.map +0 -1
  194. package/dist/_utils/index.d.ts.map +0 -1
  195. package/dist/_utils/logger-console.util.d.ts.map +0 -1
  196. package/dist/api/api.module.d.ts.map +0 -1
  197. package/dist/api/components/endpoint.d.ts.map +0 -1
  198. package/dist/api/components/query-storage.d.ts.map +0 -1
  199. package/dist/api/example.d.ts +0 -83
  200. package/dist/api/example.d.ts.map +0 -1
  201. package/dist/api/example.js +0 -90
  202. package/dist/api/example.js.map +0 -1
  203. package/dist/api/index.d.ts.map +0 -1
  204. package/dist/api/types/api.interface.d.ts.map +0 -1
  205. package/dist/api/types/endpoint.interface.d.ts.map +0 -1
  206. package/dist/api/types/query.interface.d.ts.map +0 -1
  207. package/dist/api/utils/api-helpers.d.ts.map +0 -1
  208. package/dist/api/utils/create-header-context.d.ts.map +0 -1
  209. package/dist/api/utils/endpoint-headers.d.ts.map +0 -1
  210. package/dist/api/utils/fetch-base-query.d.ts.map +0 -1
  211. package/dist/api/utils/file-utils.d.ts.map +0 -1
  212. package/dist/api/utils/get-cacheable-headers.d.ts.map +0 -1
  213. package/dist/core/index.d.ts.map +0 -1
  214. package/dist/core/selector/index.d.ts.map +0 -1
  215. package/dist/core/selector/selector.interface.d.ts.map +0 -1
  216. package/dist/core/selector/selector.module.d.ts.map +0 -1
  217. package/dist/core/storage/adapters/async-base-storage.service.d.ts.map +0 -1
  218. package/dist/core/storage/adapters/indexed-DB.service.d.ts.map +0 -1
  219. package/dist/core/storage/adapters/local-storage.service.d.ts.map +0 -1
  220. package/dist/core/storage/adapters/memory-storage.service.d.ts.map +0 -1
  221. package/dist/core/storage/adapters/path.utils.d.ts.map +0 -1
  222. package/dist/core/storage/adapters/storage-core.d.ts.map +0 -1
  223. package/dist/core/storage/adapters/sync-base-storage.service.d.ts.map +0 -1
  224. package/dist/core/storage/index.d.ts.map +0 -1
  225. package/dist/core/storage/middlewares/broadcast.middleware.d.ts.map +0 -1
  226. package/dist/core/storage/middlewares/index.d.ts.map +0 -1
  227. package/dist/core/storage/middlewares/storage-batching.middleware.d.ts.map +0 -1
  228. package/dist/core/storage/middlewares/storage-shallow-compare.middleware.d.ts.map +0 -1
  229. package/dist/core/storage/middlewares/sync-broadcast.middleware.d.ts.map +0 -1
  230. package/dist/core/storage/middlewares/sync-storage-batching.middleware.d.ts.map +0 -1
  231. package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.d.ts.map +0 -1
  232. package/dist/core/storage/modules/plugin/plugin.interface.d.ts +0 -101
  233. package/dist/core/storage/modules/plugin/plugin.interface.d.ts.map +0 -1
  234. package/dist/core/storage/modules/plugin/plugin.interface.js +0 -8
  235. package/dist/core/storage/modules/plugin/plugin.interface.js.map +0 -1
  236. package/dist/core/storage/modules/plugin/plugin.service.d.ts +0 -49
  237. package/dist/core/storage/modules/plugin/plugin.service.d.ts.map +0 -1
  238. package/dist/core/storage/modules/plugin/plugin.service.js +0 -406
  239. package/dist/core/storage/modules/plugin/plugin.service.js.map +0 -1
  240. package/dist/core/storage/modules/singleton/mixin.util.d.ts.map +0 -1
  241. package/dist/core/storage/modules/singleton/models.d.ts.map +0 -1
  242. package/dist/core/storage/modules/singleton/singleton.util.d.ts.map +0 -1
  243. package/dist/core/storage/storage.interface.d.ts.map +0 -1
  244. package/dist/core/storage/utils/broadcast.util.d.ts.map +0 -1
  245. package/dist/core/storage/utils/cache.util.d.ts.map +0 -1
  246. package/dist/core/storage/utils/cache.util.js.map +0 -1
  247. package/dist/core/storage/utils/middleware-module.d.ts.map +0 -1
  248. package/dist/core/storage/utils/path-selector.util.d.ts.map +0 -1
  249. package/dist/core/storage/utils/state-diff.util.d.ts.map +0 -1
  250. package/dist/core/storage/utils/storage-factory.util.d.ts.map +0 -1
  251. package/dist/core/storage/utils/storage-key.d.ts.map +0 -1
  252. package/dist/core/storage/utils/storage.utils.d.ts +0 -17
  253. package/dist/core/storage/utils/storage.utils.d.ts.map +0 -1
  254. package/dist/core/storage/utils/storage.utils.js +0 -57
  255. package/dist/core/storage/utils/storage.utils.js.map +0 -1
  256. package/dist/index.d.ts.map +0 -1
  257. package/dist/react/hooks/index.d.ts.map +0 -1
  258. package/dist/react/hooks/useCreateStorage.d.ts.map +0 -1
  259. package/dist/react/hooks/useSelector.d.ts.map +0 -1
  260. package/dist/react/hooks/useStorage.d.ts.map +0 -1
  261. package/dist/react/hooks/useStorageSubscribe.d.ts.map +0 -1
  262. package/dist/react/index.d.ts.map +0 -1
  263. package/dist/react/utils/awaitSynapse.d.ts.map +0 -1
  264. package/dist/react/utils/createSynapseCtx.d.ts.map +0 -1
  265. package/dist/react/utils/index.d.ts.map +0 -1
  266. package/dist/reactive/dispatcher/dispatcher.module.d.ts.map +0 -1
  267. package/dist/reactive/dispatcher/index.d.ts.map +0 -1
  268. package/dist/reactive/dispatcher/middlewares/index.d.ts.map +0 -1
  269. package/dist/reactive/dispatcher/middlewares/logger.middleware.d.ts.map +0 -1
  270. package/dist/reactive/dispatcher/standalone.d.ts.map +0 -1
  271. package/dist/reactive/effects/effects.module.d.ts.map +0 -1
  272. package/dist/reactive/effects/index.d.ts.map +0 -1
  273. package/dist/reactive/effects/utils/chunkRequestConsistent.d.ts.map +0 -1
  274. package/dist/reactive/effects/utils/chunkRequestParallel.d.ts.map +0 -1
  275. package/dist/reactive/effects/utils/fromRequest.d.ts.map +0 -1
  276. package/dist/reactive/effects/utils/index.d.ts.map +0 -1
  277. package/dist/reactive/effects/utils/toObservable.d.ts.map +0 -1
  278. package/dist/reactive/index.d.ts.map +0 -1
  279. package/dist/utils/createEventBus.d.ts.map +0 -1
  280. package/dist/utils/createSynapse/createSynapse.d.ts.map +0 -1
  281. package/dist/utils/createSynapse/index.d.ts.map +0 -1
  282. package/dist/utils/createSynapse/types.d.ts.map +0 -1
  283. package/dist/utils/createSynapse/validate.d.ts +0 -2
  284. package/dist/utils/createSynapse/validate.d.ts.map +0 -1
  285. package/dist/utils/createSynapse/validate.js +0 -76
  286. package/dist/utils/createSynapse/validate.js.map +0 -1
  287. package/dist/utils/createSynapse/waitForDependencies.d.ts.map +0 -1
  288. package/dist/utils/createSynapseAwaiter.d.ts.map +0 -1
  289. 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
@@ -37,4 +37,3 @@ import type { QueryResult } from '../../../api/types/query.interface';
37
37
  * ```
38
38
  */
39
39
  export declare function fromRequest<T>(req: RequestResponseModify<T>): Observable<QueryResult<T, Error>>;
40
- //# sourceMappingURL=fromRequest.d.ts.map
@@ -2,4 +2,3 @@ export * from './chunkRequestConsistent';
2
2
  export * from './chunkRequestParallel';
3
3
  export * from './fromRequest';
4
4
  export * from './toObservable';
5
- //# sourceMappingURL=index.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
@@ -1,3 +1,2 @@
1
1
  export * from './dispatcher';
2
2
  export * from './effects';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,5 @@
1
- import { IStorage } from '../core';
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
- * Создает EventBus для связи между модулями
24
- *
25
- * @example
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
- export declare const createEventBus: (config?: EventBusConfig) => Promise<import("./createSynapse").SynapseStoreWithDispatcher<EventBusState, IStorage<EventBusState>, any, Record<string, import("..").DispatchFunction<any, any>> & import("..").DispatchActions<{
61
- publish: import("..").DispatchFunction<{
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
- subscribe: import("..").DispatchFunction<{
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
- getEventHistory: import("..").DispatchFunction<{
50
+ /** Получение истории событий. */
51
+ readonly getEventHistory: import("..").DispatchFunction<{
79
52
  eventType: string;
80
53
  limit?: number;
81
54
  }, EventBusEvent[]>;
82
- clearEvents: import("..").DispatchFunction<{
55
+ /** Очистка событий. */
56
+ readonly clearEvents: import("..").DispatchFunction<{
83
57
  olderThan?: number;
84
- } | undefined, void>;
85
- getActiveSubscriptions: import("..").DispatchFunction<any, any[]>;
86
- }>>>;
87
- //# sourceMappingURL=createEventBus.d.ts.map
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 { createDispatcher } from "../reactive/index.js";
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
- * Создает EventBus для связи между модулями
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
- * // Создание EventBus
37
- * const eventBus = await createEventBus({
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
- * // Использование в 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
- * })
166
+ * bus.dispatcher.publish({ event: 'USER_UPDATED', data: { userId: 123 } })
167
+ * bus.dispatcher.subscribe({ eventPattern: 'CORE_*', handler: (data, event) => {} })
58
168
  *
59
- * // Подписка на события
60
- * eventBus.dispatch.subscribe({
61
- * eventPattern: 'CORE_*',
62
- * handler: (data, event) => console.log('Received:', event.event, data)
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
- 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
- }
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 { IStorage } from '../../core';
2
- import type { CreateSynapseConfigBasic, CreateSynapseConfigWithDispatcher, CreateSynapseConfigWithEffects, ExtractDispatchType, SynapseStoreBasic, SynapseStoreWithDispatcher, SynapseStoreWithEffects } from './types';
1
+ import type { Selectors } from '../../core';
2
+ import type { Dispatcher, Effects } from '../../reactive';
3
+ import type { SynapseConfig, SynapseModule } from './synapse.types';
3
4
  /**
4
- * Перегрузки функции createSynapse
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<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
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>;