reactronic 0.94.25031 → 0.94.25033
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/build/dist/source/Enums.d.ts +1 -2
- package/build/dist/source/Enums.js +1 -2
- package/build/dist/source/api.d.ts +1 -1
- package/build/dist/source/api.js +1 -1
- package/build/dist/source/core/TreeNode.d.ts +8 -7
- package/build/dist/source/core/TreeNode.js +69 -66
- package/build/dist/source/util/Utils.d.ts +1 -0
- package/build/dist/source/util/Utils.js +3 -0
- package/package.json +1 -1
|
@@ -2,8 +2,7 @@ export var Mode;
|
|
|
2
2
|
(function (Mode) {
|
|
3
3
|
Mode[Mode["default"] = 0] = "default";
|
|
4
4
|
Mode[Mode["autonomous"] = 1] = "autonomous";
|
|
5
|
-
Mode[Mode["
|
|
6
|
-
Mode[Mode["rootNode"] = 4] = "rootNode";
|
|
5
|
+
Mode[Mode["external"] = 2] = "external";
|
|
7
6
|
})(Mode || (Mode = {}));
|
|
8
7
|
export var Priority;
|
|
9
8
|
(function (Priority) {
|
|
@@ -21,5 +21,5 @@ export { Journal } from "./core/Journal.js";
|
|
|
21
21
|
export { runAtomically, runNonReactively, runSensitively, runContextually, manageReactiveOperation, configureCurrentReactiveOperation, disposeObservableObject } from "./System.js";
|
|
22
22
|
export { ReactiveSystem, observable, atomic, reactive, cached, options } from "./System.js";
|
|
23
23
|
export { ReactiveOperationEx } from "./OperationEx.js";
|
|
24
|
-
export { ReactiveTreeNode, BaseDriver, ReactiveTreeVariable } from "./core/TreeNode.js";
|
|
24
|
+
export { declare, derived, launch, ReactiveTreeNode, BaseDriver, ReactiveTreeVariable } from "./core/TreeNode.js";
|
|
25
25
|
export type { Script, ScriptAsync, Handler, ReactiveTreeNodeDecl, ReactiveTreeNodeDriver, ReactiveTreeNodeContext } from "./core/TreeNode.js";
|
package/build/dist/source/api.js
CHANGED
|
@@ -17,4 +17,4 @@ export { Journal } from "./core/Journal.js";
|
|
|
17
17
|
export { runAtomically, runNonReactively, runSensitively, runContextually, manageReactiveOperation, configureCurrentReactiveOperation, disposeObservableObject } from "./System.js";
|
|
18
18
|
export { ReactiveSystem, observable, atomic, reactive, cached, options } from "./System.js";
|
|
19
19
|
export { ReactiveOperationEx } from "./OperationEx.js";
|
|
20
|
-
export { ReactiveTreeNode, BaseDriver, ReactiveTreeVariable } from "./core/TreeNode.js";
|
|
20
|
+
export { declare, derived, launch, ReactiveTreeNode, BaseDriver, ReactiveTreeVariable } from "./core/TreeNode.js";
|
|
@@ -6,6 +6,11 @@ import { ObservableObject } from "../core/Mvcc.js";
|
|
|
6
6
|
export type Script<E> = (el: E, basis: () => void) => void;
|
|
7
7
|
export type ScriptAsync<E> = (el: E, basis: () => Promise<void>) => Promise<void>;
|
|
8
8
|
export type Handler<E = unknown, R = void> = (el: E) => R;
|
|
9
|
+
export declare function 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>;
|
|
10
|
+
export declare function declare<E = void>(driver: ReactiveTreeNodeDriver<E>, declaration?: ReactiveTreeNodeDecl<E>): ReactiveTreeNode<E>;
|
|
11
|
+
export declare function 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>;
|
|
12
|
+
export declare function derived<E = void>(declaration?: ReactiveTreeNodeDecl<E>, basis?: ReactiveTreeNodeDecl<E>): ReactiveTreeNodeDecl<E>;
|
|
13
|
+
export declare function launch<T>(node: ReactiveTreeNode<T>, triggers?: unknown): ReactiveTreeNode<T>;
|
|
9
14
|
export declare abstract class ReactiveTreeNode<E = unknown> {
|
|
10
15
|
static readonly shortFrameDuration = 16;
|
|
11
16
|
static readonly longFrameDuration = 300;
|
|
@@ -31,13 +36,9 @@ export declare abstract class ReactiveTreeNode<E = unknown> {
|
|
|
31
36
|
abstract configureReactivity(options: Partial<ReactivityOptions>): ReactivityOptions;
|
|
32
37
|
static get current(): ReactiveTreeNode;
|
|
33
38
|
static get isFirstScriptRun(): boolean;
|
|
34
|
-
static
|
|
35
|
-
static
|
|
36
|
-
static
|
|
37
|
-
static withBasis<E = void>(declaration?: ReactiveTreeNodeDecl<E>, basis?: ReactiveTreeNodeDecl<E>): ReactiveTreeNodeDecl<E>;
|
|
38
|
-
static triggerScriptRun(node: ReactiveTreeNode<any>, triggers: unknown): void;
|
|
39
|
-
static triggerFinalization(node: ReactiveTreeNode<any>): void;
|
|
40
|
-
static runNestedNodeScriptsThenDo(action: (error: unknown) => void): void;
|
|
39
|
+
static launchScript(node: ReactiveTreeNode<any>, triggers: unknown): void;
|
|
40
|
+
static launchFinalization(node: ReactiveTreeNode<any>): void;
|
|
41
|
+
static launchNestedNodesThenDo(action: (error: unknown) => void): void;
|
|
41
42
|
static markAsMounted(node: ReactiveTreeNode<any>, yes: boolean): void;
|
|
42
43
|
lookupTreeNodeByUri<E = unknown>(uri: string): ReactiveTreeNode<E> | undefined;
|
|
43
44
|
static findMatchingHost<E = unknown, R = unknown>(node: ReactiveTreeNode<E>, match: Handler<ReactiveTreeNode<E>, boolean>): ReactiveTreeNode<R> | undefined;
|
|
@@ -19,77 +19,80 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
19
19
|
import { misuse } from "../util/Dbg.js";
|
|
20
20
|
import { Uri } from "../util/Uri.js";
|
|
21
21
|
import { MergeList } from "../util/MergeList.js";
|
|
22
|
-
import { emitLetters, getCallerInfo, proceedSyncOrAsync } from "../util/Utils.js";
|
|
22
|
+
import { emitLetters, flags, getCallerInfo, proceedSyncOrAsync } from "../util/Utils.js";
|
|
23
23
|
import { Priority, Mode, Isolation, Reentrance } from "../Enums.js";
|
|
24
24
|
import { ObservableObject } from "../core/Mvcc.js";
|
|
25
25
|
import { Transaction } from "../core/Transaction.js";
|
|
26
26
|
import { ReactiveSystem, options, observable, reactive, runAtomically, runNonReactively, manageReactiveOperation, disposeObservableObject } from "../System.js";
|
|
27
|
-
export
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
export function declare(driver, scriptOrDeclaration, scriptAsync, key, mode, preparation, preparationAsync, finalization, triggers, basis) {
|
|
28
|
+
let result;
|
|
29
|
+
let declaration;
|
|
30
|
+
if (scriptOrDeclaration instanceof Function) {
|
|
31
|
+
declaration = {
|
|
32
|
+
script: scriptOrDeclaration, scriptAsync, key, mode,
|
|
33
|
+
preparation, preparationAsync, finalization, triggers, basis,
|
|
34
|
+
};
|
|
33
35
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
existing !== null && existing !== void 0 ? existing : (existing = children.tryMergeAsExisting(effectiveKey = effectiveKey || generateKey(owner), undefined, "nested elements can be declared inside 'script' only"));
|
|
51
|
-
if (existing) {
|
|
52
|
-
result = existing.instance;
|
|
53
|
-
if (result.driver !== driver && driver !== undefined)
|
|
54
|
-
throw misuse(`changing element driver is not yet supported: "${result.driver.name}" -> "${driver === null || driver === void 0 ? void 0 : driver.name}"`);
|
|
55
|
-
const exTriggers = result.declaration.triggers;
|
|
56
|
-
if (observablesAreEqual(declaration.triggers, exTriggers))
|
|
57
|
-
declaration.triggers = exTriggers;
|
|
58
|
-
result.declaration = declaration;
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
result = new ReactiveTreeNodeImpl(effectiveKey || generateKey(owner), driver, declaration, owner);
|
|
62
|
-
result.slot = children.mergeAsAdded(result);
|
|
63
|
-
}
|
|
36
|
+
else
|
|
37
|
+
declaration = scriptOrDeclaration !== null && scriptOrDeclaration !== void 0 ? scriptOrDeclaration : {};
|
|
38
|
+
let effectiveKey = declaration.key;
|
|
39
|
+
const owner = gNodeSlot === null || gNodeSlot === void 0 ? void 0 : gNodeSlot.instance;
|
|
40
|
+
if (owner) {
|
|
41
|
+
let existing = owner.driver.declareChild(owner, driver, declaration, declaration.basis);
|
|
42
|
+
const children = owner.children;
|
|
43
|
+
existing !== null && existing !== void 0 ? existing : (existing = children.tryMergeAsExisting(effectiveKey = effectiveKey || generateKey(owner), undefined, "nested elements can be declared inside 'script' only"));
|
|
44
|
+
if (existing) {
|
|
45
|
+
result = existing.instance;
|
|
46
|
+
if (result.driver !== driver && driver !== undefined)
|
|
47
|
+
throw misuse(`changing element driver is not yet supported: "${result.driver.name}" -> "${driver === null || driver === void 0 ? void 0 : driver.name}"`);
|
|
48
|
+
const exTriggers = result.declaration.triggers;
|
|
49
|
+
if (observablesAreEqual(declaration.triggers, exTriggers))
|
|
50
|
+
declaration.triggers = exTriggers;
|
|
51
|
+
result.declaration = declaration;
|
|
64
52
|
}
|
|
65
53
|
else {
|
|
66
54
|
result = new ReactiveTreeNodeImpl(effectiveKey || generateKey(owner), driver, declaration, owner);
|
|
67
|
-
result.slot =
|
|
68
|
-
triggerScriptRunViaSlot(result.slot);
|
|
55
|
+
result.slot = children.mergeAsAdded(result);
|
|
69
56
|
}
|
|
70
|
-
return result;
|
|
71
57
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
58
|
+
else {
|
|
59
|
+
result = new ReactiveTreeNodeImpl(effectiveKey || generateKey(owner), driver, declaration, owner);
|
|
60
|
+
result.slot = MergeList.createItem(result);
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
export function derived(declaration, basis) {
|
|
65
|
+
if (declaration)
|
|
66
|
+
declaration.basis = basis;
|
|
67
|
+
else
|
|
68
|
+
declaration = basis !== null && basis !== void 0 ? basis : {};
|
|
69
|
+
return declaration;
|
|
70
|
+
}
|
|
71
|
+
export function launch(node, triggers) {
|
|
72
|
+
ReactiveTreeNode.launchScript(node, triggers);
|
|
73
|
+
return node;
|
|
74
|
+
}
|
|
75
|
+
export class ReactiveTreeNode {
|
|
76
|
+
static get current() {
|
|
77
|
+
return ReactiveTreeNodeImpl.nodeSlot.instance;
|
|
78
|
+
}
|
|
79
|
+
static get isFirstScriptRun() {
|
|
80
|
+
return ReactiveTreeNode.current.stamp === 1;
|
|
78
81
|
}
|
|
79
|
-
static
|
|
82
|
+
static launchScript(node, triggers) {
|
|
80
83
|
const impl = node;
|
|
81
84
|
const declaration = impl.declaration;
|
|
82
|
-
if (!observablesAreEqual(triggers, declaration.triggers)) {
|
|
85
|
+
if (node.stamp >= Number.MAX_SAFE_INTEGER || !observablesAreEqual(triggers, declaration.triggers)) {
|
|
83
86
|
declaration.triggers = triggers;
|
|
84
|
-
|
|
87
|
+
launchScriptViaSlot(impl.slot);
|
|
85
88
|
}
|
|
86
89
|
}
|
|
87
|
-
static
|
|
90
|
+
static launchFinalization(node) {
|
|
88
91
|
const impl = node;
|
|
89
|
-
|
|
92
|
+
launchFinalization(impl.slot, true, true);
|
|
90
93
|
}
|
|
91
|
-
static
|
|
92
|
-
|
|
94
|
+
static launchNestedNodesThenDo(action) {
|
|
95
|
+
launchNestedNodesThenDoImpl(ReactiveTreeNodeImpl.nodeSlot, undefined, action);
|
|
93
96
|
}
|
|
94
97
|
static markAsMounted(node, yes) {
|
|
95
98
|
const n = node;
|
|
@@ -298,7 +301,7 @@ class ReactiveTreeNodeImpl extends ReactiveTreeNode {
|
|
|
298
301
|
return this.owner.children.isMoved(this.slot);
|
|
299
302
|
}
|
|
300
303
|
has(mode) {
|
|
301
|
-
return (getModeUsingBasisChain(this.declaration)
|
|
304
|
+
return flags(getModeUsingBasisChain(this.declaration), mode);
|
|
302
305
|
}
|
|
303
306
|
script(_triggers) {
|
|
304
307
|
runScriptNow(this.slot);
|
|
@@ -380,7 +383,7 @@ function gatherAuthorityAndPath(node, path, relativeTo) {
|
|
|
380
383
|
function getNodeKey(node) {
|
|
381
384
|
return node.stamp >= 0 ? node.key : undefined;
|
|
382
385
|
}
|
|
383
|
-
function
|
|
386
|
+
function launchNestedNodesThenDoImpl(nodeSlot, error, action) {
|
|
384
387
|
runInsideContextOfNode(nodeSlot, () => {
|
|
385
388
|
var _a;
|
|
386
389
|
const owner = nodeSlot.instance;
|
|
@@ -390,7 +393,7 @@ function runNestedNodeScriptsThenDoImpl(nodeSlot, error, action) {
|
|
|
390
393
|
try {
|
|
391
394
|
children.endMerge(error);
|
|
392
395
|
for (const child of children.removedItems(true))
|
|
393
|
-
|
|
396
|
+
launchFinalization(child, true, true);
|
|
394
397
|
if (!error) {
|
|
395
398
|
const sequential = children.isStrict;
|
|
396
399
|
let p1 = undefined;
|
|
@@ -406,7 +409,7 @@ function runNestedNodeScriptsThenDoImpl(nodeSlot, error, action) {
|
|
|
406
409
|
mounting = markToMountIfNecessary(mounting, host, child, children, sequential);
|
|
407
410
|
const p = (_a = childNode.priority) !== null && _a !== void 0 ? _a : Priority.realtime;
|
|
408
411
|
if (p === Priority.realtime)
|
|
409
|
-
|
|
412
|
+
launchScriptViaSlot(child);
|
|
410
413
|
else if (p === Priority.normal)
|
|
411
414
|
p1 = push(child, p1);
|
|
412
415
|
else
|
|
@@ -427,7 +430,7 @@ function runNestedNodeScriptsThenDoImpl(nodeSlot, error, action) {
|
|
|
427
430
|
}
|
|
428
431
|
function markToMountIfNecessary(mounting, host, nodeSlot, children, sequential) {
|
|
429
432
|
const node = nodeSlot.instance;
|
|
430
|
-
if (node.element.native && !node.has(Mode.
|
|
433
|
+
if (node.element.native && !node.has(Mode.external)) {
|
|
431
434
|
if (mounting || node.host !== host) {
|
|
432
435
|
children.markAsMoved(nodeSlot);
|
|
433
436
|
mounting = false;
|
|
@@ -460,7 +463,7 @@ function runNestedScriptsIncrementally(owner, stamp, allChildren, items, priorit
|
|
|
460
463
|
const frameDurationLimit = priority === Priority.background ? ReactiveTreeNode.shortFrameDuration : Infinity;
|
|
461
464
|
let frameDuration = Math.min(frameDurationLimit, Math.max(ReactiveTreeNode.frameDuration / 4, ReactiveTreeNode.shortFrameDuration));
|
|
462
465
|
for (const child of items) {
|
|
463
|
-
|
|
466
|
+
launchScriptViaSlot(child);
|
|
464
467
|
if (Transaction.isFrameOver(1, frameDuration)) {
|
|
465
468
|
ReactiveTreeNodeImpl.currentScriptPriority = outerPriority;
|
|
466
469
|
yield Transaction.requestNextFrame(0);
|
|
@@ -478,7 +481,7 @@ function runNestedScriptsIncrementally(owner, stamp, allChildren, items, priorit
|
|
|
478
481
|
}
|
|
479
482
|
});
|
|
480
483
|
}
|
|
481
|
-
function
|
|
484
|
+
function launchScriptViaSlot(nodeSlot) {
|
|
482
485
|
const node = nodeSlot.instance;
|
|
483
486
|
if (node.stamp >= 0) {
|
|
484
487
|
if (node.has(Mode.autonomous)) {
|
|
@@ -505,14 +508,14 @@ function mountOrRemountIfNecessary(node) {
|
|
|
505
508
|
runNonReactively(() => {
|
|
506
509
|
node.stamp = Number.MAX_SAFE_INTEGER - 1;
|
|
507
510
|
driver.runPreparation(node);
|
|
508
|
-
if (!node.has(Mode.
|
|
511
|
+
if (!node.has(Mode.external)) {
|
|
509
512
|
node.stamp = 0;
|
|
510
513
|
if (node.host !== node)
|
|
511
514
|
driver.runMount(node);
|
|
512
515
|
}
|
|
513
516
|
});
|
|
514
517
|
}
|
|
515
|
-
else if (node.isMoved && !node.has(Mode.
|
|
518
|
+
else if (node.isMoved && !node.has(Mode.external) && node.host !== node)
|
|
516
519
|
runNonReactively(() => driver.runMount(node));
|
|
517
520
|
}
|
|
518
521
|
function runScriptNow(nodeSlot) {
|
|
@@ -528,10 +531,10 @@ function runScriptNow(nodeSlot) {
|
|
|
528
531
|
node.children.beginMerge();
|
|
529
532
|
const driver = node.driver;
|
|
530
533
|
result = driver.runScript(node);
|
|
531
|
-
result = proceedSyncOrAsync(result, v => {
|
|
534
|
+
result = proceedSyncOrAsync(result, v => { launchNestedNodesThenDoImpl(nodeSlot, undefined, NOP); return v; }, e => { console.log(e); launchNestedNodesThenDoImpl(nodeSlot, e !== null && e !== void 0 ? e : new Error("unknown error"), NOP); });
|
|
532
535
|
}
|
|
533
536
|
catch (e) {
|
|
534
|
-
|
|
537
|
+
launchNestedNodesThenDoImpl(nodeSlot, e, NOP);
|
|
535
538
|
console.log(`Reactive node script failed: ${node.key}`);
|
|
536
539
|
console.log(`${e}`);
|
|
537
540
|
}
|
|
@@ -539,7 +542,7 @@ function runScriptNow(nodeSlot) {
|
|
|
539
542
|
});
|
|
540
543
|
}
|
|
541
544
|
}
|
|
542
|
-
function
|
|
545
|
+
function launchFinalization(nodeSlot, isLeader, individual) {
|
|
543
546
|
const node = nodeSlot.instance;
|
|
544
547
|
if (node.stamp >= 0) {
|
|
545
548
|
const driver = node.driver;
|
|
@@ -560,7 +563,7 @@ function triggerFinalization(nodeSlot, isLeader, individual) {
|
|
|
560
563
|
});
|
|
561
564
|
}
|
|
562
565
|
for (const child of node.children.items())
|
|
563
|
-
|
|
566
|
+
launchFinalization(child, childrenAreLeaders, false);
|
|
564
567
|
ReactiveTreeNodeImpl.grandNodeCount--;
|
|
565
568
|
}
|
|
566
569
|
}
|
|
@@ -4,6 +4,7 @@ export declare class Utils {
|
|
|
4
4
|
static freezeMap<K, V>(obj?: Map<K, V>): Map<K, V> | undefined;
|
|
5
5
|
static copyAllMembers(source: any, target: any): any;
|
|
6
6
|
}
|
|
7
|
+
export declare function flags(value: number, flags: number): boolean;
|
|
7
8
|
export declare function UNDEF(...args: any[]): never;
|
|
8
9
|
export declare function all(promises: Array<Promise<any>>): Promise<any[]>;
|
|
9
10
|
export declare function pause<T>(timeout: number): Promise<T>;
|