synapse-storage 3.0.19 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/README.md +28 -168
  2. package/dist/_utils/chunk.util.d.ts +8 -0
  3. package/dist/_utils/chunk.util.d.ts.map +1 -0
  4. package/dist/_utils/chunk.util.js +21 -0
  5. package/dist/_utils/chunk.util.js.map +1 -0
  6. package/dist/_utils/deepMerge.util.d.ts +2 -0
  7. package/dist/_utils/deepMerge.util.d.ts.map +1 -0
  8. package/dist/_utils/deepMerge.util.js +19 -0
  9. package/dist/_utils/deepMerge.util.js.map +1 -0
  10. package/dist/_utils/error-handling.util.d.ts +50 -0
  11. package/dist/_utils/error-handling.util.d.ts.map +1 -0
  12. package/dist/_utils/error-handling.util.js +67 -0
  13. package/dist/_utils/error-handling.util.js.map +1 -0
  14. package/dist/_utils/flatMap.util.d.ts +10 -0
  15. package/dist/_utils/flatMap.util.d.ts.map +1 -0
  16. package/dist/_utils/flatMap.util.js +23 -0
  17. package/dist/_utils/flatMap.util.js.map +1 -0
  18. package/dist/_utils/index.d.ts +6 -0
  19. package/dist/_utils/index.d.ts.map +1 -0
  20. package/dist/_utils/index.js +13 -0
  21. package/dist/_utils/index.js.map +1 -0
  22. package/dist/_utils/logger-console.util.d.ts +9 -0
  23. package/dist/_utils/logger-console.util.d.ts.map +1 -0
  24. package/dist/_utils/logger-console.util.js +14 -0
  25. package/dist/_utils/logger-console.util.js.map +1 -0
  26. package/dist/api/api.module.d.ts +46 -0
  27. package/dist/api/api.module.d.ts.map +1 -0
  28. package/dist/api/api.module.js +121 -0
  29. package/dist/api/api.module.js.map +1 -0
  30. package/dist/api/components/endpoint.d.ts +57 -0
  31. package/dist/api/components/endpoint.d.ts.map +1 -0
  32. package/dist/api/components/endpoint.js +385 -0
  33. package/dist/api/components/endpoint.js.map +1 -0
  34. package/dist/api/components/query-storage.d.ts +100 -0
  35. package/dist/api/components/query-storage.d.ts.map +1 -0
  36. package/dist/api/components/query-storage.js +293 -0
  37. package/dist/api/components/query-storage.js.map +1 -0
  38. package/dist/api/example.d.ts +83 -0
  39. package/dist/api/example.d.ts.map +1 -0
  40. package/dist/api/example.js +90 -0
  41. package/dist/api/example.js.map +1 -0
  42. package/dist/api/index.d.ts +4 -0
  43. package/dist/api/index.d.ts.map +1 -0
  44. package/dist/api/index.js +11 -0
  45. package/dist/api/index.js.map +1 -0
  46. package/dist/api/types/api.interface.d.ts +126 -0
  47. package/dist/api/types/api.interface.d.ts.map +1 -0
  48. package/dist/api/types/api.interface.js +15 -0
  49. package/dist/api/types/api.interface.js.map +1 -0
  50. package/dist/api/types/endpoint.interface.d.ts +118 -0
  51. package/dist/api/types/endpoint.interface.d.ts.map +1 -0
  52. package/dist/api/types/endpoint.interface.js +6 -0
  53. package/dist/api/types/endpoint.interface.js.map +1 -0
  54. package/dist/api/types/query.interface.d.ts +85 -0
  55. package/dist/api/types/query.interface.d.ts.map +1 -0
  56. package/dist/api/types/query.interface.js +6 -0
  57. package/dist/api/types/query.interface.js.map +1 -0
  58. package/dist/api/utils/api-helpers.d.ts +22 -0
  59. package/dist/api/utils/api-helpers.d.ts.map +1 -0
  60. package/dist/api/utils/api-helpers.js +44 -0
  61. package/dist/api/utils/api-helpers.js.map +1 -0
  62. package/dist/api/utils/create-header-context.d.ts +10 -0
  63. package/dist/api/utils/create-header-context.d.ts.map +1 -0
  64. package/dist/api/utils/create-header-context.js +40 -0
  65. package/dist/api/utils/create-header-context.js.map +1 -0
  66. package/dist/api/utils/endpoint-headers.d.ts +23 -0
  67. package/dist/api/utils/endpoint-headers.d.ts.map +1 -0
  68. package/dist/api/utils/endpoint-headers.js +61 -0
  69. package/dist/api/utils/endpoint-headers.js.map +1 -0
  70. package/dist/api/utils/fetch-base-query.d.ts +9 -0
  71. package/dist/api/utils/fetch-base-query.d.ts.map +1 -0
  72. package/dist/api/utils/fetch-base-query.js +242 -0
  73. package/dist/api/utils/fetch-base-query.js.map +1 -0
  74. package/dist/api/utils/file-utils.d.ts +43 -0
  75. package/dist/api/utils/file-utils.d.ts.map +1 -0
  76. package/dist/api/utils/file-utils.js +102 -0
  77. package/dist/api/utils/file-utils.js.map +1 -0
  78. package/dist/api/utils/get-cacheable-headers.d.ts +8 -0
  79. package/dist/api/utils/get-cacheable-headers.d.ts.map +1 -0
  80. package/dist/api/utils/get-cacheable-headers.js +23 -0
  81. package/dist/api/utils/get-cacheable-headers.js.map +1 -0
  82. package/dist/core/index.d.ts +3 -0
  83. package/dist/core/index.d.ts.map +1 -0
  84. package/dist/core/index.js +7 -0
  85. package/dist/core/index.js.map +1 -0
  86. package/dist/core/selector/index.d.ts +3 -0
  87. package/dist/core/selector/index.d.ts.map +1 -0
  88. package/dist/core/selector/index.js +5 -0
  89. package/dist/core/selector/index.js.map +1 -0
  90. package/dist/{selector.interface-CA5y-kD_.d.ts → core/selector/selector.interface.d.ts} +41 -8
  91. package/dist/core/selector/selector.interface.d.ts.map +1 -0
  92. package/dist/core/selector/selector.interface.js +7 -0
  93. package/dist/core/selector/selector.interface.js.map +1 -0
  94. package/dist/core/selector/selector.module.d.ts +36 -0
  95. package/dist/core/selector/selector.module.d.ts.map +1 -0
  96. package/dist/core/selector/selector.module.js +412 -0
  97. package/dist/core/selector/selector.module.js.map +1 -0
  98. package/dist/core/storage/adapters/async-base-storage.service.d.ts +49 -0
  99. package/dist/core/storage/adapters/async-base-storage.service.d.ts.map +1 -0
  100. package/dist/core/storage/adapters/async-base-storage.service.js +505 -0
  101. package/dist/core/storage/adapters/async-base-storage.service.js.map +1 -0
  102. package/dist/core/storage/adapters/indexed-DB.service.d.ts +89 -0
  103. package/dist/core/storage/adapters/indexed-DB.service.d.ts.map +1 -0
  104. package/dist/core/storage/adapters/indexed-DB.service.js +596 -0
  105. package/dist/core/storage/adapters/indexed-DB.service.js.map +1 -0
  106. package/dist/core/storage/adapters/local-storage.service.d.ts +23 -0
  107. package/dist/core/storage/adapters/local-storage.service.d.ts.map +1 -0
  108. package/dist/core/storage/adapters/local-storage.service.js +111 -0
  109. package/dist/core/storage/adapters/local-storage.service.js.map +1 -0
  110. package/dist/core/storage/adapters/memory-storage.service.d.ts +24 -0
  111. package/dist/core/storage/adapters/memory-storage.service.d.ts.map +1 -0
  112. package/dist/core/storage/adapters/memory-storage.service.js +110 -0
  113. package/dist/core/storage/adapters/memory-storage.service.js.map +1 -0
  114. package/dist/core/storage/adapters/path.utils.d.ts +5 -0
  115. package/dist/core/storage/adapters/path.utils.d.ts.map +1 -0
  116. package/dist/core/storage/adapters/path.utils.js +42 -0
  117. package/dist/core/storage/adapters/path.utils.js.map +1 -0
  118. package/dist/core/storage/adapters/storage-core.d.ts +61 -0
  119. package/dist/core/storage/adapters/storage-core.d.ts.map +1 -0
  120. package/dist/core/storage/adapters/storage-core.js +221 -0
  121. package/dist/core/storage/adapters/storage-core.js.map +1 -0
  122. package/dist/core/storage/adapters/sync-base-storage.service.d.ts +56 -0
  123. package/dist/core/storage/adapters/sync-base-storage.service.d.ts.map +1 -0
  124. package/dist/core/storage/adapters/sync-base-storage.service.js +481 -0
  125. package/dist/core/storage/adapters/sync-base-storage.service.js.map +1 -0
  126. package/dist/core/storage/index.d.ts +16 -0
  127. package/dist/core/storage/index.d.ts.map +1 -0
  128. package/dist/core/storage/index.js +38 -0
  129. package/dist/core/storage/index.js.map +1 -0
  130. package/dist/core/storage/middlewares/broadcast.middleware.d.ts +9 -0
  131. package/dist/core/storage/middlewares/broadcast.middleware.d.ts.map +1 -0
  132. package/dist/core/storage/middlewares/broadcast.middleware.js +197 -0
  133. package/dist/core/storage/middlewares/broadcast.middleware.js.map +1 -0
  134. package/dist/core/storage/middlewares/index.d.ts +9 -0
  135. package/dist/core/storage/middlewares/index.d.ts.map +1 -0
  136. package/dist/core/storage/middlewares/index.js +17 -0
  137. package/dist/core/storage/middlewares/index.js.map +1 -0
  138. package/dist/core/storage/middlewares/storage-batching.middleware.d.ts +7 -0
  139. package/dist/core/storage/middlewares/storage-batching.middleware.d.ts.map +1 -0
  140. package/dist/core/storage/middlewares/storage-batching.middleware.js +108 -0
  141. package/dist/core/storage/middlewares/storage-batching.middleware.js.map +1 -0
  142. package/dist/core/storage/middlewares/storage-shallow-compare.middleware.d.ts +7 -0
  143. package/dist/core/storage/middlewares/storage-shallow-compare.middleware.d.ts.map +1 -0
  144. package/dist/core/storage/middlewares/storage-shallow-compare.middleware.js +43 -0
  145. package/dist/core/storage/middlewares/storage-shallow-compare.middleware.js.map +1 -0
  146. package/dist/core/storage/middlewares/sync-broadcast.middleware.d.ts +9 -0
  147. package/dist/core/storage/middlewares/sync-broadcast.middleware.d.ts.map +1 -0
  148. package/dist/core/storage/middlewares/sync-broadcast.middleware.js +177 -0
  149. package/dist/core/storage/middlewares/sync-broadcast.middleware.js.map +1 -0
  150. package/dist/core/storage/middlewares/sync-storage-batching.middleware.d.ts +6 -0
  151. package/dist/core/storage/middlewares/sync-storage-batching.middleware.d.ts.map +1 -0
  152. package/dist/core/storage/middlewares/sync-storage-batching.middleware.js +56 -0
  153. package/dist/core/storage/middlewares/sync-storage-batching.middleware.js.map +1 -0
  154. package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.d.ts +7 -0
  155. package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.d.ts.map +1 -0
  156. package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.js +39 -0
  157. package/dist/core/storage/middlewares/sync-storage-shallow-compare.middleware.js.map +1 -0
  158. package/dist/core/storage/modules/plugin/plugin.interface.d.ts +101 -0
  159. package/dist/core/storage/modules/plugin/plugin.interface.d.ts.map +1 -0
  160. package/dist/core/storage/modules/plugin/plugin.interface.js +8 -0
  161. package/dist/core/storage/modules/plugin/plugin.interface.js.map +1 -0
  162. package/dist/core/storage/modules/plugin/plugin.service.d.ts +49 -0
  163. package/dist/core/storage/modules/plugin/plugin.service.d.ts.map +1 -0
  164. package/dist/core/storage/modules/plugin/plugin.service.js +406 -0
  165. package/dist/core/storage/modules/plugin/plugin.service.js.map +1 -0
  166. package/dist/core/storage/modules/singleton/mixin.util.d.ts +6 -0
  167. package/dist/core/storage/modules/singleton/mixin.util.d.ts.map +1 -0
  168. package/dist/core/storage/modules/singleton/mixin.util.js +30 -0
  169. package/dist/core/storage/modules/singleton/mixin.util.js.map +1 -0
  170. package/dist/core/storage/modules/singleton/models.d.ts +143 -0
  171. package/dist/core/storage/modules/singleton/models.d.ts.map +1 -0
  172. package/dist/core/storage/modules/singleton/models.js +60 -0
  173. package/dist/core/storage/modules/singleton/models.js.map +1 -0
  174. package/dist/core/storage/modules/singleton/singleton.util.d.ts +36 -0
  175. package/dist/core/storage/modules/singleton/singleton.util.d.ts.map +1 -0
  176. package/dist/core/storage/modules/singleton/singleton.util.js +216 -0
  177. package/dist/core/storage/modules/singleton/singleton.util.js.map +1 -0
  178. package/dist/core/storage/storage.interface.d.ts +168 -0
  179. package/dist/core/storage/storage.interface.d.ts.map +1 -0
  180. package/dist/core/storage/storage.interface.js +23 -0
  181. package/dist/core/storage/storage.interface.js.map +1 -0
  182. package/dist/core/storage/utils/broadcast.util.d.ts +49 -0
  183. package/dist/core/storage/utils/broadcast.util.d.ts.map +1 -0
  184. package/dist/core/storage/utils/broadcast.util.js +141 -0
  185. package/dist/core/storage/utils/broadcast.util.js.map +1 -0
  186. package/dist/core/storage/utils/cache.util.d.ts +33 -0
  187. package/dist/core/storage/utils/cache.util.d.ts.map +1 -0
  188. package/dist/core/storage/utils/cache.util.js +54 -0
  189. package/dist/core/storage/utils/cache.util.js.map +1 -0
  190. package/dist/core/storage/utils/middleware-module.d.ts +94 -0
  191. package/dist/core/storage/utils/middleware-module.d.ts.map +1 -0
  192. package/dist/core/storage/utils/middleware-module.js +258 -0
  193. package/dist/core/storage/utils/middleware-module.js.map +1 -0
  194. package/dist/core/storage/utils/path-selector.util.d.ts +15 -0
  195. package/dist/core/storage/utils/path-selector.util.d.ts.map +1 -0
  196. package/dist/core/storage/utils/path-selector.util.js +58 -0
  197. package/dist/core/storage/utils/path-selector.util.js.map +1 -0
  198. package/dist/core/storage/utils/state-diff.util.d.ts +14 -0
  199. package/dist/core/storage/utils/state-diff.util.d.ts.map +1 -0
  200. package/dist/core/storage/utils/state-diff.util.js +88 -0
  201. package/dist/core/storage/utils/state-diff.util.js.map +1 -0
  202. package/dist/core/storage/utils/storage-factory.util.d.ts +21 -0
  203. package/dist/core/storage/utils/storage-factory.util.d.ts.map +1 -0
  204. package/dist/core/storage/utils/storage-factory.util.js +40 -0
  205. package/dist/core/storage/utils/storage-factory.util.js.map +1 -0
  206. package/dist/core/storage/utils/storage-key.d.ts +11 -0
  207. package/dist/core/storage/utils/storage-key.d.ts.map +1 -0
  208. package/dist/core/storage/utils/storage-key.js +24 -0
  209. package/dist/core/storage/utils/storage-key.js.map +1 -0
  210. package/dist/core/storage/utils/storage.utils.d.ts +17 -0
  211. package/dist/core/storage/utils/storage.utils.d.ts.map +1 -0
  212. package/dist/core/storage/utils/storage.utils.js +57 -0
  213. package/dist/core/storage/utils/storage.utils.js.map +1 -0
  214. package/dist/index.d.ts +10 -12
  215. package/dist/index.d.ts.map +1 -0
  216. package/dist/index.js +17 -1
  217. package/dist/index.js.map +1 -0
  218. package/dist/react/hooks/index.d.ts +5 -0
  219. package/dist/react/hooks/index.d.ts.map +1 -0
  220. package/dist/react/hooks/index.js +11 -0
  221. package/dist/react/hooks/index.js.map +1 -0
  222. package/dist/react/hooks/useCreateStorage.d.ts +39 -0
  223. package/dist/react/hooks/useCreateStorage.d.ts.map +1 -0
  224. package/dist/react/hooks/useCreateStorage.js +137 -0
  225. package/dist/react/hooks/useCreateStorage.js.map +1 -0
  226. package/dist/react/hooks/useSelector.d.ts +21 -0
  227. package/dist/react/hooks/useSelector.d.ts.map +1 -0
  228. package/dist/react/hooks/useSelector.js +56 -0
  229. package/dist/react/hooks/useSelector.js.map +1 -0
  230. package/dist/react/hooks/useStorage.d.ts +39 -0
  231. package/dist/react/hooks/useStorage.d.ts.map +1 -0
  232. package/dist/react/hooks/useStorage.js +78 -0
  233. package/dist/react/hooks/useStorage.js.map +1 -0
  234. package/dist/react/hooks/useStorageSubscribe.d.ts +16 -0
  235. package/dist/react/hooks/useStorageSubscribe.d.ts.map +1 -0
  236. package/dist/react/hooks/useStorageSubscribe.js +55 -0
  237. package/dist/react/hooks/useStorageSubscribe.js.map +1 -0
  238. package/dist/react/index.d.ts +3 -0
  239. package/dist/react/index.d.ts.map +1 -0
  240. package/dist/react/index.js +7 -0
  241. package/dist/react/index.js.map +1 -0
  242. package/dist/react/utils/awaitSynapse.d.ts +34 -0
  243. package/dist/react/utils/awaitSynapse.d.ts.map +1 -0
  244. package/dist/react/utils/awaitSynapse.js +87 -0
  245. package/dist/react/utils/awaitSynapse.js.map +1 -0
  246. package/dist/react/utils/createSynapseCtx.d.ts +33 -0
  247. package/dist/react/utils/createSynapseCtx.d.ts.map +1 -0
  248. package/dist/react/utils/createSynapseCtx.js +139 -0
  249. package/dist/react/utils/createSynapseCtx.js.map +1 -0
  250. package/dist/react/utils/index.d.ts +3 -0
  251. package/dist/react/utils/index.d.ts.map +1 -0
  252. package/dist/react/utils/index.js +9 -0
  253. package/dist/react/utils/index.js.map +1 -0
  254. package/dist/reactive/dispatcher/dispatcher.module.d.ts +216 -0
  255. package/dist/reactive/dispatcher/dispatcher.module.d.ts.map +1 -0
  256. package/dist/reactive/dispatcher/dispatcher.module.js +384 -0
  257. package/dist/reactive/dispatcher/dispatcher.module.js.map +1 -0
  258. package/dist/reactive/dispatcher/index.d.ts +4 -0
  259. package/dist/reactive/dispatcher/index.d.ts.map +1 -0
  260. package/dist/reactive/dispatcher/index.js +9 -0
  261. package/dist/reactive/dispatcher/index.js.map +1 -0
  262. package/dist/reactive/dispatcher/middlewares/index.d.ts +2 -0
  263. package/dist/reactive/dispatcher/middlewares/index.d.ts.map +1 -0
  264. package/dist/reactive/dispatcher/middlewares/index.js +5 -0
  265. package/dist/reactive/dispatcher/middlewares/index.js.map +1 -0
  266. package/dist/reactive/dispatcher/middlewares/logger.middleware.d.ts +37 -0
  267. package/dist/reactive/dispatcher/middlewares/logger.middleware.d.ts.map +1 -0
  268. package/dist/reactive/dispatcher/middlewares/logger.middleware.js +188 -0
  269. package/dist/reactive/dispatcher/middlewares/logger.middleware.js.map +1 -0
  270. package/dist/reactive/dispatcher/standalone.d.ts +112 -0
  271. package/dist/reactive/dispatcher/standalone.d.ts.map +1 -0
  272. package/dist/reactive/dispatcher/standalone.js +142 -0
  273. package/dist/reactive/dispatcher/standalone.js.map +1 -0
  274. package/dist/reactive/effects/effects.module.d.ts +225 -0
  275. package/dist/reactive/effects/effects.module.d.ts.map +1 -0
  276. package/dist/reactive/effects/effects.module.js +356 -0
  277. package/dist/reactive/effects/effects.module.js.map +1 -0
  278. package/dist/reactive/effects/index.d.ts +4 -0
  279. package/dist/reactive/effects/index.d.ts.map +1 -0
  280. package/dist/reactive/effects/index.js +11 -0
  281. package/dist/reactive/effects/index.js.map +1 -0
  282. package/dist/reactive/effects/utils/chunkRequestConsistent.d.ts +12 -0
  283. package/dist/reactive/effects/utils/chunkRequestConsistent.d.ts.map +1 -0
  284. package/dist/reactive/effects/utils/chunkRequestConsistent.js +25 -0
  285. package/dist/reactive/effects/utils/chunkRequestConsistent.js.map +1 -0
  286. package/dist/reactive/effects/utils/chunkRequestParallel.d.ts +12 -0
  287. package/dist/reactive/effects/utils/chunkRequestParallel.d.ts.map +1 -0
  288. package/dist/reactive/effects/utils/chunkRequestParallel.js +22 -0
  289. package/dist/reactive/effects/utils/chunkRequestParallel.js.map +1 -0
  290. package/dist/reactive/effects/utils/fromRequest.d.ts +40 -0
  291. package/dist/reactive/effects/utils/fromRequest.d.ts.map +1 -0
  292. package/dist/reactive/effects/utils/fromRequest.js +64 -0
  293. package/dist/reactive/effects/utils/fromRequest.js.map +1 -0
  294. package/dist/reactive/effects/utils/index.d.ts +5 -0
  295. package/dist/reactive/effects/utils/index.d.ts.map +1 -0
  296. package/dist/reactive/effects/utils/index.js +11 -0
  297. package/dist/reactive/effects/utils/index.js.map +1 -0
  298. package/dist/reactive/effects/utils/toObservable.d.ts +23 -0
  299. package/dist/reactive/effects/utils/toObservable.d.ts.map +1 -0
  300. package/dist/reactive/effects/utils/toObservable.js +39 -0
  301. package/dist/reactive/effects/utils/toObservable.js.map +1 -0
  302. package/dist/reactive/index.d.ts +3 -0
  303. package/dist/reactive/index.d.ts.map +1 -0
  304. package/dist/reactive/index.js +7 -0
  305. package/dist/reactive/index.js.map +1 -0
  306. package/dist/utils/createEventBus.d.ts +87 -0
  307. package/dist/utils/createEventBus.d.ts.map +1 -0
  308. package/dist/utils/createEventBus.js +215 -0
  309. package/dist/utils/createEventBus.js.map +1 -0
  310. package/dist/utils/createSynapse/createSynapse.d.ts +9 -0
  311. package/dist/utils/createSynapse/createSynapse.d.ts.map +1 -0
  312. package/dist/utils/createSynapse/createSynapse.js +103 -0
  313. package/dist/utils/createSynapse/createSynapse.js.map +1 -0
  314. package/dist/utils/createSynapse/index.d.ts +3 -0
  315. package/dist/utils/createSynapse/index.d.ts.map +1 -0
  316. package/dist/utils/createSynapse/index.js +6 -0
  317. package/dist/utils/createSynapse/index.js.map +1 -0
  318. package/dist/utils/createSynapse/types.d.ts +93 -0
  319. package/dist/utils/createSynapse/types.d.ts.map +1 -0
  320. package/dist/utils/createSynapse/types.js +6 -0
  321. package/dist/utils/createSynapse/types.js.map +1 -0
  322. package/dist/utils/createSynapse/validate.d.ts +2 -0
  323. package/dist/utils/createSynapse/validate.d.ts.map +1 -0
  324. package/dist/utils/createSynapse/validate.js +76 -0
  325. package/dist/utils/createSynapse/validate.js.map +1 -0
  326. package/dist/utils/createSynapse/waitForDependencies.d.ts +3 -0
  327. package/dist/utils/createSynapse/waitForDependencies.d.ts.map +1 -0
  328. package/dist/utils/createSynapse/waitForDependencies.js +40 -0
  329. package/dist/utils/createSynapse/waitForDependencies.js.map +1 -0
  330. package/dist/utils/createSynapseAwaiter.d.ts +46 -0
  331. package/dist/utils/createSynapseAwaiter.d.ts.map +1 -0
  332. package/dist/utils/createSynapseAwaiter.js +102 -0
  333. package/dist/utils/createSynapseAwaiter.js.map +1 -0
  334. package/dist/utils/index.d.ts +4 -0
  335. package/dist/utils/index.d.ts.map +1 -0
  336. package/dist/utils/index.js +12 -0
  337. package/dist/utils/index.js.map +1 -0
  338. package/package.json +17 -21
  339. package/dist/api.d.ts +0 -365
  340. package/dist/api.js +0 -1
  341. package/dist/core.d.ts +0 -106
  342. package/dist/core.js +0 -1
  343. package/dist/createSynapse-vkfKjRob.d.ts +0 -97
  344. package/dist/dispatcher.module-BOsMHbD5.d.ts +0 -360
  345. package/dist/react.d.ts +0 -119
  346. package/dist/react.js +0 -1
  347. package/dist/reactive.d.ts +0 -35
  348. package/dist/reactive.js +0 -1
  349. package/dist/storage.interface-BA_ktyDz.d.ts +0 -591
  350. package/dist/utils.d.ts +0 -139
  351. package/dist/utils.js +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive/effects/effects.module.js","sources":["../../../src/reactive/effects/effects.module.ts"],"sourcesContent":["import { combineLatest, EMPTY, from, merge, Observable, of, OperatorFunction, pipe, Subject } from 'rxjs'\nimport { catchError, filter, map, share, switchMap, take } from 'rxjs/operators'\n\nimport { handleCallbackError, logError } from '../../_utils/error-handling.util'\nimport { IStorage, IStorageBase } from '../../core'\nimport { Action, ActionsResult, Dispatcher, DispatchFunction, ExtractResultType, WatcherFunction } from '../dispatcher'\nimport { ChunkRequestConsistent, chunkRequestConsistent, ChunkRequestParallel, chunkRequestParallel, isStorage, toObservable } from './utils'\n\n/**\n * Тип действия с типизированным payload\n */\nexport interface TypedAction<P> extends Action<P> {\n type: string\n payload: P\n}\n\n/**\n * Тип для внешних состояний — Observable или хранилище (IStorageBase), которое автоматически конвертируется в Observable\n */\nexport type ExternalStates = Record<string, Observable<any> | IStorageBase<any>>\n\n/**\n * Контекст эффекта — объект с зависимостями, передаваемый третьим аргументом\n */\nexport interface EffectContext<\n TDispatcher = any,\n TServices extends Record<string, any> = Record<string, never>,\n TConfig extends Record<string, any> = Record<string, never>,\n TExternalDispatchers extends Record<string, Dispatcher<any, any>> = Record<string, never>,\n TExternalStates extends ExternalStates = Record<string, never>,\n> {\n /** Основной dispatcher текущего synapse */\n dispatcher: TDispatcher\n /** Внешние dispatcher'ы из других synapse */\n externalDispatchers: TExternalDispatchers\n /** Внешние состояния — Observable'ы от других хранилищ (Synapse.state$, или любой Observable) */\n externalStates: TExternalStates\n /** Сервисы (API-клиенты и т.д.) */\n services: TServices\n /** Глобальная конфигурация для эффектов */\n config: TConfig\n}\n\n/**\n * Тип для эффекта с доступом к состоянию и контексту — основной тип\n */\nexport type Effect<\n TState extends Record<string, any> = any,\n TDispatcher = any,\n TServices extends Record<string, any> = Record<string, never>,\n TConfig extends Record<string, any> = Record<string, never>,\n TExternalDispatchers extends Record<string, Dispatcher<any, any>> = Record<string, never>,\n TExternalStates extends ExternalStates = Record<string, never>,\n> = (action$: Observable<Action>, state$: Observable<TState>, context: EffectContext<TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates>) => Observable<unknown>\n\n/**\n * Тип для получения типов действий диспетчера\n */\nexport type DispatcherActions<T> = T extends Dispatcher<any, infer A> ? ActionsResult<A> : Record<string, DispatchFunction<any, any>>\n\n/**\n * Конфигурация для валидации в validateMap\n */\nexport interface ValidateConfig {\n conditions: boolean[]\n skipAction: (() => any) | any | ((() => any) | any)[]\n}\n\n/**\n * Утилиты для запросов в validateMap\n */\nexport interface ValidateMapRequestUtils {\n chunkRequest: ChunkRequestParallel\n chunkRequestConsistent: ChunkRequestConsistent\n}\n\n/**\n * Оператор для фильтрации действий по типу с сохранением типа payload\n */\nexport function ofType<T extends DispatchFunction<any, any> | WatcherFunction<any>>(\n actionFn: T,\n): OperatorFunction<Action, TypedAction<T extends WatcherFunction<infer R> ? R : ExtractResultType<T>>> {\n const { actionType } = actionFn\n\n if (!actionType) {\n logError('ofType: action function does not have actionType property', actionFn, null, 'warn')\n return filter(() => false) as any\n }\n\n // Определяем тип payload в зависимости от типа функции\n type PayloadType = T extends WatcherFunction<infer R> ? R : ExtractResultType<T>\n\n // Улучшенная реализация с явными типами\n return (source$: Observable<Action>): Observable<TypedAction<PayloadType>> => {\n return source$.pipe(filter((action): action is TypedAction<PayloadType> => action !== undefined && action.type === actionType))\n }\n}\n\n/**\n * Оператор для фильтрации действий по нескольким типам с объединением типов payload\n * @param actionFns Массив функций действий\n */\nexport function ofTypes<T extends DispatchFunction<any, any>[]>(actionFns: [...T]): OperatorFunction<Action, TypedAction<ExtractResultType<T[number]>>> {\n // Получаем типы действий\n const actionTypes = actionFns.map((fn) => fn.actionType).filter(Boolean)\n\n if (actionTypes.length === 0) {\n logError('ofTypes: no valid action types found in array', actionFns, null, 'warn')\n return filter(() => false) as OperatorFunction<Action, TypedAction<ExtractResultType<T[number]>>>\n }\n\n // Union тип для payload из всех действий\n type CombinedPayloadType = ExtractResultType<T[number]>\n\n // Улучшенная реализация с явными типами\n return (source$: Observable<Action>): Observable<TypedAction<CombinedPayloadType>> => {\n return source$.pipe(filter((action): action is TypedAction<CombinedPayloadType> => action !== undefined && actionTypes.includes(action.type)))\n }\n}\n\n/**\n * Оператор для ожидания выполнения всех указанных действий.\n *\n * **Важно:** Использует `combineLatest` — Observable не эмитит, пока КАЖДЫЙ из\n * указанных action не будет диспатчнут хотя бы один раз. Если хотя бы один action\n * никогда не будет вызван, поток зависнет навсегда без уведомления.\n * Убедитесь, что все указанные actions гарантированно будут диспатчнуты,\n * либо используйте `ofTypes` с ручной агрегацией при необходимости таймаута.\n *\n * @param actionFns Массив функций действий\n */\nexport function ofTypesWaitAll<T extends DispatchFunction<any, any>[]>(actionFns: [...T]) {\n return (source$: Observable<Action>): Observable<{ [K in keyof T]: TypedAction<ExtractResultType<T[K]>> }> => {\n // Создаем потоки для каждого типа действия\n const actionTypes = actionFns.map((fn) => fn.actionType).filter(Boolean)\n\n if (actionTypes.length === 0) {\n logError('ofTypesWaitAll: no valid action types found in array', actionFns, null, 'warn')\n return of([]) as any\n }\n\n // Для каждого типа действия создаем поток,\n // который берет первое срабатывание\n const actionStreams = actionTypes.map((type, index) =>\n source$.pipe(\n filter((action) => action.type === type),\n take(1),\n map((action) =>\n // Сохраняем ассоциацию с индексом, чтобы соответствовать\n // порядку в исходном массиве actionFns\n ({ index, action }),\n ),\n ),\n )\n\n // Ждем, пока все потоки выдадут значения, и сортируем результаты\n // по индексу для сохранения порядка\n return combineLatest(actionStreams).pipe(\n map((results) => {\n // Сортируем по индексу\n results.sort((a, b) => a.index - b.index)\n // Убираем индекс и возвращаем только действия\n return results.map((r) => r.action) as any\n }),\n )\n }\n}\n\n/**\n * Создает Observable с выбранными данными из состояния\n * @param state$ Поток состояния\n * @param selectors Селекторы для выбора частей состояния\n * @returns Observable с массивом выбранных значений\n */\nexport function selectorMap<TState, TResults extends any[]>(\n state$: Observable<TState>,\n ...selectors: { [K in keyof TResults]: (state: TState) => TResults[K] }\n): Observable<TResults> {\n return state$.pipe(\n map((state) => {\n return selectors.map((selector) => selector(state)) as TResults\n }),\n )\n}\n\n/**\n * Создает именованный объект вместо массива\n * @param state$ Поток состояния\n * @param selectors Объект с селекторами\n * @returns Observable с объектом выбранных значений\n */\nexport function selectorObject<TState, TResult extends Record<string, any>>(\n state$: Observable<TState>,\n selectors: { [K in keyof TResult]: (state: TState) => TResult[K] },\n): Observable<TResult> {\n return state$.pipe(\n map((state) => {\n const result = {} as TResult\n for (const [key, selector] of Object.entries(selectors)) {\n result[key as keyof TResult] = selector(state)\n }\n return result\n }),\n )\n}\n\n/**\n * Оператор validateMap для валидации данных и условного вызова API\n */\nexport function validateMap<T, TResult = any>({\n validator,\n loadingAction,\n errorAction,\n apiCall,\n}: {\n validator?: (value: T) => ValidateConfig\n /** Вызывается после успешной валидации, перед apiCall. Типичное использование — dispatch loading-статуса. */\n loadingAction?: (value: T) => void\n /** Вызывается при ошибке в apiCall (catchError). Получает ошибку + те же данные что loadingAction/apiCall. */\n errorAction?: (error: any, value: T) => void\n apiCall: (value: T, utils: ValidateMapRequestUtils) => Observable<TResult>\n}): OperatorFunction<T, any> {\n return pipe(\n switchMap((pipeData) => {\n /**\n * Функция вызова API-метода\n */\n const callApi = () => {\n if (loadingAction) loadingAction(pipeData)\n\n const apiCall$ = apiCall(pipeData, {\n chunkRequest: chunkRequestParallel,\n chunkRequestConsistent: chunkRequestConsistent,\n })\n\n if (!errorAction) return apiCall$\n\n return apiCall$.pipe(\n catchError((err) => {\n errorAction(err, pipeData)\n return EMPTY\n }),\n )\n }\n\n /**\n * Если валидацию не используем - сразу вызываем запрос\n */\n if (!validator) return callApi()\n\n const validateConfig = validator(pipeData)\n const { conditions, skipAction } = validateConfig\n const conditionMet = conditions.every(Boolean)\n\n /**\n * Если валидация не пройдена - вызываем экшн сброса\n */\n if (!conditionMet) {\n if (Array.isArray(skipAction)) {\n // eslint-disable-next-line no-unsafe-optional-chaining\n return of(...skipAction?.filter(Boolean).map((action) => (typeof action === 'function' ? action() : action)))\n }\n return of(typeof skipAction === 'function' ? skipAction() : skipAction)\n }\n\n return callApi()\n }),\n )\n}\n\n/**\n * Метаданные ответа API, доступные в колбэках apiResult.\n */\nexport interface ApiResultMeta {\n status: number\n statusText: string\n headers: Headers\n fromCache?: boolean\n}\n\n/**\n * Ошибка API-запроса. Бросается apiResult при !result.ok.\n * Ловится errorAction в validateMap.\n */\nexport class ApiError extends Error {\n constructor(\n public readonly originalError: any,\n public readonly meta: ApiResultMeta,\n ) {\n super(typeof originalError === 'string' ? originalError : (originalError?.message ?? 'API request failed'))\n this.name = 'ApiError'\n }\n}\n\n/**\n * Оператор для обработки успешного результата API-запроса (QueryResult).\n *\n * При `result.ok` — вызывает callback с `data` и `meta`.\n * При `!result.ok` — бросает `ApiError`, который ловится `errorAction` в `validateMap`.\n *\n * @example\n * ```ts\n * // Простой случай\n * validateMap({\n * errorAction: (err) => dispatcher.dispatch.loadError(String(err)),\n * apiCall: () => from(api.request('getList', params)).pipe(\n * apiResult((data) => dispatcher.dispatch.loadSuccess(data)),\n * ),\n * })\n *\n * // С доступом к headers (пагинация)\n * apiResult((data, meta) => {\n * const total = Number(meta.headers.get('X-Total-Count'))\n * dispatcher.dispatch.loadSuccess({ items: data, total })\n * })\n * ```\n */\nexport function apiResult<TData, TResult = void>(\n onSuccess: (data: TData, meta: ApiResultMeta) => TResult | Promise<TResult>,\n): OperatorFunction<{ ok: boolean; data?: TData; error?: any; status?: number; statusText?: string; headers?: Headers; fromCache?: boolean }, TResult> {\n return pipe(\n switchMap((result) => {\n const meta: ApiResultMeta = {\n status: result.status ?? 0,\n statusText: result.statusText ?? '',\n headers: result.headers ?? new Headers(),\n fromCache: result.fromCache,\n }\n if (result.ok && result.data !== undefined) {\n const out = onSuccess(result.data, meta)\n return from(Promise.resolve(out))\n }\n throw new ApiError(result.error ?? 'Unknown error', meta)\n }),\n )\n}\n\n/**\n * Класс для управления эффектами с поддержкой доступа к состоянию и контексту\n * Основной класс, который следует использовать\n */\nexport class EffectsModule<\n TState extends Record<string, any> = any,\n TDispatcher = any,\n TServices extends Record<string, any> = Record<string, never>,\n TConfig extends Record<string, any> = Record<string, never>,\n TExternalDispatchers extends Record<string, Dispatcher<any, any>> = Record<string, never>,\n TExternalStates extends ExternalStates = Record<string, never>,\n> {\n private effects: Effect<TState, TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates>[] = []\n private subscriptions: Array<{ unsubscribe: VoidFunction }> = []\n private running = false\n private action$ = new Subject<Action>()\n private externalStates: TExternalStates\n\n /**\n * Поток состояния\n */\n public readonly state$: Observable<TState>\n\n /**\n * Создает модуль эффектов\n * @param storage Хранилище состояния\n * @param dispatcher Основной dispatcher текущего synapse\n * @param externalDispatchers Внешние dispatcher'ы из других synapse\n * @param services Сервисы (API-клиенты и т.д.)\n * @param config Глобальная конфигурация для всех эффектов\n * @param externalStates Внешние состояния (Observable'ы от других хранилищ)\n */\n constructor(\n private storage: IStorage<TState>,\n private dispatcher: TDispatcher & { actions: Observable<Action> },\n private externalDispatchers: TExternalDispatchers = {} as TExternalDispatchers,\n private services: TServices = {} as TServices,\n private config: TConfig = {} as TConfig,\n externalStates: TExternalStates = {} as TExternalStates,\n ) {\n // Нормализуем externalStates: конвертируем storage → Observable\n this.externalStates = this.normalizeExternalStates(externalStates)\n\n // Создаем поток состояния\n this.state$ = new Observable<TState>((observer) => {\n // Отправляем начальное состояние\n Promise.resolve(this.storage.getState()).then((state: TState) => observer.next(state))\n\n // Подписываемся на все изменения\n const unsubscribe = this.storage.subscribeToAll(() => {\n Promise.resolve(this.storage.getState()).then((state: TState) => observer.next(state))\n })\n\n // Отписываемся при завершении\n return () => unsubscribe()\n }).pipe(share())\n }\n\n /**\n * Нормализует externalStates: конвертирует IStorageBase в Observable, пропускает Observable как есть\n */\n private normalizeExternalStates(states: TExternalStates): TExternalStates {\n const normalized = {} as Record<string, Observable<any>>\n for (const [key, value] of Object.entries(states)) {\n normalized[key] = isStorage(value) ? toObservable(value) : value\n }\n return normalized as TExternalStates\n }\n\n /**\n * Подписывается на действия от основного dispatcher'а и внешних dispatcher'ов\n */\n private subscribeToDispatchers() {\n // Основной dispatcher\n const mainSub = this.dispatcher.actions.subscribe((action) => {\n this.action$.next(action)\n })\n this.subscriptions.push(mainSub)\n\n // Внешние dispatcher'ы\n for (const [_, dispatcher] of Object.entries(this.externalDispatchers)) {\n const subscription = dispatcher.actions.subscribe((action) => {\n this.action$.next(action)\n })\n this.subscriptions.push(subscription)\n }\n }\n\n add(effect: Effect<TState, TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates>): this {\n this.effects.push(effect)\n\n if (this.running) {\n this.subscribeToEffect(effect)\n }\n\n return this\n }\n\n /**\n * Добавляет несколько эффектов\n * @param effects Эффекты для добавления\n * @returns Текущий модуль\n */\n addEffects(effects: Effect<TState, TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates>[]): this {\n effects.forEach((effect) => this.add(effect))\n return this\n }\n\n /**\n * Запускает все эффекты\n * @returns Текущий модуль\n */\n async start(): Promise<this> {\n if (this.running) {\n return this\n }\n // Ждем готовности основного хранилища\n await this.storage.waitForReady()\n\n // Переподписываемся на dispatchers (подписки были очищены в stop())\n this.subscribeToDispatchers()\n\n this.effects.forEach((effect) => this.subscribeToEffect(effect))\n this.running = true\n\n return this\n }\n\n /**\n * Останавливает все эффекты\n * @returns Текущий модуль\n */\n stop(): this {\n this.subscriptions.forEach((sub) => sub.unsubscribe())\n this.subscriptions = []\n this.action$.complete()\n this.action$ = new Subject<Action>()\n this.running = false\n\n return this\n }\n\n /**\n * Подписывается на конкретный эффект\n * @param effect Эффект для подписки\n */\n private subscribeToEffect(effect: Effect<TState, TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates>): void {\n try {\n const context: EffectContext<TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates> = {\n dispatcher: this.dispatcher,\n externalDispatchers: this.externalDispatchers,\n externalStates: this.externalStates,\n services: this.services,\n config: this.config,\n }\n\n const output$ = effect(this.action$.asObservable(), this.state$, context).pipe(\n catchError((err) => {\n handleCallbackError('EffectsModule: error in effect', err)\n return of(null)\n }),\n )\n\n const subscription = output$.subscribe((result) => {\n if (result === null || result === undefined) {\n return\n }\n\n if (typeof result === 'function') {\n try {\n result()\n } catch (callError) {\n handleCallbackError('EffectsModule: error calling effect result function', callError)\n }\n }\n })\n\n this.subscriptions.push(subscription)\n } catch (setupError) {\n handleCallbackError('EffectsModule: error setting up effect', setupError)\n }\n }\n}\n\n/**\n * Вспомогательная функция для создания типизированного эффекта\n */\nexport function createEffect<\n TState extends Record<string, any>,\n TDispatcher = any,\n TServices extends Record<string, any> = Record<string, never>,\n TConfig extends Record<string, any> = Record<string, never>,\n TExternalDispatchers extends Record<string, Dispatcher<any, any>> = Record<string, never>,\n TExternalStates extends ExternalStates = Record<string, never>,\n>(\n effect: Effect<TState, TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates>,\n): Effect<TState, TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates> {\n return effect\n}\n\n/**\n * Объединяет несколько эффектов в один\n * @param effects Эффекты для объединения\n * @returns Объединенный эффект\n */\nexport function combineEffects<\n TState extends Record<string, any>,\n TDispatcher = any,\n TServices extends Record<string, any> = Record<string, never>,\n TConfig extends Record<string, any> = Record<string, never>,\n TExternalDispatchers extends Record<string, Dispatcher<any, any>> = Record<string, never>,\n TExternalStates extends ExternalStates = Record<string, never>,\n>(\n ...effects: Effect<TState, TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates>[]\n): Effect<TState, TDispatcher, TServices, TConfig, TExternalDispatchers, TExternalStates> {\n return (action$, state$, context) => {\n const outputs = effects.map((effect) => {\n try {\n return effect(action$, state$, context)\n } catch (error) {\n handleCallbackError('combineEffects: error in one of combined effects', error)\n return of(null)\n }\n })\n return merge(...outputs)\n }\n}\n"],"names":["combineLatest","EMPTY","from","merge","Observable","of","pipe","Subject","catchError","filter","map","share","switchMap","take","handleCallbackError","logError","chunkRequestConsistent","chunkRequestParallel","isStorage","toObservable","ofType","actionFn","actionType","source$","action","undefined","ofTypes","actionFns","actionTypes","fn","Boolean","ofTypesWaitAll","actionStreams","type","index","results","a","b","r","selectorMap","state$","selectors","state","selector","selectorObject","result","key","Object","validateMap","validator","loadingAction","errorAction","apiCall","pipeData","callApi","apiCall$","err","validateConfig","conditions","skipAction","conditionMet","Array","ApiError","Error","originalError","meta","apiResult","onSuccess","Headers","out","Promise","EffectsModule","storage","dispatcher","externalDispatchers","services","config","externalStates","observer","unsubscribe","states","normalized","value","mainSub","_","subscription","effect","effects","sub","context","output$","callError","setupError","createEffect","combineEffects","action$","outputs","error"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './effects.module';
2
+ export { fromRequest } from './utils/fromRequest';
3
+ export { toObservable } from './utils/toObservable';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/reactive/effects/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,11 @@
1
+ export * from "./effects.module.js";
2
+
3
+
4
+
5
+
6
+
7
+
8
+ export { fromRequest } from "./utils/fromRequest.js";
9
+ export { toObservable } from "./utils/toObservable.js";
10
+
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive/effects/index.js","sources":["../../../src/reactive/effects/index.ts"],"sourcesContent":["export * from './effects.module'\nexport { fromRequest } from './utils/fromRequest'\nexport { toObservable } from './utils/toObservable'\n"],"names":["fromRequest","toObservable"],"mappings":";;;AAAgC;AACiB;AACE"}
@@ -0,0 +1,12 @@
1
+ import { Observable } from 'rxjs';
2
+ /**
3
+ * Разбиение запроса на порции
4
+ * Отправляется ПОСЛЕДОВАТЕЛЬНО n-запросов и дожидается ответа от каждого
5
+ * @param fn - функция в которую передается chunk и возвращается функция api
6
+ * @param arr - массив который нужно поделить
7
+ * @param size - размер порции
8
+ * @param delayMs - задержка между запросами в миллисекундах
9
+ */
10
+ export declare const chunkRequestConsistent: <T, R>(fn: (chunk: T[]) => Observable<R>, arr: T[], size: number, delayMs?: number) => Observable<R[]>;
11
+ export type ChunkRequestConsistent = typeof chunkRequestConsistent;
12
+ //# sourceMappingURL=chunkRequestConsistent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunkRequestConsistent.d.ts","sourceRoot":"","sources":["../../../../src/reactive/effects/utils/chunkRequestConsistent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAM,MAAM,MAAM,CAAA;AAKrC;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,MAAM,EAAE,gBAAW,KAAG,UAAU,CAAC,CAAC,EAAE,CAGnI,CAAA;AACD,MAAM,MAAM,sBAAsB,GAAG,OAAO,sBAAsB,CAAA"}
@@ -0,0 +1,25 @@
1
+ import { of } from "rxjs";
2
+ import { concatAll, delay, mergeMap, toArray } from "rxjs/operators";
3
+ import { chunk } from "../../../_utils/index.js";
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+ /**
12
+ * Разбиение запроса на порции
13
+ * Отправляется ПОСЛЕДОВАТЕЛЬНО n-запросов и дожидается ответа от каждого
14
+ * @param fn - функция в которую передается chunk и возвращается функция api
15
+ * @param arr - массив который нужно поделить
16
+ * @param size - размер порции
17
+ * @param delayMs - задержка между запросами в миллисекундах
18
+ */ const chunkRequestConsistent = (fn, arr, size, delayMs = 0)=>{
19
+ const chunks = chunk(arr, size).map((chunkItem)=>of(chunkItem).pipe(delay(delayMs), mergeMap(fn)));
20
+ return of(...chunks).pipe(concatAll(), toArray());
21
+ };
22
+
23
+ export { chunkRequestConsistent };
24
+
25
+ //# sourceMappingURL=chunkRequestConsistent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive/effects/utils/chunkRequestConsistent.js","sources":["../../../../src/reactive/effects/utils/chunkRequestConsistent.ts"],"sourcesContent":["import { Observable, of } from 'rxjs'\nimport { concatAll, delay, mergeMap, toArray } from 'rxjs/operators'\n\nimport { chunk } from '../../../_utils'\n\n/**\n * Разбиение запроса на порции\n * Отправляется ПОСЛЕДОВАТЕЛЬНО n-запросов и дожидается ответа от каждого\n * @param fn - функция в которую передается chunk и возвращается функция api\n * @param arr - массив который нужно поделить\n * @param size - размер порции\n * @param delayMs - задержка между запросами в миллисекундах\n */\nexport const chunkRequestConsistent = <T, R>(fn: (chunk: T[]) => Observable<R>, arr: T[], size: number, delayMs = 0): Observable<R[]> => {\n const chunks = chunk(arr, size).map((chunkItem) => of(chunkItem).pipe(delay(delayMs), mergeMap(fn)))\n return of(...chunks).pipe(concatAll(), toArray())\n}\nexport type ChunkRequestConsistent = typeof chunkRequestConsistent\n"],"names":["of","concatAll","delay","mergeMap","toArray","chunk","chunkRequestConsistent","fn","arr","size","delayMs","chunks","chunkItem"],"mappings":";;;;;;;AAAqC;AAC+B;AAE7B;AAEvC;;;;;;;CAOC,GACM,MAAMM,sBAAsBA,GAAG,CAAOC,IAAmCC,KAAUC,MAAcC,UAAU,CAAC;IACjH,MAAMC,SAASN,KAAKA,CAACG,KAAKC,MAAM,GAAG,CAAC,CAACG,YAAcZ,EAAEA,CAACY,WAAW,IAAI,CAACV,KAAKA,CAACQ,UAAUP,QAAQA,CAACI;IAC/F,OAAOP,EAAEA,IAAIW,QAAQ,IAAI,CAACV,SAASA,IAAIG,OAAOA;AAChD,EAAC"}
@@ -0,0 +1,12 @@
1
+ import { Observable } from 'rxjs';
2
+ /**
3
+ * Разбиение запроса на порции
4
+ * Отправляется ПАРАЛЛЕЛЬНО n-запросов и дожидается ответа от каждого
5
+ * @param fn - функция в которую передается chunk и возвращается функция api
6
+ * @param arr - массив который нужно поделить
7
+ * @param size - размер порции
8
+ * @param delayMs - задержка между запросами в миллисекундах
9
+ */
10
+ export declare const chunkRequestParallel: <T, R>(fn: (chunk: T[]) => Observable<R>, arr: T[], size: number, delayMs?: number) => Observable<R[]>;
11
+ export type ChunkRequestParallel = typeof chunkRequestParallel;
12
+ //# sourceMappingURL=chunkRequestParallel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunkRequestParallel.d.ts","sourceRoot":"","sources":["../../../../src/reactive/effects/utils/chunkRequestParallel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,UAAU,EAAS,MAAM,MAAM,CAAA;AAKlD;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,MAAM,EAAE,gBAAW,KAAG,UAAU,CAAC,CAAC,EAAE,CAChB,CAAA;AAClH,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA"}
@@ -0,0 +1,22 @@
1
+ import { forkJoin, timer } from "rxjs";
2
+ import { mergeMap } from "rxjs/operators";
3
+ import { chunk } from "../../../_utils/index.js";
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+ /**
12
+ * Разбиение запроса на порции
13
+ * Отправляется ПАРАЛЛЕЛЬНО n-запросов и дожидается ответа от каждого
14
+ * @param fn - функция в которую передается chunk и возвращается функция api
15
+ * @param arr - массив который нужно поделить
16
+ * @param size - размер порции
17
+ * @param delayMs - задержка между запросами в миллисекундах
18
+ */ const chunkRequestParallel = (fn, arr, size, delayMs = 0)=>forkJoin(chunk(arr, size).map((chunkItem, index)=>timer(index * delayMs).pipe(mergeMap(()=>fn(chunkItem)))));
19
+
20
+ export { chunkRequestParallel };
21
+
22
+ //# sourceMappingURL=chunkRequestParallel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive/effects/utils/chunkRequestParallel.js","sources":["../../../../src/reactive/effects/utils/chunkRequestParallel.ts"],"sourcesContent":["import { forkJoin, Observable, timer } from 'rxjs'\nimport { mergeMap } from 'rxjs/operators'\n\nimport { chunk } from '../../../_utils'\n\n/**\n * Разбиение запроса на порции\n * Отправляется ПАРАЛЛЕЛЬНО n-запросов и дожидается ответа от каждого\n * @param fn - функция в которую передается chunk и возвращается функция api\n * @param arr - массив который нужно поделить\n * @param size - размер порции\n * @param delayMs - задержка между запросами в миллисекундах\n */\nexport const chunkRequestParallel = <T, R>(fn: (chunk: T[]) => Observable<R>, arr: T[], size: number, delayMs = 0): Observable<R[]> =>\n forkJoin(chunk(arr, size).map((chunkItem, index) => timer(index * delayMs).pipe(mergeMap(() => fn(chunkItem)))))\nexport type ChunkRequestParallel = typeof chunkRequestParallel\n"],"names":["forkJoin","timer","mergeMap","chunk","chunkRequestParallel","fn","arr","size","delayMs","chunkItem","index"],"mappings":";;;;;;;AAAkD;AACT;AAEF;AAEvC;;;;;;;CAOC,GACM,MAAMI,oBAAoBA,GAAG,CAAOC,IAAmCC,KAAUC,MAAcC,UAAU,CAAC,GAC/GR,QAAQA,CAACG,KAAKA,CAACG,KAAKC,MAAM,GAAG,CAAC,CAACE,WAAWC,QAAUT,KAAKA,CAACS,QAAQF,SAAS,IAAI,CAACN,QAAQA,CAAC,IAAMG,GAAGI,eAAc"}
@@ -0,0 +1,40 @@
1
+ import { Observable } from 'rxjs';
2
+ import type { RequestResponseModify } from '../../../api/types/endpoint.interface';
3
+ import type { QueryResult } from '../../../api/types/query.interface';
4
+ /**
5
+ * Конвертирует `RequestResponseModify` в Observable с поддержкой отмены запроса.
6
+ *
7
+ * **Зачем нужен:**
8
+ * `RequestResponseModify` — thenable-объект (имеет `.then()`), поэтому RxJS `from()`
9
+ * может конвертировать его в Observable напрямую. Однако при таком подходе теряется
10
+ * возможность отмены: когда RxJS отписывается от Observable (switchMap, takeUntil,
11
+ * unsubscribe), Promise продолжает висеть — HTTP-запрос не абортится.
12
+ *
13
+ * `fromRequest` создаёт Observable с teardown-функцией, которая вызывает `req.abort()`
14
+ * при отписке. Это гарантирует, что при переключении на новый запрос (switchMap)
15
+ * или остановке эффектов предыдущий HTTP-запрос будет реально отменён.
16
+ *
17
+ * Abort вызывается только если запрос ещё не завершился — при нормальном завершении
18
+ * (resolve/reject) teardown не абортит, чтобы не влиять на внутреннее состояние endpoint'а.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * import { fromRequest } from 'synapse-storage/reactive'
23
+ *
24
+ * // Вместо:
25
+ * from(getList.request({ limit: 20, offset: 0 }))
26
+ *
27
+ * // Используйте:
28
+ * fromRequest(getList.request({ limit: 20, offset: 0 }))
29
+ *
30
+ * // В эффекте с validateMap:
31
+ * apiCall: ([_action, _state, { pageSize }]) =>
32
+ * fromRequest(getList.request({ limit: pageSize, offset: 0 })).pipe(
33
+ * apiResult((data) => {
34
+ * dispatcher.dispatch.applyList(data)
35
+ * }),
36
+ * ),
37
+ * ```
38
+ */
39
+ export declare function fromRequest<T>(req: RequestResponseModify<T>): Observable<QueryResult<T, Error>>;
40
+ //# sourceMappingURL=fromRequest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fromRequest.d.ts","sourceRoot":"","sources":["../../../../src/reactive/effects/utils/fromRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAEjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAA;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CA0B/F"}
@@ -0,0 +1,64 @@
1
+ import { Observable } from "rxjs";
2
+
3
+
4
+
5
+ /**
6
+ * Конвертирует `RequestResponseModify` в Observable с поддержкой отмены запроса.
7
+ *
8
+ * **Зачем нужен:**
9
+ * `RequestResponseModify` — thenable-объект (имеет `.then()`), поэтому RxJS `from()`
10
+ * может конвертировать его в Observable напрямую. Однако при таком подходе теряется
11
+ * возможность отмены: когда RxJS отписывается от Observable (switchMap, takeUntil,
12
+ * unsubscribe), Promise продолжает висеть — HTTP-запрос не абортится.
13
+ *
14
+ * `fromRequest` создаёт Observable с teardown-функцией, которая вызывает `req.abort()`
15
+ * при отписке. Это гарантирует, что при переключении на новый запрос (switchMap)
16
+ * или остановке эффектов предыдущий HTTP-запрос будет реально отменён.
17
+ *
18
+ * Abort вызывается только если запрос ещё не завершился — при нормальном завершении
19
+ * (resolve/reject) teardown не абортит, чтобы не влиять на внутреннее состояние endpoint'а.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * import { fromRequest } from 'synapse-storage/reactive'
24
+ *
25
+ * // Вместо:
26
+ * from(getList.request({ limit: 20, offset: 0 }))
27
+ *
28
+ * // Используйте:
29
+ * fromRequest(getList.request({ limit: 20, offset: 0 }))
30
+ *
31
+ * // В эффекте с validateMap:
32
+ * apiCall: ([_action, _state, { pageSize }]) =>
33
+ * fromRequest(getList.request({ limit: pageSize, offset: 0 })).pipe(
34
+ * apiResult((data) => {
35
+ * dispatcher.dispatch.applyList(data)
36
+ * }),
37
+ * ),
38
+ * ```
39
+ */ function fromRequest(req) {
40
+ return new Observable((subscriber)=>{
41
+ let settled = false;
42
+ req.wait().then((result)=>{
43
+ settled = true;
44
+ if (!subscriber.closed) {
45
+ subscriber.next(result);
46
+ subscriber.complete();
47
+ }
48
+ }).catch((err)=>{
49
+ settled = true;
50
+ if (!subscriber.closed) {
51
+ subscriber.error(err);
52
+ }
53
+ });
54
+ return ()=>{
55
+ if (!settled) {
56
+ req.abort();
57
+ }
58
+ };
59
+ });
60
+ }
61
+
62
+ export { fromRequest };
63
+
64
+ //# sourceMappingURL=fromRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive/effects/utils/fromRequest.js","sources":["../../../../src/reactive/effects/utils/fromRequest.ts"],"sourcesContent":["import { Observable } from 'rxjs'\n\nimport type { RequestResponseModify } from '../../../api/types/endpoint.interface'\nimport type { QueryResult } from '../../../api/types/query.interface'\n\n/**\n * Конвертирует `RequestResponseModify` в Observable с поддержкой отмены запроса.\n *\n * **Зачем нужен:**\n * `RequestResponseModify` — thenable-объект (имеет `.then()`), поэтому RxJS `from()`\n * может конвертировать его в Observable напрямую. Однако при таком подходе теряется\n * возможность отмены: когда RxJS отписывается от Observable (switchMap, takeUntil,\n * unsubscribe), Promise продолжает висеть — HTTP-запрос не абортится.\n *\n * `fromRequest` создаёт Observable с teardown-функцией, которая вызывает `req.abort()`\n * при отписке. Это гарантирует, что при переключении на новый запрос (switchMap)\n * или остановке эффектов предыдущий HTTP-запрос будет реально отменён.\n *\n * Abort вызывается только если запрос ещё не завершился — при нормальном завершении\n * (resolve/reject) teardown не абортит, чтобы не влиять на внутреннее состояние endpoint'а.\n *\n * @example\n * ```ts\n * import { fromRequest } from 'synapse-storage/reactive'\n *\n * // Вместо:\n * from(getList.request({ limit: 20, offset: 0 }))\n *\n * // Используйте:\n * fromRequest(getList.request({ limit: 20, offset: 0 }))\n *\n * // В эффекте с validateMap:\n * apiCall: ([_action, _state, { pageSize }]) =>\n * fromRequest(getList.request({ limit: pageSize, offset: 0 })).pipe(\n * apiResult((data) => {\n * dispatcher.dispatch.applyList(data)\n * }),\n * ),\n * ```\n */\nexport function fromRequest<T>(req: RequestResponseModify<T>): Observable<QueryResult<T, Error>> {\n return new Observable((subscriber) => {\n let settled = false\n\n req\n .wait()\n .then((result) => {\n settled = true\n if (!subscriber.closed) {\n subscriber.next(result)\n subscriber.complete()\n }\n })\n .catch((err) => {\n settled = true\n if (!subscriber.closed) {\n subscriber.error(err)\n }\n })\n\n return () => {\n if (!settled) {\n req.abort()\n }\n }\n })\n}\n"],"names":["Observable","fromRequest","req","subscriber","settled","result","err"],"mappings":";;;AAAiC;AAKjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCC,GACM,SAASC,WAAWA,CAAIC,GAA6B;IAC1D,OAAO,IAAIF,UAAUA,CAAC,CAACG;QACrB,IAAIC,UAAU;QAEdF,IACG,IAAI,GACJ,IAAI,CAAC,CAACG;YACLD,UAAU;YACV,IAAI,CAACD,WAAW,MAAM,EAAE;gBACtBA,WAAW,IAAI,CAACE;gBAChBF,WAAW,QAAQ;YACrB;QACF,GACC,KAAK,CAAC,CAACG;YACNF,UAAU;YACV,IAAI,CAACD,WAAW,MAAM,EAAE;gBACtBA,WAAW,KAAK,CAACG;YACnB;QACF;QAEF,OAAO;YACL,IAAI,CAACF,SAAS;gBACZF,IAAI,KAAK;YACX;QACF;IACF;AACF"}
@@ -0,0 +1,5 @@
1
+ export * from './chunkRequestConsistent';
2
+ export * from './chunkRequestParallel';
3
+ export * from './fromRequest';
4
+ export * from './toObservable';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/reactive/effects/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,wBAAwB,CAAA;AACtC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA"}
@@ -0,0 +1,11 @@
1
+ export * from "./chunkRequestConsistent.js";
2
+ export * from "./chunkRequestParallel.js";
3
+ export * from "./fromRequest.js";
4
+ export * from "./toObservable.js";
5
+
6
+
7
+
8
+
9
+
10
+
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive/effects/utils/index.js","sources":["../../../../src/reactive/effects/utils/index.ts"],"sourcesContent":["export * from './chunkRequestConsistent'\nexport * from './chunkRequestParallel'\nexport * from './fromRequest'\nexport * from './toObservable'\n"],"names":[],"mappings":";;;;AAAwC;AACF;AACT;AACC"}
@@ -0,0 +1,23 @@
1
+ import { Observable } from 'rxjs';
2
+ import { IStorageBase } from '../../../core';
3
+ /**
4
+ * Конвертирует хранилище (IStorageBase) в Observable потока состояния.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { toObservable } from 'synapse-storage/reactive'
9
+ *
10
+ * const auth$ = toObservable(authStorage)
11
+ *
12
+ * // Использование в createEffectConfig
13
+ * createEffectConfig: () => ({
14
+ * externalStates: { auth: auth$ },
15
+ * })
16
+ * ```
17
+ */
18
+ export declare function toObservable<T extends Record<string, any>>(storage: IStorageBase<T>): Observable<T>;
19
+ /**
20
+ * Проверяет, является ли значение хранилищем (IStorageBase)
21
+ */
22
+ export declare function isStorage(value: any): value is IStorageBase<any>;
23
+ //# sourceMappingURL=toObservable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toObservable.d.ts","sourceRoot":"","sources":["../../../../src/reactive/effects/utils/toObservable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAGjC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAUnG;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,YAAY,CAAC,GAAG,CAAC,CAEhE"}
@@ -0,0 +1,39 @@
1
+ import { Observable } from "rxjs";
2
+ import { shareReplay } from "rxjs/operators";
3
+
4
+
5
+
6
+
7
+
8
+ /**
9
+ * Конвертирует хранилище (IStorageBase) в Observable потока состояния.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { toObservable } from 'synapse-storage/reactive'
14
+ *
15
+ * const auth$ = toObservable(authStorage)
16
+ *
17
+ * // Использование в createEffectConfig
18
+ * createEffectConfig: () => ({
19
+ * externalStates: { auth: auth$ },
20
+ * })
21
+ * ```
22
+ */ function toObservable(storage) {
23
+ return new Observable((observer)=>{
24
+ observer.next(storage.getStateSync());
25
+ const unsubscribe = storage.subscribeToAll(()=>{
26
+ observer.next(storage.getStateSync());
27
+ });
28
+ return ()=>unsubscribe();
29
+ }).pipe(shareReplay(1));
30
+ }
31
+ /**
32
+ * Проверяет, является ли значение хранилищем (IStorageBase)
33
+ */ function isStorage(value) {
34
+ return value && typeof value === 'object' && typeof value.subscribeToAll === 'function' && typeof value.getState === 'function';
35
+ }
36
+
37
+ export { isStorage, toObservable };
38
+
39
+ //# sourceMappingURL=toObservable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive/effects/utils/toObservable.js","sources":["../../../../src/reactive/effects/utils/toObservable.ts"],"sourcesContent":["import { Observable } from 'rxjs'\nimport { shareReplay } from 'rxjs/operators'\n\nimport { IStorageBase } from '../../../core'\n\n/**\n * Конвертирует хранилище (IStorageBase) в Observable потока состояния.\n *\n * @example\n * ```ts\n * import { toObservable } from 'synapse-storage/reactive'\n *\n * const auth$ = toObservable(authStorage)\n *\n * // Использование в createEffectConfig\n * createEffectConfig: () => ({\n * externalStates: { auth: auth$ },\n * })\n * ```\n */\nexport function toObservable<T extends Record<string, any>>(storage: IStorageBase<T>): Observable<T> {\n return new Observable<T>((observer) => {\n observer.next(storage.getStateSync())\n\n const unsubscribe = storage.subscribeToAll(() => {\n observer.next(storage.getStateSync())\n })\n\n return () => unsubscribe()\n }).pipe(shareReplay(1))\n}\n\n/**\n * Проверяет, является ли значение хранилищем (IStorageBase)\n */\nexport function isStorage(value: any): value is IStorageBase<any> {\n return value && typeof value === 'object' && typeof value.subscribeToAll === 'function' && typeof value.getState === 'function'\n}\n"],"names":["Observable","shareReplay","toObservable","storage","observer","unsubscribe","isStorage","value"],"mappings":";;;;;AAAiC;AACW;AAI5C;;;;;;;;;;;;;;CAcC,GACM,SAASE,YAAYA,CAAgCC,OAAwB;IAClF,OAAO,IAAIH,UAAUA,CAAI,CAACI;QACxBA,SAAS,IAAI,CAACD,QAAQ,YAAY;QAElC,MAAME,cAAcF,QAAQ,cAAc,CAAC;YACzCC,SAAS,IAAI,CAACD,QAAQ,YAAY;QACpC;QAEA,OAAO,IAAME;IACf,GAAG,IAAI,CAACJ,WAAWA,CAAC;AACtB;AAEA;;CAEC,GACM,SAASK,SAASA,CAACC,KAAU;IAClC,OAAOA,SAAS,OAAOA,UAAU,YAAY,OAAOA,MAAM,cAAc,KAAK,cAAc,OAAOA,MAAM,QAAQ,KAAK;AACvH"}
@@ -0,0 +1,3 @@
1
+ export * from './dispatcher';
2
+ export * from './effects';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reactive/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA"}
@@ -0,0 +1,7 @@
1
+ export * from "./dispatcher/index.js";
2
+ export * from "./effects/index.js";
3
+
4
+
5
+
6
+
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive/index.js","sources":["../../src/reactive/index.ts"],"sourcesContent":["export * from './dispatcher'\nexport * from './effects'\n"],"names":[],"mappings":";;AAA4B;AACH"}
@@ -0,0 +1,87 @@
1
+ import { IStorage } from '../core';
2
+ export interface EventBusEvent {
3
+ id: string;
4
+ event: string;
5
+ data: any;
6
+ metadata: {
7
+ ttl?: number | null;
8
+ priority?: 'low' | 'normal' | 'high';
9
+ [key: string]: any;
10
+ };
11
+ timestamp: number;
12
+ }
13
+ export interface EventBusState {
14
+ events: Record<string, EventBusEvent>;
15
+ subscriptions: Record<string, any>;
16
+ }
17
+ export interface EventBusConfig {
18
+ name?: string;
19
+ autoCleanup?: boolean;
20
+ maxEvents?: number;
21
+ }
22
+ /**
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
+ * ```
59
+ */
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<{
62
+ event: string;
63
+ data: any;
64
+ metadata?: Record<string, any>;
65
+ }, {
66
+ eventId: string;
67
+ event: string;
68
+ data: any;
69
+ }>;
70
+ subscribe: import("..").DispatchFunction<{
71
+ eventPattern: string;
72
+ handler: (data: any, event: EventBusEvent) => void | Promise<void>;
73
+ options?: Record<string, any>;
74
+ }, {
75
+ subscriptionId: string;
76
+ unsubscribe: () => void;
77
+ }>;
78
+ getEventHistory: import("..").DispatchFunction<{
79
+ eventType: string;
80
+ limit?: number;
81
+ }, EventBusEvent[]>;
82
+ clearEvents: import("..").DispatchFunction<{
83
+ olderThan?: number;
84
+ } | undefined, void>;
85
+ getActiveSubscriptions: import("..").DispatchFunction<any, any[]>;
86
+ }>>>;
87
+ //# sourceMappingURL=createEventBus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createEventBus.d.ts","sourceRoot":"","sources":["../../src/utils/createEventBus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAA+B,MAAM,SAAS,CAAA;AAI/D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,GAAG,CAAA;IACT,QAAQ,EAAE;QACR,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACnB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;QACpC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,CAAA;IACD,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACrC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAuBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,cAAc,GAAI,SAAQ,cAAmB;;eAuBE,MAAM;cAAQ,GAAG;mBAAa,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;;;;;sBAiCnF,MAAM;iBACX,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;kBACxD,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;;;;mBAgDmB,MAAM;gBAAU,MAAM;;;oBAalC,MAAM;;;IAqClD,CAAA"}