@raphy-js/raph 1.0.1-dev.20 → 1.0.1-dev.26

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 (107) hide show
  1. package/dist/{core-CyilRD7s.js → core-CClhT8WR.js} +389 -400
  2. package/dist/core-cPQWYD4K.cjs +1 -0
  3. package/dist/debug/api/Raph.cjs +1 -1
  4. package/dist/debug/api/Raph.js +46 -47
  5. package/dist/debug/api/RaphFacadeSession.cjs +1 -1
  6. package/dist/debug/api/RaphFacadeSession.js +85 -89
  7. package/dist/debug/api/RaphReactivityInstance.cjs +1 -1
  8. package/dist/debug/api/RaphReactivityInstance.js +27 -30
  9. package/dist/debug/path/DataPath.cjs +1 -1
  10. package/dist/debug/path/DataPath.js +198 -202
  11. package/dist/debug/path/PathRouter.cjs +1 -1
  12. package/dist/debug/path/PathRouter.js +44 -50
  13. package/dist/debug/path/RaphKernel.cjs +1 -1
  14. package/dist/debug/path/RaphKernel.js +257 -228
  15. package/dist/debug/path/data-path.utils.cjs +1 -1
  16. package/dist/debug/path/data-path.utils.js +41 -41
  17. package/dist/debug/path/derived/DerivedRegistry.cjs +1 -1
  18. package/dist/debug/path/derived/DerivedRegistry.js +52 -66
  19. package/dist/debug/path/derived/RaphDerivedHandle.cjs +1 -1
  20. package/dist/debug/path/derived/RaphDerivedHandle.js +19 -22
  21. package/dist/debug/path/derived/derived-collection.utils.cjs +1 -1
  22. package/dist/debug/path/derived/derived-collection.utils.js +70 -70
  23. package/dist/debug/path/meta/MetaController.cjs +1 -1
  24. package/dist/debug/path/meta/MetaController.js +57 -65
  25. package/dist/debug/path/meta/RaphMeta.cjs +1 -1
  26. package/dist/debug/path/meta/RaphMeta.js +26 -32
  27. package/dist/debug/path/meta/RaphMetaStore.cjs +1 -1
  28. package/dist/debug/path/meta/RaphMetaStore.js +24 -30
  29. package/dist/debug/path/storage/AdapterPathStore.cjs +1 -1
  30. package/dist/debug/path/storage/AdapterPathStore.js +49 -54
  31. package/dist/debug/path/storage/DefaultDataAdapter.cjs +1 -1
  32. package/dist/debug/path/storage/DefaultDataAdapter.js +46 -56
  33. package/dist/debug/path/storage/PathEventHub.cjs +1 -1
  34. package/dist/debug/path/storage/PathEventHub.js +74 -61
  35. package/dist/debug/path/storage/PathStore.cjs +1 -1
  36. package/dist/debug/path/storage/PathStore.js +89 -99
  37. package/dist/debug/path/storage/createDataDraft.cjs +1 -1
  38. package/dist/debug/path/storage/createDataDraft.js +24 -28
  39. package/dist/debug/reactivity/disposal.cjs +1 -0
  40. package/dist/debug/reactivity/disposal.js +32 -0
  41. package/dist/debug/reactivity/engine.cjs +1 -1
  42. package/dist/debug/reactivity/engine.js +787 -392
  43. package/dist/debug/reactivity/reactive-object.cjs +1 -1
  44. package/dist/debug/reactivity/reactive-object.js +81 -96
  45. package/dist/debug/reactivity/scope.cjs +1 -1
  46. package/dist/debug/reactivity/scope.js +221 -117
  47. package/dist/debug/reactivity/watch.cjs +1 -1
  48. package/dist/debug/reactivity/watch.js +1 -1
  49. package/dist/debug/runtime/RaphRuntime.cjs +1 -1
  50. package/dist/debug/runtime/RaphRuntime.js +764 -411
  51. package/dist/debug/runtime/diagnostics/RaphDebug.cjs +1 -1
  52. package/dist/debug/runtime/diagnostics/RaphDebug.js +90 -100
  53. package/dist/debug/runtime/ownership/RaphEffectScope.cjs +1 -1
  54. package/dist/debug/runtime/ownership/RaphEffectScope.js +215 -82
  55. package/dist/debug/runtime/ownership/RaphNode.cjs +1 -1
  56. package/dist/debug/runtime/ownership/RaphNode.js +595 -136
  57. package/dist/debug/runtime/ownership/RaphScope.cjs +1 -1
  58. package/dist/debug/runtime/ownership/RaphScope.js +203 -68
  59. package/dist/debug/runtime/phases/RaphFrameLoop.cjs +1 -1
  60. package/dist/debug/runtime/phases/RaphFrameLoop.js +13 -17
  61. package/dist/debug/runtime/phases/RaphPhasePipeline.cjs +1 -1
  62. package/dist/debug/runtime/phases/RaphPhasePipeline.js +618 -357
  63. package/dist/debug/runtime/phases/RaphPhaseTaskRecord.cjs +1 -0
  64. package/dist/debug/runtime/phases/RaphPhaseTaskRecord.js +176 -0
  65. package/dist/debug/runtime/phases/RaphPhaseWatch.cjs +1 -0
  66. package/dist/debug/runtime/phases/RaphPhaseWatch.js +20 -0
  67. package/dist/debug/runtime/reactivity/PathHandle.cjs +1 -1
  68. package/dist/debug/runtime/reactivity/PathHandle.js +50 -60
  69. package/dist/debug/runtime/reactivity/RaphMetaSource.cjs +1 -1
  70. package/dist/debug/runtime/reactivity/RaphMetaSource.js +28 -32
  71. package/dist/debug/runtime/reactivity/RaphSelector.cjs +1 -0
  72. package/dist/debug/runtime/reactivity/RaphSelector.js +503 -0
  73. package/dist/debug/runtime/reactivity/RaphWorkGraph.cjs +1 -1
  74. package/dist/debug/runtime/reactivity/RaphWorkGraph.js +541 -379
  75. package/dist/debug/runtime/reactivity/RuntimeReactivity.cjs +1 -1
  76. package/dist/debug/runtime/reactivity/RuntimeReactivity.js +484 -90
  77. package/dist/debug/runtime/reactivity/RuntimeWatch.cjs +1 -1
  78. package/dist/debug/runtime/reactivity/RuntimeWatch.js +33 -44
  79. package/dist/debug/runtime/reactivity/disposal-sweep.utils.cjs +1 -0
  80. package/dist/debug/runtime/reactivity/disposal-sweep.utils.js +42 -0
  81. package/dist/entrypoints/runtime.d.ts +2 -1
  82. package/dist/machine-testing.cjs +1 -1
  83. package/dist/machine-testing.js +1 -1
  84. package/dist/machine.cjs +1 -1
  85. package/dist/machine.js +216 -231
  86. package/dist/path/RaphKernel.d.ts +24 -0
  87. package/dist/path/storage/PathEventHub.d.ts +14 -0
  88. package/dist/path/storage/PathStore.d.ts +4 -4
  89. package/dist/reactivity/disposal.d.ts +14 -0
  90. package/dist/reactivity/engine.d.ts +177 -4
  91. package/dist/reactivity/scope.d.ts +108 -30
  92. package/dist/runtime/RaphRuntime.d.ts +236 -17
  93. package/dist/runtime/ownership/RaphEffectScope.d.ts +70 -1
  94. package/dist/runtime/ownership/RaphNode.d.ts +276 -6
  95. package/dist/runtime/ownership/RaphScope.d.ts +144 -14
  96. package/dist/runtime/phases/RaphPhasePipeline.d.ts +202 -28
  97. package/dist/runtime/phases/RaphPhaseTaskRecord.d.ts +195 -0
  98. package/dist/runtime/phases/RaphPhaseWatch.d.ts +22 -0
  99. package/dist/runtime/phases/phase.types.d.ts +83 -4
  100. package/dist/runtime/reactivity/RaphSelector.d.ts +338 -0
  101. package/dist/runtime/reactivity/RaphWorkGraph.d.ts +163 -25
  102. package/dist/runtime/reactivity/RuntimeReactivity.d.ts +258 -10
  103. package/dist/runtime/reactivity/RuntimeWatch.d.ts +8 -8
  104. package/dist/runtime/reactivity/disposal-sweep.utils.d.ts +19 -0
  105. package/dist/runtime/reactivity/runtime-reactivity.types.d.ts +48 -3
  106. package/package.json +10 -2
  107. 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 readonly _children;
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
- readonly api: Readonly<TApi>;
17
- meta: Record<string, unknown>;
37
+ private _meta;
18
38
  type: string;
19
- /** Distinguishes a subtree granule from the node's self granule. @internal */
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 { Disposer, OwnedSource, ReadonlySignal, Signal, WritableComputedOptions } from '../../reactivity/types';
2
- import { RaphAggregateSource, RaphEffectOptions, RaphPhaseEffect, RaphWatchOptions, RaphWatchSource } from '../phases/phase.types';
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
- /** Runtime owner storage intentionally does not inherit standalone unphased effect/watch. */
7
- export declare class RaphScope {
8
- readonly id: string;
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
- private readonly _resources;
11
- protected _disposed: boolean;
12
- protected _disposing: boolean;
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
- get disposed(): boolean;
15
- get active(): boolean;
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
- /** @internal */
33
- _debugResourceCount(): number;
34
- /** @internal */
35
- _debugSourceCount(): number;
158
+ /**
159
+ * Связывает готовую запись источника: источник сам становится элементом
160
+ * списка источников этого владельца, без обёртки и closure, и освобождает
161
+ * себя через собственный _finalizeSource().
162
+ *
163
+ * @internal
164
+ */
165
+ _adoptSourceEntry(entry: OwnedSourceEntry): void;
36
166
  /** @internal */
37
167
  _assertAlive(): void;
38
168
  }