@fozy-labs/rx-toolkit 0.5.4 → 0.6.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 (302) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +22 -13
  3. package/dist/common/devtools/reduxDevtools.js +17 -2
  4. package/dist/common/react/index.d.ts +1 -0
  5. package/dist/common/react/index.js +1 -0
  6. package/dist/common/react/useIsomorphicLayoutEffect.d.ts +17 -0
  7. package/dist/common/react/useIsomorphicLayoutEffect.js +17 -0
  8. package/dist/index.d.ts +1 -2
  9. package/dist/index.js +1 -2
  10. package/dist/query/api/createApi.d.ts +4 -0
  11. package/dist/query/api/createApi.js +9 -0
  12. package/dist/query/api/index.d.ts +1 -0
  13. package/dist/query/api/index.js +1 -0
  14. package/dist/query/constants.d.ts +12 -0
  15. package/dist/query/constants.js +15 -0
  16. package/dist/query/core/api/Api.d.ts +20 -0
  17. package/dist/query/core/api/Api.js +129 -0
  18. package/dist/query/core/api/constants.d.ts +2 -0
  19. package/dist/query/core/api/constants.js +3 -0
  20. package/dist/query/core/api/index.d.ts +4 -0
  21. package/dist/query/core/api/index.js +4 -0
  22. package/dist/query/core/api/mergeHooks.d.ts +2 -0
  23. package/dist/query/core/api/mergeHooks.js +26 -0
  24. package/dist/query/core/api/normalizeLinks.d.ts +2 -0
  25. package/dist/query/core/api/normalizeLinks.js +11 -0
  26. package/dist/query/core/cache/CacheEntry.d.ts +21 -0
  27. package/dist/query/core/cache/CacheEntry.js +54 -0
  28. package/dist/query/core/cache/CacheMap.d.ts +19 -0
  29. package/dist/query/core/cache/CacheMap.js +32 -0
  30. package/dist/query/core/cache/QueryCacheEntry.d.ts +21 -0
  31. package/dist/query/core/cache/QueryCacheEntry.js +136 -0
  32. package/dist/query/core/cache/index.d.ts +3 -0
  33. package/dist/query/core/cache/index.js +3 -0
  34. package/dist/query/core/command/Command.d.ts +67 -0
  35. package/dist/query/core/command/Command.js +253 -0
  36. package/dist/query/core/command/CommandAgent.d.ts +17 -0
  37. package/dist/query/core/command/CommandAgent.js +67 -0
  38. package/dist/query/core/command/LinkManager.d.ts +24 -0
  39. package/dist/query/core/command/LinkManager.js +71 -0
  40. package/dist/query/core/command/index.d.ts +2 -0
  41. package/dist/query/core/command/index.js +2 -0
  42. package/dist/query/core/errors/CacheEntryRemovedError.d.ts +7 -0
  43. package/dist/query/core/errors/CacheEntryRemovedError.js +9 -0
  44. package/dist/query/core/errors/MachineStateError.d.ts +8 -0
  45. package/dist/query/core/errors/MachineStateError.js +10 -0
  46. package/dist/query/core/errors/MachineTransitionError.d.ts +7 -0
  47. package/dist/query/core/errors/MachineTransitionError.js +9 -0
  48. package/dist/query/core/errors/index.d.ts +3 -0
  49. package/dist/query/core/errors/index.js +3 -0
  50. package/dist/query/core/index.d.ts +8 -0
  51. package/dist/query/core/index.js +8 -0
  52. package/dist/query/core/machine/Machine.d.ts +21 -0
  53. package/dist/query/core/machine/Machine.js +42 -0
  54. package/dist/query/core/machine/MachineBase.d.ts +31 -0
  55. package/dist/query/core/machine/MachineBase.js +176 -0
  56. package/dist/query/core/machine/MachineError.d.ts +10 -0
  57. package/dist/query/core/machine/MachineError.js +19 -0
  58. package/dist/query/core/machine/MachinePending.d.ts +13 -0
  59. package/dist/query/core/machine/MachinePending.js +32 -0
  60. package/dist/query/core/machine/MachineRefreshError.d.ts +12 -0
  61. package/dist/query/core/machine/MachineRefreshError.js +23 -0
  62. package/dist/query/core/machine/MachineRefreshing.d.ts +15 -0
  63. package/dist/query/core/machine/MachineRefreshing.js +43 -0
  64. package/dist/query/core/machine/MachineSuccess.d.ts +12 -0
  65. package/dist/query/core/machine/MachineSuccess.js +23 -0
  66. package/dist/query/core/machine/MachineWithData.d.ts +25 -0
  67. package/dist/query/core/machine/MachineWithData.js +73 -0
  68. package/dist/query/core/machine/index.d.ts +9 -0
  69. package/dist/query/core/machine/index.js +9 -0
  70. package/dist/query/core/machine/machine-helpers.d.ts +9 -0
  71. package/dist/query/core/machine/machine-helpers.js +80 -0
  72. package/dist/query/core/patcher/Patcher.d.ts +30 -0
  73. package/dist/query/core/patcher/Patcher.js +122 -0
  74. package/dist/query/core/patcher/index.d.ts +1 -0
  75. package/dist/query/core/patcher/index.js +1 -0
  76. package/dist/query/core/resource/Resource.d.ts +105 -0
  77. package/dist/query/core/resource/Resource.js +340 -0
  78. package/dist/query/core/resource/ResourceAgent.d.ts +37 -0
  79. package/dist/query/core/resource/ResourceAgent.js +179 -0
  80. package/dist/query/core/resource/index.d.ts +2 -0
  81. package/dist/query/core/resource/index.js +2 -0
  82. package/dist/query/core/snapshoter/Snapshoter.d.ts +22 -0
  83. package/dist/query/core/snapshoter/Snapshoter.js +78 -0
  84. package/dist/query/core/snapshoter/index.d.ts +2 -0
  85. package/dist/query/core/snapshoter/index.js +1 -0
  86. package/dist/query/core/syncer/Syncer.d.ts +32 -0
  87. package/dist/query/core/syncer/Syncer.js +85 -0
  88. package/dist/query/core/syncer/index.d.ts +2 -0
  89. package/dist/query/core/syncer/index.js +1 -0
  90. package/dist/query/index.d.ts +5 -10
  91. package/dist/query/index.js +5 -13
  92. package/dist/query/lib/broadcastSyncDriver.d.ts +5 -0
  93. package/dist/query/lib/broadcastSyncDriver.js +46 -0
  94. package/dist/query/lib/index.d.ts +3 -0
  95. package/dist/query/lib/index.js +3 -0
  96. package/dist/{query-v2 → query}/lib/stableStringify.js +5 -3
  97. package/dist/query/lib/toKeyed.d.ts +11 -0
  98. package/dist/query/lib/toKeyed.js +18 -0
  99. package/dist/query/react/ReactHooksPlugin.d.ts +31 -0
  100. package/dist/query/react/ReactHooksPlugin.js +21 -0
  101. package/dist/query/react/index.d.ts +3 -0
  102. package/dist/query/react/index.js +3 -0
  103. package/dist/query/react/useCommand.d.ts +2 -0
  104. package/dist/query/react/useCommand.js +14 -0
  105. package/dist/query/react/useResource.d.ts +2 -0
  106. package/dist/query/react/useResource.js +16 -0
  107. package/dist/query/types/api.d.ts +39 -0
  108. package/dist/query/types/cache.d.ts +51 -0
  109. package/dist/query/types/command.d.ts +52 -0
  110. package/dist/query/types/common.d.ts +65 -0
  111. package/dist/query/types/index.d.ts +8 -4
  112. package/dist/query/types/index.js +8 -5
  113. package/dist/query/types/plugin-hkt.d.ts +64 -0
  114. package/dist/query/types/resource.d.ts +49 -0
  115. package/dist/query/types/snapshot.d.ts +27 -0
  116. package/dist/query/types/snapshot.js +2 -0
  117. package/dist/query/types/state.d.ts +24 -0
  118. package/dist/signals/base/ComputeCache.js +1 -1
  119. package/dist/signals/base/Devtools.js +2 -6
  120. package/dist/signals/signals/Computed.d.ts +1 -0
  121. package/dist/signals/signals/Computed.js +5 -1
  122. package/dist/signals/signals/Effect.d.ts +0 -4
  123. package/dist/signals/signals/Effect.js +0 -6
  124. package/dist/signals/signals/LocalState.d.ts +1 -10
  125. package/dist/signals/signals/LocalState.js +0 -12
  126. package/dist/signals/signals/Signal.d.ts +2 -8
  127. package/dist/signals/signals/Signal.js +1 -10
  128. package/dist/signals/signals/State.d.ts +2 -1
  129. package/dist/signals/signals/State.js +9 -0
  130. package/dist/signals/types/SignalOptions.d.ts +0 -2
  131. package/dist/signals/types/normalizeSignalOptions.js +0 -3
  132. package/dist/signals/types/signals.types.d.ts +3 -1
  133. package/docs/CHANGELOG.md +48 -2
  134. package/docs/migrations/0.6.0.md +224 -0
  135. package/docs/query/README.md +52 -562
  136. package/docs/query/api/README.md +59 -0
  137. package/docs/query/api/_CacheEntry.md +39 -0
  138. package/docs/query/api/_CacheMap.md +30 -0
  139. package/docs/query/api/_QueryCacheEntry.md +81 -0
  140. package/docs/query/api/command-agent.md +60 -0
  141. package/docs/query/api/command.md +76 -0
  142. package/docs/query/api/resource-agent.md +68 -0
  143. package/docs/query/api/resource.md +77 -0
  144. package/docs/query/concepts/agent.md +70 -0
  145. package/docs/query/concepts/architecture.md +139 -0
  146. package/docs/query/concepts/cache.md +81 -0
  147. package/docs/query/concepts/dataflows.md +473 -0
  148. package/docs/query/concepts/keyed.md +42 -0
  149. package/docs/query/concepts/machine.md +106 -0
  150. package/docs/query/concepts/patching.md +85 -0
  151. package/docs/query/usage/broadcast.md +188 -0
  152. package/docs/query/usage/command.md +203 -0
  153. package/docs/query/usage/lifecycle.md +114 -0
  154. package/docs/query/usage/links.md +125 -0
  155. package/docs/query/usage/plugins.md +96 -0
  156. package/docs/query/usage/resource.md +206 -0
  157. package/docs/query/usage/snapshot.md +80 -0
  158. package/docs/usage/react/README.md +45 -91
  159. package/package.json +5 -7
  160. package/dist/query/SKIP_TOKEN.d.ts +0 -1
  161. package/dist/query/SKIP_TOKEN.js +0 -1
  162. package/dist/query/api/createCommand.d.ts +0 -21
  163. package/dist/query/api/createCommand.js +0 -20
  164. package/dist/query/api/createOperation.d.ts +0 -5
  165. package/dist/query/api/createOperation.js +0 -6
  166. package/dist/query/api/createResource.d.ts +0 -3
  167. package/dist/query/api/createResource.js +0 -2
  168. package/dist/query/api/createResourceDuplicator.d.ts +0 -4
  169. package/dist/query/api/createResourceDuplicator.js +0 -2
  170. package/dist/query/api/resetAllQueriesCache.d.ts +0 -1
  171. package/dist/query/api/resetAllQueriesCache.js +0 -4
  172. package/dist/query/core/Command/Command.d.ts +0 -35
  173. package/dist/query/core/Command/Command.js +0 -210
  174. package/dist/query/core/Command/CommandAgent.d.ts +0 -19
  175. package/dist/query/core/Command/CommandAgent.js +0 -54
  176. package/dist/query/core/Command/index.d.ts +0 -2
  177. package/dist/query/core/Command/index.js +0 -2
  178. package/dist/query/core/Operation/Operation.d.ts +0 -8
  179. package/dist/query/core/Operation/Operation.js +0 -4
  180. package/dist/query/core/Operation/OperationAgent.d.ts +0 -4
  181. package/dist/query/core/Operation/OperationAgent.js +0 -4
  182. package/dist/query/core/QueriesCache.d.ts +0 -9
  183. package/dist/query/core/QueriesCache.js +0 -28
  184. package/dist/query/core/QueriesLifetimeHooks.d.ts +0 -22
  185. package/dist/query/core/QueriesLifetimeHooks.js +0 -86
  186. package/dist/query/core/ResetAllQueriesSignal.d.ts +0 -6
  187. package/dist/query/core/ResetAllQueriesSignal.js +0 -11
  188. package/dist/query/core/Resource/Resource.d.ts +0 -51
  189. package/dist/query/core/Resource/Resource.js +0 -232
  190. package/dist/query/core/Resource/ResourceAgent.d.ts +0 -35
  191. package/dist/query/core/Resource/ResourceAgent.js +0 -110
  192. package/dist/query/core/Resource/ResourceDuplicator.d.ts +0 -73
  193. package/dist/query/core/Resource/ResourceDuplicator.js +0 -227
  194. package/dist/query/core/Resource/ResourceDuplicatorAgent.d.ts +0 -35
  195. package/dist/query/core/Resource/ResourceDuplicatorAgent.js +0 -110
  196. package/dist/query/core/Resource/ResourceRef.d.ts +0 -16
  197. package/dist/query/core/Resource/ResourceRef.js +0 -136
  198. package/dist/query/lib/IndirectMap.d.ts +0 -19
  199. package/dist/query/lib/IndirectMap.js +0 -88
  200. package/dist/query/lib/ReactiveCache.d.ts +0 -62
  201. package/dist/query/lib/ReactiveCache.js +0 -80
  202. package/dist/query/react/useCommandAgent.d.ts +0 -24
  203. package/dist/query/react/useCommandAgent.js +0 -39
  204. package/dist/query/react/useOperationAgent.d.ts +0 -6
  205. package/dist/query/react/useOperationAgent.js +0 -6
  206. package/dist/query/react/useResourceAgent.d.ts +0 -6
  207. package/dist/query/react/useResourceAgent.js +0 -31
  208. package/dist/query/react/useResourceRef.d.ts +0 -5
  209. package/dist/query/react/useResourceRef.js +0 -13
  210. package/dist/query/types/Command.types.d.ts +0 -154
  211. package/dist/query/types/Command.types.js +0 -1
  212. package/dist/query/types/Operation.types.d.ts +0 -13
  213. package/dist/query/types/Operation.types.js +0 -1
  214. package/dist/query/types/Resource.types.d.ts +0 -129
  215. package/dist/query/types/Resource.types.js +0 -1
  216. package/dist/query/types/shared.types.d.ts +0 -26
  217. package/dist/query/types/shared.types.js +0 -1
  218. package/dist/query-v2/api/createApi.d.ts +0 -10
  219. package/dist/query-v2/api/createApi.js +0 -83
  220. package/dist/query-v2/core/common/CacheEntry.d.ts +0 -29
  221. package/dist/query-v2/core/common/CacheEntry.js +0 -71
  222. package/dist/query-v2/core/common/CacheMap.d.ts +0 -38
  223. package/dist/query-v2/core/common/CacheMap.js +0 -127
  224. package/dist/query-v2/core/common/LifecycleHooks.d.ts +0 -22
  225. package/dist/query-v2/core/common/LifecycleHooks.js +0 -104
  226. package/dist/query-v2/core/common/index.d.ts +0 -3
  227. package/dist/query-v2/core/common/index.js +0 -3
  228. package/dist/query-v2/core/index.d.ts +0 -3
  229. package/dist/query-v2/core/index.js +0 -3
  230. package/dist/query-v2/core/machines/Machine.d.ts +0 -14
  231. package/dist/query-v2/core/machines/Machine.js +0 -33
  232. package/dist/query-v2/core/machines/MachineError.d.ts +0 -11
  233. package/dist/query-v2/core/machines/MachineError.js +0 -26
  234. package/dist/query-v2/core/machines/MachineIdle.d.ts +0 -8
  235. package/dist/query-v2/core/machines/MachineIdle.js +0 -19
  236. package/dist/query-v2/core/machines/MachinePending.d.ts +0 -12
  237. package/dist/query-v2/core/machines/MachinePending.js +0 -29
  238. package/dist/query-v2/core/machines/MachineRefreshing.d.ts +0 -14
  239. package/dist/query-v2/core/machines/MachineRefreshing.js +0 -46
  240. package/dist/query-v2/core/machines/MachineSuccess.d.ts +0 -16
  241. package/dist/query-v2/core/machines/MachineSuccess.js +0 -42
  242. package/dist/query-v2/core/machines/MachineWithData.d.ts +0 -18
  243. package/dist/query-v2/core/machines/MachineWithData.js +0 -40
  244. package/dist/query-v2/core/machines/Patcher.d.ts +0 -20
  245. package/dist/query-v2/core/machines/Patcher.js +0 -104
  246. package/dist/query-v2/core/machines/index.d.ts +0 -8
  247. package/dist/query-v2/core/machines/index.js +0 -8
  248. package/dist/query-v2/core/resource/ResourceV2.d.ts +0 -120
  249. package/dist/query-v2/core/resource/ResourceV2.js +0 -464
  250. package/dist/query-v2/core/resource/ResourceV2Agent.d.ts +0 -26
  251. package/dist/query-v2/core/resource/ResourceV2Agent.js +0 -132
  252. package/dist/query-v2/core/resource/index.d.ts +0 -2
  253. package/dist/query-v2/core/resource/index.js +0 -2
  254. package/dist/query-v2/index.d.ts +0 -11
  255. package/dist/query-v2/index.js +0 -17
  256. package/dist/query-v2/lib/NO_VALUE.d.ts +0 -2
  257. package/dist/query-v2/lib/NO_VALUE.js +0 -1
  258. package/dist/query-v2/lib/SKIP_TOKEN.d.ts +0 -2
  259. package/dist/query-v2/lib/SKIP_TOKEN.js +0 -1
  260. package/dist/query-v2/lib/index.d.ts +0 -4
  261. package/dist/query-v2/lib/index.js +0 -3
  262. package/dist/query-v2/plugins/ReactHooksPlugin.d.ts +0 -25
  263. package/dist/query-v2/plugins/ReactHooksPlugin.js +0 -19
  264. package/dist/query-v2/plugins/types.d.ts +0 -1
  265. package/dist/query-v2/react/__tests__/helpers.d.ts +0 -12
  266. package/dist/query-v2/react/__tests__/helpers.js +0 -33
  267. package/dist/query-v2/react/index.d.ts +0 -2
  268. package/dist/query-v2/react/index.js +0 -2
  269. package/dist/query-v2/react/useResourceV2Agent.d.ts +0 -12
  270. package/dist/query-v2/react/useResourceV2Agent.js +0 -36
  271. package/dist/query-v2/react/useResourceV2Ref.d.ts +0 -12
  272. package/dist/query-v2/react/useResourceV2Ref.js +0 -57
  273. package/dist/query-v2/snapshot/Snapshot.d.ts +0 -13
  274. package/dist/query-v2/snapshot/Snapshot.js +0 -76
  275. package/dist/query-v2/types/agent.types.d.ts +0 -54
  276. package/dist/query-v2/types/api.types.d.ts +0 -22
  277. package/dist/query-v2/types/cache.types.d.ts +0 -37
  278. package/dist/query-v2/types/index.d.ts +0 -9
  279. package/dist/query-v2/types/index.js +0 -9
  280. package/dist/query-v2/types/lifecycle.types.d.ts +0 -25
  281. package/dist/query-v2/types/machine.types.d.ts +0 -67
  282. package/dist/query-v2/types/plugin.types.d.ts +0 -38
  283. package/dist/query-v2/types/resource.types.d.ts +0 -35
  284. package/dist/query-v2/types/resource.types.js +0 -1
  285. package/dist/query-v2/types/shared.types.d.ts +0 -20
  286. package/dist/query-v2/types/shared.types.js +0 -1
  287. package/dist/query-v2/types/snapshot.types.d.ts +0 -21
  288. package/dist/query-v2/types/snapshot.types.js +0 -1
  289. package/docs/contributing/query-v2/README.md +0 -379
  290. package/docs/migrations/query-v2.md +0 -171
  291. package/docs/query-v2/README.md +0 -280
  292. package/docs/query-v2/api-reference.md +0 -235
  293. package/docs/query-v2/optimistic-updates.md +0 -148
  294. package/docs/query-v2/ssr.md +0 -130
  295. /package/dist/{query-v2 → query}/lib/stableStringify.d.ts +0 -0
  296. /package/dist/{query-v2/plugins/types.js → query/types/api.js} +0 -0
  297. /package/dist/{query-v2/types/agent.types.js → query/types/cache.js} +0 -0
  298. /package/dist/{query-v2/types/api.types.js → query/types/command.js} +0 -0
  299. /package/dist/{query-v2/types/cache.types.js → query/types/common.js} +0 -0
  300. /package/dist/{query-v2/types/lifecycle.types.js → query/types/plugin-hkt.js} +0 -0
  301. /package/dist/{query-v2/types/machine.types.js → query/types/resource.js} +0 -0
  302. /package/dist/{query-v2/types/plugin.types.js → query/types/state.js} +0 -0
@@ -0,0 +1,39 @@
1
+ # Запись кэша (CacheEntry) — API
2
+
3
+ Базовый реактивный контейнер, хранящий произвольное состояние `TState` с автоматической сборкой мусора (GC).
4
+
5
+
6
+ ## Опции
7
+
8
+ | Опция | Тип | По умолчанию | Описание |
9
+ |----------------------|-----------------------------|---------------------|---------------------------------------------------------------------------------------------------------|
10
+ | `initialState` | `TState` | (Обязательное поле) | Начальное состояние. Устанавливается при создании записи. |
11
+ | `retentionTime` | `number \| false` | (Обязательное поле) | Время (мс) удержания записи после отписки последнего подписчика. `false` — не удалять. |
12
+ | `devtoolsKey` | `string` | (Обязательное поле) | Ключ для отображения в DevTools. |
13
+ | `beforeDevtoolsPush` | `(state: TState) => TState` | — | Функция для изменения состояния перед отправкой в DevTools. Полезно для удаления чувствительных данных. |
14
+
15
+
16
+ ## Свойства
17
+
18
+ | Свойство | Тип | Описание |
19
+ |--------------|------------------------|------------------------------------------------------------------------------|
20
+ | `state$` | `SignalFn<TState>` | Реактивный сигнал текущего состояния. Обновляется при каждом `set()`. |
21
+ | `completed$` | `Subject<void>` | Срабатывает один раз при удалении записи. Используется для очистки подписок. |
22
+
23
+
24
+ ## Методы
25
+
26
+ | Метод | Параметры | Возвращаемое значение | Описание |
27
+ |------------|----------------|-----------------------|-------------------------------------------------------|
28
+ | `peek` | — | `TState` | Синхронный снимок состояния без реактивной подписки. |
29
+ | `set` | `state: TState`| `void` | Обновляет состояние. Игнорируется после `complete()`. |
30
+ | `complete` | — | `void` | Завершает жизненный цикл. |
31
+
32
+
33
+ ## См. также
34
+
35
+ - [CacheMap — API](./_CacheMap.md) — контейнер, хранящий записи кэша по ключам
36
+ - [QueryCacheEntry — API](./_QueryCacheEntry.md) — расширение CacheEntry для query-слоя
37
+ - [Кэш (концепция)](../concepts/cache.md) — общая архитектура кэша
38
+ - [Машина состояний](../concepts/machine.md) — жизненный цикл состояния записи
39
+ - [Архитектура](../concepts/architecture.md) — обзор архитектуры query-модуля
@@ -0,0 +1,30 @@
1
+ # CacheMap — API
2
+
3
+ Простой контейнер, мапящий значения на записи кэша.
4
+
5
+
6
+ ## Создание
7
+
8
+ ```ts
9
+ const cacheMap = new CacheMap<TValue>();
10
+ ```
11
+
12
+ ## Методы
13
+
14
+ | Метод | Параметры | Возвращаемое значение | Описание |
15
+ |---------------|----------------------------------------|-----------------------------|-----------------------------------------------------------------------------------------|
16
+ | `get` | `key: string` | `TValue \| undefined` | Возвращает запись по ключу. Если записи нет, возвращает `undefined`. |
17
+ | `set` | `key: string, value: TValue` | `void` | Устанавливает запись по ключу. |
18
+ | `delete` | `key: string` | `boolean` | Удаляет запись по ключу. Возвращает `true`, если запись была удалена, иначе `false`. |
19
+ | `has` | `key: string` | `boolean` | Проверяет наличие записи. |
20
+ | `clear` | — | `void` | Удаляет все записи. |
21
+ | `size` | — | `number` (readonly) | Количество записей. |
22
+ | `values` | — | `IterableIterator<TEntry>` | Итератор по всем записям. |
23
+
24
+
25
+ ## См. также
26
+
27
+ - [CacheEntry — API](./_CacheEntry.md) — базовый реактивный контейнер записи кэша
28
+ - [QueryCacheEntry — API](./_QueryCacheEntry.md) — расширение CacheEntry для query-слоя
29
+ - [Кэш (концепция)](../concepts/cache.md) — общая архитектура кэша
30
+ - [Архитектура](../concepts/architecture.md) — обзор архитектуры query-модуля
@@ -0,0 +1,81 @@
1
+ # Запись кэша запроса (QueryCacheEntry) — API
2
+
3
+ Расширяет [CacheEntry][cache-entry-api],
4
+ добавляя жизненный цикл запроса: выполнение `queryFn`,
5
+ дедупликация, прерывание, [патчинг][patching-concept]
6
+ и интеграция с [машиной состояний][machine-concept].
7
+ Используется [ресурсом][resource-api] и [командой][command-api].
8
+
9
+
10
+ ## Опции
11
+
12
+ | Опция | Тип | По умолчанию | Описание |
13
+ |----------------------|--------------------------------------------------------------------|---------------------|---------------------------------------------------------------------------------------------------------|
14
+ | `queryFn` | `(keyedArgs: Keyed<TArgs>, signal: AbortSignal) => Promise<TData>` | (Обязательное поле) | Функция для получения данных. Принимает аргументы и сигнал прерывания. |
15
+ | `retentionTime` | `number \| false` | (Обязательное поле) | Время (мс) удержания записи после отписки последнего подписчика. `false` — не удалять. |
16
+ | `keyedArgs` | `Keyed<TArgs>` | (Обязательное поле) | Аргументы для `queryFn`. Используются для дедупликации и отображения в DevTools. |
17
+ | `resourceKey` | `string` | — | Ключ для отображения в DevTools. |
18
+ | `initialMachine` | `IMachine<TArgs, TData>` | — | Машина состояний для инициализации записи. |
19
+ | `beforeDevtoolsPush` | `(state: TState) => TState` | — | Функция для изменения состояния перед отправкой в DevTools. Полезно для удаления чувствительных данных. |
20
+
21
+
22
+ ## Свойства
23
+
24
+ | Свойство | Тип | Описание |
25
+ |------------|----------------------------------------------|-------------------------------------------------------------|
26
+ | `keyedArgs` | `Keyed<TArgs>` | Аргументы, с которыми была создана запись. |
27
+ | `machine$` | `SignalFn<TMachineInstance<TArgs, TData>>` | Реактивный сигнал состояния [машины][machine-concept]. |
28
+
29
+ > Наследуемые свойства `state$`, `completed$` — см. [CacheEntry][cache-entry-api].
30
+
31
+
32
+ ## Методы
33
+
34
+ | Метод | Параметры | Возвращаемое значение | Описание |
35
+ |---------------|-------------------------------|-----------------------|---------------------------------------------------------------------|
36
+ | `refresh` | — | `void` | Переводит запись в `refreshing` и перезапрашивает данные. |
37
+ | `retry` | — | `void` | Перезапускает запрос после ошибки. |
38
+ | `createPatch` | `patchFn: (data: TData) => void` | `IPatchHandle \| null` | Создаёт оптимистичный. См. [Патчинг][patching-section]. |
39
+
40
+
41
+ > Наследуемые `peek()`, `set()`, `complete()` — см. [CacheEntry][cache-entry-api].
42
+
43
+
44
+ ## Выполнение запроса
45
+
46
+ При создании записи `queryFn` вызывается автоматически, если `initialState` **не** было указано.
47
+
48
+ Принудительный запрос (`refresh()`) прерывает текущий запрос через `AbortSignal` и запускает новый.
49
+
50
+ Если результат приходит от уже прерванного запроса (stale-check),
51
+ он игнорируется — запись принимает только данные от актуального запроса.
52
+
53
+
54
+ > Запись может быть инициализирована из снапшота — например, при [кросс-табовой синхронизации][broadcast-usage] или при восстановлении состояния.
55
+
56
+
57
+ ## Патчинг
58
+
59
+ Подробности — см. [патчинг][patching-concept].
60
+
61
+
62
+ ## См. также
63
+
64
+ - [CacheEntry — API][cache-entry-api]
65
+ - [CacheMap — API][cache-map-api]
66
+ - [Машина состояний][machine-concept]
67
+ - [Патчинг][patching-concept]
68
+ - [Ресурс — API][resource-api]
69
+ - [Команда — API][command-api]
70
+
71
+ ---
72
+
73
+ [cache-entry-api]: ./_CacheEntry.md
74
+ [cache-map-api]: ./_CacheMap.md
75
+ [machine-concept]: ../concepts/machine.md
76
+ [patching-concept]: ../concepts/patching.md
77
+ [resource-api]: ./resource.md
78
+ [command-api]: ./command.md
79
+ [query-execution]: #выполнение-запроса
80
+ [patching-section]: #патчинг
81
+ [broadcast-usage]: ../usage/broadcast.md
@@ -0,0 +1,60 @@
1
+ # Агент команды (CommandAgent) — API
2
+
3
+ Агент команды — реактивный наблюдатель, транслирующий состояние [записи кэша][cache] команды в плоский сигнал. В отличие от [агента ресурса][resource-agent], агент команды не поддерживает SKIP и SWR-fallback — мутации запускаются явно через `trigger`. Концепция и жизненный цикл описаны в [concepts/agent.md][agent-concept].
4
+
5
+
6
+ ## Создание
7
+
8
+ ```typescript
9
+ const agent = addTodoCommand.createAgent({ key: 'my-mutation-1' });
10
+ ```
11
+
12
+ Метод `createAgent()` доступен у каждой [команды][api-cmd]. Принимает опциональный объект с полем `key` — строковый идентификатор кэш-записи, за которой агент будет наблюдать.
13
+
14
+
15
+ ## Методы
16
+
17
+ | Метод | Сигнатура | Описание |
18
+ |-------|-----------|----------|
19
+ | `state$` | `() => TCommandAgentState<TArgs, TData>` | Вычисляемый сигнал. Возвращает текущее состояние агента. |
20
+ | `trigger` | `(args: TArgs, key?: string) => Promise<TData>` | Запускает мутацию с указанными аргументами. Необязательный `key` переключает агент на другую кэш-запись перед выполнением. Возвращает промис с результатом. |
21
+ | `setKey` | `(key: string) => void` | Переключает наблюдение на другую кэш-запись по ключу. |
22
+
23
+
24
+ ## Состояние (TCommandAgentState)
25
+
26
+ | Поле | Тип | Описание |
27
+ |------|-----------------------------------------------|----------|
28
+ | `status` | `"idle" \| "pending" \| "success" \| "error"` | Текущий статус агента. |
29
+ | `data` | `TData \| null` | Данные результата мутации. `null` до завершения. |
30
+ | `error` | `unknown` | Ошибка мутации. `null` в `idle` / `pending` / `success`. |
31
+ | `args` | `TArgs \| null` | Аргументы последнего вызова `trigger`. `null` в `idle`. |
32
+ | `isLoading` | `boolean` | `true`, пока мутация выполняется (`pending`). |
33
+ | `isSuccess` | `boolean` | `true`, если мутация завершилась успешно. |
34
+ | `isError` | `boolean` | `true`, если мутация завершилась ошибкой. |
35
+ | `entry` | `QueryCacheEntry<TArgs, TData> \| null` | Текущая запись кэша. `null` в `idle`. |
36
+
37
+
38
+ ## Статусы
39
+
40
+ | Статус | `isLoading` | `isSuccess` | `isError` | Описание |
41
+ |--------|:-----------:|:-----------:|:---------:|----------|
42
+ | `idle` | — | — | — | Мутация не запускалась или ключ не привязан. |
43
+ | `pending` | ✓ | — | — | Мутация выполняется. |
44
+ | `success` | — | ✓ | — | Мутация завершилась успешно, данные доступны в `data`. |
45
+ | `error` | — | — | ✓ | Мутация завершилась ошибкой. |
46
+
47
+
48
+ ## См. также
49
+
50
+ - [Концепция агента][agent-concept] — жизненный цикл, SWR-fallback (только ресурсы)
51
+ - [Агент ресурса — API][resource-agent] — аналог для операций чтения
52
+ - [Команда — API][api-cmd] — создание команды и метод `createAgent()`
53
+ - [Использование команд][usage-cmd] — хук `useCommand`, примеры, паттерны
54
+
55
+
56
+ [agent-concept]: ../concepts/agent.md
57
+ [resource-agent]: ./resource-agent.md
58
+ [api-cmd]: ./command.md
59
+ [usage-cmd]: ../usage/command.md
60
+ [cache]: ../concepts/cache.md
@@ -0,0 +1,76 @@
1
+ # Команда (Command) — API
2
+
3
+ Команда — абстракция для операций записи (мутаций). Примеры и паттерны — см. [руководство по использованию][usage].
4
+
5
+
6
+ ## Создание
7
+
8
+ ```typescript
9
+ const addTodoCommand = api.createCommand({
10
+ queryFn: async (args: { text: string }) => {
11
+ const res = await fetch('/api/todos', {
12
+ method: 'POST',
13
+ headers: { 'Content-Type': 'application/json' },
14
+ body: JSON.stringify(args),
15
+ });
16
+ return res.json();
17
+ },
18
+ links: (link) => link({
19
+ resource: todosResource,
20
+ forwardArgs: () => undefined,
21
+ invalidate: true,
22
+ }),
23
+ });
24
+ ```
25
+
26
+
27
+ ## Опции
28
+
29
+ | Опция | Тип | По умолчанию | Описание |
30
+ |----------------------|----------------------------------------------|------------------|------------------------------------------------------------------------------|
31
+ | `queryFn` | `(args: TArgs) => Promise<TData>` | **обязательный** | Функция выполнения мутации. |
32
+ | `key` | `string` | — | Префикс для ключей кэша и devtools. |
33
+ | `links` | `(link) => void` | — | Колбэк для описания связей с ресурсами. См. [links][usage-links]. |
34
+ | `retentionTime` | `number \| false` | `0` | Время (мс) удержания кэш-записи после потери подписчиков. `false` — не удалять. Переопределяет `commandRetentionTime` из [API][api-readme]. |
35
+ | `onCacheEntryAdded` | `(args, ctx) => void` | — | Вызывается при создании кэш-записи. См. [lifecycle hooks][usage-lifecycle]. |
36
+ | `onQueryStarted` | `(args, ctx) => void \| Promise<void>` | — | Вызывается при каждом запуске `queryFn`. См. [lifecycle hooks][usage-lifecycle]. |
37
+ | `sync` | `boolean` | `false` | Включить/отключить [кросс-табовую синхронизацию][usage-broadcast]. По умолчанию выключена (`defaultSync: 'none'`). Для включения укажите `sync: true` на команде или `defaultSync: 'all'` на уровне API. Игнорируется, если `syncDriver` не задан в API. |
38
+
39
+
40
+ ## Методы
41
+
42
+ | Метод | Параметры | Возвращаемое значение | Описание |
43
+ |---------------|---------------------|-------------------------|------------------------------------------------------------------------------|
44
+ | `trigger` | `args: Args<TArgs>` | `Promise<TData>` | Императивный запуск мутации. Необязательный `key` идентифицирует кэш-запись. |
45
+ | `createAgent` | `key?: string` | `Agent` | Создаёт реактивный [агент][agent] — наблюдатель за командой. Необязательный ключ привязывает к кэш-записи. |
46
+ | `getEntry` | `key: string` | `QueryCacheEntry \| null` | Синхронно возвращает кэш-запись. |
47
+ | `getEntry$` | `key: string` | `QueryCacheEntry \| null` | Реактивный аналог `getEntry` — для использования в реактивном контексте. |
48
+
49
+
50
+ ## Расширения
51
+
52
+ | Метод | Параметры | Возвращаемое значение | Описание |
53
+ |---------------|---------------------|-------------------------|------------------------------------------------------------------------------|
54
+ | `useCommand` | `key?: string` | `[trigger, TCommandState]` | React-хук. Требует `reactHooksPlugin()`. Подписывается на состояние мутации.|
55
+
56
+
57
+ ## См. также
58
+
59
+ - [Использование команды][usage] — примеры, паттерны, links, lifecycle hooks
60
+ - [Ресурс — API][resource-api] — API чтения данных
61
+ - [Машина состояний запроса][machine] — переходы между статусами
62
+ - [Агент][agent] — реактивный наблюдатель
63
+ - [Агент команды — API][agent-api] — полная таблица методов и статусов агента
64
+ - [Система кэширования][cache] — жизненный цикл записей кэша
65
+
66
+
67
+ [cache]: ../concepts/cache.md
68
+ [usage]: ../usage/command.md
69
+ [usage-links]: ../usage/links.md
70
+ [usage-lifecycle]: ../usage/lifecycle.md
71
+ [resource-api]: ./resource.md
72
+ [machine]: ../concepts/machine.md
73
+ [agent]: ../concepts/agent.md
74
+ [agent-api]: ./command-agent.md
75
+ [api-readme]: ./README.md
76
+ [usage-broadcast]: ../usage/broadcast.md
@@ -0,0 +1,68 @@
1
+ # Агент ресурса (ResourceAgent) — API
2
+
3
+ Агент — реактивный наблюдатель, транслирующий состояние [записи кэша][cache] в плоский сигнал с SWR-поведением. Концепция, жизненный цикл и SWR-fallback описаны в [concepts/agent.md][agent-concept].
4
+
5
+
6
+ ## Создание
7
+
8
+ ```typescript
9
+ const agent = usersResource.createAgent();
10
+ ```
11
+
12
+ Метод `createAgent()` доступен у каждого [ресурса][api-res]. Агент создаётся без аргументов — наблюдение начинается после вызова `start()`.
13
+
14
+
15
+ ## Методы
16
+
17
+ | Метод | Сигнатура | Описание |
18
+ |-------|-----------|------------------------------------------------------------------------------------------------------------------------|
19
+ | `state$` | `() => TResourceAgentState<TArgs, TData>` | Вычисляемый сигнал. Возвращает текущее состояние агента. |
20
+ | `start` | `() => void` | Начинает или переключает наблюдение за ресурсом с указанными аргументами. При передаче `SKIP` агент переходит в `idle`. |
21
+ | `retry` | `() => void` | Повторяет последний запрос, при ошибке | |
22
+ | `refresh` | `() => void` | Принудительно обновляет данные, при ошибке сохраняет устаревшие данные. |
23
+ | `set` | `(args: ArgsOrVoidOrSkip<TArgs>, mark: boolean) => void` | Устанавливает наблюдаемые args (не инициирует запрос) |
24
+
25
+
26
+ ## Состояние (TResourceAgentState)
27
+
28
+ | Поле | Тип | Описание |
29
+ |------|-----|----------|
30
+ | `status` | `TMachineStatus \| "idle"` | Текущий статус агента. См. таблицу статусов ниже. |
31
+ | `data` | `TData \| null` | Данные. При SWR-fallback содержит устаревшие данные предыдущей записи. |
32
+ | `error` | `unknown` | Ошибка текущего запроса. `null` в `idle` / `success` / `pending`. |
33
+ | `args` | `TArgs \| null` | Аргументы текущего наблюдения. `null` в `idle`. |
34
+ | `isLoading` | `boolean` | `true` при любой загрузке (`pending` или `refreshing`). |
35
+ | `isInitialLoading` | `boolean` | `true` только при первичной загрузке (`pending`). |
36
+ | `isRefreshing` | `boolean` | `true` при фоновом обновлении (SWR). |
37
+ | `isRefreshError` | `boolean` | `true`, если фоновое обновление завершилось ошибкой. |
38
+ | `isSuccess` | `boolean` | `true`, если данные получены успешно. |
39
+ | `isError` | `boolean` | `true`, если запрос завершился ошибкой. |
40
+ | `entry` | `IResourceCacheEntry<TArgs, TData> \| null` | Текущая запись кэша. `null` в `idle`. |
41
+ | `retry` | `() => void` | Метод для повторного запроса, при ошибке. |
42
+ | `refresh` | `() => void` | Метод для принудительного обновления данных. |
43
+
44
+ ## Статусы
45
+
46
+ | Статус | `isLoading` | `isInitialLoading` | `isRefreshing` | `isRefreshError` | `isSuccess` | `isError` | Описание |
47
+ |--------|:-----------:|:-------------------:|:--------------:|:-----------------:|:-----------:|:---------:|----------|
48
+ | `idle` | — | — | — | — | — | — | Передан `SKIP`, наблюдение не активно. |
49
+ | `pending` | ✓ | ✓ | — | — | — | — | Первичный запрос в процессе. |
50
+ | `success` | — | — | — | — | ✓ | — | Данные получены. |
51
+ | `error` | — | — | — | — | — | ✓ | Запрос завершился ошибкой. |
52
+ | `refreshing` | ✓ | — | ✓ | — | — | — | Фоновое обновление; устаревшие данные доступны через `data`. |
53
+ | `refresh-error` | — | — | — | ✓ | — | ✓ | Фоновое обновление завершилось ошибкой; устаревшие данные сохранены. |
54
+
55
+
56
+ ## См. также
57
+
58
+ - [Концепция агента][agent-concept] — SWR-fallback, SKIP, жизненный цикл
59
+ - [Ресурс — API][api-res] — создание ресурса и метод `createAgent()`
60
+ - [Использование ресурса][usage-res] — хук `useResource`, примеры, паттерны
61
+ - [Машина состояний][machine] — переходы между статусами записи кэша
62
+
63
+
64
+ [agent-concept]: ../concepts/agent.md
65
+ [api-res]: ./resource.md
66
+ [usage-res]: ../usage/resource.md
67
+ [machine]: ../concepts/machine.md
68
+ [cache]: ../concepts/cache.md
@@ -0,0 +1,77 @@
1
+ # Ресурс (Resource) — API
2
+
3
+ Ресурс — абстракция для чтения данных с кэшированием и SWR. Примеры и паттерны — см. [руководство по использованию][usage].
4
+
5
+
6
+ ## Создание
7
+
8
+ ```typescript
9
+ const usersResource = api.createResource({
10
+ queryFn: async (args: { page: number }, abortSignal) => {
11
+ const res = await fetch(`/api/users?page=${args.page}`, { signal: abortSignal });
12
+ return res.json();
13
+ },
14
+ key: 'users',
15
+ });
16
+ ```
17
+
18
+
19
+ ## Опции
20
+
21
+ | Опция | Тип | По умолчанию | Описание |
22
+ |----------------------|-------------------------------------------------------------|-------------------|---------------------------------------------------------------------|
23
+ | `queryFn` | `(args: TArgs, abortSignal: AbortSignal) => Promise<TData>` | **обязательный** | Функция запроса данных. |
24
+ | `key` | `string` | — | Префикс для ключей кэша и devtools. |
25
+ | `retentionTime` | `number \| false` | `60_000` | Время (мс) удержания записи после потери подписчиков. `false` — не удалять. Переопределяет `resourceRetentionTime` из [API][api-readme]. |
26
+ | `serializeArgs` | `(args: TArgs) => string` | `stableStringify` | Сериализация аргументов в кэш-ключ. |
27
+ | `onCacheEntryAdded` | `(args, ctx) => void` | — | Вызывается при создании кэш-записи. См. [lifecycle hooks][usage-lifecycle]. |
28
+ | `onQueryStarted` | `(args, ctx) => void \| Promise<void>` | — | Вызывается при каждом запуске `queryFn`. См. [lifecycle hooks][usage-lifecycle]. |
29
+ | `sync` | `boolean` | `false` | Включить/отключить [кросс-табовую синхронизацию][usage-broadcast]. Игнорируется, если `syncDriver` не задан в API. |
30
+ | `getDevtoolsKey` | `(args: Keyed<TArgs>) => string` | — | Ключ аргументов для отображения в DevTools. |
31
+
32
+
33
+ ### Опции класса (Resource)
34
+
35
+ | Опция | Тип | По умолчанию | Описание |
36
+ |---------------|---------------------------------------------------------|--------------|----------------------------|
37
+ | `beforeQuery` | `(args: Keyed<TArgs>) => Promise<TData \| typeof NONE>` | — | Вызывается перед `queryFn` |
38
+
39
+ ## Методы
40
+
41
+ | Метод | Параметры | Возвращаемое значение | Описание |
42
+ |----------------|-----------------------------------------------|---------------------------|--------------------------------------------------------------------------------------------------------------------------------------|
43
+ | `trigger` | `args: Args<TArgs>, doForce = false` | `void` | Запускает запрос с заданными аргументами. При `doForce = false` (по умолчанию) перезапрос для существующей записи кэша не делает. |
44
+ | `refresh` | `args: Args<TArgs>` | `void` | Помечает запись как устаревшую и запускает фоновый перезапрос (SWR). |
45
+ | `getEntry` | `args: ArgsOrVoid<TArgs>, doInitiate = false` | `QueryCacheEntry \| null` | Синхронно возвращает кэш-запись. |
46
+ | `getEntry$` | `args: ArgsOrVoid<TArgs>, doInitiate = false` | `QueryCacheEntry \| null` | Реактивный аналог `getEntry` — для использования в реактивном контексте. |
47
+ | `createAgent` | — | `Agent<TArgs, TData>` | Создаёт реактивный [агент][agent] — наблюдатель за ресурсом с SWR-поведением. |
48
+ | `serialize` | `args: Args<TArgs>` | `string` | Возвращает строковый ключ кэша для заданных аргументов. |
49
+ | `toKeyed` | `args: Args<TArgs>` | `Keyed<TArgs>` | Оборачивает аргументы в пару `{ value, key }` — для передачи в методы, минуя повторную сериализацию. |
50
+ | `_getOrCreate` | `args: Args<TArgs>, doForce = false` | `CacheEntry` | Внутренний метод. Получает существующую или создаёт новую запись кэша для аргументов. |
51
+
52
+ ### Расширения
53
+
54
+ | Метод | Параметры | Возвращаемое значение | Описание |
55
+ |----------------|------------------------------------------------|-------------------------|--------------------------------------------------------------------------------|
56
+ | `useResource` | `args: ArgsOrVoidOrSkip<TArgs>` | `TResourceState<TData>` | React-хук. Требует `reactHooksPlugin()`. Подписывается на данные. |
57
+
58
+
59
+ ## См. также
60
+
61
+ - [Использование ресурса][usage] — примеры, паттерны, состояния
62
+ - [Команда — API][command-api] — API мутаций
63
+ - [Машина состояний запроса][machine] — переходы между статусами
64
+ - [Агент][agent] — реактивный наблюдатель
65
+ - [Агент ресурса — API][agent-api] — полная таблица методов и статусов агента
66
+ - [Типизация аргументов (Keyed)][keyed] — пайплайн аргументов: Args → Keyed → key
67
+
68
+
69
+ [usage]: ../usage/resource.md
70
+ [usage-lifecycle]: ../usage/lifecycle.md
71
+ [command-api]: ./command.md
72
+ [machine]: ../concepts/machine.md
73
+ [agent]: ../concepts/agent.md
74
+ [agent-api]: ./resource-agent.md
75
+ [api-readme]: ./README.md
76
+ [usage-broadcast]: ../usage/broadcast.md
77
+ [keyed]: ../concepts/keyed.md
@@ -0,0 +1,70 @@
1
+ # Агент
2
+
3
+ Агент — SWR-наблюдатель, связывающий UI-компонент с [записью кэша][cache]. Он отслеживает текущую запись, транслирует её состояние в плоский реактивный сигнал и управляет переходами при смене аргументов. Агент используется как [ресурсами][usage-res], так и [командами][usage-cmd] — хуки `useResource` и `useCommand` создают его автоматически.
4
+
5
+ ## SKIP и состояние idle
6
+
7
+ Специальный символ `SKIP` передаётся вместо аргументов, когда запрос выполнять не нужно — например, пока зависимые данные ещё не готовы. Агент переходит в состояние `idle`: запись кэша не создаётся, сетевой запрос не выполняется.
8
+
9
+ ## SWR-fallback при смене аргументов
10
+
11
+ Агент хранит два слота: **текущая** и **предыдущая** запись. При смене аргументов:
12
+
13
+ 1. Если предыдущая запись содержит данные (`success` / `refreshing`/`refresh-error`), агент сохраняет их как устаревшие.
14
+ 2. Пока новая запись в `pending`, агент отдаёт устаревшие данные и выставляет статус `refreshing`. При `error` данные из предыдущей записи остаются доступны, но статус — `error`.
15
+ 3. Как только новая запись разрешается `success` — предыдущий слот очищается.
16
+
17
+ Благодаря этому UI показывает предыдущие данные вместо пустого состояния, пока новый запрос загружается.
18
+
19
+ ## Статусы
20
+
21
+ Агент предоставляет шесть статусов:
22
+
23
+ - **idle** — передан `SKIP`, наблюдение не активно.
24
+ - **pending** — первичный запрос в процессе.
25
+ - **success** — данные получены.
26
+ - **error** — запрос завершился ошибкой.
27
+ - **refreshing** — фоновое обновление (SWR); устаревшие данные доступны. Как состояние машины — только у ресурсов (через `refresh()`). Как статус агента — также при SWR-маскировании (`pending` + предыдущие данные).
28
+ - **refresh-error** — фоновое обновление завершилось ошибкой; устаревшие данные сохранены. Только для ресурсов.
29
+
30
+ Статус `refresh-error` — это полноценное состояние [машины состояний][machine] (переход `refreshing → refresh-error` при ошибке фонового обновления). Агент транслирует его напрямую, без трансформации.
31
+
32
+ Булевые флаги и полная таблица соответствий описаны в руководствах по [ресурсам][usage-res] и [командам][usage-cmd].
33
+
34
+ Подробные sequence-диаграммы потоков (cache miss, cache hit, refresh, SWR-fallback и др.) — в [dataflows.md][dataflows].
35
+
36
+ ## Матрица состояний
37
+
38
+ | Состояние машины | Статус агента | data | Описание поведения |
39
+ |---|---|---|---|
40
+ | _(нет записи / SKIP)_ | `idle` | `null` | Запрос не выполняется |
41
+ | `pending` | `pending` | `null` | Ожидание первого ответа |
42
+ | `pending` + _previous_ | `refreshing` | stale data из prev | SWR: pending маскируется в refreshing; stale данные показываются, пока новая запись загружается |
43
+ | `success` | `success` | `TData` | Данные получены |
44
+ | `error` | `error` | `null` | Ошибка, данных нет |
45
+ | `error` + _previous_ | `error` | stale data из prev | Ошибка; stale данные из prev доступны, но статус — error |
46
+ | `refreshing` | `refreshing` | stale `TData` | Фоновое обновление, показываются устаревшие данные (только ресурс) |
47
+ | `refresh-error` | `refresh-error` | stale `TData` | Обновление завершилось ошибкой, стейл данные сохраняются (только ресурс) |
48
+
49
+ Подробнее о механизме слотов — в разделе [SWR-fallback при смене аргументов][swr-fallback].
50
+
51
+ ## См. также
52
+
53
+ - [Потоки данных][dataflows] — диаграммы всех ресурсных и командных потоков.
54
+ - [Машина состояний][machine] — состояние, которое агент транслирует из записи кэша.
55
+ - [Кэш][cache] — хранилище записей, за которыми наблюдает агент.
56
+ - [Использование ресурсов][usage-res] — хук `useResource` и полная таблица состояний.
57
+ - [Использование команд][usage-cmd] — хук `useCommand` и жизненный цикл мутаций.
58
+ - [API: createResource][api-res] — создание ресурса и его агента.
59
+ - [API: createCommand][api-cmd] — создание команды и её агента.
60
+
61
+ ---
62
+
63
+ [swr-fallback]: #swr-fallback-при-смене-аргументов
64
+ [machine]: machine.md
65
+ [cache]: cache.md
66
+ [dataflows]: dataflows.md
67
+ [usage-res]: ../usage/resource.md
68
+ [usage-cmd]: ../usage/command.md
69
+ [api-res]: ../api/resource.md
70
+ [api-cmd]: ../api/command.md