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,49 @@
1
+ import { IAsyncPluginExecutor } from '../modules/plugin/plugin.interface';
2
+ import { AsyncDefaultMiddlewares, AsyncStorageConfig, IAsyncStorage, IEventEmitter, ILogger, StorageType } from '../storage.interface';
3
+ import { StorageKeyType } from '../utils/storage-key';
4
+ import { PathSelector, StorageCore } from './storage-core';
5
+ /**
6
+ * Базовый класс для асинхронных хранилищ (IndexedDB).
7
+ *
8
+ * Все CRUD-операции возвращают Promise.
9
+ * Совместим с текущим API (переименован из BaseStorage).
10
+ */
11
+ export declare abstract class AsyncBaseStorage<T extends Record<string, any>> extends StorageCore<T> implements IAsyncStorage<T> {
12
+ protected readonly config: AsyncStorageConfig<T>;
13
+ protected readonly pluginExecutor?: IAsyncPluginExecutor | undefined;
14
+ abstract readonly type: StorageType;
15
+ private middlewareModule;
16
+ private initializedMiddlewares;
17
+ private selectorPathCache;
18
+ constructor(config: AsyncStorageConfig<T>, pluginExecutor?: IAsyncPluginExecutor | undefined, eventEmitter?: IEventEmitter, logger?: ILogger);
19
+ protected abstract doGet(key: StorageKeyType): Promise<any>;
20
+ protected abstract doSet(key: StorageKeyType, value: any): Promise<void>;
21
+ protected abstract doUpdate(updates: Array<{
22
+ key: StorageKeyType;
23
+ value: any;
24
+ }>): Promise<void>;
25
+ protected abstract doDelete(key: StorageKeyType): Promise<boolean>;
26
+ protected abstract doClear(): Promise<void>;
27
+ protected abstract doKeys(): Promise<string[]>;
28
+ protected abstract doHas(key: StorageKeyType): Promise<boolean>;
29
+ protected abstract doInitialize(): Promise<this>;
30
+ protected abstract doDestroy(): Promise<void>;
31
+ protected performInitialize(): Promise<void>;
32
+ protected performCleanup(): Promise<void>;
33
+ protected initializeMiddlewares(): void;
34
+ protected getDefaultMiddleware(): AsyncDefaultMiddlewares;
35
+ protected initializeWithMiddlewares(): Promise<void>;
36
+ private getRawState;
37
+ get<R>(key: StorageKeyType): Promise<R | undefined>;
38
+ set<R>(key: StorageKeyType, value: R): Promise<void>;
39
+ update(updater: (state: T) => void): Promise<void>;
40
+ remove(key: StorageKeyType): Promise<void>;
41
+ clear(): Promise<void>;
42
+ reset(): Promise<void>;
43
+ keys(): Promise<string[]>;
44
+ has(key: StorageKeyType): Promise<boolean>;
45
+ getState(): Promise<T>;
46
+ protected subscribeByKey(key: string, callback: (value: any) => void): VoidFunction;
47
+ protected subscribeBySelector<R>(pathSelector: PathSelector<T, R>, callback: (value: R) => void): VoidFunction;
48
+ }
49
+ //# sourceMappingURL=async-base-storage.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-base-storage.service.d.ts","sourceRoot":"","sources":["../../../../src/core/storage/adapters/async-base-storage.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,505 @@
1
+ import { batchingMiddleware } from "../middlewares/storage-batching.middleware.js";
2
+ import { shallowCompareMiddleware } from "../middlewares/storage-shallow-compare.middleware.js";
3
+ import { StorageEvents } from "../storage.interface.js";
4
+ import { AsyncMiddlewareModule, VALUE_NOT_CHANGED } from "../utils/middleware-module.js";
5
+ import { createDummyState, extractPath } from "../utils/path-selector.util.js";
6
+ import { createLazyClone, findChangedPaths, isEqual } from "../utils/state-diff.util.js";
7
+ import { getValueByPath } from "./path.utils.js";
8
+ import { GLOBAL_SUBSCRIPTION_KEY, StorageCore } from "./storage-core.js";
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+ /**
27
+ * Базовый класс для асинхронных хранилищ (IndexedDB).
28
+ *
29
+ * Все CRUD-операции возвращают Promise.
30
+ * Совместим с текущим API (переименован из BaseStorage).
31
+ */ class AsyncBaseStorage extends StorageCore {
32
+ config;
33
+ pluginExecutor;
34
+ middlewareModule;
35
+ initializedMiddlewares = null;
36
+ selectorPathCache = new WeakMap();
37
+ constructor(config, pluginExecutor, eventEmitter, logger){
38
+ super(config, eventEmitter, logger), this.config = config, this.pluginExecutor = pluginExecutor;
39
+ this.middlewareModule = new AsyncMiddlewareModule({
40
+ getState: ()=>this.getRawState(),
41
+ doGet: this.doGet.bind(this),
42
+ doSet: this.doSet.bind(this),
43
+ doUpdate: this.doUpdate.bind(this),
44
+ doDelete: this.doDelete.bind(this),
45
+ doClear: this.doClear.bind(this),
46
+ doKeys: this.doKeys.bind(this),
47
+ notifySubscribers: this.notifySubscribers.bind(this)
48
+ });
49
+ }
50
+ // ─── Lifecycle hooks ────────────────────────────────────────────────────────
51
+ async performInitialize() {
52
+ await this.doInitialize();
53
+ this._stateCache = await this.getRawState();
54
+ }
55
+ async performCleanup() {
56
+ // Обходим публичный clear() (избегая ensureReady после _isDestroyed = true)
57
+ await this.pluginExecutor?.executeOnClear();
58
+ await this.doClear();
59
+ await this.doDestroy();
60
+ if (this.initializedMiddlewares) {
61
+ await Promise.all(this.initializedMiddlewares.map(async (middleware)=>{
62
+ if ('cleanup' in middleware) {
63
+ await middleware.cleanup?.();
64
+ }
65
+ }));
66
+ this.initializedMiddlewares = null;
67
+ }
68
+ }
69
+ // ─── Middleware initialization ──────────────────────────────────────────────
70
+ initializeMiddlewares() {
71
+ if (this.config.middlewares && !this.initializedMiddlewares) {
72
+ this.initializedMiddlewares = this.config.middlewares(()=>this.getDefaultMiddleware());
73
+ this.initializedMiddlewares.forEach((middleware)=>this.middlewareModule.use(middleware));
74
+ }
75
+ }
76
+ getDefaultMiddleware() {
77
+ return {
78
+ batching: (options = {})=>batchingMiddleware(options),
79
+ shallowCompare: (options = {})=>shallowCompareMiddleware(options)
80
+ };
81
+ }
82
+ async initializeWithMiddlewares() {
83
+ try {
84
+ const state = await this.getRawState();
85
+ const hasExistingState = Object.keys(state).length > 0;
86
+ if (!hasExistingState && this.config.initialState) {
87
+ await this.middlewareModule.dispatch({
88
+ type: 'init',
89
+ value: this.config.initialState
90
+ });
91
+ }
92
+ } catch (error) {
93
+ this.logger?.error('Ошибка инициализации хранилища', {
94
+ error
95
+ });
96
+ throw error;
97
+ }
98
+ }
99
+ // ─── Internal state access ──────────────────────────────────────────────────
100
+ async getRawState() {
101
+ try {
102
+ const value = await this.doGet('');
103
+ return value || {};
104
+ } catch (error) {
105
+ this.logger?.error('Error getting state', {
106
+ error
107
+ });
108
+ throw error;
109
+ }
110
+ }
111
+ // ─── Public async API ───────────────────────────────────────────────────────
112
+ async get(key) {
113
+ this.ensureReady();
114
+ try {
115
+ const metadata = {
116
+ operation: 'get',
117
+ timestamp: Date.now(),
118
+ key
119
+ };
120
+ const middlewareResult = await this.middlewareModule.dispatch({
121
+ type: 'get',
122
+ key,
123
+ metadata
124
+ });
125
+ const finalResult = await this.pluginExecutor?.executeAfterGet(key, middlewareResult, metadata) ?? middlewareResult;
126
+ await this.emitEvent({
127
+ type: StorageEvents.STORAGE_SELECT,
128
+ payload: {
129
+ key,
130
+ value: finalResult
131
+ }
132
+ });
133
+ return finalResult;
134
+ } catch (error) {
135
+ this.logger?.error('Error getting value', {
136
+ key,
137
+ error
138
+ });
139
+ throw error;
140
+ }
141
+ }
142
+ async set(key, value) {
143
+ this.ensureReady();
144
+ try {
145
+ const metadata = {
146
+ operation: 'set',
147
+ timestamp: Date.now(),
148
+ key
149
+ };
150
+ const processedValue = await this.pluginExecutor?.executeBeforeSet(value, metadata) ?? value;
151
+ const middlewareResult = await this.middlewareModule.dispatch({
152
+ type: 'set',
153
+ key,
154
+ value: processedValue,
155
+ metadata
156
+ });
157
+ if (middlewareResult === VALUE_NOT_CHANGED) return;
158
+ const finalResult = await this.pluginExecutor?.executeAfterSet(key, middlewareResult, metadata) ?? middlewareResult;
159
+ this._stateCache = await this.getRawState();
160
+ const keyStr = key.toString();
161
+ const changedPaths = [
162
+ keyStr
163
+ ];
164
+ this.notifySubscribers(key, finalResult);
165
+ this.notifySubscribers(GLOBAL_SUBSCRIPTION_KEY, {
166
+ type: StorageEvents.STORAGE_UPDATE,
167
+ key,
168
+ value: finalResult,
169
+ changedPaths
170
+ });
171
+ await this.emitEvent({
172
+ type: StorageEvents.STORAGE_UPDATE,
173
+ payload: {
174
+ key,
175
+ value: finalResult,
176
+ changedPaths
177
+ }
178
+ });
179
+ } catch (error) {
180
+ this.logger?.error('Error setting value', {
181
+ key,
182
+ error
183
+ });
184
+ throw error;
185
+ }
186
+ }
187
+ async update(updater) {
188
+ this.ensureReady();
189
+ try {
190
+ const metadata = {
191
+ operation: 'update',
192
+ timestamp: Date.now()
193
+ };
194
+ const currentState = await this.getState();
195
+ const newState = createLazyClone(currentState);
196
+ updater(newState);
197
+ const changedPaths = findChangedPaths(currentState, newState);
198
+ if (changedPaths.size === 0) {
199
+ if (this.logger?.debug) {
200
+ this.logger.debug('No changes detected in update');
201
+ }
202
+ return;
203
+ }
204
+ if (this.logger?.debug) {
205
+ this.logger.debug('Changed paths:', {
206
+ paths: Array.from(changedPaths)
207
+ });
208
+ }
209
+ const changedTopLevelKeys = new Set();
210
+ for (const path of changedPaths){
211
+ changedTopLevelKeys.add(path.split('.')[0]);
212
+ }
213
+ const updates = await Promise.all(Array.from(changedTopLevelKeys).map(async (key)=>{
214
+ const keyMetadata = {
215
+ ...metadata,
216
+ key
217
+ };
218
+ const processedValue = await this.pluginExecutor?.executeBeforeSet(newState[key], keyMetadata) ?? newState[key];
219
+ return {
220
+ key,
221
+ value: processedValue
222
+ };
223
+ }));
224
+ const result = await this.middlewareModule.dispatch({
225
+ type: 'update',
226
+ value: updates,
227
+ metadata: {
228
+ ...metadata,
229
+ batchUpdate: true,
230
+ changedPaths: Array.from(changedPaths)
231
+ }
232
+ });
233
+ let updatedValues = {};
234
+ if (Array.isArray(result)) {
235
+ result.forEach((update)=>{
236
+ if (update && typeof update === 'object' && 'key' in update && 'value' in update) {
237
+ updatedValues[update.key] = update.value;
238
+ }
239
+ });
240
+ } else if (result && typeof result === 'object') {
241
+ updatedValues = {
242
+ ...result
243
+ };
244
+ }
245
+ const actuallyChangedKeys = Object.keys(updatedValues).filter((key)=>!isEqual(currentState[key], updatedValues[key]));
246
+ if (actuallyChangedKeys.length === 0) {
247
+ if (this.logger?.debug) {
248
+ this.logger.debug('No actual changes after middleware processing');
249
+ }
250
+ return;
251
+ }
252
+ const finalUpdates = {};
253
+ actuallyChangedKeys.forEach((key)=>{
254
+ finalUpdates[key] = updatedValues[key];
255
+ });
256
+ if (this.logger?.debug) {
257
+ this.logger.debug('Notifying subscribers about changes:', {
258
+ keys: actuallyChangedKeys
259
+ });
260
+ }
261
+ this._stateCache = {
262
+ ...currentState,
263
+ ...finalUpdates
264
+ };
265
+ this.notifySubscribers(GLOBAL_SUBSCRIPTION_KEY, {
266
+ type: StorageEvents.STORAGE_UPDATE,
267
+ key: actuallyChangedKeys,
268
+ value: finalUpdates,
269
+ changedPaths: Array.from(changedPaths)
270
+ });
271
+ for (const path of changedPaths){
272
+ try {
273
+ const topLevelKey = path.split('.')[0];
274
+ if (topLevelKey in finalUpdates) {
275
+ let value;
276
+ if (path === topLevelKey) {
277
+ value = finalUpdates[topLevelKey];
278
+ } else {
279
+ const restPath = path.substring(topLevelKey.length + 1);
280
+ value = getValueByPath(finalUpdates[topLevelKey], restPath);
281
+ }
282
+ if (value !== undefined) {
283
+ this.notifySubscribers(path, value);
284
+ }
285
+ }
286
+ } catch (error) {
287
+ this.logger?.error('Error notifying path subscribers', {
288
+ path,
289
+ error
290
+ });
291
+ }
292
+ }
293
+ await this.emitEvent({
294
+ type: StorageEvents.STORAGE_UPDATE,
295
+ payload: {
296
+ state: finalUpdates,
297
+ key: actuallyChangedKeys,
298
+ changedPaths: Array.from(changedPaths)
299
+ }
300
+ });
301
+ } catch (error) {
302
+ this.logger?.error('Error updating state', {
303
+ error
304
+ });
305
+ throw error;
306
+ }
307
+ }
308
+ async remove(key) {
309
+ this.ensureReady();
310
+ try {
311
+ const metadata = {
312
+ operation: 'delete',
313
+ timestamp: Date.now(),
314
+ key
315
+ };
316
+ const preventDeletion = await this.pluginExecutor?.executeBeforeDelete(key, metadata);
317
+ if (preventDeletion === false) return;
318
+ const middlewareResult = await this.middlewareModule.dispatch({
319
+ type: 'delete',
320
+ key,
321
+ metadata
322
+ });
323
+ if (middlewareResult === false) return;
324
+ await this.pluginExecutor?.executeAfterDelete(key, metadata);
325
+ this._stateCache = await this.getRawState();
326
+ const keyStr = key.toString();
327
+ const changedPaths = [
328
+ keyStr
329
+ ];
330
+ this.notifySubscribers(key, undefined);
331
+ this.notifySubscribers(GLOBAL_SUBSCRIPTION_KEY, {
332
+ type: StorageEvents.STORAGE_UPDATE,
333
+ key,
334
+ value: undefined,
335
+ result: middlewareResult,
336
+ changedPaths
337
+ });
338
+ await this.emitEvent({
339
+ type: StorageEvents.STORAGE_UPDATE,
340
+ payload: {
341
+ key,
342
+ value: undefined,
343
+ result: middlewareResult,
344
+ changedPaths
345
+ }
346
+ });
347
+ } catch (error) {
348
+ this.logger?.error('Error deleting value', {
349
+ key,
350
+ error
351
+ });
352
+ throw error;
353
+ }
354
+ }
355
+ async clear() {
356
+ this.ensureReady();
357
+ try {
358
+ await this.pluginExecutor?.executeOnClear();
359
+ await this.middlewareModule.dispatch({
360
+ type: 'clear'
361
+ });
362
+ this._stateCache = {};
363
+ } catch (error) {
364
+ this.logger?.error('Error clearing storage', {
365
+ error
366
+ });
367
+ throw error;
368
+ }
369
+ }
370
+ async reset() {
371
+ this.ensureReady();
372
+ try {
373
+ const initialState = this.config.initialState;
374
+ await this.middlewareModule.dispatch({
375
+ type: 'reset',
376
+ value: initialState
377
+ });
378
+ this._stateCache = initialState ? {
379
+ ...initialState
380
+ } : {};
381
+ const changedPaths = Object.keys(this._stateCache);
382
+ this.notifySubscribers(GLOBAL_SUBSCRIPTION_KEY, {
383
+ type: StorageEvents.STORAGE_CLEAR,
384
+ changedPaths
385
+ });
386
+ this.emitEvent({
387
+ type: StorageEvents.STORAGE_CLEAR,
388
+ payload: {
389
+ changedPaths
390
+ }
391
+ });
392
+ } catch (error) {
393
+ this.logger?.error('Error resetting storage', {
394
+ error
395
+ });
396
+ throw error;
397
+ }
398
+ }
399
+ async keys() {
400
+ this.ensureReady();
401
+ try {
402
+ return await this.middlewareModule.dispatch({
403
+ type: 'keys'
404
+ });
405
+ } catch (error) {
406
+ this.logger?.error('Error getting keys', {
407
+ error
408
+ });
409
+ throw error;
410
+ }
411
+ }
412
+ async has(key) {
413
+ this.ensureReady();
414
+ try {
415
+ return await this.doHas(key);
416
+ } catch (error) {
417
+ this.logger?.error('Error checking value existence', {
418
+ key,
419
+ error
420
+ });
421
+ throw error;
422
+ }
423
+ }
424
+ async getState() {
425
+ this.ensureReady();
426
+ return this.getRawState();
427
+ }
428
+ // ─── Subscriptions (async — with race condition protection) ────────────────
429
+ subscribeByKey(key, callback) {
430
+ if (!this.subscribers.has(key)) {
431
+ this.subscribers.set(key, new Set());
432
+ }
433
+ this.subscribers.get(key).add(callback);
434
+ // Запоминаем версию ключа до асинхронного get().
435
+ // Если между вызовом get() и его разрешением произойдёт set(),
436
+ // версия увеличится и мы не отправим устаревшее начальное значение.
437
+ const versionAtSubscribe = this.keyVersions.get(key) ?? 0;
438
+ this.get(key).then((value)=>{
439
+ try {
440
+ const currentVersion = this.keyVersions.get(key) ?? 0;
441
+ if (currentVersion === versionAtSubscribe) {
442
+ callback(value);
443
+ }
444
+ } catch (error) {
445
+ this.logger?.error('Error in initial callback', {
446
+ key,
447
+ error
448
+ });
449
+ }
450
+ });
451
+ return ()=>{
452
+ const subscribers = this.subscribers.get(key);
453
+ if (subscribers) {
454
+ subscribers.delete(callback);
455
+ if (subscribers.size === 0) {
456
+ this.subscribers.delete(key);
457
+ }
458
+ }
459
+ };
460
+ }
461
+ subscribeBySelector(pathSelector, callback) {
462
+ const dummyState = createDummyState();
463
+ const fullPath = extractPath(pathSelector, dummyState, this.selectorPathCache);
464
+ if (this.logger?.debug) {
465
+ this.logger.debug('Subscribing to path:', {
466
+ path: fullPath
467
+ });
468
+ }
469
+ const wrappedCallback = async (value)=>{
470
+ try {
471
+ if (value === undefined || value === null) {
472
+ const currentState = await this.getState();
473
+ const selectedValue = pathSelector(currentState);
474
+ callback(selectedValue);
475
+ return;
476
+ }
477
+ if (typeof value !== 'object' || value === null) {
478
+ callback(value);
479
+ return;
480
+ }
481
+ const currentState = await this.getState();
482
+ const selectedValue = pathSelector(currentState);
483
+ callback(selectedValue);
484
+ } catch (error) {
485
+ this.logger?.error('Error in selector callback', {
486
+ path: fullPath,
487
+ error
488
+ });
489
+ callback(value);
490
+ }
491
+ };
492
+ if (!fullPath) {
493
+ return this.subscribeToAll(()=>{
494
+ this.getState().then((state)=>{
495
+ callback(pathSelector(state));
496
+ });
497
+ });
498
+ }
499
+ return this.subscribeByKey(fullPath, wrappedCallback);
500
+ }
501
+ }
502
+
503
+ export { AsyncBaseStorage };
504
+
505
+ //# sourceMappingURL=async-base-storage.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core/storage/adapters/async-base-storage.service.js","sources":["../../../../src/core/storage/adapters/async-base-storage.service.ts"],"sourcesContent":["import { batchingMiddleware } from '../middlewares/storage-batching.middleware'\nimport { shallowCompareMiddleware } from '../middlewares/storage-shallow-compare.middleware'\nimport { IAsyncPluginExecutor } from '../modules/plugin/plugin.interface'\nimport { AsyncDefaultMiddlewares, AsyncStorageConfig, IAsyncStorage, IEventEmitter, ILogger, StorageEvents, StorageType } from '../storage.interface'\nimport { AsyncMiddlewareModule, Middleware, VALUE_NOT_CHANGED } from '../utils/middleware-module'\nimport { createDummyState, extractPath } from '../utils/path-selector.util'\nimport { createLazyClone, findChangedPaths, isEqual } from '../utils/state-diff.util'\nimport { StorageKeyType } from '../utils/storage-key'\nimport { getValueByPath } from './path.utils'\nimport { GLOBAL_SUBSCRIPTION_KEY, PathSelector, StorageCore } from './storage-core'\n\n/**\n * Базовый класс для асинхронных хранилищ (IndexedDB).\n *\n * Все CRUD-операции возвращают Promise.\n * Совместим с текущим API (переименован из BaseStorage).\n */\nexport abstract class AsyncBaseStorage<T extends Record<string, any>> extends StorageCore<T> implements IAsyncStorage<T> {\n abstract readonly type: StorageType\n\n private middlewareModule: AsyncMiddlewareModule\n private initializedMiddlewares: Middleware[] | null = null\n private selectorPathCache = new WeakMap<PathSelector<any, any>, string>()\n\n constructor(\n protected readonly config: AsyncStorageConfig<T>,\n protected readonly pluginExecutor?: IAsyncPluginExecutor,\n eventEmitter?: IEventEmitter,\n logger?: ILogger,\n ) {\n super(config, eventEmitter, logger)\n this.middlewareModule = new AsyncMiddlewareModule({\n getState: () => this.getRawState(),\n doGet: this.doGet.bind(this),\n doSet: this.doSet.bind(this),\n doUpdate: this.doUpdate.bind(this),\n doDelete: this.doDelete.bind(this),\n doClear: this.doClear.bind(this),\n doKeys: this.doKeys.bind(this),\n notifySubscribers: this.notifySubscribers.bind(this),\n })\n }\n\n // ─── Abstract async do* methods ─────────────────────────────────────────────\n\n protected abstract doGet(key: StorageKeyType): Promise<any>\n protected abstract doSet(key: StorageKeyType, value: any): Promise<void>\n protected abstract doUpdate(updates: Array<{ key: StorageKeyType; value: any }>): Promise<void>\n protected abstract doDelete(key: StorageKeyType): Promise<boolean>\n protected abstract doClear(): Promise<void>\n protected abstract doKeys(): Promise<string[]>\n protected abstract doHas(key: StorageKeyType): Promise<boolean>\n protected abstract doInitialize(): Promise<this>\n protected abstract doDestroy(): Promise<void>\n\n // ─── Lifecycle hooks ────────────────────────────────────────────────────────\n\n protected async performInitialize(): Promise<void> {\n await this.doInitialize()\n this._stateCache = await this.getRawState()\n }\n\n protected async performCleanup(): Promise<void> {\n // Обходим публичный clear() (избегая ensureReady после _isDestroyed = true)\n await this.pluginExecutor?.executeOnClear()\n await this.doClear()\n\n await this.doDestroy()\n\n if (this.initializedMiddlewares) {\n await Promise.all(\n this.initializedMiddlewares.map(async (middleware) => {\n if ('cleanup' in middleware) {\n await middleware.cleanup?.()\n }\n }),\n )\n this.initializedMiddlewares = null\n }\n }\n\n // ─── Middleware initialization ──────────────────────────────────────────────\n\n protected initializeMiddlewares(): void {\n if (this.config.middlewares && !this.initializedMiddlewares) {\n this.initializedMiddlewares = this.config.middlewares(() => this.getDefaultMiddleware())\n this.initializedMiddlewares.forEach((middleware) => this.middlewareModule.use(middleware))\n }\n }\n\n protected getDefaultMiddleware(): AsyncDefaultMiddlewares {\n return {\n batching: (options = {}) => batchingMiddleware(options),\n shallowCompare: (options = {}) => shallowCompareMiddleware(options),\n }\n }\n\n protected async initializeWithMiddlewares(): Promise<void> {\n try {\n const state = await this.getRawState()\n const hasExistingState = Object.keys(state).length > 0\n\n if (!hasExistingState && this.config.initialState) {\n await this.middlewareModule.dispatch({\n type: 'init',\n value: this.config.initialState,\n })\n }\n } catch (error) {\n this.logger?.error('Ошибка инициализации хранилища', { error })\n throw error\n }\n }\n\n // ─── Internal state access ──────────────────────────────────────────────────\n\n private async getRawState(): Promise<T> {\n try {\n const value = await this.doGet('')\n return value || {}\n } catch (error) {\n this.logger?.error('Error getting state', { error })\n throw error\n }\n }\n\n // ─── Public async API ───────────────────────────────────────────────────────\n\n public async get<R>(key: StorageKeyType): Promise<R | undefined> {\n this.ensureReady()\n\n try {\n const metadata = { operation: 'get', timestamp: Date.now(), key }\n\n const middlewareResult = await this.middlewareModule.dispatch({\n type: 'get',\n key,\n metadata,\n })\n\n const finalResult = (await this.pluginExecutor?.executeAfterGet(key, middlewareResult, metadata)) ?? middlewareResult\n\n await this.emitEvent({\n type: StorageEvents.STORAGE_SELECT,\n payload: { key, value: finalResult },\n })\n\n return finalResult\n } catch (error) {\n this.logger?.error('Error getting value', { key, error })\n throw error\n }\n }\n\n public async set<R>(key: StorageKeyType, value: R): Promise<void> {\n this.ensureReady()\n\n try {\n const metadata = { operation: 'set', timestamp: Date.now(), key }\n\n const processedValue = (await this.pluginExecutor?.executeBeforeSet(value, metadata)) ?? value\n\n const middlewareResult = await this.middlewareModule.dispatch({\n type: 'set',\n key,\n value: processedValue,\n metadata,\n })\n\n if (middlewareResult === VALUE_NOT_CHANGED) return\n\n const finalResult = (await this.pluginExecutor?.executeAfterSet(key, middlewareResult, metadata)) ?? middlewareResult\n\n this._stateCache = await this.getRawState()\n\n const keyStr = key.toString()\n const changedPaths = [keyStr]\n\n this.notifySubscribers(key, finalResult)\n\n this.notifySubscribers(GLOBAL_SUBSCRIPTION_KEY, {\n type: StorageEvents.STORAGE_UPDATE,\n key,\n value: finalResult,\n changedPaths,\n })\n\n await this.emitEvent({\n type: StorageEvents.STORAGE_UPDATE,\n payload: { key, value: finalResult, changedPaths },\n })\n } catch (error) {\n this.logger?.error('Error setting value', { key, error })\n throw error\n }\n }\n\n public async update(updater: (state: T) => void): Promise<void> {\n this.ensureReady()\n\n try {\n const metadata = { operation: 'update', timestamp: Date.now() }\n\n const currentState = (await this.getState()) as T\n const newState = createLazyClone(currentState)\n updater(newState)\n\n const changedPaths = findChangedPaths(currentState, newState)\n\n if (changedPaths.size === 0) {\n if (this.logger?.debug) {\n this.logger.debug('No changes detected in update')\n }\n return\n }\n\n if (this.logger?.debug) {\n this.logger.debug('Changed paths:', { paths: Array.from(changedPaths) })\n }\n\n const changedTopLevelKeys = new Set<string>()\n for (const path of changedPaths) {\n changedTopLevelKeys.add(path.split('.')[0])\n }\n\n const updates = await Promise.all(\n Array.from(changedTopLevelKeys).map(async (key: string) => {\n const keyMetadata = { ...metadata, key }\n const processedValue = (await this.pluginExecutor?.executeBeforeSet(newState[key], keyMetadata)) ?? newState[key]\n return { key, value: processedValue }\n }),\n )\n\n const result = await this.middlewareModule.dispatch({\n type: 'update',\n value: updates,\n metadata: {\n ...metadata,\n batchUpdate: true,\n changedPaths: Array.from(changedPaths),\n },\n })\n\n let updatedValues: Record<string, any> = {}\n if (Array.isArray(result)) {\n result.forEach((update: any) => {\n if (update && typeof update === 'object' && 'key' in update && 'value' in update) {\n updatedValues[update.key as string] = update.value\n }\n })\n } else if (result && typeof result === 'object') {\n updatedValues = { ...result }\n }\n\n const actuallyChangedKeys = Object.keys(updatedValues).filter((key) => !isEqual(currentState[key], updatedValues[key]))\n\n if (actuallyChangedKeys.length === 0) {\n if (this.logger?.debug) {\n this.logger.debug('No actual changes after middleware processing')\n }\n return\n }\n\n const finalUpdates: Record<string, any> = {}\n actuallyChangedKeys.forEach((key) => {\n finalUpdates[key] = updatedValues[key]\n })\n\n if (this.logger?.debug) {\n this.logger.debug('Notifying subscribers about changes:', { keys: actuallyChangedKeys })\n }\n\n this._stateCache = { ...currentState, ...finalUpdates } as T\n\n this.notifySubscribers(GLOBAL_SUBSCRIPTION_KEY, {\n type: StorageEvents.STORAGE_UPDATE,\n key: actuallyChangedKeys,\n value: finalUpdates,\n changedPaths: Array.from(changedPaths),\n })\n\n for (const path of changedPaths) {\n try {\n const topLevelKey = path.split('.')[0]\n if (topLevelKey in finalUpdates) {\n let value\n if (path === topLevelKey) {\n value = finalUpdates[topLevelKey]\n } else {\n const restPath = path.substring(topLevelKey.length + 1)\n value = getValueByPath(finalUpdates[topLevelKey], restPath)\n }\n if (value !== undefined) {\n this.notifySubscribers(path, value)\n }\n }\n } catch (error) {\n this.logger?.error('Error notifying path subscribers', { path, error })\n }\n }\n\n await this.emitEvent({\n type: StorageEvents.STORAGE_UPDATE,\n payload: {\n state: finalUpdates,\n key: actuallyChangedKeys,\n changedPaths: Array.from(changedPaths),\n },\n })\n } catch (error) {\n this.logger?.error('Error updating state', { error })\n throw error\n }\n }\n\n public async remove(key: StorageKeyType): Promise<void> {\n this.ensureReady()\n\n try {\n const metadata = { operation: 'delete', timestamp: Date.now(), key }\n\n const preventDeletion = await this.pluginExecutor?.executeBeforeDelete(key, metadata)\n if (preventDeletion === false) return\n\n const middlewareResult = await this.middlewareModule.dispatch({\n type: 'delete',\n key,\n metadata,\n })\n\n if (middlewareResult === false) return\n\n await this.pluginExecutor?.executeAfterDelete(key, metadata)\n\n this._stateCache = await this.getRawState()\n\n const keyStr = key.toString()\n const changedPaths = [keyStr]\n\n this.notifySubscribers(key, undefined)\n this.notifySubscribers(GLOBAL_SUBSCRIPTION_KEY, {\n type: StorageEvents.STORAGE_UPDATE,\n key,\n value: undefined,\n result: middlewareResult,\n changedPaths,\n })\n\n await this.emitEvent({\n type: StorageEvents.STORAGE_UPDATE,\n payload: { key, value: undefined, result: middlewareResult, changedPaths },\n })\n } catch (error) {\n this.logger?.error('Error deleting value', { key, error })\n throw error\n }\n }\n\n public async clear(): Promise<void> {\n this.ensureReady()\n\n try {\n await this.pluginExecutor?.executeOnClear()\n\n await this.middlewareModule.dispatch({ type: 'clear' })\n\n this._stateCache = {} as T\n } catch (error) {\n this.logger?.error('Error clearing storage', { error })\n throw error\n }\n }\n\n public async reset(): Promise<void> {\n this.ensureReady()\n\n try {\n const initialState = this.config.initialState\n\n await this.middlewareModule.dispatch({\n type: 'reset',\n value: initialState,\n })\n\n this._stateCache = initialState ? ({ ...initialState } as T) : ({} as T)\n\n const changedPaths = Object.keys(this._stateCache)\n\n this.notifySubscribers(GLOBAL_SUBSCRIPTION_KEY, {\n type: StorageEvents.STORAGE_CLEAR,\n changedPaths,\n })\n\n this.emitEvent({\n type: StorageEvents.STORAGE_CLEAR,\n payload: { changedPaths },\n })\n } catch (error) {\n this.logger?.error('Error resetting storage', { error })\n throw error\n }\n }\n\n public async keys(): Promise<string[]> {\n this.ensureReady()\n\n try {\n return await this.middlewareModule.dispatch({ type: 'keys' })\n } catch (error) {\n this.logger?.error('Error getting keys', { error })\n throw error\n }\n }\n\n public async has(key: StorageKeyType): Promise<boolean> {\n this.ensureReady()\n try {\n return await this.doHas(key)\n } catch (error) {\n this.logger?.error('Error checking value existence', { key, error })\n throw error\n }\n }\n\n public async getState(): Promise<T> {\n this.ensureReady()\n return this.getRawState()\n }\n\n // ─── Subscriptions (async — with race condition protection) ────────────────\n\n protected subscribeByKey(key: string, callback: (value: any) => void): VoidFunction {\n if (!this.subscribers.has(key)) {\n this.subscribers.set(key, new Set())\n }\n this.subscribers.get(key)!.add(callback)\n\n // Запоминаем версию ключа до асинхронного get().\n // Если между вызовом get() и его разрешением произойдёт set(),\n // версия увеличится и мы не отправим устаревшее начальное значение.\n const versionAtSubscribe = this.keyVersions.get(key) ?? 0\n\n this.get(key).then((value) => {\n try {\n const currentVersion = this.keyVersions.get(key) ?? 0\n if (currentVersion === versionAtSubscribe) {\n callback(value)\n }\n } catch (error) {\n this.logger?.error('Error in initial callback', { key, error })\n }\n })\n\n return () => {\n const subscribers = this.subscribers.get(key)\n if (subscribers) {\n subscribers.delete(callback)\n if (subscribers.size === 0) {\n this.subscribers.delete(key)\n }\n }\n }\n }\n\n protected subscribeBySelector<R>(pathSelector: PathSelector<T, R>, callback: (value: R) => void): VoidFunction {\n const dummyState = createDummyState<T>()\n const fullPath = extractPath(pathSelector, dummyState, this.selectorPathCache)\n\n if (this.logger?.debug) {\n this.logger.debug('Subscribing to path:', { path: fullPath })\n }\n\n const wrappedCallback = async (value: any) => {\n try {\n if (value === undefined || value === null) {\n const currentState = (await this.getState()) as T\n const selectedValue = pathSelector(currentState)\n callback(selectedValue as R)\n return\n }\n\n if (typeof value !== 'object' || value === null) {\n callback(value as R)\n return\n }\n\n const currentState = (await this.getState()) as T\n const selectedValue = pathSelector(currentState)\n callback(selectedValue as R)\n } catch (error) {\n this.logger?.error('Error in selector callback', { path: fullPath, error })\n callback(value as R)\n }\n }\n\n if (!fullPath) {\n return this.subscribeToAll(() => {\n this.getState().then((state) => {\n callback(pathSelector(state as T))\n })\n })\n }\n\n return this.subscribeByKey(fullPath, wrappedCallback)\n }\n}\n"],"names":["batchingMiddleware","shallowCompareMiddleware","StorageEvents","AsyncMiddlewareModule","VALUE_NOT_CHANGED","createDummyState","extractPath","createLazyClone","findChangedPaths","isEqual","getValueByPath","GLOBAL_SUBSCRIPTION_KEY","StorageCore","AsyncBaseStorage","WeakMap","config","pluginExecutor","eventEmitter","logger","Promise","middleware","options","state","hasExistingState","Object","error","value","key","metadata","Date","middlewareResult","finalResult","processedValue","keyStr","changedPaths","updater","currentState","newState","Array","changedTopLevelKeys","Set","path","updates","keyMetadata","result","updatedValues","update","actuallyChangedKeys","finalUpdates","topLevelKey","restPath","undefined","preventDeletion","initialState","callback","versionAtSubscribe","currentVersion","subscribers","pathSelector","dummyState","fullPath","wrappedCallback","selectedValue"],"mappings":"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"}