@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
@@ -3,6 +3,7 @@ import { RaphMetaEvents, RaphMetaReadOptions, RaphMetaWatchOptions, RaphMetaWrit
3
3
  import { RaphMeta } from './meta/RaphMeta';
4
4
  import { DataPathDef, PathOptions, PathWatchCallback } from './path.types';
5
5
  import { DataAdapter, DataObject, DefaultAdapterOptions } from './storage/data-adapter.types';
6
+ import { PathEventHub } from './storage/PathEventHub';
6
7
  export type RaphKernelRoot = DataObject;
7
8
  export interface RaphKernelOptions {
8
9
  readonly id?: string;
@@ -25,6 +26,8 @@ export declare class RaphKernel {
25
26
  private _derivedController;
26
27
  private _runtimes;
27
28
  private _metaController;
29
+ private _soleRuntime;
30
+ private _pathBatch;
28
31
  private _batchDepth;
29
32
  private _runtimeMutationDepth;
30
33
  private _stabilizing;
@@ -86,6 +89,27 @@ export declare class RaphKernel {
86
89
  * Выполняет операцию в общей синхронной batch boundary.
87
90
  */
88
91
  batch<T>(operation: () => T): T;
92
+ /**
93
+ * Открывает то же, что `batch()`, для единственного присоединённого Runtime
94
+ * без closure операции и без массивов: границу этого Runtime и path batch.
95
+ * Возвращает владельца path batch, которого вызывающий передаёт в
96
+ * `_closeSoleRuntimeBatch()` после операции.
97
+ *
98
+ * Возвращает `undefined` и ничего не открывает в любом другом состоянии:
99
+ * Kernel разделяют несколько Runtime, граница Runtime уже открыта, есть
100
+ * derived handles либо metadata watchers, store построен над adapter. Тогда
101
+ * вызывающий исполняет `batch()`. Состояние читается при входе, как в
102
+ * `batch()`: то, что появилось во время операции, выход не меняет.
103
+ * @internal
104
+ */
105
+ _openSoleRuntimeBatch(runtime: RaphKernelRuntime): PathEventHub | undefined;
106
+ /**
107
+ * Закрывает границу, открытую `_openSoleRuntimeBatch()`, в порядке `batch()`:
108
+ * публикация path events, затем граница Runtime. Бросает то же, что бросил бы
109
+ * `batch()` с этой операцией; после успешного выхода возвращает управление.
110
+ * @internal
111
+ */
112
+ _closeSoleRuntimeBatch(runtime: RaphKernelRuntime, hub: PathEventHub, operationFailed: boolean, operationError: unknown): void;
89
113
  /**
90
114
  * Подписывает callback на подходящие изменения и возвращает disposer.
91
115
  */
@@ -40,6 +40,20 @@ export declare class PathEventHub {
40
40
  * Выполняет операцию в общей синхронной batch boundary.
41
41
  */
42
42
  batch<T>(operation: () => T): T;
43
+ /**
44
+ * Открывает batch boundary без closure операции: вызывающий сам исполняет
45
+ * операцию и закрывает boundary через `_closeBatch()`.
46
+ * @internal
47
+ */
48
+ _openBatch(): void;
49
+ /**
50
+ * Закрывает один уровень batch boundary: на внешнем уровне публикует
51
+ * накопленные события. Бросает то же, что `batch()`: ошибку операции, ошибку
52
+ * публикации либо обе в AggregateError; после успешной операции и публикации
53
+ * возвращает управление.
54
+ * @internal
55
+ */
56
+ _closeBatch(operationFailed: boolean, operationError: unknown): void;
43
57
  /**
44
58
  * Подписывает callback на подходящие изменения и возвращает disposer.
45
59
  */
@@ -1,4 +1,5 @@
1
1
  import { DataPathDef, PathApi, PathOptions, PathWatchCallback } from '../path.types';
2
+ import { PathEventHub } from './PathEventHub';
2
3
  /**
3
4
  * Владеет одним независимым path-root, mutation log и watch-router.
4
5
  */
@@ -6,12 +7,11 @@ export declare class PathStore implements PathApi {
6
7
  private _root;
7
8
  private readonly _eventHub;
8
9
  /**
9
- * Возвращает внутренний router для диагностического контракта Kernel.
10
+ * Возвращает владельца batch boundary этого store: Kernel открывает и
11
+ * закрывает её без closure операции.
10
12
  * @internal
11
13
  */
12
- private get _router();
13
- private get _events();
14
- private get _watcherCount();
14
+ get _batchHub(): PathEventHub;
15
15
  /**
16
16
  * Возвращает значение по пути без создания отсутствующих данных.
17
17
  */
@@ -0,0 +1,14 @@
1
+ /** Failure of one completed disposal call; never thrown as a wrapper. @internal */
2
+ export interface DisposalFailure {
3
+ readonly error: unknown;
4
+ readonly hasUnrouted: boolean;
5
+ readonly completed?: {
6
+ readonly error: unknown;
7
+ };
8
+ }
9
+ /** An authored callback or a non-resource disposal stage failed. @internal */
10
+ export declare function unroutedDisposalFailure(error: unknown): DisposalFailure;
11
+ /** Combines only errors collected by this framework operation, without inspecting payloads. @internal */
12
+ export declare function combineDisposalFailures(failures: readonly DisposalFailure[] | undefined, message: string): DisposalFailure | undefined;
13
+ /** Public disposal exposes only the original raw payload. @internal */
14
+ export declare function throwDisposalFailure(failure: DisposalFailure | undefined): void;
@@ -1,4 +1,4 @@
1
- import { ComputedAccessHandle, Disposer, EffectCallback, EffectFactory, OwnedSource, OwnedSourceHooks, ReactivityOptions, ReadonlySignal, Signal, SignalAccess, WatchCallback, WatchOptions, WatchSource, WritableComputedOptions } from './types';
1
+ import { ComputedAccessHandle, Disposer, EffectCallback, EffectFactory, EffectTask, OwnedSource, OwnedSourceHooks, ReactiveNode, ReactivityOptions, ReadonlySignal, Signal, SignalAccess, WatchCallback, WatchOptions, WatchSource, WritableComputedOptions } from './types';
2
2
  import { ScopeNode } from './scope';
3
3
  export { ScopeNode } from './scope';
4
4
  export type { Disposer, EffectCallback, EffectScheduler, EffectTask, ReactivityOptions, ReadonlySignal, Signal, WatchCallback, WatchOptions, WatchSource, WatchValue, WritableComputedOptions, } from './types';
@@ -16,6 +16,7 @@ export declare class RaphReactivity {
16
16
  private effectWriteIndex;
17
17
  private invalidationDepth;
18
18
  private dependencyDepth;
19
+ private checkingDepth;
19
20
  private flushingEffects;
20
21
  private readonly effectQueue;
21
22
  private readonly invalidationStack;
@@ -127,8 +128,9 @@ export declare class RaphReactivity {
127
128
  private writeSignalValue;
128
129
  /**
129
130
  * Возвращает кеш либо синхронно актуализирует вычисляемое значение.
130
- * Неуспешное вычисление не считается значением. Даже ошибочное чтение сохраняет
131
- * связь с активным потребителем, чтобы тот мог восстановиться при изменении источника.
131
+ * Неуспешное вычисление не считается значением. Ошибка getter сохраняет связь
132
+ * с активным потребителем для восстановления. Повторное чтение во время
133
+ * первого сбора зависимостей отклоняется до регистрации связи и чтения кеша.
132
134
  */
133
135
  private readComputedValue;
134
136
  /**
@@ -183,7 +185,7 @@ export declare class RaphReactivity {
183
185
  /**
184
186
  * Удаляет непрочитанный хвост зависимостей завершившегося запуска.
185
187
  * trackedTail обозначает границу прочитанного префикса, а не неизменный конец списка.
186
- * Удаление из списков производителей не выполняет пользовательские callbacks.
188
+ * Ошибка cleanup не прерывает освобождение оставшегося хвоста зависимостей.
187
189
  */
188
190
  private pruneUnreadDependencies;
189
191
  /**
@@ -192,6 +194,8 @@ export declare class RaphReactivity {
192
194
  * Также исправляет курсор поиска, если он указывал на удаляемую связь.
193
195
  */
194
196
  private detachSubLink;
197
+ /** Завершает удаление producer-связи без вызова source cleanup. */
198
+ private unlinkSubLink;
195
199
  /** Connects Runtime ownership metadata only for edges whose producer opted in. */
196
200
  private attachDependencyCleanup;
197
201
  /**
@@ -217,6 +221,7 @@ export declare class RaphReactivity {
217
221
  * не выполняет. Непосредственное и потенциальное изменения отмечает разными флагами.
218
222
  */
219
223
  private propagateInvalidation;
224
+ private markActiveChecks;
220
225
  /**
221
226
  * Помечает работающего потребителя, только если затронута уже прочитанная связь.
222
227
  * Связи за trackedTail принадлежат прошлому запуску и не означают повторную invalidation.
@@ -237,6 +242,8 @@ export declare class RaphReactivity {
237
242
  * Неверное значение в кеш не записывается.
238
243
  */
239
244
  private recomputeValue;
245
+ /** Сохраняет первичную ошибку и отдельные ошибки cleanup при восстановлении. */
246
+ private failComputedValue;
240
247
  /**
241
248
  * Восстанавливает связи и состояния после неудачного getter.
242
249
  * Отдельная функция удерживает обработку исключений вне обычной части пересчёта.
@@ -290,6 +297,7 @@ export declare class RaphReactivity {
290
297
  * Ошибка одного элемента не оставляет необработанные записи со старым SCHEDULED.
291
298
  */
292
299
  private flushExternalEffects;
300
+ private markRecoveryDependencies;
293
301
  /**
294
302
  * Завершает очередь после первой ошибки, собирая последующие причины сбоя.
295
303
  * Вызывается только на ошибочном пути; успешный проход не создаёт массив ошибок
@@ -381,6 +389,171 @@ export declare class RaphReactivity {
381
389
  * @internal
382
390
  */
383
391
  _isFlushingEffects(): boolean;
392
+ /**
393
+ * Создаёт запись графа для эффекта с внешним планированием и подключает его
394
+ * постоянную задачу. Запуск ещё не запрошен: вызывающий слой сохраняет запись
395
+ * и затем вызывает _requestTaskEffect(). Запись, созданная во время работы
396
+ * другого эффекта, становится его вложенным ресурсом.
397
+ * @internal
398
+ */
399
+ _allocateTaskEffect(fn: EffectCallback, task: EffectTask): ReactiveNode;
400
+ /**
401
+ * Запрашивает первый запуск эффекта с задачей. При `schedule` задача получает
402
+ * schedule(), как на пути scheduler bind; без него вызывающий слой уже сам
403
+ * поставил задачу в очередь, и запись только помечается запланированной.
404
+ * Если метод бросает исключение, запись освобождает вызывающий слой.
405
+ * @internal
406
+ */
407
+ _requestTaskEffect(node: ReactiveNode, schedule: boolean): void;
408
+ /**
409
+ * Открывает одну доставку эффекта с задачей. Возвращает false для устаревшей
410
+ * доставки: запись остановлена или запуск больше не запланирован.
411
+ * @internal
412
+ */
413
+ _beginTaskEffectRun(node: ReactiveNode): boolean;
414
+ /**
415
+ * Выполняет доставку, открытую через _beginTaskEffectRun(), вне активного
416
+ * потребителя и затем обрабатывает очередь эффектов, в том числе после
417
+ * неудачного запуска; при двух сбоях передаёт обе причины.
418
+ * @internal
419
+ */
420
+ _finishTaskEffectRun(node: ReactiveNode): void;
421
+ /**
422
+ * Гасит ожидающую доставку, от которой отказывается задача. Вызывающий слой
423
+ * не должен отменять доставку до первого запуска: зависимости до него ещё не
424
+ * собраны. Возвращает false, если запись уже остановлена.
425
+ * @internal
426
+ */
427
+ _cancelTaskEffect(node: ReactiveNode): boolean;
428
+ /**
429
+ * Делает следующую доставку исполняемой и снова планирует задачу. Нужен,
430
+ * когда invalidation пришла после снимка текущей доставки: её запуск
431
+ * расходует предыдущее dirty-состояние.
432
+ * @internal
433
+ */
434
+ _rearmTaskEffect(node: ReactiveNode): void;
435
+ /**
436
+ * Окончательно останавливает эффект с задачей. Engine один раз вызывает
437
+ * task.dispose() изнутри, поэтому задача может направлять собственное
438
+ * освобождение через этот метод.
439
+ * @internal
440
+ */
441
+ _disposeTaskEffect(node: ReactiveNode): void;
442
+ /**
443
+ * Материализует signal для активного потребителя и связывает их. Без
444
+ * потребителя возвращает undefined: signal остаётся значением у вызывающего
445
+ * слоя. После материализации значением владеет запись.
446
+ * @internal
447
+ */
448
+ _trackSignalNode<T>(value: T, sourceHooks: OwnedSourceHooks): ReactiveNode<T> | undefined;
449
+ /**
450
+ * Читает материализованный signal и регистрирует зависимость активного
451
+ * потребителя.
452
+ * @internal
453
+ */
454
+ _readSignalNode<T>(node: ReactiveNode<T>): T;
455
+ /**
456
+ * Читает материализованный signal без подписки текущего потребителя;
457
+ * pending-значение фиксируется так же, как при обычном чтении.
458
+ * @internal
459
+ */
460
+ _peekSignalNode<T>(node: ReactiveNode<T>): T;
461
+ /**
462
+ * Возвращает значение, которое увидит следующее чтение: pending-значение
463
+ * незавершённой группировки либо зафиксированное. Ничего не фиксирует.
464
+ * @internal
465
+ */
466
+ _visibleSignalValue<T>(node: ReactiveNode<T>): T;
467
+ /**
468
+ * Записывает значение материализованного signal с обычной семантикой batch.
469
+ * @internal
470
+ */
471
+ _writeSignalNode<T>(node: ReactiveNode<T>, value: T): void;
472
+ /**
473
+ * Сообщает, есть ли у материализованного signal потребители в графе.
474
+ * @internal
475
+ */
476
+ _signalNodeHasSubscribers(node: ReactiveNode): boolean;
477
+ /**
478
+ * Отсоединяет материализованный signal от потребителей и освобождает его
479
+ * значения. Значения освобождаются и при сбое отсоединения. Поля pending
480
+ * сбрасываются, только если запись их получала: запись без группировок не
481
+ * меняет набор своих полей при освобождении.
482
+ * @internal
483
+ */
484
+ _releaseSignalNode(node: ReactiveNode): void;
485
+ /**
486
+ * Ищет среди текущих потребителей записи первого, чьего владельца принимает
487
+ * accept, и возвращает этого владельца. Владелец потребителя определяется
488
+ * так же, как при привязке ребра через onDependency: у computed это
489
+ * dependencyOwner его source hooks, у эффекта — dependencyOwner его задачи.
490
+ * Потребители без владельца пропускаются. Обход идёт в порядке списка
491
+ * потребителей, ничего не выделяет и не меняет граф; accept не должен менять
492
+ * связи этой записи.
493
+ * @param node Материализованная запись производителя.
494
+ * @param accept Проверка владельца потребителя; context передаётся ей без closure.
495
+ * @param context Произвольное значение вызывающего слоя для accept.
496
+ * @internal
497
+ */
498
+ _findSubscriberOwner<Context>(node: ReactiveNode, accept: (owner: object, context: Context) => boolean, context: Context): object | undefined;
499
+ /**
500
+ * Возвращает владельца активного потребителя: того, кому engine привязал бы
501
+ * ребро следующего отслеживаемого чтения. Владелец определяется так же, как
502
+ * в _findSubscriberOwner(). Без активного потребителя и у потребителя без
503
+ * владельца результат undefined. Метод ничего не выделяет и не меняет граф.
504
+ *
505
+ * Вызывающий слой проверяет по этому владельцу допустимость чтения, когда
506
+ * его собственный контекст снят, а потребитель engine остался активным.
507
+ * @internal
508
+ */
509
+ _activeSubscriberOwner(): object | undefined;
510
+ /**
511
+ * Увеличивает счётчик материализованного signal и уведомляет его
512
+ * потребителей. Без потребителей ничего не пишет и возвращает false.
513
+ *
514
+ * Сдвиг — обычная запись signal. Вне группировки она прямая: счётчик
515
+ * фиксируется сразу, а потребитель становится обязательным к пересчёту, в
516
+ * том числе тот, кто ждал только проверки зависимостей или стоит на стеке
517
+ * идущей проверки. Внутри группировки и у записи с ещё не прочитанным
518
+ * отложенным сдвигом запись откладывается до первого чтения, как любая запись
519
+ * внутри batch().
520
+ *
521
+ * Потребитель, который выполняется в момент прямого сдвига, получает его по
522
+ * общему правилу записи во время запуска: у записи не остаётся отложенного
523
+ * сдвига, который позже подтвердил бы ему изменение.
524
+ *
525
+ * Очередь эффектов обрабатывается на выходе, если группировки нет: отложенная
526
+ * запись сама её не обрабатывает, а потребитель, которого она поставила в
527
+ * очередь, не должен ждать следующей записи.
528
+ * @internal
529
+ */
530
+ _bumpSignalNode(node: ReactiveNode<number>): boolean;
531
+ /**
532
+ * Создаёт запись-счётчик для активного потребителя и связывает их; без
533
+ * потребителя возвращает undefined. Счётчик начинается с нуля и сдвигается
534
+ * через _bumpSignalNode().
535
+ *
536
+ * Счётчик — производитель без собственных зависимостей. Граф читает у него
537
+ * то же, что у записи signal в роли производителя: признаки, список
538
+ * потребителей, отсутствие getter, значение и source hooks. Полей списка
539
+ * зависимостей у записи нет, а hooks лежат в ней самой: счётчик стоит одной
540
+ * аллокации из шести полей, а запись signal с hooks — двух. Поля отложенной
541
+ * записи появляются у счётчика с первым сдвигом.
542
+ * @internal
543
+ */
544
+ _trackCounterNode(sourceHooks: OwnedSourceHooks): ReactiveNode<number> | undefined;
545
+ /**
546
+ * Возвращает постоянную задачу активного потребителя. Engine делает запись
547
+ * эффекта активным потребителем непосредственно перед вызовом её тела,
548
+ * поэтому первое обращение из тела возвращает задачу именно этого эффекта,
549
+ * какие бы доставки ни выполнил cleanup его прошлого запуска.
550
+ *
551
+ * Без активного потребителя и у потребителя без задачи — computed либо
552
+ * эффекта, созданного без внешнего планирования, — результат undefined.
553
+ * Метод ничего не выделяет и не меняет граф.
554
+ * @internal
555
+ */
556
+ _activeEffectTask(): EffectTask | undefined;
384
557
  }
385
558
  export declare const signal: RaphReactivity['signal'];
386
559
  export declare const reactive: RaphReactivity['reactive'];
@@ -1,13 +1,26 @@
1
+ import { DisposalFailure } from './disposal';
1
2
  import { RaphReactivity } from './engine';
2
3
  import { Disposer, EffectCallback, OwnedResource, OwnedSource, ReadonlySignal, ScopeChildren, ScopeLink, Signal, SourceFinalizer, WatchCallback, WatchOptions, WatchSource, WritableComputedOptions } from './types';
3
4
  /**
4
- * Универсальный владелец ресурсов без фаз, путей и зависимости от Runtime.
5
- * Хранит ресурсы в двусвязном списке и освобождает их в обратном порядке.
6
- * Проверки lifetime выполняют только owned handles; свободные signal() не проходят
7
- * через владельца. Класс не является узлом графа зависимостей.
5
+ * Запись источника в списке владельца: сама хранит связь с соседом и сама
6
+ * освобождает источник, поэтому владельцу не нужна отдельная коллекция.
7
+ * @internal
8
8
  */
9
- export declare class ScopeNode {
10
- readonly reactivity: RaphReactivity;
9
+ export interface OwnedSourceEntry {
10
+ _previousSource: OwnedSourceEntry | undefined;
11
+ _finalizeSource: () => boolean;
12
+ }
13
+ /**
14
+ * Общая основа владельцев: список ресурсов, список источников и признаки
15
+ * lifetime лежат в самом владельце. ScopeNode добавляет standalone API,
16
+ * RaphScope — Runtime API; отдельного объекта-хранилища у владельца нет.
17
+ *
18
+ * Поля объявлены через `declare` и присваиваются в constructor в одном
19
+ * порядке: все владельцы одного класса получают один hidden class, а сборка с
20
+ * любым target не превращает объявления в вызовы field-helper.
21
+ * @internal
22
+ */
23
+ export declare abstract class ScopeOwner implements ScopeChildren<OwnedResource> {
11
24
  /**
12
25
  * Первый зарегистрированный ресурс; не является ребёнком execution-дерева.
13
26
  * @internal
@@ -19,14 +32,11 @@ export declare class ScopeNode {
19
32
  */
20
33
  scopeLastChild: OwnedResource | undefined;
21
34
  private _resourceCount;
22
- private _sourceFinalizers;
35
+ private _lastSource;
36
+ private _sourceCount;
23
37
  protected _disposed: boolean;
24
38
  protected _disposing: boolean;
25
- /**
26
- * Связывает владельца с реактивным экземпляром без создания нового графа.
27
- * @param reactivity Экземпляр, в котором создаются owned-ресурсы.
28
- */
29
- constructor(reactivity: RaphReactivity);
39
+ constructor();
30
40
  /**
31
41
  * Показывает, началось ли окончательное освобождение владельца.
32
42
  */
@@ -35,6 +45,88 @@ export declare class ScopeNode {
35
45
  * Разрешает регистрацию и доступ только до начала освобождения.
36
46
  */
37
47
  get active(): boolean;
48
+ /**
49
+ * Возвращает число ещё не освобождённых записей ресурсов.
50
+ * @internal
51
+ */
52
+ _debugResourceCount(): number;
53
+ /**
54
+ * Возвращает число зарегистрированных источников; после начала их
55
+ * финализации владелец источников не числит.
56
+ * @internal
57
+ */
58
+ _debugSourceCount(): number;
59
+ /**
60
+ * Возвращает последний зарегистрированный источник: с него по связям
61
+ * `_previousSource` обходится список источников владельца от нового к
62
+ * старому. С началом финализации владелец источников не числит, и метод
63
+ * возвращает undefined. Обход не должен регистрировать и освобождать
64
+ * источники этого владельца.
65
+ * @internal
66
+ */
67
+ _lastOwnedSource(): OwnedSourceEntry | undefined;
68
+ /**
69
+ * Вынимает запись ресурса из списка владельца и уменьшает счётчик. Запись
70
+ * вызывает метод из своего dispose() до пользовательского cleanup, иначе
71
+ * освобождение владельца не продвинется по списку. Повторный вызов и запись
72
+ * другого владельца безопасно игнорируются.
73
+ * @internal
74
+ */
75
+ _releaseRecord(entry: OwnedResource): void;
76
+ /**
77
+ * Ставит cleanup в конец списка ресурсов и возвращает его однократный stop.
78
+ * Lifetime не проверяет: это делает вызывающий метод владельца.
79
+ *
80
+ * Stop захватывает только запись, а не владельца: снятая запись теряет ссылку
81
+ * на владельца, поэтому удержанный stop не удерживает ни его, ни соседние
82
+ * записи.
83
+ */
84
+ protected _ownCleanup(cleanup: Disposer): Disposer;
85
+ /** Registers a framework cleanup; the public stop still exposes only raw failure. */
86
+ protected _ownCompleted(cleanup: () => DisposalFailure | undefined): Disposer;
87
+ /**
88
+ * Ставит готовую запись ресурса в конец списка без обёртки и closure: запись
89
+ * сама является элементом списка владельца. Её dispose() обязан сначала
90
+ * вызвать _releaseRecord(), иначе освобождение владельца не продвинется по
91
+ * списку. Предусловие: запись не состоит в другом списке.
92
+ * Lifetime не проверяет: это делает вызывающий метод владельца.
93
+ */
94
+ protected _ownRecord(entry: OwnedResource): void;
95
+ /**
96
+ * Ставит функцию-финализатор источника в список источников владельца.
97
+ * Lifetime не проверяет: это делает вызывающий метод владельца.
98
+ */
99
+ protected _ownSourceFinalizer(finalizer: SourceFinalizer): void;
100
+ /**
101
+ * Ставит готовую запись источника в список источников владельца без обёртки:
102
+ * источник сам является элементом списка и сам освобождает себя через
103
+ * _finalizeSource(). Предусловие: запись не состоит в другом списке.
104
+ * Lifetime не проверяет: это делает вызывающий метод владельца.
105
+ */
106
+ protected _ownSourceEntry(entry: OwnedSourceEntry): void;
107
+ /**
108
+ * Освобождает ресурсы в обратном порядке регистрации, затем финализирует
109
+ * источники. Сбой одной записи не останавливает остальные; массив ошибок
110
+ * создаётся только при первой ошибке.
111
+ */
112
+ protected _releaseOwned(): DisposalFailure[] | undefined;
113
+ }
114
+ /**
115
+ * Универсальный владелец ресурсов без фаз, путей и зависимости от Runtime.
116
+ * Хранит ресурсы в двусвязном списке и освобождает их в обратном порядке.
117
+ * Проверки lifetime выполняют только owned handles; свободные signal() не проходят
118
+ * через владельца. Класс не является узлом графа зависимостей.
119
+ */
120
+ export declare class ScopeNode extends ScopeOwner {
121
+ /**
122
+ * Экземпляр, в котором создаются owned-ресурсы.
123
+ */
124
+ readonly reactivity: RaphReactivity;
125
+ /**
126
+ * Связывает владельца с реактивным экземпляром без создания нового графа.
127
+ * @param reactivity Экземпляр, в котором создаются owned-ресурсы.
128
+ */
129
+ constructor(reactivity: RaphReactivity);
38
130
  /**
39
131
  * Создаёт owned signal и регистрирует его финализатор.
40
132
  * Все методы возвращённого handle проверяют, что владелец ещё активен.
@@ -62,16 +154,6 @@ export declare class ScopeNode {
62
154
  * Если владелец уже неактивен, выполняет cleanup сразу и возвращает пустой disposer.
63
155
  */
64
156
  own(disposer: Disposer): Disposer;
65
- /**
66
- * Возвращает число ещё не освобождённых записей ресурсов.
67
- * @internal
68
- */
69
- _debugResourceCount(): number;
70
- /**
71
- * Возвращает число зарегистрированных финализаторов источников.
72
- * @internal
73
- */
74
- _debugSourceCount(): number;
75
157
  /**
76
158
  * Освобождает ресурсы в обратном порядке, затем финализирует источники.
77
159
  * Повторный вызов безопасен. Ошибки cleanup и завершающего hook собираются
@@ -100,6 +182,8 @@ export declare class ScopeNode {
100
182
  /**
101
183
  * Добавляет финализатор источника. Возвращённый им false означает повторную попытку
102
184
  * после прогресса других финализаторов, а не успешное освобождение.
185
+ * Каждая регистрация — отдельный источник: одинаковые финализаторы владелец
186
+ * не объединяет, и функция, переданная дважды, будет вызвана дважды.
103
187
  * @internal
104
188
  */
105
189
  _ownSource(finalizer: SourceFinalizer): void;
@@ -118,17 +202,11 @@ export declare class ScopeNode {
118
202
  * Возвращает сообщение для AggregateError при нескольких ошибках освобождения.
119
203
  */
120
204
  protected _disposalMessage(): string;
121
- /**
122
- * Освобождает источники в обратном порядке регистрации с повторными попытками.
123
- * Если в проходе не было прогресса, прекращает обход, сохраняя существующий контракт.
124
- * Исключение одного финализатора не блокирует остальные.
125
- */
126
- private _finalizeSources;
127
205
  }
128
206
  /**
129
207
  * Добавляет дочерний ресурс в конец списка владельца без отдельной обёртки связей.
130
- * Предусловие: ребёнок ещё не находится в другом списке. Переиспользуется
131
- * ресурсами ScopeNode и записями вложенных эффектов.
208
+ * Предусловие: ребёнок ещё не находится в другом списке. Используется записями
209
+ * вложенных эффектов; владельцы ведут свой список ресурсов сами.
132
210
  * @internal
133
211
  */
134
212
  export declare function appendScopeChild<T extends ScopeLink<T>>(parent: ScopeChildren<T>, child: T): void;