@fozy-labs/rx-toolkit 0.5.4 → 0.6.2
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.
- package/LICENSE +1 -1
- package/README.md +22 -13
- package/dist/common/devtools/reduxDevtools.js +17 -2
- package/dist/common/react/index.d.ts +1 -0
- package/dist/common/react/index.js +1 -0
- package/dist/common/react/useIsomorphicLayoutEffect.d.ts +17 -0
- package/dist/common/react/useIsomorphicLayoutEffect.js +17 -0
- package/dist/index.d.ts +1 -2
- package/dist/index.js +1 -2
- package/dist/query/api/createApi.d.ts +4 -0
- package/dist/query/api/createApi.js +9 -0
- package/dist/query/api/index.d.ts +1 -0
- package/dist/query/api/index.js +1 -0
- package/dist/query/constants.d.ts +12 -0
- package/dist/query/constants.js +15 -0
- package/dist/query/core/api/Api.d.ts +20 -0
- package/dist/query/core/api/Api.js +129 -0
- package/dist/query/core/api/constants.d.ts +2 -0
- package/dist/query/core/api/constants.js +3 -0
- package/dist/query/core/api/index.d.ts +3 -0
- package/dist/query/core/api/index.js +3 -0
- package/dist/query/core/api/mergeHooks.d.ts +2 -0
- package/dist/query/core/api/mergeHooks.js +26 -0
- package/dist/query/core/api/normalizeLinks.d.ts +2 -0
- package/dist/query/core/api/normalizeLinks.js +11 -0
- package/dist/query/core/cache/CacheEntry.d.ts +21 -0
- package/dist/query/core/cache/CacheEntry.js +54 -0
- package/dist/query/core/cache/CacheMap.d.ts +19 -0
- package/dist/query/core/cache/CacheMap.js +32 -0
- package/dist/query/core/cache/QueryCacheEntry.d.ts +21 -0
- package/dist/query/core/cache/QueryCacheEntry.js +136 -0
- package/dist/query/core/cache/index.d.ts +3 -0
- package/dist/query/core/cache/index.js +3 -0
- package/dist/query/core/command/Command.d.ts +67 -0
- package/dist/query/core/command/Command.js +253 -0
- package/dist/query/core/command/CommandAgent.d.ts +17 -0
- package/dist/query/core/command/CommandAgent.js +67 -0
- package/dist/query/core/command/LinkManager.d.ts +24 -0
- package/dist/query/core/command/LinkManager.js +71 -0
- package/dist/query/core/command/index.d.ts +2 -0
- package/dist/query/core/command/index.js +2 -0
- package/dist/query/core/errors/CacheEntryRemovedError.d.ts +7 -0
- package/dist/query/core/errors/CacheEntryRemovedError.js +9 -0
- package/dist/query/core/errors/MachineStateError.d.ts +8 -0
- package/dist/query/core/errors/MachineStateError.js +10 -0
- package/dist/query/core/errors/MachineTransitionError.d.ts +7 -0
- package/dist/query/core/errors/MachineTransitionError.js +9 -0
- package/dist/query/core/errors/index.d.ts +3 -0
- package/dist/query/core/errors/index.js +3 -0
- package/dist/query/core/index.d.ts +8 -0
- package/dist/query/core/index.js +8 -0
- package/dist/query/core/machine/Machine.d.ts +21 -0
- package/dist/query/core/machine/Machine.js +42 -0
- package/dist/query/core/machine/MachineBase.d.ts +31 -0
- package/dist/query/core/machine/MachineBase.js +176 -0
- package/dist/query/core/machine/MachineError.d.ts +10 -0
- package/dist/query/core/machine/MachineError.js +19 -0
- package/dist/query/core/machine/MachinePending.d.ts +13 -0
- package/dist/query/core/machine/MachinePending.js +32 -0
- package/dist/query/core/machine/MachineRefreshError.d.ts +12 -0
- package/dist/query/core/machine/MachineRefreshError.js +23 -0
- package/dist/query/core/machine/MachineRefreshing.d.ts +15 -0
- package/dist/query/core/machine/MachineRefreshing.js +43 -0
- package/dist/query/core/machine/MachineSuccess.d.ts +12 -0
- package/dist/query/core/machine/MachineSuccess.js +23 -0
- package/dist/query/core/machine/MachineWithData.d.ts +25 -0
- package/dist/query/core/machine/MachineWithData.js +73 -0
- package/dist/query/core/machine/index.d.ts +9 -0
- package/dist/query/core/machine/index.js +9 -0
- package/dist/query/core/machine/machine-helpers.d.ts +9 -0
- package/dist/query/core/machine/machine-helpers.js +80 -0
- package/dist/query/core/patcher/Patcher.d.ts +30 -0
- package/dist/query/core/patcher/Patcher.js +122 -0
- package/dist/query/core/patcher/index.d.ts +1 -0
- package/dist/query/core/patcher/index.js +1 -0
- package/dist/query/core/resource/Resource.d.ts +105 -0
- package/dist/query/core/resource/Resource.js +340 -0
- package/dist/query/core/resource/ResourceAgent.d.ts +37 -0
- package/dist/query/core/resource/ResourceAgent.js +179 -0
- package/dist/query/core/resource/index.d.ts +2 -0
- package/dist/query/core/resource/index.js +2 -0
- package/dist/query/core/snapshoter/Snapshoter.d.ts +22 -0
- package/dist/query/core/snapshoter/Snapshoter.js +78 -0
- package/dist/query/core/snapshoter/index.d.ts +2 -0
- package/dist/query/core/snapshoter/index.js +1 -0
- package/dist/query/core/syncer/Syncer.d.ts +32 -0
- package/dist/query/core/syncer/Syncer.js +85 -0
- package/dist/query/core/syncer/index.d.ts +2 -0
- package/dist/query/core/syncer/index.js +1 -0
- package/dist/query/index.d.ts +5 -10
- package/dist/query/index.js +5 -13
- package/dist/query/lib/broadcastSyncDriver.d.ts +5 -0
- package/dist/query/lib/broadcastSyncDriver.js +46 -0
- package/dist/query/lib/index.d.ts +3 -0
- package/dist/query/lib/index.js +3 -0
- package/dist/{query-v2 → query}/lib/stableStringify.js +5 -3
- package/dist/query/lib/toKeyed.d.ts +11 -0
- package/dist/query/lib/toKeyed.js +18 -0
- package/dist/query/react/ReactHooksPlugin.d.ts +31 -0
- package/dist/query/react/ReactHooksPlugin.js +21 -0
- package/dist/query/react/index.d.ts +3 -0
- package/dist/query/react/index.js +3 -0
- package/dist/query/react/useCommand.d.ts +2 -0
- package/dist/query/react/useCommand.js +14 -0
- package/dist/query/react/useResource.d.ts +2 -0
- package/dist/query/react/useResource.js +16 -0
- package/dist/query/types/api.d.ts +39 -0
- package/dist/query/types/cache.d.ts +51 -0
- package/dist/query/types/command.d.ts +52 -0
- package/dist/query/types/common.d.ts +65 -0
- package/dist/query/types/index.d.ts +8 -4
- package/dist/query/types/index.js +8 -5
- package/dist/query/types/plugin-hkt.d.ts +64 -0
- package/dist/query/types/resource.d.ts +49 -0
- package/dist/query/types/snapshot.d.ts +27 -0
- package/dist/query/types/snapshot.js +2 -0
- package/dist/query/types/state.d.ts +24 -0
- package/dist/signals/base/ComputeCache.js +1 -1
- package/dist/signals/base/Devtools.js +2 -6
- package/dist/signals/signals/Computed.d.ts +1 -0
- package/dist/signals/signals/Computed.js +5 -1
- package/dist/signals/signals/Effect.d.ts +0 -4
- package/dist/signals/signals/Effect.js +0 -6
- package/dist/signals/signals/LocalState.d.ts +1 -10
- package/dist/signals/signals/LocalState.js +0 -12
- package/dist/signals/signals/Signal.d.ts +2 -8
- package/dist/signals/signals/Signal.js +1 -10
- package/dist/signals/signals/State.d.ts +2 -1
- package/dist/signals/signals/State.js +9 -0
- package/dist/signals/types/SignalOptions.d.ts +0 -2
- package/dist/signals/types/normalizeSignalOptions.js +0 -3
- package/dist/signals/types/signals.types.d.ts +3 -1
- package/docs/CHANGELOG.md +54 -2
- package/docs/contributing/release/README.md +2 -8
- package/docs/migrations/0.6.0.md +224 -0
- package/docs/query/README.md +52 -562
- package/docs/query/api/README.md +59 -0
- package/docs/query/api/_CacheEntry.md +39 -0
- package/docs/query/api/_CacheMap.md +30 -0
- package/docs/query/api/_QueryCacheEntry.md +81 -0
- package/docs/query/api/command-agent.md +60 -0
- package/docs/query/api/command.md +76 -0
- package/docs/query/api/resource-agent.md +68 -0
- package/docs/query/api/resource.md +77 -0
- package/docs/query/concepts/agent.md +70 -0
- package/docs/query/concepts/architecture.md +139 -0
- package/docs/query/concepts/cache.md +81 -0
- package/docs/query/concepts/dataflows.md +473 -0
- package/docs/query/concepts/keyed.md +42 -0
- package/docs/query/concepts/machine.md +106 -0
- package/docs/query/concepts/patching.md +85 -0
- package/docs/query/usage/broadcast.md +188 -0
- package/docs/query/usage/command.md +203 -0
- package/docs/query/usage/lifecycle.md +114 -0
- package/docs/query/usage/links.md +125 -0
- package/docs/query/usage/plugins.md +96 -0
- package/docs/query/usage/resource.md +206 -0
- package/docs/query/usage/snapshot.md +80 -0
- package/docs/usage/react/README.md +45 -91
- package/package.json +5 -7
- package/dist/query/SKIP_TOKEN.d.ts +0 -1
- package/dist/query/SKIP_TOKEN.js +0 -1
- package/dist/query/api/createCommand.d.ts +0 -21
- package/dist/query/api/createCommand.js +0 -20
- package/dist/query/api/createOperation.d.ts +0 -5
- package/dist/query/api/createOperation.js +0 -6
- package/dist/query/api/createResource.d.ts +0 -3
- package/dist/query/api/createResource.js +0 -2
- package/dist/query/api/createResourceDuplicator.d.ts +0 -4
- package/dist/query/api/createResourceDuplicator.js +0 -2
- package/dist/query/api/resetAllQueriesCache.d.ts +0 -1
- package/dist/query/api/resetAllQueriesCache.js +0 -4
- package/dist/query/core/Command/Command.d.ts +0 -35
- package/dist/query/core/Command/Command.js +0 -210
- package/dist/query/core/Command/CommandAgent.d.ts +0 -19
- package/dist/query/core/Command/CommandAgent.js +0 -54
- package/dist/query/core/Command/index.d.ts +0 -2
- package/dist/query/core/Command/index.js +0 -2
- package/dist/query/core/Operation/Operation.d.ts +0 -8
- package/dist/query/core/Operation/Operation.js +0 -4
- package/dist/query/core/Operation/OperationAgent.d.ts +0 -4
- package/dist/query/core/Operation/OperationAgent.js +0 -4
- package/dist/query/core/QueriesCache.d.ts +0 -9
- package/dist/query/core/QueriesCache.js +0 -28
- package/dist/query/core/QueriesLifetimeHooks.d.ts +0 -22
- package/dist/query/core/QueriesLifetimeHooks.js +0 -86
- package/dist/query/core/ResetAllQueriesSignal.d.ts +0 -6
- package/dist/query/core/ResetAllQueriesSignal.js +0 -11
- package/dist/query/core/Resource/Resource.d.ts +0 -51
- package/dist/query/core/Resource/Resource.js +0 -232
- package/dist/query/core/Resource/ResourceAgent.d.ts +0 -35
- package/dist/query/core/Resource/ResourceAgent.js +0 -110
- package/dist/query/core/Resource/ResourceDuplicator.d.ts +0 -73
- package/dist/query/core/Resource/ResourceDuplicator.js +0 -227
- package/dist/query/core/Resource/ResourceDuplicatorAgent.d.ts +0 -35
- package/dist/query/core/Resource/ResourceDuplicatorAgent.js +0 -110
- package/dist/query/core/Resource/ResourceRef.d.ts +0 -16
- package/dist/query/core/Resource/ResourceRef.js +0 -136
- package/dist/query/lib/IndirectMap.d.ts +0 -19
- package/dist/query/lib/IndirectMap.js +0 -88
- package/dist/query/lib/ReactiveCache.d.ts +0 -62
- package/dist/query/lib/ReactiveCache.js +0 -80
- package/dist/query/react/useCommandAgent.d.ts +0 -24
- package/dist/query/react/useCommandAgent.js +0 -39
- package/dist/query/react/useOperationAgent.d.ts +0 -6
- package/dist/query/react/useOperationAgent.js +0 -6
- package/dist/query/react/useResourceAgent.d.ts +0 -6
- package/dist/query/react/useResourceAgent.js +0 -31
- package/dist/query/react/useResourceRef.d.ts +0 -5
- package/dist/query/react/useResourceRef.js +0 -13
- package/dist/query/types/Command.types.d.ts +0 -154
- package/dist/query/types/Command.types.js +0 -1
- package/dist/query/types/Operation.types.d.ts +0 -13
- package/dist/query/types/Operation.types.js +0 -1
- package/dist/query/types/Resource.types.d.ts +0 -129
- package/dist/query/types/Resource.types.js +0 -1
- package/dist/query/types/shared.types.d.ts +0 -26
- package/dist/query/types/shared.types.js +0 -1
- package/dist/query-v2/api/createApi.d.ts +0 -10
- package/dist/query-v2/api/createApi.js +0 -83
- package/dist/query-v2/core/common/CacheEntry.d.ts +0 -29
- package/dist/query-v2/core/common/CacheEntry.js +0 -71
- package/dist/query-v2/core/common/CacheMap.d.ts +0 -38
- package/dist/query-v2/core/common/CacheMap.js +0 -127
- package/dist/query-v2/core/common/LifecycleHooks.d.ts +0 -22
- package/dist/query-v2/core/common/LifecycleHooks.js +0 -104
- package/dist/query-v2/core/common/index.d.ts +0 -3
- package/dist/query-v2/core/common/index.js +0 -3
- package/dist/query-v2/core/index.d.ts +0 -3
- package/dist/query-v2/core/index.js +0 -3
- package/dist/query-v2/core/machines/Machine.d.ts +0 -14
- package/dist/query-v2/core/machines/Machine.js +0 -33
- package/dist/query-v2/core/machines/MachineError.d.ts +0 -11
- package/dist/query-v2/core/machines/MachineError.js +0 -26
- package/dist/query-v2/core/machines/MachineIdle.d.ts +0 -8
- package/dist/query-v2/core/machines/MachineIdle.js +0 -19
- package/dist/query-v2/core/machines/MachinePending.d.ts +0 -12
- package/dist/query-v2/core/machines/MachinePending.js +0 -29
- package/dist/query-v2/core/machines/MachineRefreshing.d.ts +0 -14
- package/dist/query-v2/core/machines/MachineRefreshing.js +0 -46
- package/dist/query-v2/core/machines/MachineSuccess.d.ts +0 -16
- package/dist/query-v2/core/machines/MachineSuccess.js +0 -42
- package/dist/query-v2/core/machines/MachineWithData.d.ts +0 -18
- package/dist/query-v2/core/machines/MachineWithData.js +0 -40
- package/dist/query-v2/core/machines/Patcher.d.ts +0 -20
- package/dist/query-v2/core/machines/Patcher.js +0 -104
- package/dist/query-v2/core/machines/index.d.ts +0 -8
- package/dist/query-v2/core/machines/index.js +0 -8
- package/dist/query-v2/core/resource/ResourceV2.d.ts +0 -120
- package/dist/query-v2/core/resource/ResourceV2.js +0 -464
- package/dist/query-v2/core/resource/ResourceV2Agent.d.ts +0 -26
- package/dist/query-v2/core/resource/ResourceV2Agent.js +0 -132
- package/dist/query-v2/core/resource/index.d.ts +0 -2
- package/dist/query-v2/core/resource/index.js +0 -2
- package/dist/query-v2/index.d.ts +0 -11
- package/dist/query-v2/index.js +0 -17
- package/dist/query-v2/lib/NO_VALUE.d.ts +0 -2
- package/dist/query-v2/lib/NO_VALUE.js +0 -1
- package/dist/query-v2/lib/SKIP_TOKEN.d.ts +0 -2
- package/dist/query-v2/lib/SKIP_TOKEN.js +0 -1
- package/dist/query-v2/lib/index.d.ts +0 -4
- package/dist/query-v2/lib/index.js +0 -3
- package/dist/query-v2/plugins/ReactHooksPlugin.d.ts +0 -25
- package/dist/query-v2/plugins/ReactHooksPlugin.js +0 -19
- package/dist/query-v2/plugins/types.d.ts +0 -1
- package/dist/query-v2/react/__tests__/helpers.d.ts +0 -12
- package/dist/query-v2/react/__tests__/helpers.js +0 -33
- package/dist/query-v2/react/index.d.ts +0 -2
- package/dist/query-v2/react/index.js +0 -2
- package/dist/query-v2/react/useResourceV2Agent.d.ts +0 -12
- package/dist/query-v2/react/useResourceV2Agent.js +0 -36
- package/dist/query-v2/react/useResourceV2Ref.d.ts +0 -12
- package/dist/query-v2/react/useResourceV2Ref.js +0 -57
- package/dist/query-v2/snapshot/Snapshot.d.ts +0 -13
- package/dist/query-v2/snapshot/Snapshot.js +0 -76
- package/dist/query-v2/types/agent.types.d.ts +0 -54
- package/dist/query-v2/types/api.types.d.ts +0 -22
- package/dist/query-v2/types/cache.types.d.ts +0 -37
- package/dist/query-v2/types/index.d.ts +0 -9
- package/dist/query-v2/types/index.js +0 -9
- package/dist/query-v2/types/lifecycle.types.d.ts +0 -25
- package/dist/query-v2/types/machine.types.d.ts +0 -67
- package/dist/query-v2/types/plugin.types.d.ts +0 -38
- package/dist/query-v2/types/resource.types.d.ts +0 -35
- package/dist/query-v2/types/resource.types.js +0 -1
- package/dist/query-v2/types/shared.types.d.ts +0 -20
- package/dist/query-v2/types/shared.types.js +0 -1
- package/dist/query-v2/types/snapshot.types.d.ts +0 -21
- package/dist/query-v2/types/snapshot.types.js +0 -1
- package/docs/contributing/query-v2/README.md +0 -379
- package/docs/migrations/query-v2.md +0 -171
- package/docs/query-v2/README.md +0 -280
- package/docs/query-v2/api-reference.md +0 -235
- package/docs/query-v2/optimistic-updates.md +0 -148
- package/docs/query-v2/ssr.md +0 -130
- /package/dist/{query-v2 → query}/lib/stableStringify.d.ts +0 -0
- /package/dist/{query-v2/plugins/types.js → query/types/api.js} +0 -0
- /package/dist/{query-v2/types/agent.types.js → query/types/cache.js} +0 -0
- /package/dist/{query-v2/types/api.types.js → query/types/command.js} +0 -0
- /package/dist/{query-v2/types/cache.types.js → query/types/common.js} +0 -0
- /package/dist/{query-v2/types/lifecycle.types.js → query/types/plugin-hkt.js} +0 -0
- /package/dist/{query-v2/types/machine.types.js → query/types/resource.js} +0 -0
- /package/dist/{query-v2/types/plugin.types.js → query/types/state.js} +0 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Архитектура модуля Query
|
|
2
|
+
|
|
3
|
+
Документ описывает внутреннее устройство модуля Query: компоненты, их связи и поведение в runtime. Обзор возможностей и быстрый старт — в [README][readme].
|
|
4
|
+
|
|
5
|
+
## Диаграмма компонентов
|
|
6
|
+
|
|
7
|
+
Модуль состоит из пяти слоёв: публичный API, кэш, ядро, плагины и React-интеграция.
|
|
8
|
+
|
|
9
|
+
```mermaid
|
|
10
|
+
graph TD
|
|
11
|
+
subgraph api ["Публичный API"]
|
|
12
|
+
CREATE_API["createApi(options)"]
|
|
13
|
+
RES["Resource"]
|
|
14
|
+
CMD["Command"]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
subgraph cache ["Кэш"]
|
|
18
|
+
CMAP["CacheMap"]
|
|
19
|
+
ENTRY["CacheEntry"]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
subgraph core ["Ядро"]
|
|
23
|
+
MACHINE["Machine"]
|
|
24
|
+
AGENT["Agent"]
|
|
25
|
+
LINK["Link"]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
subgraph plugins ["Плагины"]
|
|
29
|
+
IPLUG["IPlugin"]
|
|
30
|
+
REACT_PLG["ReactHooksPlugin"]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
subgraph react ["React-интеграция"]
|
|
34
|
+
HOOKS["useResource · useCommand"]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
QUERYFN["queryFn"]
|
|
38
|
+
SYNC["SyncDriver"]
|
|
39
|
+
|
|
40
|
+
CREATE_API -- "создаёт ресурс" --> RES
|
|
41
|
+
CREATE_API -- "создаёт команду" --> CMD
|
|
42
|
+
CREATE_API -. "инжектирует beforeQuery" .-> RES
|
|
43
|
+
|
|
44
|
+
REACT_PLG -.-> IPLUG
|
|
45
|
+
IPLUG -. "расширяет ресурс" .-> RES
|
|
46
|
+
IPLUG -. "расширяет команду" .-> CMD
|
|
47
|
+
REACT_PLG -. "добавляет хуки" .-> HOOKS
|
|
48
|
+
|
|
49
|
+
RES -- "get/set записи" --> CMAP
|
|
50
|
+
CMD -- "get/set записи" --> CMAP
|
|
51
|
+
CMAP -- "получает запись" --> ENTRY
|
|
52
|
+
ENTRY -- "хранит" --> MACHINE
|
|
53
|
+
ENTRY -- "сетевой запрос" --> QUERYFN
|
|
54
|
+
|
|
55
|
+
CMD -- "инвалидация" --> LINK
|
|
56
|
+
LINK -- "refresh" --> RES
|
|
57
|
+
|
|
58
|
+
RES -. "beforeQuery (pull)" .-> SYNC
|
|
59
|
+
|
|
60
|
+
HOOKS -- "создаёт" --> AGENT
|
|
61
|
+
AGENT -- "наблюдает" --> ENTRY
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Компоненты по слоям
|
|
65
|
+
|
|
66
|
+
Ниже — только то, что не очевидно из диаграммы.
|
|
67
|
+
|
|
68
|
+
### Публичный API
|
|
69
|
+
|
|
70
|
+
- **createApi** — принимает `plugins`, `initialSnapshot`, `resourceRetentionTime`, `commandRetentionTime` и другие опции уровня API. Помимо фабрик, предоставляет `.getSnapshot()` и `.resetAll()`.
|
|
71
|
+
|
|
72
|
+
### Кэш
|
|
73
|
+
|
|
74
|
+
- **CacheMap** — пассивный контейнер.
|
|
75
|
+
|
|
76
|
+
- **CacheEntry** — публикует состояние через Signal + RxJS Observable. При отписке всех подписчиков запускается таймер (`retentionTime`, по умолчанию 60 с для ресурсов), после которого запись удаляется из `CacheMap`.
|
|
77
|
+
|
|
78
|
+
### Ядро
|
|
79
|
+
|
|
80
|
+
- **Machine** — иммутабельна: каждый переход возвращает новый экземпляр. Патчинг (оптимистичные обновления через Immer) выполняется на уровне записи/машины. Подробнее — [machine.md][machine].
|
|
81
|
+
- **Agent** — SWR-наблюдатель, связывающий потребителя с записью кэша. Создаётся как хуками (`useResource`, `useCommand`), так и программно (`createAgent()`). При смене аргументов сохраняет предыдущие данные как fallback. Подробнее — [agent.md][agent].
|
|
82
|
+
- **Link** — декларативная связь между командой и ресурсом: инвалидация и оптимистичные обновления после мутации. Подробнее — [links.md][usage-links].
|
|
83
|
+
|
|
84
|
+
### Плагины
|
|
85
|
+
|
|
86
|
+
- **IPlugin** — применяются при создании ресурса/команды, а не в рантайме. Методы `augment*` возвращают объект, который `Object.assign`-ится на экземпляр.
|
|
87
|
+
|
|
88
|
+
### React-интеграция
|
|
89
|
+
|
|
90
|
+
- **useResource / useCommand** — React-хуки, создающие [агент][agent] и подписывающиеся на его состояние.
|
|
91
|
+
|
|
92
|
+
### Внешние границы
|
|
93
|
+
|
|
94
|
+
- **queryFn** — пользовательская функция запроса данных. Вызывается записью кэша для получения данных с сервера. Для ресурсов принимает `(args, abortSignal)`, для команд — `(args)`.
|
|
95
|
+
|
|
96
|
+
- **SyncDriver** — абстракция кросс-табовой синхронизации кэша. Работает по PULL-модели: перед выполнением `queryFn` ресурс вызывает внутренний хук `beforeQuery`, инжектированный `createApi` при создании ресурса. Через `beforeQuery` ресурс запрашивает данные у других табов (REQ). Если другой таб отвечает (RES), запись гидрируется в success-состояние и `queryFn` не вызывается. Если ответа нет — `queryFn` выполняется штатно. `SyncDriver` не связан с `CacheMap` или записями кэша напрямую. Встроенная реализация — `broadcastSyncDriver` на основе BroadcastChannel API. Подробнее — [broadcast.md][usage-broadcast].
|
|
97
|
+
|
|
98
|
+
## Глоссарий
|
|
99
|
+
|
|
100
|
+
| Термин | Определение |
|
|
101
|
+
|--------|-------------|
|
|
102
|
+
| **Ресурс** (Resource) | Запрос на чтение данных с кэшированием по аргументам. См. [usage/resource.md][usage-resource] |
|
|
103
|
+
| **Команда** (Command) | Побочное действие (мутация). По умолчанию не кэшируется по аргументам. См. [usage/command.md][usage-command] |
|
|
104
|
+
| **Машина** (Machine) | Иммутабельная машина состояний запроса. См. [machine.md][machine] |
|
|
105
|
+
| **Запись кэша** (CacheEntry) | Реактивный контейнер, хранящий одну машину. GC по retention-таймеру. См. [cache.md][cache] |
|
|
106
|
+
| **Карта кэша** (CacheMap) | Коллекция записей, индексированных ключом (сериализация или ссылочное сравнение аргументов) |
|
|
107
|
+
| **Агент** (Agent) | SWR-наблюдатель, связывающий UI-компонент с записью кэша. См. [agent.md][agent] |
|
|
108
|
+
| **Патч** (Patch) | Оптимистичное обновление через Immer. Патчи накапливаются и ребейсятся при ответе сервера. См. [patching.md][patching] |
|
|
109
|
+
| **Снимок** (Snapshot) | Сериализуемый слепок успешных записей кэша для SSR/гидрации. См. [snapshot.md][usage-snapshot] |
|
|
110
|
+
| **Связь** (Link) | Декларативная связь между ресурсом/командой: обновление (refresh), оптимистичное обновление. См. [links.md][usage-links] |
|
|
111
|
+
| **Плагин** (Plugin) | Расширение, добавляющее методы на ресурс/команду при создании через API. См. [plugins.md][usage-plugins] |
|
|
112
|
+
| **`SKIP`** | Специальный символ, который передаётся вместо аргументов, чтобы отложить запрос. Агент переходит в `idle` |
|
|
113
|
+
| **queryFn** | Пользовательская функция запроса/мутации. Для ресурсов: `(args, abortSignal) => Promise<TData>`, для команд: `(args) => Promise<TData>` |
|
|
114
|
+
| **Keyed-аргументы** (keyedArgs) | Аргументы, обёрнутые в `Keyed<TArgs>` — пара `{ value, key }` с предвычисленным ключом кэша. См. [keyed.md][keyed] |
|
|
115
|
+
| **Время удержания** (retentionTime) | Время (мс) удержания записи кэша после потери подписчиков. По умолчанию 60 с для ресурсов, 0 для команд |
|
|
116
|
+
| **SyncDriver** | Абстракция кросс-табовой синхронизации (PULL-модель через `beforeQuery`). Не связан с `CacheMap` или записями напрямую. Встроенная реализация — `broadcastSyncDriver`. См. [broadcast.md][usage-broadcast] |
|
|
117
|
+
|
|
118
|
+
## См. также
|
|
119
|
+
|
|
120
|
+
- [Потоки данных][dataflows] — подробные sequence-диаграммы всех сценариев (cache miss/hit, refresh, мутации, инвалидация)
|
|
121
|
+
- [Кэш][cache] — устройство CacheMap и CacheEntry, retention-таймер, GC
|
|
122
|
+
- [Машина состояний][machine] — иммутабельная машина состояний запроса, переходы и патчинг
|
|
123
|
+
- [Агент][agent] — SWR-наблюдатель, fallback-данные, подписки
|
|
124
|
+
- [Кросс-табовая синхронизация][usage-broadcast] — broadcastSyncDriver, настройка SyncDriver
|
|
125
|
+
- [Плагины][usage-plugins] — IPlugin, расширение ресурсов и команд
|
|
126
|
+
|
|
127
|
+
[readme]: ../README.md
|
|
128
|
+
[machine]: machine.md
|
|
129
|
+
[cache]: cache.md
|
|
130
|
+
[agent]: agent.md
|
|
131
|
+
[patching]: patching.md
|
|
132
|
+
[usage-resource]: ../usage/resource.md
|
|
133
|
+
[usage-command]: ../usage/command.md
|
|
134
|
+
[usage-snapshot]: ../usage/snapshot.md
|
|
135
|
+
[usage-links]: ../usage/links.md
|
|
136
|
+
[usage-plugins]: ../usage/plugins.md
|
|
137
|
+
[usage-broadcast]: ../usage/broadcast.md
|
|
138
|
+
[dataflows]: dataflows.md
|
|
139
|
+
[keyed]: keyed.md
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Система кэширования
|
|
2
|
+
|
|
3
|
+
Кэш хранит результаты запросов и отдаёт их мгновенно при повторном обращении с тем же ключом. Каждый ресурс или команда владеет собственной картой кэша (CacheMap), где записи индексируются по строковому ключу.
|
|
4
|
+
|
|
5
|
+
## Запись кэша (CacheEntry)
|
|
6
|
+
|
|
7
|
+
Запись — реактивный контейнер, хранящий один экземпляр [машины][machine]. При каждом переходе машины запись публикует новое состояние подписчикам.
|
|
8
|
+
|
|
9
|
+
```mermaid
|
|
10
|
+
stateDiagram-v2
|
|
11
|
+
[*] --> active : первый запрос с данным ключом
|
|
12
|
+
active --> retention : последний подписчик отписался
|
|
13
|
+
retention --> active : новый подписчик
|
|
14
|
+
retention --> removed : таймер истёк
|
|
15
|
+
```
|
|
16
|
+
**Статусы записи:**
|
|
17
|
+
- **active** — у записи есть хотя бы один подписчик; запись живёт в карте кэша.
|
|
18
|
+
- **retention** — подписчиков нет; запущен таймер удержания ([`retentionTime`][api-res]).
|
|
19
|
+
- **removed** — таймер истёк; запись удалена из `CacheMap`.
|
|
20
|
+
|
|
21
|
+
## Ключ кэша
|
|
22
|
+
|
|
23
|
+
Ключ кэша - строка.
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
## Время удержания записи
|
|
27
|
+
|
|
28
|
+
Параметр `retentionTime` определяет, сколько запись остаётся в кэше после отписки последнего подписчика.
|
|
29
|
+
|
|
30
|
+
| Значение | Поведение |
|
|
31
|
+
|----------|-----------|
|
|
32
|
+
| произвольное `number` | Запись удаляется через указанное количество миллисекунд |
|
|
33
|
+
| `false` | Запись никогда не удаляется автоматически |
|
|
34
|
+
|
|
35
|
+
Задаётся на уровне [API][api] и может быть переопределён для конкретного [ресурса][api-res] или [команды][api-cmd].
|
|
36
|
+
|
|
37
|
+
## Записи, созданные через синхронизацию
|
|
38
|
+
|
|
39
|
+
Когда компонент подписывается на ключ, отсутствующий в локальном кэше,
|
|
40
|
+
хук `beforeQuery` отправляет REQ-сообщение через BroadcastChannel.
|
|
41
|
+
Если другая вкладка располагает данными для этого ключа,
|
|
42
|
+
она отвечает RES-сообщением.
|
|
43
|
+
Запись гидрируется в состоянии `success` с полученными данными,
|
|
44
|
+
и `queryFn` не вызывается — это обеспечивает мгновенный кэш-хит при монтировании компонента.
|
|
45
|
+
|
|
46
|
+
**Поведение по умолчанию:**
|
|
47
|
+
|
|
48
|
+
| Тип | `sync` | Создаётся запись? | Причина |
|
|
49
|
+
|-----------|--------|-------------------|----------------------------------------|
|
|
50
|
+
| Resource | `false`| нет | sync отключён по умолчанию (`defaultSync: 'none'`) |
|
|
51
|
+
| Command | `false`| нет | sync отключён по умолчанию (`defaultSync: 'none'`) |
|
|
52
|
+
|
|
53
|
+
Для включения синхронизации укажите `defaultSync` в `createApi` или `sync: true` для конкретной сущности.
|
|
54
|
+
|
|
55
|
+
Такая запись подчиняется обычным правилам удержания:
|
|
56
|
+
когда последний подписчик отписывается,
|
|
57
|
+
запись переходит в `retention` и удаляется по истечении `retentionTime`.
|
|
58
|
+
|
|
59
|
+
**Особенности:**
|
|
60
|
+
- `onCacheEntryAdded` **вызывается** — запись попала в кэш.
|
|
61
|
+
- `onQueryStarted` **не вызывается** — `queryFn` не исполнялся.
|
|
62
|
+
- Сравнение `updatedAt` предотвращает перезапись более свежих локальных данных устаревшим RES-сообщением.
|
|
63
|
+
|
|
64
|
+
## См. также
|
|
65
|
+
|
|
66
|
+
- Запись хранит [машину][machine] — иммутабельную машину состояний запроса.
|
|
67
|
+
- [Агент][agent] наблюдает за записью и транслирует её состояние (например в UI).
|
|
68
|
+
- Оптимистичные обновления применяются через [патчи][patching] внутри записи.
|
|
69
|
+
- Хук `onCacheEntryAdded` вызывается при создании записи — подробнее в [lifecycle][lifecycle].
|
|
70
|
+
- Данные из другой вкладки могут быть получены через [кросс-табовую синхронизацию][broadcast] (pull-модель: `beforeQuery` отправляет REQ, другая вкладка отвечает RES; SyncDriver управляется отдельным слоем Plugin/Manager, а не CacheMap напрямую).
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
[machine]: machine.md
|
|
75
|
+
[broadcast]: ../usage/broadcast.md
|
|
76
|
+
[agent]: agent.md
|
|
77
|
+
[patching]: patching.md
|
|
78
|
+
[api]: ../api/README.md
|
|
79
|
+
[api-res]: ../api/resource.md
|
|
80
|
+
[api-cmd]: ../api/command.md
|
|
81
|
+
[lifecycle]: ../usage/lifecycle.md
|