synapse-storage 3.0.19 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/README.md +661 -104
  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":"react/utils/createSynapseCtx.js","sources":["../../../src/react/utils/createSynapseCtx.tsx"],"sourcesContent":["import { ComponentType, createContext, forwardRef, PropsWithChildren, useContext, useEffect, useState } from 'react'\nimport { Observable } from 'rxjs'\n\nimport { handleCleanupError, handleOperationError } from '../../_utils/error-handling.util'\nimport { IStorage } from '../../core'\nimport { AnySynapseStore, SynapseStoreBasic, SynapseStoreWithDispatcher, SynapseStoreWithEffects } from '../../utils'\n\nconst ERROR_HOOK_MESSAGE = 'Хук необходимо использовать внутри компонента contextSynapse'\nconst ERROR_CONTEXT_INIT = 'Ошибка при инициализации контекста:'\n\ninterface SimplifiedOptions {\n loadingComponent?: React.ReactNode\n}\n\n/**\n * Перегрузки для createSynapseCtx в зависимости от типа хранилища\n */\n\n// Для хранилища с effects\nexport function createSynapseCtx<TStore extends Record<string, any>, TStorage extends IStorage<TStore>, TSelectors, TActions>(\n synapseStorePromise: Promise<SynapseStoreWithEffects<TStore, TStorage, TSelectors, TActions>> | SynapseStoreWithEffects<TStore, TStorage, TSelectors, TActions>,\n options?: SimplifiedOptions,\n): {\n contextSynapse: <SelfComponentProps>(Component: ComponentType<SelfComponentProps>) => ComponentType<SelfComponentProps>\n useSynapseStorage: () => TStorage\n useSynapseSelectors: () => TSelectors\n useSynapseActions: () => TActions\n useSynapseState$: () => Observable<TStore>\n cleanupSynapse: () => Promise<void>\n}\n\n// Для хранилища с dispatcher (без effects)\nexport function createSynapseCtx<TStore extends Record<string, any>, TStorage extends IStorage<TStore>, TSelectors, TActions>(\n synapseStorePromise: Promise<SynapseStoreWithDispatcher<TStore, TStorage, TSelectors, TActions>> | SynapseStoreWithDispatcher<TStore, TStorage, TSelectors, TActions>,\n options?: SimplifiedOptions,\n): {\n contextSynapse: <SelfComponentProps>(Component: ComponentType<SelfComponentProps>) => ComponentType<SelfComponentProps>\n useSynapseStorage: () => TStorage\n useSynapseSelectors: () => TSelectors\n useSynapseActions: () => TActions\n cleanupSynapse: () => Promise<void>\n}\n\n// Для базового хранилища\nexport function createSynapseCtx<TStore extends Record<string, any>, TStorage extends IStorage<TStore>, TSelectors>(\n synapseStorePromise: Promise<SynapseStoreBasic<TStore, TStorage, TSelectors>> | SynapseStoreBasic<TStore, TStorage, TSelectors>,\n options?: SimplifiedOptions,\n): {\n contextSynapse: <SelfComponentProps>(Component: ComponentType<SelfComponentProps>) => ComponentType<SelfComponentProps>\n useSynapseStorage: () => TStorage\n useSynapseSelectors: () => TSelectors\n cleanupSynapse: () => Promise<void>\n}\n\n// Основная реализация\nexport function createSynapseCtx<TStore extends Record<string, any>, TStorage extends IStorage<TStore>, TSelectors = any, TActions = any>(\n synapseStorePromise: Promise<AnySynapseStore<TStore, TStorage, TSelectors, TActions>> | AnySynapseStore<TStore, TStorage, TSelectors, TActions>,\n options?: SimplifiedOptions,\n) {\n const { loadingComponent = <div>Инициализация контекста...</div> } = options || {}\n\n // Lazy-инициализация: Promise создаётся при первом обращении и сбрасывается при cleanup\n let storeInitPromise: Promise<AnySynapseStore<TStore, TStorage, TSelectors, TActions>> | null = null\n\n const getStoreInitPromise = () => {\n if (!storeInitPromise) {\n storeInitPromise = (async () => {\n try {\n const store = await (synapseStorePromise instanceof Promise ? synapseStorePromise : Promise.resolve(synapseStorePromise))\n await store.storage.waitForReady()\n return store\n } catch (error) {\n handleOperationError('createSynapseCtx: Synapse storage initialization error', error)\n }\n })()\n }\n return storeInitPromise\n }\n\n const SynapseContext = createContext<AnySynapseStore<TStore, TStorage, TSelectors, TActions> | null>(null)\n\n const useSynapseStorage = (): TStorage => {\n const context = useContext(SynapseContext)\n if (!context) throw new Error(`useSynapseStorage: ${ERROR_HOOK_MESSAGE}`)\n return context.storage\n }\n\n const useSynapseSelectors = (): TSelectors => {\n const context = useContext(SynapseContext)\n if (!context) throw new Error(`useSynapseSelectors: ${ERROR_HOOK_MESSAGE}`)\n return context.selectors\n }\n\n // Условный хук для actions (только если есть dispatcher)\n const useSynapseActions = (): TActions => {\n const context = useContext(SynapseContext)\n if (!context) throw new Error(`useSynapseActions: ${ERROR_HOOK_MESSAGE}`)\n\n if ('actions' in context) {\n return (context as SynapseStoreWithDispatcher<TStore, TStorage, TSelectors, TActions> | SynapseStoreWithEffects<TStore, TStorage, TSelectors, TActions>).actions\n }\n\n throw new Error('useSynapseActions: actions недоступны для этого типа хранилища. Убедитесь, что передана функция createDispatcherFn при создании хранилища.')\n }\n\n // Условный хук для state$ (только если есть effects)\n const useSynapseState$ = (): Observable<TStore> => {\n const context = useContext(SynapseContext)\n if (!context) throw new Error(`useSynapseState$: ${ERROR_HOOK_MESSAGE}`)\n\n if ('state$' in context) {\n return (context as SynapseStoreWithEffects<TStore, TStorage, TSelectors, TActions>).state$\n }\n\n throw new Error('useSynapseState$: state$ недоступен для этого типа хранилища. Убедитесь, что переданы функции createDispatcherFn и createEffectConfig при создании хранилища.')\n }\n\n /**\n * Декоратор для обертывания компонентов в контекст Synapse\n */\n function contextSynapse<SelfComponentProps>(Component: ComponentType<SelfComponentProps>) {\n const WrappedComponent = forwardRef<unknown, SelfComponentProps>(function WrappedComponent(props, ref) {\n const [synapseStore, setSynapseStore] = useState<AnySynapseStore<TStore, TStorage, TSelectors, TActions> | null>(null)\n const [isReady, setIsReady] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n useEffect(() => {\n let mounted = true\n\n const initializeContext = async () => {\n try {\n const store = await getStoreInitPromise()\n\n if (mounted) {\n setSynapseStore(store)\n setIsReady(true)\n }\n } catch (err) {\n if (mounted) {\n setError(err instanceof Error ? err : new Error(String(err)))\n }\n }\n }\n\n initializeContext()\n\n return () => {\n mounted = false\n }\n }, [])\n\n // Показываем ошибку если что-то пошло не так\n if (error) return <div>{`${ERROR_CONTEXT_INIT}: ${error.message}`}</div>\n\n // Показываем загрузку пока все не готово\n if (!isReady || !synapseStore) return <>{loadingComponent}</>\n\n return (\n <SynapseContext.Provider value={synapseStore}>\n <Component {...(props as PropsWithChildren<SelfComponentProps>)} ref={ref} />\n </SynapseContext.Provider>\n )\n })\n\n // Устанавливаем отображаемое имя для отладки\n const componentName = Component.displayName || Component.name || 'Component'\n WrappedComponent.displayName = `SynapseContext(${componentName})`\n\n // Копируем статические свойства оригинального компонента\n const excludedKeys = new Set(['$$typeof', 'render', 'defaultProps', 'displayName', 'propTypes'])\n Object.keys(Component).forEach((key) => {\n if (!excludedKeys.has(key)) {\n ;(WrappedComponent as any)[key] = (Component as any)[key]\n }\n })\n\n return WrappedComponent as ComponentType<SelfComponentProps>\n }\n\n const cleanupSynapse = async (): Promise<void> => {\n try {\n if (storeInitPromise) {\n const store = await storeInitPromise\n storeInitPromise = null\n return store?.destroy() || Promise.resolve()\n }\n } catch (error) {\n storeInitPromise = null\n handleCleanupError('createSynapseCtx: error during Synapse cleanup', error)\n }\n }\n\n return {\n contextSynapse,\n useSynapseStorage,\n useSynapseSelectors,\n useSynapseActions,\n useSynapseState$,\n cleanupSynapse,\n }\n}\n"],"names":["createContext","forwardRef","useContext","useEffect","useState","handleCleanupError","handleOperationError","ERROR_HOOK_MESSAGE","ERROR_CONTEXT_INIT","createSynapseCtx","synapseStorePromise","options","loadingComponent","storeInitPromise","getStoreInitPromise","store","Promise","error","SynapseContext","useSynapseStorage","context","Error","useSynapseSelectors","useSynapseActions","useSynapseState$","contextSynapse","Component","WrappedComponent","props","ref","synapseStore","setSynapseStore","isReady","setIsReady","setError","mounted","initializeContext","err","String","componentName","excludedKeys","Set","Object","key","cleanupSynapse"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { awaitSynapse } from './awaitSynapse';
2
+ export { createSynapseCtx } from './createSynapseCtx';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,9 @@
1
+
2
+
3
+
4
+
5
+
6
+ export { awaitSynapse } from "./awaitSynapse.js";
7
+ export { createSynapseCtx } from "./createSynapseCtx.js";
8
+
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react/utils/index.js","sources":["../../../src/react/utils/index.ts"],"sourcesContent":["export { awaitSynapse } from './awaitSynapse'\nexport { createSynapseCtx } from './createSynapseCtx'\n"],"names":["awaitSynapse","createSynapseCtx"],"mappings":";;AAA6C;AACQ"}
@@ -0,0 +1,216 @@
1
+ import { Observable } from 'rxjs';
2
+ import type { IStorage } from '../../core';
3
+ import { TypedAction } from '../effects';
4
+ import type { ActionExecutionOptions, ActionRecipe, WatcherRecipe } from './standalone';
5
+ /**
6
+ * Расширенное API для middleware
7
+ */
8
+ export interface EnhancedMiddlewareAPI<T extends Record<string, any>> {
9
+ getState: () => T | Promise<T>;
10
+ dispatch: (action: Action) => Promise<any>;
11
+ storage: IStorage<T>;
12
+ actions$: Observable<Action>;
13
+ actions: Record<string, DispatchFunction<any, any>>;
14
+ watchers: Record<string, WatcherFunction<any>>;
15
+ findActionByType: (actionType: string) => DispatchFunction<any, any> | undefined;
16
+ findWatcherByType: (actionType: string) => WatcherFunction<any> | undefined;
17
+ }
18
+ /**
19
+ * Расширенное определение middleware
20
+ */
21
+ export interface EnhancedMiddleware<T extends Record<string, any> = any> {
22
+ (api: EnhancedMiddlewareAPI<T>): (next: (action: Action) => Promise<any>) => (action: Action) => Promise<any>;
23
+ }
24
+ /**
25
+ * Базовая структура действия
26
+ */
27
+ export interface Action<T = unknown> {
28
+ type: string;
29
+ payload?: T;
30
+ meta?: Record<string, any>;
31
+ }
32
+ /**
33
+ * Параметры для создания действия
34
+ */
35
+ export interface ActionDefinition<TParams, TResult> {
36
+ /** Тип действия для идентификации в потоке и эффектах. Если не указан — будет выведен из имени ключа в createDispatcher */
37
+ type?: string;
38
+ /** Функция, выполняющая действие и возвращающая результат (payload) */
39
+ action: (params: TParams) => Promise<TResult> | TResult;
40
+ /** Дополнительные метаданные (опционально) */
41
+ meta?: Record<string, any>;
42
+ }
43
+ /**
44
+ * Определение типа для watcher'а
45
+ */
46
+ interface WatcherDefinition<T, R> {
47
+ /** Тип watcher'а для идентификации в потоке. Если не указан — будет выведен из имени ключа в createDispatcher */
48
+ type?: string;
49
+ selector: (state: T) => R;
50
+ meta?: Record<string, any>;
51
+ shouldTrigger?: (prev: R | undefined, current: R) => boolean;
52
+ notifyAfterSubscribe?: boolean;
53
+ }
54
+ /**
55
+ * Тип для функции watcher
56
+ */
57
+ export interface WatcherFunction<R> {
58
+ (): Observable<TypedAction<R>>;
59
+ actionType: string;
60
+ meta?: Record<string, any>;
61
+ unsubscribe: VoidFunction;
62
+ }
63
+ /**
64
+ * Расширенный тип для функции настройки действий с поддержкой дополнительных утилит
65
+ */
66
+ export type ActionsSetupWithUtils<T extends Record<string, any>> = (storage: IStorage<T>, utils: {
67
+ createAction: ActionCreatorFactory;
68
+ createWatcher: <R>(config: WatcherDefinition<T, R>) => WatcherFunction<R>;
69
+ }) => Record<string, DispatchFunction<any, any> | WatcherFunction<any> | ActionRecipe<T, any, any> | WatcherRecipe<T, any>>;
70
+ /**
71
+ * Расширенная функция диспетчеризации
72
+ */
73
+ export interface DispatchFunction<TParams, TResult> {
74
+ /** Функция для вызова действия с параметрами */
75
+ (params: TParams): Promise<TResult>;
76
+ /** Тип действия для использования в эффектах */
77
+ actionType: string;
78
+ /** Метаданные действия */
79
+ meta?: Record<string, any>;
80
+ /** Внутренний тип для идентификации */
81
+ _type?: 'dispatch' | 'watchers';
82
+ }
83
+ /**
84
+ * Тип для фабрики создателей действий
85
+ */
86
+ type ActionCreatorFactory = <TParams = void, TResult = void>(config: ActionDefinition<TParams, TResult>, executionOptions?: ActionExecutionOptions<TParams, TResult>) => DispatchFunction<TParams, TResult>;
87
+ /**
88
+ * Извлекает тип результата из функции диспетчера
89
+ */
90
+ export type ExtractResultType<T> = T extends DispatchFunction<any, infer R> ? R : never;
91
+ /**
92
+ * Извлекает типы из функции настройки действий
93
+ */
94
+ export type ActionsResult<F> = F extends (create: ActionCreatorFactory, storage: any, ...args: any[]) => infer R ? R : Record<string, DispatchFunction<any, any>>;
95
+ /**
96
+ * Типизированный объект действий
97
+ */
98
+ type ResolveDispatch<T> = T extends DispatchFunction<any, any> ? T : T extends ActionRecipe<any, infer P, infer R> ? DispatchFunction<P, R> : never;
99
+ export type DispatchActions<T> = {
100
+ [K in keyof T]: ResolveDispatch<T[K]>;
101
+ };
102
+ /**
103
+ * Типизированный объект watchers
104
+ */
105
+ type ResolveWatcher<T> = T extends WatcherFunction<any> ? T : T extends WatcherRecipe<any, infer R> ? WatcherFunction<R> : never;
106
+ export type WatcherActions<T> = {
107
+ [K in keyof T]: ResolveWatcher<T[K]>;
108
+ };
109
+ /**
110
+ * Параметры для Dispatcher
111
+ */
112
+ interface DispatcherOptions<T extends Record<string, any>> {
113
+ storage: IStorage<T>;
114
+ middlewares?: EnhancedMiddleware<T>[];
115
+ }
116
+ /**
117
+ * Класс Dispatcher для интеграции хранилищ с реактивной системой
118
+ */
119
+ export declare class Dispatcher<T extends Record<string, any>, TActionsFn extends ActionsSetupWithUtils<T> = ActionsSetupWithUtils<T>> {
120
+ private actions$;
121
+ readonly actions: Observable<Action>;
122
+ dispatch: Record<string, DispatchFunction<any, any>>;
123
+ watchers: Record<string, WatcherFunction<any>>;
124
+ private storage;
125
+ private middlewareFunctions;
126
+ private dispatchChain;
127
+ private actionRegistry;
128
+ private actionParams;
129
+ private middlewareAPI;
130
+ /**
131
+ * Создает новый экземпляр Dispatcher
132
+ */
133
+ constructor(options: DispatcherOptions<T>);
134
+ /**
135
+ * Добавляет middleware в цепочку обработки
136
+ */
137
+ use(...middlewares: EnhancedMiddleware<T>[]): this;
138
+ /**
139
+ * Base executor: runs the registered action handler or passes through
140
+ */
141
+ private baseExecute;
142
+ /**
143
+ * Executes action through middleware chain and emits to actions$ (single emission point)
144
+ */
145
+ private executeChain;
146
+ /**
147
+ * Rebuilds the pre-composed middleware chain. Called once on use(), not on every dispatch.
148
+ */
149
+ private rebuildChain;
150
+ /**
151
+ * Получает все действия с улучшенной типизацией
152
+ */
153
+ getActions(): ActionsResult<TActionsFn>;
154
+ /**
155
+ * Получает типизированные действия диспетчера
156
+ */
157
+ getTypedDispatch<A extends Record<string, any>>(): DispatchActions<A>;
158
+ /**
159
+ * Получает типизированные watcher'ы
160
+ */
161
+ getTypedWatchers<A extends Record<string, any>>(): WatcherActions<A>;
162
+ /**
163
+ * Находит действие по типу
164
+ */
165
+ findActionByType(actionType: string): DispatchFunction<any, any> | undefined;
166
+ /**
167
+ * Находит наблюдатель по типу
168
+ */
169
+ findWatcherByType(actionType: string): WatcherFunction<any> | undefined;
170
+ /**
171
+ * Уничтожает dispatcher: отписывает watchers, завершает поток действий, очищает состояние
172
+ */
173
+ destroy(): void;
174
+ /**
175
+ * Создает действие
176
+ */
177
+ createAction<TParams = void, TResult = void>(actionConfig: ActionDefinition<TParams, TResult>, executionOptions?: ActionExecutionOptions<TParams, TResult>): DispatchFunction<TParams, TResult>;
178
+ /**
179
+ * Создает watcher для отслеживания изменений в хранилище
180
+ */
181
+ createWatcher<R>(config: WatcherDefinition<T, R>): WatcherFunction<R>;
182
+ }
183
+ /**
184
+ * Функция для создания типизированного диспетчера.
185
+ *
186
+ * Поддерживает два варианта:
187
+ * 1. Объект standalone-рецептов (ActionRecipe / WatcherRecipe)
188
+ * 2. Setup-функция с доступом к createAction / createWatcher (inline-определение)
189
+ *
190
+ * @example
191
+ * ```ts
192
+ * // Вариант 1: объект рецептов (рекомендуемый)
193
+ * createDispatcher({ storage }, {
194
+ * loadList,
195
+ * loadListLoading: listRequest.loading,
196
+ * watchCount,
197
+ * })
198
+ *
199
+ * // Вариант 2: setup-функция (для смешанного использования)
200
+ * createDispatcher({ storage }, (storage, { createAction }) => ({
201
+ * loadList,
202
+ * custom: createAction({ action: () => { ... } }),
203
+ * }))
204
+ * ```
205
+ */
206
+ export declare function createDispatcher<TState extends Record<string, any>, TRecord extends Record<string, ActionRecipe<TState, any, any> | WatcherRecipe<TState, any>>>(options: DispatcherOptions<TState>, actions: TRecord): Dispatcher<TState> & {
207
+ dispatch: DispatchActions<TRecord>;
208
+ watchers: WatcherActions<TRecord>;
209
+ };
210
+ export declare function createDispatcher<TState extends Record<string, any>, TActions extends ActionsSetupWithUtils<TState>>(options: DispatcherOptions<TState>, actionsSetup: TActions): Dispatcher<TState, TActions> & {
211
+ dispatch: DispatchActions<ReturnType<TActions>>;
212
+ watchers: WatcherActions<ReturnType<TActions>>;
213
+ };
214
+ export type CreateDispatcherType = ReturnType<typeof createDispatcher>;
215
+ export {};
216
+ //# sourceMappingURL=dispatcher.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.module.d.ts","sourceRoot":"","sources":["../../../src/reactive/dispatcher/dispatcher.module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,384 @@
1
+ import { Observable, Subject, share } from "rxjs";
2
+ import { handleCallbackError } from "../../_utils/error-handling.util.js";
3
+
4
+
5
+
6
+
7
+
8
+ /**
9
+ * Класс Dispatcher для интеграции хранилищ с реактивной системой
10
+ */ class Dispatcher {
11
+ // Поток действий
12
+ actions$ = new Subject();
13
+ // Публичный Observable для действий
14
+ actions = this.actions$.asObservable();
15
+ // Методы диспетчеризации действий с типизацией
16
+ dispatch = {};
17
+ // Watcher'ы для реактивной подписки на изменения
18
+ watchers = {};
19
+ // Ссылка на хранилище
20
+ storage;
21
+ // Только один массив для хранения инициализированных middleware
22
+ middlewareFunctions = [];
23
+ // Pre-built middleware chain (null if no middlewares)
24
+ dispatchChain = null;
25
+ // Registry of action executors by action type
26
+ actionRegistry = new Map();
27
+ // Temporary storage for passing params through middleware chain without polluting action object
28
+ actionParams = new WeakMap();
29
+ // API для инициализации middleware
30
+ middlewareAPI;
31
+ /**
32
+ * Создает новый экземпляр Dispatcher
33
+ */ constructor(options){
34
+ this.storage = options.storage;
35
+ // Создаем API для middleware сразу
36
+ this.middlewareAPI = {
37
+ getState: ()=>this.storage.getState(),
38
+ dispatch: (action)=>this.executeChain(action),
39
+ storage: this.storage,
40
+ actions$: this.actions,
41
+ actions: this.dispatch,
42
+ watchers: this.watchers,
43
+ findActionByType: (type)=>this.findActionByType(type),
44
+ findWatcherByType: (type)=>this.findWatcherByType(type)
45
+ };
46
+ // Если есть middleware в options, добавляем их
47
+ if (options.middlewares && options.middlewares.length > 0) {
48
+ this.use(...options.middlewares);
49
+ }
50
+ }
51
+ /**
52
+ * Добавляет middleware в цепочку обработки
53
+ */ use(...middlewares) {
54
+ // Инициализируем каждый middleware и добавляем только инициализированную версию
55
+ for(let i = 0; i < middlewares.length; i++){
56
+ try {
57
+ // Инициализируем middleware с API
58
+ const initializedMiddleware = middlewares[i](this.middlewareAPI);
59
+ this.middlewareFunctions.push(initializedMiddleware);
60
+ } catch (error) {
61
+ handleCallbackError(`Dispatcher: error initializing middleware [${i}]`, error);
62
+ }
63
+ }
64
+ this.rebuildChain();
65
+ return this;
66
+ }
67
+ /**
68
+ * Base executor: runs the registered action handler or passes through
69
+ */ baseExecute = async (action)=>{
70
+ // No params in WeakMap means this is a pass-through dispatch (via api.dispatch)
71
+ if (!this.actionParams.has(action)) {
72
+ return action.payload;
73
+ }
74
+ const entry = this.actionRegistry.get(action.type);
75
+ if (!entry) {
76
+ return action.payload;
77
+ }
78
+ const params = this.actionParams.get(action);
79
+ return Promise.resolve(entry.action(params));
80
+ };
81
+ /**
82
+ * Executes action through middleware chain and emits to actions$ (single emission point)
83
+ */ async executeChain(action) {
84
+ const executor = this.dispatchChain ?? this.baseExecute;
85
+ const result = await executor(action);
86
+ // Single emission point for all dispatches
87
+ action.payload = result;
88
+ this.actionParams.delete(action);
89
+ this.actions$.next(action);
90
+ return result;
91
+ }
92
+ /**
93
+ * Rebuilds the pre-composed middleware chain. Called once on use(), not on every dispatch.
94
+ */ rebuildChain() {
95
+ if (this.middlewareFunctions.length === 0) {
96
+ this.dispatchChain = null;
97
+ return;
98
+ }
99
+ let chain = this.baseExecute;
100
+ for(let i = this.middlewareFunctions.length - 1; i >= 0; i--){
101
+ chain = this.middlewareFunctions[i](chain);
102
+ }
103
+ this.dispatchChain = chain;
104
+ }
105
+ /**
106
+ * Получает все действия с улучшенной типизацией
107
+ */ getActions() {
108
+ return this.dispatch;
109
+ }
110
+ /**
111
+ * Получает типизированные действия диспетчера
112
+ */ getTypedDispatch() {
113
+ return this.dispatch;
114
+ }
115
+ /**
116
+ * Получает типизированные watcher'ы
117
+ */ getTypedWatchers() {
118
+ return this.watchers;
119
+ }
120
+ /**
121
+ * Находит действие по типу
122
+ */ findActionByType(actionType) {
123
+ return Object.values(this.dispatch).find((action)=>{
124
+ return action.actionType.split(`[${this.storage.name}]`)[1] === actionType;
125
+ });
126
+ }
127
+ /**
128
+ * Находит наблюдатель по типу
129
+ */ findWatcherByType(actionType) {
130
+ return Object.values(this.watchers).find((watcher)=>{
131
+ return watcher.actionType.split(`[${this.storage.name}]`)[1] === actionType;
132
+ });
133
+ }
134
+ /**
135
+ * Уничтожает dispatcher: отписывает watchers, завершает поток действий, очищает состояние
136
+ */ destroy() {
137
+ Object.values(this.watchers).forEach((w)=>w.unsubscribe());
138
+ this.actions$.complete();
139
+ this.dispatch = {};
140
+ this.watchers = {};
141
+ this.middlewareFunctions = [];
142
+ this.dispatchChain = null;
143
+ this.actionRegistry.clear();
144
+ }
145
+ /**
146
+ * Создает действие
147
+ */ createAction(actionConfig, executionOptions) {
148
+ const hasExplicitType = !!actionConfig.type;
149
+ let actionType = hasExplicitType ? `[${this.storage.name}]${actionConfig.type}` : '';
150
+ // Register action executor in the registry (сразу, если тип известен)
151
+ if (hasExplicitType) {
152
+ this.actionRegistry.set(actionType, {
153
+ action: actionConfig.action
154
+ });
155
+ }
156
+ // Для мемоизации храним последние аргументы и результат
157
+ let lastParams;
158
+ let lastResult;
159
+ let hasCached = false;
160
+ // Создаем функцию диспетчеризации
161
+ const dispatchFn = async (params)=>{
162
+ if (!actionType) {
163
+ throw new Error('Action type not assigned. Provide "type" in config or use within createDispatcher.');
164
+ }
165
+ // Проверяем мемоизацию
166
+ if (executionOptions?.memoize && hasCached) {
167
+ if (executionOptions.memoize(params, lastParams, lastResult)) {
168
+ return lastResult;
169
+ }
170
+ }
171
+ // Создаем объект действия
172
+ const actionObject = {
173
+ type: actionType,
174
+ meta: actionConfig.meta
175
+ };
176
+ // Store params for base executor to retrieve via WeakMap
177
+ this.actionParams.set(actionObject, params);
178
+ // Execute through middleware chain (includes single emission to actions$)
179
+ const result = await this.executeChain(actionObject);
180
+ // Сохраняем аргументы и результат для мемоизации
181
+ lastParams = params;
182
+ lastResult = result;
183
+ hasCached = true;
184
+ return result;
185
+ };
186
+ dispatchFn._type = 'dispatch';
187
+ // Добавляем тип действия как свойство функции (configurable для deferred assignment)
188
+ Object.defineProperty(dispatchFn, 'actionType', {
189
+ value: actionType,
190
+ writable: false,
191
+ enumerable: true,
192
+ configurable: true
193
+ });
194
+ // Добавляем метаданные, если они есть
195
+ if (actionConfig.meta) {
196
+ Object.defineProperty(dispatchFn, 'meta', {
197
+ value: actionConfig.meta,
198
+ writable: false,
199
+ enumerable: true
200
+ });
201
+ }
202
+ // Deferred type assignment — используется в createDispatcher для авто-генерации типа из имени ключа
203
+ if (!hasExplicitType) {
204
+ ;
205
+ dispatchFn._assignType = (name)=>{
206
+ actionType = `[${this.storage.name}]${name}`;
207
+ this.actionRegistry.set(actionType, {
208
+ action: actionConfig.action
209
+ });
210
+ Object.defineProperty(dispatchFn, 'actionType', {
211
+ value: actionType,
212
+ writable: false,
213
+ enumerable: true,
214
+ configurable: true
215
+ });
216
+ };
217
+ }
218
+ return dispatchFn;
219
+ }
220
+ /**
221
+ * Создает watcher для отслеживания изменений в хранилище
222
+ */ createWatcher(config) {
223
+ const hasExplicitType = !!config.type;
224
+ let actionType = hasExplicitType ? `[${this.storage.name}]${config.type}` : '';
225
+ // Lazy-подписка: подписываемся на storage только при первом subscribe на Observable
226
+ let storageUnsubscribe = null;
227
+ const sharedObservable = new Observable((subscriber)=>{
228
+ // Инициализируем prevValue текущим значением при первой подписке
229
+ let prevValue;
230
+ let disposed = false;
231
+ const initAndSubscribe = async ()=>{
232
+ try {
233
+ const currentState = await Promise.resolve(this.storage.getState());
234
+ prevValue = config.selector(currentState);
235
+ } catch {
236
+ // Если не удалось получить начальное значение — продолжаем с undefined
237
+ }
238
+ if (disposed) return;
239
+ // Если нужно уведомить о текущем значении при подписке
240
+ if (config.notifyAfterSubscribe && prevValue !== undefined) {
241
+ if (!config.shouldTrigger || config.shouldTrigger(undefined, prevValue)) {
242
+ const initialAction = {
243
+ type: actionType,
244
+ payload: prevValue,
245
+ meta: {
246
+ ...config.meta,
247
+ isInitial: true
248
+ }
249
+ };
250
+ this.actions$.next(initialAction);
251
+ subscriber.next(initialAction);
252
+ }
253
+ }
254
+ // Подписываемся на изменения storage
255
+ storageUnsubscribe = this.storage.subscribe(config.selector, (value)=>{
256
+ if (!config.shouldTrigger || config.shouldTrigger(prevValue, value)) {
257
+ const action = {
258
+ type: actionType,
259
+ payload: value,
260
+ meta: config.meta
261
+ };
262
+ this.actions$.next(action);
263
+ subscriber.next(action);
264
+ prevValue = value;
265
+ }
266
+ });
267
+ // Если отписались пока шла асинхронная инициализация — сразу очищаем
268
+ if (disposed) {
269
+ storageUnsubscribe();
270
+ storageUnsubscribe = null;
271
+ }
272
+ };
273
+ initAndSubscribe();
274
+ return ()=>{
275
+ disposed = true;
276
+ if (storageUnsubscribe) {
277
+ storageUnsubscribe();
278
+ storageUnsubscribe = null;
279
+ }
280
+ };
281
+ }).pipe(share());
282
+ // Создаем функцию watcher'а
283
+ const watcherFn = ()=>sharedObservable;
284
+ watcherFn._type = 'watchers';
285
+ Object.defineProperty(watcherFn, 'actionType', {
286
+ value: actionType,
287
+ writable: false,
288
+ enumerable: true,
289
+ configurable: true
290
+ });
291
+ if (config.meta) {
292
+ Object.defineProperty(watcherFn, 'meta', {
293
+ value: config.meta,
294
+ writable: false,
295
+ enumerable: true
296
+ });
297
+ }
298
+ Object.defineProperty(watcherFn, 'unsubscribe', {
299
+ value: ()=>{
300
+ if (storageUnsubscribe) {
301
+ storageUnsubscribe();
302
+ storageUnsubscribe = null;
303
+ }
304
+ },
305
+ writable: false,
306
+ enumerable: true
307
+ });
308
+ // Deferred type assignment — используется в createDispatcher для авто-генерации типа из имени ключа
309
+ if (!hasExplicitType) {
310
+ ;
311
+ watcherFn._assignType = (name)=>{
312
+ actionType = `[${this.storage.name}]${name}`;
313
+ Object.defineProperty(watcherFn, 'actionType', {
314
+ value: actionType,
315
+ writable: false,
316
+ enumerable: true,
317
+ configurable: true
318
+ });
319
+ };
320
+ }
321
+ //@ts-ignore
322
+ return watcherFn;
323
+ }
324
+ }
325
+ // Implementation
326
+ function createDispatcher(options, actionsOrSetup) {
327
+ // Создаем экземпляр диспетчера
328
+ const dispatcher = new Dispatcher(options);
329
+ // Получаем объект действий: из функции или напрямую
330
+ const actions = typeof actionsOrSetup === 'function' ? actionsOrSetup(options.storage, {
331
+ createAction: (actionConfig, executionOptions)=>dispatcher.createAction(actionConfig, executionOptions),
332
+ createWatcher: (config)=>dispatcher.createWatcher(config)
333
+ }) : actionsOrSetup;
334
+ // Регистрируем все созданные объекты в соответствующих коллекциях
335
+ for (const [key, fn] of Object.entries(actions)){
336
+ // Standalone action recipe — привязываем к storage и создаём реальный action
337
+ if (typeof fn === 'object' && fn !== null && fn._type === 'action-recipe') {
338
+ const recipe = fn;
339
+ const boundConfig = {
340
+ meta: recipe._config.meta,
341
+ action: (params)=>recipe._config.action(options.storage, params)
342
+ };
343
+ const dispatchFn = dispatcher.createAction(boundConfig, recipe._executionOptions);
344
+ if (typeof dispatchFn._assignType === 'function') {
345
+ ;
346
+ dispatchFn._assignType(key);
347
+ delete dispatchFn._assignType;
348
+ }
349
+ dispatcher.dispatch[key] = dispatchFn;
350
+ continue;
351
+ }
352
+ // Standalone watcher recipe — привязываем к storage и создаём реальный watcher
353
+ if (typeof fn === 'object' && fn !== null && fn._type === 'watcher-recipe') {
354
+ const recipe = fn;
355
+ const watcherFn = dispatcher.createWatcher(recipe._config);
356
+ if (typeof watcherFn._assignType === 'function') {
357
+ ;
358
+ watcherFn._assignType(key);
359
+ delete watcherFn._assignType;
360
+ }
361
+ dispatcher.watchers[key] = watcherFn;
362
+ continue;
363
+ }
364
+ // Inline action/watcher (существующая логика)
365
+ if (typeof fn === 'function') {
366
+ const type = fn._type;
367
+ if (type === 'dispatch' || type === 'watchers') {
368
+ // Авто-назначение типа из имени ключа, если type не был указан явно
369
+ if (typeof fn._assignType === 'function') {
370
+ ;
371
+ fn._assignType(key);
372
+ delete fn._assignType;
373
+ }
374
+ // @ts-ignore
375
+ dispatcher[type][key] = fn;
376
+ }
377
+ }
378
+ }
379
+ return dispatcher;
380
+ }
381
+
382
+ export { Dispatcher, createDispatcher };
383
+
384
+ //# sourceMappingURL=dispatcher.module.js.map