synapse-storage 3.0.16 → 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 +657 -127
  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 -95
  342. package/dist/core.js +0 -1
  343. package/dist/createSynapse-BLbPlWXK.d.ts +0 -97
  344. package/dist/dispatcher.module-DcXkCRNj.d.ts +0 -360
  345. package/dist/react.d.ts +0 -98
  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-2HKvqdAJ.d.ts +0 -444
  350. package/dist/utils.d.ts +0 -139
  351. package/dist/utils.js +0 -1
@@ -1,444 +0,0 @@
1
- declare class StorageKey {
2
- private readonly value;
3
- private readonly isRawKey;
4
- constructor(value: string, isRawKey?: boolean);
5
- toString(): string;
6
- toJSON(): string;
7
- valueOf(): string;
8
- isUnparseable(): boolean;
9
- }
10
- type StorageKeyType = string | StorageKey;
11
-
12
- /**
13
- * Контекст выполнения для плагинов
14
- * Содержит информацию о текущей операции и хранилище
15
- */
16
- interface PluginContext {
17
- /** Имя хранилища, к которому применяется плагин */
18
- storageName: string;
19
- /** Временная метка выполнения операции (timestamp) */
20
- timestamp: number;
21
- /** Дополнительные метаданные операции (могут быть предоставлены хранилищем или другими плагинами) */
22
- metadata?: Record<string, any>;
23
- }
24
- /**
25
- * Базовый интерфейс для всех плагинов
26
- * Определяет основные свойства и методы жизненного цикла
27
- */
28
- interface IPlugin {
29
- /** Уникальное имя плагина */
30
- name: string;
31
- /**
32
- * Метод инициализации плагина
33
- * Вызывается при добавлении плагина в хранилище или при инициализации хранилища
34
- */
35
- initialize?(): Promise<void>;
36
- /**
37
- * Метод уничтожения плагина
38
- * Вызывается при удалении плагина из хранилища или при уничтожении хранилища
39
- * Используется для освобождения ресурсов и очистки состояния
40
- */
41
- destroy?(): Promise<void>;
42
- }
43
- /**
44
- * Интерфейс плагина для хранилища данных
45
- * Определяет хуки для различных операций хранилища
46
- */
47
- interface IStoragePlugin extends IPlugin {
48
- /**
49
- * Вызывается перед установкой значения в хранилище
50
- * Позволяет изменить значение до его сохранения
51
- *
52
- * @param value Значение, которое будет сохранено
53
- * @param context Контекст выполнения операции
54
- * @returns Модифицированное значение для сохранения
55
- */
56
- onBeforeSet?<T>(value: T, context: PluginContext): Promise<T>;
57
- /**
58
- * Вызывается после установки значения в хранилище
59
- * Позволяет выполнить дополнительные действия или модифицировать результат
60
- *
61
- * @param key Ключ, по которому было сохранено значение
62
- * @param value Сохраненное значение
63
- * @param context Контекст выполнения операции
64
- * @returns Финальное значение (может быть модифицировано)
65
- */
66
- onAfterSet?<T>(key: StorageKeyType, value: T, context: PluginContext): Promise<T>;
67
- /**
68
- * Вызывается перед получением значения из хранилища
69
- * Позволяет модифицировать запрашиваемый ключ
70
- *
71
- * @param key Ключ, по которому запрашивается значение
72
- * @param context Контекст выполнения операции
73
- * @returns Возможно модифицированный ключ для запроса
74
- */
75
- onBeforeGet?(key: StorageKeyType, context: PluginContext): Promise<StorageKeyType>;
76
- /**
77
- * Вызывается после получения значения из хранилища
78
- * Позволяет модифицировать полученное значение
79
- *
80
- * @param key Ключ, по которому было запрошено значение
81
- * @param value Полученное значение (undefined, если значение не найдено)
82
- * @param context Контекст выполнения операции
83
- * @returns Финальное значение (может быть модифицировано)
84
- */
85
- onAfterGet?<T>(key: StorageKeyType, value: T | undefined, context: PluginContext): Promise<T | undefined>;
86
- /**
87
- * Вызывается перед удалением значения из хранилища
88
- * Позволяет разрешить или запретить удаление
89
- *
90
- * @param key Ключ, по которому будет удалено значение
91
- * @param context Контекст выполнения операции
92
- * @returns Булево значение, разрешающее (true) или запрещающее (false) удаление
93
- */
94
- onBeforeDelete?(key: StorageKeyType, context: PluginContext): Promise<boolean>;
95
- /**
96
- * Вызывается после удаления значения из хранилища
97
- * Позволяет выполнить дополнительные действия после удаления
98
- *
99
- * @param key Ключ, по которому было удалено значение
100
- * @param context Контекст выполнения операции
101
- */
102
- onAfterDelete?(key: StorageKeyType, context: PluginContext): Promise<void>;
103
- /**
104
- * Вызывается перед очисткой хранилища
105
- * Позволяет выполнить дополнительные действия перед удалением всех данных
106
- *
107
- * @param context Контекст выполнения операции
108
- */
109
- onClear?(context: PluginContext): Promise<void>;
110
- }
111
- /**
112
- * Исполнитель плагинов
113
- * Отвечает за выполнение хуков плагинов в определенной последовательности
114
- */
115
- interface IPluginExecutor {
116
- /**
117
- * Выполняет хуки onBeforeSet всех зарегистрированных плагинов
118
- *
119
- * @param value Исходное значение
120
- * @param metadata Дополнительные метаданные
121
- * @returns Модифицированное значение после прохождения всех плагинов
122
- */
123
- executeBeforeSet<T>(value: T, metadata?: Record<string, any>): Promise<T>;
124
- /**
125
- * Выполняет хуки onAfterSet всех зарегистрированных плагинов
126
- *
127
- * @param key Ключ, по которому было сохранено значение
128
- * @param value Сохраненное значение
129
- * @param metadata Дополнительные метаданные
130
- * @returns Финальное значение после прохождения всех плагинов
131
- */
132
- executeAfterSet<T>(key: StorageKeyType, value: T, metadata?: Record<string, any>): Promise<T>;
133
- /**
134
- * Выполняет хуки onBeforeGet всех зарегистрированных плагинов
135
- *
136
- * @param key Исходный ключ
137
- * @param metadata Дополнительные метаданные
138
- * @returns Модифицированный ключ после прохождения всех плагинов
139
- */
140
- executeBeforeGet(key: StorageKeyType, metadata?: Record<string, any>): Promise<StorageKeyType>;
141
- /**
142
- * Выполняет хуки onAfterGet всех зарегистрированных плагинов
143
- *
144
- * @param key Ключ, по которому было запрошено значение
145
- * @param value Полученное значение
146
- * @param metadata Дополнительные метаданные
147
- * @returns Финальное значение после прохождения всех плагинов
148
- */
149
- executeAfterGet<T>(key: StorageKeyType, value: T | undefined, metadata?: Record<string, any>): Promise<T | undefined>;
150
- /**
151
- * Выполняет хуки onBeforeDelete всех зарегистрированных плагинов
152
- *
153
- * @param key Ключ, по которому будет удалено значение
154
- * @param metadata Дополнительные метаданные
155
- * @returns Результат проверки всех плагинов (false если хотя бы один плагин запретил удаление)
156
- */
157
- executeBeforeDelete(key: StorageKeyType, metadata?: Record<string, any>): Promise<boolean>;
158
- /**
159
- * Выполняет хуки onAfterDelete всех зарегистрированных плагинов
160
- *
161
- * @param key Ключ, по которому было удалено значение
162
- * @param metadata Дополнительные метаданные
163
- */
164
- executeAfterDelete(key: StorageKeyType, metadata?: Record<string, any>): Promise<void>;
165
- /**
166
- * Выполняет хуки onClear всех зарегистрированных плагинов
167
- *
168
- * @param metadata Дополнительные метаданные
169
- */
170
- executeOnClear(metadata?: Record<string, any>): Promise<void>;
171
- }
172
- /**
173
- * Менеджер плагинов
174
- * Отвечает за регистрацию, получение и удаление плагинов
175
- */
176
- interface IPluginManager<T extends IPlugin> {
177
- /**
178
- * Добавляет плагин в менеджер
179
- *
180
- * @param plugin Экземпляр плагина
181
- */
182
- add(plugin: T): Promise<void>;
183
- /**
184
- * Удаляет плагин из менеджера по имени
185
- *
186
- * @param name Имя плагина
187
- */
188
- remove(name: string): Promise<void>;
189
- /**
190
- * Получает плагин по имени
191
- *
192
- * @param name Имя плагина
193
- * @returns Экземпляр плагина или undefined, если плагин не найден
194
- */
195
- get(name: string): T | undefined;
196
- /**
197
- * Получает все зарегистрированные плагины
198
- *
199
- * @returns Массив всех плагинов
200
- */
201
- getAll(): T[];
202
- /**
203
- * Инициализирует все зарегистрированные плагины
204
- */
205
- initialize(): Promise<void>;
206
- /**
207
- * Уничтожает все зарегистрированные плагины
208
- */
209
- destroy(): Promise<void>;
210
- }
211
-
212
- type PathSelector<T, R> = (state: T) => R;
213
- declare abstract class BaseStorage<T extends Record<string, any>> implements IStorage<T> {
214
- protected readonly config: StorageConfig;
215
- protected readonly pluginExecutor?: IPluginExecutor | undefined;
216
- protected readonly eventEmitter?: IEventEmitter | undefined;
217
- protected readonly logger?: ILogger | undefined;
218
- protected static readonly GLOBAL_SUBSCRIPTION_KEY = "*";
219
- name: string;
220
- private _initStatus;
221
- private statusSubscribers;
222
- private selectorPathCache;
223
- private middlewareModule;
224
- private initializedMiddlewares;
225
- protected subscribers: Map<StorageKeyType, Set<(value: any) => void>>;
226
- constructor(config: StorageConfig, pluginExecutor?: IPluginExecutor | undefined, eventEmitter?: IEventEmitter | undefined, logger?: ILogger | undefined);
227
- get initStatus(): StorageInitStatus;
228
- waitForReady(): Promise<this>;
229
- onStatusChange(callback: (status: StorageInitStatus) => void): VoidFunction;
230
- private updateInitStatus;
231
- initialize(): Promise<this>;
232
- protected abstract doInitialize(): Promise<this>;
233
- private ensureReady;
234
- protected initializeMiddlewares(): void;
235
- protected getDefaultMiddleware(): DefaultMiddlewares;
236
- protected initializeWithMiddlewares(): Promise<void>;
237
- protected abstract doGet(key: StorageKeyType): Promise<any>;
238
- protected abstract doSet(key: StorageKeyType, value: any): Promise<void>;
239
- protected abstract doUpdate(updates: Array<{
240
- key: StorageKeyType;
241
- value: any;
242
- }>): Promise<void>;
243
- protected abstract doDelete(key: StorageKeyType): Promise<boolean>;
244
- protected abstract doClear(): Promise<void>;
245
- protected abstract doKeys(): Promise<string[]>;
246
- protected abstract doHas(key: StorageKeyType): Promise<boolean>;
247
- protected abstract doDestroy(): Promise<void>;
248
- get<R>(key: StorageKeyType): Promise<R | undefined>;
249
- set<R>(key: StorageKeyType, value: R): Promise<void>;
250
- update(updater: (state: T) => void): Promise<void>;
251
- delete(key: StorageKeyType): Promise<void>;
252
- clear(): Promise<void>;
253
- keys(): Promise<string[]>;
254
- has(key: StorageKeyType): Promise<boolean>;
255
- getState(): Promise<T>;
256
- subscribeToAll(callback: (event: {
257
- type: string;
258
- key?: StorageKeyType[] | StorageKeyType;
259
- value?: any;
260
- changedPaths?: string[];
261
- }) => void): VoidFunction;
262
- subscribe(key: string, callback: (value: any) => void): VoidFunction;
263
- subscribe<R>(pathSelector: PathSelector<T, R>, callback: (value: R) => void): VoidFunction;
264
- destroy(): Promise<void>;
265
- private subscribeByKey;
266
- private createDummyState;
267
- private isEqual;
268
- /**
269
- * Возвращает полный путь, а не только корневой ключ
270
- */
271
- private extractPath;
272
- protected notifySubscribers(key: StorageKeyType, value: any): void;
273
- /**
274
- * Метод для определения изменившихся путей между двумя объектами
275
- */
276
- private findChangedPaths;
277
- private subscribeBySelector;
278
- protected emitEvent(event: StorageEvent): Promise<void>;
279
- }
280
-
281
- interface IndexedDBConfig {
282
- dbName?: string;
283
- dbVersion: number;
284
- }
285
- declare class IndexedDBStorage<T extends Record<string, any>> extends BaseStorage<T> {
286
- private readonly DB_NAME;
287
- private readonly STORE_NAME;
288
- private readonly DB_VERSION;
289
- private dbManager;
290
- constructor(config: StorageConfig & {
291
- options: IndexedDBConfig;
292
- }, pluginExecutor?: IPluginExecutor, eventEmitter?: IEventEmitter, logger?: ILogger);
293
- protected doInitialize(): Promise<this>;
294
- static getCurrentDBVersion(dbName: string): Promise<number>;
295
- static createStorages<S extends Record<string, any>>(dbName: string, configs: {
296
- [K in keyof S]: {
297
- name: string;
298
- initialState?: S[K];
299
- middlewares?: ConfigureMiddlewares;
300
- pluginExecutor?: IPluginExecutor;
301
- eventEmitter?: IEventEmitter;
302
- };
303
- }, logger?: ILogger): Promise<{
304
- [K in keyof S]: IndexedDBStorage<S[K]>;
305
- }>;
306
- private getTransaction;
307
- private getObjectStore;
308
- protected doGet(key: StorageKeyType): Promise<any>;
309
- protected doSet(key: StorageKeyType, value: any): Promise<void>;
310
- private putValueInStore;
311
- protected doUpdate(updates: Array<{
312
- key: string | StorageKey;
313
- value: any;
314
- }>): Promise<void>;
315
- protected doDelete(key: StorageKeyType): Promise<boolean>;
316
- protected doClear(): Promise<void>;
317
- protected doKeys(): Promise<string[]>;
318
- protected doHas(key: StorageKeyType): Promise<boolean>;
319
- protected doDestroy(): Promise<void>;
320
- }
321
-
322
- type StorageActionType = 'get' | 'set' | 'delete' | 'clear' | 'init' | 'keys' | 'update';
323
- type StorageAction = {
324
- type: StorageActionType;
325
- key?: StorageKeyType;
326
- value?: any;
327
- metadata?: Record<string, any>;
328
- source?: string;
329
- timestamp?: number;
330
- };
331
- type MiddlewareAPI = {
332
- dispatch: (action: StorageAction) => Promise<any>;
333
- getState: () => Promise<Record<string, any>>;
334
- storage: {
335
- doGet: (key: StorageKeyType) => Promise<any>;
336
- doSet: (key: StorageKeyType, value: any) => Promise<void>;
337
- doUpdate: (updates: Array<{
338
- key: StorageKeyType;
339
- value: any;
340
- }>) => Promise<void>;
341
- doDelete: (key: StorageKeyType) => Promise<boolean>;
342
- doClear: () => Promise<void>;
343
- doKeys: () => Promise<string[]>;
344
- notifySubscribers: (key: StorageKeyType, value: any) => void;
345
- };
346
- };
347
- type NextFunction = (action: StorageAction) => Promise<any>;
348
- type SetupEventsFunction = (api: MiddlewareAPI) => void;
349
- type Middleware = {
350
- name: string;
351
- setup?: SetupEventsFunction;
352
- cleanup?: () => Promise<void> | void;
353
- reducer: (api: MiddlewareAPI) => (next: NextFunction) => (action: StorageAction) => Promise<any>;
354
- };
355
-
356
- interface BatchingMiddlewareOptions {
357
- batchSize?: number;
358
- batchDelay?: number;
359
- }
360
-
361
- interface ShallowCompareMiddlewareOptions {
362
- segments?: string[];
363
- comparator?: <T>(prev: T, next: T) => boolean;
364
- }
365
-
366
- declare enum StorageStatus {
367
- IDLE = "idle",// Не инициализировано
368
- LOADING = "loading",// В процессе инициализации
369
- READY = "ready",// Успешно инициализировано
370
- ERROR = "error"
371
- }
372
- interface StorageInitStatus {
373
- status: StorageStatus;
374
- error?: Error;
375
- }
376
- interface IStorage<T extends Record<string, any> = any> {
377
- name: string;
378
- get<R>(key: StorageKeyType): Promise<R | undefined>;
379
- getState(): Promise<T>;
380
- set<R>(key: StorageKeyType, value: R): Promise<void>;
381
- update(updater: (state: T) => void): Promise<void>;
382
- has(key: StorageKeyType): Promise<boolean>;
383
- delete(key: StorageKeyType): Promise<void>;
384
- clear(): Promise<void>;
385
- keys(): Promise<string[]>;
386
- destroy(): Promise<void>;
387
- subscribeToAll(callback: (event: {
388
- type: string;
389
- changedPaths?: string[];
390
- key?: StorageKeyType[] | StorageKeyType;
391
- value?: any;
392
- }) => void): VoidFunction;
393
- initialize(): Promise<this>;
394
- subscribe(key: StorageKeyType, callback: (value: any) => void): VoidFunction;
395
- subscribe<R>(pathSelector: (state: T) => R, callback: (value: R) => void): VoidFunction;
396
- onStatusChange(callback: (status: StorageInitStatus) => void): VoidFunction;
397
- waitForReady(): Promise<this>;
398
- }
399
- declare enum StorageEvents {
400
- STORAGE_UPDATE = "storage:update",
401
- STORAGE_DELETE = "storage:delete",
402
- STORAGE_PATCH = "storage:patch",
403
- STORAGE_SELECT = "storage:select",
404
- STORAGE_CLEAR = "storage:clear",
405
- STORAGE_DESTROY = "storage:destroy"
406
- }
407
- interface StorageEvent<T = any> {
408
- type: string;
409
- payload?: T;
410
- metadata?: Record<string, any>;
411
- }
412
- interface IEventEmitter {
413
- emit(event: StorageEvent): Promise<void>;
414
- }
415
- interface ILogger {
416
- debug(message: string, meta?: Record<string, any>): void;
417
- info(message: string, meta?: Record<string, any>): void;
418
- warn(message: string, meta?: Record<string, any>): void;
419
- error(message: string, meta?: Record<string, any>): void;
420
- }
421
- interface DefaultMiddlewares {
422
- batching: (options?: BatchingMiddlewareOptions) => Middleware;
423
- shallowCompare: (options?: ShallowCompareMiddlewareOptions) => Middleware;
424
- }
425
- type GetDefaultMiddleware = () => DefaultMiddlewares;
426
- type ConfigureMiddlewares = (getDefaultMiddleware: GetDefaultMiddleware) => Middleware[];
427
- interface StorageConfig {
428
- name: string;
429
- initialState?: Record<string, any>;
430
- middlewares?: ConfigureMiddlewares;
431
- }
432
- type StorageType = 'memory' | 'localStorage' | 'indexedDB';
433
- interface MemoryStorageConfig extends StorageConfig {
434
- type: 'memory';
435
- }
436
- interface LocalStorageConfig extends StorageConfig {
437
- type: 'localStorage';
438
- }
439
- interface IndexedDBStorageConfig extends StorageConfig {
440
- type: 'indexedDB';
441
- options: IndexedDBConfig;
442
- }
443
-
444
- export { type BatchingMiddlewareOptions as B, type ConfigureMiddlewares as C, type DefaultMiddlewares as D, type GetDefaultMiddleware as G, IndexedDBStorage as I, type LocalStorageConfig as L, type Middleware as M, type NextFunction as N, type PluginContext as P, type ShallowCompareMiddlewareOptions as S, type MiddlewareAPI as a, type StorageAction as b, type StorageKeyType as c, type IPlugin as d, type IStoragePlugin as e, type IPluginExecutor as f, type IPluginManager as g, StorageStatus as h, type StorageInitStatus as i, type IStorage as j, StorageEvents as k, type StorageEvent as l, type IEventEmitter as m, type ILogger as n, type StorageConfig as o, type StorageType as p, type MemoryStorageConfig as q, type IndexedDBStorageConfig as r, BaseStorage as s };
package/dist/utils.d.ts DELETED
@@ -1,139 +0,0 @@
1
- import { a as SynapseStoreWithDispatcher, A as AnySynapseStore } from './createSynapse-BLbPlWXK.js';
2
- export { S as SynapseStoreBasic, b as SynapseStoreWithEffects, c as createSynapse } from './createSynapse-BLbPlWXK.js';
3
- import { j as IStorage } from './storage.interface-2HKvqdAJ.js';
4
- import { D as DispatchFunction, f as DispatchActions } from './dispatcher.module-DcXkCRNj.js';
5
- import 'rxjs';
6
- import './selector.interface-CA5y-kD_.js';
7
-
8
- interface EventBusEvent {
9
- id: string;
10
- event: string;
11
- data: any;
12
- metadata: {
13
- ttl?: number | null;
14
- priority?: 'low' | 'normal' | 'high';
15
- [key: string]: any;
16
- };
17
- timestamp: number;
18
- }
19
- interface EventBusState {
20
- events: Record<string, EventBusEvent>;
21
- subscriptions: Record<string, any>;
22
- }
23
- interface EventBusConfig {
24
- name?: string;
25
- autoCleanup?: boolean;
26
- maxEvents?: number;
27
- }
28
- /**
29
- * Создает EventBus для связи между модулями
30
- *
31
- * @example
32
- * ```typescript
33
- * // Создание EventBus
34
- * const eventBus = await createEventBus({
35
- * name: 'app-events',
36
- * autoCleanup: true,
37
- * maxEvents: 500
38
- * })
39
- *
40
- * // Использование в Synapse
41
- * const mySynapse = await createSynapse({
42
- * dependencies: [eventBus],
43
- * createEffectConfig: (dispatcher) => ({
44
- * dispatchers: {
45
- * dispatcher,
46
- * eventBus: eventBus.dispatcher
47
- * }
48
- * }),
49
- * effects: [
50
- * createEffect((action$, _, __, { eventBus }) => {
51
- * // Публикация события
52
- * eventBus.dispatch.publish({
53
- * event: 'USER_UPDATED',
54
- * data: { userId: 123 }
55
- * })
56
- *
57
- * // Подписка на события
58
- * eventBus.dispatch.subscribe({
59
- * eventPattern: 'CORE_*',
60
- * handler: (data, event) => console.log('Received:', event.event, data)
61
- * })
62
- * })
63
- * ]
64
- * })
65
- * ```
66
- */
67
- declare const createEventBus: (config?: EventBusConfig) => Promise<SynapseStoreWithDispatcher<EventBusState, IStorage<EventBusState>, any, Record<string, DispatchFunction<any, any>> & DispatchActions<{
68
- publish: DispatchFunction<{
69
- event: string;
70
- data: any;
71
- metadata?: Record<string, any>;
72
- }, {
73
- eventId: string;
74
- event: string;
75
- data: any;
76
- }>;
77
- subscribe: DispatchFunction<{
78
- eventPattern: string;
79
- handler: (data: any, event: EventBusEvent) => void | Promise<void>;
80
- options?: Record<string, any>;
81
- }, {
82
- subscriptionId: string;
83
- unsubscribe: VoidFunction;
84
- }>;
85
- getEventHistory: DispatchFunction<{
86
- eventType: string;
87
- limit?: number;
88
- }, EventBusEvent[]>;
89
- clearEvents: DispatchFunction<{
90
- olderThan?: number;
91
- } | undefined, void>;
92
- getActiveSubscriptions: DispatchFunction<any, any[]>;
93
- }>>>;
94
-
95
- interface SynapseAwaiter<TStore extends Record<string, any>, TStorage extends IStorage<TStore>, TSelectors, TActions> {
96
- /**
97
- * Возвращает Promise, который резолвится когда Synapse готов
98
- */
99
- waitForReady(): Promise<AnySynapseStore<TStore, TStorage, TSelectors, TActions>>;
100
- /**
101
- * Проверяет, готов ли Synapse прямо сейчас (синхронно)
102
- */
103
- isReady(): boolean;
104
- /**
105
- * Получает store если он готов, иначе undefined
106
- */
107
- getStoreIfReady(): AnySynapseStore<TStore, TStorage, TSelectors, TActions> | undefined;
108
- /**
109
- * Подписывается на событие готовности
110
- * @param callback Функция, вызываемая когда store становится готов
111
- * @returns Функция отписки
112
- */
113
- onReady(callback: (store: AnySynapseStore<TStore, TStorage, TSelectors, TActions>) => void): VoidFunction;
114
- /**
115
- * Подписывается на ошибки инициализации
116
- * @param callback Функция, вызываемая при ошибке
117
- * @returns Функция отписки
118
- */
119
- onError(callback: (error: Error) => void): VoidFunction;
120
- /**
121
- * Получает текущий статус
122
- */
123
- getStatus(): 'pending' | 'ready' | 'error';
124
- /**
125
- * Получает ошибку если есть
126
- */
127
- getError(): Error | null;
128
- /**
129
- * Очищает ресурсы
130
- */
131
- destroy(): void;
132
- }
133
- /**
134
- * Создает фреймворк-независимую утилиту для ожидания готовности Synapse
135
- * Работает в любом JS окружении: Node.js, браузер, React Native, и т.д.
136
- */
137
- declare function createSynapseAwaiter<TStore extends Record<string, any>, TStorage extends IStorage<TStore>, TSelectors, TActions>(synapseStorePromise: Promise<AnySynapseStore<TStore, TStorage, TSelectors, TActions>> | AnySynapseStore<TStore, TStorage, TSelectors, TActions>): SynapseAwaiter<TStore, TStorage, TSelectors, TActions>;
138
-
139
- export { AnySynapseStore, type EventBusConfig, type EventBusEvent, type EventBusState, SynapseStoreWithDispatcher, createEventBus, createSynapseAwaiter };
package/dist/utils.js DELETED
@@ -1 +0,0 @@
1
- var y=!1,A=new Map;function N(o){let e=0;if(o.length===0)return e.toString(36);for(let t=0;t<o.length;t++){let s=o.charCodeAt(t);e=(e<<5)-e+s,e=e&e}return Math.abs(e).toString(36).substring(0,6)}function T(o,e){if(o===e)return!0;if(o==null||e==null)return!1;if(typeof o!="object"&&typeof o!="function"&&typeof e!="object"&&typeof e!="function")return o===e;if(typeof o!=typeof e)return!1;if(o instanceof Date&&e instanceof Date)return o.getTime()===e.getTime();if(Array.isArray(o)&&Array.isArray(e)){if(o.length!==e.length)return!1;for(let t=0;t<o.length;t++)if(!T(o[t],e[t]))return!1;return!0}if(typeof o=="object"&&typeof e=="object"){let t=Object.keys(o),s=Object.keys(e);return t.length!==s.length?!1:t.every(r=>Object.prototype.hasOwnProperty.call(e,r)?T(o[r],e[r]):!1)}return!1}function K(o,e=T){let t,s,r=!1;return function(i){if(!r||t!==i){let n=o(i);(!r||!e(n,s))&&(s=n),t=i,r=!0}return s}}var I=class{constructor(e,t,s=T,r){this.name=e;this.equals=s;this.logger=r;this.id=e,this.memoizedGetState=this.createMemoizedGetState(t)}id;subscribers=new Set;lastValue;memoizedGetState;createMemoizedGetState(e){let t=null,s=!1;return async()=>{if(s&&t)return t;s=!0;try{return t=e(),await t}finally{s=!1}}}async notify(){try{let e=await this.memoizedGetState();if(this.lastValue===void 0||!this.equals(e,this.lastValue)){this.lastValue=e;let t=Array.from(this.subscribers).map(async s=>{try{await s.notify(e)}catch(r){this.logger?.error(`[${this.id}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0438 \u043F\u043E\u0434\u043F\u0438\u0441\u0447\u0438\u043A\u0430`,{error:r})}});await Promise.all(t)}}catch(e){throw this.logger?.error(`[${this.id}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 notify()`,{error:e}),e}}subscribe(e){return this.subscribers.add(e),this.lastValue!==void 0?Promise.resolve().then(()=>{try{e.notify(this.lastValue)}catch(t){this.logger?.error(`[${this.id}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u0435\u0440\u0432\u043E\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u043C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0438`,{error:t})}}):this.notify().catch(t=>{this.logger?.error(`[${this.id}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u0435\u0440\u0432\u043E\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u043C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0438`,{error:t})}),()=>{this.subscribers.delete(e)}}cleanup(){this.subscribers.clear(),this.lastValue=void 0}getId(){return this.id}},C=class{constructor(e,t){this.source=e;this.logger=t;this.storageName=e.name,this.source.getState().then(s=>{this.cachedState=s})}storageName;subscriptions=new Map;cachedState;localSelectorCache=new Map;batchUpdateInProgress=!1;pendingUpdates=new Set;generateName(e,t,s){let r=e?"simple":"combined",a="";if(e){let i=t.toString();a=N(i)}else{let i=t.map(c=>c.getId()).join("_"),n=s.toString();a=N(i+n)}return`${this.storageName}_${r}_${a}`}processPendingUpdates(){this.pendingUpdates.size===0||this.batchUpdateInProgress||(this.batchUpdateInProgress=!0,setTimeout(async()=>{try{let e=Array.from(this.pendingUpdates);this.pendingUpdates.clear(),this.cachedState=await this.source.getState();let t=e.map(async s=>{let r=this.subscriptions.get(s);if(r)try{return await r.notify()}catch(a){this.logger?.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u043F\u0438\u0441\u0447\u0438\u043A\u0430 ${s}`,{error:a})}return Promise.resolve()});await Promise.all(t)}catch(e){this.logger?.error("\u041E\u0448\u0438\u0431\u043A\u0430 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0438 \u043E\u0436\u0438\u0434\u0430\u044E\u0449\u0438\u0445 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0439",{error:e})}finally{this.batchUpdateInProgress=!1,this.pendingUpdates.size>0&&this.processPendingUpdates()}},0))}createSelector(e,t,s){let r=!Array.isArray(e),a=r?t||{}:s||{},i=a.name||this.generateName(r,e,r?void 0:t);if(this.localSelectorCache.has(i))return this.localSelectorCache.get(i).api;if(A.has(i)){let u=A.get(i);return u.refCount++,u.api}let n,c,d=[];if(r){let u=K(e,a.equals||T),p=this.createSimpleSelector(u,{...a,name:i,equals:a.equals||T});n=p.api,d=p.unsubscribeFunctions}else{c=e;let u=this.createCombinedSelector(c,t,{...a,name:i,equals:a.equals||T});n=u.api,d=u.unsubscribeFunctions}return this.localSelectorCache.set(i,{api:n,dependencies:c,unsubscribeFunctions:d}),A.set(i,{api:n,refCount:1,unsubscribeFunctions:d}),n}createSimpleSelector(e,t){let s=async()=>{if(this.cachedState)return e(this.cachedState);let c=await this.source.getState();return this.cachedState=c,e(c)},r=new I(t.name,s,t.equals||T,this.logger),a=r.getId();this.subscriptions.set(a,r);let n=[this.source.subscribeToAll(async c=>{c?.type==="storage:update"&&(this.pendingUpdates.add(a),this.processPendingUpdates())})];return{api:{select:()=>s(),subscribe:c=>r.subscribe(c),getId:()=>a},unsubscribeFunctions:n}}createCombinedSelector(e,t,s){let r=K(p=>t(...p),s.equals||T),a=async()=>{let p=await Promise.all(e.map(l=>l.select()));return r(p)},i=new I(s.name,a,s.equals||T,this.logger),n=i.getId();this.subscriptions.set(n,i);let c=null,d=()=>{c!==null&&clearTimeout(c),c=setTimeout(()=>{c=null,i.notify().catch(p=>this.logger?.error(`[${n}] \u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u0435\u043D\u043D\u043E\u043C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0438:`,{error:p}))},10)},u=e.map(p=>p.subscribe({notify:()=>{d()}}));return{api:{select:()=>a(),subscribe:p=>i.subscribe(p),getId:()=>n},unsubscribeFunctions:u}}destroy(){this.subscriptions.forEach(t=>t.cleanup()),this.subscriptions.clear(),this.cachedState=void 0,this.pendingUpdates.clear(),this.localSelectorCache.forEach(t=>{t.unsubscribeFunctions.forEach(s=>s())});let e=new Set;this.localSelectorCache.forEach((t,s)=>{e.add(s)}),this.localSelectorCache.clear(),e.forEach(t=>{let s=A.get(t);s&&(s.refCount--,s.refCount<=0&&(s.unsubscribeFunctions.forEach(r=>r()),A.delete(t)))})}};var b=class{constructor(e,t=!1){this.value=e;this.isRawKey=t}toString(){return this.value}toJSON(){return this.value}valueOf(){return this.value}isUnparseable(){return this.isRawKey}};var V=(o={})=>{let e=o.batchSize??10,t=o.batchDelay??10,s=new Map,r=new Map,a=l=>l.type==="set"||l.type==="update",i=l=>`${l.type}_${l.key?.toString()||"default"}`,n=l=>{let g=new Map;for(let h of l){let S=`${h.type}_${h.key?.toString()||"default"}`;g.set(S,h)}return Array.from(g.values())},c=l=>{let g=r.get(l);g&&(globalThis.clearTimeout(g),r.delete(l))},d=(l,g)=>{let h=globalThis.setTimeout(g,t);r.set(l,h)},u=async(l,g,h)=>{let S=s.get(l);if(!(!S||S.length===0)){s.delete(l),c(l);try{let E=S.map(f=>f.action),m=n(E);for(let f of m)try{let B=await h(f);S.filter(w=>w.action.type===f.type&&w.action.key?.toString()===f.key?.toString()).forEach(w=>w.resolve(B))}catch(B){S.filter(w=>w.action.type===f.type&&w.action.key?.toString()===f.key?.toString()).forEach(w=>w.reject(B))}}catch(E){S.forEach(m=>m.reject(E))}}},p=async(l,g,h)=>new Promise((S,E)=>{let m=i(l),f=s.get(m);f||(f=[],s.set(m,f)),f.push({action:l,resolve:S,reject:E,timestamp:Date.now()}),c(m),f.length>=e?setImmediate(()=>u(m,g,h)):d(m,()=>u(m,g,h))});return{name:"batching",setup:()=>{},cleanup:async()=>{r.forEach(l=>globalThis.clearTimeout(l)),r.clear(),s.clear()},reducer:l=>g=>async h=>a(h)?p(h,l,g):g(h)}};var j=(o={})=>{let{comparator:e=(r,a)=>{if(r===a)return!0;if(typeof r!="object"||typeof a!="object"||r===null||a===null)return r===a;let i=Object.keys(r),n=Object.keys(a);return i.length!==n.length?!1:i.every(c=>Object.prototype.hasOwnProperty.call(a,c)&&r[c]===a[c])},segments:t=[]}=o,s=new Map;return{name:"shallow-compare",setup:r=>{},reducer:r=>a=>async i=>{if(i.type!=="set"||t.length&&!t.includes(i.metadata?.segment??"default"))return a(i);let n=i.key,c=s.get(n),d=i.value;if(c!==void 0&&e(c,d))return{...c,t:{valueNotChanged:!0,originalValue:c}};let u=await a(i);return s.set(n,d),u}}};var O=class{middlewares=[];api;initialized=!1;dispatchFn;constructor(e){this.api={dispatch:async t=>this.dispatch(t),getState:()=>e.getState(),storage:{doGet:e.doGet.bind(e),doSet:e.doSet.bind(e),doUpdate:e.doUpdate.bind(e),doDelete:e.doDelete.bind(e),doClear:e.doClear.bind(e),doKeys:e.doKeys.bind(e),notifySubscribers:e.notifySubscribers.bind(e)}}}async baseOperation(e){let{processed:t,...s}=e.metadata||{},r={...e,metadata:s};switch(r.type){case"get":return this.api.storage.doGet(r.key);case"set":return await this.api.storage.doSet(r.key,r.value),this.api.storage.doGet(r.key);case"update":return Array.isArray(r.value)?(await this.api.storage.doUpdate(r.value),this.api.storage.doGet("")):r.value;case"delete":return this.api.storage.doDelete(r.key);case"clear":return this.api.storage.doClear();case"init":{let a=await this.api.storage.doGet("");return Object.keys(a||{}).length>0?a:r.value?(await this.api.storage.doSet("",r.value),this.api.storage.doGet("")):a}case"keys":return this.api.storage.doKeys();default:throw new Error(`Unknown action type: ${r.type}`)}}initializeMiddlewares(){if(this.initialized)return;let e=this.baseOperation.bind(this);for(let t of[...this.middlewares].reverse()){let s=e;e=async r=>{if(r.metadata?.processed)return s(r);let a={...r,metadata:{...r.metadata,processed:!0,timestamp:r.metadata?.timestamp||Date.now()}};return t.reducer(this.api)(s)(a)}}this.dispatchFn=e,this.initialized=!0}use(e){e.setup&&e.setup(this.api),this.middlewares.push(e),this.initialized=!1}async dispatch(e){this.initialized||this.initializeMiddlewares();try{return this.dispatchFn(e)}catch(t){throw t}}};function x(o){return o instanceof b&&o.isUnparseable()?[o.toString()]:o.toString().replace(/\[/g,".").replace(/\]/g,"").split(".").filter(Boolean)}function v(o,e){return x(e).reduce((s,r)=>s===void 0?void 0:s[r],o)}function P(o,e,t){if(e==="")return t;let s=x(e);if(e instanceof b&&e.isUnparseable())return o[e.toString()]=t,o;let r=s.pop(),a=s.reduce((i,n)=>{let c=s[s.indexOf(n)+1],d=!Number.isNaN(Number(c));return n in i||(i[n]=d?[]:{}),i[n]},o);return a[r]=t,o}var R=class o{constructor(e,t,s,r){this.config=e;this.pluginExecutor=t;this.eventEmitter=s;this.logger=r;this.name=e.name,this.middlewareModule=new O({getState:this.getState.bind(this),doGet:this.doGet.bind(this),doSet:this.doSet.bind(this),doUpdate:this.doUpdate.bind(this),doDelete:this.doDelete.bind(this),doClear:this.doClear.bind(this),doKeys:this.doKeys.bind(this),notifySubscribers:this.notifySubscribers.bind(this),pluginExecutor:this.pluginExecutor,eventEmitter:this.eventEmitter,logger:this.logger}),this.initializeMiddlewares()}static GLOBAL_SUBSCRIPTION_KEY="*";name;e={status:"idle"};statusSubscribers=new Set;selectorPathCache=new WeakMap;middlewareModule;initializedMiddlewares=null;subscribers=new Map;get initStatus(){return{...this.e}}async waitForReady(){if(this.e.status==="ready")return this;if(this.e.status==="error")throw this.e.error||new Error("Storage initialization failed");return new Promise((e,t)=>{let s=this.onStatusChange(r=>{r.status==="ready"?(s(),e(this)):r.status==="error"&&(s(),t(r.error||new Error("Storage initialization failed")))})})}onStatusChange(e){return this.statusSubscribers.add(e),e(this.initStatus),()=>{this.statusSubscribers.delete(e)}}updateInitStatus(e){let t=this.e.status;this.e={...this.e,...e},t!==this.e.status&&this.logger?.debug(`Storage "${this.name}" status changed: ${t} -> ${this.e.status}`);let s=this.initStatus;this.statusSubscribers.forEach(r=>{try{r(s)}catch(a){this.logger?.error("Error in status change callback",{error:a})}})}async initialize(){if(this.e.status==="ready")return this;if(this.e.status==="loading")return this.waitForReady();this.updateInitStatus({status:"loading",error:void 0});try{let e=await this.doInitialize();return this.updateInitStatus({status:"ready",error:void 0}),e}catch(e){throw this.updateInitStatus({status:"error",error:e instanceof Error?e:new Error(String(e))}),e}}ensureReady(){if(this.e.status!=="ready")throw new Error(`Storage "${this.name}" is not ready. Current status: ${this.e.status}`)}initializeMiddlewares(){this.config.middlewares&&!this.initializedMiddlewares&&(this.initializedMiddlewares=this.config.middlewares(()=>this.getDefaultMiddleware()),this.initializedMiddlewares.forEach(e=>this.middlewareModule.use(e)))}getDefaultMiddleware(){return{batching:(e={})=>V(e),shallowCompare:(e={})=>j(e)}}async initializeWithMiddlewares(){try{let e=await this.getState();!(Object.keys(e).length>0)&&this.config.initialState&&await this.middlewareModule.dispatch({type:"init",value:this.config.initialState})}catch(e){throw this.logger?.error("\u041E\u0448\u0438\u0431\u043A\u0430 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430",{error:e}),e}}async get(e){this.ensureReady();try{let t={operation:"get",timestamp:Date.now(),key:e},s=await this.middlewareModule.dispatch({type:"get",key:e,metadata:t}),r=await this.pluginExecutor?.executeAfterGet(e,s,t)??s;return await this.emitEvent({type:"storage:select",payload:{key:e,value:r}}),r}catch(t){throw this.logger?.error("Error getting value",{key:e,error:t}),t}}async set(e,t){this.ensureReady();try{let s={operation:"set",timestamp:Date.now(),key:e},r=await this.pluginExecutor?.executeBeforeSet(t,s)??t,a=await this.middlewareModule.dispatch({type:"set",key:e,value:r,metadata:s}),i=a?.t?.valueNotChanged===!0,n;if(i&&a?.t?.originalValue!==void 0?n=a.t.originalValue:n=await this.pluginExecutor?.executeAfterSet(e,a,s)??a,!i){let d=[e.toString()];this.notifySubscribers(e,n),this.notifySubscribers(o.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:n,changedPaths:d}),await this.emitEvent({type:"storage:update",payload:{key:e,value:n,changedPaths:d}})}}catch(s){throw this.logger?.error("Error setting value",{key:e,error:s}),s}}async update(e){this.ensureReady();try{let t={operation:"update",timestamp:Date.now()},s=await this.getState(),r=structuredClone(s);e(r);let a=this.findChangedPaths(s,r);if(a.size===0){this.logger?.debug&&this.logger.debug("No changes detected in update");return}this.logger?.debug&&this.logger.debug("Changed paths:",{paths:Array.from(a)});let i=new Set;for(let l of a){let g=l.split(".")[0];i.add(g)}let n=await Promise.all(Array.from(i).map(async l=>{let g={...t,key:l},h=await this.pluginExecutor?.executeBeforeSet(r[l],g)??r[l];return{key:l,value:h}})),c=await this.middlewareModule.dispatch({type:"update",value:n,metadata:{...t,batchUpdate:!0,changedPaths:Array.from(a)}}),d={};Array.isArray(c)?c.forEach(l=>{l&&typeof l=="object"&&"key"in l&&"value"in l&&(d[l.key]=l.value)}):c&&typeof c=="object"&&(d={...c});let u=Object.keys(d).filter(l=>!this.isEqual(s[l],d[l]));if(u.length===0){this.logger?.debug&&this.logger.debug("No actual changes after middleware processing");return}let p={};u.forEach(l=>{p[l]=d[l]}),this.logger?.debug&&this.logger.debug("Notifying subscribers about changes:",{keys:u}),this.notifySubscribers(o.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:u,value:p,changedPaths:Array.from(a)});for(let l of a)try{let g=l.split(".")[0];if(g in p){let h;if(l===g)h=p[g];else{let S=l.substring(g.length+1);h=v(p[g],S)}h!==void 0&&this.notifySubscribers(l,h)}}catch(g){this.logger?.error("Error notifying path subscribers",{path:l,error:g})}await this.emitEvent({type:"storage:update",payload:{state:p,key:u,changedPaths:Array.from(a)}})}catch(t){throw this.logger?.error("Error updating state",{error:t}),t}}async delete(e){this.ensureReady();try{let t={operation:"delete",timestamp:Date.now(),key:e};if(await this.pluginExecutor?.executeBeforeDelete(e,t)===!1)return;let r=await this.middlewareModule.dispatch({type:"delete",key:e,metadata:t});if(r===!1)return;await this.pluginExecutor?.executeAfterDelete(e,t);let i=[e.toString()];this.notifySubscribers(e,void 0),this.notifySubscribers(o.GLOBAL_SUBSCRIPTION_KEY,{type:"storage:update",key:e,value:void 0,result:r,changedPaths:i}),await this.emitEvent({type:"storage:update",payload:{key:e,value:void 0,result:r,changedPaths:i}})}catch(t){throw this.logger?.error("Error deleting value",{key:e,error:t}),t}}async clear(){this.ensureReady();try{this.pluginExecutor?.executeOnClear(),await this.middlewareModule.dispatch({type:"clear"})}catch(e){throw this.logger?.error("Error clearing storage",{error:e}),e}}async keys(){this.ensureReady();try{return await this.middlewareModule.dispatch({type:"keys"})}catch(e){throw this.logger?.error("Error getting keys",{error:e}),e}}async has(e){this.ensureReady();try{return await this.doHas(e)}catch(t){throw this.logger?.error("Error checking value existence",{key:e,error:t}),t}}async getState(){try{return await this.doGet("")||{}}catch(e){throw this.logger?.error("Error getting state",{error:e}),e}}subscribeToAll(e){return this.subscribers.has(o.GLOBAL_SUBSCRIPTION_KEY)||this.subscribers.set(o.GLOBAL_SUBSCRIPTION_KEY,new Set),this.subscribers.get(o.GLOBAL_SUBSCRIPTION_KEY).add(e),()=>{let t=this.subscribers.get(o.GLOBAL_SUBSCRIPTION_KEY);t&&(t.delete(e),t.size===0&&this.subscribers.delete(o.GLOBAL_SUBSCRIPTION_KEY))}}subscribe(e,t){return typeof e=="string"?this.subscribeByKey(e,t):this.subscribeBySelector(e,t)}async destroy(){try{await this.clear(),await this.doDestroy(),this.initializedMiddlewares&&(await Promise.all(this.initializedMiddlewares.map(async e=>{"cleanup"in e&&await e.cleanup?.()})),this.initializedMiddlewares=null),this.statusSubscribers.clear(),this.updateInitStatus({status:"idle"}),await this.emitEvent({type:"storage:destroy"})}catch(e){throw this.logger?.error("Error destroying storage",{error:e}),e}}subscribeByKey(e,t){this.subscribers.has(e)||this.subscribers.set(e,new Set);let s=!1;return this.subscribers.get(e).add(t),this.get(e).then(r=>{try{s||(s=!0,t(r))}catch(a){this.logger?.error("Error in initial callback",{key:e,error:a})}}),()=>{let r=this.subscribers.get(e);r&&(r.delete(t),r.size===0&&this.subscribers.delete(e))}}createDummyState(){let e={get:(t,s)=>(t[s]=t[s]||new Proxy({},e),t[s])};return new Proxy({},e)}isEqual(e,t){if(e===t)return!0;if(e==null||t==null)return e===t;let s=typeof e;if(s!==typeof t)return!1;if(s!=="object")return e===t;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!this.isEqual(e[n],t[n]))return!1;return!0}let a=Object.keys(e),i=Object.keys(t);return a.length!==i.length?!1:a.every(n=>Object.prototype.hasOwnProperty.call(t,n)&&this.isEqual(e[n],t[n]))}extractPath(e,t){if(this.selectorPathCache.has(e))return this.selectorPathCache.get(e);let s=[],r=(a="")=>({get:(i,n)=>{if(typeof n=="symbol")return Reflect.get(i,n);let c=a?`${a}.${n}`:n;return s.push(c),new Proxy({},r(c))},has:(i,n)=>!0,ownKeys:()=>[],getOwnPropertyDescriptor:()=>({configurable:!0,enumerable:!0}),apply:(i,n,c)=>new Proxy(()=>{},r(a))});try{e(new Proxy(t,r()))}catch{}return s.length===0?"":(s.sort((a,i)=>i.length-a.length),this.selectorPathCache.set(e,s[0]),s[0])}notifySubscribers(e,t){let s=e.toString(),r=this.subscribers.get(s);r?.size&&new Set(r).forEach(i=>{try{i(t)}catch(n){this.logger?.error("\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u043F\u043E\u0434\u043F\u0438\u0441\u0447\u0438\u043A\u0435 \u043D\u0430 \u043A\u043E\u043B\u0431\u044D\u043A",{key:s,error:n})}})}findChangedPaths(e,t,s="",r=new Set,a=new WeakMap){if(e===t)return r;if(typeof e!="object"||typeof t!="object"||e===null||t===null)return e!==t&&r.add(s||""),r;if(a.has(e))return r;a.set(e,!0);let i=new Set([...Object.keys(e||{}),...Object.keys(t||{})]);for(let n of i){let c=e[n],d=t[n];if(c===d)continue;let u=s?`${s}.${n}`:n;c&&d&&typeof c=="object"&&typeof d=="object"&&!Array.isArray(c)&&!Array.isArray(d)?this.findChangedPaths(c,d,u,r,a):Array.isArray(c)&&Array.isArray(d)?this.isEqual(c,d)||r.add(u):this.isEqual(c,d)||r.add(u)}return r}subscribeBySelector(e,t){let s=this.createDummyState(),r=this.extractPath(e,s);this.logger?.debug&&this.logger.debug("Subscribing to path:",{path:r});let a=async i=>{try{if(i==null){let d=await this.getState(),u=e(d);t(u);return}if(typeof i!="object"||i===null){t(i);return}let n=await this.getState(),c=e(n);t(c)}catch(n){this.logger?.error("Error in selector callback",{path:r,error:n}),t(i)}};return r?this.subscribeByKey(r,a):this.subscribeToAll(()=>{this.getState().then(i=>{t(e(i))})})}async emitEvent(e){try{await this.eventEmitter?.emit({...e,metadata:{...e.metadata||{},timestamp:Date.now(),storageName:this.name}})}catch(t){this.logger?.error("Error emitting event",{event:e,error:t})}}};var D=class extends R{storage=new Map;constructor(e,t,s,r){super(e,t,s,r)}async doInitialize(){try{return this.logger?.debug(`Initializing MemoryStorage "${this.name}"`),this.initializeMiddlewares(),await this.initializeWithMiddlewares(),this.logger?.debug(`MemoryStorage "${this.name}" initialized successfully`),this}catch(e){throw this.logger?.error("Error initializing MemoryStorage",{error:e}),e}}async doGet(e){let t=this.storage.get(this.name);if(t)return e instanceof b&&e.isUnparseable()?t[e.valueOf()]:v(t,e)}async doSet(e,t){let s=this.storage.get(this.name)||{};if(e instanceof b&&e.isUnparseable()){s[e.valueOf()]=t,this.storage.set(this.name,s);return}let r=P({...s},e,t);this.storage.set(this.name,r)}async doDelete(e){let t=this.storage.get(this.name);if(!t)return!1;if(e instanceof b&&e.isUnparseable()){let n=e.valueOf();return n in t?(delete t[n],this.storage.set(this.name,t),!0):!1}let s=x(e),r=s.slice(0,-1).join("."),a=s[s.length-1],i=r?v(t,r):t;return!i||!(a in i)?!1:(delete i[a],this.storage.set(this.name,t),!0)}async doUpdate(e){let s={...this.storage.get(this.name)||{}};for(let{key:r,value:a}of e)r instanceof b&&r.isUnparseable()?s[r.valueOf()]=a:P(s,r,a);this.storage.set(this.name,s)}async doClear(){this.storage.delete(this.name)}async doKeys(){let e=this.storage.get(this.name);return e?this.getAllKeys(e):[]}async doHas(e){return await this.doGet(e)!==void 0}async doDestroy(){this.storage.delete(this.name)}getAllKeys(e){return Object.keys(e)}};import{Observable as G,Subject as k}from"rxjs";var $=class{constructor(e){this.options=e;this.storage=e.storage,this.middlewareAPI={getState:()=>this.storage.getState(),dispatch:async t=>(this.actions$.next(t),t.payload),storage:this.storage,actions$:this.actions,actions:this.dispatch,watchers:this.watchers,findActionByType:t=>this.findActionByType(t),findWatcherByType:t=>this.findWatcherByType(t)},e.middlewares&&e.middlewares.length>0&&this.use(...e.middlewares)}actions$=new k;actions=this.actions$.asObservable();dispatch={};watchers={};storage;middlewareFunctions=[];middlewareAPI;use(...e){for(let t=0;t<e.length;t++)try{let s=e[t](this.middlewareAPI);this.middlewareFunctions.push(s)}catch{}return this}getActions(){return this.dispatch}getTypedDispatch(){return this.dispatch}getTypedWatchers(){return this.watchers}findActionByType(e){return Object.values(this.dispatch).find(t=>t.actionType.split(`[${this.storage.name}]`)[1]===e)}findWatcherByType(e){return Object.values(this.watchers).find(t=>t.actionType===e)}createAction(e,t){let s=`[${this.storage.name}]${e.type}`,r=null,a=null,i=async n=>{let c=[n];if(t?.memoize&&r&&a&&t.memoize(c,r,a))return a;let d={type:s,meta:e.meta},u;if(this.middlewareFunctions.length>0){let p=async l=>t?.worker?this.executeInWorker(t.worker,s,c,e.action):Promise.resolve(e.action(n));for(let l=this.middlewareFunctions.length-1;l>=0;l--){let g=this.middlewareFunctions[l],h=p;p=async S=>g(async m=>h(m))(S)}u=await p(d)}else t?.worker?u=await this.executeInWorker(t.worker,s,c,e.action):u=await e.action(n);return d.payload=u,r=[...c],a=u,this.actions$.next(d),u};return i.r="dispatch",Object.defineProperty(i,"actionType",{value:s,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(i,"meta",{value:e.meta,writable:!1,enumerable:!0}),i}createWatcher(e){let t=`[${this.storage.name}]${e.type}`,s=new k,r,a=async()=>{let c=await this.storage.getState();return e.selector(c)},i=this.storage.subscribe(e.selector,c=>{if(!e.shouldTrigger||e.shouldTrigger(r,c)){let d={type:t,payload:c,meta:e.meta};this.actions$.next(d),s.next(d),r=c}}),n=()=>{let c=s.asObservable();return e.notifyAfterSubscribe?new G(d=>{let u=!1;a().then(l=>{if(!e.shouldTrigger||e.shouldTrigger(void 0,l)){let g={type:t,payload:l,meta:{...e.meta,isInitial:!0}};d.next(g),r=l,u=!0}}).catch(l=>{d.error(l)});let p=c.subscribe({next:l=>{u&&l.payload===r||d.next(l)},error:l=>d.error(l),complete:()=>d.complete()});return()=>{p.unsubscribe()}}):c};return n.r="watchers",Object.defineProperty(n,"actionType",{value:t,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(n,"meta",{value:e.meta,writable:!1,enumerable:!0}),Object.defineProperty(n,"unsubscribe",{value:i,writable:!1,enumerable:!0}),n}async executeInWorker(e,t,s,r){return new Promise((a,i)=>{let n=`${t}_${Date.now()}_${Math.random()}`,c=d=>{d.data.requestId===n&&(e.removeEventListener("message",c),d.data.error?i(new Error(d.data.error)):a(d.data.result))};e.addEventListener("message",c),e.postMessage({type:t,args:s,requestId:n}),setTimeout(()=>{e.removeEventListener("message",c),i(new Error(`Worker execution timeout for action: ${t}`))},3e4)})}};function U(o,e){let t=new $(o),s=e(o.storage,{createAction:(r,a)=>t.createAction(r,a),createWatcher:r=>t.createWatcher(r)});for(let[r,a]of Object.entries(s))if(typeof a=="function"){let i=a.r;t[i][r]=a}return t}var St=globalThis.console;import{combineLatest as rr,merge as sr,Observable as W,of as H,pipe as ar,Subject as Y}from"rxjs";import{catchError as J,filter as ir,map as cr,share as Q,switchMap as lr,take as dr}from"rxjs/operators";import{of as $t}from"rxjs";import{concatAll as Nt,delay as Kt,mergeMap as Vt,toArray as jt}from"rxjs/operators";import{forkJoin as zt,timer as Gt}from"rxjs";import{mergeMap as Wt}from"rxjs/operators";var M=class{constructor(e,t={},s,r={},a={}){this.storage=e;this.externalStates=t;this.dispatchers=s;this.services=r;this.config=a;this.subscribeToDispatchers(),this.state$=new W(i=>{this.storage.getState().then(c=>i.next(c));let n=this.storage.subscribeToAll(()=>{this.storage.getState().then(c=>i.next(c))});return()=>n()}).pipe(Q())}effects=[];subscriptions=[];running=!1;action$=new Y;state$;subscribeToDispatchers(){for(let[e,t]of Object.entries(this.dispatchers)){let s=t.actions.subscribe(r=>{this.action$.next(r)});this.subscriptions.push(s)}}add(e){return this.effects.push(e),this.running&&this.subscribeToEffect(e),this}addEffects(e){return e.forEach(t=>this.add(t)),this}async start(){return this.running?this:(await this.storage.waitForReady(),this.effects.forEach(e=>this.subscribeToEffect(e)),this.running=!0,this)}stop(){return this.subscriptions.forEach(e=>e.unsubscribe()),this.subscriptions=[],this.running=!1,this}subscribeToEffect(e){try{let s=e(this.action$.asObservable(),this.state$,this.externalStates,this.dispatchers,this.services,this.config).pipe(J(r=>H(null))).subscribe(r=>{if(r!=null&&typeof r=="function")try{r()}catch{}});this.subscriptions.push(s)}catch{}}};function X(o){if(!o.storage&&!o.createStorageFn)throw new Error('Synapse config must have either "storage" or "createStorageFn"');if(o.storage&&o.createStorageFn)throw new Error('Synapse config cannot have both "storage" and "createStorageFn". Choose one.');if(o.effects&&!o.createDispatcherFn)throw new Error('Effects require dispatcher. Add "createDispatcherFn" to config.');if(o.createEffectConfig&&!o.createDispatcherFn)throw new Error('Effect config requires dispatcher. Add "createDispatcherFn" to config.');if(o.dependencies){if(!Array.isArray(o.dependencies))throw new Error("Dependencies must be an array");o.dependencies.forEach((e,t)=>{if(!e||typeof e!="object")throw new Error(`Dependency at index ${t} must be an object`);if(!e.storage||typeof e.storage.waitForReady!="function")throw new Error(`Dependency at index ${t} must have a storage with waitForReady method`)})}if(o.createStorageFn&&typeof o.createStorageFn!="function")throw new Error('"createStorageFn" must be a function');if(o.createDispatcherFn&&typeof o.createDispatcherFn!="function")throw new Error('"createDispatcherFn" must be a function');if(o.createSelectorsFn&&typeof o.createSelectorsFn!="function")throw new Error('"createSelectorsFn" must be a function');if(o.createEffectConfig&&typeof o.createEffectConfig!="function")throw new Error('"createEffectConfig" must be a function');if(o.effects){if(!Array.isArray(o.effects))throw new Error("Effects must be an array");o.effects.forEach((e,t)=>{if(typeof e!="function")throw new Error(`Effect at index ${t} must be a function`)})}if(o.externalSelectors&&typeof o.externalSelectors!="object")throw new Error("External selectors must be an object")}async function Z(o=[]){o.length!==0&&await Promise.all(o.map(async(e,t)=>{try{await e.storage.waitForReady()}catch(s){throw new Error(`Dependency ${t} initialization failed: ${s}`)}}))}async function F(o){try{X(o)}catch(n){throw n}await Z(o.dependencies);let e=o.createStorageFn?await o.createStorageFn():o.storage;await e.waitForReady();let t=[],s={storage:e,selectors:{},destroy:async()=>{for(let n of t)await n()}};t.push(()=>e.destroy());let r,a,i;if(o.createSelectorsFn)try{a=new C(e);let n=o.externalSelectors||{};s.selectors=o.createSelectorsFn(a,n),typeof a.destroy=="function"&&t.push(()=>a.destroy())}catch{}if(o.createDispatcherFn&&(r=o.createDispatcherFn(e),s.dispatcher=r,r&&"dispatch"in r&&(s.actions=r.dispatch,typeof r.destroy=="function"&&t.push(()=>r.destroy()))),o.createEffectConfig&&r)try{let{dispatchers:n,api:c,config:d,externalStates:u}=o.createEffectConfig(r),p=u||{};i=new M(e,p,n,c,d),Array.isArray(o.effects)&&o.effects.forEach(l=>{i&&i.add(l)}),await i.start(),s.state$=i.state$,t.push(()=>{i&&i.stop()})}catch{}return s}function ee(o,e){return e==="*"?!0:e.includes("*")?new RegExp("^"+e.replace(/\*/g,".*")+"$").test(o):o===e}async function te(o,e){let t=await o.getState(),s=Object.entries(t.events||{});if(s.length>e){let a=s.sort((i,n)=>n[1].timestamp-i[1].timestamp).slice(0,e);await o.set("events",Object.fromEntries(a))}}var re=(o={})=>F({createStorageFn:async()=>new D({name:o.name||"eventBus",initialState:{events:{},subscriptions:{}}}).initialize(),createDispatcherFn:e=>U({storage:e},(t,{createAction:s})=>({publish:s({type:"PUBLISH_EVENT",meta:{description:"\u041F\u0443\u0431\u043B\u0438\u043A\u0430\u0446\u0438\u044F \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u0432 EventBus"},action:async({event:r,data:a,metadata:i={}})=>{let n=`${r}_${Date.now()}_${Math.random()}`;return await t.set(`events.${n}`,{id:n,event:r,data:a,metadata:{ttl:i.ttl||null,priority:i.priority||"normal",...i},timestamp:Date.now()}),o.autoCleanup&&await te(t,o.maxEvents||1e3),{eventId:n,event:r,data:a}}}),subscribe:s({type:"SUBSCRIBE_TO_EVENT",meta:{description:"\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0430 \u043D\u0430 \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u0432 EventBus"},action:async({eventPattern:r,handler:a,options:i={}})=>{let n=`sub_${Date.now()}_${Math.random()}`,c=t.subscribe(d=>d.events,d=>{Object.values(d||{}).forEach(u=>{if(ee(u.event,r)){if(i.priority&&u.metadata.priority!==i.priority)return;try{a(u.data,u)}catch{}}})});return await t.set(`subscriptions.${n}`,{id:n,pattern:r,options:i,createdAt:Date.now()}),{subscriptionId:n,unsubscribe:c}}}),getEventHistory:s({type:"GET_EVENT_HISTORY",meta:{description:"\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 \u0441\u043E\u0431\u044B\u0442\u0438\u0439"},action:async({eventType:r,limit:a=100})=>{let i=await t.getState();return Object.values(i.events||{}).filter(n=>n.event===r).sort((n,c)=>c.timestamp-n.timestamp).slice(0,a)}}),clearEvents:s({type:"CLEAR_EVENTS",meta:{description:"\u041E\u0447\u0438\u0441\u0442\u043A\u0430 \u0441\u043E\u0431\u044B\u0442\u0438\u0439"},action:async({olderThan:r}={})=>{if(r){let a=Date.now()-r;await t.update(i=>{Object.keys(i.events||{}).forEach(n=>{i.events[n].timestamp<a&&delete i.events[n]})})}else await t.set("events",{})}}),getActiveSubscriptions:s({type:"GET_SUBSCRIPTIONS",meta:{description:"\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043F\u043E\u0434\u043F\u0438\u0441\u043E\u043A"},action:async()=>{let r=await t.getState();return Object.values(r.subscriptions||{})}})}))});function se(o){let e="pending",t,s=null,r=new Set,a=new Set,i=(async()=>{try{let n=await(o instanceof Promise?o:Promise.resolve(o));return await n.storage.waitForReady(),t=n,e="ready",r.forEach(c=>{try{c(t)}catch{}}),n}catch(n){let c=n instanceof Error?n:new Error(String(n));throw s=c,e="error",a.forEach(d=>{try{d(c)}catch{}}),c}})();return{waitForReady:()=>i,isReady:()=>e==="ready",getStoreIfReady:()=>t,onReady:n=>{if(e==="ready"&&t)try{n(t)}catch{}else r.add(n);return()=>{r.delete(n)}},onError:n=>{if(e==="error"&&s)try{n(s)}catch{}else a.add(n);return()=>{a.delete(n)}},getStatus:()=>e,getError:()=>s,destroy:()=>{r.clear(),a.clear(),t=void 0,s=null,e="pending"}}}export{re as createEventBus,F as createSynapse,se as createSynapseAwaiter};