reactronic 0.93.25026 → 0.94.25027
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 +32 -32
- package/build/dist/source/Enums.d.ts +32 -0
- package/build/dist/source/Enums.js +37 -0
- package/build/dist/source/OperationEx.d.ts +7 -0
- package/build/dist/source/{ReactiveLoop.js → OperationEx.js} +8 -8
- package/build/dist/source/Options.d.ts +7 -27
- package/build/dist/source/Options.js +0 -24
- package/build/dist/source/Pipe.d.ts +2 -2
- package/build/dist/source/Pipe.js +2 -2
- package/build/dist/source/Ref.js +1 -1
- package/build/dist/source/{ReactiveSystem.d.ts → System.d.ts} +9 -10
- package/build/dist/source/{ReactiveSystem.js → System.js} +20 -15
- package/build/dist/source/api.d.ts +12 -10
- package/build/dist/source/api.js +10 -8
- package/build/dist/source/core/Changeset.d.ts +8 -7
- package/build/dist/source/core/Changeset.js +18 -18
- package/build/dist/source/core/Data.d.ts +6 -6
- package/build/dist/source/core/Data.js +2 -2
- package/build/dist/source/core/Indicator.d.ts +2 -2
- package/build/dist/source/core/Indicator.js +3 -3
- package/build/dist/source/core/Journal.d.ts +2 -2
- package/build/dist/source/core/Journal.js +7 -7
- package/build/dist/source/core/Meta.d.ts +1 -1
- package/build/dist/source/core/Meta.js +1 -1
- package/build/dist/source/core/Mvcc.d.ts +17 -16
- package/build/dist/source/core/Mvcc.js +30 -30
- package/build/dist/source/core/MvccArray.d.ts +3 -3
- package/build/dist/source/core/MvccArray.js +4 -4
- package/build/dist/source/core/MvccMap.d.ts +3 -3
- package/build/dist/source/core/MvccMap.js +4 -4
- package/build/dist/source/core/MvccMergeList.d.ts +2 -2
- package/build/dist/source/core/MvccMergeList.js +2 -2
- package/build/dist/source/core/Operation.d.ts +25 -25
- package/build/dist/source/core/Operation.js +205 -205
- package/build/dist/source/core/Transaction.d.ts +3 -3
- package/build/dist/source/core/Transaction.js +72 -72
- package/build/dist/source/core/Tree.d.ts +26 -0
- package/build/dist/source/core/Tree.js +120 -0
- package/build/dist/source/core/TreeNode.d.ts +117 -0
- package/build/dist/source/core/{ReactiveNode.js → TreeNode.js} +49 -177
- package/package.json +1 -1
- package/build/dist/source/ReactiveLoop.d.ts +0 -7
- package/build/dist/source/core/ReactiveNode.d.ts +0 -107
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { F } from "../util/Utils.js";
|
|
2
2
|
import { Worker } from "../Worker.js";
|
|
3
3
|
import { SnapshotOptions } from "../Options.js";
|
|
4
|
-
import { ObjectHandle, ObjectVersion,
|
|
4
|
+
import { ObjectHandle, ObjectVersion, OperationFootprint, ContentFootprint, FieldKey } from "./Data.js";
|
|
5
5
|
import { Changeset } from "./Changeset.js";
|
|
6
6
|
export declare abstract class Transaction implements Worker {
|
|
7
7
|
static get current(): Transaction;
|
|
@@ -78,13 +78,13 @@ export declare class TransactionImpl extends Transaction {
|
|
|
78
78
|
private checkForConflicts;
|
|
79
79
|
private tryResolveConflicts;
|
|
80
80
|
private applyOrDiscard;
|
|
81
|
-
applyOrDiscardChangeset(): Array<
|
|
81
|
+
applyOrDiscardChangeset(): Array<OperationFootprint>;
|
|
82
82
|
applyObjectChanges(h: ObjectHandle, ov: ObjectVersion): void;
|
|
83
83
|
static migrateObjectChangesToAnotherTransaction(h: ObjectHandle, ov: ObjectVersion, tParent: Transaction): void;
|
|
84
84
|
static migrateFieldVersionToAnotherTransaction(h: ObjectHandle, fk: FieldKey, ov: ObjectVersion, ovParent: ObjectVersion, tParent: Transaction): void;
|
|
85
85
|
private acquirePromise;
|
|
86
86
|
private static getCurrentChangeset;
|
|
87
87
|
private static getEditableChangeset;
|
|
88
|
-
static
|
|
88
|
+
static migrateContentFootprint: (fv: ContentFootprint, target: Transaction) => ContentFootprint;
|
|
89
89
|
static _init(): void;
|
|
90
90
|
}
|
|
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
};
|
|
10
10
|
import { UNDEF, pause } from "../util/Utils.js";
|
|
11
11
|
import { Log, misuse, error, fatal } from "../util/Dbg.js";
|
|
12
|
-
import { Isolation } from "../
|
|
12
|
+
import { Isolation } from "../Enums.js";
|
|
13
13
|
import { Meta } from "./Data.js";
|
|
14
14
|
import { Changeset, Dump, EMPTY_OBJECT_VERSION, UNDEFINED_REVISION } from "./Changeset.js";
|
|
15
15
|
export class Transaction {
|
|
@@ -354,73 +354,73 @@ export class TransactionImpl extends Transaction {
|
|
|
354
354
|
}
|
|
355
355
|
static migrateFieldVersionToAnotherTransaction(h, fk, ov, ovParent, tParent) {
|
|
356
356
|
const csParent = tParent.changeset;
|
|
357
|
-
const
|
|
358
|
-
const
|
|
359
|
-
if (
|
|
360
|
-
const migrated = TransactionImpl.
|
|
361
|
-
if (ovParent.former.objectVersion.data[fk] !==
|
|
362
|
-
let
|
|
363
|
-
if (
|
|
364
|
-
const
|
|
365
|
-
|
|
366
|
-
const
|
|
367
|
-
const sub =
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
357
|
+
const cf = ov.data[fk];
|
|
358
|
+
const cfParent = ovParent.data[fk];
|
|
359
|
+
if (cf.isComputed) {
|
|
360
|
+
const migrated = TransactionImpl.migrateContentFootprint(cf, tParent);
|
|
361
|
+
if (ovParent.former.objectVersion.data[fk] !== cfParent) {
|
|
362
|
+
let subscribers = cfParent.subscribers;
|
|
363
|
+
if (subscribers) {
|
|
364
|
+
const migratedSubscribers = migrated.subscribers = new Set();
|
|
365
|
+
subscribers.forEach(o => {
|
|
366
|
+
const conformingObservables = o.observables;
|
|
367
|
+
const sub = conformingObservables.get(cfParent);
|
|
368
|
+
conformingObservables.delete(cfParent);
|
|
369
|
+
conformingObservables.set(migrated, sub);
|
|
370
|
+
migratedSubscribers.add(o);
|
|
371
371
|
});
|
|
372
|
-
|
|
372
|
+
cfParent.subscribers = undefined;
|
|
373
373
|
}
|
|
374
|
-
|
|
375
|
-
if (
|
|
376
|
-
let
|
|
377
|
-
if (
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
const
|
|
381
|
-
const sub =
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
374
|
+
subscribers = cf.subscribers;
|
|
375
|
+
if (subscribers) {
|
|
376
|
+
let migratedSubscribers = migrated.subscribers;
|
|
377
|
+
if (migratedSubscribers === undefined)
|
|
378
|
+
migratedSubscribers = migrated.subscribers = new Set();
|
|
379
|
+
subscribers.forEach(o => {
|
|
380
|
+
const conformingObservables = o.observables;
|
|
381
|
+
const sub = conformingObservables.get(cf);
|
|
382
|
+
conformingObservables.delete(cf);
|
|
383
|
+
conformingObservables.set(migrated, sub);
|
|
384
|
+
migratedSubscribers.add(o);
|
|
385
385
|
});
|
|
386
|
-
|
|
386
|
+
cf.subscribers = undefined;
|
|
387
387
|
}
|
|
388
|
-
const
|
|
389
|
-
const
|
|
390
|
-
if (
|
|
391
|
-
|
|
392
|
-
const
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
388
|
+
const observables = cf.observables;
|
|
389
|
+
const migratedObservables = migrated.observables;
|
|
390
|
+
if (observables) {
|
|
391
|
+
observables.forEach((s, o) => {
|
|
392
|
+
const conformingSubscribers = o.subscribers;
|
|
393
|
+
conformingSubscribers.delete(cf);
|
|
394
|
+
conformingSubscribers.add(migrated);
|
|
395
|
+
migratedObservables.set(o, s);
|
|
396
396
|
});
|
|
397
|
-
|
|
397
|
+
observables.clear();
|
|
398
398
|
}
|
|
399
399
|
ovParent.data[fk] = migrated;
|
|
400
400
|
}
|
|
401
401
|
else {
|
|
402
|
-
const
|
|
403
|
-
if (
|
|
404
|
-
const migratedReactions = migrated.
|
|
405
|
-
|
|
406
|
-
const
|
|
407
|
-
const sub =
|
|
408
|
-
|
|
409
|
-
|
|
402
|
+
const subscribers = cf.subscribers;
|
|
403
|
+
if (subscribers) {
|
|
404
|
+
const migratedReactions = migrated.subscribers = new Set();
|
|
405
|
+
subscribers.forEach(o => {
|
|
406
|
+
const conformingObservables = o.observables;
|
|
407
|
+
const sub = conformingObservables.get(cf);
|
|
408
|
+
conformingObservables.delete(cf);
|
|
409
|
+
conformingObservables.set(migrated, sub);
|
|
410
410
|
migratedReactions.add(o);
|
|
411
411
|
});
|
|
412
|
-
|
|
412
|
+
cf.subscribers = undefined;
|
|
413
413
|
}
|
|
414
|
-
const
|
|
415
|
-
const
|
|
416
|
-
if (
|
|
417
|
-
|
|
418
|
-
const
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
414
|
+
const observables = cf.observables;
|
|
415
|
+
const migratedObservables = migrated.observables;
|
|
416
|
+
if (observables) {
|
|
417
|
+
observables.forEach((s, o) => {
|
|
418
|
+
const conformingSubscribers = o.subscribers;
|
|
419
|
+
conformingSubscribers.delete(cf);
|
|
420
|
+
conformingSubscribers.add(migrated);
|
|
421
|
+
migratedObservables.set(o, s);
|
|
422
422
|
});
|
|
423
|
-
|
|
423
|
+
observables.clear();
|
|
424
424
|
}
|
|
425
425
|
ovParent.data[fk] = migrated;
|
|
426
426
|
}
|
|
@@ -428,25 +428,25 @@ export class TransactionImpl extends Transaction {
|
|
|
428
428
|
Changeset.markEdited(undefined, migrated, true, ovParent, fk, h);
|
|
429
429
|
}
|
|
430
430
|
else {
|
|
431
|
-
const parentContent =
|
|
432
|
-
if (ovParent.former.objectVersion.data[fk] !==
|
|
433
|
-
|
|
434
|
-
const
|
|
435
|
-
if (
|
|
436
|
-
if (
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
const
|
|
440
|
-
const sub =
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
431
|
+
const parentContent = cfParent === null || cfParent === void 0 ? void 0 : cfParent.content;
|
|
432
|
+
if (ovParent.former.objectVersion.data[fk] !== cfParent) {
|
|
433
|
+
cfParent.content = cf.content;
|
|
434
|
+
const subscribers = cf.subscribers;
|
|
435
|
+
if (subscribers) {
|
|
436
|
+
if (cfParent.subscribers === undefined)
|
|
437
|
+
cfParent.subscribers = new Set();
|
|
438
|
+
subscribers.forEach(o => {
|
|
439
|
+
const conformingObservables = o.observables;
|
|
440
|
+
const sub = conformingObservables.get(cf);
|
|
441
|
+
conformingObservables.delete(cf);
|
|
442
|
+
conformingObservables.set(cfParent, sub);
|
|
443
|
+
cfParent.subscribers.add(o);
|
|
444
444
|
});
|
|
445
445
|
}
|
|
446
446
|
}
|
|
447
447
|
else
|
|
448
|
-
ovParent.data[fk] =
|
|
449
|
-
Changeset.markEdited(parentContent,
|
|
448
|
+
ovParent.data[fk] = cf;
|
|
449
|
+
Changeset.markEdited(parentContent, cf.content, true, ovParent, fk, h);
|
|
450
450
|
}
|
|
451
451
|
}
|
|
452
452
|
acquirePromise() {
|
|
@@ -479,7 +479,7 @@ TransactionImpl.gCurr = TransactionImpl.none;
|
|
|
479
479
|
TransactionImpl.isInspectionMode = false;
|
|
480
480
|
TransactionImpl.frameStartTime = 0;
|
|
481
481
|
TransactionImpl.frameOverCounter = 0;
|
|
482
|
-
TransactionImpl.
|
|
483
|
-
throw misuse("this implementation of
|
|
482
|
+
TransactionImpl.migrateContentFootprint = function (fv, target) {
|
|
483
|
+
throw misuse("this implementation of migrateContentFootprint should never be called");
|
|
484
484
|
};
|
|
485
485
|
TransactionImpl._init();
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Priority, Mode } from "../Enums.js";
|
|
2
|
+
import { ReactiveTreeNodeDriver, ReactiveTreeNodeDecl, Script, ScriptAsync, Handler, ReactiveTreeNode } from "./TreeNode.js";
|
|
3
|
+
import { LoggingOptions } from "../Logging.js";
|
|
4
|
+
export declare class ReactiveTree {
|
|
5
|
+
static declare<E = void>(driver: ReactiveTreeNodeDriver<E>, script?: Script<E>, scriptAsync?: ScriptAsync<E>, key?: string, mode?: Mode, preparation?: Script<E>, preparationAsync?: ScriptAsync<E>, finalization?: Script<E>, triggers?: unknown, basis?: ReactiveTreeNodeDecl<E>): ReactiveTreeNode<E>;
|
|
6
|
+
static declare<E = void>(driver: ReactiveTreeNodeDriver<E>, declaration?: ReactiveTreeNodeDecl<E>): ReactiveTreeNode<E>;
|
|
7
|
+
static declare<E = void>(driver: ReactiveTreeNodeDriver<E>, scriptOrDeclaration?: Script<E> | ReactiveTreeNodeDecl<E>, scriptAsync?: ScriptAsync<E>, key?: string, mode?: Mode, preparation?: Script<E>, preparationAsync?: ScriptAsync<E>, finalization?: Script<E>, triggers?: unknown, basis?: ReactiveTreeNodeDecl<E>): ReactiveTreeNode<E>;
|
|
8
|
+
static withBasis<E = void>(declaration?: ReactiveTreeNodeDecl<E>, basis?: ReactiveTreeNodeDecl<E>): ReactiveTreeNodeDecl<E>;
|
|
9
|
+
static get isFirstScriptRun(): boolean;
|
|
10
|
+
static get key(): string;
|
|
11
|
+
static get stamp(): number;
|
|
12
|
+
static get triggers(): unknown;
|
|
13
|
+
static get priority(): Priority;
|
|
14
|
+
static set priority(value: Priority);
|
|
15
|
+
static get childrenShuffling(): boolean;
|
|
16
|
+
static set childrenShuffling(value: boolean);
|
|
17
|
+
static triggerScriptRun(node: ReactiveTreeNode<any>, triggers: unknown): void;
|
|
18
|
+
static triggerFinalization(node: ReactiveTreeNode<any>): void;
|
|
19
|
+
static runNestedNodeScriptsThenDo(action: (error: unknown) => void): void;
|
|
20
|
+
static markAsMounted(node: ReactiveTreeNode<any>, yes: boolean): void;
|
|
21
|
+
static findMatchingHost<E = unknown, R = unknown>(node: ReactiveTreeNode<E>, match: Handler<ReactiveTreeNode<E>, boolean>): ReactiveTreeNode<R> | undefined;
|
|
22
|
+
static findMatchingPrevSibling<E = unknown, R = unknown>(node: ReactiveTreeNode<E>, match: Handler<ReactiveTreeNode<E>, boolean>): ReactiveTreeNode<R> | undefined;
|
|
23
|
+
static forEachChildRecursively<E = unknown>(node: ReactiveTreeNode<E>, action: Handler<ReactiveTreeNode<E>>): void;
|
|
24
|
+
static getDefaultLoggingOptions(): LoggingOptions | undefined;
|
|
25
|
+
static setDefaultLoggingOptions(logging?: LoggingOptions): void;
|
|
26
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { Mode } from "../Enums.js";
|
|
2
|
+
import { generateKey, observablesAreEqual } from "./TreeNode.js";
|
|
3
|
+
import { MergeList } from "../util/MergeList.js";
|
|
4
|
+
export class ReactiveTree {
|
|
5
|
+
static declare(driver, scriptOrDeclaration, scriptAsync, key, mode, preparation, preparationAsync, finalization, triggers, basis) {
|
|
6
|
+
let result;
|
|
7
|
+
let declaration;
|
|
8
|
+
if (scriptOrDeclaration instanceof Function) {
|
|
9
|
+
declaration = {
|
|
10
|
+
script: scriptOrDeclaration, scriptAsync, key, mode,
|
|
11
|
+
preparation, preparationAsync, finalization, triggers, basis,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
else
|
|
15
|
+
declaration = scriptOrDeclaration !== null && scriptOrDeclaration !== void 0 ? scriptOrDeclaration : {};
|
|
16
|
+
let effectiveKey = declaration.key;
|
|
17
|
+
const owner = (getModeUsingBasisChain(declaration) & Mode.rootNode) !== Mode.rootNode ? gNodeSlot === null || gNodeSlot === void 0 ? void 0 : gNodeSlot.instance : undefined;
|
|
18
|
+
if (owner) {
|
|
19
|
+
let existing = owner.driver.declareChild(owner, driver, declaration, declaration.basis);
|
|
20
|
+
const children = owner.children;
|
|
21
|
+
existing !== null && existing !== void 0 ? existing : (existing = children.tryMergeAsExisting(effectiveKey = effectiveKey || generateKey(owner), undefined, "nested elements can be declared inside 'script' only"));
|
|
22
|
+
if (existing) {
|
|
23
|
+
result = existing.instance;
|
|
24
|
+
if (result.driver !== driver && driver !== undefined)
|
|
25
|
+
throw new Error(`changing element driver is not yet supported: "${result.driver.name}" -> "${driver === null || driver === void 0 ? void 0 : driver.name}"`);
|
|
26
|
+
const exTriggers = result.declaration.triggers;
|
|
27
|
+
if (observablesAreEqual(declaration.triggers, exTriggers))
|
|
28
|
+
declaration.triggers = exTriggers;
|
|
29
|
+
result.declaration = declaration;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
result = new ReactiveTreeNodeImpl(effectiveKey || generateKey(owner), driver, declaration, owner);
|
|
33
|
+
result.slot = children.mergeAsAdded(result);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
result = new ReactiveTreeNodeImpl(effectiveKey || "", driver, declaration, owner);
|
|
38
|
+
result.slot = MergeList.createItem(result);
|
|
39
|
+
triggerScriptRunViaSlot(result.slot);
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
static withBasis(declaration, basis) {
|
|
44
|
+
if (declaration)
|
|
45
|
+
declaration.basis = basis;
|
|
46
|
+
else
|
|
47
|
+
declaration = basis !== null && basis !== void 0 ? basis : {};
|
|
48
|
+
return declaration;
|
|
49
|
+
}
|
|
50
|
+
static get isFirstScriptRun() {
|
|
51
|
+
return ReactiveTreeNodeImpl.nodeSlot.instance.stamp === 1;
|
|
52
|
+
}
|
|
53
|
+
static get key() {
|
|
54
|
+
return ReactiveTreeNodeImpl.nodeSlot.instance.key;
|
|
55
|
+
}
|
|
56
|
+
static get stamp() {
|
|
57
|
+
return ReactiveTreeNodeImpl.nodeSlot.instance.stamp;
|
|
58
|
+
}
|
|
59
|
+
static get triggers() {
|
|
60
|
+
return ReactiveTreeNodeImpl.nodeSlot.instance.declaration.triggers;
|
|
61
|
+
}
|
|
62
|
+
static get priority() {
|
|
63
|
+
return ReactiveTreeNodeImpl.nodeSlot.instance.priority;
|
|
64
|
+
}
|
|
65
|
+
static set priority(value) {
|
|
66
|
+
ReactiveTreeNodeImpl.nodeSlot.instance.priority = value;
|
|
67
|
+
}
|
|
68
|
+
static get childrenShuffling() {
|
|
69
|
+
return ReactiveTreeNodeImpl.nodeSlot.instance.childrenShuffling;
|
|
70
|
+
}
|
|
71
|
+
static set childrenShuffling(value) {
|
|
72
|
+
ReactiveTreeNodeImpl.nodeSlot.instance.childrenShuffling = value;
|
|
73
|
+
}
|
|
74
|
+
static triggerScriptRun(node, triggers) {
|
|
75
|
+
const impl = node;
|
|
76
|
+
const declaration = impl.declaration;
|
|
77
|
+
if (!observablesAreEqual(triggers, declaration.triggers)) {
|
|
78
|
+
declaration.triggers = triggers;
|
|
79
|
+
triggerScriptRunViaSlot(impl.slot);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
static triggerFinalization(node) {
|
|
83
|
+
const impl = node;
|
|
84
|
+
triggerFinalization(impl.slot, true, true);
|
|
85
|
+
}
|
|
86
|
+
static runNestedNodeScriptsThenDo(action) {
|
|
87
|
+
runNestedNodeScriptsThenDoImpl(ReactiveTreeNodeImpl.nodeSlot, undefined, action);
|
|
88
|
+
}
|
|
89
|
+
static markAsMounted(node, yes) {
|
|
90
|
+
const n = node;
|
|
91
|
+
if (n.stamp < 0)
|
|
92
|
+
throw new Error("deactivated node cannot be mounted or unmounted");
|
|
93
|
+
if (n.stamp >= Number.MAX_SAFE_INTEGER)
|
|
94
|
+
throw new Error("node must be activated before mounting");
|
|
95
|
+
n.stamp = yes ? 0 : Number.MAX_SAFE_INTEGER - 1;
|
|
96
|
+
}
|
|
97
|
+
static findMatchingHost(node, match) {
|
|
98
|
+
let p = node.host;
|
|
99
|
+
while (p !== p.host && !match(p))
|
|
100
|
+
p = p.host;
|
|
101
|
+
return p;
|
|
102
|
+
}
|
|
103
|
+
static findMatchingPrevSibling(node, match) {
|
|
104
|
+
let p = node.slot.prev;
|
|
105
|
+
while (p && !match(p.instance))
|
|
106
|
+
p = p.prev;
|
|
107
|
+
return p === null || p === void 0 ? void 0 : p.instance;
|
|
108
|
+
}
|
|
109
|
+
static forEachChildRecursively(node, action) {
|
|
110
|
+
action(node);
|
|
111
|
+
for (const child of node.children.items())
|
|
112
|
+
ReactiveTree.forEachChildRecursively(child.instance, action);
|
|
113
|
+
}
|
|
114
|
+
static getDefaultLoggingOptions() {
|
|
115
|
+
return ReactiveTreeNodeImpl.logging;
|
|
116
|
+
}
|
|
117
|
+
static setDefaultLoggingOptions(logging) {
|
|
118
|
+
ReactiveTreeNodeImpl.logging = logging;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { LoggingOptions } from "../Logging.js";
|
|
2
|
+
import { MergeList, MergeListReader, MergedItem } from "../util/MergeList.js";
|
|
3
|
+
import { Priority, Mode } from "../Enums.js";
|
|
4
|
+
import { ReactivityOptions } from "../Options.js";
|
|
5
|
+
import { ObservableObject } from "../core/Mvcc.js";
|
|
6
|
+
export type Script<E> = (el: E, basis: () => void) => void;
|
|
7
|
+
export type ScriptAsync<E> = (el: E, basis: () => Promise<void>) => Promise<void>;
|
|
8
|
+
export type Handler<E = unknown, R = void> = (el: E) => R;
|
|
9
|
+
export declare abstract class ReactiveTreeNode<E = unknown> {
|
|
10
|
+
abstract readonly key: string;
|
|
11
|
+
abstract readonly driver: ReactiveTreeNodeDriver<E>;
|
|
12
|
+
abstract readonly declaration: Readonly<ReactiveTreeNodeDecl<E>>;
|
|
13
|
+
abstract readonly level: number;
|
|
14
|
+
abstract readonly owner: ReactiveTreeNode;
|
|
15
|
+
abstract element: E;
|
|
16
|
+
abstract readonly host: ReactiveTreeNode;
|
|
17
|
+
abstract readonly children: MergeListReader<ReactiveTreeNode>;
|
|
18
|
+
abstract readonly slot: MergedItem<ReactiveTreeNode<E>> | undefined;
|
|
19
|
+
abstract readonly stamp: number;
|
|
20
|
+
abstract readonly outer: ReactiveTreeNode;
|
|
21
|
+
abstract readonly context: ReactiveTreeNodeContext | undefined;
|
|
22
|
+
abstract priority?: Priority;
|
|
23
|
+
abstract childrenShuffling: boolean;
|
|
24
|
+
abstract strictOrder: boolean;
|
|
25
|
+
abstract has(mode: Mode): boolean;
|
|
26
|
+
abstract configureReactronic(options: Partial<ReactivityOptions>): ReactivityOptions;
|
|
27
|
+
}
|
|
28
|
+
export type ReactiveTreeNodeDecl<E = unknown> = {
|
|
29
|
+
script?: Script<E>;
|
|
30
|
+
scriptAsync?: ScriptAsync<E>;
|
|
31
|
+
key?: string;
|
|
32
|
+
mode?: Mode;
|
|
33
|
+
preparation?: Script<E>;
|
|
34
|
+
preparationAsync?: ScriptAsync<E>;
|
|
35
|
+
finalization?: Script<E>;
|
|
36
|
+
triggers?: unknown;
|
|
37
|
+
basis?: ReactiveTreeNodeDecl<E>;
|
|
38
|
+
};
|
|
39
|
+
export type ReactiveTreeNodeDriver<E = unknown> = {
|
|
40
|
+
readonly name: string;
|
|
41
|
+
readonly isPartition: boolean;
|
|
42
|
+
readonly initialize?: Handler<E>;
|
|
43
|
+
create(node: ReactiveTreeNode<E>): E;
|
|
44
|
+
runPreparation(node: ReactiveTreeNode<E>): void;
|
|
45
|
+
runFinalization(node: ReactiveTreeNode<E>, isLeader: boolean): boolean;
|
|
46
|
+
runMount(node: ReactiveTreeNode<E>): void;
|
|
47
|
+
runScript(node: ReactiveTreeNode<E>): void | Promise<void>;
|
|
48
|
+
declareChild(ownerNode: ReactiveTreeNode<E>, childDriver: ReactiveTreeNodeDriver<any>, childDeclaration?: ReactiveTreeNodeDecl<any>, childBasis?: ReactiveTreeNodeDecl<any>): MergedItem<ReactiveTreeNode> | undefined;
|
|
49
|
+
provideHost(node: ReactiveTreeNode<E>): ReactiveTreeNode<E>;
|
|
50
|
+
};
|
|
51
|
+
export type ReactiveTreeNodeContext<T extends Object = Object> = {
|
|
52
|
+
value: T;
|
|
53
|
+
};
|
|
54
|
+
export declare abstract class BaseDriver<E = unknown> implements ReactiveTreeNodeDriver<E> {
|
|
55
|
+
readonly name: string;
|
|
56
|
+
readonly isPartition: boolean;
|
|
57
|
+
readonly initialize?: Handler<E> | undefined;
|
|
58
|
+
constructor(name: string, isPartition: boolean, initialize?: Handler<E> | undefined);
|
|
59
|
+
abstract create(node: ReactiveTreeNode<E>): E;
|
|
60
|
+
runPreparation(node: ReactiveTreeNode<E>): void | Promise<void>;
|
|
61
|
+
runFinalization(node: ReactiveTreeNode<E>, isLeader: boolean): boolean;
|
|
62
|
+
runMount(node: ReactiveTreeNode<E>): void;
|
|
63
|
+
runScript(node: ReactiveTreeNode<E>): void | Promise<void>;
|
|
64
|
+
declareChild(ownerNode: ReactiveTreeNode<E>, childDriver: ReactiveTreeNodeDriver<any>, childDeclaration?: ReactiveTreeNodeDecl<any>, childBasis?: ReactiveTreeNodeDecl<any>): MergedItem<ReactiveTreeNode> | undefined;
|
|
65
|
+
provideHost(node: ReactiveTreeNode<E>): ReactiveTreeNode<E>;
|
|
66
|
+
}
|
|
67
|
+
export declare class ReactiveTreeVariable<T extends Object = Object> {
|
|
68
|
+
readonly defaultValue: T | undefined;
|
|
69
|
+
constructor(defaultValue?: T);
|
|
70
|
+
set value(value: T);
|
|
71
|
+
get value(): T;
|
|
72
|
+
get valueOrUndefined(): T | undefined;
|
|
73
|
+
}
|
|
74
|
+
export declare function generateKey(owner: ReactiveTreeNodeImpl): string;
|
|
75
|
+
declare class ReactiveTreeNodeContextImpl<T extends Object = Object> extends ObservableObject implements ReactiveTreeNodeContext<T> {
|
|
76
|
+
next: ReactiveTreeNodeContextImpl<object> | undefined;
|
|
77
|
+
variable: ReactiveTreeVariable<T>;
|
|
78
|
+
value: T;
|
|
79
|
+
constructor(variable: ReactiveTreeVariable<T>, value: T);
|
|
80
|
+
}
|
|
81
|
+
declare class ReactiveTreeNodeImpl<E = unknown> extends ReactiveTreeNode<E> {
|
|
82
|
+
static logging: LoggingOptions | undefined;
|
|
83
|
+
static grandNodeCount: number;
|
|
84
|
+
static disposableNodeCount: number;
|
|
85
|
+
static readonly shortFrameDuration = 16;
|
|
86
|
+
static readonly longFrameDuration = 300;
|
|
87
|
+
static currentScriptPriority: Priority;
|
|
88
|
+
static frameDuration: number;
|
|
89
|
+
readonly key: string;
|
|
90
|
+
readonly driver: ReactiveTreeNodeDriver<E>;
|
|
91
|
+
declaration: ReactiveTreeNodeDecl<E>;
|
|
92
|
+
readonly level: number;
|
|
93
|
+
readonly owner: ReactiveTreeNodeImpl;
|
|
94
|
+
readonly element: E;
|
|
95
|
+
host: ReactiveTreeNodeImpl;
|
|
96
|
+
readonly children: MergeList<ReactiveTreeNodeImpl>;
|
|
97
|
+
slot: MergedItem<ReactiveTreeNodeImpl<E>> | undefined;
|
|
98
|
+
stamp: number;
|
|
99
|
+
outer: ReactiveTreeNodeImpl;
|
|
100
|
+
context: ReactiveTreeNodeContextImpl<any> | undefined;
|
|
101
|
+
numerator: number;
|
|
102
|
+
priority: Priority;
|
|
103
|
+
childrenShuffling: boolean;
|
|
104
|
+
constructor(key: string, driver: ReactiveTreeNodeDriver<E>, declaration: Readonly<ReactiveTreeNodeDecl<E>>, owner: ReactiveTreeNodeImpl | undefined);
|
|
105
|
+
get strictOrder(): boolean;
|
|
106
|
+
set strictOrder(value: boolean);
|
|
107
|
+
get isMoved(): boolean;
|
|
108
|
+
has(mode: Mode): boolean;
|
|
109
|
+
script(_triggers: unknown): void;
|
|
110
|
+
configureReactronic(options: Partial<ReactivityOptions>): ReactivityOptions;
|
|
111
|
+
static get nodeSlot(): MergedItem<ReactiveTreeNodeImpl>;
|
|
112
|
+
static tryUseNodeVariableValue<T extends Object>(variable: ReactiveTreeVariable<T>): T | undefined;
|
|
113
|
+
static useNodeVariableValue<T extends Object>(variable: ReactiveTreeVariable<T>): T;
|
|
114
|
+
static setNodeVariableValue<T extends Object>(variable: ReactiveTreeVariable<T>, value: T | undefined): void;
|
|
115
|
+
}
|
|
116
|
+
export declare function observablesAreEqual(a1: any, a2: any): boolean;
|
|
117
|
+
export {};
|