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.
@@ -1,8 +1,7 @@
1
1
  export declare enum Mode {
2
2
  default = 0,
3
3
  autonomous = 1,
4
- manualMount = 2,
5
- rootNode = 4
4
+ external = 2
6
5
  }
7
6
  export declare enum Priority {
8
7
  realtime = 0,
@@ -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["manualMount"] = 2] = "manualMount";
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";
@@ -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 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>;
35
- static declare<E = void>(driver: ReactiveTreeNodeDriver<E>, declaration?: ReactiveTreeNodeDecl<E>): ReactiveTreeNode<E>;
36
- 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>;
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 class ReactiveTreeNode {
28
- static get current() {
29
- return ReactiveTreeNodeImpl.nodeSlot.instance;
30
- }
31
- static get isFirstScriptRun() {
32
- return ReactiveTreeNode.current.stamp === 1;
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
- static declare(driver, scriptOrDeclaration, scriptAsync, key, mode, preparation, preparationAsync, finalization, triggers, basis) {
35
- let result;
36
- let declaration;
37
- if (scriptOrDeclaration instanceof Function) {
38
- declaration = {
39
- script: scriptOrDeclaration, scriptAsync, key, mode,
40
- preparation, preparationAsync, finalization, triggers, basis,
41
- };
42
- }
43
- else
44
- declaration = scriptOrDeclaration !== null && scriptOrDeclaration !== void 0 ? scriptOrDeclaration : {};
45
- let effectiveKey = declaration.key;
46
- const owner = (getModeUsingBasisChain(declaration) & Mode.rootNode) !== Mode.rootNode ? gNodeSlot === null || gNodeSlot === void 0 ? void 0 : gNodeSlot.instance : undefined;
47
- if (owner) {
48
- let existing = owner.driver.declareChild(owner, driver, declaration, declaration.basis);
49
- const children = owner.children;
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 = MergeList.createItem(result);
68
- triggerScriptRunViaSlot(result.slot);
55
+ result.slot = children.mergeAsAdded(result);
69
56
  }
70
- return result;
71
57
  }
72
- static withBasis(declaration, basis) {
73
- if (declaration)
74
- declaration.basis = basis;
75
- else
76
- declaration = basis !== null && basis !== void 0 ? basis : {};
77
- return declaration;
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 triggerScriptRun(node, triggers) {
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
- triggerScriptRunViaSlot(impl.slot);
87
+ launchScriptViaSlot(impl.slot);
85
88
  }
86
89
  }
87
- static triggerFinalization(node) {
90
+ static launchFinalization(node) {
88
91
  const impl = node;
89
- triggerFinalization(impl.slot, true, true);
92
+ launchFinalization(impl.slot, true, true);
90
93
  }
91
- static runNestedNodeScriptsThenDo(action) {
92
- runNestedNodeScriptsThenDoImpl(ReactiveTreeNodeImpl.nodeSlot, undefined, action);
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) & mode) === mode;
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 runNestedNodeScriptsThenDoImpl(nodeSlot, error, action) {
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
- triggerFinalization(child, true, true);
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
- triggerScriptRunViaSlot(child);
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.manualMount)) {
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
- triggerScriptRunViaSlot(child);
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 triggerScriptRunViaSlot(nodeSlot) {
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.manualMount)) {
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.manualMount) && node.host !== node)
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 => { runNestedNodeScriptsThenDoImpl(nodeSlot, undefined, NOP); return v; }, e => { console.log(e); runNestedNodeScriptsThenDoImpl(nodeSlot, e !== null && e !== void 0 ? e : new Error("unknown error"), NOP); });
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
- runNestedNodeScriptsThenDoImpl(nodeSlot, e, NOP);
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 triggerFinalization(nodeSlot, isLeader, individual) {
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
- triggerFinalization(child, childrenAreLeaders, false);
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>;
@@ -37,6 +37,9 @@ export class Utils {
37
37
  return target;
38
38
  }
39
39
  }
40
+ export function flags(value, flags) {
41
+ return (value & flags) === flags;
42
+ }
40
43
  export function UNDEF(...args) {
41
44
  throw fatal(new Error("this method should never be called"));
42
45
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reactronic",
3
- "version": "0.94.25031",
3
+ "version": "0.94.25033",
4
4
  "description": "Reactronic - Transactional Reactive State Management",
5
5
  "publisher": "Nezaboodka Software",
6
6
  "license": "Apache-2.0",