@raphy-js/raph 1.0.0-dev.2 → 1.0.1-dev.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1096 -0
- package/dist/api/Raph.d.ts +59 -190
- package/dist/api/RaphFacadeSession.d.ts +90 -0
- package/dist/api/RaphReactivityInstance.d.ts +72 -0
- package/dist/api/errors.d.ts +9 -4
- package/dist/api/types.d.ts +162 -17
- package/dist/core-CClhT8WR.js +1044 -0
- package/dist/core-cPQWYD4K.cjs +1 -0
- package/dist/debug/api/Raph.cjs +1 -1
- package/dist/debug/api/Raph.js +368 -367
- package/dist/debug/api/RaphFacadeSession.cjs +1 -0
- package/dist/debug/api/RaphFacadeSession.js +302 -0
- package/dist/debug/api/RaphReactivityInstance.cjs +1 -0
- package/dist/debug/api/RaphReactivityInstance.js +146 -0
- package/dist/debug/api/errors.cjs +1 -1
- package/dist/debug/api/errors.js +10 -7
- package/dist/debug/path/DataPath.cjs +1 -0
- package/dist/debug/path/DataPath.js +390 -0
- package/dist/debug/path/PathRouter.cjs +1 -0
- package/dist/debug/path/PathRouter.js +80 -0
- package/dist/debug/path/RaphKernel.cjs +1 -1
- package/dist/debug/path/RaphKernel.js +316 -236
- package/dist/debug/path/data-path.utils.cjs +1 -0
- package/dist/debug/path/data-path.utils.js +56 -0
- package/dist/debug/path/derived/DerivedRegistry.cjs +1 -0
- package/dist/debug/path/derived/DerivedRegistry.js +143 -0
- package/dist/debug/path/derived/RaphDerivedHandle.cjs +1 -0
- package/dist/debug/path/{RaphDerivedHandle.js → derived/RaphDerivedHandle.js} +19 -22
- package/dist/debug/path/derived/derived-collection.utils.cjs +1 -0
- package/dist/debug/path/{derived-collection.js → derived/derived-collection.utils.js} +71 -71
- package/dist/debug/path/derived/derived-strategy.types.cjs +1 -0
- package/dist/debug/path/derived/derived-strategy.types.js +1 -0
- package/dist/debug/path/meta/MetaController.cjs +1 -0
- package/dist/debug/path/{MetaController.js → meta/MetaController.js} +58 -66
- package/dist/debug/path/meta/RaphMeta.cjs +1 -0
- package/dist/debug/path/meta/RaphMeta.js +62 -0
- package/dist/debug/path/meta/RaphMetaStore.cjs +1 -0
- package/dist/debug/path/{RaphMetaStore.js → meta/RaphMetaStore.js} +24 -30
- package/dist/debug/path/meta/meta.types.cjs +1 -0
- package/dist/debug/path/meta/meta.types.js +1 -0
- package/dist/debug/path/storage/AdapterPathStore.cjs +1 -0
- package/dist/debug/path/storage/AdapterPathStore.js +128 -0
- package/dist/debug/path/storage/DefaultDataAdapter.cjs +1 -0
- package/dist/debug/path/{data-adapter.js → storage/DefaultDataAdapter.js} +47 -57
- package/dist/debug/path/storage/PathEventHub.cjs +1 -0
- package/dist/debug/path/storage/PathEventHub.js +161 -0
- package/dist/debug/path/storage/PathStore.cjs +1 -0
- package/dist/debug/path/{PathStore.js → storage/PathStore.js} +88 -98
- package/dist/debug/path/storage/createDataDraft.cjs +1 -0
- package/dist/debug/path/{data-draft.js → storage/createDataDraft.js} +24 -28
- package/dist/debug/path/storage/data-adapter.types.cjs +1 -0
- package/dist/debug/path/storage/data-adapter.types.js +1 -0
- 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 +888 -321
- package/dist/debug/reactivity/reactive-object.cjs +1 -0
- package/dist/debug/reactivity/reactive-object.js +265 -0
- 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 +1134 -502
- package/dist/debug/runtime/diagnostics/RaphDebug.cjs +1 -0
- package/dist/debug/runtime/diagnostics/RaphDebug.js +287 -0
- package/dist/debug/runtime/errors.cjs +1 -1
- package/dist/debug/runtime/errors.js +6 -3
- package/dist/debug/runtime/ownership/RaphEffectScope.cjs +1 -0
- package/dist/debug/runtime/ownership/RaphEffectScope.js +304 -0
- package/dist/debug/runtime/ownership/RaphNode.cjs +1 -0
- package/dist/debug/runtime/ownership/RaphNode.js +665 -0
- package/dist/debug/runtime/ownership/RaphScope.cjs +1 -0
- package/dist/debug/runtime/ownership/RaphScope.js +236 -0
- package/dist/debug/runtime/ownership/parent-graph.types.cjs +1 -0
- package/dist/debug/runtime/ownership/parent-graph.types.js +1 -0
- package/dist/debug/runtime/phases/RaphFrameLoop.cjs +1 -0
- package/dist/debug/runtime/{RaphFrameLoop.js → phases/RaphFrameLoop.js} +13 -17
- package/dist/debug/runtime/phases/RaphPhasePipeline.cjs +1 -0
- package/dist/debug/runtime/phases/RaphPhasePipeline.js +848 -0
- 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/phases/orderPhaseTasks.cjs +1 -0
- package/dist/debug/runtime/phases/orderPhaseTasks.js +59 -0
- package/dist/debug/runtime/reactivity/PathHandle.cjs +1 -0
- package/dist/debug/runtime/reactivity/PathHandle.js +165 -0
- package/dist/debug/runtime/reactivity/RaphMetaSource.cjs +1 -0
- package/dist/debug/runtime/reactivity/RaphMetaSource.js +108 -0
- 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 -0
- package/dist/debug/runtime/reactivity/RaphWorkGraph.js +1157 -0
- package/dist/debug/runtime/reactivity/RuntimeReactivity.cjs +1 -0
- package/dist/debug/runtime/reactivity/RuntimeReactivity.js +550 -0
- package/dist/debug/runtime/reactivity/RuntimeWatch.cjs +1 -0
- package/dist/debug/runtime/reactivity/RuntimeWatch.js +77 -0
- package/dist/debug/runtime/reactivity/disposal-sweep.utils.cjs +1 -0
- package/dist/debug/runtime/reactivity/disposal-sweep.utils.js +42 -0
- package/dist/debug/runtime/reactivity/runtime-reactivity.types.cjs +1 -0
- package/dist/debug/runtime/reactivity/runtime-reactivity.types.js +1 -0
- package/dist/entrypoints/machine-testing.d.ts +2 -0
- package/dist/entrypoints/machine.d.ts +5 -0
- package/dist/entrypoints/path.d.ts +14 -0
- package/dist/entrypoints/reactivity.d.ts +1 -0
- package/dist/entrypoints/runtime.d.ts +18 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +46 -38
- package/dist/machine/compiler.d.ts +71 -0
- package/dist/machine/core.d.ts +50 -0
- package/dist/machine/persistence.d.ts +5 -0
- package/dist/machine/runtime.d.ts +4 -0
- package/dist/machine/testing.d.ts +43 -0
- package/dist/machine/types.d.ts +155 -0
- package/dist/machine-testing.cjs +1 -0
- package/dist/machine-testing.js +188 -0
- package/dist/machine.cjs +1 -0
- package/dist/machine.js +822 -0
- package/dist/main.d.ts +20 -0
- package/dist/path/{data-path.d.ts → DataPath.d.ts} +16 -40
- package/dist/path/{path-router.d.ts → PathRouter.d.ts} +1 -1
- package/dist/path/RaphKernel.d.ts +37 -10
- package/dist/path/data-path.types.d.ts +34 -0
- package/dist/path/data-path.utils.d.ts +9 -0
- package/dist/path/{DerivedRegistry.d.ts → derived/DerivedRegistry.d.ts} +2 -2
- package/dist/path/{RaphDerivedHandle.d.ts → derived/RaphDerivedHandle.d.ts} +3 -3
- package/dist/path/derived/derived-collection.types.d.ts +12 -0
- package/dist/path/{derived-collection.d.ts → derived/derived-collection.utils.d.ts} +3 -13
- package/dist/path/{derived-strategies.d.ts → derived/derived-strategy.types.d.ts} +0 -3
- package/dist/path/derived/derived-strategy.utils.d.ts +4 -0
- package/dist/path/{MetaController.d.ts → meta/MetaController.d.ts} +4 -4
- package/dist/path/{RaphMeta.d.ts → meta/RaphMeta.d.ts} +2 -2
- package/dist/path/{RaphMetaStore.d.ts → meta/RaphMetaStore.d.ts} +1 -1
- package/dist/path/{meta.types.d.ts → meta/meta.types.d.ts} +2 -4
- package/dist/path/path.types.d.ts +3 -2
- package/dist/path/{segment-key.d.ts → pathSegmentKey.d.ts} +1 -1
- package/dist/path/{AdapterPathStore.d.ts → storage/AdapterPathStore.d.ts} +4 -4
- package/dist/path/{data-adapter.d.ts → storage/DefaultDataAdapter.d.ts} +2 -17
- package/dist/path/storage/PathEventHub.d.ts +62 -0
- package/dist/path/{PathStore.d.ts → storage/PathStore.d.ts} +7 -7
- package/dist/path/storage/data-adapter.types.d.ts +17 -0
- package/dist/path.cjs +1 -1
- package/dist/path.js +16 -16
- package/dist/raph.cjs +1 -1
- package/dist/raph.js +46 -38
- package/dist/reactivity/disposal.d.ts +14 -0
- package/dist/reactivity/engine.d.ts +193 -6
- package/dist/reactivity/reactive-object.d.ts +36 -0
- package/dist/reactivity/scope.d.ts +108 -30
- package/dist/reactivity/types.d.ts +25 -0
- package/dist/reactivity.cjs +1 -1
- package/dist/reactivity.js +12 -12
- package/dist/runtime/RaphRuntime.d.ts +319 -160
- package/dist/runtime/diagnostics/RaphDebug.d.ts +239 -0
- package/dist/runtime/errors.d.ts +5 -0
- package/dist/runtime/ownership/RaphEffectScope.d.ts +98 -0
- package/dist/runtime/ownership/RaphNode.d.ts +310 -0
- package/dist/runtime/ownership/RaphScope.d.ts +168 -0
- package/dist/runtime/{parent-graph.d.ts → ownership/parent-graph.types.d.ts} +0 -1
- package/dist/runtime/ownership/parentGraph.d.ts +3 -0
- package/dist/runtime/phases/RaphPhasePipeline.d.ts +253 -0
- package/dist/runtime/phases/RaphPhaseTaskRecord.d.ts +195 -0
- package/dist/runtime/phases/RaphPhaseWatch.d.ts +22 -0
- package/dist/runtime/phases/orderPhaseTasks.d.ts +6 -0
- package/dist/runtime/phases/phase.types.d.ts +171 -0
- package/dist/runtime/{PathHandle.d.ts → reactivity/PathHandle.d.ts} +14 -6
- package/dist/runtime/reactivity/RaphMetaSource.d.ts +32 -0
- package/dist/runtime/reactivity/RaphSelector.d.ts +338 -0
- package/dist/runtime/reactivity/RaphWorkGraph.d.ts +309 -0
- package/dist/runtime/reactivity/RuntimeReactivity.d.ts +293 -0
- package/dist/runtime/{RuntimeWatch.d.ts → reactivity/RuntimeWatch.d.ts} +12 -6
- package/dist/runtime/reactivity/disposal-sweep.utils.d.ts +19 -0
- package/dist/runtime/reactivity/runtime-reactivity.types.d.ts +56 -0
- package/dist/runtime.cjs +1 -1
- package/dist/runtime.js +21 -16
- package/package.json +76 -35
- package/ReadMe.md +0 -153
- package/dist/api/public.d.ts +0 -22
- package/dist/debug/api/public.cjs +0 -1
- package/dist/debug/api/public.js +0 -40
- package/dist/debug/path/AdapterPathStore.cjs +0 -1
- package/dist/debug/path/AdapterPathStore.js +0 -133
- package/dist/debug/path/DerivedRegistry.cjs +0 -1
- package/dist/debug/path/DerivedRegistry.js +0 -157
- package/dist/debug/path/MetaController.cjs +0 -1
- package/dist/debug/path/PathEventHub.cjs +0 -1
- package/dist/debug/path/PathEventHub.js +0 -148
- package/dist/debug/path/PathStore.cjs +0 -1
- package/dist/debug/path/RaphDerivedHandle.cjs +0 -1
- package/dist/debug/path/RaphMeta.cjs +0 -1
- package/dist/debug/path/RaphMeta.js +0 -68
- package/dist/debug/path/RaphMetaStore.cjs +0 -1
- package/dist/debug/path/data-adapter.cjs +0 -1
- package/dist/debug/path/data-draft.cjs +0 -1
- package/dist/debug/path/data-path.cjs +0 -1
- package/dist/debug/path/data-path.js +0 -423
- package/dist/debug/path/derived-collection.cjs +0 -1
- package/dist/debug/path/path-router.cjs +0 -1
- package/dist/debug/path/path-router.js +0 -86
- package/dist/debug/path/public.cjs +0 -1
- package/dist/debug/path/public.js +0 -18
- package/dist/debug/runtime/PathHandle.cjs +0 -1
- package/dist/debug/runtime/PathHandle.js +0 -139
- package/dist/debug/runtime/RaphDebug.cjs +0 -1
- package/dist/debug/runtime/RaphDebug.js +0 -15
- package/dist/debug/runtime/RaphFrameLoop.cjs +0 -1
- package/dist/debug/runtime/RaphNode.cjs +0 -1
- package/dist/debug/runtime/RaphNode.js +0 -143
- package/dist/debug/runtime/RaphPhasePipeline.cjs +0 -1
- package/dist/debug/runtime/RaphPhasePipeline.js +0 -526
- package/dist/debug/runtime/RaphScope.cjs +0 -1
- package/dist/debug/runtime/RaphScope.js +0 -64
- package/dist/debug/runtime/RuntimeReactivity.cjs +0 -1
- package/dist/debug/runtime/RuntimeReactivity.js +0 -154
- package/dist/debug/runtime/RuntimeWatch.cjs +0 -1
- package/dist/debug/runtime/RuntimeWatch.js +0 -71
- package/dist/debug/runtime/public.cjs +0 -1
- package/dist/debug/runtime/public.js +0 -18
- package/dist/path/PathEventHub.d.ts +0 -48
- package/dist/path/public.d.ts +0 -14
- package/dist/runtime/RaphDebug.d.ts +0 -32
- package/dist/runtime/RaphNode.d.ts +0 -68
- package/dist/runtime/RaphPhasePipeline.d.ts +0 -133
- package/dist/runtime/RaphScope.d.ts +0 -50
- package/dist/runtime/RuntimeReactivity.d.ts +0 -40
- package/dist/runtime/phase.types.d.ts +0 -49
- package/dist/runtime/public.d.ts +0 -13
- package/dist/runtime/runtime-reactivity.types.d.ts +0 -9
- /package/dist/debug/path/{meta.types.cjs → data-path.types.cjs} +0 -0
- /package/dist/debug/path/{meta.types.js → data-path.types.js} +0 -0
- /package/dist/debug/{runtime/runtime-reactivity.types.cjs → path/derived/derived-collection.types.cjs} +0 -0
- /package/dist/debug/{runtime/runtime-reactivity.types.js → path/derived/derived-collection.types.js} +0 -0
- /package/dist/debug/path/{derived-strategies.cjs → derived/derived-strategy.utils.cjs} +0 -0
- /package/dist/debug/path/{derived-strategies.js → derived/derived-strategy.utils.js} +0 -0
- /package/dist/debug/path/{segment-key.cjs → pathSegmentKey.cjs} +0 -0
- /package/dist/debug/path/{segment-key.js → pathSegmentKey.js} +0 -0
- /package/dist/debug/runtime/{parent-graph.cjs → ownership/parentGraph.cjs} +0 -0
- /package/dist/debug/runtime/{parent-graph.js → ownership/parentGraph.js} +0 -0
- /package/dist/debug/runtime/{disposal.cjs → ownership/throwDisposalErrors.cjs} +0 -0
- /package/dist/debug/runtime/{disposal.js → ownership/throwDisposalErrors.js} +0 -0
- /package/dist/debug/runtime/{phase.types.cjs → phases/phase.types.cjs} +0 -0
- /package/dist/debug/runtime/{phase.types.js → phases/phase.types.js} +0 -0
- /package/dist/path/{data-draft.d.ts → storage/createDataDraft.d.ts} +0 -0
- /package/dist/runtime/{disposal.d.ts → ownership/throwDisposalErrors.d.ts} +0 -0
- /package/dist/runtime/{RaphFrameLoop.d.ts → phases/RaphFrameLoop.d.ts} +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Disposer } from '../../reactivity/types';
|
|
2
|
+
import { RaphPhaseTaskRecord } from './RaphPhaseTaskRecord';
|
|
3
|
+
import { RuntimeWatch } from '../reactivity/RuntimeWatch';
|
|
4
|
+
/**
|
|
5
|
+
* Callback lifecycle одного explicit watch binding вместе с подпиской, которая
|
|
6
|
+
* его питает. Подписка освобождается при освобождении binding, до cleanup
|
|
7
|
+
* последней доставки.
|
|
8
|
+
*
|
|
9
|
+
* Lifecycle достаёт callback только через запись своего binding и сбрасывает
|
|
10
|
+
* эту ссылку при освобождении. Публичный watch disposer удерживает lifecycle,
|
|
11
|
+
* а не запись, поэтому disposer, переживший свой binding, не удерживает ни
|
|
12
|
+
* callback, ни захваченное им.
|
|
13
|
+
*/
|
|
14
|
+
export declare class RaphPhaseWatch extends RuntimeWatch {
|
|
15
|
+
source: Disposer | undefined;
|
|
16
|
+
record: RaphPhaseTaskRecord | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Создаёт lifecycle без подписки и без binding; оба поля задаёт регистрация.
|
|
19
|
+
*/
|
|
20
|
+
constructor(runUntracked: <T>(operation: () => T) => T, callback: () => void | Disposer);
|
|
21
|
+
}
|
|
22
|
+
export declare function createPhaseWatch(runUntracked: <T>(operation: () => T) => T, record: RaphPhaseTaskRecord): RaphPhaseWatch;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { RaphPhaseTask, RaphTaskOrderOptions } from './phase.types';
|
|
2
|
+
/**
|
|
3
|
+
* Возвращает новый массив задач в tree-order выбранной пользователем owner-плоскости.
|
|
4
|
+
* Исходный batch и persistent task identities не изменяются.
|
|
5
|
+
*/
|
|
6
|
+
export declare function orderPhaseTasks(tasks: readonly RaphPhaseTask[], options: RaphTaskOrderOptions): RaphPhaseTask[];
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { RaphMetaMutationEvent } from '../../path/meta/meta.types';
|
|
2
|
+
import { PathEvent } from '../../path/path.types';
|
|
3
|
+
import { Disposer, ReadonlySignal } from '../../reactivity/types';
|
|
4
|
+
import { RaphNode } from '../ownership/RaphNode';
|
|
5
|
+
import { RaphScope } from '../ownership/RaphScope';
|
|
6
|
+
import { RaphRuntime } from '../RaphRuntime';
|
|
7
|
+
import { RaphMetaSource } from '../reactivity/RaphMetaSource';
|
|
8
|
+
import { RaphAggregate } from '../reactivity/RaphWorkGraph';
|
|
9
|
+
export declare const RaphSchedulerType: Readonly<{
|
|
10
|
+
readonly AnimationFrame: "animationFrame";
|
|
11
|
+
readonly Microtask: "microtask";
|
|
12
|
+
readonly Sync: "sync";
|
|
13
|
+
}>;
|
|
14
|
+
export type RaphSchedulerMode = typeof RaphSchedulerType[keyof typeof RaphSchedulerType];
|
|
15
|
+
export type RaphEffectInitialMode = 'scheduled' | 'sync';
|
|
16
|
+
export type RaphWatchInitialMode = RaphEffectInitialMode | 'none';
|
|
17
|
+
export interface FrameLoopLease {
|
|
18
|
+
readonly owner: string;
|
|
19
|
+
release: () => void;
|
|
20
|
+
}
|
|
21
|
+
export interface RaphFrameContext {
|
|
22
|
+
readonly now: number;
|
|
23
|
+
readonly delta: number;
|
|
24
|
+
readonly elapsed: number;
|
|
25
|
+
readonly frame: number;
|
|
26
|
+
}
|
|
27
|
+
export interface RaphStructureCause {
|
|
28
|
+
readonly node: RaphNode;
|
|
29
|
+
readonly oldParent?: RaphNode;
|
|
30
|
+
readonly newParent?: RaphNode;
|
|
31
|
+
readonly oldIndex?: number;
|
|
32
|
+
readonly newIndex?: number;
|
|
33
|
+
}
|
|
34
|
+
export type RaphWorkCauseKind = 'producer' | 'structure' | 'path' | 'frame' | 'touch';
|
|
35
|
+
/** Одна logical причина phase delivery. Повторные причины одного source coalesce. */
|
|
36
|
+
export interface RaphWorkCause {
|
|
37
|
+
readonly kind: RaphWorkCauseKind;
|
|
38
|
+
readonly source: RaphWatchSource;
|
|
39
|
+
readonly sourceOwner?: RaphScope;
|
|
40
|
+
readonly revision: number;
|
|
41
|
+
readonly previous?: unknown;
|
|
42
|
+
readonly value?: unknown;
|
|
43
|
+
readonly structure?: RaphStructureCause;
|
|
44
|
+
readonly events?: readonly (PathEvent | RaphMetaMutationEvent)[];
|
|
45
|
+
readonly metadata?: unknown;
|
|
46
|
+
}
|
|
47
|
+
export type RaphPhaseEffect = (task: RaphPhaseTask) => void | Disposer;
|
|
48
|
+
/**
|
|
49
|
+
* Тело binding, зарегистрированного через `bindEffect`: task ему не передаётся,
|
|
50
|
+
* поэтому тело объявляется без параметров. Возвращённый cleanup выполняется
|
|
51
|
+
* перед следующим запуском и при освобождении binding.
|
|
52
|
+
*/
|
|
53
|
+
export type RaphPhaseBody = () => void | Disposer;
|
|
54
|
+
/**
|
|
55
|
+
* Запуск одного slot группы: кортеж, который получает тело slot. Первый элемент
|
|
56
|
+
* — context группы, второй — номер исполняемого slot, считая с нуля.
|
|
57
|
+
*
|
|
58
|
+
* Кортеж один на группу и принадлежит ей: номер slot в нём меняется от запуска
|
|
59
|
+
* к запуску, а остальные элементы — внутреннее состояние группы. Тело читает
|
|
60
|
+
* первые два элемента по индексу во время вызова и не сохраняет кортеж.
|
|
61
|
+
*
|
|
62
|
+
* Кортеж — живое состояние группы, а не копия: от записи его защищает только
|
|
63
|
+
* тип. Тело, которое пишет в кортеж или читает элементы после второго,
|
|
64
|
+
* нарушает contract: запись в первый элемент подменяет context следующим
|
|
65
|
+
* slots, запись в остальные ломает доставку группы.
|
|
66
|
+
*
|
|
67
|
+
* @typeParam Context — значение, которое группа передаёт телу каждого slot.
|
|
68
|
+
*/
|
|
69
|
+
export type RaphEffectGroupRun<Context = unknown> = readonly [
|
|
70
|
+
context: Context,
|
|
71
|
+
slot: number,
|
|
72
|
+
...state: readonly unknown[]
|
|
73
|
+
];
|
|
74
|
+
/**
|
|
75
|
+
* Тело одного slot группы, зарегистрированной через `effectGroup`. Получает
|
|
76
|
+
* один аргумент — запуск с context группы и номером slot; task ему не
|
|
77
|
+
* передаётся. Чтения внутри вызова отслеживаются отдельно для каждого slot, а
|
|
78
|
+
* возвращённый cleanup принадлежит этому slot: он выполняется перед его
|
|
79
|
+
* следующим запуском и при освобождении группы.
|
|
80
|
+
*
|
|
81
|
+
* Аргумент один, как у тела `effect()`: общее для всех effects тело записи
|
|
82
|
+
* engine вызывает тело slot напрямую, без промежуточной функции на каждый
|
|
83
|
+
* запуск slot.
|
|
84
|
+
*
|
|
85
|
+
* @typeParam Context — значение, которое группа передаёт телу каждого slot.
|
|
86
|
+
*/
|
|
87
|
+
export type RaphEffectGroupSlot<Context = unknown> = (run: RaphEffectGroupRun<Context>) => void | Disposer;
|
|
88
|
+
/** Настройки группы effects: порядок её task среди bindings той же phase. */
|
|
89
|
+
export interface RaphEffectGroupOptions {
|
|
90
|
+
readonly priority?: number;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Группа effects одного binding, которую вернул `effectGroup`. Slots группы
|
|
94
|
+
* ничего не исполняют, пока их не запустит `start`; метод вызывается через
|
|
95
|
+
* группу или с явным receiver.
|
|
96
|
+
*
|
|
97
|
+
* Возвращаемое значение — сама запись binding, а не отдельный объект: handle
|
|
98
|
+
* не стоит группе аллокации. Contract — только `start`; остальные поля и
|
|
99
|
+
* методы записи внутренние, и обращение к ним нарушает contract.
|
|
100
|
+
*/
|
|
101
|
+
export interface RaphEffectGroup {
|
|
102
|
+
/**
|
|
103
|
+
* Запускает slot: с этого вызова slot ведёт себя как binding, который
|
|
104
|
+
* `bindEffect()` зарегистрировал бы в этом месте. `initial` задаёт первую
|
|
105
|
+
* доставку так же, как у `effect()`: `'scheduled'` (по умолчанию) ставит её
|
|
106
|
+
* в очередь, `'sync'` исполняет её до возврата из вызова, если Runtime не
|
|
107
|
+
* занят доставкой и группа не на pause.
|
|
108
|
+
*
|
|
109
|
+
* Если первая доставка выполняется внутри вызова и flush бросает ошибку,
|
|
110
|
+
* slot останавливается окончательно, а ошибка бросается вызывающему, как
|
|
111
|
+
* при сбое регистрации отдельного binding. Остальные slots группы остаются.
|
|
112
|
+
* Запуск остановленного slot и повторный запуск уже запущенного slot не
|
|
113
|
+
* исполняют его тело.
|
|
114
|
+
*
|
|
115
|
+
* Запуск на освобождённом владельце бросает `RaphDisposedError`, как
|
|
116
|
+
* `bindEffect()`: и когда владелец освобождён до вызова, и когда его
|
|
117
|
+
* освободила первая доставка внутри этого вызова, при любом scheduler.
|
|
118
|
+
* Запуск slot группы, которую освободили при живом владельце — через её
|
|
119
|
+
* effect scope либо остановкой последнего slot, — ничего не делает.
|
|
120
|
+
*/
|
|
121
|
+
start: (this: RaphEffectGroup, slot: number, initial?: RaphEffectInitialMode) => void;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Persistent task identity, передаваемая phase process и effect callback.
|
|
125
|
+
* run/defer/cancel вызываются через task или с явным receiver: извлечённый
|
|
126
|
+
* метод не работает без this.
|
|
127
|
+
*/
|
|
128
|
+
export interface RaphPhaseTask {
|
|
129
|
+
readonly phase: string;
|
|
130
|
+
readonly consumerOwner: RaphScope;
|
|
131
|
+
readonly effect: RaphPhaseEffect;
|
|
132
|
+
readonly causes: readonly RaphWorkCause[];
|
|
133
|
+
readonly frame: RaphFrameContext;
|
|
134
|
+
readonly priority: number;
|
|
135
|
+
readonly sequence: number;
|
|
136
|
+
run: (this: RaphPhaseTask) => void;
|
|
137
|
+
defer: (this: RaphPhaseTask) => void;
|
|
138
|
+
cancel: (this: RaphPhaseTask) => void;
|
|
139
|
+
}
|
|
140
|
+
export interface RaphPhaseBatch {
|
|
141
|
+
readonly phase: string;
|
|
142
|
+
readonly frame: RaphFrameContext;
|
|
143
|
+
readonly tasks: readonly RaphPhaseTask[];
|
|
144
|
+
}
|
|
145
|
+
export interface RaphPhase {
|
|
146
|
+
readonly name: string;
|
|
147
|
+
readonly process?: (batch: RaphPhaseBatch) => void;
|
|
148
|
+
}
|
|
149
|
+
export interface RaphEffectOptions {
|
|
150
|
+
readonly initial?: RaphEffectInitialMode;
|
|
151
|
+
readonly priority?: number;
|
|
152
|
+
}
|
|
153
|
+
export type RaphWatchInclude = 'self' | 'subtree';
|
|
154
|
+
export interface RaphWatchOptions extends Omit<RaphEffectOptions, 'initial'> {
|
|
155
|
+
/** `none` creates a change-only binding without an initial delivery. */
|
|
156
|
+
readonly initial?: RaphWatchInitialMode;
|
|
157
|
+
/** Применяется только к RaphNode source; default — self. */
|
|
158
|
+
readonly include?: RaphWatchInclude;
|
|
159
|
+
}
|
|
160
|
+
export interface RaphNodeWatchSource {
|
|
161
|
+
readonly source: RaphNode;
|
|
162
|
+
readonly include: RaphWatchInclude;
|
|
163
|
+
}
|
|
164
|
+
export type RaphProducerSource = ReadonlySignal<unknown>;
|
|
165
|
+
export type RaphWatchSource = RaphProducerSource | RaphNode | RaphNodeWatchSource | RaphRuntime | RaphAggregate | RaphMetaSource;
|
|
166
|
+
export type RaphOwnerWatchSource = RaphWatchSource;
|
|
167
|
+
export type RaphAggregateSource = RaphOwnerWatchSource;
|
|
168
|
+
export interface RaphTaskOrderOptions {
|
|
169
|
+
readonly node: (task: RaphPhaseTask) => RaphNode | null | undefined;
|
|
170
|
+
readonly direction?: 'parents-first' | 'children-first';
|
|
171
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { ParsedDataPath } from '
|
|
2
|
-
import { PathOptions } from '
|
|
3
|
-
import { RaphKernel } from '
|
|
4
|
-
import { RaphReactivity } from '
|
|
5
|
-
import { ReadonlySignal } from '
|
|
1
|
+
import { ParsedDataPath } from '../../path/data-path.types';
|
|
2
|
+
import { PathEvents, PathOptions } from '../../path/path.types';
|
|
3
|
+
import { RaphKernel } from '../../path/RaphKernel';
|
|
4
|
+
import { RaphReactivity } from '../../reactivity/engine';
|
|
5
|
+
import { Disposer, OwnedSourceHooks, ReadonlySignal } from '../../reactivity/types';
|
|
6
6
|
type PathSignalEngine = Pick<RaphReactivity, '_isTracking' | '_ownedSignal'>;
|
|
7
7
|
/**
|
|
8
8
|
* Реактивный handle одного canonical path в default E2 data-plane.
|
|
@@ -20,13 +20,17 @@ export declare class PathHandle<T> implements ReadonlySignal<T | undefined> {
|
|
|
20
20
|
private _assertTrackedRead;
|
|
21
21
|
private _assertWriteAllowed;
|
|
22
22
|
private _runWrite;
|
|
23
|
+
private _notifyEvents;
|
|
24
|
+
private _hasRevisionSubscribers;
|
|
23
25
|
private _stop;
|
|
26
|
+
private _activationLeases;
|
|
27
|
+
private _trackedActivation;
|
|
24
28
|
private _disposed;
|
|
25
29
|
/**
|
|
26
30
|
* Создаёт internal path handle и связывает его с runtime lifecycle.
|
|
27
31
|
* @internal
|
|
28
32
|
*/
|
|
29
|
-
constructor(store: RaphKernel, parsed: ParsedDataPath, options: PathOptions, release: (handle: PathHandle<unknown>) => void, signals: PathSignalEngine, assertOwnerAlive?: () => void, assertTrackedRead?: () => void, assertWriteAllowed?: () => void, runWrite?: <Result>(operation: () => Result) => Result);
|
|
33
|
+
constructor(store: RaphKernel, parsed: ParsedDataPath, options: PathOptions, release: (handle: PathHandle<unknown>) => void, signals: PathSignalEngine, assertOwnerAlive?: () => void, assertTrackedRead?: () => void, assertWriteAllowed?: () => void, runWrite?: <Result>(operation: () => Result) => Result, sourceHooks?: OwnedSourceHooks, notifyEvents?: (events: PathEvents, hasReactiveSubscribers: boolean) => void);
|
|
30
34
|
/**
|
|
31
35
|
* Показывает, освобождён ли path handle.
|
|
32
36
|
*/
|
|
@@ -59,13 +63,17 @@ export declare class PathHandle<T> implements ReadonlySignal<T | undefined> {
|
|
|
59
63
|
* Отсоединяет Kernel subscription и освобождает reactive revision handle.
|
|
60
64
|
*/
|
|
61
65
|
dispose(): void;
|
|
66
|
+
private _disposeNow;
|
|
62
67
|
/**
|
|
63
68
|
* Читает path с регистрацией runtime reactive dependency.
|
|
64
69
|
* @internal
|
|
65
70
|
*/
|
|
66
71
|
_getTracked(): T | undefined;
|
|
72
|
+
/** Activates the lazy Kernel observer for an explicit granular watch. @internal */
|
|
73
|
+
_activate(): Disposer;
|
|
67
74
|
private _readTracked;
|
|
68
75
|
private _observe;
|
|
76
|
+
private _releaseObserverIfIdle;
|
|
69
77
|
private _write;
|
|
70
78
|
private _assertAlive;
|
|
71
79
|
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { RaphMetaWatchOptions } from '../../path/meta/meta.types';
|
|
2
|
+
import { DataPathDef } from '../../path/path.types';
|
|
3
|
+
import { Disposer } from '../../reactivity/types';
|
|
4
|
+
import { RaphScope } from '../ownership/RaphScope';
|
|
5
|
+
export type RaphMetaSourceOptions = RaphMetaWatchOptions;
|
|
6
|
+
/** Immutable Runtime-owned metadata event source for explicit phase watches. */
|
|
7
|
+
export declare class RaphMetaSource {
|
|
8
|
+
readonly owner: RaphScope;
|
|
9
|
+
private _start;
|
|
10
|
+
private _release;
|
|
11
|
+
readonly masks: DataPathDef | readonly DataPathDef[];
|
|
12
|
+
readonly options: Readonly<RaphMetaSourceOptions>;
|
|
13
|
+
private _stop;
|
|
14
|
+
private _activationLeases;
|
|
15
|
+
private _disposed;
|
|
16
|
+
private _releaseOwner;
|
|
17
|
+
/** @internal */
|
|
18
|
+
private constructor();
|
|
19
|
+
/** @internal */
|
|
20
|
+
static _create(owner: RaphScope, masks: DataPathDef | readonly DataPathDef[], options: RaphMetaSourceOptions, start: () => Disposer, release: () => void): RaphMetaSource;
|
|
21
|
+
get runtime(): import('../RaphRuntime').RaphRuntime;
|
|
22
|
+
get disposed(): boolean;
|
|
23
|
+
dispose(): void;
|
|
24
|
+
/** @internal */
|
|
25
|
+
_bindOwner(release: Disposer): void;
|
|
26
|
+
/** @internal */
|
|
27
|
+
_disposeOwned(): void;
|
|
28
|
+
/** @internal */
|
|
29
|
+
_activate(): Disposer;
|
|
30
|
+
/** @internal */
|
|
31
|
+
_assertAlive(): void;
|
|
32
|
+
}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import { OwnedSourceEntry } from '../../reactivity/scope';
|
|
2
|
+
import { RaphScope } from '../ownership/RaphScope';
|
|
3
|
+
import { RuntimeDisposalSweeper, RuntimeSignalWriteTap } from './runtime-reactivity.types';
|
|
4
|
+
import { RuntimeReactivity, RuntimeSignal } from './RuntimeReactivity';
|
|
5
|
+
/**
|
|
6
|
+
* Настройки selector.
|
|
7
|
+
*
|
|
8
|
+
* @typeParam Key — тип ключа и значения source.
|
|
9
|
+
*/
|
|
10
|
+
export interface RaphSelectorOptions<Key> {
|
|
11
|
+
/**
|
|
12
|
+
* Сравнение ключа со значением source вместо SameValueZero. Функция должна
|
|
13
|
+
* быть чистой: один и тот же ответ для одной пары аргументов и никаких
|
|
14
|
+
* чтений реактивных источников. С ней запись в source сравнивает каждый
|
|
15
|
+
* наблюдаемый ключ с прежним и с новым значением и будит только те ключи,
|
|
16
|
+
* чей ответ изменился.
|
|
17
|
+
*/
|
|
18
|
+
readonly equals?: (key: Key, value: Key) => boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Чтение selector: сообщает, совпадает ли ключ с текущим значением source, и
|
|
22
|
+
* подписывает активного потребителя только на этот ключ.
|
|
23
|
+
*
|
|
24
|
+
* @typeParam Key — тип ключа и значения source.
|
|
25
|
+
*/
|
|
26
|
+
export type RaphSelector<Key> = (key: Key) => boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Компактное описание selector, которое возвращает его toJSON().
|
|
29
|
+
*
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
export interface RuntimeSelectorDescription {
|
|
33
|
+
readonly owner: string;
|
|
34
|
+
readonly triggers: number;
|
|
35
|
+
readonly disposed: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Selector одним объектом: запись в списке источников владельца, наблюдатель
|
|
39
|
+
* записей source, индекс triggers по ключам и участник уборки Runtime.
|
|
40
|
+
*
|
|
41
|
+
* Trigger ключа — запись-счётчик графа: потребитель, прочитавший ключ,
|
|
42
|
+
* зависит только от неё, а не от source. Запись в source
|
|
43
|
+
* сдвигает счётчики triggers прежнего и нового ключа, и будятся только их
|
|
44
|
+
* потребители. Ответ чтения всегда вычисляется заново по текущему значению
|
|
45
|
+
* source, поэтому лишнее пробуждение безвредно, а пропущенных не бывает:
|
|
46
|
+
* каждая запись, меняющая ответ ключа, сдвигает его счётчик. Вне группировки
|
|
47
|
+
* сдвиг сразу делает потребителя обязательным к пересчёту, внутри неё остаётся
|
|
48
|
+
* у trigger, пока его не прочитает потребитель. Сдвиги не отменяют друг друга:
|
|
49
|
+
* потребитель ключа, через который batch прошёл туда и обратно, выполняется
|
|
50
|
+
* один лишний раз. Исключение то же, что у обычного signal: потребитель,
|
|
51
|
+
* который сам выполнялся в момент записи вне группировки и которого engine не
|
|
52
|
+
* планирует заново, и читатели такого потребителя (см. `_bump`).
|
|
53
|
+
*
|
|
54
|
+
* Trigger нужен, пока у него есть потребители. Как selector узнаёт, что их не
|
|
55
|
+
* осталось, зависит от ключа.
|
|
56
|
+
*
|
|
57
|
+
* - Ключ-объект или функция. Его trigger снимается вместе с последней связью
|
|
58
|
+
* графа: selector не удерживает объект дольше его потребителей. Цена —
|
|
59
|
+
* cleanup на каждую связь.
|
|
60
|
+
* - Остальные ключи. Связи с их triggers ничем не отличаются от связей с
|
|
61
|
+
* signal, и потребитель не платит за selector ни при создании связи, ни при
|
|
62
|
+
* её снятии. Trigger без потребителей остаётся в индексе до уборки. Уборка
|
|
63
|
+
* идёт при записи в source, которая затрагивает такой ключ; когда индекс
|
|
64
|
+
* вырос вдвое после прошлой уборки; когда Runtime после прошлой уборки
|
|
65
|
+
* освободил не меньше владельцев, чем ключей в индексе; при освобождении
|
|
66
|
+
* владельца selector. Уборка после освобождений, которая ничего не убрала,
|
|
67
|
+
* удваивает срок следующей: освобождения посторонних владельцев стоят
|
|
68
|
+
* selector логарифма от их числа, а не уборки на каждые несколько из них.
|
|
69
|
+
* Удержанный до уборки trigger — одна запись графа и значение ключа;
|
|
70
|
+
* потребителей он не удерживает.
|
|
71
|
+
*
|
|
72
|
+
* Индекс triggers состоит из двух частей. Целые ключи, идущие подряд по
|
|
73
|
+
* возрастанию — ключи строк списка, — лежат в ряду: место ряда принадлежит
|
|
74
|
+
* ключу «начало ряда плюс номер места», и ключ стоит selector одного места
|
|
75
|
+
* массива, без записи `Map` и без хеширования. Все остальные ключи лежат в
|
|
76
|
+
* общем индексе `Map`, который создаётся с первым таким ключом. У ключа ровно
|
|
77
|
+
* один trigger: ключ, попавший в общий индекс, остаётся в нём, и ряд через
|
|
78
|
+
* него не растёт. Место ряда принадлежит ключу, только если сумма начала ряда
|
|
79
|
+
* и номера места равна самому ключу: нецелый ключ места не получает никогда.
|
|
80
|
+
*
|
|
81
|
+
* Запись со своим сравнением обходит сначала ряд по возрастанию ключей, затем
|
|
82
|
+
* общий индекс в порядке первого чтения ключей. В этом порядке она будит
|
|
83
|
+
* потребителей; порядок может измениться и контрактом не является.
|
|
84
|
+
*
|
|
85
|
+
* Поля объявлены через `declare` и присваиваются в constructor в одном
|
|
86
|
+
* порядке: у всех selectors один hidden class.
|
|
87
|
+
*
|
|
88
|
+
* @internal
|
|
89
|
+
*/
|
|
90
|
+
export declare class RuntimeSelector<Key> implements OwnedSourceEntry, RuntimeSignalWriteTap, RuntimeDisposalSweeper {
|
|
91
|
+
/**
|
|
92
|
+
* Публичное чтение selector; одна функция на весь его lifetime.
|
|
93
|
+
*/
|
|
94
|
+
readonly select: RaphSelector<Key>;
|
|
95
|
+
/**
|
|
96
|
+
* Источник, зарегистрированный у владельца перед этим.
|
|
97
|
+
* @internal
|
|
98
|
+
*/
|
|
99
|
+
_previousSource: OwnedSourceEntry | undefined;
|
|
100
|
+
/**
|
|
101
|
+
* Ключ-объект текущего отслеживаемого чтения: по нему hook onDependency
|
|
102
|
+
* узнаёт, для какого ключа engine создаёт связь. Вне чтения поле пусто.
|
|
103
|
+
* @internal
|
|
104
|
+
*/
|
|
105
|
+
_trackedKey: Key | undefined;
|
|
106
|
+
private readonly _owner;
|
|
107
|
+
private readonly _reactivity;
|
|
108
|
+
private readonly _source;
|
|
109
|
+
private _equals;
|
|
110
|
+
private readonly _dense;
|
|
111
|
+
private _denseBase;
|
|
112
|
+
private _denseCount;
|
|
113
|
+
private _triggers;
|
|
114
|
+
private _scanning;
|
|
115
|
+
private readonly _objectHooks;
|
|
116
|
+
private _growthLimit;
|
|
117
|
+
private _sweptAt;
|
|
118
|
+
private _sweepStride;
|
|
119
|
+
private _disposed;
|
|
120
|
+
/**
|
|
121
|
+
* Место selector среди наблюдателей записи source; ведёт source.
|
|
122
|
+
* @internal
|
|
123
|
+
*/
|
|
124
|
+
_tapSlot: number;
|
|
125
|
+
/**
|
|
126
|
+
* Место selector в очереди уборки Runtime; -1, пока selector в ней не стоит.
|
|
127
|
+
* Ведёт Runtime.
|
|
128
|
+
* @internal
|
|
129
|
+
*/
|
|
130
|
+
_sweepSlot: number;
|
|
131
|
+
/**
|
|
132
|
+
* Срок selector в очереди уборки Runtime; ведёт Runtime.
|
|
133
|
+
* @internal
|
|
134
|
+
*/
|
|
135
|
+
_sweepDue: number;
|
|
136
|
+
/**
|
|
137
|
+
* Создаёт selector и подключает его к записям source. Регистрацию у
|
|
138
|
+
* владельца и проверку аргументов выполняет вызывающий код.
|
|
139
|
+
*/
|
|
140
|
+
constructor(owner: RaphScope, reactivity: RuntimeReactivity, source: RuntimeSignal<Key>, equals: ((key: Key, value: Key) => boolean) | undefined);
|
|
141
|
+
/**
|
|
142
|
+
* Тег Object.prototype.toString: инструменты, которые обходят только plain
|
|
143
|
+
* objects, принимают selector за неделимое значение и не идут через него в
|
|
144
|
+
* граф Runtime.
|
|
145
|
+
*/
|
|
146
|
+
get [Symbol.toStringTag](): string;
|
|
147
|
+
/**
|
|
148
|
+
* Возвращает компактное описание вместо собственных полей: они ведут к
|
|
149
|
+
* владельцу, Runtime и графу зависимостей.
|
|
150
|
+
*/
|
|
151
|
+
toJSON(): RuntimeSelectorDescription;
|
|
152
|
+
/**
|
|
153
|
+
* Владелец selector как наблюдателя записей source.
|
|
154
|
+
* @internal
|
|
155
|
+
*/
|
|
156
|
+
get _tapOwner(): RaphScope;
|
|
157
|
+
/**
|
|
158
|
+
* Число ключей в индексе triggers: с потребителями и ещё не убранных.
|
|
159
|
+
* @internal
|
|
160
|
+
*/
|
|
161
|
+
_debugTriggerCount(): number;
|
|
162
|
+
/**
|
|
163
|
+
* Отвечает, совпадает ли ключ с текущим значением source, и подписывает
|
|
164
|
+
* активного потребителя на trigger этого ключа. Чтение проверяется как
|
|
165
|
+
* чтение signal владельца selector: тот же lifetime, тот же запрет чужого
|
|
166
|
+
* Runtime и то же правило implicit-зависимостей.
|
|
167
|
+
*
|
|
168
|
+
* Подписка идёт раньше сравнения: потребитель, у которого чтение source или
|
|
169
|
+
* сравнение бросило исключение, всё равно будет разбужен следующей записью.
|
|
170
|
+
* @internal
|
|
171
|
+
*/
|
|
172
|
+
_test(key: Key): boolean;
|
|
173
|
+
/**
|
|
174
|
+
* Сообщает, что запись в source может разбудить потребителей selector.
|
|
175
|
+
* @internal
|
|
176
|
+
*/
|
|
177
|
+
_observesWrites(): boolean;
|
|
178
|
+
/**
|
|
179
|
+
* Будит потребителей ключей, чей ответ изменила запись в source. Вызывается
|
|
180
|
+
* signal-ом после того, как новое значение стало видимым, внутри его границы
|
|
181
|
+
* записи. Сбой одного пробуждения не отменяет остальные.
|
|
182
|
+
* @internal
|
|
183
|
+
*/
|
|
184
|
+
_afterSourceWrite(previous: unknown, value: unknown): void;
|
|
185
|
+
/**
|
|
186
|
+
* Убирает triggers без потребителей, когда Runtime после прошлой уборки
|
|
187
|
+
* освободил не меньше владельцев, чем ключей в индексе: при массовом
|
|
188
|
+
* освобождении потребителей индекс пустеет одной уборкой на последнем из
|
|
189
|
+
* них. Вызов до срока стоит одного сравнения.
|
|
190
|
+
*
|
|
191
|
+
* Уборка, которая ничего не убрала, удваивает срок следующей: владельцы,
|
|
192
|
+
* освобождённые за это время, не держали потребителей selector, и чем дольше
|
|
193
|
+
* так продолжается, тем реже selector проверяет индекс. Первая же уборка,
|
|
194
|
+
* которая что-то убрала, возвращает прежний срок. Опустевший selector
|
|
195
|
+
* выходит из уборки Runtime и вернётся в неё с первым новым trigger.
|
|
196
|
+
* @internal
|
|
197
|
+
*/
|
|
198
|
+
_afterOwnerDisposals(disposals: number): number;
|
|
199
|
+
/**
|
|
200
|
+
* Обрабатывает снятие одной связи графа с trigger ключа-объекта. Engine
|
|
201
|
+
* вызывает cleanup связи до того, как вынет её из списка потребителей:
|
|
202
|
+
* связь, оставшаяся в списке единственной, и есть снимаемая, и вместе с ней
|
|
203
|
+
* ключ теряет последнего потребителя. Запись графа при этом не
|
|
204
|
+
* освобождается: её список потребителей в этот момент обходит engine, а без
|
|
205
|
+
* потребителей и без ссылки из индекса она недостижима.
|
|
206
|
+
* @internal
|
|
207
|
+
*/
|
|
208
|
+
_edgeDetached(key: Key): void;
|
|
209
|
+
/**
|
|
210
|
+
* Ищет среди потребителей всех triggers первого, чьего владельца принимает
|
|
211
|
+
* accept, и возвращает этого владельца: implicit-рёбра selector лежат только
|
|
212
|
+
* в графе, как и рёбра Runtime signal.
|
|
213
|
+
* @internal
|
|
214
|
+
*/
|
|
215
|
+
_findConsumerOwner<Context>(accept: (consumerOwner: object, context: Context) => boolean, context: Context): object | undefined;
|
|
216
|
+
/**
|
|
217
|
+
* Освобождает selector как источник владельца: отключает его от записей
|
|
218
|
+
* source и от уборки Runtime и отсоединяет оставшихся потребителей от всех
|
|
219
|
+
* triggers. Сбой одного шага не отменяет остальные. Повторный вызов
|
|
220
|
+
* безопасен.
|
|
221
|
+
* @internal
|
|
222
|
+
*/
|
|
223
|
+
_finalizeSource(): boolean;
|
|
224
|
+
/**
|
|
225
|
+
* Убирает из индекса triggers без потребителей и запоминает, сколько
|
|
226
|
+
* владельцев Runtime освободил к этому моменту. Индекс, в котором
|
|
227
|
+
* потребителей не осталось ни у кого, очищается целиком.
|
|
228
|
+
* @internal
|
|
229
|
+
*/
|
|
230
|
+
_sweep(disposals?: number): void;
|
|
231
|
+
/**
|
|
232
|
+
* Число ключей в обеих частях индекса: с потребителями и ещё не убранных.
|
|
233
|
+
*/
|
|
234
|
+
private _size;
|
|
235
|
+
/**
|
|
236
|
+
* Подписывает активного потребителя на trigger ключа; без потребителя ничего
|
|
237
|
+
* не создаёт. Trigger появляется первым отслеживаемым чтением ключа.
|
|
238
|
+
*/
|
|
239
|
+
private _track;
|
|
240
|
+
/**
|
|
241
|
+
* Создаёт trigger целого ключа на месте `offset` ряда: в конце ряда либо на
|
|
242
|
+
* месте, чей прежний trigger убран. Без активного потребителя ничего не
|
|
243
|
+
* создаёт, и пустой ряд остаётся пустым.
|
|
244
|
+
*/
|
|
245
|
+
private _trackDense;
|
|
246
|
+
/**
|
|
247
|
+
* Подписывает активного потребителя на trigger ключа-объекта: связь с ним
|
|
248
|
+
* получает cleanup, который помнит ключ.
|
|
249
|
+
*/
|
|
250
|
+
private _trackObject;
|
|
251
|
+
/**
|
|
252
|
+
* Убирает triggers без потребителей, когда индекс вырос вдвое после прошлой
|
|
253
|
+
* уборки, и назначает следующий порог роста: цена уборок остаётся
|
|
254
|
+
* постоянной на один новый trigger. С первым trigger подключает selector к
|
|
255
|
+
* уборке Runtime после освобождения владельцев.
|
|
256
|
+
*/
|
|
257
|
+
private _grow;
|
|
258
|
+
/**
|
|
259
|
+
* Будит потребителей прежнего и нового значения source при сравнении
|
|
260
|
+
* SameValueZero: ответ изменился только у этих двух ключей. Trigger нового
|
|
261
|
+
* значения ищется после пробуждения прежнего, которое могло изменить индекс.
|
|
262
|
+
*/
|
|
263
|
+
private _wakePair;
|
|
264
|
+
/**
|
|
265
|
+
* Сдвигает счётчик trigger: его потребители получают invalidation. Trigger
|
|
266
|
+
* без потребителей убирается из индекса здесь.
|
|
267
|
+
*
|
|
268
|
+
* Значение trigger только растёт, поэтому сдвиг нельзя отменить следующим:
|
|
269
|
+
* ключ, через который batch прошёл туда и обратно, остаётся изменённым, пока
|
|
270
|
+
* его не прочитает потребитель.
|
|
271
|
+
*
|
|
272
|
+
* Сдвиг — обычная запись signal. Вне группировки она прямая, и потребителя
|
|
273
|
+
* engine делает обязательным к пересчёту в любом его состоянии: без пометок,
|
|
274
|
+
* помеченного «проверить» записью, которую её batch затем отменил
|
|
275
|
+
* (`direct-write-after-check.spec.ts`), и стоящего на стеке собственной
|
|
276
|
+
* проверки зависимостей, getter которой записал source
|
|
277
|
+
* (`direct-write-during-check.spec.ts`, блок `selector trigger`). Внутри
|
|
278
|
+
* группировки сдвиг откладывается у trigger до первого чтения вместе с
|
|
279
|
+
* записью самого source.
|
|
280
|
+
*
|
|
281
|
+
* Потребителя, который выполняется в момент прямого сдвига, engine помечает
|
|
282
|
+
* как при записи любого signal, и непрочитанного сдвига у trigger для него
|
|
283
|
+
* не остаётся. Runtime планирует заново только phase effect, который читает
|
|
284
|
+
* selector сам. Effect без задачи и computed, вернувший прежнее значение,
|
|
285
|
+
* остаются со старым ответом до следующей записи, которая меняет ответ
|
|
286
|
+
* ключа: пометку записи, пришедшей во время запуска, engine с них снимает.
|
|
287
|
+
* Старый ответ такого computed получает и каждый его читатель — phase effect
|
|
288
|
+
* любой формы регистрации, watch и прямое чтение, — в том числе после
|
|
289
|
+
* собственного повторного запуска. Отложенный сдвиг подтверждала им
|
|
290
|
+
* следующая проверка зависимостей или следующий читатель ключа, прямой —
|
|
291
|
+
* нет; обычный signal на месте selector ведёт себя так же, как прямой сдвиг
|
|
292
|
+
* (тот же файл, блок `selector source written while a consumer of the key
|
|
293
|
+
* runs`; причина в engine — блок `known limitations`).
|
|
294
|
+
*/
|
|
295
|
+
private _bump;
|
|
296
|
+
/**
|
|
297
|
+
* Сравнивает один наблюдаемый ключ с прежним и с новым значением source и
|
|
298
|
+
* будит его потребителей, если ответ изменился. Ответ, который не удалось
|
|
299
|
+
* вычислить, считается изменившимся: потребитель встретит то же исключение
|
|
300
|
+
* в собственном чтении. Сбои копятся в `errors`; возвращается их список.
|
|
301
|
+
*/
|
|
302
|
+
private _wakeChanged;
|
|
303
|
+
/**
|
|
304
|
+
* Возвращает trigger ключа из той части индекса, где лежит ключ. Место ряда
|
|
305
|
+
* с убранным trigger отвечает undefined, как отсутствующий ключ. Место ряда
|
|
306
|
+
* проверяется так же, как при чтении: по нему должен получаться сам ключ.
|
|
307
|
+
*/
|
|
308
|
+
private _find;
|
|
309
|
+
/**
|
|
310
|
+
* Убирает trigger ключа из той части индекса, где лежит ключ.
|
|
311
|
+
*
|
|
312
|
+
* Место ряда остаётся пустым, и ряд не сдвигается, даже когда ключ стоял на
|
|
313
|
+
* его краю: запись, убравшая ключ, стоит одинаково при любой длине ряда.
|
|
314
|
+
* Порядок в ряду наводит уборка, которая и так обходит его целиком. Запись
|
|
315
|
+
* делает это сама в двух случаях: ряд опустел, либо мест в нём стало больше,
|
|
316
|
+
* чем вдвое против допустимого для обрезанного ряда. Во втором случае проход
|
|
317
|
+
* оставляет от ряда меньше половины мест либо переносит его в общий индекс,
|
|
318
|
+
* поэтому его цена ложится на создание убранных мест, а не на записи.
|
|
319
|
+
*/
|
|
320
|
+
private _forget;
|
|
321
|
+
/**
|
|
322
|
+
* Приводит ряд в порядок после того, как из него убраны triggers: опустевший
|
|
323
|
+
* ряд становится пустым, пустые места с краёв срезаются, а ряд, в котором
|
|
324
|
+
* после этого мест больше удвоенного числа занятых плюс запас, целиком
|
|
325
|
+
* переносится в общий индекс. Так ряд занимает память, пропорциональную
|
|
326
|
+
* числу своих ключей, какой бы старый ключ ни остался наблюдаемым.
|
|
327
|
+
*
|
|
328
|
+
* Проход стоит длины ряда, поэтому его вызывают уборка и запись со своим
|
|
329
|
+
* сравнением, которые обходят ряд сами, а запись, убравшая один ключ, —
|
|
330
|
+
* только по правилу из `_forget()`. Пока запись обходит индекс, ряд не
|
|
331
|
+
* сдвигается и не переносится: порядок наведёт сам обход.
|
|
332
|
+
*
|
|
333
|
+
* Срез начала сдвигает начало ряда на число срезанных мест. Ключ первого
|
|
334
|
+
* оставшегося места — целое число, равное этой сумме, поэтому сложение
|
|
335
|
+
* точное.
|
|
336
|
+
*/
|
|
337
|
+
private _settleDense;
|
|
338
|
+
}
|