@raphy-js/raph 1.0.0-dev.2
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/LICENSE +202 -0
- package/ReadMe.md +153 -0
- package/dist/api/Raph.d.ts +228 -0
- package/dist/api/errors.d.ts +20 -0
- package/dist/api/public.d.ts +22 -0
- package/dist/api/types.d.ts +25 -0
- package/dist/debug/api/Raph.cjs +1 -0
- package/dist/debug/api/Raph.js +419 -0
- package/dist/debug/api/errors.cjs +1 -0
- package/dist/debug/api/errors.js +14 -0
- package/dist/debug/api/public.cjs +1 -0
- package/dist/debug/api/public.js +40 -0
- package/dist/debug/api/types.cjs +1 -0
- package/dist/debug/api/types.js +1 -0
- package/dist/debug/path/AdapterPathStore.cjs +1 -0
- package/dist/debug/path/AdapterPathStore.js +133 -0
- package/dist/debug/path/DerivedRegistry.cjs +1 -0
- package/dist/debug/path/DerivedRegistry.js +157 -0
- package/dist/debug/path/MetaController.cjs +1 -0
- package/dist/debug/path/MetaController.js +214 -0
- package/dist/debug/path/PathEventHub.cjs +1 -0
- package/dist/debug/path/PathEventHub.js +148 -0
- package/dist/debug/path/PathStore.cjs +1 -0
- package/dist/debug/path/PathStore.js +326 -0
- package/dist/debug/path/RaphDerivedHandle.cjs +1 -0
- package/dist/debug/path/RaphDerivedHandle.js +125 -0
- package/dist/debug/path/RaphKernel.cjs +1 -0
- package/dist/debug/path/RaphKernel.js +636 -0
- package/dist/debug/path/RaphMeta.cjs +1 -0
- package/dist/debug/path/RaphMeta.js +68 -0
- package/dist/debug/path/RaphMetaStore.cjs +1 -0
- package/dist/debug/path/RaphMetaStore.js +184 -0
- package/dist/debug/path/data-adapter.cjs +1 -0
- package/dist/debug/path/data-adapter.js +356 -0
- package/dist/debug/path/data-draft.cjs +1 -0
- package/dist/debug/path/data-draft.js +71 -0
- package/dist/debug/path/data-path.cjs +1 -0
- package/dist/debug/path/data-path.js +423 -0
- package/dist/debug/path/derived-collection.cjs +1 -0
- package/dist/debug/path/derived-collection.js +179 -0
- package/dist/debug/path/derived-strategies.cjs +1 -0
- package/dist/debug/path/derived-strategies.js +20 -0
- package/dist/debug/path/meta.types.cjs +1 -0
- package/dist/debug/path/meta.types.js +1 -0
- package/dist/debug/path/path-router.cjs +1 -0
- package/dist/debug/path/path-router.js +86 -0
- package/dist/debug/path/path.types.cjs +1 -0
- package/dist/debug/path/path.types.js +1 -0
- package/dist/debug/path/public.cjs +1 -0
- package/dist/debug/path/public.js +18 -0
- package/dist/debug/path/segment-key.cjs +1 -0
- package/dist/debug/path/segment-key.js +12 -0
- package/dist/debug/reactivity/engine.cjs +1 -0
- package/dist/debug/reactivity/engine.js +1133 -0
- package/dist/debug/reactivity/scope.cjs +1 -0
- package/dist/debug/reactivity/scope.js +274 -0
- package/dist/debug/reactivity/types.cjs +1 -0
- package/dist/debug/reactivity/types.js +1 -0
- package/dist/debug/reactivity/watch.cjs +1 -0
- package/dist/debug/reactivity/watch.js +64 -0
- package/dist/debug/runtime/PathHandle.cjs +1 -0
- package/dist/debug/runtime/PathHandle.js +139 -0
- package/dist/debug/runtime/RaphDebug.cjs +1 -0
- package/dist/debug/runtime/RaphDebug.js +15 -0
- package/dist/debug/runtime/RaphFrameLoop.cjs +1 -0
- package/dist/debug/runtime/RaphFrameLoop.js +106 -0
- package/dist/debug/runtime/RaphNode.cjs +1 -0
- package/dist/debug/runtime/RaphNode.js +143 -0
- package/dist/debug/runtime/RaphPhasePipeline.cjs +1 -0
- package/dist/debug/runtime/RaphPhasePipeline.js +526 -0
- package/dist/debug/runtime/RaphRuntime.cjs +1 -0
- package/dist/debug/runtime/RaphRuntime.js +700 -0
- package/dist/debug/runtime/RaphScope.cjs +1 -0
- package/dist/debug/runtime/RaphScope.js +64 -0
- package/dist/debug/runtime/RuntimeReactivity.cjs +1 -0
- package/dist/debug/runtime/RuntimeReactivity.js +154 -0
- package/dist/debug/runtime/RuntimeWatch.cjs +1 -0
- package/dist/debug/runtime/RuntimeWatch.js +71 -0
- package/dist/debug/runtime/disposal.cjs +1 -0
- package/dist/debug/runtime/disposal.js +9 -0
- package/dist/debug/runtime/errors.cjs +1 -0
- package/dist/debug/runtime/errors.js +12 -0
- package/dist/debug/runtime/parent-graph.cjs +1 -0
- package/dist/debug/runtime/parent-graph.js +10 -0
- package/dist/debug/runtime/phase.types.cjs +1 -0
- package/dist/debug/runtime/phase.types.js +8 -0
- package/dist/debug/runtime/public.cjs +1 -0
- package/dist/debug/runtime/public.js +18 -0
- package/dist/debug/runtime/runtime-reactivity.types.cjs +1 -0
- package/dist/debug/runtime/runtime-reactivity.types.js +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.js +40 -0
- package/dist/path/AdapterPathStore.d.ts +45 -0
- package/dist/path/DerivedRegistry.d.ts +67 -0
- package/dist/path/MetaController.d.ts +85 -0
- package/dist/path/PathEventHub.d.ts +48 -0
- package/dist/path/PathStore.d.ts +51 -0
- package/dist/path/RaphDerivedHandle.d.ts +97 -0
- package/dist/path/RaphKernel.d.ts +166 -0
- package/dist/path/RaphMeta.d.ts +45 -0
- package/dist/path/RaphMetaStore.d.ts +45 -0
- package/dist/path/data-adapter.d.ts +78 -0
- package/dist/path/data-draft.d.ts +4 -0
- package/dist/path/data-path.d.ts +97 -0
- package/dist/path/derived-collection.d.ts +30 -0
- package/dist/path/derived-strategies.d.ts +15 -0
- package/dist/path/meta.types.d.ts +33 -0
- package/dist/path/path-router.d.ts +21 -0
- package/dist/path/path.types.d.ts +26 -0
- package/dist/path/public.d.ts +14 -0
- package/dist/path/segment-key.d.ts +2 -0
- package/dist/path.cjs +1 -0
- package/dist/path.js +18 -0
- package/dist/raph.cjs +1 -0
- package/dist/raph.js +40 -0
- package/dist/reactivity/engine.d.ts +379 -0
- package/dist/reactivity/scope.d.ts +146 -0
- package/dist/reactivity/types.d.ts +150 -0
- package/dist/reactivity/watch.d.ts +15 -0
- package/dist/reactivity.cjs +1 -0
- package/dist/reactivity.js +14 -0
- package/dist/runtime/PathHandle.d.ts +72 -0
- package/dist/runtime/RaphDebug.d.ts +32 -0
- package/dist/runtime/RaphFrameLoop.d.ts +51 -0
- package/dist/runtime/RaphNode.d.ts +68 -0
- package/dist/runtime/RaphPhasePipeline.d.ts +133 -0
- package/dist/runtime/RaphRuntime.d.ts +285 -0
- package/dist/runtime/RaphScope.d.ts +50 -0
- package/dist/runtime/RuntimeReactivity.d.ts +40 -0
- package/dist/runtime/RuntimeWatch.d.ts +28 -0
- package/dist/runtime/disposal.d.ts +1 -0
- package/dist/runtime/errors.d.ts +16 -0
- package/dist/runtime/parent-graph.d.ts +5 -0
- package/dist/runtime/phase.types.d.ts +49 -0
- package/dist/runtime/public.d.ts +13 -0
- package/dist/runtime/runtime-reactivity.types.d.ts +9 -0
- package/dist/runtime.cjs +1 -0
- package/dist/runtime.js +18 -0
- package/package.json +109 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { RaphReactivity } from './engine';
|
|
2
|
+
import { Disposer, EffectCallback, OwnedResource, OwnedSource, ReadonlySignal, ScopeChildren, ScopeLink, Signal, SourceFinalizer, WatchCallback, WatchOptions, WatchSource, WritableComputedOptions } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Универсальный владелец ресурсов без фаз, путей и зависимости от Runtime.
|
|
5
|
+
* Хранит ресурсы в двусвязном списке и освобождает их в обратном порядке.
|
|
6
|
+
* Проверки lifetime выполняют только owned handles; свободные signal() не проходят
|
|
7
|
+
* через владельца. Класс не является узлом графа зависимостей.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ScopeNode {
|
|
10
|
+
readonly reactivity: RaphReactivity;
|
|
11
|
+
/**
|
|
12
|
+
* Первый зарегистрированный ресурс; не является ребёнком execution-дерева.
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
scopeFirstChild: OwnedResource | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Последний ресурс, с которого начинается освобождение владельца.
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
scopeLastChild: OwnedResource | undefined;
|
|
21
|
+
private _resourceCount;
|
|
22
|
+
private _sourceFinalizers;
|
|
23
|
+
protected _disposed: boolean;
|
|
24
|
+
protected _disposing: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Связывает владельца с реактивным экземпляром без создания нового графа.
|
|
27
|
+
* @param reactivity Экземпляр, в котором создаются owned-ресурсы.
|
|
28
|
+
*/
|
|
29
|
+
constructor(reactivity: RaphReactivity);
|
|
30
|
+
/**
|
|
31
|
+
* Показывает, началось ли окончательное освобождение владельца.
|
|
32
|
+
*/
|
|
33
|
+
get disposed(): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Разрешает регистрацию и доступ только до начала освобождения.
|
|
36
|
+
*/
|
|
37
|
+
get active(): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Создаёт owned signal и регистрирует его финализатор.
|
|
40
|
+
* Все методы возвращённого handle проверяют, что владелец ещё активен.
|
|
41
|
+
*/
|
|
42
|
+
signal<T>(value: T): Signal<T>;
|
|
43
|
+
/**
|
|
44
|
+
* Создаёт owned computed только для чтения.
|
|
45
|
+
*/
|
|
46
|
+
computed<T>(getter: () => T): ReadonlySignal<T>;
|
|
47
|
+
/**
|
|
48
|
+
* Создаёт owned writable computed с очисткой getter и setter.
|
|
49
|
+
*/
|
|
50
|
+
computed<T>(options: WritableComputedOptions<T>): Signal<T>;
|
|
51
|
+
/**
|
|
52
|
+
* Создаёт эффект и принимает его disposer во владение.
|
|
53
|
+
* Если владелец уничтожен во время синхронного запуска, немедленно останавливает эффект.
|
|
54
|
+
*/
|
|
55
|
+
effect(callback: EffectCallback): Disposer;
|
|
56
|
+
/**
|
|
57
|
+
* Создаёт watch и регистрирует окончательную остановку у владельца.
|
|
58
|
+
*/
|
|
59
|
+
watch<S extends WatchSource | readonly WatchSource[]>(source: S, callback: WatchCallback<S>, options?: WatchOptions): Disposer;
|
|
60
|
+
/**
|
|
61
|
+
* Принимает произвольный cleanup и возвращает однократный disposer.
|
|
62
|
+
* Если владелец уже неактивен, выполняет cleanup сразу и возвращает пустой disposer.
|
|
63
|
+
*/
|
|
64
|
+
own(disposer: Disposer): Disposer;
|
|
65
|
+
/**
|
|
66
|
+
* Возвращает число ещё не освобождённых записей ресурсов.
|
|
67
|
+
* @internal
|
|
68
|
+
*/
|
|
69
|
+
_debugResourceCount(): number;
|
|
70
|
+
/**
|
|
71
|
+
* Возвращает число зарегистрированных финализаторов источников.
|
|
72
|
+
* @internal
|
|
73
|
+
*/
|
|
74
|
+
_debugSourceCount(): number;
|
|
75
|
+
/**
|
|
76
|
+
* Освобождает ресурсы в обратном порядке, затем финализирует источники.
|
|
77
|
+
* Повторный вызов безопасен. Ошибки cleanup и завершающего hook собираются
|
|
78
|
+
* и передаются только после завершения остальных стадий.
|
|
79
|
+
*/
|
|
80
|
+
dispose(): void;
|
|
81
|
+
/**
|
|
82
|
+
* Регистрирует ресурс только у активного владельца.
|
|
83
|
+
* Дочерняя запись отсоединяется до вызова cleanup, включая ошибочный и вложенный stop.
|
|
84
|
+
* В отличие от own(), не принимает регистрацию после dispose.
|
|
85
|
+
* @internal
|
|
86
|
+
*/
|
|
87
|
+
_own(disposer: Disposer): Disposer;
|
|
88
|
+
/**
|
|
89
|
+
* Принимает уже созданный ресурс и не оставляет его без владельца при ошибке регистрации.
|
|
90
|
+
* При неудачной очистке сохраняет и ошибку регистрации, и ошибку освобождения.
|
|
91
|
+
* @internal
|
|
92
|
+
*/
|
|
93
|
+
_adoptResource(disposer: Disposer): Disposer;
|
|
94
|
+
/**
|
|
95
|
+
* Регистрирует финализатор owned-источника и возвращает его handle.
|
|
96
|
+
* Если владелец уже недоступен, освобождает источник до передачи ошибки.
|
|
97
|
+
* @internal
|
|
98
|
+
*/
|
|
99
|
+
_adoptSource<T>(owned: OwnedSource<T>): T;
|
|
100
|
+
/**
|
|
101
|
+
* Добавляет финализатор источника. Возвращённый им false означает повторную попытку
|
|
102
|
+
* после прогресса других финализаторов, а не успешное освобождение.
|
|
103
|
+
* @internal
|
|
104
|
+
*/
|
|
105
|
+
_ownSource(finalizer: SourceFinalizer): void;
|
|
106
|
+
/**
|
|
107
|
+
* Запрещает операции после начала освобождения владельца.
|
|
108
|
+
* Текст существующей ошибки сохранён для совместимости вызывающих слоёв.
|
|
109
|
+
* @internal
|
|
110
|
+
*/
|
|
111
|
+
_assertAlive(): void;
|
|
112
|
+
/**
|
|
113
|
+
* Завершающий hook для наследников после ресурсов и источников.
|
|
114
|
+
* Базовая реализация ничего не делает; исключение наследника попадёт в общий результат.
|
|
115
|
+
*/
|
|
116
|
+
protected _afterDispose(): void;
|
|
117
|
+
/**
|
|
118
|
+
* Возвращает сообщение для AggregateError при нескольких ошибках освобождения.
|
|
119
|
+
*/
|
|
120
|
+
protected _disposalMessage(): string;
|
|
121
|
+
/**
|
|
122
|
+
* Освобождает источники в обратном порядке регистрации с повторными попытками.
|
|
123
|
+
* Если в проходе не было прогресса, прекращает обход, сохраняя существующий контракт.
|
|
124
|
+
* Исключение одного финализатора не блокирует остальные.
|
|
125
|
+
*/
|
|
126
|
+
private _finalizeSources;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Добавляет дочерний ресурс в конец списка владельца без отдельной обёртки связей.
|
|
130
|
+
* Предусловие: ребёнок ещё не находится в другом списке. Переиспользуется
|
|
131
|
+
* ресурсами ScopeNode и записями вложенных эффектов.
|
|
132
|
+
* @internal
|
|
133
|
+
*/
|
|
134
|
+
export declare function appendScopeChild<T extends ScopeLink<T>>(parent: ScopeChildren<T>, child: T): void;
|
|
135
|
+
/**
|
|
136
|
+
* Отсоединяет ребёнка от владельца и обнуляет его связи со списком.
|
|
137
|
+
* Повторное отсоединение безопасно; пользовательский cleanup здесь не вызывается.
|
|
138
|
+
* @internal
|
|
139
|
+
*/
|
|
140
|
+
export declare function detachScopeChild<T extends ScopeLink<T>>(node: T): void;
|
|
141
|
+
/**
|
|
142
|
+
* Передаёт единственную ошибку без обёртки либо несколько причин в AggregateError.
|
|
143
|
+
* Пустой набор не вызывает исключения.
|
|
144
|
+
* @internal
|
|
145
|
+
*/
|
|
146
|
+
export declare function throwScopeErrors(errors: readonly unknown[], message: string): void;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
export type Disposer = () => void;
|
|
2
|
+
export interface ReadonlySignal<T> {
|
|
3
|
+
get: (this: ReadonlySignal<unknown>) => T;
|
|
4
|
+
peek: (this: ReadonlySignal<unknown>) => T;
|
|
5
|
+
}
|
|
6
|
+
export interface Signal<T> extends ReadonlySignal<T> {
|
|
7
|
+
set: (value: T) => void;
|
|
8
|
+
}
|
|
9
|
+
export interface WritableComputedOptions<T> {
|
|
10
|
+
readonly get: () => T;
|
|
11
|
+
readonly set: (value: T) => void;
|
|
12
|
+
}
|
|
13
|
+
export type EffectCallback = () => void | Disposer;
|
|
14
|
+
export interface EffectTask {
|
|
15
|
+
schedule: () => void;
|
|
16
|
+
dispose: Disposer;
|
|
17
|
+
}
|
|
18
|
+
export interface EffectScheduler {
|
|
19
|
+
bind: (run: () => void) => EffectTask;
|
|
20
|
+
}
|
|
21
|
+
export interface ReactivityOptions {
|
|
22
|
+
readonly effectScheduler?: EffectScheduler;
|
|
23
|
+
}
|
|
24
|
+
export type WatchSource<T = unknown> = ReadonlySignal<T> | (() => T);
|
|
25
|
+
export interface WatchOptions {
|
|
26
|
+
readonly immediate?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export type WatchValue<S> = S extends readonly unknown[] ? {
|
|
29
|
+
[K in keyof S]: S[K] extends WatchSource<infer V> ? V : never;
|
|
30
|
+
} : S extends WatchSource<infer V> ? V : never;
|
|
31
|
+
export type WatchCallback<S> = (value: WatchValue<S>, previous: WatchValue<S> | undefined) => void | Disposer;
|
|
32
|
+
export type EffectFactory = (callback: EffectCallback, onStop?: Disposer) => Disposer;
|
|
33
|
+
export type TrackedOperation = <T>(operation: () => T) => T;
|
|
34
|
+
/**
|
|
35
|
+
* Финализатор источника: true означает завершение, false — необходимость повторной
|
|
36
|
+
* попытки после освобождения зависимостей. Не является дублем Disposer.
|
|
37
|
+
* @internal
|
|
38
|
+
*/
|
|
39
|
+
export type SourceFinalizer = () => boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Запись произвольного ресурса в списке владельца.
|
|
42
|
+
* Функция dispose отсоединяет запись перед вызовом пользовательской очистки.
|
|
43
|
+
* @internal
|
|
44
|
+
*/
|
|
45
|
+
export interface OwnedResource extends ScopeLink<OwnedResource> {
|
|
46
|
+
dispose: Disposer;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Границы списка принадлежащих ресурсов. Не описывают граф зависимостей
|
|
50
|
+
* или дерево исполнения RaphNode.
|
|
51
|
+
* @internal
|
|
52
|
+
*/
|
|
53
|
+
export interface ScopeChildren<T> {
|
|
54
|
+
scopeFirstChild?: T;
|
|
55
|
+
scopeLastChild?: T;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Встроенные связи ресурса с владельцем и соседями списка.
|
|
59
|
+
* Не требуют отдельного ScopeNode для каждого эффекта.
|
|
60
|
+
* @internal
|
|
61
|
+
*/
|
|
62
|
+
export interface ScopeLink<T> {
|
|
63
|
+
scopeParent?: ScopeChildren<T>;
|
|
64
|
+
scopePrevious?: T;
|
|
65
|
+
scopeNext?: T;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Одна зависимость производителя и потребителя, одновременно включённая
|
|
69
|
+
* в список потребителей производителя и список зависимостей потребителя.
|
|
70
|
+
* @internal
|
|
71
|
+
*/
|
|
72
|
+
export interface ReactiveEdge {
|
|
73
|
+
dep: ReactiveNode;
|
|
74
|
+
sub: ReactiveNode;
|
|
75
|
+
prevSub: ReactiveEdge | null;
|
|
76
|
+
nextSub: ReactiveEdge | null;
|
|
77
|
+
prevDep: ReactiveEdge | null;
|
|
78
|
+
nextDep: ReactiveEdge | null;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Материализованная запись графа: signal, computed либо effect.
|
|
82
|
+
* Не наследует ScopeNode/RaphNode; поля scope используются только для вложенных эффектов.
|
|
83
|
+
* Гетерогенные значения графа намеренно имеют внутренний параметр any.
|
|
84
|
+
* @internal
|
|
85
|
+
*/
|
|
86
|
+
export interface ReactiveNode<T = any> extends ScopeChildren<ReactiveNode>, ScopeLink<ReactiveNode> {
|
|
87
|
+
flags: number;
|
|
88
|
+
firstSub: ReactiveEdge | null;
|
|
89
|
+
lastSub: ReactiveEdge | null;
|
|
90
|
+
firstDep: ReactiveEdge | null;
|
|
91
|
+
tailDep: ReactiveEdge | null;
|
|
92
|
+
depCount: number;
|
|
93
|
+
subSearchCursor?: ReactiveEdge;
|
|
94
|
+
evaluate: (() => any) | undefined;
|
|
95
|
+
cachedValue: T;
|
|
96
|
+
pendingValue?: T;
|
|
97
|
+
pendingAuthor?: ReactiveNode | null;
|
|
98
|
+
effectTask?: EffectTask;
|
|
99
|
+
onStop?: Disposer;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Низкоуровневые read/write для raw-дорожки Bench Lab.
|
|
103
|
+
* Публичный объектный API намеренно не использует этот контракт.
|
|
104
|
+
* @internal
|
|
105
|
+
*/
|
|
106
|
+
export interface SignalAccess<T> {
|
|
107
|
+
read: () => T;
|
|
108
|
+
write: (value: T) => void;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Низкоуровневый computed с требованием сохранить receiver первого чтения.
|
|
112
|
+
* @internal
|
|
113
|
+
*/
|
|
114
|
+
export interface ComputedAccess<T> {
|
|
115
|
+
read: (this: ComputedAccess<unknown>) => T;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Ленивый raw handle: до первого чтения поля ReactiveNode отсутствуют.
|
|
119
|
+
* Partial описывает стадию материализации, а не ослабляет контракт готового узла.
|
|
120
|
+
* @internal
|
|
121
|
+
*/
|
|
122
|
+
export interface ComputedAccessHandle<T> extends Partial<ReactiveNode<T>>, ComputedAccess<T> {
|
|
123
|
+
evaluate: (() => T) | undefined;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Ленивый объектный computed: графовые поля становятся обязательными
|
|
127
|
+
* только после initializeComputedHandle(). Отдельной записи графа не выделяет.
|
|
128
|
+
* @internal
|
|
129
|
+
*/
|
|
130
|
+
export interface ComputedSourceAccessHandle<T> extends Partial<ReactiveNode<T>>, ReadonlySignal<T> {
|
|
131
|
+
evaluate: (() => T) | undefined;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Handle источника вместе с независимым финализатором для владельца.
|
|
135
|
+
* @internal
|
|
136
|
+
*/
|
|
137
|
+
export interface OwnedSource<T> {
|
|
138
|
+
source: T;
|
|
139
|
+
dispose: SourceFinalizer;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Общие для одного графа адаптеры receiver его handles.
|
|
143
|
+
* Не хранят состояние алгоритмов: передают исходный handle методам движка.
|
|
144
|
+
* @internal
|
|
145
|
+
*/
|
|
146
|
+
export interface HandleReaders {
|
|
147
|
+
initializeComputed: <T>(this: ReadonlySignal<unknown>) => T;
|
|
148
|
+
initializeRaw: <T>(this: ComputedAccess<unknown>) => T;
|
|
149
|
+
peek: <T>(this: ReadonlySignal<unknown>) => T;
|
|
150
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Disposer, EffectFactory, TrackedOperation, WatchCallback, WatchOptions, WatchSource } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Создаёт watch поверх переданной фабрики эффектов и политики чтения.
|
|
4
|
+
* Фабрика обязана поддерживать второй аргумент onStop: он связывает окончательную
|
|
5
|
+
* очистку watch с остановкой эффекта родителем, scope или внешним disposer.
|
|
6
|
+
* Повторный запуск с равным результатом не вызывает cleanup callback.
|
|
7
|
+
* @param effect Фабрика с независимым финализатором окончательной остановки.
|
|
8
|
+
* @param untracked Выполняет callback и cleanup без сбора зависимостей.
|
|
9
|
+
* @param source Один источник либо список источников.
|
|
10
|
+
* @param callback Обрабатывает новое и предыдущее значения.
|
|
11
|
+
* @param options Настройки первоначального вызова.
|
|
12
|
+
* @param runTracked Оборачивает только чтение selector; используется Runtime.
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export declare function watchWithReactivity<S extends WatchSource | readonly WatchSource[]>(effect: EffectFactory, untracked: TrackedOperation, source: S, callback: WatchCallback<S>, options?: WatchOptions, runTracked?: TrackedOperation): Disposer;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./debug/reactivity/scope.cjs");require("./debug/reactivity/watch.cjs");const e=require("./debug/reactivity/engine.cjs");exports.ScopeNode=t.ScopeNode;exports.RaphReactivity=e.RaphReactivity;exports.batch=e.batch;exports.computed=e.computed;exports.effect=e.effect;exports.scope=e.scope;exports.signal=e.signal;exports.untracked=e.untracked;exports.watch=e.watch;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ScopeNode as c } from "./debug/reactivity/scope.js";
|
|
2
|
+
import "./debug/reactivity/watch.js";
|
|
3
|
+
import { RaphReactivity as a, batch as r, computed as f, effect as i, scope as m, signal as d, untracked as h, watch as n } from "./debug/reactivity/engine.js";
|
|
4
|
+
export {
|
|
5
|
+
a as RaphReactivity,
|
|
6
|
+
c as ScopeNode,
|
|
7
|
+
r as batch,
|
|
8
|
+
f as computed,
|
|
9
|
+
i as effect,
|
|
10
|
+
m as scope,
|
|
11
|
+
d as signal,
|
|
12
|
+
h as untracked,
|
|
13
|
+
n as watch
|
|
14
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { ParsedDataPath } from '../path/data-path';
|
|
2
|
+
import { PathOptions } from '../path/path.types';
|
|
3
|
+
import { RaphKernel } from '../path/RaphKernel';
|
|
4
|
+
import { RaphReactivity } from '../reactivity/engine';
|
|
5
|
+
import { ReadonlySignal } from '../reactivity/types';
|
|
6
|
+
type PathSignalEngine = Pick<RaphReactivity, '_isTracking' | '_ownedSignal'>;
|
|
7
|
+
/**
|
|
8
|
+
* Реактивный handle одного canonical path в default E2 data-plane.
|
|
9
|
+
*/
|
|
10
|
+
export declare class PathHandle<T> implements ReadonlySignal<T | undefined> {
|
|
11
|
+
readonly path: string;
|
|
12
|
+
readonly options: PathOptions;
|
|
13
|
+
private _revision;
|
|
14
|
+
private _disposeRevision;
|
|
15
|
+
private _isTracking;
|
|
16
|
+
private _store;
|
|
17
|
+
private _release;
|
|
18
|
+
private readonly _masks;
|
|
19
|
+
private _assertOwnerAlive;
|
|
20
|
+
private _assertTrackedRead;
|
|
21
|
+
private _assertWriteAllowed;
|
|
22
|
+
private _runWrite;
|
|
23
|
+
private _stop;
|
|
24
|
+
private _disposed;
|
|
25
|
+
/**
|
|
26
|
+
* Создаёт internal path handle и связывает его с runtime lifecycle.
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
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);
|
|
30
|
+
/**
|
|
31
|
+
* Показывает, освобождён ли path handle.
|
|
32
|
+
*/
|
|
33
|
+
get disposed(): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Читает path с регистрацией реактивной зависимости.
|
|
36
|
+
*/
|
|
37
|
+
get(): T | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Читает path без регистрации реактивной зависимости.
|
|
40
|
+
*/
|
|
41
|
+
peek(): T | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Записывает значение path через runtime write policy.
|
|
44
|
+
*/
|
|
45
|
+
set(value: T): void;
|
|
46
|
+
/**
|
|
47
|
+
* Объединяет значение path через runtime write policy.
|
|
48
|
+
*/
|
|
49
|
+
merge(value: Partial<T>): void;
|
|
50
|
+
/**
|
|
51
|
+
* Удаляет значение path через runtime write policy.
|
|
52
|
+
*/
|
|
53
|
+
delete(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Проверяет наличие значения path.
|
|
56
|
+
*/
|
|
57
|
+
has(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Отсоединяет Kernel subscription и освобождает reactive revision handle.
|
|
60
|
+
*/
|
|
61
|
+
dispose(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Читает path с регистрацией runtime reactive dependency.
|
|
64
|
+
* @internal
|
|
65
|
+
*/
|
|
66
|
+
_getTracked(): T | undefined;
|
|
67
|
+
private _readTracked;
|
|
68
|
+
private _observe;
|
|
69
|
+
private _write;
|
|
70
|
+
private _assertAlive;
|
|
71
|
+
}
|
|
72
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { RaphScope } from './RaphScope';
|
|
2
|
+
export interface RaphDebugOwnerSnapshot {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly kind: 'scope' | 'node';
|
|
5
|
+
readonly disposed: boolean;
|
|
6
|
+
readonly resources: number;
|
|
7
|
+
readonly sources: number;
|
|
8
|
+
readonly children: readonly RaphDebugOwnerSnapshot[];
|
|
9
|
+
}
|
|
10
|
+
export interface RaphDebugFrameLoopSnapshot {
|
|
11
|
+
readonly running: boolean;
|
|
12
|
+
readonly manual: boolean;
|
|
13
|
+
readonly leases: number;
|
|
14
|
+
}
|
|
15
|
+
export interface RaphDebugSnapshot {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly disposed: boolean;
|
|
18
|
+
readonly pending: boolean;
|
|
19
|
+
readonly transactionDepth: number;
|
|
20
|
+
readonly kernelTransactionDepth: number;
|
|
21
|
+
readonly owners: number;
|
|
22
|
+
readonly pathHandles: number;
|
|
23
|
+
readonly rootScope: RaphDebugOwnerSnapshot;
|
|
24
|
+
readonly scopes: readonly RaphDebugOwnerSnapshot[];
|
|
25
|
+
readonly root: RaphDebugOwnerSnapshot;
|
|
26
|
+
readonly frameLoop: RaphDebugFrameLoopSnapshot;
|
|
27
|
+
}
|
|
28
|
+
export interface RaphRuntimeDebug {
|
|
29
|
+
snapshot: () => RaphDebugSnapshot;
|
|
30
|
+
getTree: () => RaphDebugOwnerSnapshot;
|
|
31
|
+
}
|
|
32
|
+
export declare function createOwnerSnapshot(owner: RaphScope): RaphDebugOwnerSnapshot;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { FrameLoopLease } from './phase.types';
|
|
2
|
+
/**
|
|
3
|
+
* Ленивые frame callbacks не запускаются обычной реактивной работой.
|
|
4
|
+
*/
|
|
5
|
+
export declare class RaphFrameLoop {
|
|
6
|
+
private readonly _tick;
|
|
7
|
+
private readonly _leases;
|
|
8
|
+
private _frameHandle;
|
|
9
|
+
private _frameHandleKind;
|
|
10
|
+
private _scheduleToken;
|
|
11
|
+
private _running;
|
|
12
|
+
private _manual;
|
|
13
|
+
/**
|
|
14
|
+
* Создаёт frame-loop, который запрашивает выполнение runtime pipeline.
|
|
15
|
+
*/
|
|
16
|
+
constructor(_tick: () => void);
|
|
17
|
+
/**
|
|
18
|
+
* Показывает, выполняется ли автоматический frame-loop.
|
|
19
|
+
*/
|
|
20
|
+
get running(): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Получает lease, удерживающий автоматический frame-loop активным.
|
|
23
|
+
*/
|
|
24
|
+
acquire(owner: string): FrameLoopLease;
|
|
25
|
+
/**
|
|
26
|
+
* Запускает manual lease frame-loop.
|
|
27
|
+
*/
|
|
28
|
+
start(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Останавливает manual lease, не затрагивая внешние leases.
|
|
31
|
+
*/
|
|
32
|
+
stop(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Снимает все leases и отменяет запланированный frame callback.
|
|
35
|
+
*/
|
|
36
|
+
dispose(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Возвращает внутреннее состояние frame-loop для диагностики.
|
|
39
|
+
* @internal
|
|
40
|
+
*/
|
|
41
|
+
_debugState(): {
|
|
42
|
+
running: boolean;
|
|
43
|
+
manual: boolean;
|
|
44
|
+
leases: number;
|
|
45
|
+
};
|
|
46
|
+
private _onFrame;
|
|
47
|
+
private _ensureRunning;
|
|
48
|
+
private _schedule;
|
|
49
|
+
private _reconcile;
|
|
50
|
+
private _stop;
|
|
51
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { DataPathDef } from '../path/path.types';
|
|
2
|
+
import { Disposer } from '../reactivity/types';
|
|
3
|
+
import { RaphObserveDataOptions, RaphTrackOptions } from './phase.types';
|
|
4
|
+
import { RaphRuntime } from './RaphRuntime';
|
|
5
|
+
import { RaphScope } from './RaphScope';
|
|
6
|
+
export interface NodeOptions {
|
|
7
|
+
readonly id?: string;
|
|
8
|
+
readonly priority?: number;
|
|
9
|
+
readonly parent?: RaphNode;
|
|
10
|
+
readonly meta?: Readonly<Record<string, unknown>>;
|
|
11
|
+
readonly type?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Scope с явным parent/children lifecycle.
|
|
15
|
+
*/
|
|
16
|
+
export declare class RaphNode<TApi = unknown> extends RaphScope {
|
|
17
|
+
priority: number;
|
|
18
|
+
private _parent;
|
|
19
|
+
private readonly _children;
|
|
20
|
+
readonly api: Readonly<TApi>;
|
|
21
|
+
meta: Record<string, unknown>;
|
|
22
|
+
type: string;
|
|
23
|
+
/**
|
|
24
|
+
* Создаёт node внутри ownership tree указанного runtime.
|
|
25
|
+
*/
|
|
26
|
+
constructor(parent: RaphNode | RaphRuntime | null, options?: Omit<NodeOptions, 'parent'>, runtime?: RaphRuntime);
|
|
27
|
+
/**
|
|
28
|
+
* Возвращает текущего родителя node либо null для root.
|
|
29
|
+
*/
|
|
30
|
+
get parent(): RaphNode | null;
|
|
31
|
+
/**
|
|
32
|
+
* Возвращает снимок непосредственных дочерних nodes.
|
|
33
|
+
*/
|
|
34
|
+
get children(): readonly RaphNode[];
|
|
35
|
+
/**
|
|
36
|
+
* Перемещает node внутри ownership tree одного Runtime.
|
|
37
|
+
*/
|
|
38
|
+
addChild(node: RaphNode): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Обновляет изменяемые priority, meta и type node.
|
|
41
|
+
*/
|
|
42
|
+
options(options: Pick<NodeOptions, 'meta' | 'priority' | 'type'>): void;
|
|
43
|
+
/**
|
|
44
|
+
* Показывает, ожидает ли node выполнения.
|
|
45
|
+
*/
|
|
46
|
+
dirty(phase: string): void;
|
|
47
|
+
/**
|
|
48
|
+
* Отсоединяет node от ownership tree с заданной lifecycle-семантикой.
|
|
49
|
+
*/
|
|
50
|
+
remove(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Освобождает node вместе с дочерними owners и registrations.
|
|
53
|
+
*/
|
|
54
|
+
dispose(): void;
|
|
55
|
+
/**
|
|
56
|
+
* Регистрирует path observer в phase pipeline.
|
|
57
|
+
*/
|
|
58
|
+
observeData(masks: DataPathDef | readonly DataPathDef[], options: RaphObserveDataOptions): Disposer;
|
|
59
|
+
/**
|
|
60
|
+
* Регистрирует tracked executor указанной phase.
|
|
61
|
+
*/
|
|
62
|
+
track(masks: DataPathDef | readonly DataPathDef[], options?: RaphTrackOptions): Disposer;
|
|
63
|
+
/**
|
|
64
|
+
* Однократно устанавливает immutable API, принадлежащий node.
|
|
65
|
+
* @internal
|
|
66
|
+
*/
|
|
67
|
+
_setApi(api: TApi): void;
|
|
68
|
+
}
|