@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.
- 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 +10 -2
- 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
|
-
* Возвращает
|
|
10
|
+
* Возвращает владельца batch boundary этого store: Kernel открывает и
|
|
11
|
+
* закрывает её без closure операции.
|
|
10
12
|
* @internal
|
|
11
13
|
*/
|
|
12
|
-
|
|
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
|
-
*
|
|
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
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* через владельца. Класс не является узлом графа зависимостей.
|
|
5
|
+
* Запись источника в списке владельца: сама хранит связь с соседом и сама
|
|
6
|
+
* освобождает источник, поэтому владельцу не нужна отдельная коллекция.
|
|
7
|
+
* @internal
|
|
8
8
|
*/
|
|
9
|
-
export
|
|
10
|
-
|
|
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
|
|
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
|
-
*
|
|
208
|
+
* Предусловие: ребёнок ещё не находится в другом списке. Используется записями
|
|
209
|
+
* вложенных эффектов; владельцы ведут свой список ресурсов сами.
|
|
132
210
|
* @internal
|
|
133
211
|
*/
|
|
134
212
|
export declare function appendScopeChild<T extends ScopeLink<T>>(parent: ScopeChildren<T>, child: T): void;
|