@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,168 @@
|
|
|
1
|
+
import { DisposalFailure } from '../../reactivity/disposal';
|
|
2
|
+
import { OwnedSourceEntry, ScopeOwner } from '../../reactivity/scope';
|
|
3
|
+
import { Disposer, OwnedResource, OwnedSource, ReadonlySignal, Signal, WritableComputedOptions } from '../../reactivity/types';
|
|
4
|
+
import { RaphAggregateSource, RaphEffectGroup, RaphEffectGroupOptions, RaphEffectGroupSlot, RaphEffectOptions, RaphPhaseBody, RaphPhaseEffect, RaphWatchOptions, RaphWatchSource } from '../phases/phase.types';
|
|
5
|
+
import { RaphRuntime } from '../RaphRuntime';
|
|
6
|
+
import { RaphSelector, RaphSelectorOptions } from '../reactivity/RaphSelector';
|
|
7
|
+
import { RaphAggregate } from '../reactivity/RaphWorkGraph';
|
|
8
|
+
import { RaphNode } from './RaphNode';
|
|
9
|
+
/**
|
|
10
|
+
* Runtime owner. Список ресурсов, список источников и признаки lifetime
|
|
11
|
+
* наследуются от ScopeOwner и лежат в самом владельце; standalone unphased
|
|
12
|
+
* effect/watch класса ScopeNode Runtime-владелец намеренно не наследует.
|
|
13
|
+
*/
|
|
14
|
+
export declare class RaphScope extends ScopeOwner {
|
|
15
|
+
/**
|
|
16
|
+
* Явный id либо числовой номер id по умолчанию, который RaphNode
|
|
17
|
+
* форматирует при первом чтении `id`.
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
protected _id: string | number;
|
|
21
|
+
readonly runtime: RaphRuntime;
|
|
22
|
+
/**
|
|
23
|
+
* Порядковый номер регистрации владельца в его Runtime. Владельцы, пережившие
|
|
24
|
+
* дерево root, Runtime при собственном освобождении обходит по этому номеру
|
|
25
|
+
* от нового к старому.
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
readonly _order: number;
|
|
29
|
+
/**
|
|
30
|
+
* Prototype-бренд для горячих проверок владельца: `true` только у RaphNode.
|
|
31
|
+
* Значение лежит на prototype и не занимает поле экземпляра.
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
readonly _isNode: boolean;
|
|
35
|
+
constructor(id: string, runtime: RaphRuntime);
|
|
36
|
+
/**
|
|
37
|
+
* Числовой id зарезервирован за ленивым id по умолчанию у RaphNode.
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
constructor(id: string | number, runtime: RaphRuntime);
|
|
41
|
+
/**
|
|
42
|
+
* Возвращает id владельца; plain scope всегда хранит явную строку.
|
|
43
|
+
*/
|
|
44
|
+
get id(): string;
|
|
45
|
+
/** Stable selector for process ordering; plain scopes are not tree nodes. */
|
|
46
|
+
get node(): RaphNode | undefined;
|
|
47
|
+
signal<T>(value: T): Signal<T>;
|
|
48
|
+
computed<T>(getter: () => T): ReadonlySignal<T>;
|
|
49
|
+
computed<T>(options: WritableComputedOptions<T>): Signal<T>;
|
|
50
|
+
/**
|
|
51
|
+
* Создаёт selector над записываемым signal: функцию `(key) => boolean`,
|
|
52
|
+
* которая отвечает, совпадает ли ключ с текущим значением `source`, и
|
|
53
|
+
* подписывает потребителя только на этот ключ. Запись в `source` будит
|
|
54
|
+
* потребителей прежнего и нового значения, а не всех читателей.
|
|
55
|
+
*
|
|
56
|
+
* Selector принадлежит этому владельцу и живёт до его освобождения; `source`
|
|
57
|
+
* должен принадлежать самому владельцу, его предку или root scope. Читать
|
|
58
|
+
* selector вправе те же потребители, что и signal этого владельца.
|
|
59
|
+
*
|
|
60
|
+
* @typeParam Key — тип ключа и значения `source`.
|
|
61
|
+
*/
|
|
62
|
+
selector<Key>(source: Signal<Key>, options?: RaphSelectorOptions<Key>): RaphSelector<Key>;
|
|
63
|
+
effect(phase: string, callback: RaphPhaseEffect, options?: RaphEffectOptions): Disposer;
|
|
64
|
+
/**
|
|
65
|
+
* Регистрирует phase effect без task и без disposer. Тело вызывается без
|
|
66
|
+
* аргументов, а binding живёт до освобождения этого владельца: отдельно его
|
|
67
|
+
* остановить нельзя. Зависимости, порядок, `initial`, `priority` и cleanup
|
|
68
|
+
* те же, что у `effect()`.
|
|
69
|
+
*
|
|
70
|
+
* Frozen task такого binding создаётся, только если его запросит `process`
|
|
71
|
+
* своей phase; на регистрацию приходится одна запись binding.
|
|
72
|
+
* Для тела, которому нужна task или отдельная остановка, остаётся `effect()`.
|
|
73
|
+
*/
|
|
74
|
+
bindEffect(phase: string, body: RaphPhaseBody, options?: RaphEffectOptions): void;
|
|
75
|
+
/**
|
|
76
|
+
* Регистрирует группу из `count` phase effects на одном binding: без task и
|
|
77
|
+
* без disposer, как `bindEffect()`. `runSlot(run)` — тело каждого slot: оно
|
|
78
|
+
* получает запуск, где `run[0]` — context группы, а `run[1]` — номер slot.
|
|
79
|
+
* Чтения внутри вызова отслеживаются отдельно для этого slot, поэтому
|
|
80
|
+
* изменение зависимости перезапускает только те slots, которые её читали.
|
|
81
|
+
*
|
|
82
|
+
* Группа — одна phase task и один ресурс владельца. Регистрация ничего не
|
|
83
|
+
* исполняет: каждый slot запускает `start(slot, initial?)` возвращённой
|
|
84
|
+
* группы, и с этого вызова slot ведёт себя как binding, который
|
|
85
|
+
* `bindEffect()` зарегистрировал бы в этом месте. Доставка исполняет
|
|
86
|
+
* запущенные slots, чьи зависимости изменились, в порядке их номеров; сбой
|
|
87
|
+
* одного slot не мешает остальным и сообщается отдельной ошибкой, как сбой
|
|
88
|
+
* отдельного binding. Причины всех slots складываются в `causes` одной task,
|
|
89
|
+
* которую custom `process` получает на всю группу. Cleanup, который вернул
|
|
90
|
+
* slot, выполняется перед его следующим запуском и при освобождении группы.
|
|
91
|
+
*
|
|
92
|
+
* Порядок `priority desc → FIFO` действует между tasks: группа занимает в
|
|
93
|
+
* очереди phase место своего первого изменившегося slot. Внутри task slots
|
|
94
|
+
* исполняются по номерам, а slot, который изменился, пока его группа
|
|
95
|
+
* доставляется, исполняется в этой же доставке, если до него ещё не дошла
|
|
96
|
+
* очередь. Slot, в источник которого записали, пока он ждал запуска в этой
|
|
97
|
+
* доставке, исполняется в ней один раз и читает новое значение; slot, чьи
|
|
98
|
+
* зависимости не изменились, тело не исполняет, даже если причина пришла
|
|
99
|
+
* группе из-за соседнего slot. После доставки, во время которой группе
|
|
100
|
+
* пришла причина, группа доставляется ещё раз с новыми причинами и
|
|
101
|
+
* исполняет только slots, изменившиеся после своего запуска; `cancel()`
|
|
102
|
+
* доставки, во время которой пришла причина, оставляет ждавшие slots
|
|
103
|
+
* запланированными.
|
|
104
|
+
*
|
|
105
|
+
* Группа живёт до освобождения этого владельца: отдельно её остановить
|
|
106
|
+
* нельзя. Владелец освобождает её после ресурсов, зарегистрированных позже,
|
|
107
|
+
* в том числе телами её slots; slots освобождаются в порядке, обратном
|
|
108
|
+
* порядку номеров. Несколько сбоев cleanup при освобождении группы приходят
|
|
109
|
+
* одним `AggregateError` с сообщением `[Raph] Effect group disposal failed.`
|
|
110
|
+
* как один сбой ресурса владельца; единственный сбой бросается как есть.
|
|
111
|
+
*
|
|
112
|
+
* @typeParam Context — значение, которое получает тело каждого slot.
|
|
113
|
+
* @param phase Имя объявленной phase.
|
|
114
|
+
* @param count Число slots: целое от 1 до 4294967293, иначе `RangeError`.
|
|
115
|
+
* @param runSlot Тело slot: получает запуск с `context` и номером slot.
|
|
116
|
+
* @param context Значение, которое группа передаёт телу каждого slot.
|
|
117
|
+
* @param options `priority` task группы, как у `effect()`.
|
|
118
|
+
*/
|
|
119
|
+
effectGroup<Context>(phase: string, count: number, runSlot: RaphEffectGroupSlot<Context>, context: Context, options?: RaphEffectGroupOptions): RaphEffectGroup;
|
|
120
|
+
watch(source: RaphWatchSource, phase: string, callback: RaphPhaseEffect, options?: RaphWatchOptions): Disposer;
|
|
121
|
+
/**
|
|
122
|
+
* Внутренняя регистрация renderer без возвращаемого disposer. Failure
|
|
123
|
+
* continuation относится только к завершившемуся execution request.
|
|
124
|
+
* @internal
|
|
125
|
+
*/
|
|
126
|
+
_registerEffect(phase: string, callback: RaphPhaseEffect, options: RaphEffectOptions, taskless: boolean, onExecutionFailure: (error: unknown) => never, isExecutionCancelled?: () => boolean): void;
|
|
127
|
+
/** @internal */
|
|
128
|
+
_registerWatch(source: RaphWatchSource, phase: string, callback: RaphPhaseEffect, options: RaphWatchOptions, onExecutionFailure: (error: unknown) => never, isExecutionCancelled?: () => boolean): void;
|
|
129
|
+
/**
|
|
130
|
+
* Выдаёт внутренний typed handle вместо приведения публичного group handle.
|
|
131
|
+
* Порядок создания и принятия ресурса совпадает с effectGroup().
|
|
132
|
+
* @internal
|
|
133
|
+
*/
|
|
134
|
+
_registerEffectGroup<Context>(phase: string, count: number, runSlot: RaphEffectGroupSlot<Context>, context: Context, options?: RaphEffectGroupOptions): ReturnType<RaphRuntime['_effectGroupRegistration']>;
|
|
135
|
+
aggregate(sources: readonly RaphAggregateSource[]): RaphAggregate;
|
|
136
|
+
action<Args extends unknown[], Result>(operation: (...args: Args) => Result): (...args: Args) => Result;
|
|
137
|
+
action<Args extends unknown[], Result>(name: string, operation: (...args: Args) => Result): (...args: Args) => Result;
|
|
138
|
+
own(disposer: Disposer): Disposer;
|
|
139
|
+
dispose(): void;
|
|
140
|
+
/** Node's super stage keeps the actual public base-method lookup observable. @internal */
|
|
141
|
+
_disposeScopeForOwner(dispose: Disposer): DisposalFailure | undefined;
|
|
142
|
+
/** One explicit framework disposal result; public dispose never leaks it. @internal */
|
|
143
|
+
_disposeWithOutcome(): DisposalFailure | undefined;
|
|
144
|
+
/** Framework capture registration; ordinary own callback semantics are unchanged. @internal */
|
|
145
|
+
_ownCompletedCleanup(cleanup: () => DisposalFailure | undefined): Disposer;
|
|
146
|
+
/** @internal */
|
|
147
|
+
_adoptResource(disposer: Disposer): Disposer;
|
|
148
|
+
/**
|
|
149
|
+
* Связывает готовую запись ресурса: запись сама становится элементом списка
|
|
150
|
+
* ресурсов этого владельца, без обёртки и closure, и освобождает себя через
|
|
151
|
+
* унаследованный _releaseRecord() из собственного dispose().
|
|
152
|
+
*
|
|
153
|
+
* @internal
|
|
154
|
+
*/
|
|
155
|
+
_adoptRecord(entry: OwnedResource): void;
|
|
156
|
+
/** @internal */
|
|
157
|
+
_adoptSource<T>(source: OwnedSource<T>): T;
|
|
158
|
+
/**
|
|
159
|
+
* Связывает готовую запись источника: источник сам становится элементом
|
|
160
|
+
* списка источников этого владельца, без обёртки и closure, и освобождает
|
|
161
|
+
* себя через собственный _finalizeSource().
|
|
162
|
+
*
|
|
163
|
+
* @internal
|
|
164
|
+
*/
|
|
165
|
+
_adoptSourceEntry(entry: OwnedSourceEntry): void;
|
|
166
|
+
/** @internal */
|
|
167
|
+
_assertAlive(): void;
|
|
168
|
+
}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { RaphScope } from '../ownership/RaphScope';
|
|
2
|
+
import { RuntimeReactivity } from '../reactivity/RuntimeReactivity';
|
|
3
|
+
import { RaphFrameContext, RaphPhase, RaphPhaseEffect, RaphSchedulerMode, RaphWorkCause } from './phase.types';
|
|
4
|
+
import { RaphPhaseTaskRecord } from './RaphPhaseTaskRecord';
|
|
5
|
+
/**
|
|
6
|
+
* Постоянное состояние одной phase: живая очередь, запасной массив для обмена
|
|
7
|
+
* при разборе и число bindings. Состояние переживает переопределение phases, пока
|
|
8
|
+
* имя phase сохраняется, поэтому запись binding держит прямую ссылку на него и
|
|
9
|
+
* ставится в очередь без поиска по имени. Через него же запись находит свой
|
|
10
|
+
* pipeline: отдельной ссылки на pipeline у записи нет.
|
|
11
|
+
*
|
|
12
|
+
* Инвариант: каждая запись живой очереди активна и ожидает доставки, а
|
|
13
|
+
* `spare` пуст вне разбора своей phase.
|
|
14
|
+
*/
|
|
15
|
+
export declare class RaphPhaseState {
|
|
16
|
+
readonly name: string;
|
|
17
|
+
readonly pipeline: RaphPhasePipeline;
|
|
18
|
+
queue: RaphPhaseTaskRecord[];
|
|
19
|
+
spare: RaphPhaseTaskRecord[];
|
|
20
|
+
bindings: number;
|
|
21
|
+
constructor(name: string, pipeline: RaphPhasePipeline);
|
|
22
|
+
}
|
|
23
|
+
/** Единая Runtime-owned очередь persistent phase bindings. */
|
|
24
|
+
export declare class RaphPhasePipeline {
|
|
25
|
+
private readonly _scheduler;
|
|
26
|
+
private readonly _reactivity;
|
|
27
|
+
private readonly _resolveCause;
|
|
28
|
+
private readonly _deferSync;
|
|
29
|
+
private readonly _tracePhase?;
|
|
30
|
+
private _phases;
|
|
31
|
+
private _phaseByName;
|
|
32
|
+
private _resolvedInput;
|
|
33
|
+
private _resolvedState;
|
|
34
|
+
private _queuedCount;
|
|
35
|
+
private readonly _deferred;
|
|
36
|
+
private readonly _idleWaiters;
|
|
37
|
+
private _taskSequence;
|
|
38
|
+
private _scheduled;
|
|
39
|
+
private _scheduleToken;
|
|
40
|
+
private _frameHandle;
|
|
41
|
+
private _frameHandleKind;
|
|
42
|
+
private _configurationLocked;
|
|
43
|
+
/**
|
|
44
|
+
* Flush исполняется сейчас: новая работа попадёт в его следующий проход.
|
|
45
|
+
*
|
|
46
|
+
* @internal
|
|
47
|
+
*/
|
|
48
|
+
_running: boolean;
|
|
49
|
+
private _idleSlotFlags;
|
|
50
|
+
private _disposed;
|
|
51
|
+
private _firstFrameAt;
|
|
52
|
+
private _lastFrameAt;
|
|
53
|
+
private _frameNumber;
|
|
54
|
+
private _frame;
|
|
55
|
+
constructor(_scheduler: RaphSchedulerMode, _reactivity: RuntimeReactivity, _resolveCause: (token: unknown) => RaphWorkCause | undefined, _deferSync?: () => boolean, _tracePhase?: ((phase: string, status: "end" | "error" | "start", error?: unknown) => void) | undefined);
|
|
56
|
+
get frame(): RaphFrameContext;
|
|
57
|
+
get phases(): readonly RaphPhase[];
|
|
58
|
+
definePhases(phases: readonly RaphPhase[]): void;
|
|
59
|
+
addPhase(phase: RaphPhase): void;
|
|
60
|
+
clearPhases(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Находит состояние объявленной phase по имени, которое передал вызывающий.
|
|
63
|
+
* Подряд идущие bindings одной phase попадают в кэш из одной записи; точное
|
|
64
|
+
* имя находится без `trim()`, и только имя с пробелами по краям нормализуется.
|
|
65
|
+
*/
|
|
66
|
+
resolvePhase(input: string): RaphPhaseState;
|
|
67
|
+
/**
|
|
68
|
+
* Создаёт постоянную запись одного binding. Вызывающий уже разрешил phase
|
|
69
|
+
* и проверил priority, поэтому горячий путь регистрации проверяет их один раз.
|
|
70
|
+
* Запись ничего не выполняет, пока вызывающий не подключит engine effect
|
|
71
|
+
* (`node`) или watch lifecycle (`watch`).
|
|
72
|
+
*/
|
|
73
|
+
bindTask(phase: RaphPhaseState, consumerOwner: RaphScope, effect: RaphPhaseEffect, priority: number): RaphPhaseTaskRecord;
|
|
74
|
+
/**
|
|
75
|
+
* Создаёт постоянную запись группы из `count` slots: одна запись binding и
|
|
76
|
+
* её состояние с местом под запись графа каждого slot. Вызывающий уже
|
|
77
|
+
* разрешил phase и проверил priority и `count`; записи графа он подключает
|
|
78
|
+
* сам через _allocateTaskEffect() и кладёт в состояние по порядку slots.
|
|
79
|
+
* Slot ничего не исполняет, пока его запись не запланирована.
|
|
80
|
+
*
|
|
81
|
+
* `runSlot` занимает место callback записи: его показывает `task.effect`
|
|
82
|
+
* группы, а вызывает только общее тело записей engine — с состоянием
|
|
83
|
+
* группы, где лежат её context и номер slot. Поэтому запись группы несёт
|
|
84
|
+
* `TASK_TASKLESS`: вместо task тело получает поле `group`.
|
|
85
|
+
*/
|
|
86
|
+
bindGroup(phase: RaphPhaseState, consumerOwner: RaphScope, runSlot: RaphPhaseEffect, context: unknown, count: number, priority: number): RaphPhaseTaskRecord;
|
|
87
|
+
request(): void;
|
|
88
|
+
afterFlush(): Promise<void>;
|
|
89
|
+
flush(): void;
|
|
90
|
+
dispose(): void;
|
|
91
|
+
_debugPending(): boolean;
|
|
92
|
+
private _describeQueued;
|
|
93
|
+
/**
|
|
94
|
+
* Открывает доставку одной записью `state`. Накопленные причины остаются на
|
|
95
|
+
* своих местах и становятся причинами доставки под TASK_CAUSES_DELIVERED:
|
|
96
|
+
* ничего не копируется, а массив для `task.causes` строится, только если его
|
|
97
|
+
* прочитают. Frame доставки получает только запись с facade: без facade его
|
|
98
|
+
* нечем прочитать, а запись ссылки на новый frame в каждую доставленную
|
|
99
|
+
* запись стоит write barrier.
|
|
100
|
+
*
|
|
101
|
+
* Запись попадает сюда только из живой очереди, а в ней нет записей с
|
|
102
|
+
* открытой доставкой, поэтому причин прошлой доставки здесь не бывает.
|
|
103
|
+
*/
|
|
104
|
+
private _beginDelivery;
|
|
105
|
+
/**
|
|
106
|
+
* Исполняет открытую доставку binding. `failures` передаёт default runner:
|
|
107
|
+
* группа складывает туда сбой каждого slot отдельно. Без него сбои slots
|
|
108
|
+
* бросаются вызывающему — `task.run()` внутри `process` — после прохода: один
|
|
109
|
+
* как есть, несколько одним AggregateError.
|
|
110
|
+
*
|
|
111
|
+
* @internal
|
|
112
|
+
*/
|
|
113
|
+
_runDelivery(record: RaphPhaseTaskRecord, failures?: unknown[]): void;
|
|
114
|
+
/** @internal */
|
|
115
|
+
_deferDelivery(record: RaphPhaseTaskRecord): void;
|
|
116
|
+
/** @internal */
|
|
117
|
+
_cancelDelivery(record: RaphPhaseTaskRecord): void;
|
|
118
|
+
private _finishDelivery;
|
|
119
|
+
/**
|
|
120
|
+
* Делает исполняемыми slots группы, которые остались запланированными после
|
|
121
|
+
* доставки: slot, изменивший собственную зависимость, и slot, чью зависимость
|
|
122
|
+
* изменили после его запуска. Slot, который не запланирован, не трогается:
|
|
123
|
+
* он уже прочитал актуальные значения и в следующей доставке не исполняется.
|
|
124
|
+
* Запись, сделанную до запуска slot в той же доставке, slot читает в ней же:
|
|
125
|
+
* прямую запись engine переводит в обязательный запуск, отложенную находит
|
|
126
|
+
* проверка зависимостей. Отдельный binding после такой записи исполняется
|
|
127
|
+
* ещё раз следующим проходом; slot повторно не исполняется.
|
|
128
|
+
*
|
|
129
|
+
* Запись без зависимостей пропускается. Запланированной она бывает в двух
|
|
130
|
+
* случаях: slot запущен во время доставки и ждёт первого запуска — тогда она
|
|
131
|
+
* исполняема с момента создания; либо повторно запущен slot, который уже
|
|
132
|
+
* исполнился и ничего не прочитал, — тогда исполнять его нечем.
|
|
133
|
+
*/
|
|
134
|
+
private _rearmGroup;
|
|
135
|
+
/** @internal */
|
|
136
|
+
_notifyTask(record: RaphPhaseTaskRecord, token: unknown): void;
|
|
137
|
+
/** @internal */
|
|
138
|
+
_appendCause(record: RaphPhaseTaskRecord, cause: RaphWorkCause, key: object): void;
|
|
139
|
+
/**
|
|
140
|
+
* Переносит причины открытой доставки с места ожидающих в detail, без
|
|
141
|
+
* копирования, и освобождает это место. После вызова запись хранит оба
|
|
142
|
+
* набора раздельно: ожидающие причины — в своих полях, причины доставки — в
|
|
143
|
+
* detail. Массив, уже построенный для `task.causes`, остаётся тем же.
|
|
144
|
+
*/
|
|
145
|
+
private _splitDeliveredCauses;
|
|
146
|
+
/** @internal */
|
|
147
|
+
_queue(record: RaphPhaseTaskRecord, schedule?: boolean): void;
|
|
148
|
+
/** @internal */
|
|
149
|
+
_disposeTask(record: RaphPhaseTaskRecord): void;
|
|
150
|
+
/**
|
|
151
|
+
* Полностью освобождает один binding; каждый шаг идемпотентен, поэтому
|
|
152
|
+
* владелец, engine и пользователь могут прийти сюда в любом порядке и
|
|
153
|
+
* повторно войти в метод.
|
|
154
|
+
*
|
|
155
|
+
* @internal
|
|
156
|
+
*/
|
|
157
|
+
_disposeBinding(record: RaphPhaseTaskRecord): void;
|
|
158
|
+
/**
|
|
159
|
+
* Убирает из состояния группы slots, записи графа которых уже остановлены, и
|
|
160
|
+
* сообщает, остались ли при этом живые slots.
|
|
161
|
+
*
|
|
162
|
+
* Запись одного slot останавливается отдельно от группы в трёх случаях: упал
|
|
163
|
+
* cleanup перед повторным запуском slot; перезапускается или останавливается
|
|
164
|
+
* effect, внутри тела которого группа зарегистрирована; провалился запуск
|
|
165
|
+
* slot через `start()`. Engine сообщает о каждой такой остановке через task
|
|
166
|
+
* hook, общий для всех slots, и запись в этот момент уже остановлена. Группа
|
|
167
|
+
* тогда теряет только этот slot, как owner потерял бы один из отдельных
|
|
168
|
+
* bindings; запись binding освобождается, когда остановлен последний slot.
|
|
169
|
+
*
|
|
170
|
+
* Вызов владельца или effect scope остановленных записей не находит: место
|
|
171
|
+
* остановленного slot уже занято `null`.
|
|
172
|
+
*
|
|
173
|
+
* @returns true, если вызов был сообщением engine и живые slots остались.
|
|
174
|
+
*/
|
|
175
|
+
private _forgetStoppedSlots;
|
|
176
|
+
/**
|
|
177
|
+
* Останавливает записи графа всех slots группы в порядке, обратном порядку
|
|
178
|
+
* slots: так владелец освобождал бы отдельные bindings. Сбой cleanup одного
|
|
179
|
+
* slot не мешает остановить остальные.
|
|
180
|
+
*
|
|
181
|
+
* Группа — один ресурс, поэтому порядок и вид ошибки не зависят от того, кто
|
|
182
|
+
* её освобождает. Effect scope отдельные bindings освободил бы в порядке
|
|
183
|
+
* регистрации и сложил бы их сбои в собственный список; группу он
|
|
184
|
+
* освобождает в обратном порядке slots и получает несколько сбоев одним
|
|
185
|
+
* AggregateError. Владелец получает тот же AggregateError как один сбой
|
|
186
|
+
* ресурса вместо отдельных сбоев bindings.
|
|
187
|
+
*
|
|
188
|
+
* Остановка первой же записи повторно входит в _disposeBinding() через task
|
|
189
|
+
* hook engine: вложенный вызов уже не находит состояния группы и освобождает
|
|
190
|
+
* состояние pipeline до cleanup slots. Группа без живых slots освобождает
|
|
191
|
+
* его здесь.
|
|
192
|
+
*/
|
|
193
|
+
private _disposeGroup;
|
|
194
|
+
/**
|
|
195
|
+
* Освобождает подписку и состояние pipeline остановленного watch.
|
|
196
|
+
*/
|
|
197
|
+
private _releaseWatch;
|
|
198
|
+
/** @internal */
|
|
199
|
+
_pauseTask(record: RaphPhaseTaskRecord): void;
|
|
200
|
+
/**
|
|
201
|
+
* Убирает ожидающую запись из живой очереди её phase. Запись, которую flush
|
|
202
|
+
* уже забрал на разбор, в живой очереди не находится и счётчик не меняет.
|
|
203
|
+
*/
|
|
204
|
+
private _unqueue;
|
|
205
|
+
/** @internal */
|
|
206
|
+
_resumeTask(record: RaphPhaseTaskRecord): void;
|
|
207
|
+
/**
|
|
208
|
+
* Возвращает причины открытой доставки в ожидающие, впереди причин, которые
|
|
209
|
+
* пришли после её открытия; причины одного source сливаются. Причины доставки
|
|
210
|
+
* при этом остаются причинами доставки до её конца, поэтому сначала они
|
|
211
|
+
* отделяются от ожидающих.
|
|
212
|
+
*/
|
|
213
|
+
private _restoreDeliveryCausesBeforePending;
|
|
214
|
+
private _schedule;
|
|
215
|
+
private _scheduleDeferredTurn;
|
|
216
|
+
private _cancelScheduled;
|
|
217
|
+
private _activateDeferred;
|
|
218
|
+
private _nextFrame;
|
|
219
|
+
private _assertRetainedPhases;
|
|
220
|
+
private _hasPending;
|
|
221
|
+
private _cancelAllQueued;
|
|
222
|
+
private _cancelAllDeferred;
|
|
223
|
+
private _acknowledgeDiscard;
|
|
224
|
+
/**
|
|
225
|
+
* Гасит ожидающую доставку slots группы.
|
|
226
|
+
*
|
|
227
|
+
* Slot, чей первый запуск ещё впереди, погасить нельзя: он не собрал
|
|
228
|
+
* зависимости, и после отмены его ничто не разбудит. Такой slot узнаётся по
|
|
229
|
+
* запланированной записи без единой зависимости: запись, которая уже
|
|
230
|
+
* исполнялась и ничего не прочитала, больше не планируется. Обычная отмена
|
|
231
|
+
* тогда не трогает ни один slot и возвращает false; fatal discard
|
|
232
|
+
* останавливает такие slots окончательно и гасит остальные.
|
|
233
|
+
*
|
|
234
|
+
* Обычная отмена отказывается только от того, что доставка знала при
|
|
235
|
+
* открытии. Причина, пришедшая группе после открытия доставки, означает
|
|
236
|
+
* запись, которую запланированный slot ещё не прочитал. Гашение снимает с
|
|
237
|
+
* записи slot и отметку планирования, и требование запуска, которое engine
|
|
238
|
+
* поставил при прямой записи, поэтому slots, ждавшие запуска, после гашения
|
|
239
|
+
* снова требуют его, как отдельный binding, отменённый при новой причине.
|
|
240
|
+
* Группа тогда доставляется ещё раз с новыми причинами. Fatal discard гасит
|
|
241
|
+
* всё.
|
|
242
|
+
*
|
|
243
|
+
* @returns false, если доставку нельзя отменить либо живых slots не осталось.
|
|
244
|
+
*/
|
|
245
|
+
private _cancelGroup;
|
|
246
|
+
/**
|
|
247
|
+
* Сбрасывает ожидающую работу записи, снятой с очереди либо из отложенных.
|
|
248
|
+
* Такая запись не находится в доставке, поэтому её причины ожидающие.
|
|
249
|
+
*/
|
|
250
|
+
private _clearPendingDelivery;
|
|
251
|
+
private _settleIdleWaiters;
|
|
252
|
+
private _assertAlive;
|
|
253
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { EffectTask, OwnedResource, ReactiveNode, ScopeChildren } from '../../reactivity/types';
|
|
2
|
+
import { RaphScope } from '../ownership/RaphScope';
|
|
3
|
+
import { RaphEffectGroup, RaphEffectInitialMode, RaphFrameContext, RaphPhaseEffect, RaphPhaseTask, RaphWorkCause } from './phase.types';
|
|
4
|
+
import { RaphPhaseState } from './RaphPhasePipeline';
|
|
5
|
+
import { RaphPhaseWatch } from './RaphPhaseWatch';
|
|
6
|
+
export declare const EMPTY_CAUSES: readonly RaphWorkCause[];
|
|
7
|
+
export declare const EMPTY_FRAME: RaphFrameContext;
|
|
8
|
+
export declare const TASK_ACTIVE = 1;
|
|
9
|
+
export declare const TASK_PAUSED: number;
|
|
10
|
+
export declare const TASK_PENDING: number;
|
|
11
|
+
export declare const TASK_DEFERRED: number;
|
|
12
|
+
export declare const TASK_IN_DELIVERY: number;
|
|
13
|
+
export declare const TASK_DISCARD_ACKNOWLEDGED: number;
|
|
14
|
+
export declare const TASK_REQUESTED: number;
|
|
15
|
+
export declare const TASK_EXECUTED: number;
|
|
16
|
+
export declare const TASK_CAUSES_DELIVERED: number;
|
|
17
|
+
export declare const TASK_RESOLUTION: number;
|
|
18
|
+
export declare const TASK_UNRESOLVED = 0;
|
|
19
|
+
export declare const TASK_RUN: number;
|
|
20
|
+
export declare const TASK_DEFER: number;
|
|
21
|
+
export declare const TASK_CANCEL: number;
|
|
22
|
+
export declare const TASK_TASKLESS: number;
|
|
23
|
+
/**
|
|
24
|
+
* Состояние группы effects одного binding: плоский массив
|
|
25
|
+
* `[context, номер исполняемого slot, запись графа slot 0, slot 1, ...]`.
|
|
26
|
+
*
|
|
27
|
+
* Группа делит одну запись binding между несколькими отслеживаемыми
|
|
28
|
+
* вычислениями. У каждого slot своя запись графа engine, то есть свой набор
|
|
29
|
+
* зависимостей и свой признак invalidation; общими остаются запись binding и
|
|
30
|
+
* её место в очереди phase и в списке ресурсов владельца. Тело записи engine
|
|
31
|
+
* у всех slots одно, поэтому номер slot доставка записывает сюда перед
|
|
32
|
+
* запуском каждого slot, а тело slot получает само состояние как свой
|
|
33
|
+
* единственный аргумент — запуск `RaphEffectGroupRun`: первые два элемента и
|
|
34
|
+
* есть его публичная часть.
|
|
35
|
+
*
|
|
36
|
+
* На месте записи slot, остановленного отдельно от группы, стоит `null`.
|
|
37
|
+
*
|
|
38
|
+
* Состояние — массив, а не class: на группу приходится одна аллокация точного
|
|
39
|
+
* размера, и у неё нет hidden class, который терялся бы, когда освобождена
|
|
40
|
+
* последняя группа.
|
|
41
|
+
*/
|
|
42
|
+
export type RaphEffectGroupState = unknown[];
|
|
43
|
+
export declare const GROUP_CONTEXT = 0;
|
|
44
|
+
export declare const GROUP_CURSOR = 1;
|
|
45
|
+
export declare const GROUP_NODES = 2;
|
|
46
|
+
/**
|
|
47
|
+
* Frozen public facade of one phase binding. All state stays on the record, so
|
|
48
|
+
* the facade has a single own field and shares its capabilities through the
|
|
49
|
+
* prototype: `run`, `defer` and `cancel` need the task as receiver.
|
|
50
|
+
*/
|
|
51
|
+
export declare class RaphPhaseTaskHandle implements RaphPhaseTask {
|
|
52
|
+
/** @internal */
|
|
53
|
+
readonly _record: RaphPhaseTaskRecord;
|
|
54
|
+
constructor(record: RaphPhaseTaskRecord);
|
|
55
|
+
get phase(): string;
|
|
56
|
+
get consumerOwner(): RaphScope;
|
|
57
|
+
get effect(): RaphPhaseEffect;
|
|
58
|
+
get causes(): readonly RaphWorkCause[];
|
|
59
|
+
get frame(): RaphFrameContext;
|
|
60
|
+
get priority(): number;
|
|
61
|
+
get sequence(): number;
|
|
62
|
+
run(): void;
|
|
63
|
+
defer(): void;
|
|
64
|
+
cancel(): void;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Редкое состояние одного phase binding, вынесенное из записи. Объект создаётся
|
|
68
|
+
* при первом входе binding в одно из таких состояний и живёт до освобождения
|
|
69
|
+
* записи:
|
|
70
|
+
*
|
|
71
|
+
* - до доставки накопились причины от второго source (`extraCauses`);
|
|
72
|
+
* - причины открытой доставки пришлось отделить от ожидающих: во время
|
|
73
|
+
* доставки пришла новая причина либо доставка отложена или остановлена
|
|
74
|
+
* pause (`deliveryFirstCause`, `deliveryFirstCauseKey`,
|
|
75
|
+
* `deliveryExtraCauses`);
|
|
76
|
+
* - причины доставки прочитаны через `task.causes` (`deliveryCauses`);
|
|
77
|
+
* - доставка отложена через `defer()` (`deferCount`).
|
|
78
|
+
*
|
|
79
|
+
* Binding, который исполняется и получает не больше одной причины на
|
|
80
|
+
* доставку, не читая `task.causes`, этого объекта не создаёт: ни effect с task
|
|
81
|
+
* или без неё, ни watch, ни группа.
|
|
82
|
+
*
|
|
83
|
+
* Поля объявлены без initializers и присваиваются в constructor в одном
|
|
84
|
+
* фиксированном порядке: у каждого экземпляра один hidden class.
|
|
85
|
+
*
|
|
86
|
+
* Engine удерживает форму экземпляров только через живые экземпляры. Когда в
|
|
87
|
+
* isolate не остаётся ни одного binding с редким состоянием, полная сборка
|
|
88
|
+
* мусора освобождает её вместе с кодом, оптимизированным под неё. Поэтому
|
|
89
|
+
* class владеет одним постоянным экземпляром `_shapeAnchor`.
|
|
90
|
+
*/
|
|
91
|
+
export declare class RaphPhaseTaskDetail {
|
|
92
|
+
static _shapeAnchor: RaphPhaseTaskDetail;
|
|
93
|
+
extraCauses: Map<object, RaphWorkCause> | undefined;
|
|
94
|
+
deliveryFirstCause: RaphWorkCause | undefined;
|
|
95
|
+
deliveryFirstCauseKey: object | undefined;
|
|
96
|
+
deliveryExtraCauses: Map<object, RaphWorkCause> | undefined;
|
|
97
|
+
deliveryCauses: readonly RaphWorkCause[] | undefined;
|
|
98
|
+
deferCount: number;
|
|
99
|
+
constructor();
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Постоянное состояние одного phase binding. Один и тот же объект является
|
|
103
|
+
* элементом очереди pipeline, внешней задачей engine effect, элементом списка
|
|
104
|
+
* ресурсов своего consumer owner и pausable-регистрацией, передаваемой effect
|
|
105
|
+
* scopes, поэтому binding стоит одной аллокации.
|
|
106
|
+
*
|
|
107
|
+
* Запись несёт только то, что нужно binding между регистрацией и освобождением
|
|
108
|
+
* на обычном пути: признаки одним числом, место в очереди, владельца, callback,
|
|
109
|
+
* запись графа, lifecycle watch либо состояние группы, связи списка ресурсов,
|
|
110
|
+
* первую причину и лениво создаваемый frozen facade с frame, который он
|
|
111
|
+
* показывает. Остальное — причины со второй, причины доставки, отделённые от
|
|
112
|
+
* ожидающих, показанный массив причин и счётчик defer — лежит в `detail`,
|
|
113
|
+
* который создаётся при первом входе в такое состояние. Pipeline запись
|
|
114
|
+
* находит через её phase: `phaseState.pipeline`.
|
|
115
|
+
*
|
|
116
|
+
* Поля объявлены без initializers и присваиваются в constructor в одном
|
|
117
|
+
* фиксированном порядке: у каждой записи один hidden class, и ни один build
|
|
118
|
+
* target не может превратить поля в вызовы helper.
|
|
119
|
+
*/
|
|
120
|
+
export declare class RaphPhaseTaskRecord implements EffectTask, OwnedResource, RaphEffectGroup {
|
|
121
|
+
state: number;
|
|
122
|
+
sequence: number;
|
|
123
|
+
readonly phaseState: RaphPhaseState;
|
|
124
|
+
readonly priority: number;
|
|
125
|
+
readonly consumerOwner: RaphScope;
|
|
126
|
+
readonly effect: RaphPhaseEffect;
|
|
127
|
+
node: ReactiveNode | undefined;
|
|
128
|
+
watch: RaphPhaseWatch | undefined;
|
|
129
|
+
group: RaphEffectGroupState | undefined;
|
|
130
|
+
scopeParent: ScopeChildren<OwnedResource> | undefined;
|
|
131
|
+
scopePrevious: OwnedResource | undefined;
|
|
132
|
+
scopeNext: OwnedResource | undefined;
|
|
133
|
+
firstCause: RaphWorkCause | undefined;
|
|
134
|
+
firstCauseKey: object | undefined;
|
|
135
|
+
frame: RaphFrameContext;
|
|
136
|
+
facade: RaphPhaseTaskHandle | undefined;
|
|
137
|
+
detail: RaphPhaseTaskDetail | undefined;
|
|
138
|
+
constructor(phaseState: RaphPhaseState, priority: number, consumerOwner: RaphScope, effect: RaphPhaseEffect);
|
|
139
|
+
get phase(): string;
|
|
140
|
+
get dependencyOwner(): RaphScope;
|
|
141
|
+
get allowScheduleDuringRun(): boolean;
|
|
142
|
+
/**
|
|
143
|
+
* Становится false, когда binding остановлен: так запись видят effect scopes,
|
|
144
|
+
* которым она передана как pausable-регистрация.
|
|
145
|
+
*/
|
|
146
|
+
get active(): boolean;
|
|
147
|
+
/**
|
|
148
|
+
* Причины текущей доставки в том виде, в каком их получает callback или
|
|
149
|
+
* `process`. Массив строится при первом чтении в доставке и до её конца
|
|
150
|
+
* остаётся тем же объектом; доставка, причины которой никто не прочитал, не
|
|
151
|
+
* создаёт ни массива, ни заморозки. Вне доставки и для доставки без причин
|
|
152
|
+
* это общий пустой массив.
|
|
153
|
+
*
|
|
154
|
+
* Это единственное место, где причины выходят наружу, поэтому здесь же они
|
|
155
|
+
* становятся неизменяемыми: WorkGraph создаёт причину без заморозки, а
|
|
156
|
+
* замораживает её первое чтение.
|
|
157
|
+
*/
|
|
158
|
+
get causes(): readonly RaphWorkCause[];
|
|
159
|
+
/**
|
|
160
|
+
* One facade per record: created on first exposure, then reused.
|
|
161
|
+
*
|
|
162
|
+
* Запись начинает вести frame с появлением facade. Facade создаётся внутри
|
|
163
|
+
* открытой доставки своей записи — его запрашивают только тело binding и
|
|
164
|
+
* `process` — и получает её frame; frame каждой следующей доставки
|
|
165
|
+
* записывает её открытие.
|
|
166
|
+
*/
|
|
167
|
+
get task(): RaphPhaseTask;
|
|
168
|
+
/** Возвращает редкое состояние записи и создаёт его при первом обращении. */
|
|
169
|
+
detailed(): RaphPhaseTaskDetail;
|
|
170
|
+
notify(token: unknown): void;
|
|
171
|
+
schedule(): void;
|
|
172
|
+
enqueue(cause: RaphWorkCause, key?: object, schedule?: boolean): void;
|
|
173
|
+
/**
|
|
174
|
+
* Запускает slot группы effects; у записи одиночного effect и watch ничего
|
|
175
|
+
* не делает. Запись группы сама является handle, который возвращает
|
|
176
|
+
* `effectGroup`.
|
|
177
|
+
*/
|
|
178
|
+
start(slot: number, initial?: RaphEffectInitialMode): void;
|
|
179
|
+
/**
|
|
180
|
+
* Внутренний initial invocation renderer; публичный start не меняет signature.
|
|
181
|
+
* Continuation не сохраняется в записи и не вызывается при последующих runs.
|
|
182
|
+
* @internal
|
|
183
|
+
*/
|
|
184
|
+
_start(slot: number, initial: RaphEffectInitialMode, onExecutionFailure: (error: unknown) => never): void;
|
|
185
|
+
pause(): void;
|
|
186
|
+
resume(): void;
|
|
187
|
+
/**
|
|
188
|
+
* Полностью освобождает binding; безопасен для повторного и вложенного вызова:
|
|
189
|
+
* снимает запись со списка владельца, останавливает engine effect или watch
|
|
190
|
+
* lifecycle и сбрасывает состояние pipeline. Engine вызывает его как task hook
|
|
191
|
+
* остановленного effect, владелец — как элемент списка ресурсов, а
|
|
192
|
+
* пользователь — через disposer.
|
|
193
|
+
*/
|
|
194
|
+
dispose(): void;
|
|
195
|
+
}
|