@raphy-js/raph 1.0.1-dev.20 → 1.0.1-dev.25
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/dist/{core-CyilRD7s.js → core-CClhT8WR.js} +389 -400
- package/dist/core-cPQWYD4K.cjs +1 -0
- package/dist/debug/api/Raph.cjs +1 -1
- package/dist/debug/api/Raph.js +46 -47
- package/dist/debug/api/RaphFacadeSession.cjs +1 -1
- package/dist/debug/api/RaphFacadeSession.js +85 -89
- package/dist/debug/api/RaphReactivityInstance.cjs +1 -1
- package/dist/debug/api/RaphReactivityInstance.js +27 -30
- package/dist/debug/path/DataPath.cjs +1 -1
- package/dist/debug/path/DataPath.js +198 -202
- package/dist/debug/path/PathRouter.cjs +1 -1
- package/dist/debug/path/PathRouter.js +44 -50
- package/dist/debug/path/RaphKernel.cjs +1 -1
- package/dist/debug/path/RaphKernel.js +257 -228
- package/dist/debug/path/data-path.utils.cjs +1 -1
- package/dist/debug/path/data-path.utils.js +41 -41
- package/dist/debug/path/derived/DerivedRegistry.cjs +1 -1
- package/dist/debug/path/derived/DerivedRegistry.js +52 -66
- package/dist/debug/path/derived/RaphDerivedHandle.cjs +1 -1
- package/dist/debug/path/derived/RaphDerivedHandle.js +19 -22
- package/dist/debug/path/derived/derived-collection.utils.cjs +1 -1
- package/dist/debug/path/derived/derived-collection.utils.js +70 -70
- package/dist/debug/path/meta/MetaController.cjs +1 -1
- package/dist/debug/path/meta/MetaController.js +57 -65
- package/dist/debug/path/meta/RaphMeta.cjs +1 -1
- package/dist/debug/path/meta/RaphMeta.js +26 -32
- package/dist/debug/path/meta/RaphMetaStore.cjs +1 -1
- package/dist/debug/path/meta/RaphMetaStore.js +24 -30
- package/dist/debug/path/storage/AdapterPathStore.cjs +1 -1
- package/dist/debug/path/storage/AdapterPathStore.js +49 -54
- package/dist/debug/path/storage/DefaultDataAdapter.cjs +1 -1
- package/dist/debug/path/storage/DefaultDataAdapter.js +46 -56
- package/dist/debug/path/storage/PathEventHub.cjs +1 -1
- package/dist/debug/path/storage/PathEventHub.js +74 -61
- package/dist/debug/path/storage/PathStore.cjs +1 -1
- package/dist/debug/path/storage/PathStore.js +89 -99
- package/dist/debug/path/storage/createDataDraft.cjs +1 -1
- package/dist/debug/path/storage/createDataDraft.js +24 -28
- package/dist/debug/reactivity/disposal.cjs +1 -0
- package/dist/debug/reactivity/disposal.js +32 -0
- package/dist/debug/reactivity/engine.cjs +1 -1
- package/dist/debug/reactivity/engine.js +787 -392
- package/dist/debug/reactivity/reactive-object.cjs +1 -1
- package/dist/debug/reactivity/reactive-object.js +81 -96
- package/dist/debug/reactivity/scope.cjs +1 -1
- package/dist/debug/reactivity/scope.js +221 -117
- package/dist/debug/reactivity/watch.cjs +1 -1
- package/dist/debug/reactivity/watch.js +1 -1
- package/dist/debug/runtime/RaphRuntime.cjs +1 -1
- package/dist/debug/runtime/RaphRuntime.js +764 -411
- package/dist/debug/runtime/diagnostics/RaphDebug.cjs +1 -1
- package/dist/debug/runtime/diagnostics/RaphDebug.js +90 -100
- package/dist/debug/runtime/ownership/RaphEffectScope.cjs +1 -1
- package/dist/debug/runtime/ownership/RaphEffectScope.js +215 -82
- package/dist/debug/runtime/ownership/RaphNode.cjs +1 -1
- package/dist/debug/runtime/ownership/RaphNode.js +595 -136
- package/dist/debug/runtime/ownership/RaphScope.cjs +1 -1
- package/dist/debug/runtime/ownership/RaphScope.js +203 -68
- package/dist/debug/runtime/phases/RaphFrameLoop.cjs +1 -1
- package/dist/debug/runtime/phases/RaphFrameLoop.js +13 -17
- package/dist/debug/runtime/phases/RaphPhasePipeline.cjs +1 -1
- package/dist/debug/runtime/phases/RaphPhasePipeline.js +618 -357
- package/dist/debug/runtime/phases/RaphPhaseTaskRecord.cjs +1 -0
- package/dist/debug/runtime/phases/RaphPhaseTaskRecord.js +176 -0
- package/dist/debug/runtime/phases/RaphPhaseWatch.cjs +1 -0
- package/dist/debug/runtime/phases/RaphPhaseWatch.js +20 -0
- package/dist/debug/runtime/reactivity/PathHandle.cjs +1 -1
- package/dist/debug/runtime/reactivity/PathHandle.js +50 -60
- package/dist/debug/runtime/reactivity/RaphMetaSource.cjs +1 -1
- package/dist/debug/runtime/reactivity/RaphMetaSource.js +28 -32
- package/dist/debug/runtime/reactivity/RaphSelector.cjs +1 -0
- package/dist/debug/runtime/reactivity/RaphSelector.js +503 -0
- package/dist/debug/runtime/reactivity/RaphWorkGraph.cjs +1 -1
- package/dist/debug/runtime/reactivity/RaphWorkGraph.js +541 -379
- package/dist/debug/runtime/reactivity/RuntimeReactivity.cjs +1 -1
- package/dist/debug/runtime/reactivity/RuntimeReactivity.js +484 -90
- package/dist/debug/runtime/reactivity/RuntimeWatch.cjs +1 -1
- package/dist/debug/runtime/reactivity/RuntimeWatch.js +33 -44
- package/dist/debug/runtime/reactivity/disposal-sweep.utils.cjs +1 -0
- package/dist/debug/runtime/reactivity/disposal-sweep.utils.js +42 -0
- package/dist/entrypoints/runtime.d.ts +2 -1
- package/dist/machine-testing.cjs +1 -1
- package/dist/machine-testing.js +1 -1
- package/dist/machine.cjs +1 -1
- package/dist/machine.js +216 -231
- package/dist/path/RaphKernel.d.ts +24 -0
- package/dist/path/storage/PathEventHub.d.ts +14 -0
- package/dist/path/storage/PathStore.d.ts +4 -4
- package/dist/reactivity/disposal.d.ts +14 -0
- package/dist/reactivity/engine.d.ts +177 -4
- package/dist/reactivity/scope.d.ts +108 -30
- package/dist/runtime/RaphRuntime.d.ts +236 -17
- package/dist/runtime/ownership/RaphEffectScope.d.ts +70 -1
- package/dist/runtime/ownership/RaphNode.d.ts +276 -6
- package/dist/runtime/ownership/RaphScope.d.ts +144 -14
- package/dist/runtime/phases/RaphPhasePipeline.d.ts +202 -28
- package/dist/runtime/phases/RaphPhaseTaskRecord.d.ts +195 -0
- package/dist/runtime/phases/RaphPhaseWatch.d.ts +22 -0
- package/dist/runtime/phases/phase.types.d.ts +83 -4
- package/dist/runtime/reactivity/RaphSelector.d.ts +338 -0
- package/dist/runtime/reactivity/RaphWorkGraph.d.ts +163 -25
- package/dist/runtime/reactivity/RuntimeReactivity.d.ts +258 -10
- package/dist/runtime/reactivity/RuntimeWatch.d.ts +8 -8
- package/dist/runtime/reactivity/disposal-sweep.utils.d.ts +19 -0
- package/dist/runtime/reactivity/runtime-reactivity.types.d.ts +48 -3
- package/package.json +9 -1
- package/dist/core-ugchZNqC.cjs +0 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DisposalFailure } from '../../reactivity/disposal';
|
|
1
2
|
import { RaphRuntime } from '../RaphRuntime';
|
|
2
3
|
import { RaphScope } from './RaphScope';
|
|
3
4
|
export interface NodeOptions {
|
|
@@ -7,34 +8,303 @@ export interface NodeOptions {
|
|
|
7
8
|
readonly meta?: Readonly<Record<string, unknown>>;
|
|
8
9
|
readonly type?: string;
|
|
9
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Запись, которая знает свою node: сама RaphNode либо объект потребителя с
|
|
13
|
+
* полем `node`. Позволяет передать на удаление уже существующий массив записей
|
|
14
|
+
* без копии в массив nodes.
|
|
15
|
+
*/
|
|
16
|
+
export interface RaphNodeHolder {
|
|
17
|
+
readonly node: RaphNode;
|
|
18
|
+
}
|
|
10
19
|
/** Scope with an explicit parent/children ownership position. */
|
|
11
20
|
export declare class RaphNode<TApi = unknown> extends RaphScope {
|
|
21
|
+
#private;
|
|
12
22
|
priority: number;
|
|
13
23
|
private _parent;
|
|
14
|
-
private
|
|
24
|
+
private _prevSibling;
|
|
25
|
+
private _nextSibling;
|
|
26
|
+
private _firstChild;
|
|
27
|
+
private _lastChild;
|
|
28
|
+
/**
|
|
29
|
+
* Число прямых детей. Structural owner читает его, чтобы узнать состав
|
|
30
|
+
* списка, не строя массив `children`; изменяет поле только сама node.
|
|
31
|
+
*
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
_childCount: number;
|
|
35
|
+
private _childArray;
|
|
15
36
|
private _published;
|
|
16
|
-
|
|
17
|
-
meta: Record<string, unknown>;
|
|
37
|
+
private _meta;
|
|
18
38
|
type: string;
|
|
19
|
-
|
|
20
|
-
readonly _subtreeSourceIdentity: Readonly<{}>;
|
|
39
|
+
private _subtreeIdentity;
|
|
21
40
|
constructor(parent: RaphNode | RaphRuntime | null, options?: Omit<NodeOptions, 'parent'>, runtime?: RaphRuntime, publication?: never);
|
|
41
|
+
/**
|
|
42
|
+
* Возвращает id; номер id по умолчанию превращается в `node-N` при первом чтении.
|
|
43
|
+
*/
|
|
44
|
+
get id(): string;
|
|
45
|
+
/**
|
|
46
|
+
* Возвращает изменяемую metadata node; объект создаётся при первом чтении.
|
|
47
|
+
*/
|
|
48
|
+
get meta(): Record<string, unknown>;
|
|
49
|
+
set meta(value: Record<string, unknown>);
|
|
50
|
+
/**
|
|
51
|
+
* Возвращает api, зафиксированный после setup; присваивание снаружи запрещено.
|
|
52
|
+
*/
|
|
53
|
+
get api(): Readonly<TApi>;
|
|
54
|
+
/**
|
|
55
|
+
* Отличает subtree granule от self granule; identity создаётся по запросу.
|
|
56
|
+
* @internal
|
|
57
|
+
*/
|
|
58
|
+
get _subtreeSourceIdentity(): object;
|
|
22
59
|
get node(): RaphNode<TApi>;
|
|
23
60
|
get parent(): RaphNode | null;
|
|
61
|
+
/**
|
|
62
|
+
* Возвращает прямых детей в их порядке. Массив действителен до следующей
|
|
63
|
+
* структурной mutation этой node; после неё порядок даёт новое чтение.
|
|
64
|
+
*
|
|
65
|
+
* Добавление в конец, удаление последнего child и `reorderChildren`
|
|
66
|
+
* обновляют уже выданный массив на месте. После удаления любого другого
|
|
67
|
+
* child — первого или из середины — выданный массив либо остаётся прежним, и
|
|
68
|
+
* следующее чтение строит новый, либо обновляется на месте — второе
|
|
69
|
+
* происходит, пока у Runtime есть подписчик на node.
|
|
70
|
+
*
|
|
71
|
+
* `moveChild` и `_swapChildren` следуют тому же правилу, что и удаление не
|
|
72
|
+
* последнего child: без подписчика на node выданный массив остаётся прежним,
|
|
73
|
+
* с подписчиком получает новый порядок на месте. `_disposeChildren` забывает
|
|
74
|
+
* выданный массив, если набор начинается с первого child списка: массив
|
|
75
|
+
* хранит состав на начало удаления. Набор, который начинается с другого
|
|
76
|
+
* child, следует правилу отдельных удалений.
|
|
77
|
+
*
|
|
78
|
+
* Собственный dispose node выданный массив не обновляет: пока node удаляет
|
|
79
|
+
* своих детей, он хранит их состав на начало удаления, а после удаления
|
|
80
|
+
* последнего child становится пустым. Оставшихся детей в это время даёт
|
|
81
|
+
* новое чтение; выданный им массив остаётся массивом node до конца удаления:
|
|
82
|
+
* дети выходят из него на месте и при отсутствии подписчика на node, а после
|
|
83
|
+
* последнего child он тоже пуст.
|
|
84
|
+
*/
|
|
24
85
|
get children(): readonly RaphNode[];
|
|
25
86
|
addChild(node: RaphNode): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Ставит прямых детей в порядок `nodes`: в нём каждый прямой child ровно
|
|
89
|
+
* один раз. Без подписчика на node порядок проверяется и применяется по
|
|
90
|
+
* связям между siblings, без Set и Map.
|
|
91
|
+
*
|
|
92
|
+
* Каждый элемент `nodes` читается один раз, до проверки. Чтение, которое само
|
|
93
|
+
* меняет дерево — элемент Proxy либо accessor, — не оставляет списки в
|
|
94
|
+
* промежуточном состоянии: порядок проверяется по составу детей после чтения.
|
|
95
|
+
*/
|
|
26
96
|
reorderChildren(nodes: readonly RaphNode[]): void;
|
|
97
|
+
/**
|
|
98
|
+
* Ставит прямого child перед прямым child `before` либо в конец списка, если
|
|
99
|
+
* `before === null`. Без подписчика на node меняются только связи самого
|
|
100
|
+
* child и его соседей: цена не зависит от числа детей. С подписчиком каждый
|
|
101
|
+
* child, чей индекс изменился, получает тот же structure cause, что и после
|
|
102
|
+
* `reorderChildren` с итоговым порядком.
|
|
103
|
+
*/
|
|
104
|
+
moveChild(child: RaphNode, before: RaphNode | null): void;
|
|
105
|
+
/**
|
|
106
|
+
* Меняет местами двух прямых детей. Без подписчика на node правятся только
|
|
107
|
+
* связи этих детей и их соседей; с подписчиком оба child получают те же
|
|
108
|
+
* structure causes, что и после `reorderChildren` с итоговым порядком.
|
|
109
|
+
*
|
|
110
|
+
* @internal
|
|
111
|
+
*/
|
|
112
|
+
_swapChildren(first: RaphNode, second: RaphNode): void;
|
|
113
|
+
/**
|
|
114
|
+
* Удаляет детей одной границей удаления и возвращает их ошибки вместо throw.
|
|
115
|
+
*
|
|
116
|
+
* Без аргументов удаляются все дети node, какими они были на момент вызова.
|
|
117
|
+
* С `holders` удаляются nodes записей `holders[start]`…`holders[end - 1]`:
|
|
118
|
+
* ожидается, что это прямые дети node. Массив записей служит snapshot набора
|
|
119
|
+
* и не копируется: child, которого cleanup более раннего child уже удалил,
|
|
120
|
+
* пропускается, перенесённый к другому parent всё равно удаляется, а дети,
|
|
121
|
+
* добавленные во время удаления, в набор не входят.
|
|
122
|
+
*
|
|
123
|
+
* Каждый child удаляется собственным `dispose()` в порядке набора: порядок
|
|
124
|
+
* cleanup, structure causes при наличии подписчика и ошибка каждого child те
|
|
125
|
+
* же, что у отдельных вызовов `dispose()` внутри одного batch. Ошибка child
|
|
126
|
+
* не прерывает удаление остальных; ошибки возвращаются в порядке набора,
|
|
127
|
+
* последней — ошибка phases, исполненных при закрытии границы.
|
|
128
|
+
*
|
|
129
|
+
* Граница одна на весь набор: phases, запрошенные cleanup, исполняются после
|
|
130
|
+
* последнего child, а не между детьми. Это граница удаления владельца, как у
|
|
131
|
+
* `RaphNode.dispose()`, а не reactive batch: запись signal из cleanup
|
|
132
|
+
* применяется сразу, и её phase tasks встают в очередь в момент записи, в
|
|
133
|
+
* порядке отдельных удалений. Внутри `batch` та же запись откладывается до
|
|
134
|
+
* его конца, поэтому порядок phase tasks у batch другой.
|
|
135
|
+
*
|
|
136
|
+
* Выданный массив `children` node забывает до первого child, если набор
|
|
137
|
+
* начинается с первого child списка либо набором передан сам этот массив: он
|
|
138
|
+
* остаётся у того, кто его держит, с составом на начало удаления, и удаление
|
|
139
|
+
* набора от первого child списка не правит его через `shift`, `splice` или
|
|
140
|
+
* `indexOf` даже при подписчике на node. Набор, который начинается с другого
|
|
141
|
+
* child, следует правилу отдельных `dispose()`: последний child уходит из
|
|
142
|
+
* массива через pop, остальные вырезаются на месте при подписчике на node, а
|
|
143
|
+
* без подписчика массив забывается первым же удалением.
|
|
144
|
+
*
|
|
145
|
+
* @internal
|
|
146
|
+
*/
|
|
147
|
+
_disposeChildren(): unknown[] | undefined;
|
|
148
|
+
/** @internal */
|
|
149
|
+
_disposeChildren(holders: readonly RaphNodeHolder[], start?: number, end?: number): unknown[] | undefined;
|
|
27
150
|
options(options: Pick<NodeOptions, 'meta' | 'priority' | 'type'>): void;
|
|
28
151
|
/** Invalidates coarse self/subtree/runtime granules for non-reactive state. */
|
|
29
152
|
touch(metadata?: unknown): void;
|
|
30
153
|
remove(): void;
|
|
31
154
|
dispose(): void;
|
|
32
|
-
/** @internal */
|
|
155
|
+
/** Calls actual public dispatch once; only native disposal can return provenance. @internal */
|
|
156
|
+
_disposeForOwner(): DisposalFailure | undefined;
|
|
157
|
+
/** Result of this exact framework call, without changing raw public disposal. @internal */
|
|
158
|
+
_disposeWithOutcome(): DisposalFailure | undefined;
|
|
159
|
+
/**
|
|
160
|
+
* Фиксирует api после setup; object api замораживается, как и раньше.
|
|
161
|
+
* Исключение — Runtime signal, возвращённый как api: значение, запись графа
|
|
162
|
+
* и связи подписчиков лежат в его собственных полях, поэтому заморозка
|
|
163
|
+
* лишила бы его записи, отслеживаемого чтения, watch и освобождения вместе
|
|
164
|
+
* с владельцем.
|
|
165
|
+
* @internal
|
|
166
|
+
*/
|
|
33
167
|
_setApi(api: TApi): void;
|
|
34
168
|
/** Publishes a fully initialized provisional subtree. @internal */
|
|
35
169
|
_publishCreation(): void;
|
|
36
170
|
/** @internal */
|
|
37
171
|
_isPublished(): boolean;
|
|
172
|
+
/**
|
|
173
|
+
* Сообщает, стоит ли node в списке детей своего parent. Node без parent и
|
|
174
|
+
* node, чей parent уже сбросил свой список, в нём не стоят.
|
|
175
|
+
*
|
|
176
|
+
* @internal
|
|
177
|
+
*/
|
|
178
|
+
_isLinked(): boolean;
|
|
179
|
+
/**
|
|
180
|
+
* Добавляет в `into` всех потомков node по связям списков детей: каждый
|
|
181
|
+
* child сразу за своим parent, дети — в порядке списка. Обход не строит
|
|
182
|
+
* массивы `children` и не зависит от глубины стека.
|
|
183
|
+
*
|
|
184
|
+
* @internal
|
|
185
|
+
*/
|
|
186
|
+
_collectDescendants(into: RaphScope[]): void;
|
|
187
|
+
/**
|
|
188
|
+
* Прибавляет к `totals` число ресурсов и sources самой node и всех её
|
|
189
|
+
* потомков. Обход тот же, что у `_collectDescendants`, но владельцев он не
|
|
190
|
+
* собирает: подсчёт для diagnostics не выделяет память по числу владельцев.
|
|
191
|
+
*
|
|
192
|
+
* @internal
|
|
193
|
+
*/
|
|
194
|
+
_countSubtree(totals: {
|
|
195
|
+
resources: number;
|
|
196
|
+
sources: number;
|
|
197
|
+
}): void;
|
|
198
|
+
/**
|
|
199
|
+
* Ищет node по id в своём поддереве. Порядок обхода прежний: сама node,
|
|
200
|
+
* затем дети от последнего к первому, каждый вместе со своим поддеревом.
|
|
201
|
+
*
|
|
202
|
+
* @internal
|
|
203
|
+
*/
|
|
204
|
+
_findNode(id: string): RaphNode | undefined;
|
|
205
|
+
/**
|
|
206
|
+
* Применяет порядок детей `nodes`. Возвращает `false` и оставляет список
|
|
207
|
+
* прежним, если `nodes` не содержит каждого живого прямого child ровно один
|
|
208
|
+
* раз. Прежние индексы собираются только при подписчике на node: без него
|
|
209
|
+
* structure cause никто не получит.
|
|
210
|
+
*/
|
|
211
|
+
private _applyChildOrder;
|
|
212
|
+
/**
|
|
213
|
+
* Проверяет порядок и переставляет связи за три прохода без Set и Map.
|
|
214
|
+
* Сначала каждый child списка получает метку: его `_prevSibling` указывает на
|
|
215
|
+
* parent, чего у прямого child не бывает. Затем метка снимается у каждой node
|
|
216
|
+
* из `nodes`: node без метки — чужая, удаляемая либо повторная. При отказе
|
|
217
|
+
* и при ошибке чтения `nodes` связи `_prevSibling` восстанавливаются по
|
|
218
|
+
* нетронутым `_nextSibling`.
|
|
219
|
+
*
|
|
220
|
+
* `nodes` — собственная копия порядка: её чтение не исполняет чужой код, и
|
|
221
|
+
* между расстановкой меток и их снятием дерево никто не меняет.
|
|
222
|
+
*/
|
|
223
|
+
private _relinkChildren;
|
|
224
|
+
/**
|
|
225
|
+
* Сообщает причину отказа порядка `nodes` теми же ошибками и в том же
|
|
226
|
+
* порядке, что и прежняя проверка; Set нужен только здесь.
|
|
227
|
+
*/
|
|
228
|
+
private _rejectChildOrder;
|
|
229
|
+
/**
|
|
230
|
+
* Запоминает индекс каждого child до перестановки; нужен только для
|
|
231
|
+
* structure causes.
|
|
232
|
+
*/
|
|
233
|
+
private _indexChildren;
|
|
234
|
+
/**
|
|
235
|
+
* Завершает перестановку связей при подписчике на node: массив детей
|
|
236
|
+
* получает новый порядок на месте либо строится, и каждый child со
|
|
237
|
+
* сменившимся индексом получает structure cause.
|
|
238
|
+
*/
|
|
239
|
+
private _publishChildOrder;
|
|
240
|
+
/**
|
|
241
|
+
* Публикует structure cause каждому child, чей индекс изменился, в новом
|
|
242
|
+
* порядке детей и одной границей mutation.
|
|
243
|
+
*/
|
|
244
|
+
private _notifyChildOrder;
|
|
245
|
+
/**
|
|
246
|
+
* Переставляет child перед `before` либо в конец списка, меняя только связи
|
|
247
|
+
* child и его соседей. Вызывающий гарантирует, что оба — дети этой node и
|
|
248
|
+
* что child ещё не стоит перед `before`.
|
|
249
|
+
*/
|
|
250
|
+
private _relinkBefore;
|
|
251
|
+
/**
|
|
252
|
+
* Строит массив детей по связям и запоминает его для следующих чтений.
|
|
253
|
+
*/
|
|
254
|
+
private _materializeChildren;
|
|
255
|
+
/**
|
|
256
|
+
* Собирает детей по связям в новый массив, не запоминая его.
|
|
257
|
+
*/
|
|
258
|
+
private _collectChildren;
|
|
259
|
+
/**
|
|
260
|
+
* Очищает и забывает выданный массив детей, если он есть.
|
|
261
|
+
*/
|
|
262
|
+
private _clearChildArray;
|
|
263
|
+
/**
|
|
264
|
+
* Добавляет child в конец списка; уже выданный массив получает его через push.
|
|
265
|
+
*/
|
|
266
|
+
private _appendChild;
|
|
267
|
+
/**
|
|
268
|
+
* Возвращает позицию node среди детей `parent` либо -1, если `parent` уже
|
|
269
|
+
* сбросил свой список и node в нём не состоит. Нужна только для structure
|
|
270
|
+
* cause. Первый и последний child определяются по связям, остальные — через
|
|
271
|
+
* `indexOf` по массиву детей, как и раньше; массив строится один раз и затем
|
|
272
|
+
* поддерживается, поэтому обход связей на каждый запрос не повторяется.
|
|
273
|
+
*/
|
|
274
|
+
private _indexIn;
|
|
275
|
+
/**
|
|
276
|
+
* Вынимает node из списка `parent` и обнуляет её связи, чтобы удержанная node
|
|
277
|
+
* не удерживала соседей. Связи правятся за постоянное время.
|
|
278
|
+
*
|
|
279
|
+
* Уже выданный массив теряет последний child через pop. Любой другой child —
|
|
280
|
+
* первый или из середины — вырезается на месте, только если его `index`
|
|
281
|
+
* известен (>= 0) либо у Runtime есть подписчик на node: тогда массив ещё
|
|
282
|
+
* понадобится для индексов и перестраивать его по связям после каждого
|
|
283
|
+
* удаления дороже. Иначе массив не правится, а отбрасывается, и следующее
|
|
284
|
+
* чтение `children` строит новый: очистка списка от первого child к
|
|
285
|
+
* последнему не сдвигает массив на каждое удаление.
|
|
286
|
+
*
|
|
287
|
+
* Пока parent удаляет собственных детей, массив не отбрасывается: его мог
|
|
288
|
+
* запросить только cleanup уже удаляемого child, и `_resetChildList` обязан
|
|
289
|
+
* очистить именно его. Отброшенный массив остался бы у cleanup с удалёнными
|
|
290
|
+
* детьми внутри.
|
|
291
|
+
*/
|
|
292
|
+
private _unlinkFrom;
|
|
293
|
+
/**
|
|
294
|
+
* Возвращает snapshot детей для их удаления. Уже выданный массив
|
|
295
|
+
* переиспользуется без копии и на время удаления перестаёт быть массивом
|
|
296
|
+
* node: дети выходят из списка только через связи, snapshot не сдвигается, и
|
|
297
|
+
* удаление не платит за `shift` на каждого child. Иначе snapshot строится по
|
|
298
|
+
* связям.
|
|
299
|
+
*/
|
|
300
|
+
private _takeChildSnapshot;
|
|
301
|
+
/**
|
|
302
|
+
* Сбрасывает собственный список после удаления детей. `snapshot` мог быть
|
|
303
|
+
* выданным массивом: как и раньше, у удалённой node он остаётся пустым.
|
|
304
|
+
* Массив, запрошенный во время удаления, очищается так же: `_unlinkFrom` не
|
|
305
|
+
* отбрасывает его, пока node удаляет своих детей.
|
|
306
|
+
*/
|
|
307
|
+
private _resetChildList;
|
|
38
308
|
}
|
|
39
309
|
/** Creates an unpublished node that Runtime.node() commits after setup. @internal */
|
|
40
310
|
export declare function createProvisionalNode<TApi>(parent: RaphNode, options: Omit<NodeOptions, 'parent'>, runtime: RaphRuntime): RaphNode<TApi>;
|
|
@@ -1,38 +1,168 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { DisposalFailure } from '../../reactivity/disposal';
|
|
2
|
+
import { OwnedSourceEntry, ScopeOwner } from '../../reactivity/scope';
|
|
3
|
+
import { Disposer, OwnedResource, OwnedSource, ReadonlySignal, Signal, WritableComputedOptions } from '../../reactivity/types';
|
|
4
|
+
import { RaphAggregateSource, RaphEffectGroup, RaphEffectGroupOptions, RaphEffectGroupSlot, RaphEffectOptions, RaphPhaseBody, RaphPhaseEffect, RaphWatchOptions, RaphWatchSource } from '../phases/phase.types';
|
|
3
5
|
import { RaphRuntime } from '../RaphRuntime';
|
|
6
|
+
import { RaphSelector, RaphSelectorOptions } from '../reactivity/RaphSelector';
|
|
4
7
|
import { RaphAggregate } from '../reactivity/RaphWorkGraph';
|
|
5
8
|
import { RaphNode } from './RaphNode';
|
|
6
|
-
/**
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Runtime owner. Список ресурсов, список источников и признаки lifetime
|
|
11
|
+
* наследуются от ScopeOwner и лежат в самом владельце; standalone unphased
|
|
12
|
+
* effect/watch класса ScopeNode Runtime-владелец намеренно не наследует.
|
|
13
|
+
*/
|
|
14
|
+
export declare class RaphScope extends ScopeOwner {
|
|
15
|
+
/**
|
|
16
|
+
* Явный id либо числовой номер id по умолчанию, который RaphNode
|
|
17
|
+
* форматирует при первом чтении `id`.
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
protected _id: string | number;
|
|
9
21
|
readonly runtime: RaphRuntime;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Порядковый номер регистрации владельца в его Runtime. Владельцы, пережившие
|
|
24
|
+
* дерево root, Runtime при собственном освобождении обходит по этому номеру
|
|
25
|
+
* от нового к старому.
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
readonly _order: number;
|
|
29
|
+
/**
|
|
30
|
+
* Prototype-бренд для горячих проверок владельца: `true` только у RaphNode.
|
|
31
|
+
* Значение лежит на prototype и не занимает поле экземпляра.
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
readonly _isNode: boolean;
|
|
13
35
|
constructor(id: string, runtime: RaphRuntime);
|
|
14
|
-
|
|
15
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Числовой id зарезервирован за ленивым id по умолчанию у RaphNode.
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
constructor(id: string | number, runtime: RaphRuntime);
|
|
41
|
+
/**
|
|
42
|
+
* Возвращает id владельца; plain scope всегда хранит явную строку.
|
|
43
|
+
*/
|
|
44
|
+
get id(): string;
|
|
16
45
|
/** Stable selector for process ordering; plain scopes are not tree nodes. */
|
|
17
46
|
get node(): RaphNode | undefined;
|
|
18
47
|
signal<T>(value: T): Signal<T>;
|
|
19
48
|
computed<T>(getter: () => T): ReadonlySignal<T>;
|
|
20
49
|
computed<T>(options: WritableComputedOptions<T>): Signal<T>;
|
|
50
|
+
/**
|
|
51
|
+
* Создаёт selector над записываемым signal: функцию `(key) => boolean`,
|
|
52
|
+
* которая отвечает, совпадает ли ключ с текущим значением `source`, и
|
|
53
|
+
* подписывает потребителя только на этот ключ. Запись в `source` будит
|
|
54
|
+
* потребителей прежнего и нового значения, а не всех читателей.
|
|
55
|
+
*
|
|
56
|
+
* Selector принадлежит этому владельцу и живёт до его освобождения; `source`
|
|
57
|
+
* должен принадлежать самому владельцу, его предку или root scope. Читать
|
|
58
|
+
* selector вправе те же потребители, что и signal этого владельца.
|
|
59
|
+
*
|
|
60
|
+
* @typeParam Key — тип ключа и значения `source`.
|
|
61
|
+
*/
|
|
62
|
+
selector<Key>(source: Signal<Key>, options?: RaphSelectorOptions<Key>): RaphSelector<Key>;
|
|
21
63
|
effect(phase: string, callback: RaphPhaseEffect, options?: RaphEffectOptions): Disposer;
|
|
64
|
+
/**
|
|
65
|
+
* Регистрирует phase effect без task и без disposer. Тело вызывается без
|
|
66
|
+
* аргументов, а binding живёт до освобождения этого владельца: отдельно его
|
|
67
|
+
* остановить нельзя. Зависимости, порядок, `initial`, `priority` и cleanup
|
|
68
|
+
* те же, что у `effect()`.
|
|
69
|
+
*
|
|
70
|
+
* Frozen task такого binding создаётся, только если его запросит `process`
|
|
71
|
+
* своей phase; на регистрацию приходится одна запись binding.
|
|
72
|
+
* Для тела, которому нужна task или отдельная остановка, остаётся `effect()`.
|
|
73
|
+
*/
|
|
74
|
+
bindEffect(phase: string, body: RaphPhaseBody, options?: RaphEffectOptions): void;
|
|
75
|
+
/**
|
|
76
|
+
* Регистрирует группу из `count` phase effects на одном binding: без task и
|
|
77
|
+
* без disposer, как `bindEffect()`. `runSlot(run)` — тело каждого slot: оно
|
|
78
|
+
* получает запуск, где `run[0]` — context группы, а `run[1]` — номер slot.
|
|
79
|
+
* Чтения внутри вызова отслеживаются отдельно для этого slot, поэтому
|
|
80
|
+
* изменение зависимости перезапускает только те slots, которые её читали.
|
|
81
|
+
*
|
|
82
|
+
* Группа — одна phase task и один ресурс владельца. Регистрация ничего не
|
|
83
|
+
* исполняет: каждый slot запускает `start(slot, initial?)` возвращённой
|
|
84
|
+
* группы, и с этого вызова slot ведёт себя как binding, который
|
|
85
|
+
* `bindEffect()` зарегистрировал бы в этом месте. Доставка исполняет
|
|
86
|
+
* запущенные slots, чьи зависимости изменились, в порядке их номеров; сбой
|
|
87
|
+
* одного slot не мешает остальным и сообщается отдельной ошибкой, как сбой
|
|
88
|
+
* отдельного binding. Причины всех slots складываются в `causes` одной task,
|
|
89
|
+
* которую custom `process` получает на всю группу. Cleanup, который вернул
|
|
90
|
+
* slot, выполняется перед его следующим запуском и при освобождении группы.
|
|
91
|
+
*
|
|
92
|
+
* Порядок `priority desc → FIFO` действует между tasks: группа занимает в
|
|
93
|
+
* очереди phase место своего первого изменившегося slot. Внутри task slots
|
|
94
|
+
* исполняются по номерам, а slot, который изменился, пока его группа
|
|
95
|
+
* доставляется, исполняется в этой же доставке, если до него ещё не дошла
|
|
96
|
+
* очередь. Slot, в источник которого записали, пока он ждал запуска в этой
|
|
97
|
+
* доставке, исполняется в ней один раз и читает новое значение; slot, чьи
|
|
98
|
+
* зависимости не изменились, тело не исполняет, даже если причина пришла
|
|
99
|
+
* группе из-за соседнего slot. После доставки, во время которой группе
|
|
100
|
+
* пришла причина, группа доставляется ещё раз с новыми причинами и
|
|
101
|
+
* исполняет только slots, изменившиеся после своего запуска; `cancel()`
|
|
102
|
+
* доставки, во время которой пришла причина, оставляет ждавшие slots
|
|
103
|
+
* запланированными.
|
|
104
|
+
*
|
|
105
|
+
* Группа живёт до освобождения этого владельца: отдельно её остановить
|
|
106
|
+
* нельзя. Владелец освобождает её после ресурсов, зарегистрированных позже,
|
|
107
|
+
* в том числе телами её slots; slots освобождаются в порядке, обратном
|
|
108
|
+
* порядку номеров. Несколько сбоев cleanup при освобождении группы приходят
|
|
109
|
+
* одним `AggregateError` с сообщением `[Raph] Effect group disposal failed.`
|
|
110
|
+
* как один сбой ресурса владельца; единственный сбой бросается как есть.
|
|
111
|
+
*
|
|
112
|
+
* @typeParam Context — значение, которое получает тело каждого slot.
|
|
113
|
+
* @param phase Имя объявленной phase.
|
|
114
|
+
* @param count Число slots: целое от 1 до 4294967293, иначе `RangeError`.
|
|
115
|
+
* @param runSlot Тело slot: получает запуск с `context` и номером slot.
|
|
116
|
+
* @param context Значение, которое группа передаёт телу каждого slot.
|
|
117
|
+
* @param options `priority` task группы, как у `effect()`.
|
|
118
|
+
*/
|
|
119
|
+
effectGroup<Context>(phase: string, count: number, runSlot: RaphEffectGroupSlot<Context>, context: Context, options?: RaphEffectGroupOptions): RaphEffectGroup;
|
|
22
120
|
watch(source: RaphWatchSource, phase: string, callback: RaphPhaseEffect, options?: RaphWatchOptions): Disposer;
|
|
121
|
+
/**
|
|
122
|
+
* Внутренняя регистрация renderer без возвращаемого disposer. Failure
|
|
123
|
+
* continuation относится только к завершившемуся execution request.
|
|
124
|
+
* @internal
|
|
125
|
+
*/
|
|
126
|
+
_registerEffect(phase: string, callback: RaphPhaseEffect, options: RaphEffectOptions, taskless: boolean, onExecutionFailure: (error: unknown) => never, isExecutionCancelled?: () => boolean): void;
|
|
127
|
+
/** @internal */
|
|
128
|
+
_registerWatch(source: RaphWatchSource, phase: string, callback: RaphPhaseEffect, options: RaphWatchOptions, onExecutionFailure: (error: unknown) => never, isExecutionCancelled?: () => boolean): void;
|
|
129
|
+
/**
|
|
130
|
+
* Выдаёт внутренний typed handle вместо приведения публичного group handle.
|
|
131
|
+
* Порядок создания и принятия ресурса совпадает с effectGroup().
|
|
132
|
+
* @internal
|
|
133
|
+
*/
|
|
134
|
+
_registerEffectGroup<Context>(phase: string, count: number, runSlot: RaphEffectGroupSlot<Context>, context: Context, options?: RaphEffectGroupOptions): ReturnType<RaphRuntime['_effectGroupRegistration']>;
|
|
23
135
|
aggregate(sources: readonly RaphAggregateSource[]): RaphAggregate;
|
|
24
136
|
action<Args extends unknown[], Result>(operation: (...args: Args) => Result): (...args: Args) => Result;
|
|
25
137
|
action<Args extends unknown[], Result>(name: string, operation: (...args: Args) => Result): (...args: Args) => Result;
|
|
26
138
|
own(disposer: Disposer): Disposer;
|
|
27
139
|
dispose(): void;
|
|
140
|
+
/** Node's super stage keeps the actual public base-method lookup observable. @internal */
|
|
141
|
+
_disposeScopeForOwner(dispose: Disposer): DisposalFailure | undefined;
|
|
142
|
+
/** One explicit framework disposal result; public dispose never leaks it. @internal */
|
|
143
|
+
_disposeWithOutcome(): DisposalFailure | undefined;
|
|
144
|
+
/** Framework capture registration; ordinary own callback semantics are unchanged. @internal */
|
|
145
|
+
_ownCompletedCleanup(cleanup: () => DisposalFailure | undefined): Disposer;
|
|
28
146
|
/** @internal */
|
|
29
147
|
_adoptResource(disposer: Disposer): Disposer;
|
|
148
|
+
/**
|
|
149
|
+
* Связывает готовую запись ресурса: запись сама становится элементом списка
|
|
150
|
+
* ресурсов этого владельца, без обёртки и closure, и освобождает себя через
|
|
151
|
+
* унаследованный _releaseRecord() из собственного dispose().
|
|
152
|
+
*
|
|
153
|
+
* @internal
|
|
154
|
+
*/
|
|
155
|
+
_adoptRecord(entry: OwnedResource): void;
|
|
30
156
|
/** @internal */
|
|
31
157
|
_adoptSource<T>(source: OwnedSource<T>): T;
|
|
32
|
-
/**
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
158
|
+
/**
|
|
159
|
+
* Связывает готовую запись источника: источник сам становится элементом
|
|
160
|
+
* списка источников этого владельца, без обёртки и closure, и освобождает
|
|
161
|
+
* себя через собственный _finalizeSource().
|
|
162
|
+
*
|
|
163
|
+
* @internal
|
|
164
|
+
*/
|
|
165
|
+
_adoptSourceEntry(entry: OwnedSourceEntry): void;
|
|
36
166
|
/** @internal */
|
|
37
167
|
_assertAlive(): void;
|
|
38
168
|
}
|